Repository: JannisX11/blockbench-plugins Branch: master Commit: 45b7b40961df Files: 552 Total size: 12.0 MB Directory structure: gitextract_sf8c47uj/ ├── .github/ │ ├── pull_request_template.md │ └── workflows/ │ ├── plugin_updates.yml │ └── validate.yml ├── .gitignore ├── .vscode/ │ └── settings.json ├── README.md ├── build/ │ ├── generate_plugin_updates.mjs │ └── update_plugin_updates.mjs ├── package.json ├── plugins/ │ ├── _template/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── members.yml │ │ └── plugin.js │ ├── activity_tracker/ │ │ ├── about.md │ │ ├── activity_tracker.js │ │ └── changelog.json │ ├── ambient_occlusion.js │ ├── animated_java/ │ │ ├── about.md │ │ ├── animated_java.js │ │ ├── changelog.json │ │ └── members.yml │ ├── animated_platforms/ │ │ ├── about.md │ │ └── animated_platforms.js │ ├── animation_sliders/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── animation_sliders.js │ │ └── members.yml │ ├── animation_to_java.js │ ├── animation_to_json.js │ ├── animation_utils/ │ │ ├── README.md │ │ ├── about.md │ │ ├── animation_utils.js │ │ ├── changelog.json │ │ ├── members.yml │ │ └── src/ │ │ ├── .eslintignore │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .nvmrc │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── resources/ │ │ │ ├── armorTemplate.json │ │ │ └── easing_keyframes.css │ │ ├── scripts/ │ │ │ └── updateManifest.mjs │ │ ├── tests/ │ │ │ └── easing.test.ts │ │ ├── ts/ │ │ │ ├── animationUi.ts │ │ │ ├── codec.ts │ │ │ ├── constants.ts │ │ │ ├── easing.ts │ │ │ ├── events.ts │ │ │ ├── index.ts │ │ │ ├── keyframe.ts │ │ │ └── utils.ts │ │ ├── tsconfig.json │ │ ├── types/ │ │ │ └── blockbench-types.d.ts │ │ └── webpack.config.js │ ├── animator.js │ ├── arcaniax_block_exporter.js │ ├── armor_stand_animator.js │ ├── asset_browser/ │ │ ├── about.md │ │ ├── asset_browser.js │ │ └── changelog.json │ ├── azurelib_utils/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── azurelib_utils.js │ │ ├── azurelib_utils.js.LICENSE.txt │ │ ├── changelog.json │ │ └── members.yml │ ├── backup_viewer/ │ │ ├── about.md │ │ ├── backup_viewer.js │ │ └── changelog.json │ ├── baked_ambient_occlusion/ │ │ ├── LICENSE.MD │ │ ├── README.md │ │ ├── about.md │ │ ├── baked_ambient_occlusion.js │ │ ├── members.yml │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── types.d.ts │ │ ├── tsconfig.json │ │ └── webpack.config.js │ ├── bakery.js │ ├── bamo/ │ │ ├── bamo.js │ │ └── src/ │ │ ├── .gitignore │ │ ├── babel.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── BamoAdvancedProperties.vue │ │ │ │ ├── BamoAdvancedTemplate.html │ │ │ │ ├── BamoBaseComponent.vue │ │ │ │ ├── ComponentTemplate.html │ │ │ │ └── bamo.css │ │ │ ├── main.js │ │ │ └── util/ │ │ │ ├── Codec.js │ │ │ ├── GenDataFiles.js │ │ │ ├── GenStates.js │ │ │ ├── OptionArrays.js │ │ │ ├── Settings.js │ │ │ └── Utils.js │ │ └── webpack.config.js │ ├── bbs_exporter/ │ │ ├── about.md │ │ ├── bbs_exporter.js │ │ └── changelog.json │ ├── bedrock_block_transforms/ │ │ └── bedrock_block_transforms.js │ ├── block_multi_collisions/ │ │ ├── LICENSE.md │ │ ├── about.md │ │ ├── block_multi_collisions.js │ │ ├── changelog.json │ │ └── members.yml │ ├── blockmodels-exporter.js │ ├── bone_view/ │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── about.md │ │ ├── bone_view.js │ │ ├── changelog.json │ │ └── members.yml │ ├── brush.js │ ├── brush_randomizer.js │ ├── brush_tuna/ │ │ ├── about.md │ │ ├── brush_tuna.js │ │ ├── changelog.json │ │ └── members.yml │ ├── cameras.js │ ├── cardinal.js │ ├── cem_template_loader/ │ │ ├── about.md │ │ ├── cem_template_loader.js │ │ └── changelog.json │ ├── clone_brush.js │ ├── code_view.js │ ├── collapsible_start_screen_categories.js │ ├── colour_gradient_generator/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── colour_gradient_generator.js │ ├── cosmic_reach_model_editor/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── cosmic_reach_model_editor.js │ ├── creative_mode/ │ │ ├── LICENSE │ │ ├── about.md │ │ └── creative_mode.js │ ├── csmodel.js │ ├── cube_inverter.js │ ├── custom_marker_colors.js │ ├── datagen_export.js │ ├── discord-rpc.js │ ├── double_sided_cubes.js │ ├── duplicate_renamer.js │ ├── easings/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── easings.js │ ├── emf_animation_addon/ │ │ ├── about.md │ │ ├── changelog.json │ │ ├── emf_animation_addon.js │ │ └── members.yml │ ├── endimations_exporter.js │ ├── expand_bone_timeline/ │ │ ├── about.md │ │ └── expand_bone_timeline.js │ ├── explorer/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── explorer.js │ ├── export_to_3mf/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── export_to_3mf.js │ │ ├── members.yml │ │ └── src/ │ │ ├── compile.ts │ │ ├── export_to_3mf.ts │ │ └── validation.ts │ ├── export_to_blender/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── export_to_blender.js │ │ └── members.yml │ ├── farsight/ │ │ ├── LICENSE │ │ ├── README.md │ │ └── farsight.js │ ├── figura_format/ │ │ ├── about.md │ │ └── figura_format.js │ ├── free_rotation/ │ │ ├── about.md │ │ ├── changelog.json │ │ ├── free_rotation.js │ │ └── members.yml │ ├── geckolib/ │ │ ├── README.md │ │ ├── about.md │ │ ├── changelog.json │ │ ├── geckolib.js │ │ ├── members.yml │ │ └── src/ │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .nvmrc │ │ ├── eslint.config.js │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── resources/ │ │ │ ├── armorTemplate.json │ │ │ └── easing_keyframes.css │ │ ├── scripts/ │ │ │ └── updateManifest.mjs │ │ ├── tests/ │ │ │ └── easing.test.ts │ │ ├── ts/ │ │ │ ├── animationUi.ts │ │ │ ├── codec.ts │ │ │ ├── constants.ts │ │ │ ├── easing.ts │ │ │ ├── events.ts │ │ │ ├── index.ts │ │ │ ├── keyframe.ts │ │ │ └── utils.ts │ │ ├── tsconfig.json │ │ ├── types/ │ │ │ └── blockbench-types.d.ts │ │ └── webpack.config.js │ ├── geenium_bedrock_entity_helper.js │ ├── gltf_importer/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── gltf_importer.js │ │ ├── members.yml │ │ └── src/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ ├── patches/ │ │ │ └── blockbench-types+5.0.0-beta.0.patch │ │ ├── plugin/ │ │ │ ├── GLTFLoader.js │ │ │ ├── defer.ts │ │ │ ├── global.d.ts │ │ │ ├── import_gltf.ts │ │ │ ├── parse_gltf.ts │ │ │ ├── plugin.ts │ │ │ ├── util.ts │ │ │ └── vector_hash_map.ts │ │ └── tsconfig.json │ ├── grayscale_preview.js │ ├── ground_plane_editor.js │ ├── guessing_game.js │ ├── highlight_generator.js │ ├── hytale_avatar_loader/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── changelog.json │ │ └── hytale_avatar_loader.js │ ├── hytale_bridge/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── hytale_bridge.js │ ├── hytale_hitbox_helper/ │ │ ├── about.md │ │ └── hytale_hitbox_helper.js │ ├── hytale_plugin/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── hytale_plugin.js │ ├── image_centering.js │ ├── java_block_sequencer/ │ │ ├── about.md │ │ ├── changelog.json │ │ ├── java_block_sequencer.js │ │ └── members.yml │ ├── let_there_be_noise/ │ │ ├── about.md │ │ └── let_there_be_noise.js │ ├── light_tracer_uploader.js │ ├── live_dev_reloader/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── live_dev_reloader.js │ ├── mc_text_generator.js │ ├── menu_icon_exporter/ │ │ ├── LICENSE.md │ │ ├── about.md │ │ └── menu_icon_exporter.js │ ├── mesh_tools/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── mesh_tools.js │ ├── meshy/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── changelog.json │ │ ├── members.yml │ │ └── meshy.js │ ├── mimodel_format.js │ ├── minecraft_block_wizard/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── minecraft_block_wizard.js │ ├── minecraft_entity_wizard/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── minecraft_entity_wizard.js │ ├── minecraft_item_wizard/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── minecraft_item_wizard.js │ ├── minecraft_title_generator/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── minecraft_title_generator.js │ ├── missing_texture_highlighter.js │ ├── mod_utils.js │ ├── modded_entity_fabric.js │ ├── multi-layer.js │ ├── no_java_limits/ │ │ ├── about.md │ │ └── no_java_limits.js │ ├── obj_animation_export.js │ ├── oc_3dm_model.js │ ├── optifine_player_models/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── optifine_player_models.js │ ├── optimize.js │ ├── outline_creator.js │ ├── outliner_group_exporter/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── changelog.json │ │ ├── members.yml │ │ └── outliner_group_exporter.js │ ├── pbr_preview/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── changelog.json │ │ ├── members.yml │ │ └── pbr_preview.js │ ├── performance_audit.js │ ├── pie_menu.js │ ├── plaster.js │ ├── player_statue_generator.js │ ├── pluginstats.js │ ├── preview_scene_customiser/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── preview_scene_customiser.js │ ├── quick_box_uv_layout.js │ ├── rainbow_road_game/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ └── rainbow_road_game.js │ ├── reexport_on_save/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── members.yml │ │ └── reexport_on_save.js │ ├── reference_models/ │ │ └── reference_models.js │ ├── repeat_it.js │ ├── repeating_textures/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── members.yml │ │ └── repeating_textures.js │ ├── resource_pack_exporter.js │ ├── resource_pack_utilities/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── resource_pack_utilities.js │ ├── resourcepack_packager.js │ ├── root_motion_extractor.js │ ├── sam3dj.js │ ├── scene_recorder/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── scene_recorder.js │ ├── screencast_keys.js │ ├── seat_position.js │ ├── shape_generator.js │ ├── shaper.js │ ├── simplify.js │ ├── skin_mirror.js │ ├── skin_packager.js │ ├── smudge_brush/ │ │ ├── LICENSE.MD │ │ ├── members.yml │ │ └── smudge_brush.js │ ├── splash_art_customiser/ │ │ ├── about.md │ │ └── splash_art_customiser.js │ ├── startup_tips.js │ ├── structure_importer.js │ ├── texture_downscaler/ │ │ ├── LICENSE.MD │ │ ├── about.md │ │ ├── members.yml │ │ └── texture_downscaler.js │ ├── texture_filtering/ │ │ └── texture_filtering.js │ ├── texture_stitcher/ │ │ ├── about.md │ │ ├── changelog.json │ │ └── texture_stitcher.js │ ├── threecore_exporter.js │ ├── tint_preview.js │ ├── translation_plane_gizmo/ │ │ ├── about.md │ │ ├── changelog.json │ │ ├── members.yml │ │ └── translation_plane_gizmo.js │ ├── transparency_fix.js │ ├── tweaks_n_stuff/ │ │ ├── .vscode/ │ │ │ └── settings.json │ │ ├── about.md │ │ ├── changelog.json │ │ ├── members.yml │ │ ├── src/ │ │ │ ├── .prettierrc.json │ │ │ ├── build.mjs │ │ │ ├── package.json │ │ │ ├── ts/ │ │ │ │ ├── constants.ts │ │ │ │ ├── index.ts │ │ │ │ ├── lang/ │ │ │ │ │ ├── cz.json │ │ │ │ │ ├── de.json │ │ │ │ │ ├── en.json │ │ │ │ │ ├── es.json │ │ │ │ │ ├── fr.json │ │ │ │ │ ├── it.json │ │ │ │ │ ├── ja.json │ │ │ │ │ ├── ko.json │ │ │ │ │ ├── nl.json │ │ │ │ │ ├── pl.json │ │ │ │ │ ├── pt.json │ │ │ │ │ ├── ru.json │ │ │ │ │ ├── sv.json │ │ │ │ │ ├── uk.json │ │ │ │ │ ├── vi.json │ │ │ │ │ ├── zh.json │ │ │ │ │ └── zh_tw.json │ │ │ │ ├── languages.ts │ │ │ │ ├── mixins.ts │ │ │ │ ├── tweaks/ │ │ │ │ │ ├── base.ts │ │ │ │ │ ├── close_actions.ts │ │ │ │ │ ├── header_color.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── pin_tab.ts │ │ │ │ │ └── wrap_tabs.ts │ │ │ │ └── utils.ts │ │ │ ├── tsconfig.json │ │ │ └── types/ │ │ │ └── tweaks_n_stuff.d.ts │ │ └── tweaks_n_stuff.js │ ├── utility_flaggers.js │ ├── vintagestory_models.js │ ├── vox_importer.js │ ├── voxel_shape_fabric_generator.js │ ├── voxel_shape_generator.js │ ├── wasd_controls.js │ └── workspaces/ │ ├── about.md │ └── workspaces.js ├── plugins.json ├── schema.json ├── scripts/ │ └── validate.js ├── src/ │ ├── azurelib_utils/ │ │ ├── .eslintignore │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── .nvmrc │ │ ├── LICENSE_Geckolib │ │ ├── animation/ │ │ │ ├── azure-animation-tab.js │ │ │ ├── azure-animation-ui.js │ │ │ ├── azure-easing.js │ │ │ ├── azure-ik.js │ │ │ └── azure-keyframes.js │ │ ├── core/ │ │ │ ├── azure-codec.js │ │ │ ├── azure-settings.js │ │ │ └── azure-utils.js │ │ ├── index.js │ │ ├── package.json │ │ ├── templates/ │ │ │ └── armorTemplate.json │ │ └── webpack.config.js │ ├── easings/ │ │ ├── .gitignore │ │ ├── .prettierrc │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── easings.ts │ │ │ ├── index.ts │ │ │ └── util.ts │ │ └── tsconfig.json │ ├── mesh_tools/ │ │ ├── .gitignore │ │ ├── .vscode/ │ │ │ └── settings.json │ │ ├── TODO.md │ │ ├── assets/ │ │ │ ├── actions.json │ │ │ ├── roboto_regular.json │ │ │ └── xyz_presets.jsonc │ │ ├── esbuild.js │ │ ├── jsconfig.json │ │ ├── meta/ │ │ │ └── changelog.json │ │ ├── package.json │ │ ├── plugins/ │ │ │ ├── about.plugin.js │ │ │ └── about.rollup.plugin.js │ │ └── src/ │ │ ├── actions.js │ │ ├── generators/ │ │ │ ├── index.js │ │ │ ├── quickprimitives/ │ │ │ │ ├── polyhedron.action.js │ │ │ │ ├── quickprimitives.action.js │ │ │ │ └── torusknot.action.js │ │ │ ├── terrain.action.js │ │ │ ├── terrain_style_editor.action.js │ │ │ ├── text_mesh.action.js │ │ │ └── xyz_math_surface_function.action.js │ │ ├── global.d.ts │ │ ├── globals.js │ │ ├── index.js │ │ ├── lib/ │ │ │ └── three-polyfills/ │ │ │ ├── BatchedMesh.js │ │ │ └── Triangle.js │ │ ├── operators/ │ │ │ ├── array_elements.action.js │ │ │ ├── boolean.action.ts │ │ │ ├── index.js │ │ │ ├── scatter.action.js │ │ │ ├── split_edges.action.js │ │ │ └── subdivide.action.js │ │ ├── shims/ │ │ │ └── three.shim.ts │ │ ├── tools/ │ │ │ ├── bevel._action.js │ │ │ ├── bridge_edge_loops.action.js │ │ │ ├── expand_selection.action.js │ │ │ ├── index.js │ │ │ ├── laplacian_smooth.action.js │ │ │ ├── poke.action.js │ │ │ ├── shrink_selection.action.js │ │ │ ├── to_sphere.action.js │ │ │ ├── triangulate.action.js │ │ │ ├── tris_to_quad.action.js │ │ │ └── uv_mapping/ │ │ │ ├── uv_mapping.action.js │ │ │ ├── uv_project_view.action.js │ │ │ └── uv_turnaround_projection.action.js │ │ └── utils/ │ │ ├── array.js │ │ ├── docs.js │ │ ├── facetype.js │ │ ├── geometry.js │ │ ├── info.js │ │ ├── mesh/ │ │ │ └── neighborhood.js │ │ ├── perlin.js │ │ ├── storage.js │ │ ├── terrain_gen.js │ │ ├── threejs_interoperability.js │ │ ├── utils.js │ │ └── vector.js │ ├── pbr_preview/ │ │ ├── .prettierignore │ │ ├── .prettierrc │ │ ├── changelog.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── deps.ts │ │ │ ├── index.ts │ │ │ ├── lib/ │ │ │ │ ├── Lightr.ts │ │ │ │ ├── MaterialBrush.ts │ │ │ │ ├── PbrMaterials.ts │ │ │ │ ├── actions/ │ │ │ │ │ ├── bakeTextures.ts │ │ │ │ │ ├── channelAssignment.ts │ │ │ │ │ ├── generateNormal.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── labPbr.ts │ │ │ │ │ ├── materialTexture.ts │ │ │ │ │ ├── mer.ts │ │ │ │ │ ├── textureSet.ts │ │ │ │ │ ├── toggleLights.ts │ │ │ │ │ ├── togglePbr.ts │ │ │ │ │ ├── tonemapping.ts │ │ │ │ │ └── usdz.ts │ │ │ │ ├── applyPbrMaterial.ts │ │ │ │ ├── bakery.ts │ │ │ │ ├── disablePbr.ts │ │ │ │ ├── io/ │ │ │ │ │ ├── UsdzExporter.ts │ │ │ │ │ └── bbmat.ts │ │ │ │ ├── mer.ts │ │ │ │ ├── normalMap.ts │ │ │ │ ├── panels/ │ │ │ │ │ ├── channels.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── materialBrush.ts │ │ │ │ │ └── pbrSettings.ts │ │ │ │ ├── properties.ts │ │ │ │ ├── tools/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── materialBrush.ts │ │ │ │ └── util.ts │ │ │ └── types.d.ts │ │ └── tsconfig.json │ └── resourcepack_packager/ │ ├── .eslintrc │ ├── .gitignore │ ├── .prettierrc │ ├── LICENSE │ ├── package.json │ ├── src/ │ │ ├── elements/ │ │ │ ├── ExportResourcepackFormDialog.ts │ │ │ └── ExportResourcepackMenuAction.ts │ │ ├── index.ts │ │ ├── javaPackVersions.ts │ │ ├── pluginEmitter.ts │ │ ├── services/ │ │ │ ├── buildResourcepackService.ts │ │ │ └── resourcepackOptionsService.ts │ │ ├── types.d.ts │ │ └── utils/ │ │ ├── archiveUtils.ts │ │ ├── arrayUtils.ts │ │ ├── blockbenchUtils.ts │ │ └── objectUtils.ts │ ├── tsconfig.json │ └── webpack.config.js ├── types/ │ ├── changelog.schema.json │ ├── index.d.ts │ └── plugins.schema.json └── updates.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/pull_request_template.md ================================================ > **_IMPORTANT:_** Please remember to update plugin metadata in plugins.json along with the metadata in your plugin. Always increase the version number when submitting an update. Please only update one plugin per pull-request (unless you are applying the same fix to multiple pull requests, and nothing else). ================================================ FILE: .github/workflows/plugin_updates.yml ================================================ name: Plugin Updates on: push: branches: [master] jobs: generate-updates: if: github.repository == 'JannisX11/blockbench-plugins' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "22" - name: Generate updates.json working-directory: build run: node update_plugin_updates.mjs - name: Commit and push updates.json run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add updates.json if ! git diff --cached --quiet; then git commit -m "Update updates.json" git push else echo "No changes to commit" fi ================================================ FILE: .github/workflows/validate.yml ================================================ name: Plugin Validator on: [pull_request] jobs: verify-json-validation: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Validate JSON uses: docker://orrosenblatt/validate-json-action:latest env: INPUT_SCHEMA: ./schema.json INPUT_JSONS: ./plugins.json validate: runs-on: ubuntu-latest steps: - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "22" - name: Checkout the code uses: actions/checkout@v4 with: fetch-depth: 0 # Ensures we have the full history for diff - name: Validate run: | npm ci git fetch origin ${{ github.base_ref }} CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) CHANGED_FILES="$CHANGED_FILES" npm run validate ================================================ FILE: .gitignore ================================================ node_modules/ .DS_Store desktop.ini /.idea ================================================ FILE: .vscode/settings.json ================================================ { "json.schemas": [ { "fileMatch": [ "changelog.json" ], "url": "./types/changelog.schema.json" }, { "fileMatch": [ "plugins.json" ], "url": "./types/plugins.schema.json" } ] } ================================================ FILE: README.md ================================================ # Blockbench Plugin Repository Create a pull request to submit or update plugins. Open an issue to report bugs within plugins and tag the author if possible. ## Installing Plugins To install a plugin, go to File > Plugins... and switch to the available tab. Find the plugin you want to use and click Install. ## Links * Discover plugins: [blockbench.net/plugins](https://blockbench.net/plugins) * Main Blockbench repository: [JannisX11/blockbench](https://github.com/JannisX11/blockbench) * Plugin Documentation: [blockbench.net/wiki/api/plugin](https://www.blockbench.net/wiki/api/plugin) * Discord plugin development forum: [#bb-plugin-dev](https://discord.gg/2Df3h6ge9f) ## Conventions * Plugin IDs should be snake_case and must be consistent across all properties and file names. * Indentation for common files must be Tab character. Individual plugin files can follow own personal preferences. * Use simple semver for plugin versioning: MAJOR.MINOR.PATCH, e. g. "1.2.11". You need to increase the version number for each update that is published. ## File Structure Blockbench supports two file structure systems. ### Legacy structure The legacy format, where plugin Javascript files are saved directly in the plugins directory, was used by Blockbench 4.7 and older, and will continue to be supported for already existing plugins. ### Current structure The new structure utilizes a separate directory per plugin in the plugins directory, which contains the plugin Javascript file, as well as other optional files. The new structure will be used by Blockbench if the `"min_version"` is set to 4.8.0 or higher. The new structure is recommended for new plugins. These are the files that can be added to the plugin directory * `plugins/plugin_id/plugin_id.js`- The plugin Javascript file itself * `plugins/plugin_id/about.md`: Markdown file containing the plugin about + instructions. * `plugins/plugin_id/icon.png` or `icon.svg`: The plugin icon. Icons can be either PNG or SVG files with a resolution of 48x48 - 96x96 and a maximum size of 12 KB. To register an icon, set the icon field in the plugin meta data to the file name of the icon. * `plugins/plugin_id/members.yml`: This file allows you to list Github users who have your permission to do changes to your model, without me having to check back with you. You can add two types of members: `maintainers` Can do anything with the plugin, including removing it entirely or modifying the members list. `developers` can contribute new versions of the plugin. * `plugins/plugin_id/LICENSE.MD`: Add a license if you want to license your plugin as open source. You can choose your license here: [choosealicense.com](https://choosealicense.com) * `plugins/plugin_id/changelog.json`: Add a changelog file for your plugin. Set `has_changelog` to `true` in the meta data to enable this. If you use VS Code (which I recommend), you'll automatically have autocomplete and validation for this file. Make sure to add new versions to the bottom of the file! * `plugins/plugin_id/src/**`: Use this directory to store the plugin source, if using a bundler. ## Development * To develop a plugin, fork and clone the repository. Make sure [NodeJS](https://nodejs.org/en/) is installed and run `npm install` in the repository. This will install the Blockbench types that make it easier to use the Blockbench API. ## Bundling If your plugin exceeds a certain level of complexity, it can reach the point where it becomes necessary to use a Bundler, such as Webpack or esbuild, to build the plugin JS file. This is possible, but comes with the requirement that the source code must be public and human-readable, and builds must be reprocable by anyone from the source. There are several options for keeping your source code: * You can keep the source code in the `src` folder of your plugin's directory. Good example: `plugins/geckolib/src` * In the root `src` folder. Example: `src/resourcepack_packager`. This is deprecated for new plugins. * In an external Git repository. This is recommended for large plugins with active development. Requirements are a min_version of 5.0.0 or higher, a link to the source repository in the plugin metadata, and passing the automatic validation with no errors. When bundling, obfuscation is not allowed. You may use minification if the bundle would otherwise become too large, otherwise consider leaving it unminified for transparency and easier debugging. ## Submission In order to submit your plugin, you need to meet a few requirements: * If your plugin is created by a bundler, you need to upload the source as well. See **Bundling** * If your plugin is designed for anything related to Minecraft, add one of the tags `Minecraft: Java Edition`, `Minecraft: Bedrock Edition` (or `Minecraft`). The same applies if it's designed for another specific game. (Keep in mind that artists from many different areas use Blockbench, so provide some context in the meta data) * In total, you can provide up to three plugin tags * THE PLUGIN META DATA NEEDS TO BE THE SAME in the plugin file itself and in the file `plugins.json`. * Plugins should not be larger than 2 MB * Make sure to not bundle dependencies that are already included in Blockbench. Blockbench comes with a number of libraries already included that can be used by plugins, such as ThreeJS, Vue 2, JSZip, Marked, and MolangJS. * Plugins may not execute code from external sources. This includes separately hosted scripts, user inputs or files, or otherwise externally hosted or generated code. This also applies to rendering of HTML content. * Plugins that utilize generative AI are not accepted into this repository but may be shared externally. This list of plugins is curated to some extent. Plugins will be reviewed and may not be accepted if they don't meet quality standards. Already published plugins may also be taken down if they no longer meet the requirements. While it is the goal to keep the plugin API generally compatible across different Blockbench version, it can happen that a feature is changed or deprecated and your plugin must be updated in order to keep working. It is recommended to test all of your plugins during the beta phase before each Blockbench feature update! To help catch some common issues, you can use the validator script in the root of this repo to catch common issues. This script will also run in each pull request. ```bash npm install npm run validate ``` Once you are ready to submit your plugin, create a pull request. ## Updates Updates to plugins can be submitted via pull request. In order for the plugin to auto update for users who already have it installed, the version number needs to be increased both in the plugin file and in plugins.json. Optionally, a changelog can indicate what changed in a given update. See [Current structure](#current-structure). ## Third party contributions As explained above, you can add approved contributors in the `members.yml` file. For contributions from third parties, the original creator or maintainer of the plugin will be pinged in the respective Pull Request for permission. If you have a preference, you can specify in `membery.yml` under `abandoned` what you would like to happen if you no longer contribute to the plugin and no longer approval third party contributions. If unspecified, if you haven't replied within 4 weeks and are no longer active on Github, or if you haven't replied in 8 weeks despite being active, we may test and merge the contribution. Some small changes like fixes for changed Blockbench APIs may be merged without asking for permission of the original creator. ================================================ FILE: build/generate_plugin_updates.mjs ================================================ import plugins from "../plugins.json" with { type: "json" } import fs from "node:fs" const updates = {} for (const [id, data] of Object.entries(plugins)) { if (!data.version || !/^\d+\.\d+\.\d+$/.test(data.version)) { continue } updates[id] = { version: data.version } let changelog if (data.has_changelog && fs.existsSync(`../plugins/${id}/changelog.json`)) { try { changelog = Object.values(JSON.parse(fs.readFileSync(`../plugins/${id}/changelog.json`))) } catch {} } if (data.creation_date) { updates[id].created = Date.parse(data.creation_date) || 0 } else if (changelog?.[0]?.date) { updates[id].created = Date.parse(changelog[0].date) || 0 } else { updates[id].created = 0 } if (changelog?.at(-1)?.date) { updates[id].updated = Date.parse(changelog.at(-1).date) || updates[id].created } else { updates[id].updated = updates[id].created } } fs.writeFileSync("../updates.json", JSON.stringify(updates, null, 2)) ================================================ FILE: build/update_plugin_updates.mjs ================================================ import plugins from "../plugins.json" with { type: "json" } import updates from "../updates.json" with { type: "json" } import fs from "node:fs" const now = Date.now() for (const [id, data] of Object.entries(plugins)) { if (!data.version || !/^\d+\.\d+\.\d+$/.test(data.version)) { continue } if (!updates[id]) { updates[id] = { version: data.version, created: now, updated: now } continue } if (data.version === updates[id].version) { continue } const [oMaj, oMin, oPatch] = updates[id].version.split(".").map(Number) const [nMaj, nMin, nPatch] = data.version.split(".").map(Number) const wentDown = nMaj < oMaj || (nMaj === oMaj && nMin < oMin) || (nMaj === oMaj && nMin === oMin && nPatch < oPatch) const onlyPatchChanged = nMaj === oMaj && nMin === oMin && nPatch !== oPatch updates[id].version = data.version if (wentDown || onlyPatchChanged) { continue } updates[id].updated = now } fs.writeFileSync("../updates.json", JSON.stringify(updates, null, 2)) ================================================ FILE: package.json ================================================ { "name": "blockbench-plugins", "version": "1.0.0", "description": "Blockbench plugins repository.", "main": "index.js", "types": "types/index.d.ts", "type": "module", "repository": { "type": "git", "url": "git+https://github.com/JannisX11/blockbench-plugins.git" }, "bugs": { "url": "https://github.com/JannisX11/blockbench-plugins/issues" }, "homepage": "https://github.com/JannisX11/blockbench-plugins#readme", "devDependencies": { "blockbench-types": "^5.1.0", "compare-versions": "^6.1.1", "image-size": "^2.0.2" }, "scripts": { "validate": "node ./scripts/validate.js" } } ================================================ FILE: plugins/_template/LICENSE.MD ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: plugins/_template/about.md ================================================ Template plugin! ## How to use ================================================ FILE: plugins/_template/members.yml ================================================ maintainers: - YourName developers: - OtherName ================================================ FILE: plugins/_template/plugin.js ================================================ /// (function() { // When updating, apply meta data changes to plugins.json entry! BBPlugin.register('plugin', { title: 'Plugin', icon: 'icon.png', author: '', description: '', tags: [], version: '0.0.1', min_version: '4.9.0', variant: 'both', onload() { }, onunload() { } }); })() ================================================ FILE: plugins/activity_tracker/about.md ================================================

This plugin allows you to keep track of how much time you spend using Blockbench and how long you spend working on each project.

Usage:

  • Head to the Tools menu and select Activity Tracker
  • From here you can see all your stats for both Blockbench and the current project.
  • You can use the options in the dialog to configure if tracking should pause when tabbed out.
================================================ FILE: plugins/activity_tracker/activity_tracker.js ================================================ let styles, dialog, action, running, importDialog, exportDialog, interval, timeout, notification, state const id = "activity_tracker" const name = "Activity Tracker" const icon = "trending_up" const description = "Track how long you spend using Blockbench and working on each project." const activity = JSON.parse(localStorage.getItem(id) ?? '{ "clock": 0 }') let pauseOnLostFocus = localStorage.getItem(`${id}_pause_lost_focus`) ?? "0" Plugin.register(id, { title: name, icon: "icon.png", author: "Ewan Howell", description, tags: ["Tracking", "Stats", "Utility"], version: "1.1.1", min_version: "4.8.0", variant: "both", creation_date: "2023-03-30", website: "https://ewanhowell.com/plugins/activity-tracker/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/activity-tracker", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Activity Tracker]", has_changelog: true, onload() { activity.session = activity.clock styles = Blockbench.addCSS(` #tracker-container { display: flex; flex-direction: column; align-items: center; text-align: center; } .tracker-row { display: flex; gap: 20px; width: 100%; margin: 10px 0 20px; justify-content: center; } .tracker-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 10px; } .tracker-col > p { color: var(--color-light); font-size: 1.5rem; } .tracker-line { width: 100%; border-top: 2px solid var(--color-border); margin: 10px 0 20px; } #tracker-container .button-row { display: flex; justify-content: flex-end; width: 100%; } #tracker-import { margin: 20px 0 10px; } #tracker-export { user-select: all; } .tracker-row-center { align-items: center; gap: 10px; } #tracker-container i { cursor: pointer; } #tracker-container i:hover { color: var(--color-light); } `) property = new Property(ModelProject, "number", id, { default: 0, exposed: false }) ModelProject.all.forEach(e => { e.activity_tracker = 0 e.activity_tracker_session = 0 }) importDialog = new Dialog({ id: `${id}_import`, title: `${name} Import`, buttons: [], component: { data: { seconds: 0 }, methods: { input(e) { this.seconds = Math.min(parseInt(e.target.value) || 0, 9999999999) }, durationString, confirm() { activity.clock = this.seconds activity.session = this.seconds importDialog.close() } }, template: `

Enter number of seconds:

Preview: {{ durationString(seconds) }}

` } }) exportDialog = new Dialog({ id: `${id}_export`, title: `${name} Export`, buttons: [], component: { data: { clock: activity.clock }, methods: { copy() { navigator.clipboard.writeText(this.clock) const text = $("#tracker-export").text("Copied...") setTimeout(() => text.text(this.clock), 1000) } }, template: `

Your total activity in seconds:

{{ clock }}

content_copy
` } }) dialog = new Dialog({ id, title: name, buttons: [], component: { data: () => ({ get Project() { return Project }, activity, importDialog, exportDialog, options: { "0": "Immediately", "10": "After 10 seconds", "30": "After 30 seconds", "60": "After 1 minute", "300": "After 5 minutes", "600": "After 10 minutes", "1200": "After 20 minutes", "1800": "After 30 minutes", "2700": "After 45 minutes", "3600": "After 1 hour", "never": "Never" }, option: pauseOnLostFocus }), methods: { durationString, set(e) { pauseOnLostFocus = e localStorage.setItem(`${id}_pause_lost_focus`, e) } }, template: `

Global Activity

Total

{{ durationString(activity.clock) }}

Current session

{{ durationString(activity.clock - activity.session) }}

Current Project Activity

Models must be saved as a bbmodel to preserve per project activity tracking.

Total

{{ durationString(Project.${id}) }}

Current session

{{ durationString(Project.${id} - Project.${id}_session) }}

Pause tracking when tabbed out:

` } }) action = new Action({ name, id, description, icon, click: () => dialog.show() }) MenuBar.addAction(action, "tools") window.addEventListener("focus", focus) window.addEventListener("blur", blur) if (Blockbench.isWeb) document.addEventListener("visibilitychange", visibilityChange) Blockbench.on("select_project", selectProject) selectProject() focus() }, onunload() { window.removeEventListener("focus", focus) window.removeEventListener("blur", blur) if (Blockbench.isWeb) document.removeEventListener("visibilitychange", visibilityChange) Blockbench.removeListener("select_project", selectProject) clearTimeout(timeout) clearInterval(interval) styles.delete() property.delete() action.delete() dialog.close() importDialog.close() exportDialog.close() } }) function durationString(num) { num = num * 1000 const years = Math.floor(num / 3.1536e10) let days = Math.floor(num / 8.64e7) % 365 const weeks = Math.floor(days / 7) days %= 7 const hours = Math.floor(num / 3.6e6) % 24 const minutes = Math.floor(num / 6e4) % 60 const seconds = Math.round(num / 1000 % 60) return `${years} year${years === 1 ? "" : "s"}, ${weeks} week${weeks === 1 ? "" : "s"}, ${days} day${days === 1 ? "" : "s"}, ${hours.toString().padStart(2, 0)}:${minutes.toString().padStart(2, 0)}:${seconds.toString().padStart(2, 0)}`.replace(/(? { Project.activity_tracker_session ||= Project.activity_tracker }, 0) } function visibilityChange() { if (document.visibilityState === "hidden") blur() else focus() } function focus() { if (state === "focus") return state = "focus" clearTimeout(timeout) notification?.delete() if (running) return running = true interval = setInterval(() => { activity.clock += 1 Project.activity_tracker += 1 localStorage.setItem(id, JSON.stringify(activity)) }, 1000) } function blur() { if (state === "blur") return state = "blur" if (pauseOnLostFocus === "never") return timeout = setTimeout(() => { clearInterval(interval) running = false notification = Blockbench.showToastNotification({ text: "Activity tracking paused. Tab back in to resume.", icon }) }, parseInt(pauseOnLostFocus) * 1000) } ================================================ FILE: plugins/activity_tracker/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2023-03-30", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.0.1": { "title": "1.0.1", "date": "2023-04-01", "author": "Ewan Howell", "categories": [ { "title": "Fixes", "list": [ "Fixed minor tracking issues" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2025-10-15", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Updated to new repository format" ] }, { "title": "Bug Fixes", "list": [ "Fixed project tracking not showing for Blockbench 5.0" ] } ] }, "1.1.1": { "title": "1.1.1", "date": "2025-10-19", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed project tracking not showing if Activity Tracker is first opened on the Start Screen" ] } ] } } ================================================ FILE: plugins/ambient_occlusion.js ================================================ (function() { /** * @author alteredq / http://alteredqualia.com/ */ THREE.EffectComposer = function ( renderer, renderTarget ) { this.renderer = renderer; if ( renderTarget === undefined ) { var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, stencilBuffer: false }; var size = renderer.getSize( new THREE.Vector2() ); this._pixelRatio = renderer.getPixelRatio(); this._width = size.width; this._height = size.height; renderTarget = new THREE.WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, parameters ); renderTarget.texture.name = 'EffectComposer.rt1'; } else { this._pixelRatio = 1; this._width = renderTarget.width; this._height = renderTarget.height; } this.renderTarget1 = renderTarget; this.renderTarget2 = renderTarget.clone(); this.renderTarget2.texture.name = 'EffectComposer.rt2'; this.writeBuffer = this.renderTarget1; this.readBuffer = this.renderTarget2; this.renderToScreen = true; this.passes = []; // dependencies if ( THREE.CopyShader === undefined ) { console.error( 'THREE.EffectComposer relies on THREE.CopyShader' ); } if ( THREE.ShaderPass === undefined ) { console.error( 'THREE.EffectComposer relies on THREE.ShaderPass' ); } this.copyPass = new THREE.ShaderPass( THREE.CopyShader ); this.clock = new THREE.Clock(); }; Object.assign( THREE.EffectComposer.prototype, { swapBuffers: function () { var tmp = this.readBuffer; this.readBuffer = this.writeBuffer; this.writeBuffer = tmp; }, addPass: function ( pass ) { this.passes.push( pass ); pass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio ); }, insertPass: function ( pass, index ) { this.passes.splice( index, 0, pass ); }, isLastEnabledPass: function ( passIndex ) { for ( var i = passIndex + 1; i < this.passes.length; i ++ ) { if ( this.passes[ i ].enabled ) { return false; } } return true; }, render: function ( deltaTime ) { // deltaTime value is in seconds if ( deltaTime === undefined ) { deltaTime = this.clock.getDelta(); } var currentRenderTarget = this.renderer.getRenderTarget(); var maskActive = false; var pass, i, il = this.passes.length; for ( i = 0; i < il; i ++ ) { pass = this.passes[ i ]; if ( pass.enabled === false ) continue; pass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) ); pass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive ); if ( pass.needsSwap ) { if ( maskActive ) { var context = this.renderer.getContext(); var stencil = this.renderer.state.buffers.stencil; //context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff ); stencil.setFunc( context.NOTEQUAL, 1, 0xffffffff ); this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime ); //context.stencilFunc( context.EQUAL, 1, 0xffffffff ); stencil.setFunc( context.EQUAL, 1, 0xffffffff ); } this.swapBuffers(); } if ( THREE.MaskPass !== undefined ) { if ( pass instanceof THREE.MaskPass ) { maskActive = true; } else if ( pass instanceof THREE.ClearMaskPass ) { maskActive = false; } } } this.renderer.setRenderTarget( currentRenderTarget ); }, reset: function ( renderTarget ) { if ( renderTarget === undefined ) { var size = this.renderer.getSize( new THREE.Vector2() ); this._pixelRatio = this.renderer.getPixelRatio(); this._width = size.width; this._height = size.height; renderTarget = this.renderTarget1.clone(); renderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio ); } this.renderTarget1.dispose(); this.renderTarget2.dispose(); this.renderTarget1 = renderTarget; this.renderTarget2 = renderTarget.clone(); this.writeBuffer = this.renderTarget1; this.readBuffer = this.renderTarget2; }, setSize: function ( width, height ) { this._width = width; this._height = height; var effectiveWidth = this._width * this._pixelRatio; var effectiveHeight = this._height * this._pixelRatio; this.renderTarget1.setSize( effectiveWidth, effectiveHeight ); this.renderTarget2.setSize( effectiveWidth, effectiveHeight ); for ( var i = 0; i < this.passes.length; i ++ ) { this.passes[ i ].setSize( effectiveWidth, effectiveHeight ); } }, setPixelRatio: function ( pixelRatio ) { this._pixelRatio = pixelRatio; this.setSize( this._width, this._height ); } } ); THREE.Pass = function () { // if set to true, the pass is processed by the composer this.enabled = true; // if set to true, the pass indicates to swap read and write buffer after rendering this.needsSwap = true; // if set to true, the pass clears its buffer before rendering this.clear = false; // if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer. this.renderToScreen = false; }; Object.assign( THREE.Pass.prototype, { setSize: function ( /* width, height */ ) {}, render: function ( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) { console.error( 'THREE.Pass: .render() must be implemented in derived pass.' ); } } ); // Helper for passes that need to fill the viewport with a single quad. THREE.Pass.FullScreenQuad = ( function () { var camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); var geometry = new THREE.PlaneBufferGeometry( 2, 2 ); var FullScreenQuad = function ( material ) { this._mesh = new THREE.Mesh( geometry, material ); }; Object.defineProperty( FullScreenQuad.prototype, 'material', { get: function () { return this._mesh.material; }, set: function ( value ) { this._mesh.material = value; } } ); Object.assign( FullScreenQuad.prototype, { dispose: function () { this._mesh.geometry.dispose(); }, render: function ( renderer ) { renderer.render( this._mesh, camera ); } } ); return FullScreenQuad; } )(); /** * @author alteredq / http://alteredqualia.com/ * * Full-screen textured quad shader */ THREE.CopyShader = { uniforms: { "tDiffuse": { value: null }, "opacity": { value: 1.0 } }, vertexShader: [ "varying vec2 vUv;", "void main() {", " vUv = uv;", " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "}" ].join( "\n" ), fragmentShader: [ "uniform float opacity;", "uniform sampler2D tDiffuse;", "varying vec2 vUv;", "void main() {", " vec4 texel = texture2D( tDiffuse, vUv );", " gl_FragColor = opacity * texel;", "}" ].join( "\n" ) }; /** * @author alteredq / http://alteredqualia.com/ */ THREE.ShaderPass = function ( shader, textureID ) { THREE.Pass.call( this ); this.textureID = ( textureID !== undefined ) ? textureID : "tDiffuse"; if ( shader instanceof THREE.ShaderMaterial ) { this.uniforms = shader.uniforms; this.material = shader; } else if ( shader ) { this.uniforms = THREE.UniformsUtils.clone( shader.uniforms ); this.material = new THREE.ShaderMaterial( { defines: Object.assign( {}, shader.defines ), uniforms: this.uniforms, vertexShader: shader.vertexShader, fragmentShader: shader.fragmentShader } ); } this.fsQuad = new THREE.Pass.FullScreenQuad( this.material ); }; THREE.ShaderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), { constructor: THREE.ShaderPass, render: function ( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) { if ( this.uniforms[ this.textureID ] ) { this.uniforms[ this.textureID ].value = readBuffer.texture; } this.fsQuad.material = this.material; if ( this.renderToScreen ) { renderer.setRenderTarget( null ); this.fsQuad.render( renderer ); } else { renderer.setRenderTarget( writeBuffer ); // TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600 if ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); this.fsQuad.render( renderer ); } } } ); /** * @author alteredq / http://alteredqualia.com/ */ THREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) { THREE.Pass.call( this ); this.scene = scene; this.camera = camera; this.overrideMaterial = overrideMaterial; this.clearColor = clearColor; this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0; this.clear = true; this.clearDepth = false; this.needsSwap = false; }; THREE.RenderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), { constructor: THREE.RenderPass, render: function ( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) { var oldAutoClear = renderer.autoClear; renderer.autoClear = false; var oldClearColor, oldClearAlpha, oldOverrideMaterial; if ( this.overrideMaterial !== undefined ) { oldOverrideMaterial = this.scene.overrideMaterial; this.scene.overrideMaterial = this.overrideMaterial; } if ( this.clearColor ) { oldClearColor = renderer.getClearColor(new THREE.Color()).getHex(); oldClearAlpha = renderer.getClearAlpha(); renderer.setClearColor( this.clearColor, this.clearAlpha ); } if ( this.clearDepth ) { renderer.clearDepth(); } renderer.setRenderTarget( this.renderToScreen ? null : readBuffer ); // TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600 if ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); renderer.render( this.scene, this.camera ); if ( this.clearColor ) { renderer.setClearColor( oldClearColor, oldClearAlpha ); } if ( this.overrideMaterial !== undefined ) { this.scene.overrideMaterial = oldOverrideMaterial; } renderer.autoClear = oldAutoClear; } } ); /** * TODO */ THREE.SAOShader = { defines: { "NUM_SAMPLES": 7, "NUM_RINGS": 4, "NORMAL_TEXTURE": 0, "DIFFUSE_TEXTURE": 0, "DEPTH_PACKING": 1, "PERSPECTIVE_CAMERA": 1 }, uniforms: { "tDepth": { value: null }, "tDiffuse": { value: null }, "tNormal": { value: null }, "size": { value: new THREE.Vector2( 512, 512 ) }, "cameraNear": { value: 1 }, "cameraFar": { value: 100 }, "cameraProjectionMatrix": { value: new THREE.Matrix4() }, "cameraInverseProjectionMatrix": { value: new THREE.Matrix4() }, "scale": { value: 1.0 }, "intensity": { value: 0.1 }, "bias": { value: 0.5 }, "minResolution": { value: 0.0 }, "kernelRadius": { value: 100.0 }, "randomSeed": { value: 0.0 } }, vertexShader: [ "varying vec2 vUv;", "void main() {", " vUv = uv;", " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "}" ].join( "\n" ), fragmentShader: [ "#include ", "varying vec2 vUv;", "#if DIFFUSE_TEXTURE == 1", "uniform sampler2D tDiffuse;", "#endif", "uniform sampler2D tDepth;", "#if NORMAL_TEXTURE == 1", "uniform sampler2D tNormal;", "#endif", "uniform float cameraNear;", "uniform float cameraFar;", "uniform mat4 cameraProjectionMatrix;", "uniform mat4 cameraInverseProjectionMatrix;", "uniform float scale;", "uniform float intensity;", "uniform float bias;", "uniform float kernelRadius;", "uniform float minResolution;", "uniform vec2 size;", "uniform float randomSeed;", "// RGBA depth", "#include ", "vec4 getDefaultColor( const in vec2 screenPosition ) {", " #if DIFFUSE_TEXTURE == 1", " return texture2D( tDiffuse, vUv );", " #else", " return vec4( 1.0 );", " #endif", "}", "float getDepth( const in vec2 screenPosition ) {", " #if DEPTH_PACKING == 1", " return unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );", " #else", " return texture2D( tDepth, screenPosition ).x;", " #endif", "}", "float getViewZ( const in float depth ) {", " #if PERSPECTIVE_CAMERA == 1", " return perspectiveDepthToViewZ( depth, cameraNear, cameraFar );", " #else", " return orthographicDepthToViewZ( depth, cameraNear, cameraFar );", " #endif", "}", "vec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {", " float clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];", " vec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );", " clipPosition *= clipW; // unprojection.", " return ( cameraInverseProjectionMatrix * clipPosition ).xyz;", "}", "vec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition ) {", " #if NORMAL_TEXTURE == 1", " return unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );", " #else", " return normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );", " #endif", "}", "float scaleDividedByCameraFar;", "float minResolutionMultipliedByCameraFar;", "float getOcclusion( const in vec3 centerViewPosition, const in vec3 centerViewNormal, const in vec3 sampleViewPosition ) {", " vec3 viewDelta = sampleViewPosition - centerViewPosition;", " float viewDistance = length( viewDelta );", " float scaledScreenDistance = scaleDividedByCameraFar * viewDistance;", " return max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );", "}", "// moving costly divides into consts", "const float ANGLE_STEP = PI2 * float( NUM_RINGS ) / float( NUM_SAMPLES );", "const float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );", "float getAmbientOcclusion( const in vec3 centerViewPosition ) {", " // precompute some variables require in getOcclusion.", " scaleDividedByCameraFar = scale / cameraFar;", " minResolutionMultipliedByCameraFar = minResolution * cameraFar;", " vec3 centerViewNormal = getViewNormal( centerViewPosition, vUv );", " // jsfiddle that shows sample pattern: https://jsfiddle.net/a16ff1p7/", " float angle = rand( vUv + randomSeed ) * PI2;", " vec2 radius = vec2( kernelRadius * INV_NUM_SAMPLES ) / size;", " vec2 radiusStep = radius;", " float occlusionSum = 0.0;", " float weightSum = 0.0;", " for( int i = 0; i < NUM_SAMPLES; i ++ ) {", " vec2 sampleUv = vUv + vec2( cos( angle ), sin( angle ) ) * radius;", " radius += radiusStep;", " angle += ANGLE_STEP;", " float sampleDepth = getDepth( sampleUv );", " if( sampleDepth >= ( 1.0 - EPSILON ) ) {", " continue;", " }", " float sampleViewZ = getViewZ( sampleDepth );", " vec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );", " occlusionSum += getOcclusion( centerViewPosition, centerViewNormal, sampleViewPosition );", " weightSum += 1.0;", " }", " if( weightSum == 0.0 ) discard;", " return occlusionSum * ( intensity / weightSum );", "}", "void main() {", " float centerDepth = getDepth( vUv );", " if( centerDepth >= ( 1.0 - EPSILON ) ) {", " discard;", " }", " float centerViewZ = getViewZ( centerDepth );", " vec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );", " float ambientOcclusion = getAmbientOcclusion( viewPosition );", " gl_FragColor = getDefaultColor( vUv );", " gl_FragColor.xyz *= 1.0 - ambientOcclusion;", "}" ].join( "\n" ) }; /** * TODO */ THREE.DepthLimitedBlurShader = { defines: { "KERNEL_RADIUS": 4, "DEPTH_PACKING": 1, "PERSPECTIVE_CAMERA": 1 }, uniforms: { "tDiffuse": { value: null }, "size": { value: new THREE.Vector2( 512, 512 ) }, "sampleUvOffsets": { value: [ new THREE.Vector2( 0, 0 ) ] }, "sampleWeights": { value: [ 1.0 ] }, "tDepth": { value: null }, "cameraNear": { value: 10 }, "cameraFar": { value: 1000 }, "depthCutoff": { value: 10 }, }, vertexShader: [ "#include ", "uniform vec2 size;", "varying vec2 vUv;", "varying vec2 vInvSize;", "void main() {", " vUv = uv;", " vInvSize = 1.0 / size;", " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "}" ].join( "\n" ), fragmentShader: [ "#include ", "#include ", "uniform sampler2D tDiffuse;", "uniform sampler2D tDepth;", "uniform float cameraNear;", "uniform float cameraFar;", "uniform float depthCutoff;", "uniform vec2 sampleUvOffsets[ KERNEL_RADIUS + 1 ];", "uniform float sampleWeights[ KERNEL_RADIUS + 1 ];", "varying vec2 vUv;", "varying vec2 vInvSize;", "float getDepth( const in vec2 screenPosition ) {", " #if DEPTH_PACKING == 1", " return unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );", " #else", " return texture2D( tDepth, screenPosition ).x;", " #endif", "}", "float getViewZ( const in float depth ) {", " #if PERSPECTIVE_CAMERA == 1", " return perspectiveDepthToViewZ( depth, cameraNear, cameraFar );", " #else", " return orthographicDepthToViewZ( depth, cameraNear, cameraFar );", " #endif", "}", "void main() {", " float depth = getDepth( vUv );", " if( depth >= ( 1.0 - EPSILON ) ) {", " discard;", " }", " float centerViewZ = -getViewZ( depth );", " bool rBreak = false, lBreak = false;", " float weightSum = sampleWeights[0];", " vec4 diffuseSum = texture2D( tDiffuse, vUv ) * weightSum;", " for( int i = 1; i <= KERNEL_RADIUS; i ++ ) {", " float sampleWeight = sampleWeights[i];", " vec2 sampleUvOffset = sampleUvOffsets[i] * vInvSize;", " vec2 sampleUv = vUv + sampleUvOffset;", " float viewZ = -getViewZ( getDepth( sampleUv ) );", " if( abs( viewZ - centerViewZ ) > depthCutoff ) rBreak = true;", " if( ! rBreak ) {", " diffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;", " weightSum += sampleWeight;", " }", " sampleUv = vUv - sampleUvOffset;", " viewZ = -getViewZ( getDepth( sampleUv ) );", " if( abs( viewZ - centerViewZ ) > depthCutoff ) lBreak = true;", " if( ! lBreak ) {", " diffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;", " weightSum += sampleWeight;", " }", " }", " gl_FragColor = diffuseSum / weightSum;", "}" ].join( "\n" ) }; THREE.BlurShaderUtils = { createSampleWeights: function ( kernelRadius, stdDev ) { var gaussian = function ( x, stdDev ) { return Math.exp( - ( x * x ) / ( 2.0 * ( stdDev * stdDev ) ) ) / ( Math.sqrt( 2.0 * Math.PI ) * stdDev ); }; var weights = []; for ( var i = 0; i <= kernelRadius; i ++ ) { weights.push( gaussian( i, stdDev ) ); } return weights; }, createSampleOffsets: function ( kernelRadius, uvIncrement ) { var offsets = []; for ( var i = 0; i <= kernelRadius; i ++ ) { offsets.push( uvIncrement.clone().multiplyScalar( i ) ); } return offsets; }, configure: function ( material, kernelRadius, stdDev, uvIncrement ) { material.defines[ "KERNEL_RADIUS" ] = kernelRadius; material.uniforms[ "sampleUvOffsets" ].value = THREE.BlurShaderUtils.createSampleOffsets( kernelRadius, uvIncrement ); material.uniforms[ "sampleWeights" ].value = THREE.BlurShaderUtils.createSampleWeights( kernelRadius, stdDev ); material.needsUpdate = true; } }; /** * @author alteredq / http://alteredqualia.com/ * * Unpack RGBA depth shader * - show RGBA encoded depth as monochrome color */ THREE.UnpackDepthRGBAShader = { uniforms: { "tDiffuse": { value: null }, "opacity": { value: 1.0 } }, vertexShader: [ "varying vec2 vUv;", "void main() {", " vUv = uv;", " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "}" ].join( "\n" ), fragmentShader: [ "uniform float opacity;", "uniform sampler2D tDiffuse;", "varying vec2 vUv;", "#include ", "void main() {", " float depth = 1.0 - unpackRGBAToDepth( texture2D( tDiffuse, vUv ) );", " gl_FragColor = vec4( vec3( depth ), opacity );", "}" ].join( "\n" ) }; /** * @author ludobaka / ludobaka.github.io * SAO implementation inspired from bhouston previous SAO work */ THREE.SAOPass = function ( scene, camera, depthTexture, useNormals, resolution ) { THREE.Pass.call( this ); this.scene = scene; this.camera = camera; this.clear = true; this.needsSwap = false; this.supportsDepthTextureExtension = ( depthTexture !== undefined ) ? depthTexture : false; this.supportsNormalTexture = ( useNormals !== undefined ) ? useNormals : false; this.originalClearColor = new THREE.Color(); this.oldClearColor = new THREE.Color(); this.oldClearAlpha = 1; this.params = { output: 0, saoBias: 0.5, saoIntensity: 0.18, saoScale: 1, saoKernelRadius: 100, saoMinResolution: 0, saoBlur: true, saoBlurRadius: 8, saoBlurStdDev: 4, saoBlurDepthCutoff: 0.01 }; this.resolution = ( resolution !== undefined ) ? new THREE.Vector2( resolution.x, resolution.y ) : new THREE.Vector2( 256, 256 ); this.saoRenderTarget = new THREE.WebGLRenderTarget( this.resolution.x, this.resolution.y, { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat } ); this.blurIntermediateRenderTarget = this.saoRenderTarget.clone(); this.beautyRenderTarget = this.saoRenderTarget.clone(); this.normalRenderTarget = new THREE.WebGLRenderTarget( this.resolution.x, this.resolution.y, { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat } ); this.depthRenderTarget = this.normalRenderTarget.clone(); if ( this.supportsDepthTextureExtension ) { var depthTexture = new THREE.DepthTexture(); depthTexture.type = THREE.UnsignedShortType; depthTexture.minFilter = THREE.NearestFilter; depthTexture.maxFilter = THREE.NearestFilter; this.beautyRenderTarget.depthTexture = depthTexture; this.beautyRenderTarget.depthBuffer = true; } this.depthMaterial = new THREE.MeshDepthMaterial(); this.depthMaterial.depthPacking = THREE.RGBADepthPacking; this.depthMaterial.blending = THREE.NoBlending; this.normalMaterial = new THREE.MeshNormalMaterial(); this.normalMaterial.blending = THREE.NoBlending; if ( THREE.SAOShader === undefined ) { console.error( 'THREE.SAOPass relies on THREE.SAOShader' ); } this.saoMaterial = new THREE.ShaderMaterial( { defines: Object.assign( {}, THREE.SAOShader.defines ), fragmentShader: THREE.SAOShader.fragmentShader, vertexShader: THREE.SAOShader.vertexShader, uniforms: THREE.UniformsUtils.clone( THREE.SAOShader.uniforms ) } ); this.saoMaterial.extensions.derivatives = true; this.saoMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1; this.saoMaterial.defines[ 'NORMAL_TEXTURE' ] = this.supportsNormalTexture ? 1 : 0; this.saoMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0; this.saoMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture; this.saoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture; this.saoMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y ); this.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrix ).invert(); this.saoMaterial.uniforms[ 'cameraProjectionMatrix' ].value = this.camera.projectionMatrix; this.saoMaterial.blending = THREE.NoBlending; if ( THREE.DepthLimitedBlurShader === undefined ) { console.error( 'THREE.SAOPass relies on THREE.DepthLimitedBlurShader' ); } this.vBlurMaterial = new THREE.ShaderMaterial( { uniforms: THREE.UniformsUtils.clone( THREE.DepthLimitedBlurShader.uniforms ), defines: Object.assign( {}, THREE.DepthLimitedBlurShader.defines ), vertexShader: THREE.DepthLimitedBlurShader.vertexShader, fragmentShader: THREE.DepthLimitedBlurShader.fragmentShader } ); this.vBlurMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1; this.vBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0; this.vBlurMaterial.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture; this.vBlurMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture; this.vBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y ); this.vBlurMaterial.blending = THREE.NoBlending; this.hBlurMaterial = new THREE.ShaderMaterial( { uniforms: THREE.UniformsUtils.clone( THREE.DepthLimitedBlurShader.uniforms ), defines: Object.assign( {}, THREE.DepthLimitedBlurShader.defines ), vertexShader: THREE.DepthLimitedBlurShader.vertexShader, fragmentShader: THREE.DepthLimitedBlurShader.fragmentShader } ); this.hBlurMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1; this.hBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0; this.hBlurMaterial.uniforms[ 'tDiffuse' ].value = this.blurIntermediateRenderTarget.texture; this.hBlurMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture; this.hBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y ); this.hBlurMaterial.blending = THREE.NoBlending; if ( THREE.CopyShader === undefined ) { console.error( 'THREE.SAOPass relies on THREE.CopyShader' ); } this.materialCopy = new THREE.ShaderMaterial( { uniforms: THREE.UniformsUtils.clone( THREE.CopyShader.uniforms ), vertexShader: THREE.CopyShader.vertexShader, fragmentShader: THREE.CopyShader.fragmentShader, blending: THREE.NoBlending } ); this.materialCopy.transparent = true; this.materialCopy.depthTest = false; this.materialCopy.depthWrite = false; this.materialCopy.blending = THREE.CustomBlending; this.materialCopy.blendSrc = THREE.DstColorFactor; this.materialCopy.blendDst = THREE.ZeroFactor; this.materialCopy.blendEquation = THREE.AddEquation; this.materialCopy.blendSrcAlpha = THREE.DstAlphaFactor; this.materialCopy.blendDstAlpha = THREE.ZeroFactor; this.materialCopy.blendEquationAlpha = THREE.AddEquation; if ( THREE.UnpackDepthRGBAShader === undefined ) { console.error( 'THREE.SAOPass relies on THREE.UnpackDepthRGBAShader' ); } this.depthCopy = new THREE.ShaderMaterial( { uniforms: THREE.UniformsUtils.clone( THREE.UnpackDepthRGBAShader.uniforms ), vertexShader: THREE.UnpackDepthRGBAShader.vertexShader, fragmentShader: THREE.UnpackDepthRGBAShader.fragmentShader, blending: THREE.NoBlending } ); this.fsQuad = new THREE.Pass.FullScreenQuad( null ); }; THREE.SAOPass.OUTPUT = { 'Beauty': 1, 'Default': 0, 'SAO': 2, 'Depth': 3, 'Normal': 4 }; THREE.SAOPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), { constructor: THREE.SAOPass, render: function ( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) { // Rendering readBuffer first when rendering to screen if ( this.renderToScreen ) { this.materialCopy.blending = THREE.NoBlending; this.materialCopy.uniforms[ 'tDiffuse' ].value = readBuffer.texture; this.materialCopy.needsUpdate = true; this.renderPass( renderer, this.materialCopy, null ); } if ( this.params.output === 1 ) { return; } this.oldClearColor.copy( renderer.getClearColor(new THREE.Color()) ); this.oldClearAlpha = renderer.getClearAlpha(); var oldAutoClear = renderer.autoClear; renderer.autoClear = false; renderer.setRenderTarget( this.depthRenderTarget ); renderer.clear(); this.saoMaterial.uniforms[ 'bias' ].value = this.params.saoBias; this.saoMaterial.uniforms[ 'intensity' ].value = this.params.saoIntensity; this.saoMaterial.uniforms[ 'scale' ].value = this.params.saoScale; this.saoMaterial.uniforms[ 'kernelRadius' ].value = this.params.saoKernelRadius; this.saoMaterial.uniforms[ 'minResolution' ].value = this.params.saoMinResolution; this.saoMaterial.uniforms[ 'cameraNear' ].value = this.camera.near; this.saoMaterial.uniforms[ 'cameraFar' ].value = this.camera.far; // this.saoMaterial.uniforms['randomSeed'].value = Math.random(); var depthCutoff = this.params.saoBlurDepthCutoff * ( this.camera.far - this.camera.near ); this.vBlurMaterial.uniforms[ 'depthCutoff' ].value = depthCutoff; this.hBlurMaterial.uniforms[ 'depthCutoff' ].value = depthCutoff; this.vBlurMaterial.uniforms[ 'cameraNear' ].value = this.camera.near; this.vBlurMaterial.uniforms[ 'cameraFar' ].value = this.camera.far; this.hBlurMaterial.uniforms[ 'cameraNear' ].value = this.camera.near; this.hBlurMaterial.uniforms[ 'cameraFar' ].value = this.camera.far; this.params.saoBlurRadius = Math.floor( this.params.saoBlurRadius ); if ( ( this.prevStdDev !== this.params.saoBlurStdDev ) || ( this.prevNumSamples !== this.params.saoBlurRadius ) ) { THREE.BlurShaderUtils.configure( this.vBlurMaterial, this.params.saoBlurRadius, this.params.saoBlurStdDev, new THREE.Vector2( 0, 1 ) ); THREE.BlurShaderUtils.configure( this.hBlurMaterial, this.params.saoBlurRadius, this.params.saoBlurStdDev, new THREE.Vector2( 1, 0 ) ); this.prevStdDev = this.params.saoBlurStdDev; this.prevNumSamples = this.params.saoBlurRadius; } // Rendering scene to depth texture renderer.setClearColor( 0x000000 ); renderer.setRenderTarget( this.beautyRenderTarget ); renderer.clear(); renderer.render( this.scene, this.camera ); // Re-render scene if depth texture extension is not supported if ( ! this.supportsDepthTextureExtension ) { // Clear rule : far clipping plane in both RGBA and Basic encoding this.renderOverride( renderer, this.depthMaterial, this.depthRenderTarget, 0x000000, 1.0 ); } if ( this.supportsNormalTexture ) { // Clear rule : default normal is facing the camera this.renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 ); } // Rendering SAO texture this.renderPass( renderer, this.saoMaterial, this.saoRenderTarget, 0xffffff, 1.0 ); // Blurring SAO texture if ( this.params.saoBlur ) { this.renderPass( renderer, this.vBlurMaterial, this.blurIntermediateRenderTarget, 0xffffff, 1.0 ); this.renderPass( renderer, this.hBlurMaterial, this.saoRenderTarget, 0xffffff, 1.0 ); } var outputMaterial = this.materialCopy; // Setting up SAO rendering if ( this.params.output === 3 ) { if ( this.supportsDepthTextureExtension ) { this.materialCopy.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.depthTexture; this.materialCopy.needsUpdate = true; } else { this.depthCopy.uniforms[ 'tDiffuse' ].value = this.depthRenderTarget.texture; this.depthCopy.needsUpdate = true; outputMaterial = this.depthCopy; } } else if ( this.params.output === 4 ) { this.materialCopy.uniforms[ 'tDiffuse' ].value = this.normalRenderTarget.texture; this.materialCopy.needsUpdate = true; } else { this.materialCopy.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture; this.materialCopy.needsUpdate = true; } // Blending depends on output, only want a CustomBlending when showing SAO if ( this.params.output === 0 ) { outputMaterial.blending = THREE.CustomBlending; } else { outputMaterial.blending = THREE.NoBlending; } // Rendering SAOPass result on top of previous pass this.renderPass( renderer, outputMaterial, this.renderToScreen ? null : readBuffer ); renderer.setClearColor( this.oldClearColor, this.oldClearAlpha ); renderer.autoClear = oldAutoClear; }, renderPass: function ( renderer, passMaterial, renderTarget, clearColor, clearAlpha ) { // save original state this.originalClearColor.copy( renderer.getClearColor(new THREE.Color()) ); var originalClearAlpha = renderer.getClearAlpha(); var originalAutoClear = renderer.autoClear; renderer.setRenderTarget( renderTarget ); // setup pass state renderer.autoClear = false; if ( ( clearColor !== undefined ) && ( clearColor !== null ) ) { renderer.setClearColor( clearColor ); renderer.setClearAlpha( clearAlpha || 0.0 ); renderer.clear(); } this.fsQuad.material = passMaterial; this.fsQuad.render( renderer ); // restore original state renderer.autoClear = originalAutoClear; renderer.setClearColor( this.originalClearColor ); renderer.setClearAlpha( originalClearAlpha ); }, renderOverride: function ( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) { this.originalClearColor.copy( renderer.getClearColor(new THREE.Color()) ); var originalClearAlpha = renderer.getClearAlpha(); var originalAutoClear = renderer.autoClear; renderer.setRenderTarget( renderTarget ); renderer.autoClear = false; clearColor = overrideMaterial.clearColor || clearColor; clearAlpha = overrideMaterial.clearAlpha || clearAlpha; if ( ( clearColor !== undefined ) && ( clearColor !== null ) ) { renderer.setClearColor( clearColor ); renderer.setClearAlpha( clearAlpha || 0.0 ); renderer.clear(); } this.scene.overrideMaterial = overrideMaterial; renderer.render( this.scene, this.camera ); this.scene.overrideMaterial = null; // restore original state renderer.autoClear = originalAutoClear; renderer.setClearColor( this.originalClearColor ); renderer.setClearAlpha( originalClearAlpha ); }, setSize: function ( width, height ) { this.beautyRenderTarget.setSize( width, height ); this.saoRenderTarget.setSize( width, height ); this.blurIntermediateRenderTarget.setSize( width, height ); this.normalRenderTarget.setSize( width, height ); this.depthRenderTarget.setSize( width, height ); this.saoMaterial.uniforms[ 'size' ].value.set( width, height ); this.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrix ).invert(); this.saoMaterial.uniforms[ 'cameraProjectionMatrix' ].value = this.camera.projectionMatrix; this.saoMaterial.needsUpdate = true; this.vBlurMaterial.uniforms[ 'size' ].value.set( width, height ); this.vBlurMaterial.needsUpdate = true; this.hBlurMaterial.uniforms[ 'size' ].value.set( width, height ); this.hBlurMaterial.needsUpdate = true; } } ); Plugin.register('ambient_occlusion', { title: 'Ambient Occlusion', icon: 'gradient', author: 'JannisX11', description: 'Adds a screen space ambient occlusion shader', tags: ["Deprecated"], deprecation_note: "This plugin can cause visual artifacts and a decreased framerate", version: '1.0.4', min_version: '3.2.0', variant: 'both', onload() { new Setting('ambient_occlusion_enabled', { name: 'Ambient Occlusion', description: 'Enable Ambient Occlusion in the Blockbench previews', category: 'preview', value: 'true', onChange: (value) => { Preview.all.forEach(preview => { if (!value || preview == MediaPreview) return; preview.composer.setSize(preview.width, preview.height); }) } }) new Setting('ambient_occlusion_intensity', { name: 'Ambient Occlusion Intensity', description: 'Ambient Occlusion intensity in the Blockbench previews, 50 is the maximum.', category: 'preview', type: 'number', value: 25, min: 0, max: 50, onChange: (value) => { value = Math.clamp(value, 0, 50)/100; Preview.all.forEach(preview => { if (!preview.saoPass || preview == MediaPreview) return; preview.saoPass.params.saoIntensity = value; }) } }) function setupPreviewSAO(preview) { var this_scene = (preview.id == 'display' && Blockbench.isOlderThan('4.3')) ? window.display_scene : scene; preview.composer = new THREE.EffectComposer( preview.renderer ); preview.renderPass = new THREE.RenderPass( this_scene, preview.camPers ); preview.composer.addPass( preview.renderPass ); preview.saoPass = new THREE.SAOPass( this_scene, preview.camPers, false, true ); preview.composer.addPass( preview.saoPass ); preview.saoPass.params.saoIntensity = 0.25; preview.saoPass.params.saoScale = 2900; } Preview.all.filter(preview => preview != MediaPreview).forEach(setupPreviewSAO) Preview.prototype.render = function() { this.controls.update() //console.log(Settings.get('ambient_occlusion_enabled') ? 'composer' : 'renderer', this[Settings.get('ambient_occlusion_enabled') ? 'composer' : 'renderer']) this[(Settings.get('ambient_occlusion_enabled') && this !== MediaPreview) ? 'composer' : 'renderer'].render( (Modes.display && Blockbench.isOlderThan('4.3')) ? display_scene : scene, this.camera ) } Preview.prototype.resize = function(width, height) { if (this.canvas.isConnected && this !== MediaPreview) { this.height = this.node.parentElement.clientHeight; this.width = this.node.parentElement.clientWidth; } else if (height && width) { this.height = height; this.width = width; } else { return this; } if (!this.saoPass && this !== MediaPreview) { setupPreviewSAO(this); } if (this.isOrtho === false) { this.camPers.aspect = this.width / this.height this.camPers.updateProjectionMatrix(); } else { this.camOrtho.right = this.width / 80 this.camOrtho.left = this.camOrtho.right*-1 this.camOrtho.top = this.height / 80 this.camOrtho.bottom = this.camOrtho.top*-1 this.camOrtho.updateProjectionMatrix(); } this.renderer.setSize(this.width, this.height); if (Settings.get('ambient_occlusion_enabled') && this !== MediaPreview) this.composer.setSize(this.width, this.height); this.renderer.setPixelRatio(window.devicePixelRatio); if (this.canvas.isConnected) { this.updateBackground() if (Transformer) { Transformer.update() } } if (this._wasOrtho != this.isOrtho && this !== MediaPreview) { this.renderPass.camera = this.camera; this.saoPass.camera = this.camera; this._wasOrtho == this.isOrtho; } return this; } }, onunload() { if (settings.ambient_occlusion_enabled) settings.ambient_occlusion_enabled.delete(); if (settings.ambient_occlusion_intensity) settings.ambient_occlusion_intensity.delete(); } }); })() ================================================ FILE: plugins/animated_java/about.md ================================================
Do you wish your Vanilla Minecraft creations could move and animate like the ones in mods?  Are you tired of Minecraft's  silly model limitations?  Animated Java is here to help!

Welcome to Animated Java!

Armor Stand Waving

Animated Java is a plugin for Blockbench that allows you to create custom animations and models for Vanilla Minecraft. It uses the power of Java Edition's Data Pack and Resource Pack systems to bring your creations to life!

Features

  • Variants: Swap between different textures in-game.
  • Highly optimized: Hours of performance tests and optimization tweaks have gone into Animated Java's Exported Data Pack to make sure it has as little performance impact as possible.
  • Limited Molang support. If Blockbench can render it, Animated Java can animate it.
  • Text Display previewing and animation support.
  • Resource Pack-less exporting. Animate Vanilla block and item models!
  • Locators: Run commands relative to a locators position via keyframes.
  • Camera Plugin Support: Install the Official Camera Plugin to create cinematic camera paths with ease!
  • Animation Tweening: Create smooth transitions between animations.
  • Many different configuration options.
  • Complete Documentation at animated-java.dev/documentation/
  • And much more!

Getting started

To learn the basics of Animated Java, check out our Getting Started guide.

Note that it is highly recommended to have a basic understanding of Java Edition's Data Pack and Resource Pack systems before using Animated Java!

Need Help?

Check our Documentation to find answers to common questions or make a post in the #animated-java-support channel on our Discord server to get help from the community and developers.

Found a bug?

If you find a bug, please report it on our GitHub. It only takes a few moments of your time, and improves the quality of the project for everyone!

================================================ FILE: plugins/animated_java/animated_java.js ================================================ //?? ╭─────────────────────────────────────────────────────────────────────────────────╮ //?? │ ____ _ _ _ _ _ ____ ___ ____ ___ _ ____ _ _ ____ │ //?? │ |__| |\ | | |\/| |__| | |___ | \ | |__| | | |__| │ //?? │ | | | \| | | | | | | |___ |__/ _| | | \/ | | │ //?? │ │ //?? │ v1.8.1 │ //?? │ │ //?? │ Effortlessly craft complex animations for Minecraft: Java Edition │ //?? │ │ //?? │ Created by Titus Evans (SnaveSutit) │ //?? │ (snavesutit@gmail.com) [https://discordapp.com/users/213746232923783168] │ //?? │ │ //?? │ With AMAZING help from │ //?? │ │ //?? │ Ian Senne (FetchBot) │ //?? │ (contact@iansenne.com) [https://discordapp.com/users/162347688011104256] │ //?? │ │ //?? │ and Jesse Spicer (Dominexis) │ //?? │ (dominexis9@gmail.com) [https://discordapp.com/users/749826119636615229] │ //?? │ │ //?? │ [ SPECIAL THANKS ] │ //?? │ │ //?? │ Howzieky, MulverineX, YokaiS, Ancientkingg, Ersatz, │ //?? │ CubeDeveloper, __SK__, MrMakistein, Flubberschnub, │ //?? │ legitimoose, VelVoxelRaptor, _JeffWooden, Onnowhere, │ //?? │ DoubleFelix, JayPeaSize, Kastle, Matt/Arwen, │ //?? │ Nerdrope, Sprunkles, Suso, taj, TheRedstoneer, │ //?? │ Totigonzales, VioletXIV, CommanderRedstone, │ //?? │ FabulousCodingFox, ououn, luigiutmc │ //?? │ │ //?? │ [ SOURCE ] │ //?? │ https://github.com/Animated-Java/animated-java │ //?? │ │ //?? │ [ LICENSE ] │ //?? │ Animated Java - A tool for easily making animations in Minecraft: Java Edition! │ //?? │ Copyright (C) 2023 Titus Evans │ //?? │ │ //?? │ This program is free software: you can redistribute it and/or modify │ //?? │ it under the terms of the GNU Affero General Public License as published │ //?? │ by the Free Software Foundation, either version 3 of the License, or │ //?? │ (at your option) any later version. │ //?? │ │ //?? │ This program is distributed in the hope that it will be useful, │ //?? │ but WITHOUT ANY WARRANTY; without even the implied warranty of │ //?? │ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the │ //?? │ GNU Affero General Public License for more details. │ //?? │ │ //?? │ You should have received a copy of the GNU Affero General Public License │ //?? │ along with this program. If not, see . │ //?? │ │ //?? │ GNU AFFERO GENERAL PUBLIC LICENSE │ //?? │ Version 3, 19 November 2007 │ //?? │ │ //?? │ Copyright (C) 2007 Free Software Foundation, Inc. │ //?? │ Everyone is permitted to copy and distribute verbatim copies │ //?? │ of this license document, but changing it is not allowed. │ //?? │ │ //?? │ Preamble │ //?? │ │ //?? │ The GNU Affero General Public License is a free, copyleft license for │ //?? │ software and other kinds of works, specifically designed to ensure │ //?? │ cooperation with the community in the case of network server software. │ //?? │ │ //?? │ The licenses for most software and other practical works are designed │ //?? │ to take away your freedom to share and change the works. By contrast, │ //?? │ our General Public Licenses are intended to guarantee your freedom to │ //?? │ share and change all versions of a program--to make sure it remains free │ //?? │ software for all its users. │ //?? │ │ //?? │ When we speak of free software, we are referring to freedom, not │ //?? │ price. Our General Public Licenses are designed to make sure that you │ //?? │ have the freedom to distribute copies of free software (and charge for │ //?? │ them if you wish), that you receive source code or can get it if you │ //?? │ want it, that you can change the software or use pieces of it in new │ //?? │ free programs, and that you know you can do these things. │ //?? │ │ //?? │ Developers that use our General Public Licenses protect your rights │ //?? │ with two steps: (1) assert copyright on the software, and (2) offer │ //?? │ you this License which gives you legal permission to copy, distribute │ //?? │ and/or modify the software. │ //?? │ │ //?? │ A secondary benefit of defending all users' freedom is that │ //?? │ improvements made in alternate versions of the program, if they │ //?? │ receive widespread use, become available for other developers to │ //?? │ incorporate. Many developers of free software are heartened and │ //?? │ encouraged by the resulting cooperation. However, in the case of │ //?? │ software used on network servers, this result may fail to come about. │ //?? │ The GNU General Public License permits making a modified version and │ //?? │ letting the public access it on a server without ever releasing its │ //?? │ source code to the public. │ //?? │ │ //?? │ The GNU Affero General Public License is designed specifically to │ //?? │ ensure that, in such cases, the modified source code becomes available │ //?? │ to the community. It requires the operator of a network server to │ //?? │ provide the source code of the modified version running there to the │ //?? │ users of that server. Therefore, public use of a modified version, on │ //?? │ a publicly accessible server, gives the public access to the source │ //?? │ code of the modified version. │ //?? │ │ //?? │ An older license, called the Affero General Public License and │ //?? │ published by Affero, was designed to accomplish similar goals. This is │ //?? │ a different license, not a version of the Affero GPL, but Affero has │ //?? │ released a new version of the Affero GPL which permits relicensing under │ //?? │ this license. │ //?? │ │ //?? │ The precise terms and conditions for copying, distribution and │ //?? │ modification follow. │ //?? │ │ //?? │ TERMS AND CONDITIONS │ //?? │ │ //?? │ 0. Definitions. │ //?? │ │ //?? │ "This License" refers to version 3 of the GNU Affero General Public License. │ //?? │ │ //?? │ "Copyright" also means copyright-like laws that apply to other kinds of │ //?? │ works, such as semiconductor masks. │ //?? │ │ //?? │ "The Program" refers to any copyrightable work licensed under this │ //?? │ License. Each licensee is addressed as "you". "Licensees" and │ //?? │ "recipients" may be individuals or organizations. │ //?? │ │ //?? │ To "modify" a work means to copy from or adapt all or part of the work │ //?? │ in a fashion requiring copyright permission, other than the making of an │ //?? │ exact copy. The resulting work is called a "modified version" of the │ //?? │ earlier work or a work "based on" the earlier work. │ //?? │ │ //?? │ A "covered work" means either the unmodified Program or a work based │ //?? │ on the Program. │ //?? │ │ //?? │ To "propagate" a work means to do anything with it that, without │ //?? │ permission, would make you directly or secondarily liable for │ //?? │ infringement under applicable copyright law, except executing it on a │ //?? │ computer or modifying a private copy. Propagation includes copying, │ //?? │ distribution (with or without modification), making available to the │ //?? │ public, and in some countries other activities as well. │ //?? │ │ //?? │ To "convey" a work means any kind of propagation that enables other │ //?? │ parties to make or receive copies. Mere interaction with a user through │ //?? │ a computer network, with no transfer of a copy, is not conveying. │ //?? │ │ //?? │ An interactive user interface displays "Appropriate Legal Notices" │ //?? │ to the extent that it includes a convenient and prominently visible │ //?? │ feature that (1) displays an appropriate copyright notice, and (2) │ //?? │ tells the user that there is no warranty for the work (except to the │ //?? │ extent that warranties are provided), that licensees may convey the │ //?? │ work under this License, and how to view a copy of this License. If │ //?? │ the interface presents a list of user commands or options, such as a │ //?? │ menu, a prominent item in the list meets this criterion. │ //?? │ │ //?? │ 1. Source Code. │ //?? │ │ //?? │ The "source code" for a work means the preferred form of the work │ //?? │ for making modifications to it. "Object code" means any non-source │ //?? │ form of a work. │ //?? │ │ //?? │ A "Standard Interface" means an interface that either is an official │ //?? │ standard defined by a recognized standards body, or, in the case of │ //?? │ interfaces specified for a particular programming language, one that │ //?? │ is widely used among developers working in that language. │ //?? │ │ //?? │ The "System Libraries" of an executable work include anything, other │ //?? │ than the work as a whole, that (a) is included in the normal form of │ //?? │ packaging a Major Component, but which is not part of that Major │ //?? │ Component, and (b) serves only to enable use of the work with that │ //?? │ Major Component, or to implement a Standard Interface for which an │ //?? │ implementation is available to the public in source code form. A │ //?? │ "Major Component", in this context, means a major essential component │ //?? │ (kernel, window system, and so on) of the specific operating system │ //?? │ (if any) on which the executable work runs, or a compiler used to │ //?? │ produce the work, or an object code interpreter used to run it. │ //?? │ │ //?? │ The "Corresponding Source" for a work in object code form means all │ //?? │ the source code needed to generate, install, and (for an executable │ //?? │ work) run the object code and to modify the work, including scripts to │ //?? │ control those activities. However, it does not include the work's │ //?? │ System Libraries, or general-purpose tools or generally available free │ //?? │ programs which are used unmodified in performing those activities but │ //?? │ which are not part of the work. For example, Corresponding Source │ //?? │ includes interface definition files associated with source files for │ //?? │ the work, and the source code for shared libraries and dynamically │ //?? │ linked subprograms that the work is specifically designed to require, │ //?? │ such as by intimate data communication or control flow between those │ //?? │ subprograms and other parts of the work. │ //?? │ │ //?? │ The Corresponding Source need not include anything that users │ //?? │ can regenerate automatically from other parts of the Corresponding │ //?? │ Source. │ //?? │ │ //?? │ The Corresponding Source for a work in source code form is that │ //?? │ same work. │ //?? │ │ //?? │ 2. Basic Permissions. │ //?? │ │ //?? │ All rights granted under this License are granted for the term of │ //?? │ copyright on the Program, and are irrevocable provided the stated │ //?? │ conditions are met. This License explicitly affirms your unlimited │ //?? │ permission to run the unmodified Program. The output from running a │ //?? │ covered work is covered by this License only if the output, given its │ //?? │ content, constitutes a covered work. This License acknowledges your │ //?? │ rights of fair use or other equivalent, as provided by copyright law. │ //?? │ │ //?? │ You may make, run and propagate covered works that you do not │ //?? │ convey, without conditions so long as your license otherwise remains │ //?? │ in force. You may convey covered works to others for the sole purpose │ //?? │ of having them make modifications exclusively for you, or provide you │ //?? │ with facilities for running those works, provided that you comply with │ //?? │ the terms of this License in conveying all material for which you do │ //?? │ not control copyright. Those thus making or running the covered works │ //?? │ for you must do so exclusively on your behalf, under your direction │ //?? │ and control, on terms that prohibit them from making any copies of │ //?? │ your copyrighted material outside their relationship with you. │ //?? │ │ //?? │ Conveying under any other circumstances is permitted solely under │ //?? │ the conditions stated below. Sublicensing is not allowed; section 10 │ //?? │ makes it unnecessary. │ //?? │ │ //?? │ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. │ //?? │ │ //?? │ No covered work shall be deemed part of an effective technological │ //?? │ measure under any applicable law fulfilling obligations under article │ //?? │ 11 of the WIPO copyright treaty adopted on 20 December 1996, or │ //?? │ similar laws prohibiting or restricting circumvention of such │ //?? │ measures. │ //?? │ │ //?? │ When you convey a covered work, you waive any legal power to forbid │ //?? │ circumvention of technological measures to the extent such circumvention │ //?? │ is effected by exercising rights under this License with respect to │ //?? │ the covered work, and you disclaim any intention to limit operation or │ //?? │ modification of the work as a means of enforcing, against the work's │ //?? │ users, your or third parties' legal rights to forbid circumvention of │ //?? │ technological measures. │ //?? │ │ //?? │ 4. Conveying Verbatim Copies. │ //?? │ │ //?? │ You may convey verbatim copies of the Program's source code as you │ //?? │ receive it, in any medium, provided that you conspicuously and │ //?? │ appropriately publish on each copy an appropriate copyright notice; │ //?? │ keep intact all notices stating that this License and any │ //?? │ non-permissive terms added in accord with section 7 apply to the code; │ //?? │ keep intact all notices of the absence of any warranty; and give all │ //?? │ recipients a copy of this License along with the Program. │ //?? │ │ //?? │ You may charge any price or no price for each copy that you convey, │ //?? │ and you may offer support or warranty protection for a fee. │ //?? │ │ //?? │ 5. Conveying Modified Source Versions. │ //?? │ │ //?? │ You may convey a work based on the Program, or the modifications to │ //?? │ produce it from the Program, in the form of source code under the │ //?? │ terms of section 4, provided that you also meet all of these conditions: │ //?? │ │ //?? │ a) The work must carry prominent notices stating that you modified │ //?? │ it, and giving a relevant date. │ //?? │ │ //?? │ b) The work must carry prominent notices stating that it is │ //?? │ released under this License and any conditions added under section │ //?? │ 7. This requirement modifies the requirement in section 4 to │ //?? │ "keep intact all notices". │ //?? │ │ //?? │ c) You must license the entire work, as a whole, under this │ //?? │ License to anyone who comes into possession of a copy. This │ //?? │ License will therefore apply, along with any applicable section 7 │ //?? │ additional terms, to the whole of the work, and all its parts, │ //?? │ regardless of how they are packaged. This License gives no │ //?? │ permission to license the work in any other way, but it does not │ //?? │ invalidate such permission if you have separately received it. │ //?? │ │ //?? │ d) If the work has interactive user interfaces, each must display │ //?? │ Appropriate Legal Notices; however, if the Program has interactive │ //?? │ interfaces that do not display Appropriate Legal Notices, your │ //?? │ work need not make them do so. │ //?? │ │ //?? │ A compilation of a covered work with other separate and independent │ //?? │ works, which are not by their nature extensions of the covered work, │ //?? │ and which are not combined with it such as to form a larger program, │ //?? │ in or on a volume of a storage or distribution medium, is called an │ //?? │ "aggregate" if the compilation and its resulting copyright are not │ //?? │ used to limit the access or legal rights of the compilation's users │ //?? │ beyond what the individual works permit. Inclusion of a covered work │ //?? │ in an aggregate does not cause this License to apply to the other │ //?? │ parts of the aggregate. │ //?? │ │ //?? │ 6. Conveying Non-Source Forms. │ //?? │ │ //?? │ You may convey a covered work in object code form under the terms │ //?? │ of sections 4 and 5, provided that you also convey the │ //?? │ machine-readable Corresponding Source under the terms of this License, │ //?? │ in one of these ways: │ //?? │ │ //?? │ a) Convey the object code in, or embodied in, a physical product │ //?? │ (including a physical distribution medium), accompanied by the │ //?? │ Corresponding Source fixed on a durable physical medium │ //?? │ customarily used for software interchange. │ //?? │ │ //?? │ b) Convey the object code in, or embodied in, a physical product │ //?? │ (including a physical distribution medium), accompanied by a │ //?? │ written offer, valid for at least three years and valid for as │ //?? │ long as you offer spare parts or customer support for that product │ //?? │ model, to give anyone who possesses the object code either (1) a │ //?? │ copy of the Corresponding Source for all the software in the │ //?? │ product that is covered by this License, on a durable physical │ //?? │ medium customarily used for software interchange, for a price no │ //?? │ more than your reasonable cost of physically performing this │ //?? │ conveying of source, or (2) access to copy the │ //?? │ Corresponding Source from a network server at no charge. │ //?? │ │ //?? │ c) Convey individual copies of the object code with a copy of the │ //?? │ written offer to provide the Corresponding Source. This │ //?? │ alternative is allowed only occasionally and noncommercially, and │ //?? │ only if you received the object code with such an offer, in accord │ //?? │ with subsection 6b. │ //?? │ │ //?? │ d) Convey the object code by offering access from a designated │ //?? │ place (gratis or for a charge), and offer equivalent access to the │ //?? │ Corresponding Source in the same way through the same place at no │ //?? │ further charge. You need not require recipients to copy the │ //?? │ Corresponding Source along with the object code. If the place to │ //?? │ copy the object code is a network server, the Corresponding Source │ //?? │ may be on a different server (operated by you or a third party) │ //?? │ that supports equivalent copying facilities, provided you maintain │ //?? │ clear directions next to the object code saying where to find the │ //?? │ Corresponding Source. Regardless of what server hosts the │ //?? │ Corresponding Source, you remain obligated to ensure that it is │ //?? │ available for as long as needed to satisfy these requirements. │ //?? │ │ //?? │ e) Convey the object code using peer-to-peer transmission, provided │ //?? │ you inform other peers where the object code and Corresponding │ //?? │ Source of the work are being offered to the general public at no │ //?? │ charge under subsection 6d. │ //?? │ │ //?? │ A separable portion of the object code, whose source code is excluded │ //?? │ from the Corresponding Source as a System Library, need not be │ //?? │ included in conveying the object code work. │ //?? │ │ //?? │ A "User Product" is either (1) a "consumer product", which means any │ //?? │ tangible personal property which is normally used for personal, family, │ //?? │ or household purposes, or (2) anything designed or sold for incorporation │ //?? │ into a dwelling. In determining whether a product is a consumer product, │ //?? │ doubtful cases shall be resolved in favor of coverage. For a particular │ //?? │ product received by a particular user, "normally used" refers to a │ //?? │ typical or common use of that class of product, regardless of the status │ //?? │ of the particular user or of the way in which the particular user │ //?? │ actually uses, or expects or is expected to use, the product. A product │ //?? │ is a consumer product regardless of whether the product has substantial │ //?? │ commercial, industrial or non-consumer uses, unless such uses represent │ //?? │ the only significant mode of use of the product. │ //?? │ │ //?? │ "Installation Information" for a User Product means any methods, │ //?? │ procedures, authorization keys, or other information required to install │ //?? │ and execute modified versions of a covered work in that User Product from │ //?? │ a modified version of its Corresponding Source. The information must │ //?? │ suffice to ensure that the continued functioning of the modified object │ //?? │ code is in no case prevented or interfered with solely because │ //?? │ modification has been made. │ //?? │ │ //?? │ If you convey an object code work under this section in, or with, or │ //?? │ specifically for use in, a User Product, and the conveying occurs as │ //?? │ part of a transaction in which the right of possession and use of the │ //?? │ User Product is transferred to the recipient in perpetuity or for a │ //?? │ fixed term (regardless of how the transaction is characterized), the │ //?? │ Corresponding Source conveyed under this section must be accompanied │ //?? │ by the Installation Information. But this requirement does not apply │ //?? │ if neither you nor any third party retains the ability to install │ //?? │ modified object code on the User Product (for example, the work has │ //?? │ been installed in ROM). │ //?? │ │ //?? │ The requirement to provide Installation Information does not include a │ //?? │ requirement to continue to provide support service, warranty, or updates │ //?? │ for a work that has been modified or installed by the recipient, or for │ //?? │ the User Product in which it has been modified or installed. Access to a │ //?? │ network may be denied when the modification itself materially and │ //?? │ adversely affects the operation of the network or violates the rules and │ //?? │ protocols for communication across the network. │ //?? │ │ //?? │ Corresponding Source conveyed, and Installation Information provided, │ //?? │ in accord with this section must be in a format that is publicly │ //?? │ documented (and with an implementation available to the public in │ //?? │ source code form), and must require no special password or key for │ //?? │ unpacking, reading or copying. │ //?? │ │ //?? │ 7. Additional Terms. │ //?? │ │ //?? │ "Additional permissions" are terms that supplement the terms of this │ //?? │ License by making exceptions from one or more of its conditions. │ //?? │ Additional permissions that are applicable to the entire Program shall │ //?? │ be treated as though they were included in this License, to the extent │ //?? │ that they are valid under applicable law. If additional permissions │ //?? │ apply only to part of the Program, that part may be used separately │ //?? │ under those permissions, but the entire Program remains governed by │ //?? │ this License without regard to the additional permissions. │ //?? │ │ //?? │ When you convey a copy of a covered work, you may at your option │ //?? │ remove any additional permissions from that copy, or from any part of │ //?? │ it. (Additional permissions may be written to require their own │ //?? │ removal in certain cases when you modify the work.) You may place │ //?? │ additional permissions on material, added by you to a covered work, │ //?? │ for which you have or can give appropriate copyright permission. │ //?? │ │ //?? │ Notwithstanding any other provision of this License, for material you │ //?? │ add to a covered work, you may (if authorized by the copyright holders of │ //?? │ that material) supplement the terms of this License with terms: │ //?? │ │ //?? │ a) Disclaiming warranty or limiting liability differently from the │ //?? │ terms of sections 15 and 16 of this License; or │ //?? │ │ //?? │ b) Requiring preservation of specified reasonable legal notices or │ //?? │ author attributions in that material or in the Appropriate Legal │ //?? │ Notices displayed by works containing it; or │ //?? │ │ //?? │ c) Prohibiting misrepresentation of the origin of that material, or │ //?? │ requiring that modified versions of such material be marked in │ //?? │ reasonable ways as different from the original version; or │ //?? │ │ //?? │ d) Limiting the use for publicity purposes of names of licensors or │ //?? │ authors of the material; or │ //?? │ │ //?? │ e) Declining to grant rights under trademark law for use of some │ //?? │ trade names, trademarks, or service marks; or │ //?? │ │ //?? │ f) Requiring indemnification of licensors and authors of that │ //?? │ material by anyone who conveys the material (or modified versions of │ //?? │ it) with contractual assumptions of liability to the recipient, for │ //?? │ any liability that these contractual assumptions directly impose on │ //?? │ those licensors and authors. │ //?? │ │ //?? │ All other non-permissive additional terms are considered "further │ //?? │ restrictions" within the meaning of section 10. If the Program as you │ //?? │ received it, or any part of it, contains a notice stating that it is │ //?? │ governed by this License along with a term that is a further │ //?? │ restriction, you may remove that term. If a license document contains │ //?? │ a further restriction but permits relicensing or conveying under this │ //?? │ License, you may add to a covered work material governed by the terms │ //?? │ of that license document, provided that the further restriction does │ //?? │ not survive such relicensing or conveying. │ //?? │ │ //?? │ If you add terms to a covered work in accord with this section, you │ //?? │ must place, in the relevant source files, a statement of the │ //?? │ additional terms that apply to those files, or a notice indicating │ //?? │ where to find the applicable terms. │ //?? │ │ //?? │ Additional terms, permissive or non-permissive, may be stated in the │ //?? │ form of a separately written license, or stated as exceptions; │ //?? │ the above requirements apply either way. │ //?? │ │ //?? │ 8. Termination. │ //?? │ │ //?? │ You may not propagate or modify a covered work except as expressly │ //?? │ provided under this License. Any attempt otherwise to propagate or │ //?? │ modify it is void, and will automatically terminate your rights under │ //?? │ this License (including any patent licenses granted under the third │ //?? │ paragraph of section 11). │ //?? │ │ //?? │ However, if you cease all violation of this License, then your │ //?? │ license from a particular copyright holder is reinstated (a) │ //?? │ provisionally, unless and until the copyright holder explicitly and │ //?? │ finally terminates your license, and (b) permanently, if the copyright │ //?? │ holder fails to notify you of the violation by some reasonable means │ //?? │ prior to 60 days after the cessation. │ //?? │ │ //?? │ Moreover, your license from a particular copyright holder is │ //?? │ reinstated permanently if the copyright holder notifies you of the │ //?? │ violation by some reasonable means, this is the first time you have │ //?? │ received notice of violation of this License (for any work) from that │ //?? │ copyright holder, and you cure the violation prior to 30 days after │ //?? │ your receipt of the notice. │ //?? │ │ //?? │ Termination of your rights under this section does not terminate the │ //?? │ licenses of parties who have received copies or rights from you under │ //?? │ this License. If your rights have been terminated and not permanently │ //?? │ reinstated, you do not qualify to receive new licenses for the same │ //?? │ material under section 10. │ //?? │ │ //?? │ 9. Acceptance Not Required for Having Copies. │ //?? │ │ //?? │ You are not required to accept this License in order to receive or │ //?? │ run a copy of the Program. Ancillary propagation of a covered work │ //?? │ occurring solely as a consequence of using peer-to-peer transmission │ //?? │ to receive a copy likewise does not require acceptance. However, │ //?? │ nothing other than this License grants you permission to propagate or │ //?? │ modify any covered work. These actions infringe copyright if you do │ //?? │ not accept this License. Therefore, by modifying or propagating a │ //?? │ covered work, you indicate your acceptance of this License to do so. │ //?? │ │ //?? │ 10. Automatic Licensing of Downstream Recipients. │ //?? │ │ //?? │ Each time you convey a covered work, the recipient automatically │ //?? │ receives a license from the original licensors, to run, modify and │ //?? │ propagate that work, subject to this License. You are not responsible │ //?? │ for enforcing compliance by third parties with this License. │ //?? │ │ //?? │ An "entity transaction" is a transaction transferring control of an │ //?? │ organization, or substantially all assets of one, or subdividing an │ //?? │ organization, or merging organizations. If propagation of a covered │ //?? │ work results from an entity transaction, each party to that │ //?? │ transaction who receives a copy of the work also receives whatever │ //?? │ licenses to the work the party's predecessor in interest had or could │ //?? │ give under the previous paragraph, plus a right to possession of the │ //?? │ Corresponding Source of the work from the predecessor in interest, if │ //?? │ the predecessor has it or can get it with reasonable efforts. │ //?? │ │ //?? │ You may not impose any further restrictions on the exercise of the │ //?? │ rights granted or affirmed under this License. For example, you may │ //?? │ not impose a license fee, royalty, or other charge for exercise of │ //?? │ rights granted under this License, and you may not initiate litigation │ //?? │ (including a cross-claim or counterclaim in a lawsuit) alleging that │ //?? │ any patent claim is infringed by making, using, selling, offering for │ //?? │ sale, or importing the Program or any portion of it. │ //?? │ │ //?? │ 11. Patents. │ //?? │ │ //?? │ A "contributor" is a copyright holder who authorizes use under this │ //?? │ License of the Program or a work on which the Program is based. The │ //?? │ work thus licensed is called the contributor's "contributor version". │ //?? │ │ //?? │ A contributor's "essential patent claims" are all patent claims │ //?? │ owned or controlled by the contributor, whether already acquired or │ //?? │ hereafter acquired, that would be infringed by some manner, permitted │ //?? │ by this License, of making, using, or selling its contributor version, │ //?? │ but do not include claims that would be infringed only as a │ //?? │ consequence of further modification of the contributor version. For │ //?? │ purposes of this definition, "control" includes the right to grant │ //?? │ patent sublicenses in a manner consistent with the requirements of │ //?? │ this License. │ //?? │ │ //?? │ Each contributor grants you a non-exclusive, worldwide, royalty-free │ //?? │ patent license under the contributor's essential patent claims, to │ //?? │ make, use, sell, offer for sale, import and otherwise run, modify and │ //?? │ propagate the contents of its contributor version. │ //?? │ │ //?? │ In the following three paragraphs, a "patent license" is any express │ //?? │ agreement or commitment, however denominated, not to enforce a patent │ //?? │ (such as an express permission to practice a patent or covenant not to │ //?? │ sue for patent infringement). To "grant" such a patent license to a │ //?? │ party means to make such an agreement or commitment not to enforce a │ //?? │ patent against the party. │ //?? │ │ //?? │ If you convey a covered work, knowingly relying on a patent license, │ //?? │ and the Corresponding Source of the work is not available for anyone │ //?? │ to copy, free of charge and under the terms of this License, through a │ //?? │ publicly available network server or other readily accessible means, │ //?? │ then you must either (1) cause the Corresponding Source to be so │ //?? │ available, or (2) arrange to deprive yourself of the benefit of the │ //?? │ patent license for this particular work, or (3) arrange, in a manner │ //?? │ consistent with the requirements of this License, to extend the patent │ //?? │ license to downstream recipients. "Knowingly relying" means you have │ //?? │ actual knowledge that, but for the patent license, your conveying the │ //?? │ covered work in a country, or your recipient's use of the covered work │ //?? │ in a country, would infringe one or more identifiable patents in that │ //?? │ country that you have reason to believe are valid. │ //?? │ │ //?? │ If, pursuant to or in connection with a single transaction or │ //?? │ arrangement, you convey, or propagate by procuring conveyance of, a │ //?? │ covered work, and grant a patent license to some of the parties │ //?? │ receiving the covered work authorizing them to use, propagate, modify │ //?? │ or convey a specific copy of the covered work, then the patent license │ //?? │ you grant is automatically extended to all recipients of the covered │ //?? │ work and works based on it. │ //?? │ │ //?? │ A patent license is "discriminatory" if it does not include within │ //?? │ the scope of its coverage, prohibits the exercise of, or is │ //?? │ conditioned on the non-exercise of one or more of the rights that are │ //?? │ specifically granted under this License. You may not convey a covered │ //?? │ work if you are a party to an arrangement with a third party that is │ //?? │ in the business of distributing software, under which you make payment │ //?? │ to the third party based on the extent of your activity of conveying │ //?? │ the work, and under which the third party grants, to any of the │ //?? │ parties who would receive the covered work from you, a discriminatory │ //?? │ patent license (a) in connection with copies of the covered work │ //?? │ conveyed by you (or copies made from those copies), or (b) primarily │ //?? │ for and in connection with specific products or compilations that │ //?? │ contain the covered work, unless you entered into that arrangement, │ //?? │ or that patent license was granted, prior to 28 March 2007. │ //?? │ │ //?? │ Nothing in this License shall be construed as excluding or limiting │ //?? │ any implied license or other defenses to infringement that may │ //?? │ otherwise be available to you under applicable patent law. │ //?? │ │ //?? │ 12. No Surrender of Others' Freedom. │ //?? │ │ //?? │ If conditions are imposed on you (whether by court order, agreement or │ //?? │ otherwise) that contradict the conditions of this License, they do not │ //?? │ excuse you from the conditions of this License. If you cannot convey a │ //?? │ covered work so as to satisfy simultaneously your obligations under this │ //?? │ License and any other pertinent obligations, then as a consequence you may │ //?? │ not convey it at all. For example, if you agree to terms that obligate you │ //?? │ to collect a royalty for further conveying from those to whom you convey │ //?? │ the Program, the only way you could satisfy both those terms and this │ //?? │ License would be to refrain entirely from conveying the Program. │ //?? │ │ //?? │ 13. Remote Network Interaction; Use with the GNU General Public License. │ //?? │ │ //?? │ Notwithstanding any other provision of this License, if you modify the │ //?? │ Program, your modified version must prominently offer all users │ //?? │ interacting with it remotely through a computer network (if your version │ //?? │ supports such interaction) an opportunity to receive the Corresponding │ //?? │ Source of your version by providing access to the Corresponding Source │ //?? │ from a network server at no charge, through some standard or customary │ //?? │ means of facilitating copying of software. This Corresponding Source │ //?? │ shall include the Corresponding Source for any work covered by version 3 │ //?? │ of the GNU General Public License that is incorporated pursuant to the │ //?? │ following paragraph. │ //?? │ │ //?? │ Notwithstanding any other provision of this License, you have │ //?? │ permission to link or combine any covered work with a work licensed │ //?? │ under version 3 of the GNU General Public License into a single │ //?? │ combined work, and to convey the resulting work. The terms of this │ //?? │ License will continue to apply to the part which is the covered work, │ //?? │ but the work with which it is combined will remain governed by version │ //?? │ 3 of the GNU General Public License. │ //?? │ │ //?? │ 14. Revised Versions of this License. │ //?? │ │ //?? │ The Free Software Foundation may publish revised and/or new versions of │ //?? │ the GNU Affero General Public License from time to time. Such new versions │ //?? │ will be similar in spirit to the present version, but may differ in detail to │ //?? │ address new problems or concerns. │ //?? │ │ //?? │ Each version is given a distinguishing version number. If the │ //?? │ Program specifies that a certain numbered version of the GNU Affero General │ //?? │ Public License "or any later version" applies to it, you have the │ //?? │ option of following the terms and conditions either of that numbered │ //?? │ version or of any later version published by the Free Software │ //?? │ Foundation. If the Program does not specify a version number of the │ //?? │ GNU Affero General Public License, you may choose any version ever published │ //?? │ by the Free Software Foundation. │ //?? │ │ //?? │ If the Program specifies that a proxy can decide which future │ //?? │ versions of the GNU Affero General Public License can be used, that proxy's │ //?? │ public statement of acceptance of a version permanently authorizes you │ //?? │ to choose that version for the Program. │ //?? │ │ //?? │ Later license versions may give you additional or different │ //?? │ permissions. However, no additional obligations are imposed on any │ //?? │ author or copyright holder as a result of your choosing to follow a │ //?? │ later version. │ //?? │ │ //?? │ 15. Disclaimer of Warranty. │ //?? │ │ //?? │ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY │ //?? │ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT │ //?? │ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY │ //?? │ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, │ //?? │ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR │ //?? │ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM │ //?? │ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF │ //?? │ ALL NECESSARY SERVICING, REPAIR OR CORRECTION. │ //?? │ │ //?? │ 16. Limitation of Liability. │ //?? │ │ //?? │ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING │ //?? │ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS │ //?? │ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY │ //?? │ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE │ //?? │ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF │ //?? │ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD │ //?? │ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), │ //?? │ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF │ //?? │ SUCH DAMAGES. │ //?? │ │ //?? │ 17. Interpretation of Sections 15 and 16. │ //?? │ │ //?? │ If the disclaimer of warranty and limitation of liability provided │ //?? │ above cannot be given local legal effect according to their terms, │ //?? │ reviewing courts shall apply local law that most closely approximates │ //?? │ an absolute waiver of all civil liability in connection with the │ //?? │ Program, unless a warranty or assumption of liability accompanies a │ //?? │ copy of the Program in return for a fee. │ //?? │ │ //?? │ END OF TERMS AND CONDITIONS │ //?? │ │ //?? │ How to Apply These Terms to Your New Programs │ //?? │ │ //?? │ If you develop a new program, and you want it to be of the greatest │ //?? │ possible use to the public, the best way to achieve this is to make it │ //?? │ free software which everyone can redistribute and change under these terms. │ //?? │ │ //?? │ To do so, attach the following notices to the program. It is safest │ //?? │ to attach them to the start of each source file to most effectively │ //?? │ state the exclusion of warranty; and each file should have at least │ //?? │ the "copyright" line and a pointer to where the full notice is found. │ //?? │ │ //?? │ │ //?? │ Copyright (C) │ //?? │ │ //?? │ This program is free software: you can redistribute it and/or modify │ //?? │ it under the terms of the GNU Affero General Public License as published │ //?? │ by the Free Software Foundation, either version 3 of the License, or │ //?? │ (at your option) any later version. │ //?? │ │ //?? │ This program is distributed in the hope that it will be useful, │ //?? │ but WITHOUT ANY WARRANTY; without even the implied warranty of │ //?? │ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the │ //?? │ GNU Affero General Public License for more details. │ //?? │ │ //?? │ You should have received a copy of the GNU Affero General Public License │ //?? │ along with this program. If not, see . │ //?? │ │ //?? │ Also add information on how to contact you by electronic and paper mail. │ //?? │ │ //?? │ If your software can interact with users remotely through a computer │ //?? │ network, you should also make sure that it provides a way for users to │ //?? │ get its source. For example, if your program is a web application, its │ //?? │ interface could display a "Source" link that leads users to an archive │ //?? │ of the code. There are many ways you could offer source, and different │ //?? │ solutions will be better for different programs; see section 13 for the │ //?? │ specific requirements. │ //?? │ │ //?? │ You should also get your employer (if you work as a programmer) or school, │ //?? │ if any, to sign a "copyright disclaimer" for the program, if necessary. │ //?? │ For more information on this, and how to apply and follow the GNU AGPL, see │ //?? │ . │ //?? │ │ //?? ╰─────────────────────────────────────────────────────────────────────────────────╯ (() => { if (!compareVersions('5.0.0', Blockbench.version)) { const message = ` # Animated Java does not work in Blockbench 5 You will need to install and use Blockbench v4.12.6 to use Animated Java until it is updated to support 5. ## How to install Blockbench v4.12.6 1. Download the portable version of Blockbench 4.12.6 [here](https://github.com/JannisX11/blockbench/releases/download/v4.12.6/Blockbench_4.12.6_portable.exe). 2. Once it's finished downloading, double click the .exe file to run it. If you're familiar with command line interfaces, you can use [Envbench](https://www.npmjs.com/package/envbench) to install and manage multiple Blockbench versions side by side. `; Blockbench.showMessageBox({title: 'Animated Java - Incompatible Blockbench Version',message,width:600}); requestAnimationFrame(() => Plugins.registered['animated_java'].uninstall()); throw new Error(message); } })() "use strict";(()=>{var xI=Object.create;var ys=Object.defineProperty;var jy=Object.getOwnPropertyDescriptor;var vI=Object.getOwnPropertyNames;var bI=Object.getPrototypeOf,yI=Object.prototype.hasOwnProperty;var wI=(t,e,n)=>e in t?ys(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var s=(t,e)=>ys(t,"name",{value:e,configurable:!0}),Ee=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var EI=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),vn=(t,e)=>{for(var n in e)ys(t,n,{get:e[n],enumerable:!0})},Ay=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of vI(e))!yI.call(t,a)&&a!==n&&ys(t,a,{get:()=>e[a],enumerable:!(i=jy(e,a))||i.enumerable});return t};var wi=(t,e,n)=>(n=t!=null?xI(bI(t)):{},Ay(e||!t||!t.__esModule?ys(n,"default",{value:t,enumerable:!0}):n,t)),nu=t=>Ay(ys({},"__esModule",{value:!0}),t),Do=(t,e,n,i)=>{for(var a=i>1?void 0:i?jy(e,n):e,r=t.length-1,o;r>=0;r--)(o=t[r])&&(a=(i?o(e,n,a):o(a))||a);return i&&a&&ys(e,n,a),a};var lt=(t,e,n)=>(wI(t,typeof e!="symbol"?e+"":e,n),n);var kI=t=>new Uint8Array(Buffer.from(t,"base64"));var Dl={};vn(Dl,{Buffer:()=>ks});var ks,No=EI(()=>{ks=globalThis.Buffer});var Cp=oe((zg,c1)=>{var Tp=(No(),nu(Dl)),hr=Tp.Buffer;function l1(t,e){for(var n in t)e[n]=t[n]}s(l1,"copyProps");hr.from&&hr.alloc&&hr.allocUnsafe&&hr.allocUnsafeSlow?c1.exports=Tp:(l1(Tp,zg),zg.Buffer=js);function js(t,e,n){return hr(t,e,n)}s(js,"SafeBuffer");js.prototype=Object.create(hr.prototype);l1(hr,js);js.from=function(t,e,n){if(typeof t=="number")throw new TypeError("Argument must not be a number");return hr(t,e,n)};js.alloc=function(t,e,n){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=hr(t);return e!==void 0?typeof n=="string"?i.fill(e,n):i.fill(e):i.fill(0),i};js.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return hr(t)};js.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return Tp.SlowBuffer(t)}});var h1=oe((Y2e,Ug)=>{"use strict";Ug.exports=Ile;Ug.exports.parse=Rle;var u1=Ee("path").basename,yle=Cp().Buffer,wle=/[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g,Ele=/%[0-9A-Fa-f]{2}/,kle=/%([0-9A-Fa-f]{2})/g,p1=/[^\x20-\x7e\xa0-\xff]/g,jle=/\\([\u0000-\u007f])/g,Ale=/([\\"])/g,d1=/;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g,Tle=/^[\x20-\x7e\x80-\xff]+$/,Cle=/^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/,Sle=/^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/,Ole=/^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/;function Ile(t,e){var n=e||{},i=n.type||"attachment",a=Dle(t,n.fallback);return Fle(new f1(i,a))}s(Ile,"contentDisposition");function Dle(t,e){if(t!==void 0){var n={};if(typeof t!="string")throw new TypeError("filename must be a string");if(e===void 0&&(e=!0),typeof e!="string"&&typeof e!="boolean")throw new TypeError("fallback must be a string or boolean");if(typeof e=="string"&&p1.test(e))throw new TypeError("fallback must be ISO-8859-1 string");var i=u1(t),a=Tle.test(i),r=typeof e!="string"?e&&m1(i):u1(e),o=typeof r=="string"&&r!==i;return(o||!a||Ele.test(i))&&(n["filename*"]=i),(a||o)&&(n.filename=o?r:i),n}}s(Dle,"createparams");function Fle(t){var e=t.parameters,n=t.type;if(!n||typeof n!="string"||!Cle.test(n))throw new TypeError("invalid type");var i=String(n).toLowerCase();if(e&&typeof e=="object")for(var a,r=Object.keys(e).sort(),o=0;o{"use strict";g1.exports=t=>{let e=new Uint8Array(t);if(!(e&&e.length>1))return null;let n=s((i,a)=>{a=Object.assign({offset:0},a);for(let r=0;rl[o]===66&&l[o+1]===130);if(a>=0){let r=a+3,o=s(l=>Array.from(l).every((c,d)=>i[r+d]===c.charCodeAt(0)),"findDocType");if(o("matroska"))return{ext:"mkv",mime:"video/x-matroska"};if(o("webm"))return{ext:"webm",mime:"video/webm"}}}return n([0,0,0,20,102,116,121,112,113,116,32,32])||n([102,114,101,101],{offset:4})||n([102,116,121,112,113,116,32,32],{offset:4})||n([109,100,97,116],{offset:4})||n([119,105,100,101],{offset:4})?{ext:"mov",mime:"video/quicktime"}:n([82,73,70,70])&&n([65,86,73],{offset:8})?{ext:"avi",mime:"video/x-msvideo"}:n([48,38,178,117,142,102,207,17,166,217])?{ext:"wmv",mime:"video/x-ms-wmv"}:n([0,0,1,186])?{ext:"mpg",mime:"video/mpeg"}:n([73,68,51])||n([255,251])?{ext:"mp3",mime:"audio/mpeg"}:n([102,116,121,112,77,52,65],{offset:4})||n([77,52,65,32])?{ext:"m4a",mime:"audio/m4a"}:n([79,112,117,115,72,101,97,100],{offset:28})?{ext:"opus",mime:"audio/opus"}:n([79,103,103,83])?{ext:"ogg",mime:"audio/ogg"}:n([102,76,97,67])?{ext:"flac",mime:"audio/x-flac"}:n([82,73,70,70])&&n([87,65,86,69],{offset:8})?{ext:"wav",mime:"audio/x-wav"}:n([35,33,65,77,82,10])?{ext:"amr",mime:"audio/amr"}:n([37,80,68,70])?{ext:"pdf",mime:"application/pdf"}:n([77,90])?{ext:"exe",mime:"application/x-msdownload"}:(e[0]===67||e[0]===70)&&n([87,83],{offset:1})?{ext:"swf",mime:"application/x-shockwave-flash"}:n([123,92,114,116,102])?{ext:"rtf",mime:"application/rtf"}:n([0,97,115,109])?{ext:"wasm",mime:"application/wasm"}:n([119,79,70,70])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:"woff",mime:"application/font-woff"}:n([119,79,70,50])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:"woff2",mime:"application/font-woff"}:n([76,80],{offset:34})&&(n([0,0,1],{offset:8})||n([1,0,2],{offset:8})||n([2,0,2],{offset:8}))?{ext:"eot",mime:"application/octet-stream"}:n([0,1,0,0,0])?{ext:"ttf",mime:"application/font-sfnt"}:n([79,84,84,79,0])?{ext:"otf",mime:"application/font-sfnt"}:n([0,0,1,0])?{ext:"ico",mime:"image/x-icon"}:n([70,76,86,1])?{ext:"flv",mime:"video/x-flv"}:n([37,33])?{ext:"ps",mime:"application/postscript"}:n([253,55,122,88,90,0])?{ext:"xz",mime:"application/x-xz"}:n([83,81,76,105])?{ext:"sqlite",mime:"application/x-sqlite3"}:n([78,69,83,26])?{ext:"nes",mime:"application/x-nintendo-nes-rom"}:n([67,114,50,52])?{ext:"crx",mime:"application/x-google-chrome-extension"}:n([77,83,67,70])||n([73,83,99,40])?{ext:"cab",mime:"application/vnd.ms-cab-compressed"}:n([33,60,97,114,99,104,62,10,100,101,98,105,97,110,45,98,105,110,97,114,121])?{ext:"deb",mime:"application/x-deb"}:n([33,60,97,114,99,104,62])?{ext:"ar",mime:"application/x-unix-archive"}:n([237,171,238,219])?{ext:"rpm",mime:"application/x-rpm"}:n([31,160])||n([31,157])?{ext:"Z",mime:"application/x-compress"}:n([76,90,73,80])?{ext:"lz",mime:"application/x-lzip"}:n([208,207,17,224,161,177,26,225])?{ext:"msi",mime:"application/x-msi"}:n([6,14,43,52,2,5,1,1,13,1,2,1,1,2])?{ext:"mxf",mime:"application/mxf"}:n([66,76,69,78,68,69,82])?{ext:"blend",mime:"application/x-blender"}:null}});var v1=oe(($2e,x1)=>{"use strict";var Vle=_1(),zle=new Set(["7z","bz2","gz","rar","tar","zip","xz","gz"]);x1.exports=t=>{let e=Vle(t);return zle.has(e&&e.ext)?e:null}});var y1=oe((eEe,b1)=>{var Ro=Ee("constants"),Ule=process.cwd,Sp=null,qle=process.env.GRACEFUL_FS_PLATFORM||process.platform;process.cwd=function(){return Sp||(Sp=Ule.call(process)),Sp};try{process.cwd()}catch{}typeof process.chdir=="function"&&(qg=process.chdir,process.chdir=function(t){Sp=null,qg.call(process,t)},Object.setPrototypeOf&&Object.setPrototypeOf(process.chdir,qg));var qg;b1.exports=Hle;function Hle(t){Ro.hasOwnProperty("O_SYMLINK")&&process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)&&e(t),t.lutimes||n(t),t.chown=r(t.chown),t.fchown=r(t.fchown),t.lchown=r(t.lchown),t.chmod=i(t.chmod),t.fchmod=i(t.fchmod),t.lchmod=i(t.lchmod),t.chownSync=o(t.chownSync),t.fchownSync=o(t.fchownSync),t.lchownSync=o(t.lchownSync),t.chmodSync=a(t.chmodSync),t.fchmodSync=a(t.fchmodSync),t.lchmodSync=a(t.lchmodSync),t.stat=l(t.stat),t.fstat=l(t.fstat),t.lstat=l(t.lstat),t.statSync=c(t.statSync),t.fstatSync=c(t.fstatSync),t.lstatSync=c(t.lstatSync),t.chmod&&!t.lchmod&&(t.lchmod=function(u,p,m){m&&process.nextTick(m)},t.lchmodSync=function(){}),t.chown&&!t.lchown&&(t.lchown=function(u,p,m,f){f&&process.nextTick(f)},t.lchownSync=function(){}),qle==="win32"&&(t.rename=typeof t.rename!="function"?t.rename:function(u){function p(m,f,g){var x=Date.now(),_=0;u(m,f,s(function h(v){if(v&&(v.code==="EACCES"||v.code==="EPERM"||v.code==="EBUSY")&&Date.now()-x<6e4){setTimeout(function(){t.stat(f,function(b,y){b&&b.code==="ENOENT"?u(m,f,h):g(v)})},_),_<100&&(_+=10);return}g&&g(v)},"CB"))}return s(p,"rename"),Object.setPrototypeOf&&Object.setPrototypeOf(p,u),p}(t.rename)),t.read=typeof t.read!="function"?t.read:function(u){function p(m,f,g,x,_,h){var v;if(h&&typeof h=="function"){var b=0;v=s(function(y,w,S){if(y&&y.code==="EAGAIN"&&b<10)return b++,u.call(t,m,f,g,x,_,v);h.apply(this,arguments)},"callback")}return u.call(t,m,f,g,x,_,v)}return s(p,"read"),Object.setPrototypeOf&&Object.setPrototypeOf(p,u),p}(t.read),t.readSync=typeof t.readSync!="function"?t.readSync:function(u){return function(p,m,f,g,x){for(var _=0;;)try{return u.call(t,p,m,f,g,x)}catch(h){if(h.code==="EAGAIN"&&_<10){_++;continue}throw h}}}(t.readSync);function e(u){u.lchmod=function(p,m,f){u.open(p,Ro.O_WRONLY|Ro.O_SYMLINK,m,function(g,x){if(g){f&&f(g);return}u.fchmod(x,m,function(_){u.close(x,function(h){f&&f(_||h)})})})},u.lchmodSync=function(p,m){var f=u.openSync(p,Ro.O_WRONLY|Ro.O_SYMLINK,m),g=!0,x;try{x=u.fchmodSync(f,m),g=!1}finally{if(g)try{u.closeSync(f)}catch{}else u.closeSync(f)}return x}}s(e,"patchLchmod");function n(u){Ro.hasOwnProperty("O_SYMLINK")&&u.futimes?(u.lutimes=function(p,m,f,g){u.open(p,Ro.O_SYMLINK,function(x,_){if(x){g&&g(x);return}u.futimes(_,m,f,function(h){u.close(_,function(v){g&&g(h||v)})})})},u.lutimesSync=function(p,m,f){var g=u.openSync(p,Ro.O_SYMLINK),x,_=!0;try{x=u.futimesSync(g,m,f),_=!1}finally{if(_)try{u.closeSync(g)}catch{}else u.closeSync(g)}return x}):u.futimes&&(u.lutimes=function(p,m,f,g){g&&process.nextTick(g)},u.lutimesSync=function(){})}s(n,"patchLutimes");function i(u){return u&&function(p,m,f){return u.call(t,p,m,function(g){d(g)&&(g=null),f&&f.apply(this,arguments)})}}s(i,"chmodFix");function a(u){return u&&function(p,m){try{return u.call(t,p,m)}catch(f){if(!d(f))throw f}}}s(a,"chmodFixSync");function r(u){return u&&function(p,m,f,g){return u.call(t,p,m,f,function(x){d(x)&&(x=null),g&&g.apply(this,arguments)})}}s(r,"chownFix");function o(u){return u&&function(p,m,f){try{return u.call(t,p,m,f)}catch(g){if(!d(g))throw g}}}s(o,"chownFixSync");function l(u){return u&&function(p,m,f){typeof m=="function"&&(f=m,m=null);function g(x,_){_&&(_.uid<0&&(_.uid+=4294967296),_.gid<0&&(_.gid+=4294967296)),f&&f.apply(this,arguments)}return s(g,"callback"),m?u.call(t,p,m,g):u.call(t,p,g)}}s(l,"statFix");function c(u){return u&&function(p,m){var f=m?u.call(t,p,m):u.call(t,p);return f&&(f.uid<0&&(f.uid+=4294967296),f.gid<0&&(f.gid+=4294967296)),f}}s(c,"statFixSync");function d(u){if(!u||u.code==="ENOSYS")return!0;var p=!process.getuid||process.getuid()!==0;return!!(p&&(u.code==="EINVAL"||u.code==="EPERM"))}s(d,"chownErOk")}s(Hle,"patch")});var k1=oe((nEe,E1)=>{var w1=Ee("stream").Stream;E1.exports=Jle;function Jle(t){return{ReadStream:e,WriteStream:n};function e(i,a){if(!(this instanceof e))return new e(i,a);w1.call(this);var r=this;this.path=i,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=64*1024,a=a||{};for(var o=Object.keys(a),l=0,c=o.length;lthis.end)throw new Error("start must be <= end");this.pos=this.start}if(this.fd!==null){process.nextTick(function(){r._read()});return}t.open(this.path,this.flags,this.mode,function(u,p){if(u){r.emit("error",u),r.readable=!1;return}r.fd=p,r.emit("open",p),r._read()})}function n(i,a){if(!(this instanceof n))return new n(i,a);w1.call(this),this.path=i,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0,a=a||{};for(var r=Object.keys(a),o=0,l=r.length;o= zero");this.pos=this.start}this.busy=!1,this._queue=[],this.fd===null&&(this._open=t.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}s(Jle,"legacy")});var A1=oe((aEe,j1)=>{"use strict";j1.exports=Wle;var Gle=Object.getPrototypeOf||function(t){return t.__proto__};function Wle(t){if(t===null||typeof t!="object")return t;if(t instanceof Object)var e={__proto__:Gle(t)};else var e=Object.create(null);return Object.getOwnPropertyNames(t).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}s(Wle,"clone")});var O1=oe((oEe,Gg)=>{var jn=Ee("fs"),Kle=y1(),Yle=k1(),Xle=A1(),Op=Ee("util"),ri,Dp;typeof Symbol=="function"&&typeof Symbol.for=="function"?(ri=Symbol.for("graceful-fs.queue"),Dp=Symbol.for("graceful-fs.previous")):(ri="___graceful-fs.queue",Dp="___graceful-fs.previous");function Zle(){}s(Zle,"noop");function S1(t,e){Object.defineProperty(t,ri,{get:function(){return e}})}s(S1,"publishQueue");var As=Zle;Op.debuglog?As=Op.debuglog("gfs4"):/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&(As=s(function(){var t=Op.format.apply(Op,arguments);t="GFS4: "+t.split(/\n/).join(` GFS4: `),console.error(t)},"debug"));jn[ri]||(T1=global[ri]||[],S1(jn,T1),jn.close=function(t){function e(n,i){return t.call(jn,n,function(a){a||C1(),typeof i=="function"&&i.apply(this,arguments)})}return s(e,"close"),Object.defineProperty(e,Dp,{value:t}),e}(jn.close),jn.closeSync=function(t){function e(n){t.apply(jn,arguments),C1()}return s(e,"closeSync"),Object.defineProperty(e,Dp,{value:t}),e}(jn.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&process.on("exit",function(){As(jn[ri]),Ee("assert").equal(jn[ri].length,0)}));var T1;global[ri]||S1(global,jn[ri]);Gg.exports=Hg(Xle(jn));process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!jn.__patched&&(Gg.exports=Hg(jn),jn.__patched=!0);function Hg(t){Kle(t),t.gracefulify=Hg,t.createReadStream=w,t.createWriteStream=S;var e=t.readFile;t.readFile=n;function n(k,R,D){return typeof R=="function"&&(D=R,R=null),B(k,R,D);function B(q,G,W,ee){return e(q,G,function(Z){Z&&(Z.code==="EMFILE"||Z.code==="ENFILE")?Fl([B,[q,G,W],Z,ee||Date.now(),Date.now()]):typeof W=="function"&&W.apply(this,arguments)})}s(B,"go$readFile")}s(n,"readFile");var i=t.writeFile;t.writeFile=a;function a(k,R,D,B){return typeof D=="function"&&(B=D,D=null),q(k,R,D,B);function q(G,W,ee,Z,me){return i(G,W,ee,function(X){X&&(X.code==="EMFILE"||X.code==="ENFILE")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z=="function"&&Z.apply(this,arguments)})}s(q,"go$writeFile")}s(a,"writeFile");var r=t.appendFile;r&&(t.appendFile=o);function o(k,R,D,B){return typeof D=="function"&&(B=D,D=null),q(k,R,D,B);function q(G,W,ee,Z,me){return r(G,W,ee,function(X){X&&(X.code==="EMFILE"||X.code==="ENFILE")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z=="function"&&Z.apply(this,arguments)})}s(q,"go$appendFile")}s(o,"appendFile");var l=t.copyFile;l&&(t.copyFile=c);function c(k,R,D,B){return typeof D=="function"&&(B=D,D=0),q(k,R,D,B);function q(G,W,ee,Z,me){return l(G,W,ee,function(X){X&&(X.code==="EMFILE"||X.code==="ENFILE")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z=="function"&&Z.apply(this,arguments)})}s(q,"go$copyFile")}s(c,"copyFile");var d=t.readdir;t.readdir=p;var u=/^v[0-5]\./;function p(k,R,D){typeof R=="function"&&(D=R,R=null);var B=u.test(process.version)?s(function(W,ee,Z,me){return d(W,q(W,ee,Z,me))},"go$readdir"):s(function(W,ee,Z,me){return d(W,ee,q(W,ee,Z,me))},"go$readdir");return B(k,R,D);function q(G,W,ee,Z){return function(me,X){me&&(me.code==="EMFILE"||me.code==="ENFILE")?Fl([B,[G,W,ee],me,Z||Date.now(),Date.now()]):(X&&X.sort&&X.sort(),typeof ee=="function"&&ee.call(this,me,X))}}}if(s(p,"readdir"),process.version.substr(0,4)==="v0.8"){var m=Yle(t);h=m.ReadStream,b=m.WriteStream}var f=t.ReadStream;f&&(h.prototype=Object.create(f.prototype),h.prototype.open=v);var g=t.WriteStream;g&&(b.prototype=Object.create(g.prototype),b.prototype.open=y),Object.defineProperty(t,"ReadStream",{get:function(){return h},set:function(k){h=k},enumerable:!0,configurable:!0}),Object.defineProperty(t,"WriteStream",{get:function(){return b},set:function(k){b=k},enumerable:!0,configurable:!0});var x=h;Object.defineProperty(t,"FileReadStream",{get:function(){return x},set:function(k){x=k},enumerable:!0,configurable:!0});var _=b;Object.defineProperty(t,"FileWriteStream",{get:function(){return _},set:function(k){_=k},enumerable:!0,configurable:!0});function h(k,R){return this instanceof h?(f.apply(this,arguments),this):h.apply(Object.create(h.prototype),arguments)}s(h,"ReadStream");function v(){var k=this;N(k.path,k.flags,k.mode,function(R,D){R?(k.autoClose&&k.destroy(),k.emit("error",R)):(k.fd=D,k.emit("open",D),k.read())})}s(v,"ReadStream$open");function b(k,R){return this instanceof b?(g.apply(this,arguments),this):b.apply(Object.create(b.prototype),arguments)}s(b,"WriteStream");function y(){var k=this;N(k.path,k.flags,k.mode,function(R,D){R?(k.destroy(),k.emit("error",R)):(k.fd=D,k.emit("open",D))})}s(y,"WriteStream$open");function w(k,R){return new t.ReadStream(k,R)}s(w,"createReadStream");function S(k,R){return new t.WriteStream(k,R)}s(S,"createWriteStream");var F=t.open;t.open=N;function N(k,R,D,B){return typeof D=="function"&&(B=D,D=null),q(k,R,D,B);function q(G,W,ee,Z,me){return F(G,W,ee,function(X,Q){X&&(X.code==="EMFILE"||X.code==="ENFILE")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z=="function"&&Z.apply(this,arguments)})}s(q,"go$open")}return s(N,"open"),t}s(Hg,"patch");function Fl(t){As("ENQUEUE",t[0].name,t[1]),jn[ri].push(t),Jg()}s(Fl,"enqueue");var Ip;function C1(){for(var t=Date.now(),e=0;e2&&(jn[ri][e][3]=t,jn[ri][e][4]=t);Jg()}s(C1,"resetQueue");function Jg(){if(clearTimeout(Ip),Ip=void 0,jn[ri].length!==0){var t=jn[ri].shift(),e=t[0],n=t[1],i=t[2],a=t[3],r=t[4];if(a===void 0)As("RETRY",e.name,n),e.apply(null,n);else if(Date.now()-a>=6e4){As("TIMEOUT",e.name,n);var o=n.pop();typeof o=="function"&&o.call(null,i)}else{var l=Date.now()-r,c=Math.max(r-a,1),d=Math.min(c*1.2,100);l>=d?(As("RETRY",e.name,n),e.apply(null,n.concat([a]))):jn[ri].push(t)}Ip===void 0&&(Ip=setTimeout(Jg,0))}}s(Jg,"retry")});var Wg=oe((lEe,I1)=>{"use strict";I1.exports=t=>{let e=new Uint8Array(t);if(!(e&&e.length>1))return null;let n=s((i,a)=>{a=Object.assign({offset:0},a);for(let r=0;rl[o]===66&&l[o+1]===130);if(a>=0){let r=a+3,o=s(l=>Array.from(l).every((c,d)=>i[r+d]===c.charCodeAt(0)),"findDocType");if(o("matroska"))return{ext:"mkv",mime:"video/x-matroska"};if(o("webm"))return{ext:"webm",mime:"video/webm"}}}return n([0,0,0,20,102,116,121,112,113,116,32,32])||n([102,114,101,101],{offset:4})||n([102,116,121,112,113,116,32,32],{offset:4})||n([109,100,97,116],{offset:4})||n([119,105,100,101],{offset:4})?{ext:"mov",mime:"video/quicktime"}:n([82,73,70,70])&&n([65,86,73],{offset:8})?{ext:"avi",mime:"video/x-msvideo"}:n([48,38,178,117,142,102,207,17,166,217])?{ext:"wmv",mime:"video/x-ms-wmv"}:n([0,0,1,186])?{ext:"mpg",mime:"video/mpeg"}:n([73,68,51])||n([255,251])?{ext:"mp3",mime:"audio/mpeg"}:n([102,116,121,112,77,52,65],{offset:4})||n([77,52,65,32])?{ext:"m4a",mime:"audio/m4a"}:n([79,112,117,115,72,101,97,100],{offset:28})?{ext:"opus",mime:"audio/opus"}:n([79,103,103,83])?{ext:"ogg",mime:"audio/ogg"}:n([102,76,97,67])?{ext:"flac",mime:"audio/x-flac"}:n([82,73,70,70])&&n([87,65,86,69],{offset:8})?{ext:"wav",mime:"audio/x-wav"}:n([35,33,65,77,82,10])?{ext:"amr",mime:"audio/amr"}:n([37,80,68,70])?{ext:"pdf",mime:"application/pdf"}:n([77,90])?{ext:"exe",mime:"application/x-msdownload"}:(e[0]===67||e[0]===70)&&n([87,83],{offset:1})?{ext:"swf",mime:"application/x-shockwave-flash"}:n([123,92,114,116,102])?{ext:"rtf",mime:"application/rtf"}:n([0,97,115,109])?{ext:"wasm",mime:"application/wasm"}:n([119,79,70,70])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:"woff",mime:"font/woff"}:n([119,79,70,50])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:"woff2",mime:"font/woff2"}:n([76,80],{offset:34})&&(n([0,0,1],{offset:8})||n([1,0,2],{offset:8})||n([2,0,2],{offset:8}))?{ext:"eot",mime:"application/octet-stream"}:n([0,1,0,0,0])?{ext:"ttf",mime:"font/ttf"}:n([79,84,84,79,0])?{ext:"otf",mime:"font/otf"}:n([0,0,1,0])?{ext:"ico",mime:"image/x-icon"}:n([70,76,86,1])?{ext:"flv",mime:"video/x-flv"}:n([37,33])?{ext:"ps",mime:"application/postscript"}:n([253,55,122,88,90,0])?{ext:"xz",mime:"application/x-xz"}:n([83,81,76,105])?{ext:"sqlite",mime:"application/x-sqlite3"}:n([78,69,83,26])?{ext:"nes",mime:"application/x-nintendo-nes-rom"}:n([67,114,50,52])?{ext:"crx",mime:"application/x-google-chrome-extension"}:n([77,83,67,70])||n([73,83,99,40])?{ext:"cab",mime:"application/vnd.ms-cab-compressed"}:n([33,60,97,114,99,104,62,10,100,101,98,105,97,110,45,98,105,110,97,114,121])?{ext:"deb",mime:"application/x-deb"}:n([33,60,97,114,99,104,62])?{ext:"ar",mime:"application/x-unix-archive"}:n([237,171,238,219])?{ext:"rpm",mime:"application/x-rpm"}:n([31,160])||n([31,157])?{ext:"Z",mime:"application/x-compress"}:n([76,90,73,80])?{ext:"lz",mime:"application/x-lzip"}:n([208,207,17,224,161,177,26,225])?{ext:"msi",mime:"application/x-msi"}:n([6,14,43,52,2,5,1,1,13,1,2,1,1,2])?{ext:"mxf",mime:"application/mxf"}:n([71],{offset:4})&&(n([71],{offset:192})||n([71],{offset:196}))?{ext:"mts",mime:"video/mp2t"}:n([66,76,69,78,68,69,82])?{ext:"blend",mime:"application/x-blender"}:n([66,80,71,251])?{ext:"bpg",mime:"image/bpg"}:null}});var Fp=oe((uEe,D1)=>{"use strict";var io=D1.exports=function(t){return t!==null&&typeof t=="object"&&typeof t.pipe=="function"};io.writable=function(t){return io(t)&&t.writable!==!1&&typeof t._write=="function"&&typeof t._writableState=="object"};io.readable=function(t){return io(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object"};io.duplex=function(t){return io.writable(t)&&io.readable(t)};io.transform=function(t){return io.duplex(t)&&typeof t._transform=="function"&&typeof t._transformState=="object"}});var pu=oe((dEe,Kg)=>{"use strict";typeof process>"u"||!process.version||process.version.indexOf("v0.")===0||process.version.indexOf("v1.")===0&&process.version.indexOf("v1.8.")!==0?Kg.exports={nextTick:Qle}:Kg.exports=process;function Qle(t,e,n,i){if(typeof t!="function")throw new TypeError('"callback" argument must be a function');var a=arguments.length,r,o;switch(a){case 0:case 1:return process.nextTick(t);case 2:return process.nextTick(s(function(){t.call(null,e)},"afterTickOne"));case 3:return process.nextTick(s(function(){t.call(null,e,n)},"afterTickTwo"));case 4:return process.nextTick(s(function(){t.call(null,e,n,i)},"afterTickThree"));default:for(r=new Array(a-1),o=0;o{var $le={}.toString;F1.exports=Array.isArray||function(t){return $le.call(t)=="[object Array]"}});var Yg=oe((fEe,R1)=>{R1.exports=Ee("stream")});var Rp=oe((Xg,B1)=>{var Np=(No(),nu(Dl)),ao=Np.Buffer;function M1(t,e){for(var n in t)e[n]=t[n]}s(M1,"copyProps");ao.from&&ao.alloc&&ao.allocUnsafe&&ao.allocUnsafeSlow?B1.exports=Np:(M1(Np,Xg),Xg.Buffer=Nl);function Nl(t,e,n){return ao(t,e,n)}s(Nl,"SafeBuffer");M1(ao,Nl);Nl.from=function(t,e,n){if(typeof t=="number")throw new TypeError("Argument must not be a number");return ao(t,e,n)};Nl.alloc=function(t,e,n){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=ao(t);return e!==void 0?typeof n=="string"?i.fill(e,n):i.fill(e):i.fill(0),i};Nl.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return ao(t)};Nl.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return Np.SlowBuffer(t)}});var Rl=oe(xi=>{function ece(t){return Array.isArray?Array.isArray(t):Mp(t)==="[object Array]"}s(ece,"isArray");xi.isArray=ece;function tce(t){return typeof t=="boolean"}s(tce,"isBoolean");xi.isBoolean=tce;function nce(t){return t===null}s(nce,"isNull");xi.isNull=nce;function ice(t){return t==null}s(ice,"isNullOrUndefined");xi.isNullOrUndefined=ice;function ace(t){return typeof t=="number"}s(ace,"isNumber");xi.isNumber=ace;function rce(t){return typeof t=="string"}s(rce,"isString");xi.isString=rce;function oce(t){return typeof t=="symbol"}s(oce,"isSymbol");xi.isSymbol=oce;function sce(t){return t===void 0}s(sce,"isUndefined");xi.isUndefined=sce;function lce(t){return Mp(t)==="[object RegExp]"}s(lce,"isRegExp");xi.isRegExp=lce;function cce(t){return typeof t=="object"&&t!==null}s(cce,"isObject");xi.isObject=cce;function uce(t){return Mp(t)==="[object Date]"}s(uce,"isDate");xi.isDate=uce;function dce(t){return Mp(t)==="[object Error]"||t instanceof Error}s(dce,"isError");xi.isError=dce;function pce(t){return typeof t=="function"}s(pce,"isFunction");xi.isFunction=pce;function mce(t){return t===null||typeof t=="boolean"||typeof t=="number"||typeof t=="string"||typeof t=="symbol"||typeof t>"u"}s(mce,"isPrimitive");xi.isPrimitive=mce;xi.isBuffer=(No(),nu(Dl)).Buffer.isBuffer;function Mp(t){return Object.prototype.toString.call(t)}s(Mp,"objectToString")});var P1=oe((xEe,Zg)=>{typeof Object.create=="function"?Zg.exports=s(function(e,n){n&&(e.super_=n,e.prototype=Object.create(n.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))},"inherits"):Zg.exports=s(function(e,n){if(n){e.super_=n;var i=s(function(){},"TempCtor");i.prototype=n.prototype,e.prototype=new i,e.prototype.constructor=e}},"inherits")});var Ts=oe((bEe,$g)=>{try{if(Qg=Ee("util"),typeof Qg.inherits!="function")throw"";$g.exports=Qg.inherits}catch{$g.exports=P1()}var Qg});var V1=oe((yEe,e_)=>{"use strict";function fce(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}s(fce,"_classCallCheck");var L1=Rp().Buffer,mu=Ee("util");function hce(t,e,n){t.copy(e,n)}s(hce,"copyBuffer");e_.exports=function(){function t(){fce(this,t),this.head=null,this.tail=null,this.length=0}return s(t,"BufferList"),t.prototype.push=s(function(n){var i={data:n,next:null};this.length>0?this.tail.next=i:this.head=i,this.tail=i,++this.length},"push"),t.prototype.unshift=s(function(n){var i={data:n,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length},"unshift"),t.prototype.shift=s(function(){if(this.length!==0){var n=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,n}},"shift"),t.prototype.clear=s(function(){this.head=this.tail=null,this.length=0},"clear"),t.prototype.join=s(function(n){if(this.length===0)return"";for(var i=this.head,a=""+i.data;i=i.next;)a+=n+i.data;return a},"join"),t.prototype.concat=s(function(n){if(this.length===0)return L1.alloc(0);for(var i=L1.allocUnsafe(n>>>0),a=this.head,r=0;a;)hce(a.data,i,r),r+=a.data.length,a=a.next;return i},"concat"),t}();mu&&mu.inspect&&mu.inspect.custom&&(e_.exports.prototype[mu.inspect.custom]=function(){var t=mu.inspect({length:this.length});return this.constructor.name+" "+t})});var t_=oe((EEe,z1)=>{"use strict";var Bp=pu();function gce(t,e){var n=this,i=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return i||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,Bp.nextTick(Pp,this,t)):Bp.nextTick(Pp,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(r){!e&&r?n._writableState?n._writableState.errorEmitted||(n._writableState.errorEmitted=!0,Bp.nextTick(Pp,n,r)):Bp.nextTick(Pp,n,r):e&&e(r)}),this)}s(gce,"destroy");function _ce(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}s(_ce,"undestroy");function Pp(t,e){t.emit("error",e)}s(Pp,"emitErrorNT");z1.exports={destroy:gce,undestroy:_ce}});var q1=oe((jEe,U1)=>{U1.exports=Ee("util").deprecate});var i_=oe((AEe,Z1)=>{"use strict";var Cs=pu();Z1.exports=Bn;function J1(t){var e=this;this.next=null,this.entry=null,this.finish=function(){Rce(e,t)}}s(J1,"CorkedRequest");var xce=!process.browser&&["v0.10","v0.9."].indexOf(process.version.slice(0,5))>-1?setImmediate:Cs.nextTick,Ml;Bn.WritableState=hu;var G1=Object.create(Rl());G1.inherits=Ts();var vce={deprecate:q1()},W1=Yg(),Vp=Rp().Buffer,bce=(typeof global<"u"?global:typeof window<"u"?window:typeof self<"u"?self:{}).Uint8Array||function(){};function yce(t){return Vp.from(t)}s(yce,"_uint8ArrayToBuffer");function wce(t){return Vp.isBuffer(t)||t instanceof bce}s(wce,"_isUint8Array");var K1=t_();G1.inherits(Bn,W1);function Ece(){}s(Ece,"nop");function hu(t,e){Ml=Ml||Ss(),t=t||{};var n=e instanceof Ml;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var i=t.highWaterMark,a=t.writableHighWaterMark,r=this.objectMode?16:16*1024;i||i===0?this.highWaterMark=i:n&&(a||a===0)?this.highWaterMark=a:this.highWaterMark=r,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(l){Oce(e,l)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new J1(this)}s(hu,"WritableState");hu.prototype.getBuffer=s(function(){for(var e=this.bufferedRequest,n=[];e;)n.push(e),e=e.next;return n},"getBuffer");(function(){try{Object.defineProperty(hu.prototype,"buffer",{get:vce.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var Lp;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(Lp=Function.prototype[Symbol.hasInstance],Object.defineProperty(Bn,Symbol.hasInstance,{value:function(t){return Lp.call(this,t)?!0:this!==Bn?!1:t&&t._writableState instanceof hu}})):Lp=s(function(t){return t instanceof this},"realHasInstance");function Bn(t){if(Ml=Ml||Ss(),!Lp.call(Bn,this)&&!(this instanceof Ml))return new Bn(t);this._writableState=new hu(t,this),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),W1.call(this)}s(Bn,"Writable");Bn.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))};function kce(t,e){var n=new Error("write after end");t.emit("error",n),Cs.nextTick(e,n)}s(kce,"writeAfterEnd");function jce(t,e,n,i){var a=!0,r=!1;return n===null?r=new TypeError("May not write null values to stream"):typeof n!="string"&&n!==void 0&&!e.objectMode&&(r=new TypeError("Invalid non-string/buffer chunk")),r&&(t.emit("error",r),Cs.nextTick(i,r),a=!1),a}s(jce,"validChunk");Bn.prototype.write=function(t,e,n){var i=this._writableState,a=!1,r=!i.objectMode&&wce(t);return r&&!Vp.isBuffer(t)&&(t=yce(t)),typeof e=="function"&&(n=e,e=null),r?e="buffer":e||(e=i.defaultEncoding),typeof n!="function"&&(n=Ece),i.ended?kce(this,n):(r||jce(this,i,t,n))&&(i.pendingcb++,a=Tce(this,i,r,t,e,n)),a};Bn.prototype.cork=function(){var t=this._writableState;t.corked++};Bn.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&Y1(this,t))};Bn.prototype.setDefaultEncoding=s(function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},"setDefaultEncoding");function Ace(t,e,n){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=Vp.from(e,n)),e}s(Ace,"decodeChunk");Object.defineProperty(Bn.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Tce(t,e,n,i,a,r){if(!n){var o=Ace(e,i,a);i!==o&&(n=!0,a="buffer",i=o)}var l=e.objectMode?1:i.length;e.length+=l;var c=e.length{"use strict";var Q1=pu(),Mce=Object.keys||function(t){var e=[];for(var n in t)e.push(n);return e};tw.exports=ro;var $1=Object.create(Rl());$1.inherits=Ts();var ew=o_(),r_=i_();$1.inherits(ro,ew);for(a_=Mce(r_.prototype),zp=0;zp{var qp=(No(),nu(Dl)),oo=qp.Buffer;function nw(t,e){for(var n in t)e[n]=t[n]}s(nw,"copyProps");oo.from&&oo.alloc&&oo.allocUnsafe&&oo.allocUnsafeSlow?iw.exports=qp:(nw(qp,s_),s_.Buffer=Bl);function Bl(t,e,n){return oo(t,e,n)}s(Bl,"SafeBuffer");nw(oo,Bl);Bl.from=function(t,e,n){if(typeof t=="number")throw new TypeError("Argument must not be a number");return oo(t,e,n)};Bl.alloc=function(t,e,n){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=oo(t);return e!==void 0?typeof n=="string"?i.fill(e,n):i.fill(e):i.fill(0),i};Bl.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return oo(t)};Bl.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return qp.SlowBuffer(t)}});var u_=oe(ow=>{"use strict";var c_=aw().Buffer,rw=c_.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Lce(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}s(Lce,"_normalizeEncoding");function Vce(t){var e=Lce(t);if(typeof e!="string"&&(c_.isEncoding===rw||!rw(t)))throw new Error("Unknown encoding: "+t);return e||t}s(Vce,"normalizeEncoding");ow.StringDecoder=gu;function gu(t){this.encoding=Vce(t);var e;switch(this.encoding){case"utf16le":this.text=Gce,this.end=Wce,e=4;break;case"utf8":this.fillLast=qce,e=4;break;case"base64":this.text=Kce,this.end=Yce,e=3;break;default:this.write=Xce,this.end=Zce;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=c_.allocUnsafe(e)}s(gu,"StringDecoder");gu.prototype.write=function(t){if(t.length===0)return"";var e,n;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";n=this.lastNeed,this.lastNeed=0}else n=0;return n>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}s(l_,"utf8CheckByte");function zce(t,e,n){var i=e.length-1;if(i=0?(a>0&&(t.lastNeed=a-1),a):--i=0?(a>0&&(t.lastNeed=a-2),a):--i=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}s(zce,"utf8CheckIncomplete");function Uce(t,e,n){if((e[0]&192)!==128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,"\uFFFD"}}s(Uce,"utf8CheckExtraBytes");function qce(t){var e=this.lastTotal-this.lastNeed,n=Uce(this,t,e);if(n!==void 0)return n;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}s(qce,"utf8FillLast");function Hce(t,e){var n=zce(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=n;var i=t.length-(n-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}s(Hce,"utf8Text");function Jce(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}s(Jce,"utf8End");function Gce(t,e){if((t.length-e)%2===0){var n=t.toString("utf16le",e);if(n){var i=n.charCodeAt(n.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}s(Gce,"utf16Text");function Wce(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,n)}return e}s(Wce,"utf16End");function Kce(t,e){var n=(t.length-e)%3;return n===0?t.toString("base64",e):(this.lastNeed=3-n,this.lastTotal=3,n===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-n))}s(Kce,"base64Text");function Yce(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}s(Yce,"base64End");function Xce(t){return t.toString(this.encoding)}s(Xce,"simpleWrite");function Zce(t){return t&&t.length?this.write(t):""}s(Zce,"simpleEnd")});var o_=oe((NEe,xw)=>{"use strict";var Ll=pu();xw.exports=pn;var Qce=N1(),_u;pn.ReadableState=mw;var FEe=Ee("events").EventEmitter,uw=s(function(t,e){return t.listeners(e).length},"EElistenerCount"),h_=Yg(),xu=Rp().Buffer,$ce=(typeof global<"u"?global:typeof window<"u"?window:typeof self<"u"?self:{}).Uint8Array||function(){};function eue(t){return xu.from(t)}s(eue,"_uint8ArrayToBuffer");function tue(t){return xu.isBuffer(t)||t instanceof $ce}s(tue,"_isUint8Array");var dw=Object.create(Rl());dw.inherits=Ts();var d_=Ee("util"),Lt=void 0;d_&&d_.debuglog?Lt=d_.debuglog("stream"):Lt=s(function(){},"debug");var nue=V1(),pw=t_(),Pl;dw.inherits(pn,h_);var p_=["error","close","destroy","pause","resume"];function iue(t,e,n){if(typeof t.prependListener=="function")return t.prependListener(e,n);!t._events||!t._events[e]?t.on(e,n):Qce(t._events[e])?t._events[e].unshift(n):t._events[e]=[n,t._events[e]]}s(iue,"prependListener");function mw(t,e){_u=_u||Ss(),t=t||{};var n=e instanceof _u;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var i=t.highWaterMark,a=t.readableHighWaterMark,r=this.objectMode?16:16*1024;i||i===0?this.highWaterMark=i:n&&(a||a===0)?this.highWaterMark=a:this.highWaterMark=r,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new nue,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Pl||(Pl=u_().StringDecoder),this.decoder=new Pl(t.encoding),this.encoding=t.encoding)}s(mw,"ReadableState");function pn(t){if(_u=_u||Ss(),!(this instanceof pn))return new pn(t);this._readableState=new mw(t,this),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),h_.call(this)}s(pn,"Readable");Object.defineProperty(pn.prototype,"destroyed",{get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(t){this._readableState&&(this._readableState.destroyed=t)}});pn.prototype.destroy=pw.destroy;pn.prototype._undestroy=pw.undestroy;pn.prototype._destroy=function(t,e){this.push(null),e(t)};pn.prototype.push=function(t,e){var n=this._readableState,i;return n.objectMode?i=!0:typeof t=="string"&&(e=e||n.defaultEncoding,e!==n.encoding&&(t=xu.from(t,e),e=""),i=!0),fw(this,t,e,!1,i)};pn.prototype.unshift=function(t){return fw(this,t,null,!0,!1)};function fw(t,e,n,i,a){var r=t._readableState;if(e===null)r.reading=!1,sue(t,r);else{var o;a||(o=aue(r,e)),o?t.emit("error",o):r.objectMode||e&&e.length>0?(typeof e!="string"&&!r.objectMode&&Object.getPrototypeOf(e)!==xu.prototype&&(e=eue(e)),i?r.endEmitted?t.emit("error",new Error("stream.unshift() after end event")):m_(t,r,e,!0):r.ended?t.emit("error",new Error("stream.push() after EOF")):(r.reading=!1,r.decoder&&!n?(e=r.decoder.write(e),r.objectMode||e.length!==0?m_(t,r,e,!1):hw(t,r)):m_(t,r,e,!1))):i||(r.reading=!1)}return rue(r)}s(fw,"readableAddChunk");function m_(t,e,n,i){e.flowing&&e.length===0&&!e.sync?(t.emit("data",n),t.read(0)):(e.length+=e.objectMode?1:n.length,i?e.buffer.unshift(n):e.buffer.push(n),e.needReadable&&Hp(t)),hw(t,e)}s(m_,"addChunk");function aue(t,e){var n;return!tue(e)&&typeof e!="string"&&e!==void 0&&!t.objectMode&&(n=new TypeError("Invalid non-string/buffer chunk")),n}s(aue,"chunkInvalid");function rue(t){return!t.ended&&(t.needReadable||t.length=sw?t=sw:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}s(oue,"computeNewHighWaterMark");function lw(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=oue(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}s(lw,"howMuchToRead");pn.prototype.read=function(t){Lt("read",t),t=parseInt(t,10);var e=this._readableState,n=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return Lt("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?f_(this):Hp(this),null;if(t=lw(t,e),t===0&&e.ended)return e.length===0&&f_(this),null;var i=e.needReadable;Lt("need readable",i),(e.length===0||e.length-t0?a=gw(t,e):a=null,a===null?(e.needReadable=!0,t=0):e.length-=t,e.length===0&&(e.ended||(e.needReadable=!0),n!==t&&e.ended&&f_(this)),a!==null&&this.emit("data",a),a};function sue(t,e){if(!e.ended){if(e.decoder){var n=e.decoder.end();n&&n.length&&(e.buffer.push(n),e.length+=e.objectMode?1:n.length)}e.ended=!0,Hp(t)}}s(sue,"onEofChunk");function Hp(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(Lt("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?Ll.nextTick(cw,t):cw(t))}s(Hp,"emitReadable");function cw(t){Lt("emit readable"),t.emit("readable"),g_(t)}s(cw,"emitReadable_");function hw(t,e){e.readingMore||(e.readingMore=!0,Ll.nextTick(lue,t,e))}s(hw,"maybeReadMore");function lue(t,e){for(var n=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length1&&_w(i.pipes,t)!==-1)&&!d&&(Lt("false write response, pause",i.awaitDrain),i.awaitDrain++,p=!0),n.pause())}s(m,"ondata");function f(h){Lt("onerror",h),_(),t.removeListener("error",f),uw(t,"error")===0&&t.emit("error",h)}s(f,"onerror"),iue(t,"error",f);function g(){t.removeListener("finish",x),_()}s(g,"onclose"),t.once("close",g);function x(){Lt("onfinish"),t.removeListener("close",g),_()}s(x,"onfinish"),t.once("finish",x);function _(){Lt("unpipe"),n.unpipe(t)}return s(_,"unpipe"),t.emit("pipe",n),i.flowing||(Lt("pipe resume"),n.resume()),t};function cue(t){return function(){var e=t._readableState;Lt("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,e.awaitDrain===0&&uw(t,"data")&&(e.flowing=!0,g_(t))}}s(cue,"pipeOnDrain");pn.prototype.unpipe=function(t){var e=this._readableState,n={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,n),this);if(!t){var i=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var r=0;r=e.length?(e.decoder?n=e.buffer.join(""):e.buffer.length===1?n=e.buffer.head.data:n=e.buffer.concat(e.length),e.buffer.clear()):n=mue(t,e.buffer,e.decoder),n}s(gw,"fromList");function mue(t,e,n){var i;return tr.length?r.length:t;if(o===r.length?a+=r:a+=r.slice(0,t),t-=o,t===0){o===r.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=r.slice(o));break}++i}return e.length-=i,a}s(fue,"copyFromBufferString");function hue(t,e){var n=xu.allocUnsafe(t),i=e.head,a=1;for(i.data.copy(n),t-=i.data.length;i=i.next;){var r=i.data,o=t>r.length?r.length:t;if(r.copy(n,n.length-t,0,o),t-=o,t===0){o===r.length?(++a,i.next?e.head=i.next:e.head=e.tail=null):(e.head=i,i.data=r.slice(o));break}++a}return e.length-=a,n}s(hue,"copyFromBuffer");function f_(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,Ll.nextTick(gue,e,t))}s(f_,"endReadable");function gue(t,e){!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"))}s(gue,"endReadableNT");function _w(t,e){for(var n=0,i=t.length;n{"use strict";yw.exports=so;var Jp=Ss(),bw=Object.create(Rl());bw.inherits=Ts();bw.inherits(so,Jp);function _ue(t,e){var n=this._transformState;n.transforming=!1;var i=n.writecb;if(!i)return this.emit("error",new Error("write callback called multiple times"));n.writechunk=null,n.writecb=null,e!=null&&this.push(e),i(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";kw.exports=vu;var ww=__(),Ew=Object.create(Rl());Ew.inherits=Ts();Ew.inherits(vu,ww);function vu(t){if(!(this instanceof vu))return new vu(t);ww.call(this,t)}s(vu,"PassThrough");vu.prototype._transform=function(t,e,n){n(null,t)}});var Os=oe((oi,Gp)=>{var gr=Ee("stream");process.env.READABLE_STREAM==="disable"&&gr?(Gp.exports=gr,oi=Gp.exports=gr.Readable,oi.Readable=gr.Readable,oi.Writable=gr.Writable,oi.Duplex=gr.Duplex,oi.Transform=gr.Transform,oi.PassThrough=gr.PassThrough,oi.Stream=gr):(oi=Gp.exports=o_(),oi.Stream=gr||oi,oi.Readable=oi,oi.Writable=i_(),oi.Duplex=Ss(),oi.Transform=__(),oi.PassThrough=jw())});var Tw=oe((VEe,Aw)=>{Aw.exports=Os().Duplex});var Sw=oe((zEe,Cw)=>{var x_=Tw(),vue=Ee("util"),Vl=Cp().Buffer;function In(t){if(!(this instanceof In))return new In(t);if(this._bufs=[],this.length=0,typeof t=="function"){this._callback=t;var e=s(function(i){this._callback&&(this._callback(i),this._callback=null)},"piper").bind(this);this.on("pipe",s(function(i){i.on("error",e)},"onPipe")),this.on("unpipe",s(function(i){i.removeListener("error",e)},"onUnpipe"))}else this.append(t);x_.call(this)}s(In,"BufferList");vue.inherits(In,x_);In.prototype._offset=s(function(e){var n=0,i=0,a;if(e===0)return[0,0];for(;ithis.length)&&(a=this.length),i>=this.length||a<=0)return e||Vl.alloc(0);var r=!!e,o=this._offset(i),l=a-i,c=l,d=r&&n||0,u=o[1],p,m;if(i===0&&a==this.length){if(!r)return this._bufs.length===1?this._bufs[0]:Vl.concat(this._bufs,this.length);for(m=0;mp)this._bufs[m].copy(e,d,u),d+=p;else{this._bufs[m].copy(e,d,u,u+c),d+=p;break}c-=p,u&&(u=0)}return e.length>d?e.slice(0,d):e},"copy");In.prototype.shallowSlice=s(function(e,n){e=e||0,n=n||this.length,e<0&&(e+=this.length),n<0&&(n+=this.length);var i=this._offset(e),a=this._offset(n),r=this._bufs.slice(i[0],a[0]+1);return a[1]==0?r.pop():r[r.length-1]=r[r.length-1].slice(0,a[1]),i[1]!=0&&(r[0]=r[0].slice(i[1])),new In(r)},"shallowSlice");In.prototype.toString=s(function(e,n,i){return this.slice(n,i).toString(e)},"toString");In.prototype.consume=s(function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this},"consume");In.prototype.duplicate=s(function(){for(var e=0,n=new In;e{Ow.exports=yue;var bue=Object.prototype.hasOwnProperty;function yue(){for(var t={},e=0;e{Fw.exports=Eue;var Dw=Buffer.from&&Buffer.from!==Uint8Array.from?Buffer.from:wue;function wue(t,e){return new Buffer(t,e)}s(wue,"bufferFrom");function Eue(t,e){if(Buffer.isBuffer(t))return t;if(typeof t=="string")return Dw(t,e);if(Array.isArray(t))return Dw(t);throw new Error("Input should be a buffer or a string")}s(Eue,"toBuffer")});var Rw=oe((WEe,Nw)=>{var kue=function(){try{if(!Buffer.isEncoding("latin1"))return!1;var t=Buffer.alloc?Buffer.alloc(4):new Buffer(4);return t.fill("ab","ucs2"),t.toString("hex")==="61006200"}catch{return!1}}();function jue(t){return t.length===1&&t.charCodeAt(0)<256}s(jue,"isSingleByte");function Wp(t,e,n,i){if(n<0||i>t.length)throw new RangeError("Out of range index");return n=n>>>0,i=i===void 0?t.length:i>>>0,i>n&&t.fill(e,n,i),t}s(Wp,"fillWithNumber");function Aue(t,e,n,i){if(n<0||i>t.length)throw new RangeError("Out of range index");if(i<=n)return t;n=n>>>0,i=i===void 0?t.length:i>>>0;for(var a=n,r=e.length;a<=i-r;)e.copy(t,a),a+=r;return a!==i&&e.copy(t,a,0,i-a),t}s(Aue,"fillWithBuffer");function Tue(t,e,n,i,a){if(kue)return t.fill(e,n,i,a);if(typeof e=="number")return Wp(t,e,n,i);if(typeof e=="string"){if(typeof n=="string"?(a=n,n=0,i=t.length):typeof i=="string"&&(a=i,i=t.length),a!==void 0&&typeof a!="string")throw new TypeError("encoding must be a string");if(a==="latin1"&&(a="binary"),typeof a=="string"&&!Buffer.isEncoding(a))throw new TypeError("Unknown encoding: "+a);if(e==="")return Wp(t,0,n,i);if(jue(e))return Wp(t,e.charCodeAt(0),n,i);e=new Buffer(e,a)}return Buffer.isBuffer(e)?Aue(t,e,n,i):Wp(t,0,n,i)}s(Tue,"fill");Nw.exports=Tue});var Bw=oe((YEe,Mw)=>{function Cue(t){if(typeof t!="number")throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative');return Buffer.allocUnsafe?Buffer.allocUnsafe(t):new Buffer(t)}s(Cue,"allocUnsafe");Mw.exports=Cue});var b_=oe((ZEe,Lw)=>{var Pw=Rw(),Sue=Bw();Lw.exports=s(function(e,n,i){if(typeof e!="number")throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative');if(Buffer.alloc)return Buffer.alloc(e,n,i);var a=Sue(e);return e===0?a:n===void 0?Pw(a,0):(typeof i!="string"&&(i=void 0),Pw(a,n,i))},"alloc")});var w_=oe(Ul=>{var Oue=v_(),Iue=b_(),Due="0000000000000000000",Fue="7777777777777777777",Vw="0".charCodeAt(0),Nue="ustar\x0000",Rue=parseInt("7777",8),Mue=s(function(t,e,n){return typeof t!="number"?n:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},"clamp"),Bue=s(function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},"toType"),Pue=s(function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},"toTypeflag"),zw=s(function(t,e,n,i){for(;ne?Fue.slice(0,e)+" ":Due.slice(0,e-t.length)+t+" "},"encodeOct");function Lue(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var n=!1,i=[],a=t.length-1;a>0;a--){var r=t[a];e?i.push(r):n&&r===0?i.push(0):n?(n=!1,i.push(256-r)):i.push(255-r)}var o=0,l=i.length;for(a=0;a=Math.pow(10,n)&&n++,e+n+t},"addLength");Ul.decodeLongPath=function(t,e){return zl(t,0,t.length,e)};Ul.encodePax=function(t){var e="";t.name&&(e+=y_(" path="+t.name+` `)),t.linkname&&(e+=y_(" linkpath="+t.linkname+` `));var n=t.pax;if(n)for(var i in n)e+=y_(" "+i+"="+n[i]+` `);return Oue(e)};Ul.decodePax=function(t){for(var e={};t.length;){for(var n=0;n100;){var a=n.indexOf("/");if(a===-1)return null;i+=i?"/"+n.slice(0,a):n.slice(0,a),n=n.slice(a+1)}return Buffer.byteLength(n)>100||Buffer.byteLength(i)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(n),e.write(Mo(t.mode&Rue,6),100),e.write(Mo(t.uid,6),108),e.write(Mo(t.gid,6),116),e.write(Mo(t.size,11),124),e.write(Mo(t.mtime.getTime()/1e3|0,11),136),e[156]=Vw+Pue(t.type),t.linkname&&e.write(t.linkname,157),e.write(Nue,257),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(Mo(t.devmajor||0,6),329),e.write(Mo(t.devminor||0,6),337),i&&e.write(i,345),e.write(Mo(Uw(e),6),148),e)};Ul.decode=function(t,e){var n=t[156]===0?0:t[156]-Vw,i=zl(t,0,100,e),a=Bo(t,100,8),r=Bo(t,108,8),o=Bo(t,116,8),l=Bo(t,124,12),c=Bo(t,136,12),d=Bue(n),u=t[157]===0?null:zl(t,157,100,e),p=zl(t,265,32),m=zl(t,297,32),f=Bo(t,329,8),g=Bo(t,337,8);t[345]&&(i=zl(t,345,155,e)+"/"+i),n===0&&i&&i[i.length-1]==="/"&&(n=5);var x=Uw(t);if(x===8*32)return null;if(x!==Bo(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");return{name:i,mode:a,uid:r,gid:o,size:l,mtime:new Date(1e3*c),type:d,linkname:u,uname:p,gname:m,devmajor:f,devminor:g}}});var Yw=oe((tke,Kw)=>{var Hw=Ee("util"),Vue=Sw(),zue=Iw(),bu=w_(),Jw=Os().Writable,Gw=Os().PassThrough,Ww=s(function(){},"noop"),qw=s(function(t){return t&=511,t&&512-t},"overflow"),Uue=s(function(t,e){var n=new Kp(t,e);return n.end(),n},"emptyStream"),que=s(function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},"mixinPax"),Kp=s(function(t,e){this._parent=t,this.offset=e,Gw.call(this)},"Source");Hw.inherits(Kp,Gw);Kp.prototype.destroy=function(t){this._parent.destroy(t)};var lo=s(function(t){if(!(this instanceof lo))return new lo(t);Jw.call(this,t),t=t||{},this._offset=0,this._buffer=Vue(),this._missing=0,this._partial=!1,this._onparse=Ww,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,n=e._buffer,i=s(function(){e._continue()},"oncontinue"),a=s(function(m){if(e._locked=!1,m)return e.destroy(m);e._stream||i()},"onunlock"),r=s(function(){e._stream=null;var m=qw(e._header.size);m?e._parse(m,o):e._parse(512,p),e._locked||i()},"onstreamend"),o=s(function(){e._buffer.consume(qw(e._header.size)),e._parse(512,p),i()},"ondrain"),l=s(function(){var m=e._header.size;e._paxGlobal=bu.decodePax(n.slice(0,m)),n.consume(m),r()},"onpaxglobalheader"),c=s(function(){var m=e._header.size;e._pax=bu.decodePax(n.slice(0,m)),e._paxGlobal&&(e._pax=zue(e._paxGlobal,e._pax)),n.consume(m),r()},"onpaxheader"),d=s(function(){var m=e._header.size;this._gnuLongPath=bu.decodeLongPath(n.slice(0,m),t.filenameEncoding),n.consume(m),r()},"ongnulongpath"),u=s(function(){var m=e._header.size;this._gnuLongLinkPath=bu.decodeLongPath(n.slice(0,m),t.filenameEncoding),n.consume(m),r()},"ongnulonglinkpath"),p=s(function(){var m=e._offset,f;try{f=e._header=bu.decode(n.slice(0,512),t.filenameEncoding)}catch(g){e.emit("error",g)}if(n.consume(512),!f){e._parse(512,p),i();return}if(f.type==="gnu-long-path"){e._parse(f.size,d),i();return}if(f.type==="gnu-long-link-path"){e._parse(f.size,u),i();return}if(f.type==="pax-global-header"){e._parse(f.size,l),i();return}if(f.type==="pax-header"){e._parse(f.size,c),i();return}if(e._gnuLongPath&&(f.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(f.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=f=que(f,e._pax),e._pax=null),e._locked=!0,!f.size||f.type==="directory"){e._parse(512,p),e.emit("entry",f,Uue(e,m),a);return}e._stream=new Kp(e,m),e.emit("entry",f,e._stream,a),e._parse(f.size,r),i()},"onheader");this._onheader=p,this._parse(512,p)},"Extract");Hw.inherits(lo,Jw);lo.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};lo.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};lo.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=Ww,this._overflow?this._write(this._overflow,void 0,t):t()}};lo.prototype._write=function(t,e,n){if(!this._destroyed){var i=this._stream,a=this._buffer,r=this._missing;if(t.length&&(this._partial=!0),t.lengthr&&(o=t.slice(r),t=t.slice(0,r)),i?i.end(t):a.append(t),this._overflow=o,this._onparse()}};lo.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};Kw.exports=lo});var Zw=oe((ike,Xw)=>{Xw.exports=Ee("fs").constants||Ee("constants")});var e3=oe((ake,$w)=>{$w.exports=Qw;function Qw(t,e){if(t&&e)return Qw(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(i){n[i]=t[i]}),n;function n(){for(var i=new Array(arguments.length),a=0;a{var t3=e3();E_.exports=t3(Yp);E_.exports.strict=t3(n3);Yp.proto=Yp(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return Yp(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return n3(this)},configurable:!0})});function Yp(t){var e=s(function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))},"f");return e.called=!1,e}s(Yp,"once");function n3(t){var e=s(function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},"f"),n=t.name||"Function wrapped with `once`";return e.onceError=n+" shouldn't be called more than once",e.called=!1,e}s(n3,"onceStrict")});var j_=oe((lke,a3)=>{var Hue=k_(),Jue=s(function(){},"noop"),Gue=s(function(t){return t.setHeader&&typeof t.abort=="function"},"isRequest"),Wue=s(function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},"isChildProcess"),i3=s(function(t,e,n){if(typeof e=="function")return i3(t,null,e);e||(e={}),n=Hue(n||Jue);var i=t._writableState,a=t._readableState,r=e.readable||e.readable!==!1&&t.readable,o=e.writable||e.writable!==!1&&t.writable,l=!1,c=s(function(){t.writable||d()},"onlegacyfinish"),d=s(function(){o=!1,r||n.call(t)},"onfinish"),u=s(function(){r=!1,o||n.call(t)},"onend"),p=s(function(_){n.call(t,_?new Error("exited with error code: "+_):null)},"onexit"),m=s(function(_){n.call(t,_)},"onerror"),f=s(function(){process.nextTick(g)},"onclose"),g=s(function(){if(!l){if(r&&!(a&&a.ended&&!a.destroyed))return n.call(t,new Error("premature close"));if(o&&!(i&&i.ended&&!i.destroyed))return n.call(t,new Error("premature close"))}},"onclosenexttick"),x=s(function(){t.req.on("finish",d)},"onrequest");return Gue(t)?(t.on("complete",d),t.on("abort",f),t.req?x():t.on("request",x)):o&&!i&&(t.on("end",c),t.on("close",c)),Wue(t)&&t.on("exit",p),t.on("end",u),t.on("finish",d),e.error!==!1&&t.on("error",m),t.on("close",f),function(){l=!0,t.removeListener("complete",d),t.removeListener("abort",f),t.removeListener("request",x),t.req&&t.req.removeListener("finish",d),t.removeListener("end",c),t.removeListener("close",c),t.removeListener("finish",d),t.removeListener("exit",p),t.removeListener("end",u),t.removeListener("error",m),t.removeListener("close",f)}},"eos");a3.exports=i3});var c3=oe((uke,l3)=>{var ql=Zw(),r3=j_(),Zp=Ee("util"),Kue=b_(),Yue=v_(),o3=Os().Readable,Hl=Os().Writable,Xue=Ee("string_decoder").StringDecoder,Xp=w_(),Zue=parseInt("755",8),Que=parseInt("644",8),s3=Kue(1024),T_=s(function(){},"noop"),A_=s(function(t,e){e&=511,e&&t.push(s3.slice(0,512-e))},"overflow");function $ue(t){switch(t&ql.S_IFMT){case ql.S_IFBLK:return"block-device";case ql.S_IFCHR:return"character-device";case ql.S_IFDIR:return"directory";case ql.S_IFIFO:return"fifo";case ql.S_IFLNK:return"symlink"}return"file"}s($ue,"modeToType");var Qp=s(function(t){Hl.call(this),this.written=0,this._to=t,this._destroyed=!1},"Sink");Zp.inherits(Qp,Hl);Qp.prototype._write=function(t,e,n){if(this.written+=t.length,this._to.push(t))return n();this._to._drain=n};Qp.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var $p=s(function(){Hl.call(this),this.linkname="",this._decoder=new Xue("utf-8"),this._destroyed=!1},"LinkSink");Zp.inherits($p,Hl);$p.prototype._write=function(t,e,n){this.linkname+=this._decoder.write(t),n()};$p.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var yu=s(function(){Hl.call(this),this._destroyed=!1},"Void");Zp.inherits(yu,Hl);yu.prototype._write=function(t,e,n){n(new Error("No body allowed for this entry"))};yu.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var _r=s(function(t){if(!(this instanceof _r))return new _r(t);o3.call(this,t),this._drain=T_,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null},"Pack");Zp.inherits(_r,o3);_r.prototype.entry=function(t,e,n){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(n=e,e=null),n||(n=T_);var i=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=$ue(t.mode)),t.mode||(t.mode=t.type==="directory"?Zue:Que),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Yue(e)),Buffer.isBuffer(e))return t.size=e.length,this._encode(t),this.push(e),A_(i,t.size),process.nextTick(n),new yu;if(t.type==="symlink"&&!t.linkname){var a=new $p;return r3(a,function(o){if(o)return i.destroy(),n(o);t.linkname=a.linkname,i._encode(t),n()}),a}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(n),new yu;var r=new Qp(this);return this._stream=r,r3(r,function(o){if(i._stream=null,o)return i.destroy(),n(o);if(r.written!==t.size)return i.destroy(),n(new Error("size mismatch"));A_(i,t.size),i._finalizing&&i.finalize(),n()}),r}};_r.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(s3),this.push(null))};_r.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};_r.prototype._encode=function(t){if(!t.pax){var e=Xp.encode(t);if(e){this.push(e);return}}this._encodePax(t)};_r.prototype._encodePax=function(t){var e=Xp.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),n={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(Xp.encode(n)),this.push(e),A_(this,e.length),n.size=t.size,n.type=t.type,this.push(Xp.encode(n))};_r.prototype._read=function(t){var e=this._drain;this._drain=T_,e()};l3.exports=_r});var u3=oe(C_=>{C_.extract=Yw();C_.pack=c3()});var em=oe((mke,p3)=>{"use strict";var d3=Wg(),ede=Fp(),tde=u3();p3.exports=()=>t=>{if(!Buffer.isBuffer(t)&&!ede(t))return Promise.reject(new TypeError(`Expected a Buffer or Stream, got ${typeof t}`));if(Buffer.isBuffer(t)&&(!d3(t)||d3(t).ext!=="tar"))return Promise.resolve([]);let e=tde.extract(),n=[];e.on("entry",(a,r,o)=>{let l=[];r.on("data",c=>l.push(c)),r.on("end",()=>{let c={data:Buffer.concat(l),mode:a.mode,mtime:a.mtime,path:a.name,type:a.type};(a.type==="symlink"||a.type==="link")&&(c.linkname=a.linkname),n.push(c),o()})});let i=new Promise((a,r)=>{Buffer.isBuffer(t)||t.on("error",r),e.on("finish",()=>a(n)),e.on("error",r)});return e.then=i.then.bind(i),e.catch=i.catch.bind(i),Buffer.isBuffer(t)?e.end(t):t.pipe(e),e}});var f3=oe((fke,m3)=>{"use strict";var Jl=s(t=>Array.from(t).map(e=>e.charCodeAt(0)),"toBytes"),nde=Jl("META-INF/mozilla.rsa"),ide=Jl("[Content_Types].xml"),ade=Jl("_rels/.rels");m3.exports=t=>{let e=new Uint8Array(t);if(!(e&&e.length>1))return null;let n=s((i,a)=>{a=Object.assign({offset:0},a);for(let r=0;ro.findIndex((l,c,d)=>d[c]===80&&d[c+1]===75&&d[c+2]===3&&d[c+3]===4),"nextZipHeaderIndex"),r=a(i);if(r!==-1){let o=e.subarray(r+8,r+8+1e3),l=a(o);if(l!==-1){let c=8+r+l+30;if(n(Jl("word/"),{offset:c}))return{ext:"docx",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};if(n(Jl("ppt/"),{offset:c}))return{ext:"pptx",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"};if(n(Jl("xl/"),{offset:c}))return{ext:"xlsx",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}}}}}if(n([80,75])&&(e[2]===3||e[2]===5||e[2]===7)&&(e[3]===4||e[3]===6||e[3]===8))return{ext:"zip",mime:"application/zip"};if(n([117,115,116,97,114],{offset:257}))return{ext:"tar",mime:"application/x-tar"};if(n([82,97,114,33,26,7])&&(e[6]===0||e[6]===1))return{ext:"rar",mime:"application/x-rar-compressed"};if(n([31,139,8]))return{ext:"gz",mime:"application/gzip"};if(n([66,90,104]))return{ext:"bz2",mime:"application/x-bzip2"};if(n([55,122,188,175,39,28]))return{ext:"7z",mime:"application/x-7z-compressed"};if(n([120,1]))return{ext:"dmg",mime:"application/x-apple-diskimage"};if(n([51,103,112,53])||n([0,0,0])&&n([102,116,121,112],{offset:4})&&(n([109,112,52,49],{offset:8})||n([109,112,52,50],{offset:8})||n([105,115,111,109],{offset:8})||n([105,115,111,50],{offset:8})||n([109,109,112,52],{offset:8})||n([77,52,86],{offset:8})||n([100,97,115,104],{offset:8})))return{ext:"mp4",mime:"video/mp4"};if(n([77,84,104,100]))return{ext:"mid",mime:"audio/midi"};if(n([26,69,223,163])){let i=e.subarray(4,4100),a=i.findIndex((r,o,l)=>l[o]===66&&l[o+1]===130);if(a!==-1){let r=a+3,o=s(l=>Array.from(l).every((c,d)=>i[r+d]===c.charCodeAt(0)),"findDocType");if(o("matroska"))return{ext:"mkv",mime:"video/x-matroska"};if(o("webm"))return{ext:"webm",mime:"video/webm"}}}if(n([0,0,0,20,102,116,121,112,113,116,32,32])||n([102,114,101,101],{offset:4})||n([102,116,121,112,113,116,32,32],{offset:4})||n([109,100,97,116],{offset:4})||n([119,105,100,101],{offset:4}))return{ext:"mov",mime:"video/quicktime"};if(n([82,73,70,70])&&n([65,86,73],{offset:8}))return{ext:"avi",mime:"video/x-msvideo"};if(n([48,38,178,117,142,102,207,17,166,217]))return{ext:"wmv",mime:"video/x-ms-wmv"};if(n([0,0,1,186]))return{ext:"mpg",mime:"video/mpeg"};for(let i=0;i<2&&i{var h3=[0,1,3,7,15,31,63,127,255],wu=s(function(t){this.stream=t,this.bitOffset=0,this.curByte=0,this.hasByte=!1},"BitReader");wu.prototype._ensureByte=function(){this.hasByte||(this.curByte=this.stream.readByte(),this.hasByte=!0)};wu.prototype.read=function(t){for(var e=0;t>0;){this._ensureByte();var n=8-this.bitOffset;if(t>=n)e<<=n,e|=h3[n]&this.curByte,this.hasByte=!1,this.bitOffset=0,t-=n;else{e<<=t;var i=n-t;e|=(this.curByte&h3[t]<>i,this.bitOffset+=t,t=0}}return e};wu.prototype.seek=function(t){var e=t%8,n=(t-e)/8;this.bitOffset=e,this.stream.seek(n),this.hasByte=!1};wu.prototype.pi=function(){var t=new Buffer(6),e;for(e=0;e{var Is=s(function(){},"Stream");Is.prototype.readByte=function(){throw new Error("abstract method readByte() not implemented")};Is.prototype.read=function(t,e,n){for(var i=0;i{b3.exports=function(){var t=new Uint32Array([0,79764919,159529838,222504665,319059676,398814059,445009330,507990021,638119352,583659535,797628118,726387553,890018660,835552979,1015980042,944750013,1276238704,1221641927,1167319070,1095957929,1595256236,1540665371,1452775106,1381403509,1780037320,1859660671,1671105958,1733955601,2031960084,2111593891,1889500026,1952343757,2552477408,2632100695,2443283854,2506133561,2334638140,2414271883,2191915858,2254759653,3190512472,3135915759,3081330742,3009969537,2905550212,2850959411,2762807018,2691435357,3560074640,3505614887,3719321342,3648080713,3342211916,3287746299,3467911202,3396681109,4063920168,4143685023,4223187782,4286162673,3779000052,3858754371,3904687514,3967668269,881225847,809987520,1023691545,969234094,662832811,591600412,771767749,717299826,311336399,374308984,453813921,533576470,25881363,88864420,134795389,214552010,2023205639,2086057648,1897238633,1976864222,1804852699,1867694188,1645340341,1724971778,1587496639,1516133128,1461550545,1406951526,1302016099,1230646740,1142491917,1087903418,2896545431,2825181984,2770861561,2716262478,3215044683,3143675388,3055782693,3001194130,2326604591,2389456536,2200899649,2280525302,2578013683,2640855108,2418763421,2498394922,3769900519,3832873040,3912640137,3992402750,4088425275,4151408268,4197601365,4277358050,3334271071,3263032808,3476998961,3422541446,3585640067,3514407732,3694837229,3640369242,1762451694,1842216281,1619975040,1682949687,2047383090,2127137669,1938468188,2001449195,1325665622,1271206113,1183200824,1111960463,1543535498,1489069629,1434599652,1363369299,622672798,568075817,748617968,677256519,907627842,853037301,1067152940,995781531,51762726,131386257,177728840,240578815,269590778,349224269,429104020,491947555,4046411278,4126034873,4172115296,4234965207,3794477266,3874110821,3953728444,4016571915,3609705398,3555108353,3735388376,3664026991,3290680682,3236090077,3449943556,3378572211,3174993278,3120533705,3032266256,2961025959,2923101090,2868635157,2813903052,2742672763,2604032198,2683796849,2461293480,2524268063,2284983834,2364738477,2175806836,2238787779,1569362073,1498123566,1409854455,1355396672,1317987909,1246755826,1192025387,1137557660,2072149281,2135122070,1912620623,1992383480,1753615357,1816598090,1627664531,1707420964,295390185,358241886,404320391,483945776,43990325,106832002,186451547,266083308,932423249,861060070,1041341759,986742920,613929101,542559546,756411363,701822548,3316196985,3244833742,3425377559,3370778784,3601682597,3530312978,3744426955,3689838204,3819031489,3881883254,3928223919,4007849240,4037393693,4100235434,4180117107,4259748804,2310601993,2373574846,2151335527,2231098320,2596047829,2659030626,2470359227,2550115596,2947551409,2876312838,2788305887,2733848168,3165939309,3094707162,3040238851,2985771188]),e=s(function(){var n=4294967295;this.getCRC=function(){return~n>>>0},this.updateCRC=function(i){n=n<<8^t[(n>>>24^i)&255]},this.updateCRCRun=function(i,a){for(;a-- >0;)n=n<<8^t[(n>>>24^i)&255]}},"CRC32");return e}()});var w3=oe((wke,rde)=>{rde.exports={name:"seek-bzip",version:"1.0.6",contributors:["C. Scott Ananian (http://cscott.net)","Eli Skeggs","Kevin Kwok","Rob Landley (http://landley.net)"],description:"a pure-JavaScript Node.JS module for random-access decoding bzip2 data",main:"./lib/index.js",repository:{type:"git",url:"https://github.com/cscott/seek-bzip.git"},license:"MIT",bin:{"seek-bunzip":"./bin/seek-bunzip","seek-table":"./bin/seek-bzip-table"},directories:{test:"test"},dependencies:{commander:"^2.8.1"},devDependencies:{fibers:"~1.0.6",mocha:"~2.2.5"},scripts:{test:"mocha"}}});var O3=oe((Eke,S3)=>{var ode=_3(),Eu=v3(),A3=y3(),T3=w3(),tm=20,E3=258,k3=0,sde=1,lde=2,cde=6,ude=50,dde="314159265359",pde="177245385090",j3=s(function(t,e){var n=t[e],i;for(i=e;i>0;i--)t[i]=t[i-1];return t[0]=n,n},"mtf"),mn={OK:0,LAST_BLOCK:-1,NOT_BZIP_DATA:-2,UNEXPECTED_INPUT_EOF:-3,UNEXPECTED_OUTPUT_EOF:-4,DATA_ERROR:-5,OUT_OF_MEMORY:-6,OBSOLETE_INPUT:-7,END_OF_BLOCK:-8},Po={};Po[mn.LAST_BLOCK]="Bad file checksum";Po[mn.NOT_BZIP_DATA]="Not bzip data";Po[mn.UNEXPECTED_INPUT_EOF]="Unexpected input EOF";Po[mn.UNEXPECTED_OUTPUT_EOF]="Unexpected output EOF";Po[mn.DATA_ERROR]="Data error";Po[mn.OUT_OF_MEMORY]="Out of memory";Po[mn.OBSOLETE_INPUT]="Obsolete (pre 0.9.5) bzip format not supported.";var si=s(function(t,e){var n=Po[t]||"unknown error";e&&(n+=": "+e);var i=new TypeError(n);throw i.errorCode=t,i},"_throw"),Ei=s(function(t,e){this.writePos=this.writeCurrent=this.writeCount=0,this._start_bunzip(t,e)},"Bunzip");Ei.prototype._init_block=function(){var t=this._get_next_block();return t?(this.blockCRC=new A3,!0):(this.writeCount=-1,!1)};Ei.prototype._start_bunzip=function(t,e){var n=new Buffer(4);(t.read(n,0,4)!==4||String.fromCharCode(n[0],n[1],n[2])!=="BZh")&&si(mn.NOT_BZIP_DATA,"bad magic");var i=n[3]-48;(i<1||i>9)&&si(mn.NOT_BZIP_DATA,"level out of range"),this.reader=new ode(t),this.dbufSize=1e5*i,this.nextoutput=0,this.outputStream=e,this.streamCRC=0};Ei.prototype._get_next_block=function(){var t,e,n,i=this.reader,a=i.pi();if(a===pde)return!1;a!==dde&&si(mn.NOT_BZIP_DATA),this.targetBlockCRC=i.read(32)>>>0,this.streamCRC=(this.targetBlockCRC^(this.streamCRC<<1|this.streamCRC>>>31))>>>0,i.read(1)&&si(mn.OBSOLETE_INPUT);var r=i.read(24);r>this.dbufSize&&si(mn.DATA_ERROR,"initial position out of bounds");var o=i.read(16),l=new Buffer(256),c=0;for(t=0;t<16;t++)if(o&1<<15-t){var d=t*16;for(n=i.read(16),e=0;e<16;e++)n&1<<15-e&&(l[c++]=d+e)}var u=i.read(3);(ucde)&&si(mn.DATA_ERROR);var p=i.read(15);p===0&&si(mn.DATA_ERROR);var m=new Buffer(256);for(t=0;t=u&&si(mn.DATA_ERROR);f[t]=j3(m,e)}var g=c+2,x=[],_;for(e=0;etm)&&si(mn.DATA_ERROR),!!i.read(1);)i.read(1)?o--:o++;h[t]=o}var b,y;for(b=y=h[0],t=1;ty?y=h[t]:h[t]=p&&si(mn.DATA_ERROR),_=x[f[k++]]),t=_.minLen,e=i.read(t);t>_.maxLen&&si(mn.DATA_ERROR),!(e<=_.limit[t]);t++)e=e<<1|i.read(1);e-=_.base[t],(e<0||e>=E3)&&si(mn.DATA_ERROR);var B=_.permute[e];if(B===k3||B===sde){F||(F=1,o=0),B===k3?o+=F:o+=2*F,F<<=1;continue}if(F)for(F=0,N+o>this.dbufSize&&si(mn.DATA_ERROR),R=l[m[0]],S[R]+=o;o--;)D[N++]=R;if(B>c)break;N>=this.dbufSize&&si(mn.DATA_ERROR),t=B-1,R=j3(m,t),R=l[R],S[R]++,D[N++]=R}for((r<0||r>=N)&&si(mn.DATA_ERROR),e=0,t=0;t<256;t++)n=e+S[t],S[t]=e,e=n;for(t=0;t>=8,W=-1),this.writePos=q,this.writeCurrent=G,this.writeCount=N,this.writeRun=W,!0};Ei.prototype._read_bunzip=function(t,e){var n,i,a;if(this.writeCount<0)return 0;for(var r=0,o=this.dbuf,l=this.writePos,c=this.writeCurrent,d=this.writeCount,u=this.outputsize,p=this.writeRun;d;){for(d--,i=c,l=o[l],c=l&255,l>>=8,p++===3?(n=c,a=i,c=-1):(n=1,a=c),this.blockCRC.updateCRCRun(a,n);n--;)this.outputStream.writeByte(a),this.nextoutput++;c!=i&&(p=0)}return this.writeCount=d,this.blockCRC.getCRC()!==this.targetBlockCRC&&si(mn.DATA_ERROR,"Bad block CRC (got "+this.blockCRC.getCRC().toString(16)+" expected "+this.targetBlockCRC.toString(16)+")"),this.nextoutput};var S_=s(function(t){if("readByte"in t)return t;var e=new Eu;return e.pos=0,e.readByte=function(){return t[this.pos++]},e.seek=function(n){this.pos=n},e.eof=function(){return this.pos>=t.length},e},"coerceInputStream"),C3=s(function(t){var e=new Eu,n=!0;if(t)if(typeof t=="number")e.buffer=new Buffer(t),n=!1;else{if("writeByte"in t)return t;e.buffer=t,n=!1}else e.buffer=new Buffer(16384);return e.pos=0,e.writeByte=function(i){if(n&&this.pos>=this.buffer.length){var a=new Buffer(this.buffer.length*2);this.buffer.copy(a),this.buffer=a}this.buffer[this.pos++]=i},e.getBuffer=function(){if(this.pos!==this.buffer.length){if(!n)throw new TypeError("outputsize does not match decoded input");var i=new Buffer(this.pos);this.buffer.copy(i,0,0,this.pos),this.buffer=i}return this.buffer},e._coerced=!0,e},"coerceOutputStream");Ei.Err=mn;Ei.decode=function(t,e,n){for(var i=S_(t),a=C3(e),r=new Ei(i,a);!("eof"in i&&i.eof());)if(r._init_block())r._read_bunzip();else{var o=r.reader.read(32)>>>0;if(o!==r.streamCRC&&si(mn.DATA_ERROR,"Bad stream CRC (got "+r.streamCRC.toString(16)+" expected "+o.toString(16)+")"),n&&"eof"in i&&!i.eof())r._start_bunzip(i,a);else break}if("getBuffer"in a)return a.getBuffer()};Ei.decodeBlock=function(t,e,n){var i=S_(t),a=C3(n),r=new Ei(i,a);r.reader.seek(e);var o=r._get_next_block();if(o&&(r.blockCRC=new A3,r.writeCopies=0,r._read_bunzip()),"getBuffer"in a)return a.getBuffer()};Ei.table=function(t,e,n){var i=new Eu;i.delegate=S_(t),i.pos=0,i.readByte=function(){return this.pos++,this.delegate.readByte()},i.delegate.eof&&(i.eof=i.delegate.eof.bind(i.delegate));var a=new Eu;a.pos=0,a.writeByte=function(){this.pos++};for(var r=new Ei(i,a),o=r.dbufSize;!("eof"in i&&i.eof());){var l=i.pos*8+r.reader.bitOffset;if(r.reader.hasByte&&(l-=8),r._init_block()){var c=a.pos;r._read_bunzip(),e(l,a.pos-c)}else{var d=r.reader.read(32);if(n&&"eof"in i&&!i.eof())r._start_bunzip(i,a),console.assert(r.dbufSize===o,"shouldn't change block size within multistream file");else break}}};Ei.Stream=Eu;Ei.version=T3.version;Ei.license=T3.license;S3.exports=Ei});var F3=oe((I3,D3)=>{var mde=Ee("stream");I3=D3.exports=O_;O_.through=O_;function O_(t,e,n){t=t||function(u){this.queue(u)},e=e||function(){this.queue(null)};var i=!1,a=!1,r=[],o=!1,l=new mde;l.readable=l.writable=!0,l.paused=!1,l.autoDestroy=!(n&&n.autoDestroy===!1),l.write=function(u){return t.call(this,u),!l.paused};function c(){for(;r.length&&!l.paused;){var u=r.shift();if(u===null)return l.emit("end");l.emit("data",u)}}s(c,"drain"),l.queue=l.push=function(u){return o||(u===null&&(o=!0),r.push(u),c()),l},l.on("end",function(){l.readable=!1,!l.writable&&l.autoDestroy&&process.nextTick(function(){l.destroy()})});function d(){l.writable=!1,e.call(l),!l.readable&&l.autoDestroy&&l.destroy()}return s(d,"_end"),l.end=function(u){if(!i)return i=!0,arguments.length&&l.write(u),d(),l},l.destroy=function(){if(!a)return a=!0,i=!0,r.length=0,l.writable=l.readable=!1,l.emit("close"),l},l.pause=function(){if(!l.paused)return l.paused=!0,l},l.resume=function(){return l.paused&&(l.paused=!1,l.emit("resume")),c(),l.paused||l.emit("drain"),l},l}s(O_,"through")});var R3=oe((Ake,N3)=>{function I_(t){this.name="Bzip2Error",this.message=t,this.stack=new Error().stack}s(I_,"Bzip2Error");I_.prototype=new Error;var li={Error:function(t){throw new I_(t)}},xr={};xr.Bzip2Error=I_;xr.crcTable=[0,79764919,159529838,222504665,319059676,398814059,445009330,507990021,638119352,583659535,797628118,726387553,890018660,835552979,1015980042,944750013,1276238704,1221641927,1167319070,1095957929,1595256236,1540665371,1452775106,1381403509,1780037320,1859660671,1671105958,1733955601,2031960084,2111593891,1889500026,1952343757,2552477408,2632100695,2443283854,2506133561,2334638140,2414271883,2191915858,2254759653,3190512472,3135915759,3081330742,3009969537,2905550212,2850959411,2762807018,2691435357,3560074640,3505614887,3719321342,3648080713,3342211916,3287746299,3467911202,3396681109,4063920168,4143685023,4223187782,4286162673,3779000052,3858754371,3904687514,3967668269,881225847,809987520,1023691545,969234094,662832811,591600412,771767749,717299826,311336399,374308984,453813921,533576470,25881363,88864420,134795389,214552010,2023205639,2086057648,1897238633,1976864222,1804852699,1867694188,1645340341,1724971778,1587496639,1516133128,1461550545,1406951526,1302016099,1230646740,1142491917,1087903418,2896545431,2825181984,2770861561,2716262478,3215044683,3143675388,3055782693,3001194130,2326604591,2389456536,2200899649,2280525302,2578013683,2640855108,2418763421,2498394922,3769900519,3832873040,3912640137,3992402750,4088425275,4151408268,4197601365,4277358050,3334271071,3263032808,3476998961,3422541446,3585640067,3514407732,3694837229,3640369242,1762451694,1842216281,1619975040,1682949687,2047383090,2127137669,1938468188,2001449195,1325665622,1271206113,1183200824,1111960463,1543535498,1489069629,1434599652,1363369299,622672798,568075817,748617968,677256519,907627842,853037301,1067152940,995781531,51762726,131386257,177728840,240578815,269590778,349224269,429104020,491947555,4046411278,4126034873,4172115296,4234965207,3794477266,3874110821,3953728444,4016571915,3609705398,3555108353,3735388376,3664026991,3290680682,3236090077,3449943556,3378572211,3174993278,3120533705,3032266256,2961025959,2923101090,2868635157,2813903052,2742672763,2604032198,2683796849,2461293480,2524268063,2284983834,2364738477,2175806836,2238787779,1569362073,1498123566,1409854455,1355396672,1317987909,1246755826,1192025387,1137557660,2072149281,2135122070,1912620623,1992383480,1753615357,1816598090,1627664531,1707420964,295390185,358241886,404320391,483945776,43990325,106832002,186451547,266083308,932423249,861060070,1041341759,986742920,613929101,542559546,756411363,701822548,3316196985,3244833742,3425377559,3370778784,3601682597,3530312978,3744426955,3689838204,3819031489,3881883254,3928223919,4007849240,4037393693,4100235434,4180117107,4259748804,2310601993,2373574846,2151335527,2231098320,2596047829,2659030626,2470359227,2550115596,2947551409,2876312838,2788305887,2733848168,3165939309,3094707162,3040238851,2985771188];xr.array=function(t){var e=0,n=0,i=[0,1,3,7,15,31,63,127,255];return function(a){for(var r=0;a>0;){var o=8-e;a>=o?(r<<=o,r|=i[o]&t[n++],e=0,a-=o):(r<<=a,r|=(t[n]&i[a]<<8-a-e)>>8-a-e,e+=a,a=0)}return r}};xr.simple=function(t,e){var n=xr.array(t),i=xr.header(n),a=!1,r=1e5*i,o=new Int32Array(r);do a=xr.decompress(n,e,o,r);while(!a)};xr.header=function(t){this.byteCount=new Int32Array(256),this.symToByte=new Uint8Array(256),this.mtfSymbol=new Int32Array(256),this.selectors=new Uint8Array(32768),t(8*3)!=4348520&&li.Error("No magic number found");var e=t(8)-48;return(e<1||e>9)&&li.Error("Not a BZIP archive"),e};xr.decompress=function(t,e,n,i,a){for(var r=20,o=258,l=0,c=1,d=50,u=-1,p="",m=0;m<6;m++)p+=t(8).toString(16);if(p=="177245385090"){var f=t(32)|0;return f!==a&&li.Error("Error in bzip2: crc32 do not match"),t(null),null}p!="314159265359"&&li.Error("eek not valid bzip data");var g=t(32)|0;t(1)&&li.Error("unsupported obsolete version");var x=t(24);x>i&&li.Error("Initial position larger than buffer size");var _=t(16),h=0;for(m=0;m<16;m++)if(_&1<<15-m){var v=t(16);for(Q=0;Q<16;Q++)v&1<<15-Q&&(this.symToByte[h++]=16*m+Q)}var b=t(3);(b<2||b>6)&&li.Error("another error");var y=t(15);y==0&&li.Error("meh");for(var m=0;m=b&&li.Error("whoops another error");for(var w=this.mtfSymbol[Q],v=Q-1;v>=0;v--)this.mtfSymbol[v+1]=this.mtfSymbol[v];this.mtfSymbol[0]=w,this.selectors[m]=w}for(var Z=h+2,S=[],F=new Uint8Array(o),N=new Uint16Array(r+1),k,Q=0;Qr)&&li.Error("I gave up a while ago on writing error messages"),!!t(1);)t(1)?_--:_++;F[m]=_}var R,D;R=D=F[0];for(var m=1;mD?D=F[m]:F[m]=y&&li.Error("meow i'm a kitty, that's an error"),k=S[this.selectors[me++]],B=k.base,q=k.limit),m=k.minLen,Q=t(m);m>k.maxLen&&li.Error("rawr i'm a dinosaur"),!(Q<=q[m]);)m++,Q=Q<<1|t(1);Q-=B[m],(Q<0||Q>=o)&&li.Error("moo i'm a cow");var X=k.permute[Q];if(X==l||X==c){W||(W=1,_=0),X==l?_+=W:_+=2*W,W<<=1;continue}if(W)for(W=0,ee+_>i&&li.Error("Boom."),w=this.symToByte[this.mtfSymbol[0]],this.byteCount[w]+=_;_--;)n[ee++]=w;if(X>h)break;ee>=i&&li.Error("I can't think of anything. Error"),m=X-1,w=this.mtfSymbol[m];for(var v=m-1;v>=0;v--)this.mtfSymbol[v+1]=this.mtfSymbol[v];this.mtfSymbol[0]=w,w=this.symToByte[w],this.byteCount[w]++,n[ee++]=w}(x<0||x>=ee)&&li.Error("I'm a monkey and I'm throwing something at someone, namely you");for(var Q=0,m=0;m<256;m++)v=Q+this.byteCount[m],this.byteCount[m]=Q,Q=v;for(var m=0;m>=8,le=-1),ee=ee;for(var ge,V,H;ee;){for(ee--,V=Ie,he=n[he],Ie=he&255,he>>=8,le++==3?(ge=Ie,H=V,Ie=-1):(ge=1,H=Ie);ge--;)u=(u<<8^this.crcTable[(u>>24^H)&255])&4294967295,e(H);Ie!=V&&(le=0)}return u=(u^-1)>>>0,(u|0)!=(g|0)&&li.Error("Error in bzip2: crc32 do not match"),a=(u^(a<<1|a>>>31))&4294967295,a};N3.exports=xr});var P3=oe((Cke,B3)=>{var M3=[0,1,3,7,15,31,63,127,255];B3.exports=s(function(e){var n=0,i=0,a=e(),r=s(function(o){if(o===null&&n!=0){n=0,i++;return}for(var l=0;o>0;){i>=a.length&&(i=0,a=e());var c=8-n;n===0&&o>0&&r.bytesRead++,o>=c?(l<<=c,l|=M3[c]&a[i++],n=0,o-=c):(l<<=o,l|=(a[i]&M3[o]<<8-o-n)>>8-o-n,n+=o,o=0)}return l},"f");return r.bytesRead=0,r},"bitIterator")});var z3=oe((Oke,V3)=>{var fde=F3(),L3=R3(),hde=P3();V3.exports=gde;function gde(){var t=[],e=0,n=0,i=!1,a=!1,r=null,o=null;function l(u){if(n){var p=1e5*n,m=new Int32Array(p),f=[],g=s(function(x){f.push(x)},"f");return o=L3.decompress(r,g,m,p,o),o===null?(n=0,!1):(u(Buffer.from(f)),!0)}else return n=L3.header(r),o=0,!0}s(l,"decompressBlock");var c=0;function d(u){if(!i)try{return l(function(p){u.queue(p),p!==null&&(c+=p.length)})}catch(p){return u.emit("error",p),i=!0,!1}}return s(d,"decompressAndQueue"),fde(s(function(p){for(t.push(p),e+=p.length,r===null&&(r=hde(function(){return t.shift()}));!i&&e-r.bytesRead+1>=(25e3+1e5*n||4);)d(this)},"write"),s(function(p){for(;!i&&r&&e>r.bytesRead;)d(this);i||(o!==null&&this.emit("error",new Error("input stream ended prematurely")),this.queue(null))},"end"))}s(gde,"unbzip2Stream")});var J3=oe((Dke,H3)=>{"use strict";var U3=em(),q3=f3(),_de=Fp(),xde=O3(),vde=z3();H3.exports=()=>t=>!Buffer.isBuffer(t)&&!_de(t)?Promise.reject(new TypeError(`Expected a Buffer or Stream, got ${typeof t}`)):Buffer.isBuffer(t)&&(!q3(t)||q3(t).ext!=="bz2")?Promise.resolve([]):Buffer.isBuffer(t)?U3()(xde.decode(t)):U3()(t.pipe(vde()))});var K3=oe((Fke,W3)=>{"use strict";var bde=Ee("zlib"),yde=em(),G3=Wg(),wde=Fp();W3.exports=()=>t=>{if(!Buffer.isBuffer(t)&&!wde(t))return Promise.reject(new TypeError(`Expected a Buffer or Stream, got ${typeof t}`));if(Buffer.isBuffer(t)&&(!G3(t)||G3(t).ext!=="gz"))return Promise.resolve([]);let e=bde.createGunzip(),n=yde()(e);return Buffer.isBuffer(t)?e.end(t):t.pipe(e),n}});var X3=oe((Nke,Y3)=>{"use strict";Y3.exports=function(t){return t&&t.length>1?t[0]===255&&t[1]===216&&t[2]===255?{ext:"jpg",mime:"image/jpeg"}:t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?{ext:"png",mime:"image/png"}:t[0]===71&&t[1]===73&&t[2]===70?{ext:"gif",mime:"image/gif"}:t[8]===87&&t[9]===69&&t[10]===66&&t[11]===80?{ext:"webp",mime:"image/webp"}:t[0]===70&&t[1]===76&&t[2]===73&&t[3]===70?{ext:"flif",mime:"image/flif"}:(t[0]===73&&t[1]===73&&t[2]===42&&t[3]===0||t[0]===77&&t[1]===77&&t[2]===0&&t[3]===42)&&t[8]===67&&t[9]===82?{ext:"cr2",mime:"image/x-canon-cr2"}:t[0]===73&&t[1]===73&&t[2]===42&&t[3]===0||t[0]===77&&t[1]===77&&t[2]===0&&t[3]===42?{ext:"tif",mime:"image/tiff"}:t[0]===66&&t[1]===77?{ext:"bmp",mime:"image/bmp"}:t[0]===73&&t[1]===73&&t[2]===188?{ext:"jxr",mime:"image/vnd.ms-photo"}:t[0]===56&&t[1]===66&&t[2]===80&&t[3]===83?{ext:"psd",mime:"image/vnd.adobe.photoshop"}:t[0]===80&&t[1]===75&&t[2]===3&&t[3]===4&&t[30]===109&&t[31]===105&&t[32]===109&&t[33]===101&&t[34]===116&&t[35]===121&&t[36]===112&&t[37]===101&&t[38]===97&&t[39]===112&&t[40]===112&&t[41]===108&&t[42]===105&&t[43]===99&&t[44]===97&&t[45]===116&&t[46]===105&&t[47]===111&&t[48]===110&&t[49]===47&&t[50]===101&&t[51]===112&&t[52]===117&&t[53]===98&&t[54]===43&&t[55]===122&&t[56]===105&&t[57]===112?{ext:"epub",mime:"application/epub+zip"}:t[0]===80&&t[1]===75&&t[2]===3&&t[3]===4&&t[30]===77&&t[31]===69&&t[32]===84&&t[33]===65&&t[34]===45&&t[35]===73&&t[36]===78&&t[37]===70&&t[38]===47&&t[39]===109&&t[40]===111&&t[41]===122&&t[42]===105&&t[43]===108&&t[44]===108&&t[45]===97&&t[46]===46&&t[47]===114&&t[48]===115&&t[49]===97?{ext:"xpi",mime:"application/x-xpinstall"}:t[0]===80&&t[1]===75&&(t[2]===3||t[2]===5||t[2]===7)&&(t[3]===4||t[3]===6||t[3]===8)?{ext:"zip",mime:"application/zip"}:t[257]===117&&t[258]===115&&t[259]===116&&t[260]===97&&t[261]===114?{ext:"tar",mime:"application/x-tar"}:t[0]===82&&t[1]===97&&t[2]===114&&t[3]===33&&t[4]===26&&t[5]===7&&(t[6]===0||t[6]===1)?{ext:"rar",mime:"application/x-rar-compressed"}:t[0]===31&&t[1]===139&&t[2]===8?{ext:"gz",mime:"application/gzip"}:t[0]===66&&t[1]===90&&t[2]===104?{ext:"bz2",mime:"application/x-bzip2"}:t[0]===55&&t[1]===122&&t[2]===188&&t[3]===175&&t[4]===39&&t[5]===28?{ext:"7z",mime:"application/x-7z-compressed"}:t[0]===120&&t[1]===1?{ext:"dmg",mime:"application/x-apple-diskimage"}:t[0]===0&&t[1]===0&&t[2]===0&&(t[3]===24||t[3]===32)&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112||t[0]===51&&t[1]===103&&t[2]===112&&t[3]===53||t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===109&&t[9]===112&&t[10]===52&&t[11]===50&&t[16]===109&&t[17]===112&&t[18]===52&&t[19]===49&&t[20]===109&&t[21]===112&&t[22]===52&&t[23]===50&&t[24]===105&&t[25]===115&&t[26]===111&&t[27]===109||t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===105&&t[9]===115&&t[10]===111&&t[11]===109||t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===109&&t[9]===112&&t[10]===52&&t[11]===50&&t[12]===0&&t[13]===0&&t[14]===0&&t[15]===0?{ext:"mp4",mime:"video/mp4"}:t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===77&&t[9]===52&&t[10]===86?{ext:"m4v",mime:"video/x-m4v"}:t[0]===77&&t[1]===84&&t[2]===104&&t[3]===100?{ext:"mid",mime:"audio/midi"}:t[31]===109&&t[32]===97&&t[33]===116&&t[34]===114&&t[35]===111&&t[36]===115&&t[37]===107&&t[38]===97?{ext:"mkv",mime:"video/x-matroska"}:t[0]===26&&t[1]===69&&t[2]===223&&t[3]===163?{ext:"webm",mime:"video/webm"}:t[0]===0&&t[1]===0&&t[2]===0&&t[3]===20&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112?{ext:"mov",mime:"video/quicktime"}:t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===65&&t[9]===86&&t[10]===73?{ext:"avi",mime:"video/x-msvideo"}:t[0]===48&&t[1]===38&&t[2]===178&&t[3]===117&&t[4]===142&&t[5]===102&&t[6]===207&&t[7]===17&&t[8]===166&&t[9]===217?{ext:"wmv",mime:"video/x-ms-wmv"}:t[0]===0&&t[1]===0&&t[2]===1&&t[3].toString(16)[0]==="b"?{ext:"mpg",mime:"video/mpeg"}:t[0]===73&&t[1]===68&&t[2]===51||t[0]===255&&t[1]===251?{ext:"mp3",mime:"audio/mpeg"}:t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===77&&t[9]===52&&t[10]===65||t[0]===77&&t[1]===52&&t[2]===65&&t[3]===32?{ext:"m4a",mime:"audio/m4a"}:t[28]===79&&t[29]===112&&t[30]===117&&t[31]===115&&t[32]===72&&t[33]===101&&t[34]===97&&t[35]===100?{ext:"opus",mime:"audio/opus"}:t[0]===79&&t[1]===103&&t[2]===103&&t[3]===83?{ext:"ogg",mime:"audio/ogg"}:t[0]===102&&t[1]===76&&t[2]===97&&t[3]===67?{ext:"flac",mime:"audio/x-flac"}:t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===87&&t[9]===65&&t[10]===86&&t[11]===69?{ext:"wav",mime:"audio/x-wav"}:t[0]===35&&t[1]===33&&t[2]===65&&t[3]===77&&t[4]===82&&t[5]===10?{ext:"amr",mime:"audio/amr"}:t[0]===37&&t[1]===80&&t[2]===68&&t[3]===70?{ext:"pdf",mime:"application/pdf"}:t[0]===77&&t[1]===90?{ext:"exe",mime:"application/x-msdownload"}:(t[0]===67||t[0]===70)&&t[1]===87&&t[2]===83?{ext:"swf",mime:"application/x-shockwave-flash"}:t[0]===123&&t[1]===92&&t[2]===114&&t[3]===116&&t[4]===102?{ext:"rtf",mime:"application/rtf"}:t[0]===119&&t[1]===79&&t[2]===70&&t[3]===70&&(t[4]===0&&t[5]===1&&t[6]===0&&t[7]===0||t[4]===79&&t[5]===84&&t[6]===84&&t[7]===79)?{ext:"woff",mime:"application/font-woff"}:t[0]===119&&t[1]===79&&t[2]===70&&t[3]===50&&(t[4]===0&&t[5]===1&&t[6]===0&&t[7]===0||t[4]===79&&t[5]===84&&t[6]===84&&t[7]===79)?{ext:"woff2",mime:"application/font-woff"}:t[34]===76&&t[35]===80&&(t[8]===0&&t[9]===0&&t[10]===1||t[8]===1&&t[9]===0&&t[10]===2||t[8]===2&&t[9]===0&&t[10]===2)?{ext:"eot",mime:"application/octet-stream"}:t[0]===0&&t[1]===1&&t[2]===0&&t[3]===0&&t[4]===0?{ext:"ttf",mime:"application/font-sfnt"}:t[0]===79&&t[1]===84&&t[2]===84&&t[3]===79&&t[4]===0?{ext:"otf",mime:"application/font-sfnt"}:t[0]===0&&t[1]===0&&t[2]===1&&t[3]===0?{ext:"ico",mime:"image/x-icon"}:t[0]===70&&t[1]===76&&t[2]===86&&t[3]===1?{ext:"flv",mime:"video/x-flv"}:t[0]===37&&t[1]===33?{ext:"ps",mime:"application/postscript"}:t[0]===253&&t[1]===55&&t[2]===122&&t[3]===88&&t[4]===90&&t[5]===0?{ext:"xz",mime:"application/x-xz"}:t[0]===83&&t[1]===81&&t[2]===76&&t[3]===105?{ext:"sqlite",mime:"application/x-sqlite3"}:t[0]===78&&t[1]===69&&t[2]===83&&t[3]===26?{ext:"nes",mime:"application/x-nintendo-nes-rom"}:t[0]===67&&t[1]===114&&t[2]===50&&t[3]===52?{ext:"crx",mime:"application/x-google-chrome-extension"}:t[0]===77&&t[1]===83&&t[2]===67&&t[3]===70||t[0]===73&&t[1]===83&&t[2]===99&&t[3]===40?{ext:"cab",mime:"application/vnd.ms-cab-compressed"}:t[0]===33&&t[1]===60&&t[2]===97&&t[3]===114&&t[4]===99&&t[5]===104&&t[6]===62&&t[7]===10&&t[8]===100&&t[9]===101&&t[10]===98&&t[11]===105&&t[12]===97&&t[13]===110&&t[14]===45&&t[15]===98&&t[16]===105&&t[17]===110&&t[18]===97&&t[19]===114&&t[20]===121?{ext:"deb",mime:"application/x-deb"}:t[0]===33&&t[1]===60&&t[2]===97&&t[3]===114&&t[4]===99&&t[5]===104&&t[6]===62?{ext:"ar",mime:"application/x-unix-archive"}:t[0]===237&&t[1]===171&&t[2]===238&&t[3]===219?{ext:"rpm",mime:"application/x-rpm"}:t[0]===31&&t[1]===160||t[0]===31&&t[1]===157?{ext:"Z",mime:"application/x-compress"}:t[0]===76&&t[1]===90&&t[2]===73&&t[3]===80?{ext:"lz",mime:"application/x-lzip"}:t[0]===208&&t[1]===207&&t[2]===17&&t[3]===224&&t[4]===161&&t[5]===177&&t[6]===26&&t[7]===225?{ext:"msi",mime:"application/x-msi"}:null:null}});var a2=oe((Rke,i2)=>{"use strict";var F_="pending",Z3="settled",nm="fulfilled",im="rejected",Ede=s(function(){},"NOOP"),Q3=typeof global<"u"&&typeof global.process<"u"&&typeof global.process.emit=="function",kde=typeof setImmediate>"u"?setTimeout:setImmediate,ku=[],D_;function jde(){for(var t=0;t{"use strict";r2.exports=typeof Promise=="function"?Promise:a2()});var rm=oe((Pke,l2)=>{"use strict";var s2=Object.getOwnPropertySymbols,Ode=Object.prototype.hasOwnProperty,Ide=Object.prototype.propertyIsEnumerable;function Dde(t){if(t==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}s(Dde,"toObject");function Fde(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de",Object.getOwnPropertyNames(t)[0]==="5")return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;var i=Object.getOwnPropertyNames(e).map(function(r){return e[r]});if(i.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(r){a[r]=r}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}s(Fde,"shouldUseNative");l2.exports=Fde()?Object.assign:function(t,e){for(var n,i=Dde(t),a,r=1;r{var Nde=Ee("stream").PassThrough,Rde=rm();c2.exports=function(t){t=Rde({},t);var e=t.array,n=t.encoding,i=n==="buffer",a=!1;e?a=!(n||i):n=n||"utf8",i&&(n=null);var r=0,o=[],l=new Nde({objectMode:a});return n&&l.setEncoding(n),l.on("data",function(c){o.push(c),a?r=o.length:r+=c.length}),l.getBufferedValue=function(){return e?o:i?Buffer.concat(o,r):o.join("")},l.getBufferedLength=function(){return r},l}});var p2=oe((zke,om)=>{"use strict";var d2=o2(),R_=rm(),Mde=u2();function M_(t,e){if(!t)return d2.reject(new Error("Expected a stream"));e=R_({maxBuffer:1/0},e);var n=e.maxBuffer,i,a,r=new d2(function(o,l){i=Mde(e),t.once("error",c),t.pipe(i),i.on("data",function(){i.getBufferedLength()>n&&l(new Error("maxBuffer exceeded"))}),i.once("error",c),i.on("end",o),a=s(function(){t.unpipe&&t.unpipe(i)},"clean");function c(d){d&&(d.bufferedData=i.getBufferedValue()),l(d)}s(c,"error")});return r.then(a,a),r.then(function(){return i.getBufferedValue()})}s(M_,"getStream");om.exports=M_;om.exports.buffer=function(t,e){return M_(t,R_({},e,{encoding:"buffer"}))};om.exports.array=function(t,e){return M_(t,R_({},e,{array:!0}))}});var B_=oe((qke,h2)=>{"use strict";var m2=s(function(t,e,n){return function(){for(var i=this,a=new Array(arguments.length),r=0;r{x2.exports=sm;function sm(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}s(sm,"Pend");sm.prototype.go=function(t){this.pending0&&t.pending{var Au=Ee("fs"),lm=Ee("util"),P_=Ee("stream"),b2=P_.Readable,L_=P_.Writable,Bde=P_.PassThrough,Pde=v2(),cm=Ee("events").EventEmitter;Tu.createFromBuffer=Lde;Tu.createFromFd=Vde;Tu.BufferSlicer=uo;Tu.FdSlicer=co;lm.inherits(co,cm);function co(t,e){e=e||{},cm.call(this),this.fd=t,this.pend=new Pde,this.pend.max=1,this.refCount=0,this.autoClose=!!e.autoClose}s(co,"FdSlicer");co.prototype.read=function(t,e,n,i,a){var r=this;r.pend.go(function(o){Au.read(r.fd,t,e,n,i,function(l,c,d){o(),a(l,c,d)})})};co.prototype.write=function(t,e,n,i,a){var r=this;r.pend.go(function(o){Au.write(r.fd,t,e,n,i,function(l,c,d){o(),a(l,c,d)})})};co.prototype.createReadStream=function(t){return new um(this,t)};co.prototype.createWriteStream=function(t){return new dm(this,t)};co.prototype.ref=function(){this.refCount+=1};co.prototype.unref=function(){var t=this;if(t.refCount-=1,t.refCount>0)return;if(t.refCount<0)throw new Error("invalid unref");t.autoClose&&Au.close(t.fd,e);function e(n){n?t.emit("error",n):t.emit("close")}s(e,"onCloseDone")};lm.inherits(um,b2);function um(t,e){e=e||{},b2.call(this,e),this.context=t,this.context.ref(),this.start=e.start||0,this.endOffset=e.end,this.pos=this.start,this.destroyed=!1}s(um,"ReadStream");um.prototype._read=function(t){var e=this;if(!e.destroyed){var n=Math.min(e._readableState.highWaterMark,t);if(e.endOffset!=null&&(n=Math.min(n,e.endOffset-e.pos)),n<=0){e.destroyed=!0,e.push(null),e.context.unref();return}e.context.pend.go(function(i){if(e.destroyed)return i();var a=new Buffer(n);Au.read(e.context.fd,a,0,n,e.pos,function(r,o){r?e.destroy(r):o===0?(e.destroyed=!0,e.push(null),e.context.unref()):(e.pos+=o,e.push(a.slice(0,o))),i()})})}};um.prototype.destroy=function(t){this.destroyed||(t=t||new Error("stream destroyed"),this.destroyed=!0,this.emit("error",t),this.context.unref())};lm.inherits(dm,L_);function dm(t,e){e=e||{},L_.call(this,e),this.context=t,this.context.ref(),this.start=e.start||0,this.endOffset=e.end==null?1/0:+e.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}s(dm,"WriteStream");dm.prototype._write=function(t,e,n){var i=this;if(!i.destroyed){if(i.pos+t.length>i.endOffset){var a=new Error("maximum file length exceeded");a.code="ETOOBIG",i.destroy(),n(a);return}i.context.pend.go(function(r){if(i.destroyed)return r();Au.write(i.context.fd,t,0,t.length,i.pos,function(o,l){o?(i.destroy(),r(),n(o)):(i.bytesWritten+=l,i.pos+=l,i.emit("progress"),r(),n())})})}};dm.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.context.unref())};lm.inherits(uo,cm);function uo(t,e){cm.call(this),e=e||{},this.refCount=0,this.buffer=t,this.maxChunkSize=e.maxChunkSize||Number.MAX_SAFE_INTEGER}s(uo,"BufferSlicer");uo.prototype.read=function(t,e,n,i,a){var r=i+n,o=r-this.buffer.length,l=o>0?o:n;this.buffer.copy(t,e,i,r),setImmediate(function(){a(null,l)})};uo.prototype.write=function(t,e,n,i,a){t.copy(this.buffer,i,e,e+n),setImmediate(function(){a(null,n,t)})};uo.prototype.createReadStream=function(t){t=t||{};var e=new Bde(t);e.destroyed=!1,e.start=t.start||0,e.endOffset=t.end,e.pos=e.endOffset||this.buffer.length;for(var n=this.buffer.slice(e.start,e.pos),i=0;;){var a=i+this.maxChunkSize;if(a>=n.length){in.endOffset){var l=new Error("maximum file length exceeded");l.code="ETOOBIG",n.destroyed=!0,r(l);return}i.copy(e.buffer,n.pos,0,i.length),n.bytesWritten+=i.length,n.pos=o,n.emit("progress"),r()}},n.destroy=function(){n.destroyed=!0},n};uo.prototype.ref=function(){this.refCount+=1};uo.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw new Error("invalid unref")};function Lde(t,e){return new uo(t,e)}s(Lde,"createFromBuffer");function Vde(t,e){return new co(t,e)}s(Vde,"createFromFd")});var k2=oe((Yke,E2)=>{var Lo=(No(),nu(Dl)).Buffer,V_=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];typeof Int32Array<"u"&&(V_=new Int32Array(V_));function w2(t){if(Lo.isBuffer(t))return t;var e=typeof Lo.alloc=="function"&&typeof Lo.from=="function";if(typeof t=="number")return e?Lo.alloc(t):new Lo(t);if(typeof t=="string")return e?Lo.from(t):new Lo(t);throw new Error("input must be buffer, number, or string, received "+typeof t)}s(w2,"ensureBuffer");function zde(t){var e=w2(4);return e.writeInt32BE(t,0),e}s(zde,"bufferizeInt");function z_(t,e){t=w2(t),Lo.isBuffer(e)&&(e=e.readUInt32BE(0));for(var n=~~e^-1,i=0;i>>8;return n^-1}s(z_,"_crc32");function U_(){return zde(z_.apply(null,arguments))}s(U_,"crc32");U_.signed=function(){return z_.apply(null,arguments)};U_.unsigned=function(){return z_.apply(null,arguments)>>>0};E2.exports=U_});var I2=oe(br=>{var q_=Ee("fs"),Ude=Ee("zlib"),j2=y2(),qde=k2(),fm=Ee("util"),hm=Ee("events").EventEmitter,A2=Ee("stream").Transform,H_=Ee("stream").PassThrough,Hde=Ee("stream").Writable;br.open=Jde;br.fromFd=T2;br.fromBuffer=Gde;br.fromRandomAccessReader=J_;br.dosDateTimeToDate=S2;br.validateFileName=O2;br.ZipFile=Vo;br.Entry=Cu;br.RandomAccessReader=zo;function Jde(t,e,n){typeof e=="function"&&(n=e,e=null),e==null&&(e={}),e.autoClose==null&&(e.autoClose=!0),e.lazyEntries==null&&(e.lazyEntries=!1),e.decodeStrings==null&&(e.decodeStrings=!0),e.validateEntrySizes==null&&(e.validateEntrySizes=!0),e.strictFileNames==null&&(e.strictFileNames=!1),n==null&&(n=mm),q_.open(t,"r",function(i,a){if(i)return n(i);T2(a,e,function(r,o){r&&q_.close(a,mm),n(r,o)})})}s(Jde,"open");function T2(t,e,n){typeof e=="function"&&(n=e,e=null),e==null&&(e={}),e.autoClose==null&&(e.autoClose=!1),e.lazyEntries==null&&(e.lazyEntries=!1),e.decodeStrings==null&&(e.decodeStrings=!0),e.validateEntrySizes==null&&(e.validateEntrySizes=!0),e.strictFileNames==null&&(e.strictFileNames=!1),n==null&&(n=mm),q_.fstat(t,function(i,a){if(i)return n(i);var r=j2.createFromFd(t,{autoClose:!0});J_(r,a.size,e,n)})}s(T2,"fromFd");function Gde(t,e,n){typeof e=="function"&&(n=e,e=null),e==null&&(e={}),e.autoClose=!1,e.lazyEntries==null&&(e.lazyEntries=!1),e.decodeStrings==null&&(e.decodeStrings=!0),e.validateEntrySizes==null&&(e.validateEntrySizes=!0),e.strictFileNames==null&&(e.strictFileNames=!1);var i=j2.createFromBuffer(t,{maxChunkSize:65536});J_(i,t.length,e,n)}s(Gde,"fromBuffer");function J_(t,e,n,i){typeof n=="function"&&(i=n,n=null),n==null&&(n={}),n.autoClose==null&&(n.autoClose=!0),n.lazyEntries==null&&(n.lazyEntries=!1),n.decodeStrings==null&&(n.decodeStrings=!0);var a=!!n.decodeStrings;if(n.validateEntrySizes==null&&(n.validateEntrySizes=!0),n.strictFileNames==null&&(n.strictFileNames=!1),i==null&&(i=mm),typeof e!="number")throw new Error("expected totalSize parameter to be a number");if(e>Number.MAX_SAFE_INTEGER)throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");t.ref();var r=22,o=65535,l=Math.min(r+o,e),c=vr(l),d=e-c.length;Gl(t,c,0,l,d,function(u){if(u)return i(u);for(var p=l-r;p>=0;p-=1)if(c.readUInt32LE(p)===101010256){var m=c.slice(p),f=m.readUInt16LE(4);if(f!==0)return i(new Error("multi-disk zip files are not supported: found disk number: "+f));var g=m.readUInt16LE(10),x=m.readUInt32LE(16),_=m.readUInt16LE(20),h=m.length-r;if(_!==h)return i(new Error("invalid comment length. expected: "+h+". found: "+_));var v=a?pm(m,22,m.length,!1):m.slice(22);if(!(g===65535||x===4294967295))return i(null,new Vo(t,x,e,g,v,n.autoClose,n.lazyEntries,a,n.validateEntrySizes,n.strictFileNames));var b=vr(20),y=d+p-b.length;Gl(t,b,0,b.length,y,function(w){if(w)return i(w);if(b.readUInt32LE(0)!==117853008)return i(new Error("invalid zip64 end of central directory locator signature"));var S=Wl(b,8),F=vr(56);Gl(t,F,0,F.length,S,function(N){return N?i(N):F.readUInt32LE(0)!==101075792?i(new Error("invalid zip64 end of central directory record signature")):(g=Wl(F,32),x=Wl(F,48),i(null,new Vo(t,x,e,g,v,n.autoClose,n.lazyEntries,a,n.validateEntrySizes,n.strictFileNames)))})});return}i(new Error("end of central directory record signature not found"))})}s(J_,"fromRandomAccessReader");fm.inherits(Vo,hm);function Vo(t,e,n,i,a,r,o,l,c,d){var u=this;hm.call(u),u.reader=t,u.reader.on("error",function(p){C2(u,p)}),u.reader.once("close",function(){u.emit("close")}),u.readEntryCursor=e,u.fileSize=n,u.entryCount=i,u.comment=a,u.entriesRead=0,u.autoClose=!!r,u.lazyEntries=!!o,u.decodeStrings=!!l,u.validateEntrySizes=!!c,u.strictFileNames=!!d,u.isOpen=!0,u.emittedError=!1,u.lazyEntries||u._readEntry()}s(Vo,"ZipFile");Vo.prototype.close=function(){this.isOpen&&(this.isOpen=!1,this.reader.unref())};function La(t,e){t.autoClose&&t.close(),C2(t,e)}s(La,"emitErrorAndAutoClose");function C2(t,e){t.emittedError||(t.emittedError=!0,t.emit("error",e))}s(C2,"emitError");Vo.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};Vo.prototype._readEntry=function(){var t=this;if(t.entryCount===t.entriesRead){setImmediate(function(){t.autoClose&&t.close(),!t.emittedError&&t.emit("end")});return}if(!t.emittedError){var e=vr(46);Gl(t.reader,e,0,e.length,t.readEntryCursor,function(n){if(n)return La(t,n);if(!t.emittedError){var i=new Cu,a=e.readUInt32LE(0);if(a!==33639248)return La(t,new Error("invalid central directory file header signature: 0x"+a.toString(16)));if(i.versionMadeBy=e.readUInt16LE(4),i.versionNeededToExtract=e.readUInt16LE(6),i.generalPurposeBitFlag=e.readUInt16LE(8),i.compressionMethod=e.readUInt16LE(10),i.lastModFileTime=e.readUInt16LE(12),i.lastModFileDate=e.readUInt16LE(14),i.crc32=e.readUInt32LE(16),i.compressedSize=e.readUInt32LE(20),i.uncompressedSize=e.readUInt32LE(24),i.fileNameLength=e.readUInt16LE(28),i.extraFieldLength=e.readUInt16LE(30),i.fileCommentLength=e.readUInt16LE(32),i.internalFileAttributes=e.readUInt16LE(36),i.externalFileAttributes=e.readUInt32LE(38),i.relativeOffsetOfLocalHeader=e.readUInt32LE(42),i.generalPurposeBitFlag&64)return La(t,new Error("strong encryption is not supported"));t.readEntryCursor+=46,e=vr(i.fileNameLength+i.extraFieldLength+i.fileCommentLength),Gl(t.reader,e,0,e.length,t.readEntryCursor,function(r){if(r)return La(t,r);if(!t.emittedError){var o=(i.generalPurposeBitFlag&2048)!==0;i.fileName=t.decodeStrings?pm(e,0,i.fileNameLength,o):e.slice(0,i.fileNameLength);var l=i.fileNameLength+i.extraFieldLength,c=e.slice(i.fileNameLength,l);i.extraFields=[];for(var d=0;dc.length)return La(t,new Error("extra field length exceeds extra field buffer size"));var g=vr(p);c.copy(g,0,m,f),i.extraFields.push({id:u,data:g}),d=f}if(i.fileComment=t.decodeStrings?pm(e,l,l+i.fileCommentLength,o):e.slice(l,l+i.fileCommentLength),i.comment=i.fileComment,t.readEntryCursor+=e.length,t.entriesRead+=1,i.uncompressedSize===4294967295||i.compressedSize===4294967295||i.relativeOffsetOfLocalHeader===4294967295){for(var x=null,d=0;dx.length)return La(t,new Error("zip64 extended information extra field does not include uncompressed size"));i.uncompressedSize=Wl(x,h),h+=8}if(i.compressedSize===4294967295){if(h+8>x.length)return La(t,new Error("zip64 extended information extra field does not include compressed size"));i.compressedSize=Wl(x,h),h+=8}if(i.relativeOffsetOfLocalHeader===4294967295){if(h+8>x.length)return La(t,new Error("zip64 extended information extra field does not include relative header offset"));i.relativeOffsetOfLocalHeader=Wl(x,h),h+=8}}if(t.decodeStrings)for(var d=0;dt.compressedSize)throw new Error("options.start > entry.compressedSize")}if(e.end!=null){if(r=e.end,r<0)throw new Error("options.end < 0");if(r>t.compressedSize)throw new Error("options.end > entry.compressedSize");if(ri.fileSize)return n(new Error("file data overflows file bounds: "+f+" + "+t.compressedSize+" > "+i.fileSize));var x=i.reader.createReadStream({start:f+a,end:f+r}),_=x;if(m){var h=!1,v=Ude.createInflateRaw();x.on("error",function(b){setImmediate(function(){h||v.emit("error",b)})}),x.pipe(v),i.validateEntrySizes?(_=new Su(t.uncompressedSize),v.on("error",function(b){setImmediate(function(){h||_.emit("error",b)})}),v.pipe(_)):_=v,_.destroy=function(){h=!0,v!==_&&v.unpipe(_),x.unpipe(v),x.destroy()}}n(null,_)}finally{i.reader.unref()}})};function Cu(){}s(Cu,"Entry");Cu.prototype.getLastModDate=function(){return S2(this.lastModFileDate,this.lastModFileTime)};Cu.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Cu.prototype.isCompressed=function(){return this.compressionMethod===8};function S2(t,e){var n=t&31,i=(t>>5&15)-1,a=(t>>9&127)+1980,r=0,o=(e&31)*2,l=e>>5&63,c=e>>11&31;return new Date(a,i,n,c,l,o,r)}s(S2,"dosDateTimeToDate");function O2(t){return t.indexOf("\\")!==-1?"invalid characters in fileName: "+t:/^[a-zA-Z]:/.test(t)||/^\//.test(t)?"absolute path: "+t:t.split("/").indexOf("..")!==-1?"invalid relative path: "+t:null}s(O2,"validateFileName");function Gl(t,e,n,i,a,r){if(i===0)return setImmediate(function(){r(null,vr(0))});t.read(e,n,i,a,function(o,l){if(o)return r(o);if(lthis.expectedByteCount){var i="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return n(new Error(i))}n(null,t)};Su.prototype._flush=function(t){if(this.actualByteCount0)return;if(t.refCount<0)throw new Error("invalid unref");t.close(e);function e(n){if(n)return t.emit("error",n);t.emit("close")}s(e,"onCloseDone")};zo.prototype.createReadStream=function(t){var e=t.start,n=t.end;if(e===n){var i=new H_;return setImmediate(function(){i.end()}),i}var a=this._readStreamForRange(e,n),r=!1,o=new gm(this);a.on("error",function(c){setImmediate(function(){r||o.emit("error",c)})}),o.destroy=function(){a.unpipe(o),o.unref(),a.destroy()};var l=new Su(n-e);return o.on("error",function(c){setImmediate(function(){r||l.emit("error",c)})}),l.destroy=function(){r=!0,o.unpipe(l),o.destroy()},a.pipe(o).pipe(l)};zo.prototype._readStreamForRange=function(t,e){throw new Error("not implemented")};zo.prototype.read=function(t,e,n,i,a){var r=this.createReadStream({start:i,end:i+n}),o=new Hde,l=0;o._write=function(c,d,u){c.copy(t,e+l,0,c.length),l+=c.length,u()},o.on("finish",a),r.on("error",function(c){a(c)}),r.pipe(o)};zo.prototype.close=function(t){setImmediate(t)};fm.inherits(gm,H_);function gm(t){H_.call(this),this.context=t,this.context.ref(),this.unreffedYet=!1}s(gm,"RefUnrefFilter");gm.prototype._flush=function(t){this.unref(),t()};gm.prototype.unref=function(t){this.unreffedYet||(this.unreffedYet=!0,this.context.unref())};var Wde="\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\xB6\xA7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0\xA0";function pm(t,e,n,i){if(i)return t.toString("utf8",e,n);for(var a="",r=e;r{"use strict";var D2=X3(),Kde=p2(),F2=B_(),Yde=I2(),Xde=s((t,e)=>{let r=t.versionMadeBy>>8;return(e&61440)===40960?"symlink":(e&61440)===16384||r===0&&t.externalFileAttributes===16?"directory":"file"},"getType"),Zde=s((t,e)=>{let n={mode:t.externalFileAttributes>>16&65535,mtime:t.getLastModDate(),path:t.fileName};return n.type=Xde(t,n.mode),n.mode===0&&n.type==="directory"&&(n.mode=493),n.mode===0&&(n.mode=420),F2(e.openReadStream.bind(e))(t).then(Kde.buffer).then(i=>(n.data=i,n.type==="symlink"&&(n.linkname=i.toString()),n)).catch(i=>{throw e.close(),i})},"extractEntry"),Qde=s(t=>new Promise((e,n)=>{let i=[];t.readEntry(),t.on("entry",a=>{Zde(a,t).catch(n).then(r=>{i.push(r),t.readEntry()})}),t.on("error",n),t.on("end",()=>e(i))}),"extractFile");N2.exports=()=>t=>Buffer.isBuffer(t)?!D2(t)||D2(t).ext!=="zip"?Promise.resolve([]):F2(Yde.fromBuffer)(t,{lazyEntries:!0}).then(Qde):Promise.reject(new TypeError(`Expected a Buffer, got ${typeof t}`))});var P2=oe((t5e,B2)=>{"use strict";var M2=s((t,e)=>function(){let n=e.promiseModule,i=new Array(arguments.length);for(let a=0;a{e.errorFirst?i.push(function(o,l){if(e.multiArgs){let c=new Array(arguments.length-1);for(let d=1;d{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=s(a=>{let r=s(o=>typeof o=="string"?a===o:o.test(a),"match");return e.include?e.include.some(r):!e.exclude.some(r)},"filter"),i;typeof t=="function"?i=s(function(){return e.excludeMain?t.apply(this,arguments):M2(t,e).apply(this,arguments)},"ret"):i=Object.create(Object.getPrototypeOf(t));for(let a in t){let r=t[a];i[a]=typeof r=="function"&&n(a)?M2(r,e):r}return i}});var U2=oe((i5e,G_)=>{"use strict";var $de=Ee("fs"),Ds=Ee("path"),L2=P2(),V2={mode:511&~process.umask(),fs:$de},z2=s(t=>{if(process.platform==="win32"&&/[<>:"|?*]/.test(t.replace(Ds.parse(t).root,""))){let n=new Error(`Path contains invalid characters: ${t}`);throw n.code="EINVAL",n}},"checkPath");G_.exports=(t,e)=>Promise.resolve().then(()=>{z2(t),e=Object.assign({},V2,e);let n=L2(e.fs.mkdir),i=L2(e.fs.stat),a=s(r=>n(r,e.mode).then(()=>r).catch(o=>{if(o.code==="ENOENT"){if(o.message.includes("null bytes")||Ds.dirname(r)===r)throw o;return a(Ds.dirname(r)).then(()=>a(r))}return i(r).then(l=>l.isDirectory()?r:Promise.reject()).catch(()=>{throw o})}),"make");return a(Ds.resolve(t))});G_.exports.sync=(t,e)=>{z2(t),e=Object.assign({},V2,e);let n=s(i=>{try{e.fs.mkdirSync(i,e.mode)}catch(a){if(a.code==="ENOENT"){if(a.message.includes("null bytes")||Ds.dirname(i)===i)throw a;return n(Ds.dirname(i)),n(i)}try{if(!e.fs.statSync(i).isDirectory())throw new Error("The path is not a directory")}catch{throw a}}return i},"make");return n(Ds.resolve(t))}});var H2=oe((r5e,q2)=>{"use strict";q2.exports=s(function(e,n){if(n){if(typeof n!="object")throw new TypeError(String(n)+" is not an object. Expected an object that has boolean `includeZero` property.");if("includeZero"in n){if(typeof n.includeZero!="boolean")throw new TypeError(String(n.includeZero)+" is neither true nor false. `includeZero` option must be a Boolean value.");if(n.includeZero&&e===0)return!0}}return Number.isSafeInteger(e)&&e>=1},"isNaturalNumber")});var G2=oe((s5e,J2)=>{"use strict";var Ou=Ee("path"),Iu=Ee("util"),epe=H2();J2.exports=s(function(e,n,i){if(typeof e!="string")throw new TypeError(Iu.inspect(e)+" is not a string. First argument to strip-dirs must be a path string.");if(Ou.posix.isAbsolute(e)||Ou.win32.isAbsolute(e))throw new Error(`${e} is an absolute path. strip-dirs requires a relative path.`);if(!epe(n,{includeZero:!0}))throw new Error("The Second argument of strip-dirs must be a natural number or 0, but received "+Iu.inspect(n)+".");if(i){if(typeof i!="object")throw new TypeError(Iu.inspect(i)+" is not an object. Expected an object with a boolean `disallowOverflow` property.");if(Array.isArray(i))throw new TypeError(Iu.inspect(i)+" is an array. Expected an object with a boolean `disallowOverflow` property.");if("disallowOverflow"in i&&typeof i.disallowOverflow!="boolean")throw new TypeError(Iu.inspect(i.disallowOverflow)+" is neither true nor false. `disallowOverflow` option must be a Boolean value.")}else i={disallowOverflow:!1};let a=Ou.normalize(e).split(Ou.sep);if(a.length>1&&a[0]==="."&&a.shift(),n>a.length-1){if(i.disallowOverflow)throw new RangeError("Cannot strip more directories than there are.");n=a.length-1}return Ou.join.apply(null,a.slice(n))},"stripDirs")});var K2=oe((c5e,W2)=>{"use strict";var _m=Ee("path"),tpe=O1(),npe=em(),ipe=J3(),ape=K3(),rpe=R2(),W_=U2(),ope=B_(),spe=G2(),$i=ope(tpe),lpe=s((t,e)=>e.plugins.length===0?Promise.resolve([]):Promise.all(e.plugins.map(n=>n(t,e))).then(n=>n.reduce((i,a)=>i.concat(a))),"runPlugins"),K_=s((t,e)=>$i.realpath(t).catch(n=>{let i=_m.dirname(t);return K_(i,e)}).then(n=>{if(n.indexOf(e)!==0)throw new Error("Refusing to create a directory outside the output path.");return W_(t).then($i.realpath)}),"safeMakeDir"),cpe=s((t,e)=>$i.readlink(t).catch(n=>null).then(n=>{if(n)throw new Error("Refusing to write into a symlink");return e}),"preventWritingThroughSymlink"),upe=s((t,e,n)=>lpe(t,n).then(i=>(n.strip>0&&(i=i.map(a=>(a.path=spe(a.path,n.strip),a)).filter(a=>a.path!==".")),typeof n.filter=="function"&&(i=i.filter(n.filter)),typeof n.map=="function"&&(i=i.map(n.map)),e?Promise.all(i.map(a=>{let r=_m.join(e,a.path),o=a.mode&~process.umask(),l=new Date;return a.type==="directory"?W_(e).then(c=>$i.realpath(c)).then(c=>K_(r,c)).then(()=>$i.utimes(r,l,a.mtime)).then(()=>a):W_(e).then(c=>$i.realpath(c)).then(c=>K_(_m.dirname(r),c).then(()=>c)).then(c=>a.type==="file"?cpe(r,c):c).then(c=>$i.realpath(_m.dirname(r)).then(d=>{if(d.indexOf(c)!==0)throw new Error("Refusing to write outside output directory: "+d)})).then(()=>a.type==="link"||a.type==="symlink"&&process.platform==="win32"?$i.link(a.linkname,r):a.type==="symlink"?$i.symlink(a.linkname,r):$i.writeFile(r,a.data,{mode:o})).then(()=>a.type==="file"&&$i.utimes(r,l,a.mtime)).then(()=>a)})):i)),"extractFile");W2.exports=(t,e,n)=>typeof t!="string"&&!Buffer.isBuffer(t)?Promise.reject(new TypeError("Input file required")):(typeof e=="object"&&(n=e,e=null),n=Object.assign({plugins:[npe(),ipe(),ape(),rpe()]},n),(typeof t=="string"?$i.readFile(t):Promise.resolve(t)).then(a=>upe(a,e,n)))});var Y_=oe((d5e,Y2)=>{"use strict";var dpe=/[|\\{}()[\]^$+*?.]/g;Y2.exports=function(t){if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(dpe,"\\$&")}});var Z2=oe((p5e,X2)=>{"use strict";var ppe=Y_();X2.exports=function(t,e){if(typeof t!="string"||typeof e!="string")throw new TypeError("Expected a string");return t.replace(new RegExp("(?:"+ppe(e)+"){2,}","g"),e)}});var Q2=oe((m5e,X_)=>{"use strict";X_.exports=()=>/[<>:"\/\\|?*\x00-\x1F]/g;X_.exports.windowsNames=()=>/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i});var eE=oe((f5e,$2)=>{"use strict";var mpe=Y_();$2.exports=function(t,e){if(typeof t!="string"||typeof e!="string")throw new TypeError;return e=mpe(e),t.replace(new RegExp("^"+e+"|"+e+"$","g"),"")}});var nE=oe((h5e,Q_)=>{"use strict";var xm=Ee("path"),fpe=Z2(),Z_=Q2(),hpe=eE(),gpe=100,tE=/[\u0000-\u001f\u0080-\u009f]/g,_pe=/^\.+/,vm=s((t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let n=e.replacement===void 0?"!":e.replacement;if(Z_().test(n)&&tE.test(n))throw new Error("Replacement string cannot contain reserved filename characters");return t=t.replace(Z_(),n),t=t.replace(tE,n),t=t.replace(_pe,n),n.length>0&&(t=fpe(t,n),t=t.length>1?hpe(t,n):t),t=Z_.windowsNames().test(t)?t+n:t,t=t.slice(0,gpe),t},"filenamify");vm.path=(t,e)=>(t=xm.resolve(t),xm.join(xm.dirname(t),vm(xm.basename(t),e)));Q_.exports=vm;Q_.exports.default=vm});var rE=oe((_5e,aE)=>{var xpe=k_(),vpe=j_(),$_=Ee("fs"),Du=s(function(){},"noop"),bpe=/^v?\.0/.test(process.version),bm=s(function(t){return typeof t=="function"},"isFn"),ype=s(function(t){return!bpe||!$_?!1:(t instanceof($_.ReadStream||Du)||t instanceof($_.WriteStream||Du))&&bm(t.close)},"isFS"),wpe=s(function(t){return t.setHeader&&bm(t.abort)},"isRequest"),Epe=s(function(t,e,n,i){i=xpe(i);var a=!1;t.on("close",function(){a=!0}),vpe(t,{readable:e,writable:n},function(o){if(o)return i(o);a=!0,i()});var r=!1;return function(o){if(!a&&!r){if(r=!0,ype(t))return t.close(Du);if(wpe(t))return t.abort();if(bm(t.destroy))return t.destroy();i(o||new Error("stream was destroyed"))}}},"destroyer"),iE=s(function(t){t()},"call"),kpe=s(function(t,e){return t.pipe(e)},"pipe"),jpe=s(function(){var t=Array.prototype.slice.call(arguments),e=bm(t[t.length-1]||Du)&&t.pop()||Du;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var n,i=t.map(function(a,r){var o=r0;return Epe(a,o,l,function(c){n||(n=c),c&&i.forEach(iE),!o&&(i.forEach(iE),e(n))})});return t.reduce(kpe)},"pump");aE.exports=jpe});var sE=oe((v5e,oE)=>{"use strict";var{PassThrough:Ape}=Ee("stream");oE.exports=t=>{t=Object.assign({},t);let{array:e}=t,{encoding:n}=t,i=n==="buffer",a=!1;e?a=!(n||i):n=n||"utf8",i&&(n=null);let r=0,o=[],l=new Ape({objectMode:a});return n&&l.setEncoding(n),l.on("data",c=>{o.push(c),a?r=o.length:r+=c.length}),l.getBufferedValue=()=>e?o:i?Buffer.concat(o,r):o.join(""),l.getBufferedLength=()=>r,l}});var lE=oe((b5e,Nu)=>{"use strict";var Tpe=rE(),Cpe=sE(),Fu=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};s(Fu,"MaxBufferError");function e0(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e=Object.assign({maxBuffer:1/0},e);let{maxBuffer:n}=e,i;return new Promise((a,r)=>{let o=s(l=>{l&&(l.bufferedData=i.getBufferedValue()),r(l)},"rejectPromise");i=Tpe(t,Cpe(e),l=>{if(l){o(l);return}a()}),i.on("data",()=>{i.getBufferedLength()>n&&o(new Fu)})}).then(()=>i.getBufferedValue())}s(e0,"getStream");Nu.exports=e0;Nu.exports.buffer=(t,e)=>e0(t,Object.assign({},e,{encoding:"buffer"}));Nu.exports.array=(t,e)=>e0(t,Object.assign({},e,{array:!0}));Nu.exports.MaxBufferError=Fu});var uE=oe((w5e,cE)=>{"use strict";cE.exports=function(t){return encodeURIComponent(t).replace(/[!'()*]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}});var hE=oe((E5e,fE)=>{"use strict";var mE="%[a-f0-9]{2}",dE=new RegExp("("+mE+")|([^%]+?)","gi"),pE=new RegExp("("+mE+")+","gi");function t0(t,e){try{return[decodeURIComponent(t.join(""))]}catch{}if(t.length===1)return t;e=e||1;var n=t.slice(0,e),i=t.slice(e);return Array.prototype.concat.call([],t0(n),t0(i))}s(t0,"decodeComponents");function Spe(t){try{return decodeURIComponent(t)}catch{for(var e=t.match(dE)||[],n=1;n{"use strict";var Ipe=uE(),_E=rm(),gE=hE();function Dpe(t){switch(t.arrayFormat){case"index":return function(e,n,i){return n===null?[ea(e,t),"[",i,"]"].join(""):[ea(e,t),"[",ea(i,t),"]=",ea(n,t)].join("")};case"bracket":return function(e,n){return n===null?ea(e,t):[ea(e,t),"[]=",ea(n,t)].join("")};default:return function(e,n){return n===null?ea(e,t):[ea(e,t),"=",ea(n,t)].join("")}}}s(Dpe,"encoderForArrayFormat");function Fpe(t){var e;switch(t.arrayFormat){case"index":return function(n,i,a){if(e=/\[(\d*)\]$/.exec(n),n=n.replace(/\[\d*\]$/,""),!e){a[n]=i;return}a[n]===void 0&&(a[n]={}),a[n][e[1]]=i};case"bracket":return function(n,i,a){if(e=/(\[\])$/.exec(n),n=n.replace(/\[\]$/,""),e){if(a[n]===void 0){a[n]=[i];return}}else{a[n]=i;return}a[n]=[].concat(a[n],i)};default:return function(n,i,a){if(a[n]===void 0){a[n]=i;return}a[n]=[].concat(a[n],i)}}}s(Fpe,"parserForArrayFormat");function ea(t,e){return e.encode?e.strict?Ipe(t):encodeURIComponent(t):t}s(ea,"encode");function xE(t){return Array.isArray(t)?t.sort():typeof t=="object"?xE(Object.keys(t)).sort(function(e,n){return Number(e)-Number(n)}).map(function(e){return t[e]}):t}s(xE,"keysSorter");function vE(t){var e=t.indexOf("?");return e===-1?"":t.slice(e+1)}s(vE,"extract");function bE(t,e){e=_E({arrayFormat:"none"},e);var n=Fpe(e),i=Object.create(null);return typeof t!="string"||(t=t.trim().replace(/^[?#&]/,""),!t)?i:(t.split("&").forEach(function(a){var r=a.replace(/\+/g," ").split("="),o=r.shift(),l=r.length>0?r.join("="):void 0;l=l===void 0?null:gE(l),n(gE(o),l,i)}),Object.keys(i).sort().reduce(function(a,r){var o=i[r];return o&&typeof o=="object"&&!Array.isArray(o)?a[r]=xE(o):a[r]=o,a},Object.create(null)))}s(bE,"parse");Ru.extract=vE;Ru.parse=bE;Ru.stringify=function(t,e){var n={encode:!0,strict:!0,arrayFormat:"none"};e=_E(n,e),e.sort===!1&&(e.sort=function(){});var i=Dpe(e);return t?Object.keys(t).sort(e.sort).map(function(a){var r=t[a];if(r===void 0)return"";if(r===null)return ea(a,e);if(Array.isArray(r)){var o=[];return r.slice().forEach(function(l){l!==void 0&&o.push(i(a,l,o.length))}),o.join("&")}return ea(a,e)+"="+ea(r,e)}).filter(function(a){return a.length>0}).join("&"):""};Ru.parseUrl=function(t,e){return{url:t.split("?")[0]||"",query:bE(vE(t),e)}}});var n0=oe((T5e,wE)=>{"use strict";wE.exports=(t,e)=>{if(typeof t!="string")throw new TypeError(`Expected \`url\` to be of type \`string\`, got \`${typeof t}\``);return t=t.trim(),e=Object.assign({https:!1},e),/^\.*\/|^(?!localhost)\w+:/.test(t)?t:t.replace(/^(?!(?:\w+:)?\/\/)/,e.https?"https://":"http://")}});var i0=oe((C5e,EE)=>{"use strict";var Npe=Object.prototype.toString;EE.exports=function(t){var e;return Npe.call(t)==="[object Object]"&&(e=Object.getPrototypeOf(t),e===null||e===Object.getPrototypeOf({}))}});var jE=oe((S5e,kE)=>{"use strict";var a0=i0();kE.exports=(t,e)=>{if(!a0(t))throw new TypeError("Expected a plain object");if(e=e||{},typeof e=="function")throw new TypeError("Specify the compare function as an option instead");let n=e.deep,i=[],a=[],r=s(o=>{let l=i.indexOf(o);if(l!==-1)return a[l];let c={},d=Object.keys(o).sort(e.compare);i.push(o),a.push(c);for(let u=0;u{"use strict";var r0=Ee("url"),Rpe=Ee("punycode"),AE=yE(),Mpe=n0(),Bpe=jE(),Ppe={"http:":80,"https:":443,"ftp:":21},Lpe={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function TE(t,e){return e.some(n=>n instanceof RegExp?n.test(t):n===t)}s(TE,"testParameter");CE.exports=(t,e)=>{if(e=Object.assign({normalizeProtocol:!0,normalizeHttps:!1,stripFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),typeof t!="string")throw new TypeError("Expected a string");let n=t.startsWith("//");t=Mpe(t.trim()).replace(/^\/\//,"http://");let i=r0.parse(t);if(e.normalizeHttps&&i.protocol==="https:"&&(i.protocol="http:"),!i.hostname&&!i.pathname)throw new Error("Invalid URL");delete i.host,delete i.query,e.stripFragment&&delete i.hash;let a=Ppe[i.protocol];if(Number(i.port)===a&&delete i.port,i.pathname&&(i.pathname=i.pathname.replace(/\/{2,}/g,"/")),i.pathname&&(i.pathname=decodeURI(i.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let o=i.pathname.split("/"),l=o[o.length-1];TE(l,e.removeDirectoryIndex)&&(o=o.slice(0,o.length-1),i.pathname=o.slice(1).join("/")+"/")}if(Lpe[i.protocol]){let o=i.protocol+"//"+i.hostname,l=r0.resolve(o,i.pathname);i.pathname=l.replace(o,"")}i.hostname&&(i.hostname=Rpe.toUnicode(i.hostname).toLowerCase(),i.hostname=i.hostname.replace(/\.$/,""),e.stripWWW&&(i.hostname=i.hostname.replace(/^www\./,""))),i.search==="?"&&delete i.search;let r=AE.parse(i.search);if(Array.isArray(e.removeQueryParameters))for(let o in r)TE(o,e.removeQueryParameters)&&delete r[o];return e.sortQueryParameters&&(i.search=AE.stringify(Bpe(r))),i.search!==null&&(i.search=decodeURIComponent(i.search)),t=r0.format(i),(e.removeTrailingSlash||i.pathname==="/")&&(t=t.replace(/\/$/,"")),n&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),t}});var IE=oe((F5e,OE)=>{"use strict";var Vpe=Ee("stream").PassThrough;OE.exports=t=>{t=Object.assign({},t);let e=t.array,n=t.encoding,i=n==="buffer",a=!1;e?a=!(n||i):n=n||"utf8",i&&(n=null);let r=0,o=[],l=new Vpe({objectMode:a});return n&&l.setEncoding(n),l.on("data",c=>{o.push(c),a?r=o.length:r+=c.length}),l.getBufferedValue=()=>e?o:i?Buffer.concat(o,r):o.join(""),l.getBufferedLength=()=>r,l}});var s0=oe((N5e,ym)=>{"use strict";var zpe=IE();function o0(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e=Object.assign({maxBuffer:1/0},e);let n=e.maxBuffer,i,a,r=new Promise((o,l)=>{let c=s(d=>{d&&(d.bufferedData=i.getBufferedValue()),l(d)},"error");i=zpe(e),t.once("error",c),t.pipe(i),i.on("data",()=>{i.getBufferedLength()>n&&l(new Error("maxBuffer exceeded"))}),i.once("error",c),i.on("end",o),a=s(()=>{t.unpipe&&t.unpipe(i)},"clean")});return r.then(a,a),r.then(()=>i.getBufferedValue())}s(o0,"getStream");ym.exports=o0;ym.exports.buffer=(t,e)=>o0(t,Object.assign({},e,{encoding:"buffer"}));ym.exports.array=(t,e)=>o0(t,Object.assign({},e,{array:!0}))});var FE=oe((M5e,DE)=>{"use strict";function Upe(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}s(Upe,"_classCallCheck");var qpe=[200,203,204,206,300,301,404,405,410,414,501],Hpe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],Jpe={connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},Gpe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function l0(t){var e={};if(!t)return e;for(var n=t.trim().split(/\s*,\s*/),r=n,i=Array.isArray(r),a=0,r=i?r:r[Symbol.iterator]();;){var o;if(i){if(a>=r.length)break;o=r[a++]}else{if(a=r.next(),a.done)break;o=a.value}var l=o,c=l.split(/\s*=\s*/,2),d=c[0],u=c[1];e[d]=u===void 0?!0:u.replace(/^"|"$/g,"")}return e}s(l0,"parseCacheControl");function Wpe(t){var e=[];for(var n in t){var i=t[n];e.push(i===!0?n:n+"="+i)}if(e.length)return e.join(", ")}s(Wpe,"formatCacheControl");DE.exports=function(){function t(e,n){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=i.shared,r=i.cacheHeuristic,o=i.immutableMinTimeToLive,l=i.ignoreCargoCult,c=i._fromObject;if(Upe(this,t),c){this._fromObject(c);return}if(!n||!n.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=a!==!1,this._cacheHeuristic=r!==void 0?r:.1,this._immutableMinTtl=o!==void 0?o:24*3600*1e3,this._status="status"in n?n.status:200,this._resHeaders=n.headers,this._rescc=l0(n.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=n.headers.vary?e.headers:null,this._reqcc=l0(e.headers["cache-control"]),l&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Wpe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!n.headers["cache-control"]&&/no-cache/.test(n.headers.pragma)&&(this._rescc["no-cache"]=!0)}return s(t,"CachePolicy"),t.prototype.now=s(function(){return Date.now()},"now"),t.prototype.storable=s(function(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&Hpe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||qpe.indexOf(this._status)!==-1))},"storable"),t.prototype._hasExplicitExpiration=s(function(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires},"_hasExplicitExpiration"),t.prototype._assertRequestHasHeaders=s(function(n){if(!n||!n.headers)throw Error("Request headers missing")},"_assertRequestHasHeaders"),t.prototype.satisfiesWithoutRevalidation=s(function(n){this._assertRequestHasHeaders(n);var i=l0(n.headers["cache-control"]);if(i["no-cache"]||/no-cache/.test(n.headers.pragma)||i["max-age"]&&this.age()>i["max-age"]||i["min-fresh"]&&this.timeToLive()<1e3*i["min-fresh"])return!1;if(this.stale()){var a=i["max-stale"]&&!this._rescc["must-revalidate"]&&(i["max-stale"]===!0||i["max-stale"]>this.age()-this.maxAge());if(!a)return!1}return this._requestMatches(n,!1)},"satisfiesWithoutRevalidation"),t.prototype._requestMatches=s(function(n,i){return(!this._url||this._url===n.url)&&this._host===n.headers.host&&(!n.method||this._method===n.method||i&&n.method==="HEAD")&&this._varyMatches(n)},"_requestMatches"),t.prototype._allowsStoringAuthenticated=s(function(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]},"_allowsStoringAuthenticated"),t.prototype._varyMatches=s(function(n){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;for(var i=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/),o=i,a=Array.isArray(o),r=0,o=a?o:o[Symbol.iterator]();;){var l;if(a){if(r>=o.length)break;l=o[r++]}else{if(r=o.next(),r.done)break;l=r.value}var c=l;if(n.headers[c]!==this._reqHeaders[c])return!1}return!0},"_varyMatches"),t.prototype._copyWithoutHopByHopHeaders=s(function(n){var i={};for(var a in n)Jpe[a]||(i[a]=n[a]);if(n.connection)for(var r=n.connection.trim().split(/\s*,\s*/),c=r,o=Array.isArray(c),l=0,c=o?c:c[Symbol.iterator]();;){var d;if(o){if(l>=c.length)break;d=c[l++]}else{if(l=c.next(),l.done)break;d=l.value}var u=d;delete i[u]}if(i.warning){var p=i.warning.split(/,/).filter(function(m){return!/^\s*1[0-9][0-9]/.test(m)});p.length?i.warning=p.join(",").trim():delete i.warning}return i},"_copyWithoutHopByHopHeaders"),t.prototype.responseHeaders=s(function(){var n=this._copyWithoutHopByHopHeaders(this._resHeaders),i=this.age();return i>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(n.warning=(n.warning?`${n.warning}, `:"")+'113 - "rfc7234 5.5.4"'),n.age=`${Math.round(i)}`,n},"responseHeaders"),t.prototype.date=s(function(){var n=Date.parse(this._resHeaders.date),i=8*3600*1e3;return Number.isNaN(n)||nthis._responseTime+i?this._responseTime:n},"date"),t.prototype.age=s(function(){var n=Math.max(0,(this._responseTime-this.date())/1e3);if(this._resHeaders.age){var i=this._ageValue();i>n&&(n=i)}var a=(this.now()-this._responseTime)/1e3;return n+a},"age"),t.prototype._ageValue=s(function(){var n=parseInt(this._resHeaders.age);return isFinite(n)?n:0},"_ageValue"),t.prototype.maxAge=s(function(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);var n=this._rescc.immutable?this._immutableMinTtl:0,i=this.date();if(this._resHeaders.expires){var a=Date.parse(this._resHeaders.expires);return Number.isNaN(a)||ar)return Math.max(n,(i-r)/1e3*this._cacheHeuristic)}return n},"maxAge"),t.prototype.timeToLive=s(function(){return Math.max(0,this.maxAge()-this.age())*1e3},"timeToLive"),t.prototype.stale=s(function(){return this.maxAge()<=this.age()},"stale"),t.fromObject=s(function(n){return new this(void 0,void 0,{_fromObject:n})},"fromObject"),t.prototype._fromObject=s(function(n){if(this._responseTime)throw Error("Reinitialized");if(!n||n.v!==1)throw Error("Invalid serialization");this._responseTime=n.t,this._isShared=n.sh,this._cacheHeuristic=n.ch,this._immutableMinTtl=n.imm!==void 0?n.imm:24*3600*1e3,this._status=n.st,this._resHeaders=n.resh,this._rescc=n.rescc,this._method=n.m,this._url=n.u,this._host=n.h,this._noAuthorization=n.a,this._reqHeaders=n.reqh,this._reqcc=n.reqcc},"_fromObject"),t.prototype.toObject=s(function(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}},"toObject"),t.prototype.revalidationHeaders=s(function(n){this._assertRequestHasHeaders(n);var i=this._copyWithoutHopByHopHeaders(n.headers);if(delete i["if-range"],!this._requestMatches(n,!0)||!this.storable())return delete i["if-none-match"],delete i["if-modified-since"],i;this._resHeaders.etag&&(i["if-none-match"]=i["if-none-match"]?`${i["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag);var a=i["accept-ranges"]||i["if-match"]||i["if-unmodified-since"]||this._method&&this._method!="GET";if(a){if(delete i["if-modified-since"],i["if-none-match"]){var r=i["if-none-match"].split(/,/).filter(function(o){return!/^\s*W\//.test(o)});r.length?i["if-none-match"]=r.join(",").trim():delete i["if-none-match"]}}else this._resHeaders["last-modified"]&&!i["if-modified-since"]&&(i["if-modified-since"]=this._resHeaders["last-modified"]);return i},"revalidationHeaders"),t.prototype.revalidatedPolicy=s(function(n,i){if(this._assertRequestHasHeaders(n),!i||!i.headers)throw Error("Response headers missing");var a=!1;if(i.status!==void 0&&i.status!=304?a=!1:i.headers.etag&&!/^\s*W\//.test(i.headers.etag)?a=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===i.headers.etag:this._resHeaders.etag&&i.headers.etag?a=this._resHeaders.etag.replace(/^\s*W\//,"")===i.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?a=this._resHeaders["last-modified"]===i.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!i.headers.etag&&!i.headers["last-modified"]&&(a=!0),!a)return{policy:new this.constructor(n,i),modified:!0};var r={};for(var o in this._resHeaders)r[o]=o in i.headers&&!Gpe[o]?i.headers[o]:this._resHeaders[o];var l=Object.assign({},i,{status:this._status,method:this._method,headers:r});return{policy:new this.constructor(n,l),modified:!1}},"revalidatedPolicy"),t}()});var RE=oe((P5e,NE)=>{"use strict";NE.exports=function(t){for(var e={},n=Object.keys(Object(t)),i=0;i{"use strict";var Kpe=Ee("stream").Readable,Ype=RE(),wm=class extends Kpe{constructor(e,n,i,a){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof n!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=Ype(n),this.body=i,this.url=a}_read(){this.push(this.body),this.push(null)}};s(wm,"Response");ME.exports=wm});var LE=oe((z5e,PE)=>{"use strict";PE.exports=function(t){for(var e={},n=Object.keys(Object(t)),i=0;i{"use strict";var Xpe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];VE.exports=(t,e)=>{let n=new Set(Object.keys(t).concat(Xpe));for(let i of n)i in e||(e[i]=typeof t[i]=="function"?t[i].bind(t):t[i])}});var UE=oe((q5e,zE)=>{"use strict";var Zpe=Ee("stream").PassThrough,Qpe=Em(),$pe=s(t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new Zpe;return Qpe(t,e),t.pipe(e)},"cloneResponse");zE.exports=$pe});var qE=oe(c0=>{c0.stringify=s(function t(e){if(typeof e>"u")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var n="",i=Array.isArray(e);n=i?"[":"{";var a=!0;for(var r in e){var o=typeof e[r]=="function"||!i&&typeof e[r]>"u";Object.hasOwnProperty.call(e,r)&&!o&&(a||(n+=","),a=!1,i?e[r]==null?n+="null":n+=t(e[r]):e[r]!==void 0&&(n+=t(r)+":"+t(e[r])))}return n+=i?"]":"}",n}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e>"u"?"null":JSON.stringify(e)},"stringify");c0.parse=function(t){return JSON.parse(t,function(e,n){return typeof n=="string"?/^:base64:/.test(n)?new Buffer(n.substring(8),"base64"):/^:/.test(n)?n.substring(1):n:n})}});var GE=oe((W5e,JE)=>{"use strict";var eme=Ee("events"),HE=qE(),tme=s(t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let n=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(Ee(e[n]))(t)}return new Map},"loadStore"),km=class extends eme{constructor(e,n){if(super(),this.opts=Object.assign({namespace:"keyv"},typeof e=="string"?{uri:e}:e,n),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=tme(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e){e=this._getKeyPrefix(e);let n=this.opts.store;return Promise.resolve().then(()=>n.get(e)).then(i=>{if(i=typeof i=="string"?HE.parse(i):i,i!==void 0){if(typeof i.expires=="number"&&Date.now()>i.expires){this.delete(e);return}return i.value}})}set(e,n,i){e=this._getKeyPrefix(e),typeof i>"u"&&(i=this.opts.ttl),i===0&&(i=void 0);let a=this.opts.store;return Promise.resolve().then(()=>{let r=typeof i=="number"?Date.now()+i:null;return n={value:n,expires:r},a.set(e,HE.stringify(n),i)}).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let n=this.opts.store;return Promise.resolve().then(()=>n.delete(e))}clear(){let e=this.opts.store;return Promise.resolve().then(()=>e.clear())}};s(km,"Keyv");JE.exports=km});var XE=oe((Y5e,YE)=>{"use strict";var nme=Ee("events"),WE=Ee("url"),ime=SE(),ame=s0(),u0=FE(),KE=BE(),rme=LE(),ome=UE(),sme=GE(),pa=class{constructor(e,n){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new sme({uri:typeof n=="string"&&n,store:typeof n!="string"&&n,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(n,i)=>{typeof n=="string"&&(n=WE.parse(n)),n=Object.assign({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},n),n.headers=rme(n.headers);let a=new nme,r=ime(WE.format(n)),o=`${n.method}:${r}`,l=!1,c=!1,d=s(p=>{c=!0;let m=s(f=>{if(l){let x=u0.fromObject(l.cachePolicy).revalidatedPolicy(p,f);if(!x.modified){let _=x.policy.responseHeaders();f=new KE(f.statusCode,_,l.body,l.url),f.cachePolicy=x.policy,f.fromCache=!0}}f.fromCache||(f.cachePolicy=new u0(p,f),f.fromCache=!1);let g;p.cache&&f.cachePolicy.storable()?(g=ome(f),ame.buffer(f).then(x=>{let _={cachePolicy:f.cachePolicy.toObject(),url:f.url,statusCode:f.fromCache?l.statusCode:f.statusCode,body:x},h=p.strictTtl?f.cachePolicy.timeToLive():void 0;return this.cache.set(o,_,h)}).catch(x=>a.emit("error",new pa.CacheError(x)))):p.cache&&l&&this.cache.delete(o).catch(x=>a.emit("error",new pa.CacheError(x))),a.emit("response",g||f),typeof i=="function"&&i(g||f)},"handler");try{let f=e(p,m);a.emit("request",f)}catch(f){a.emit("error",new pa.RequestError(f))}},"makeRequest"),u=s(p=>Promise.resolve().then(()=>p.cache?this.cache.get(o):void 0).then(m=>{if(typeof m>"u")return d(p);let f=u0.fromObject(m.cachePolicy);if(f.satisfiesWithoutRevalidation(p)){let g=f.responseHeaders(),x=new KE(m.statusCode,g,m.body,m.url);x.cachePolicy=f,x.fromCache=!0,a.emit("response",x),typeof i=="function"&&i(x)}else l=m,p.headers=f.revalidationHeaders(p),d(p)}),"get");return this.cache.on("error",p=>a.emit("error",new pa.CacheError(p))),u(n).catch(p=>{n.automaticFailover&&!c&&d(n),a.emit("error",new pa.CacheError(p))}),a}}};s(pa,"CacheableRequest");pa.RequestError=class extends Error{constructor(t){super(t.message),this.name="RequestError",Object.assign(this,t)}};pa.CacheError=class extends Error{constructor(t){super(t.message),this.name="CacheError",Object.assign(this,t)}};YE.exports=pa});var ZE=oe(($5e,p0)=>{"use strict";var d0=Ee("stream");function Kl(t,e,n){typeof n>"u"&&(n=e,e=t,t=null),d0.Duplex.call(this,t),typeof n.read!="function"&&(n=new d0.Readable(t).wrap(n)),this._writable=e,this._readable=n,this._waiting=!1;var i=this;e.once("finish",function(){i.end()}),this.once("finish",function(){e.end()}),n.on("readable",function(){i._waiting&&(i._waiting=!1,i._read())}),n.once("end",function(){i.push(null)}),(!t||typeof t.bubbleErrors>"u"||t.bubbleErrors)&&(e.on("error",function(a){i.emit("error",a)}),n.on("error",function(a){i.emit("error",a)}))}s(Kl,"DuplexWrapper");Kl.prototype=Object.create(d0.Duplex.prototype,{constructor:{value:Kl}});Kl.prototype._write=s(function(e,n,i){this._writable.write(e,n,i)},"_write");Kl.prototype._read=s(function(){for(var e,n=0;(e=this._readable.read())!==null;)this.push(e),n++;n===0&&(this._waiting=!0)},"_read");p0.exports=s(function(e,n,i){return new Kl(e,n,i)},"duplex2");p0.exports.DuplexWrapper=Kl});var ik=oe((tje,nk)=>{var QE=Os().Readable,lme=Ts();nk.exports=jm;jm.ctor=$E;jm.obj=dme;var cme=$E();function ume(t){return t=t.slice(),function(e,n){var i=null,a=t.length?t.shift():null;a instanceof Error&&(i=a,a=null),n(i,a)}}s(ume,"toFunction");function jm(t,e){(typeof t!="object"||Array.isArray(t))&&(e=t,t={});var n=new cme(t);return n._from=Array.isArray(e)?ume(e):e||ek,n}s(jm,"from2");function $E(t,e){typeof t=="function"&&(e=t,t={}),t=tk(t),lme(n,QE);function n(i){if(!(this instanceof n))return new n(i);this._reading=!1,this._callback=o,this.destroyed=!1,QE.call(this,i||t);var a=this,r=this._readableState.highWaterMark;function o(l,c){if(!a.destroyed){if(l)return a.destroy(l);if(c===null)return a.push(null);a._reading=!1,a.push(c)&&a._read(r)}}s(o,"check")}return s(n,"Class"),n.prototype._from=e||ek,n.prototype._read=function(i){this._reading||this.destroyed||(this._reading=!0,this._from(i,this._callback))},n.prototype.destroy=function(i){if(!this.destroyed){this.destroyed=!0;var a=this;process.nextTick(function(){i&&a.emit("error",i),a.emit("close")})}},n}s($E,"ctor");function dme(t,e){return(typeof t=="function"||Array.isArray(t))&&(e=t,t={}),t=tk(t),t.objectMode=!0,t.highWaterMark=16,jm(t,e)}s(dme,"obj");function ek(){}s(ek,"noop");function tk(t){return t=t||{},t}s(tk,"defaults")});var rk=oe((ije,ak)=>{"use strict";ak.exports=t=>t instanceof Promise||t!==null&&typeof t=="object"&&typeof t.then=="function"&&typeof t.catch=="function"});var lk=oe((aje,m0)=>{"use strict";var ok=ik(),sk=rk();m0.exports=t=>{Array.isArray(t)&&(t=t.slice());let e,n;i(t);function i(a){t=a,e=sk(t)?t:null,n=!e&&t[Symbol.iterator]&&typeof t!="string"&&!Buffer.isBuffer(t)?t[Symbol.iterator]():null}return s(i,"prepare"),ok(s(function a(r,o){if(e){e.then(i).then(()=>a.call(this,r,o),o);return}if(n){let c=n.next();setImmediate(o,null,c.done?null:c.value);return}if(t.length===0){setImmediate(o,null,null);return}let l=t.slice(0,r);t=t.slice(r),setImmediate(o,null,l)},"reader"))};m0.exports.obj=t=>{Array.isArray(t)&&(t=t.slice());let e,n;i(t);function i(a){t=a,e=sk(t)?t:null,n=!e&&t[Symbol.iterator]?t[Symbol.iterator]():null}return s(i,"prepare"),ok.obj(s(function a(r,o){if(e){e.then(i).then(()=>a.call(this,r,o),o);return}if(n){let l=n.next();setImmediate(o,null,l.done?null:l.value);return}this.push(t),setImmediate(o,null,null)},"reader"))}});var g0=oe((f0,h0)=>{"use strict";Object.defineProperty(f0,"__esModule",{value:!0});var ck=Ee("util"),pme=Object.prototype.toString,Mu=s(t=>e=>typeof e===t,"isOfType"),Am=s(t=>{let e=pme.call(t).slice(8,-1);return e||null},"getObjectType"),Pn=s(t=>e=>Am(e)===t,"isObjectOfType");function yr(t){if(t===null)return"null";if(t===!0||t===!1)return"boolean";let e=typeof t;if(e==="undefined")return"undefined";if(e==="string")return"string";if(e==="number")return"number";if(e==="symbol")return"symbol";if(yr.function_(t))return"Function";if(Array.isArray(t))return"Array";if(Buffer.isBuffer(t))return"Buffer";let n=Am(t);if(n)return n;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}s(yr,"is");(function(t){let e=s(h=>typeof h=="object","isObject");t.undefined=Mu("undefined"),t.string=Mu("string"),t.number=Mu("number"),t.function_=Mu("function"),t.null_=h=>h===null,t.class_=h=>t.function_(h)&&h.toString().startsWith("class "),t.boolean=h=>h===!0||h===!1,t.symbol=Mu("symbol"),t.array=Array.isArray,t.buffer=Buffer.isBuffer,t.nullOrUndefined=h=>t.null_(h)||t.undefined(h),t.object=h=>!t.nullOrUndefined(h)&&(t.function_(h)||e(h)),t.iterable=h=>!t.nullOrUndefined(h)&&t.function_(h[Symbol.iterator]),t.generator=h=>t.iterable(h)&&t.function_(h.next)&&t.function_(h.throw),t.nativePromise=Pn("Promise");let n=s(h=>!t.null_(h)&&e(h)&&t.function_(h.then)&&t.function_(h.catch),"hasPromiseAPI");t.promise=h=>t.nativePromise(h)||n(h);let i=s(h=>v=>t.function_(v)&&t.function_(v.constructor)&&v.constructor.name===h,"isFunctionOfType");t.generatorFunction=i("GeneratorFunction"),t.asyncFunction=i("AsyncFunction"),t.boundFunction=h=>t.function_(h)&&!h.hasOwnProperty("prototype"),t.regExp=Pn("RegExp"),t.date=Pn("Date"),t.error=Pn("Error"),t.map=Pn("Map"),t.set=Pn("Set"),t.weakMap=Pn("WeakMap"),t.weakSet=Pn("WeakSet"),t.int8Array=Pn("Int8Array"),t.uint8Array=Pn("Uint8Array"),t.uint8ClampedArray=Pn("Uint8ClampedArray"),t.int16Array=Pn("Int16Array"),t.uint16Array=Pn("Uint16Array"),t.int32Array=Pn("Int32Array"),t.uint32Array=Pn("Uint32Array"),t.float32Array=Pn("Float32Array"),t.float64Array=Pn("Float64Array"),t.arrayBuffer=Pn("ArrayBuffer"),t.sharedArrayBuffer=Pn("SharedArrayBuffer"),t.dataView=Pn("DataView"),t.directInstanceOf=(h,v)=>t.object(h)&&t.object(v)&&Object.getPrototypeOf(h)===v.prototype,t.truthy=h=>!!h,t.falsy=h=>!h,t.nan=h=>Number.isNaN(h);let a=new Set(["undefined","string","number","boolean","symbol"]);t.primitive=h=>t.null_(h)||a.has(typeof h),t.integer=h=>Number.isInteger(h),t.safeInteger=h=>Number.isSafeInteger(h),t.plainObject=h=>{let v;return Am(h)==="Object"&&(v=Object.getPrototypeOf(h),v===null||v===Object.getPrototypeOf({}))};let r=new Set(["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"]);t.typedArray=h=>{let v=Am(h);return v===null?!1:r.has(v)};let o=s(h=>t.safeInteger(h)&&h>-1,"isValidLength");t.arrayLike=h=>!t.nullOrUndefined(h)&&!t.function_(h)&&o(h.length),t.inRange=(h,v)=>{if(t.number(v))return h>=Math.min(0,v)&&h<=Math.max(v,0);if(t.array(v)&&v.length===2)return h>=Math.min.apply(null,v)&&h<=Math.max.apply(null,v);throw new TypeError(`Invalid range: ${ck.inspect(v)}`)};let l=1,c=["innerHTML","ownerDocument","style","attributes","nodeValue"];t.domElement=h=>t.object(h)&&h.nodeType===l&&t.string(h.nodeName)&&!t.plainObject(h)&&c.every(v=>v in h),t.nodeStream=h=>!t.nullOrUndefined(h)&&e(h)&&t.function_(h.pipe),t.infinite=h=>h===1/0||h===-1/0;let d=s(h=>v=>t.integer(v)&&Math.abs(v%2)===h,"isAbsoluteMod2");t.even=d(0),t.odd=d(1);let u=s(h=>t.string(h)&&/\S/.test(h)===!1,"isWhiteSpaceString"),p=s(h=>(t.string(h)||t.array(h))&&h.length===0,"isEmptyStringOrArray"),m=s(h=>!t.map(h)&&!t.set(h)&&t.object(h)&&Object.keys(h).length===0,"isEmptyObject"),f=s(h=>(t.map(h)||t.set(h))&&h.size===0,"isEmptyMapOrSet");t.empty=h=>t.falsy(h)||p(h)||m(h)||f(h),t.emptyOrWhitespace=h=>t.empty(h)||u(h);let g=s((h,v,b)=>{let y=Array.prototype.slice.call(b,1);if(t.function_(v)===!1)throw new TypeError(`Invalid predicate: ${ck.inspect(v)}`);if(y.length===0)throw new TypeError("Invalid number of values");return h.call(y,v)},"predicateOnArray");function x(h){return g(Array.prototype.some,h,arguments)}s(x,"any"),t.any=x;function _(h){return g(Array.prototype.every,h,arguments)}s(_,"all"),t.all=_})(yr||(yr={}));Object.defineProperties(yr,{class:{value:yr.class_},function:{value:yr.function_},null:{value:yr.null_}});f0.default=yr;h0.exports=yr;h0.exports.default=yr});var dk=oe((sje,uk)=>{"use strict";uk.exports=function(t,e){if(t.timeoutTimer)return t;var n=isNaN(e)?e:{socket:e,connect:e},i=t._headers?" to "+t._headers.host:"";n.connect!==void 0&&(t.timeoutTimer=setTimeout(s(function(){t.abort();var l=new Error("Connection timed out on request"+i);l.code="ETIMEDOUT",t.emit("error",l)},"timeoutHandler"),n.connect)),t.on("socket",s(function(l){if(!(l.connecting||l._connecting)){r();return}l.once("connect",r)},"assign"));function a(){t.timeoutTimer&&(clearTimeout(t.timeoutTimer),t.timeoutTimer=null)}s(a,"clear");function r(){a(),n.socket!==void 0&&t.setTimeout(n.socket,s(function(){t.abort();var l=new Error("Socket timed out on request"+i);l.code="ESOCKETTIMEDOUT",t.emit("error",l)},"socketTimeoutHandler"))}return s(r,"connect"),t.on("error",a)}});var mk=oe((cje,pk)=>{"use strict";var mme=Ee("url"),fme=n0();pk.exports=(t,e)=>{if(typeof t!="string")throw new TypeError(`Expected \`url\` to be of type \`string\`, got \`${typeof t}\` instead.`);let n=fme(t,Object.assign({https:!0},e));return mme.parse(n)}});var hk=oe((uje,fk)=>{"use strict";function hme(t){var e={protocol:t.protocol,hostname:t.hostname,hash:t.hash,search:t.search,pathname:t.pathname,path:`${t.pathname}${t.search}`,href:t.href};return t.port!==""&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username}:${t.password}`),e}s(hme,"urlToOptions");fk.exports=hme});var _k=oe((pje,gk)=>{"use strict";gk.exports=function(t){for(var e={},n=Object.keys(Object(t)),i=0;i{"use strict";var gme=Ee("stream").PassThrough,_me=Ee("zlib"),xme=Em();xk.exports=t=>{if(["gzip","deflate"].indexOf(t.headers["content-encoding"])===-1)return t;let e=_me.createUnzip(),n=new gme;return xme(t,n),e.on("error",i=>{if(i.code==="Z_BUF_ERROR"){n.end();return}n.emit("error",i)}),t.pipe(e).pipe(n),n}});var yk=oe((fje,bk)=>{"use strict";var vme=["ETIMEDOUT","ECONNRESET","EADDRINUSE","ESOCKETTIMEDOUT","ECONNREFUSED","EPIPE","EHOSTUNREACH","EAI_AGAIN"],bme=["ENOTFOUND","ENETUNREACH","UNABLE_TO_GET_ISSUER_CERT","UNABLE_TO_GET_CRL","UNABLE_TO_DECRYPT_CERT_SIGNATURE","UNABLE_TO_DECRYPT_CRL_SIGNATURE","UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY","CERT_SIGNATURE_FAILURE","CRL_SIGNATURE_FAILURE","CERT_NOT_YET_VALID","CERT_HAS_EXPIRED","CRL_NOT_YET_VALID","CRL_HAS_EXPIRED","ERROR_IN_CERT_NOT_BEFORE_FIELD","ERROR_IN_CERT_NOT_AFTER_FIELD","ERROR_IN_CRL_LAST_UPDATE_FIELD","ERROR_IN_CRL_NEXT_UPDATE_FIELD","OUT_OF_MEM","DEPTH_ZERO_SELF_SIGNED_CERT","SELF_SIGNED_CERT_IN_CHAIN","UNABLE_TO_GET_ISSUER_CERT_LOCALLY","UNABLE_TO_VERIFY_LEAF_SIGNATURE","CERT_CHAIN_TOO_LONG","CERT_REVOKED","INVALID_CA","PATH_LENGTH_EXCEEDED","INVALID_PURPOSE","CERT_UNTRUSTED","CERT_REJECTED"];bk.exports=function(t){return!t||!t.code||vme.indexOf(t.code)!==-1?!0:bme.indexOf(t.code)===-1}});var Ek=oe((hje,wk)=>{"use strict";wk.exports=typeof Symbol=="function"&&typeof Symbol("")=="symbol"});var jk=oe((gje,kk)=>{"use strict";kk.exports=Ek()&&typeof Symbol.toStringTag=="symbol"});var Tk=oe((_je,Ak)=>{"use strict";Ak.exports=s(function(e){return typeof e=="object"&&e!==null},"isObject")});var Ok=oe((vje,Sk)=>{"use strict";var yme=jk(),Ck=Tk(),wme=Object.prototype.toString,Eme="[object URL]",kme="hash",jme="host",Ame="hostname",Tme="href",Cme="password",Sme="pathname",Ome="port",Ime="protocol",Dme="search",Fme="username",_0=s((t,e)=>Ck(t)?!yme&&wme.call(t)===Eme?!0:!(!(Tme in t)||!(Ime in t)||!(Fme in t)||!(Cme in t)||!(Ame in t)||!(Ome in t)||!(jme in t)||!(Sme in t)||!(Dme in t)||!(kme in t)||e!==!0&&!Ck(t.searchParams)):!1,"isURL");_0.lenient=t=>_0(t,!0);Sk.exports=_0});var v0=oe((yje,x0)=>{"use strict";var Bu=class extends Error{constructor(){super("Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}};s(Bu,"CancelError");var Fs=class{static fn(e){return function(){let n=[].slice.apply(arguments);return new Fs((i,a,r)=>{n.push(r),e.apply(null,n).then(i,a)})}}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._promise=new Promise((n,i)=>(this._reject=i,e(a=>{this._isPending=!1,n(a)},a=>{this._isPending=!1,i(a)},a=>{this._cancelHandlers.push(a)})))}then(e,n){return this._promise.then(e,n)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let e of this._cancelHandlers)e()}catch(e){this._reject(e)}this._isCanceled=!0,this._reject(new Bu)}}get isCanceled(){return this._isCanceled}};s(Fs,"PCancelable");Object.setPrototypeOf(Fs.prototype,Promise.prototype);x0.exports=Fs;x0.exports.CancelError=Bu});var Dk=oe((Eje,Ik)=>{"use strict";Ik.exports=(t,e)=>(e=e||(()=>{}),t.then(n=>new Promise(i=>{i(e())}).then(()=>n),n=>new Promise(i=>{i(e())}).then(()=>{throw n})))});var y0=oe((kje,b0)=>{"use strict";var Nme=Dk(),Pu=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};s(Pu,"TimeoutError");b0.exports=(t,e,n)=>new Promise((i,a)=>{if(typeof e!="number"||e<0)throw new TypeError("Expected `ms` to be a positive number");let r=setTimeout(()=>{if(typeof n=="function"){try{i(n())}catch(c){a(c)}return}let o=typeof n=="string"?n:`Promise timed out after ${e} milliseconds`,l=n instanceof Error?n:new Pu(o);typeof t.cancel=="function"&&t.cancel(),a(l)},e);Nme(t.then(i,a),()=>{clearTimeout(r)})});b0.exports.TimeoutError=Pu});var Rk=oe((Aje,Nk)=>{"use strict";var Fk=s((t,e)=>function(){let n=e.promiseModule,i=new Array(arguments.length);for(let a=0;a{e.errorFirst?i.push(function(o,l){if(e.multiArgs){let c=new Array(arguments.length-1);for(let d=1;d{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=s(a=>{let r=s(o=>typeof o=="string"?a===o:o.test(a),"match");return e.include?e.include.some(r):!e.exclude.some(r)},"filter"),i;typeof t=="function"?i=s(function(){return e.excludeMain?t.apply(this,arguments):Fk(t,e).apply(this,arguments)},"ret"):i=Object.create(Object.getPrototypeOf(t));for(let a in t){let r=t[a];i[a]=typeof r=="function"&&n(a)?Fk(r,e):r}return i}});var Mk=oe((Cje,Rme)=>{Rme.exports={name:"got",version:"8.3.2",description:"Simplified HTTP requests",license:"MIT",repository:"sindresorhus/got",maintainers:[{name:"Sindre Sorhus",email:"sindresorhus@gmail.com",url:"sindresorhus.com"},{name:"Vsevolod Strukchinsky",email:"floatdrop@gmail.com",url:"github.com/floatdrop"},{name:"Alexander Tesfamichael",email:"alex.tesfamichael@gmail.com",url:"alextes.me"}],engines:{node:">=4"},scripts:{test:"xo && nyc ava",coveralls:"nyc report --reporter=text-lcov | coveralls"},files:["index.js","errors.js"],keywords:["http","https","get","got","url","uri","request","util","utility","simple","curl","wget","fetch","net","network","electron"],dependencies:{"@sindresorhus/is":"^0.7.0","cacheable-request":"^2.1.1","decompress-response":"^3.3.0",duplexer3:"^0.1.4","get-stream":"^3.0.0","into-stream":"^3.1.0","is-retry-allowed":"^1.1.0",isurl:"^1.0.0-alpha5","lowercase-keys":"^1.0.0","mimic-response":"^1.0.0","p-cancelable":"^0.4.0","p-timeout":"^2.0.1",pify:"^3.0.0","safe-buffer":"^5.1.1","timed-out":"^4.0.1","url-parse-lax":"^3.0.0","url-to-options":"^1.0.1"},devDependencies:{ava:"^0.25.0",coveralls:"^3.0.0","form-data":"^2.1.1","get-port":"^3.0.0",nyc:"^11.0.2","p-event":"^1.3.0",pem:"^1.4.4",proxyquire:"^1.8.0",sinon:"^4.0.0","slow-stream":"0.0.4",tempfile:"^2.0.0",tempy:"^0.2.1","universal-url":"1.0.0-alpha",xo:"^0.20.0"},ava:{concurrency:4},browser:{"decompress-response":!1,electron:!1}}});var Bk=oe((Sje,wr)=>{"use strict";var Mme=Ee("url"),w0=Ee("http"),Bme=v0(),Pme=g0(),Va=class extends Error{constructor(e,n,i){super(e),Error.captureStackTrace(this,this.constructor),this.name="GotError",Pme.undefined(n.code)||(this.code=n.code),Object.assign(this,{host:i.host,hostname:i.hostname,method:i.method,path:i.path,protocol:i.protocol,url:i.href})}};s(Va,"GotError");wr.exports.GotError=Va;wr.exports.CacheError=class extends Va{constructor(t,e){super(t.message,t,e),this.name="CacheError"}};wr.exports.RequestError=class extends Va{constructor(t,e){super(t.message,t,e),this.name="RequestError"}};wr.exports.ReadError=class extends Va{constructor(t,e){super(t.message,t,e),this.name="ReadError"}};wr.exports.ParseError=class extends Va{constructor(t,e,n,i){super(`${t.message} in "${Mme.format(n)}": ${i.slice(0,77)}...`,t,n),this.name="ParseError",this.statusCode=e,this.statusMessage=w0.STATUS_CODES[this.statusCode]}};wr.exports.HTTPError=class extends Va{constructor(t,e,n,i){e?e=e.replace(/\r?\n/g," ").trim():e=w0.STATUS_CODES[t],super(`Response code ${t} (${e})`,{},i),this.name="HTTPError",this.statusCode=t,this.statusMessage=e,this.headers=n}};wr.exports.MaxRedirectsError=class extends Va{constructor(t,e,n){super("Redirected 10 times. Aborting.",{},n),this.name="MaxRedirectsError",this.statusCode=t,this.statusMessage=w0.STATUS_CODES[this.statusCode],this.redirectUrls=e}};wr.exports.UnsupportedProtocolError=class extends Va{constructor(t){super(`Unsupported protocol "${t.protocol}"`,{},t),this.name="UnsupportedProtocolError"}};wr.exports.CancelError=Bme.CancelError});var zk=oe((Pje,Vk)=>{var Pk=Ee("fs"),E0=Ee("path"),Lk=E0.join(__dirname,"path.txt");function Lme(){let t;if(Pk.existsSync(Lk)&&(t=Pk.readFileSync(Lk,"utf-8")),process.env.ELECTRON_OVERRIDE_DIST_PATH)return E0.join(process.env.ELECTRON_OVERRIDE_DIST_PATH,t||"electron");if(t)return E0.join(__dirname,"dist",t);throw new Error("Electron failed to install correctly, please delete node_modules/electron and try installing again")}s(Lme,"getElectronPath");Vk.exports=Lme()});var t5=oe((Vje,e5)=>{"use strict";var Xk=Ee("events"),Vme=Ee("http"),zme=Ee("https"),Uk=Ee("stream").PassThrough,Ume=Ee("stream").Transform,Lu=Ee("url"),qk=Ee("fs"),Hk=Ee("querystring"),Jk=XE(),qme=ZE(),Hme=lk(),Dt=g0(),Gk=s0(),Jme=dk(),Gme=mk(),Wme=hk(),Kme=_k(),Wk=vk(),Yme=Em(),Xme=yk(),Zme=Ok(),Qme=v0(),$me=y0(),Kk=Rk(),Tm=Cp().Buffer,Yk=Mk(),efe=Bk(),tfe=new Set([300,301,302,303,304,305,307,308]),nfe=new Set([300,303,307,308]),k0=s(t=>Dt.nodeStream(t)&&Dt.function(t.getBoundary),"isFormData"),ife=s(t=>{let e=t.body;return t.headers["content-length"]?Number(t.headers["content-length"]):!e&&!t.stream?0:Dt.string(e)?Tm.byteLength(e):k0(e)?Kk(e.getLength.bind(e))():e instanceof qk.ReadStream?Kk(qk.stat)(e.path).then(n=>n.size):Dt.nodeStream(e)&&Dt.buffer(e._buffer)?e._buffer.length:null},"getBodySize");function Zk(t){t=t||{};let e=new Xk,n=t.href||Lu.resolve(Lu.format(t),t.path),i=[],a=Dt.object(t.agent)?t.agent:null,r=0,o,l,c=0,d=s(u=>{if(u.protocol!=="http:"&&u.protocol!=="https:"){e.emit("error",new Hn.UnsupportedProtocolError(u));return}let p=u.protocol==="https:"?zme:Vme;if(a){let x=u.protocol==="https:"?"https":"http";u.agent=a[x]||u.agent}if(u.useElectronNet&&process.versions.electron){let x=zk();p=x.net||x.remote.net}let m,g=new Jk(p.request,u.cache)(u,x=>{clearInterval(m),e.emit("uploadProgress",{percent:1,transferred:c,total:l});let _=x.statusCode;x.url=o||n,x.requestUrl=n;let h=u.followRedirect&&"location"in x.headers,v=h&&tfe.has(_);if(h&&nfe.has(_)||v&&(u.method==="GET"||u.method==="HEAD")){if(x.resume(),_===303&&(u.method="GET"),i.length>=10){e.emit("error",new Hn.MaxRedirectsError(_,i,u),null,x);return}let y=Tm.from(x.headers.location,"binary").toString();o=Lu.resolve(Lu.format(u),y),i.push(o);let w=Object.assign({},u,Lu.parse(o));e.emit("redirect",x,w),d(w);return}setImmediate(()=>{try{afe(x,u,e,i)}catch(y){e.emit("error",y)}})});g.on("error",x=>{x instanceof Jk.RequestError?e.emit("error",new Hn.RequestError(x,u)):e.emit("error",new Hn.CacheError(x,u))}),g.once("request",x=>{let _=!1;x.once("abort",h=>{_=!0}),x.once("error",h=>{if(clearInterval(m),_)return;let v=u.retries(++r,h);if(v){setTimeout(d,v,u);return}e.emit("error",new Hn.RequestError(h,u))}),e.once("request",h=>{e.emit("uploadProgress",{percent:0,transferred:0,total:l});let v=h.connection;if(v){let b=v.connecting===void 0?v._connecting:v.connecting,y=s(()=>{m=setInterval(()=>{if(v.destroyed){clearInterval(m);return}let S=c,F=h._header?Tm.byteLength(h._header):0;c=v.bytesWritten-F,l&&c>l&&(c=l),!(c===S||c===l)&&e.emit("uploadProgress",{percent:l?c/l:0,transferred:c,total:l})},150)},"onSocketConnect");b?v.once("connect",y):y()}}),u.gotTimeout&&(clearInterval(m),Jme(x,u.gotTimeout)),setImmediate(()=>{e.emit("request",x)})})},"get");return setImmediate(()=>{Promise.resolve(ife(t)).then(u=>{l=u,Dt.undefined(t.headers["content-length"])&&Dt.undefined(t.headers["transfer-encoding"])&&k0(t.body)&&(t.headers["content-length"]=u),d(t)}).catch(u=>{e.emit("error",u)})}),e}s(Zk,"requestAsEventEmitter");function afe(t,e,n,i){let a=Number(t.headers["content-length"])||null,r=0,o=new Ume({transform(c,d,u){r+=c.length;let p=a?r/a:0;p<1&&n.emit("downloadProgress",{percent:p,transferred:r,total:a}),u(null,c)},flush(c){n.emit("downloadProgress",{percent:1,transferred:r,total:a}),c()}});Yme(t,o),o.redirectUrls=i;let l=e.decompress===!0&&Dt.function(Wk)&&e.method!=="HEAD"?Wk(o):o;!e.decompress&&["gzip","deflate"].indexOf(t.headers["content-encoding"])!==-1&&(e.encoding=null),n.emit("response",l),n.emit("downloadProgress",{percent:0,transferred:0,total:a}),t.pipe(o)}s(afe,"getResponse");function rfe(t){let e=s(r=>t.gotTimeout&&t.gotTimeout.request?$me(r,t.gotTimeout.request,new Hn.RequestError({message:"Request timed out",code:"ETIMEDOUT"},t)):r,"timeoutFn"),n=new Xk,i=new Qme((r,o,l)=>{let c=Zk(t),d=!1;l(()=>{d=!0}),c.on("request",u=>{if(d&&u.abort(),l(()=>{u.abort()}),Dt.nodeStream(t.body)){t.body.pipe(u),t.body=void 0;return}u.end(t.body)}),c.on("response",u=>{(Dt.null(t.encoding)?Gk.buffer(u):Gk(u,t)).catch(m=>o(new Hn.ReadError(m,t))).then(m=>{let f=u.statusCode,g=t.followRedirect?299:399;if(u.body=m,t.json&&u.body)try{u.body=JSON.parse(u.body)}catch(x){if(f>=200&&f<300)throw new Hn.ParseError(x,f,t,m)}if(t.throwHttpErrors&&f!==304&&(f<200||f>g))throw new Hn.HTTPError(f,u.statusMessage,u.headers,t);r(u)}).catch(m=>{Object.defineProperty(m,"response",{value:u}),o(m)})}),c.once("error",o),c.on("redirect",n.emit.bind(n,"redirect")),c.on("uploadProgress",n.emit.bind(n,"uploadProgress")),c.on("downloadProgress",n.emit.bind(n,"downloadProgress"))});Object.defineProperty(i,"canceled",{get(){return i.isCanceled}});let a=e(i);return a.cancel=i.cancel.bind(i),a.on=(r,o)=>(n.on(r,o),a),a}s(rfe,"asPromise");function Qk(t){t.stream=!0;let e=new Uk,n=new Uk,i=qme(e,n),a;if(t.gotTimeout&&t.gotTimeout.request&&(a=setTimeout(()=>{i.emit("error",new Hn.RequestError({message:"Request timed out",code:"ETIMEDOUT"},t))},t.gotTimeout.request)),t.json)throw new Error("Got can not be used as a stream when the `json` option is used");t.body&&(i.write=()=>{throw new Error("Got's stream is not writable when the `body` option is used")});let r=Zk(t);return r.on("request",o=>{if(i.emit("request",o),Dt.nodeStream(t.body)){t.body.pipe(o);return}if(t.body){o.end(t.body);return}if(t.method==="POST"||t.method==="PUT"||t.method==="PATCH"){e.pipe(o);return}o.end()}),r.on("response",o=>{clearTimeout(a);let l=o.statusCode;if(o.on("error",c=>{i.emit("error",new Hn.ReadError(c,t))}),o.pipe(n),t.throwHttpErrors&&l!==304&&(l<200||l>299)){i.emit("error",new Hn.HTTPError(l,o.statusMessage,o.headers,t),null,o);return}i.emit("response",o)}),r.on("error",i.emit.bind(i,"error")),r.on("redirect",i.emit.bind(i,"redirect")),r.on("uploadProgress",i.emit.bind(i,"uploadProgress")),r.on("downloadProgress",i.emit.bind(i,"downloadProgress")),i}s(Qk,"asStream");function $k(t,e){if(!Dt.string(t)&&!Dt.object(t))throw new TypeError(`Parameter \`url\` must be a string or object, not ${Dt(t)}`);if(Dt.string(t)){t=t.replace(/^unix:/,"http://$&");try{decodeURI(t)}catch{throw new Error("Parameter `url` must contain valid UTF-8 character sequences")}if(t=Gme(t),t.auth)throw new Error("Basic authentication must be done with the `auth` option")}else Zme.lenient(t)&&(t=Wme(t));e=Object.assign({path:"",retries:2,cache:!1,decompress:!0,useElectronNet:!1,throwHttpErrors:!0},t,{protocol:t.protocol||"http:"},e);let n=Kme(e.headers);for(let r of Object.keys(n))Dt.nullOrUndefined(n[r])&&delete n[r];e.headers=Object.assign({"user-agent":`${Yk.name}/${Yk.version} (https://github.com/sindresorhus/got)`},n),e.decompress&&Dt.undefined(e.headers["accept-encoding"])&&(e.headers["accept-encoding"]="gzip, deflate");let i=e.query;i&&(Dt.string(i)||(e.query=Hk.stringify(i)),e.path=`${e.path.split("?")[0]}?${e.query}`,delete e.query),e.json&&Dt.undefined(e.headers.accept)&&(e.headers.accept="application/json");let a=e.body;if(Dt.nullOrUndefined(a))e.method=(e.method||"GET").toUpperCase();else{let r=e.headers;if(!Dt.nodeStream(a)&&!Dt.string(a)&&!Dt.buffer(a)&&!(e.form||e.json))throw new TypeError("The `body` option must be a stream.Readable, string, Buffer or plain Object");let o=Dt.plainObject(a)||Dt.array(a);if((e.form||e.json)&&!o)throw new TypeError("The `body` option must be a plain Object or Array when the `form` or `json` option is used");if(k0(a)?r["content-type"]=r["content-type"]||`multipart/form-data; boundary=${a.getBoundary()}`:e.form&&o?(r["content-type"]=r["content-type"]||"application/x-www-form-urlencoded",e.body=Hk.stringify(a)):e.json&&o&&(r["content-type"]=r["content-type"]||"application/json",e.body=JSON.stringify(a)),Dt.undefined(r["content-length"])&&Dt.undefined(r["transfer-encoding"])&&!Dt.nodeStream(a)){let l=Dt.string(e.body)?Tm.byteLength(e.body):e.body.length;r["content-length"]=l}Dt.buffer(a)&&(e.body=Hme(a),e.body._buffer=a),e.method=(e.method||"POST").toUpperCase()}if(e.hostname==="unix"){let r=/(.+?):(.+)/.exec(e.path);r&&(e.socketPath=r[1],e.path=r[2],e.host=null)}if(!Dt.function(e.retries)){let r=e.retries;e.retries=(o,l)=>{if(o>r||!Xme(l))return 0;let c=Math.random()*100;return(1<Qk($k(t,e));var ofe=["get","post","put","patch","head","delete"];for(let t of ofe)Hn[t]=(e,n)=>Hn(e,Object.assign({},n,{method:t})),Hn.stream[t]=(e,n)=>Hn.stream(e,Object.assign({},n,{method:t}));Object.assign(Hn,efe);e5.exports=Hn});var a5=oe((Uje,i5)=>{"use strict";var n5=s((t,e)=>function(...n){let i=e.promiseModule;return new i((a,r)=>{e.multiArgs?n.push((...o)=>{e.errorFirst?o[0]?r(o):(o.shift(),a(o)):a(o)}):e.errorFirst?n.push((o,l)=>{o?r(o):a(l)}):n.push(a),t.apply(this,n)})},"processFn");i5.exports=(t,e)=>{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=typeof t;if(!(t!==null&&(n==="object"||n==="function")))throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${t===null?"null":n}\``);let i=s(r=>{let o=s(l=>typeof l=="string"?r===l:l.test(r),"match");return e.include?e.include.some(o):!e.exclude.some(o)},"filter"),a;n==="function"?a=s(function(...r){return e.excludeMain?t(...r):n5(t,e).apply(this,r)},"ret"):a=Object.create(Object.getPrototypeOf(t));for(let r in t){let o=t[r];a[r]=typeof o=="function"&&i(r)?n5(o,e):o}return a}});var y5=oe((pt,b5)=>{pt=b5.exports=Ot;var Wt;typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?Wt=s(function(){var t=Array.prototype.slice.call(arguments,0);t.unshift("SEMVER"),console.log.apply(console,t)},"debug"):Wt=s(function(){},"debug");pt.SEMVER_SPEC_VERSION="2.0.0";var Vu=256,Cm=Number.MAX_SAFE_INTEGER||9007199254740991,j0=16,sfe=Vu-6,zu=pt.re=[],un=pt.safeRe=[],be=pt.src=[],Ct=0,O0="[a-zA-Z0-9-]",A0=[["\\s",1],["\\d",Vu],[O0,sfe]];function Nm(t){for(var e=0;e)?=?)";var Sm=Ct++;be[Sm]=be[Xl]+"|x|X|\\*";var Om=Ct++;be[Om]=be[Yl]+"|x|X|\\*";var Ns=Ct++;be[Ns]="[v=\\s]*("+be[Om]+")(?:\\.("+be[Om]+")(?:\\.("+be[Om]+")(?:"+be[D0]+")?"+be[qu]+"?)?)?";var Ql=Ct++;be[Ql]="[v=\\s]*("+be[Sm]+")(?:\\.("+be[Sm]+")(?:\\.("+be[Sm]+")(?:"+be[F0]+")?"+be[qu]+"?)?)?";var c5=Ct++;be[c5]="^"+be[tc]+"\\s*"+be[Ns]+"$";var u5=Ct++;be[u5]="^"+be[tc]+"\\s*"+be[Ql]+"$";var d5=Ct++;be[d5]="(?:^|[^\\d])(\\d{1,"+j0+"})(?:\\.(\\d{1,"+j0+"}))?(?:\\.(\\d{1,"+j0+"}))?(?:$|[^\\d])";var Rm=Ct++;be[Rm]="(?:~>?)";var $l=Ct++;be[$l]="(\\s*)"+be[Rm]+"\\s+";zu[$l]=new RegExp(be[$l],"g");un[$l]=new RegExp(Nm(be[$l]),"g");var lfe="$1~",p5=Ct++;be[p5]="^"+be[Rm]+be[Ns]+"$";var m5=Ct++;be[m5]="^"+be[Rm]+be[Ql]+"$";var Mm=Ct++;be[Mm]="(?:\\^)";var ec=Ct++;be[ec]="(\\s*)"+be[Mm]+"\\s+";zu[ec]=new RegExp(be[ec],"g");un[ec]=new RegExp(Nm(be[ec]),"g");var cfe="$1^",f5=Ct++;be[f5]="^"+be[Mm]+be[Ns]+"$";var h5=Ct++;be[h5]="^"+be[Mm]+be[Ql]+"$";var B0=Ct++;be[B0]="^"+be[tc]+"\\s*("+R0+")$|^$";var P0=Ct++;be[P0]="^"+be[tc]+"\\s*("+l5+")$|^$";var Rs=Ct++;be[Rs]="(\\s*)"+be[tc]+"\\s*("+R0+"|"+be[Ns]+")";zu[Rs]=new RegExp(be[Rs],"g");un[Rs]=new RegExp(Nm(be[Rs]),"g");var ufe="$1$2$3",g5=Ct++;be[g5]="^\\s*("+be[Ns]+")\\s+-\\s+("+be[Ns]+")\\s*$";var _5=Ct++;be[_5]="^\\s*("+be[Ql]+")\\s+-\\s+("+be[Ql]+")\\s*$";var x5=Ct++;be[x5]="(<|>)?=?\\s*\\*";for(Er=0;ErVu)return null;var n=e.loose?un[M0]:un[N0];if(!n.test(t))return null;try{return new Ot(t,e)}catch{return null}}s(Ms,"parse");pt.valid=dfe;function dfe(t,e){var n=Ms(t,e);return n?n.version:null}s(dfe,"valid");pt.clean=pfe;function pfe(t,e){var n=Ms(t.trim().replace(/^[=v]+/,""),e);return n?n.version:null}s(pfe,"clean");pt.SemVer=Ot;function Ot(t,e){if((!e||typeof e!="object")&&(e={loose:!!e,includePrerelease:!1}),t instanceof Ot){if(t.loose===e.loose)return t;t=t.version}else if(typeof t!="string")throw new TypeError("Invalid Version: "+t);if(t.length>Vu)throw new TypeError("version is longer than "+Vu+" characters");if(!(this instanceof Ot))return new Ot(t,e);Wt("SemVer",t,e),this.options=e,this.loose=!!e.loose;var n=t.trim().match(e.loose?un[M0]:un[N0]);if(!n)throw new TypeError("Invalid Version: "+t);if(this.raw=t,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>Cm||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Cm||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Cm||this.patch<0)throw new TypeError("Invalid patch version");n[4]?this.prerelease=n[4].split(".").map(function(i){if(/^[0-9]+$/.test(i)){var a=+i;if(a>=0&&a=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);n===-1&&this.prerelease.push(0)}e&&(this.prerelease[0]===e?isNaN(this.prerelease[1])&&(this.prerelease=[e,0]):this.prerelease=[e,0]);break;default:throw new Error("invalid increment argument: "+t)}return this.format(),this.raw=this.version,this};pt.inc=mfe;function mfe(t,e,n,i){typeof n=="string"&&(i=n,n=void 0);try{return new Ot(t,n).inc(e,i).version}catch{return null}}s(mfe,"inc");pt.diff=ffe;function ffe(t,e){if(L0(t,e))return null;var n=Ms(t),i=Ms(e),a="";if(n.prerelease.length||i.prerelease.length){a="pre";var r="prerelease"}for(var o in n)if((o==="major"||o==="minor"||o==="patch")&&n[o]!==i[o])return a+o;return r}s(ffe,"diff");pt.compareIdentifiers=Zl;var r5=/^[0-9]+$/;function Zl(t,e){var n=r5.test(t),i=r5.test(e);return n&&i&&(t=+t,e=+e),t===e?0:n&&!i?-1:i&&!n?1:t0}s(Uu,"gt");pt.lt=Im;function Im(t,e,n){return po(t,e,n)<0}s(Im,"lt");pt.eq=L0;function L0(t,e,n){return po(t,e,n)===0}s(L0,"eq");pt.neq=v5;function v5(t,e,n){return po(t,e,n)!==0}s(v5,"neq");pt.gte=V0;function V0(t,e,n){return po(t,e,n)>=0}s(V0,"gte");pt.lte=z0;function z0(t,e,n){return po(t,e,n)<=0}s(z0,"lte");pt.cmp=Dm;function Dm(t,e,n,i){switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof n=="object"&&(n=n.version),t===n;case"!==":return typeof t=="object"&&(t=t.version),typeof n=="object"&&(n=n.version),t!==n;case"":case"=":case"==":return L0(t,n,i);case"!=":return v5(t,n,i);case">":return Uu(t,n,i);case">=":return V0(t,n,i);case"<":return Im(t,n,i);case"<=":return z0(t,n,i);default:throw new TypeError("Invalid operator: "+e)}}s(Dm,"cmp");pt.Comparator=ma;function ma(t,e){if((!e||typeof e!="object")&&(e={loose:!!e,includePrerelease:!1}),t instanceof ma){if(t.loose===!!e.loose)return t;t=t.value}if(!(this instanceof ma))return new ma(t,e);t=t.trim().split(/\s+/).join(" "),Wt("comparator",t,e),this.options=e,this.loose=!!e.loose,this.parse(t),this.semver===Hu?this.value="":this.value=this.operator+this.semver.version,Wt("comp",this)}s(ma,"Comparator");var Hu={};ma.prototype.parse=function(t){var e=this.options.loose?un[B0]:un[P0],n=t.match(e);if(!n)throw new TypeError("Invalid comparator: "+t);this.operator=n[1],this.operator==="="&&(this.operator=""),n[2]?this.semver=new Ot(n[2],this.options.loose):this.semver=Hu};ma.prototype.toString=function(){return this.value};ma.prototype.test=function(t){return Wt("Comparator.test",t,this.options.loose),this.semver===Hu?!0:(typeof t=="string"&&(t=new Ot(t,this.options)),Dm(t,this.operator,this.semver,this.options))};ma.prototype.intersects=function(t,e){if(!(t instanceof ma))throw new TypeError("a Comparator is required");(!e||typeof e!="object")&&(e={loose:!!e,includePrerelease:!1});var n;if(this.operator==="")return n=new An(t.value,e),Fm(this.value,n,e);if(t.operator==="")return n=new An(this.value,e),Fm(t.semver,n,e);var i=(this.operator===">="||this.operator===">")&&(t.operator===">="||t.operator===">"),a=(this.operator==="<="||this.operator==="<")&&(t.operator==="<="||t.operator==="<"),r=this.semver.version===t.semver.version,o=(this.operator===">="||this.operator==="<=")&&(t.operator===">="||t.operator==="<="),l=Dm(this.semver,"<",t.semver,e)&&(this.operator===">="||this.operator===">")&&(t.operator==="<="||t.operator==="<"),c=Dm(this.semver,">",t.semver,e)&&(this.operator==="<="||this.operator==="<")&&(t.operator===">="||t.operator===">");return i||a||r&&o||l||c};pt.Range=An;function An(t,e){if((!e||typeof e!="object")&&(e={loose:!!e,includePrerelease:!1}),t instanceof An)return t.loose===!!e.loose&&t.includePrerelease===!!e.includePrerelease?t:new An(t.raw,e);if(t instanceof ma)return new An(t.value,e);if(!(this instanceof An))return new An(t,e);if(this.options=e,this.loose=!!e.loose,this.includePrerelease=!!e.includePrerelease,this.raw=t.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(function(n){return this.parseRange(n.trim())},this).filter(function(n){return n.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+this.raw);this.format()}s(An,"Range");An.prototype.format=function(){return this.range=this.set.map(function(t){return t.join(" ").trim()}).join("||").trim(),this.range};An.prototype.toString=function(){return this.range};An.prototype.parseRange=function(t){var e=this.options.loose,n=e?un[_5]:un[g5];t=t.replace(n,Dfe),Wt("hyphen replace",t),t=t.replace(un[Rs],ufe),Wt("comparator trim",t,un[Rs]),t=t.replace(un[$l],lfe),t=t.replace(un[ec],cfe);var i=e?un[B0]:un[P0],a=t.split(" ").map(function(r){return kfe(r,this.options)},this).join(" ").split(/\s+/);return this.options.loose&&(a=a.filter(function(r){return!!r.match(i)})),a=a.map(function(r){return new ma(r,this.options)},this),a};An.prototype.intersects=function(t,e){if(!(t instanceof An))throw new TypeError("a Range is required");return this.set.some(function(n){return n.every(function(i){return t.set.some(function(a){return a.every(function(r){return i.intersects(r,e)})})})})};pt.toComparators=Efe;function Efe(t,e){return new An(t,e).set.map(function(n){return n.map(function(i){return i.value}).join(" ").trim().split(" ")})}s(Efe,"toComparators");function kfe(t,e){return Wt("comp",t,e),t=Tfe(t,e),Wt("caret",t),t=jfe(t,e),Wt("tildes",t),t=Sfe(t,e),Wt("xrange",t),t=Ife(t,e),Wt("stars",t),t}s(kfe,"parseComparator");function ki(t){return!t||t.toLowerCase()==="x"||t==="*"}s(ki,"isX");function jfe(t,e){return t.trim().split(/\s+/).map(function(n){return Afe(n,e)}).join(" ")}s(jfe,"replaceTildes");function Afe(t,e){var n=e.loose?un[m5]:un[p5];return t.replace(n,function(i,a,r,o,l){Wt("tilde",t,i,a,r,o,l);var c;return ki(a)?c="":ki(r)?c=">="+a+".0.0 <"+(+a+1)+".0.0":ki(o)?c=">="+a+"."+r+".0 <"+a+"."+(+r+1)+".0":l?(Wt("replaceTilde pr",l),c=">="+a+"."+r+"."+o+"-"+l+" <"+a+"."+(+r+1)+".0"):c=">="+a+"."+r+"."+o+" <"+a+"."+(+r+1)+".0",Wt("tilde return",c),c})}s(Afe,"replaceTilde");function Tfe(t,e){return t.trim().split(/\s+/).map(function(n){return Cfe(n,e)}).join(" ")}s(Tfe,"replaceCarets");function Cfe(t,e){Wt("caret",t,e);var n=e.loose?un[h5]:un[f5];return t.replace(n,function(i,a,r,o,l){Wt("caret",t,i,a,r,o,l);var c;return ki(a)?c="":ki(r)?c=">="+a+".0.0 <"+(+a+1)+".0.0":ki(o)?a==="0"?c=">="+a+"."+r+".0 <"+a+"."+(+r+1)+".0":c=">="+a+"."+r+".0 <"+(+a+1)+".0.0":l?(Wt("replaceCaret pr",l),a==="0"?r==="0"?c=">="+a+"."+r+"."+o+"-"+l+" <"+a+"."+r+"."+(+o+1):c=">="+a+"."+r+"."+o+"-"+l+" <"+a+"."+(+r+1)+".0":c=">="+a+"."+r+"."+o+"-"+l+" <"+(+a+1)+".0.0"):(Wt("no pr"),a==="0"?r==="0"?c=">="+a+"."+r+"."+o+" <"+a+"."+r+"."+(+o+1):c=">="+a+"."+r+"."+o+" <"+a+"."+(+r+1)+".0":c=">="+a+"."+r+"."+o+" <"+(+a+1)+".0.0"),Wt("caret return",c),c})}s(Cfe,"replaceCaret");function Sfe(t,e){return Wt("replaceXRanges",t,e),t.split(/\s+/).map(function(n){return Ofe(n,e)}).join(" ")}s(Sfe,"replaceXRanges");function Ofe(t,e){t=t.trim();var n=e.loose?un[u5]:un[c5];return t.replace(n,function(i,a,r,o,l,c){Wt("xRange",t,i,a,r,o,l,c);var d=ki(r),u=d||ki(o),p=u||ki(l),m=p;return a==="="&&m&&(a=""),d?a===">"||a==="<"?i="<0.0.0":i="*":a&&m?(u&&(o=0),l=0,a===">"?(a=">=",u?(r=+r+1,o=0,l=0):(o=+o+1,l=0)):a==="<="&&(a="<",u?r=+r+1:o=+o+1),i=a+r+"."+o+"."+l):u?i=">="+r+".0.0 <"+(+r+1)+".0.0":p&&(i=">="+r+"."+o+".0 <"+r+"."+(+o+1)+".0"),Wt("xRange return",i),i})}s(Ofe,"replaceXRange");function Ife(t,e){return Wt("replaceStars",t,e),t.trim().replace(un[x5],"")}s(Ife,"replaceStars");function Dfe(t,e,n,i,a,r,o,l,c,d,u,p,m){return ki(n)?e="":ki(i)?e=">="+n+".0.0":ki(a)?e=">="+n+"."+i+".0":e=">="+e,ki(c)?l="":ki(d)?l="<"+(+c+1)+".0.0":ki(u)?l="<"+c+"."+(+d+1)+".0":p?l="<="+c+"."+d+"."+u+"-"+p:l="<="+l,(e+" "+l).trim()}s(Dfe,"hyphenReplace");An.prototype.test=function(t){if(!t)return!1;typeof t=="string"&&(t=new Ot(t,this.options));for(var e=0;e0){var a=t[i].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}s(Ffe,"testSet");pt.satisfies=Fm;function Fm(t,e,n){try{e=new An(e,n)}catch{return!1}return e.test(t)}s(Fm,"satisfies");pt.maxSatisfying=Nfe;function Nfe(t,e,n){var i=null,a=null;try{var r=new An(e,n)}catch{return null}return t.forEach(function(o){r.test(o)&&(!i||a.compare(o)===-1)&&(i=o,a=new Ot(i,n))}),i}s(Nfe,"maxSatisfying");pt.minSatisfying=Rfe;function Rfe(t,e,n){var i=null,a=null;try{var r=new An(e,n)}catch{return null}return t.forEach(function(o){r.test(o)&&(!i||a.compare(o)===1)&&(i=o,a=new Ot(i,n))}),i}s(Rfe,"minSatisfying");pt.minVersion=Mfe;function Mfe(t,e){t=new An(t,e);var n=new Ot("0.0.0");if(t.test(n)||(n=new Ot("0.0.0-0"),t.test(n)))return n;n=null;for(var i=0;i":o.prerelease.length===0?o.patch++:o.prerelease.push(0),o.raw=o.format();case"":case">=":(!n||Uu(n,o))&&(n=o);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+r.operator)}})}return n&&t.test(n)?n:null}s(Mfe,"minVersion");pt.validRange=Bfe;function Bfe(t,e){try{return new An(t,e).range||"*"}catch{return null}}s(Bfe,"validRange");pt.ltr=Pfe;function Pfe(t,e,n){return U0(t,e,"<",n)}s(Pfe,"ltr");pt.gtr=Lfe;function Lfe(t,e,n){return U0(t,e,">",n)}s(Lfe,"gtr");pt.outside=U0;function U0(t,e,n,i){t=new Ot(t,i),e=new An(e,i);var a,r,o,l,c;switch(n){case">":a=Uu,r=z0,o=Im,l=">",c=">=";break;case"<":a=Im,r=V0,o=Uu,l="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Fm(t,e,i))return!1;for(var d=0;d=0.0.0")),p=p||f,m=m||f,a(f.semver,p.semver,i)?p=f:o(f.semver,m.semver,i)&&(m=f)}),p.operator===l||p.operator===c||(!m.operator||m.operator===l)&&r(t,m.semver))return!1;if(m.operator===c&&o(t,m.semver))return!1}return!0}s(U0,"outside");pt.prerelease=Vfe;function Vfe(t,e){var n=Ms(t,e);return n&&n.prerelease.length?n.prerelease:null}s(Vfe,"prerelease");pt.intersects=zfe;function zfe(t,e,n){return t=new An(t,n),e=new An(e,n),t.intersects(e)}s(zfe,"intersects");pt.coerce=Ufe;function Ufe(t){if(t instanceof Ot)return t;if(typeof t!="string")return null;var e=t.match(un[d5]);return e==null?null:Ms(e[1]+"."+(e[2]||"0")+"."+(e[3]||"0"))}s(Ufe,"coerce")});var C5=oe((Jje,Pm)=>{"use strict";var Bm=Ee("fs"),mo=Ee("path"),w5=a5(),qfe=y5(),E5={mode:511&~process.umask(),fs:Bm},k5=qfe.satisfies(process.version,">=10.12.0"),j5=s(t=>{if(process.platform==="win32"&&/[<>:"|?*]/.test(t.replace(mo.parse(t).root,""))){let n=new Error(`Path contains invalid characters: ${t}`);throw n.code="EINVAL",n}},"checkPath"),A5=s(t=>{let e=new Error(`operation not permitted, mkdir '${t}'`);return e.code="EPERM",e.errno=-4048,e.path=t,e.syscall="mkdir",e},"permissionError"),T5=s((t,e)=>Promise.resolve().then(()=>{j5(t),e=Object.assign({},E5,e);let n=w5(e.fs.mkdir),i=w5(e.fs.stat);if(k5&&e.fs.mkdir===Bm.mkdir){let r=mo.resolve(t);return n(r,{mode:e.mode,recursive:!0}).then(()=>r)}let a=s(r=>n(r,e.mode).then(()=>r).catch(o=>{if(o.code==="EPERM")throw o;if(o.code==="ENOENT"){if(mo.dirname(r)===r)throw A5(r);if(o.message.includes("null bytes"))throw o;return a(mo.dirname(r)).then(()=>a(r))}return i(r).then(l=>l.isDirectory()?r:Promise.reject()).catch(()=>{throw o})}),"make");return a(mo.resolve(t))}),"makeDir");Pm.exports=T5;Pm.exports.default=T5;Pm.exports.sync=(t,e)=>{if(j5(t),e=Object.assign({},E5,e),k5&&e.fs.mkdirSync===Bm.mkdirSync){let i=mo.resolve(t);return Bm.mkdirSync(i,{mode:e.mode,recursive:!0}),i}let n=s(i=>{try{e.fs.mkdirSync(i,e.mode)}catch(a){if(a.code==="EPERM")throw a;if(a.code==="ENOENT"){if(mo.dirname(i)===i)throw A5(i);if(a.message.includes("null bytes"))throw a;return n(mo.dirname(i)),n(i)}try{if(!e.fs.statSync(i).isDirectory())throw new Error("The path is not a directory")}catch{throw a}}return i},"make");return n(mo.resolve(t))}});var I5=oe((Wje,O5)=>{"use strict";var S5=s((t,e)=>function(...n){let i=e.promiseModule;return new i((a,r)=>{e.multiArgs?n.push((...o)=>{e.errorFirst?o[0]?r(o):(o.shift(),a(o)):a(o)}):e.errorFirst?n.push((o,l)=>{o?r(o):a(l)}):n.push(a),t.apply(this,n)})},"processFn");O5.exports=(t,e)=>{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=typeof t;if(!(t!==null&&(n==="object"||n==="function")))throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${t===null?"null":n}\``);let i=s(r=>{let o=s(l=>typeof l=="string"?r===l:l.test(r),"match");return e.include?e.include.some(o):!e.exclude.some(o)},"filter"),a;n==="function"?a=s(function(...r){return e.excludeMain?t(...r):S5(t,e).apply(this,r)},"ret"):a=Object.create(Object.getPrototypeOf(t));for(let r in t){let o=t[r];a[r]=typeof o=="function"&&i(r)?S5(o,e):o}return a}});var R5=oe((Yje,Lm)=>{"use strict";var Hfe=y0(),Jfe=Symbol.asyncIterator||"@@asyncIterator",D5=s(t=>{let e=t.on||t.addListener||t.addEventListener,n=t.off||t.removeListener||t.removeEventListener;if(!e||!n)throw new TypeError("Emitter is not compatible");return{addListener:e.bind(t),removeListener:n.bind(t)}},"normalizeEmitter"),F5=s(t=>Array.isArray(t)?t:[t],"normalizeEvents"),N5=s((t,e,n)=>{let i,a=new Promise((r,o)=>{if(n=Object.assign({rejectionEvents:["error"],multiArgs:!1,resolveImmediately:!1},n),!(n.count>=0&&(n.count===1/0||Number.isInteger(n.count))))throw new TypeError("The `count` option should be at least 0 or more");let l=F5(e),c=[],{addListener:d,removeListener:u}=D5(t),p=s((...f)=>{let g=n.multiArgs?f:f[0];n.filter&&!n.filter(g)||(c.push(g),n.count===c.length&&(i(),r(c)))},"onItem"),m=s(f=>{i(),o(f)},"rejectHandler");i=s(()=>{for(let f of l)u(f,p);for(let f of n.rejectionEvents)u(f,m)},"cancel");for(let f of l)d(f,p);for(let f of n.rejectionEvents)d(f,m);n.resolveImmediately&&r(c)});if(a.cancel=i,typeof n.timeout=="number"){let r=Hfe(a,n.timeout);return r.cancel=i,r}return a},"multiple");Lm.exports=(t,e,n)=>{typeof n=="function"&&(n={filter:n}),n=Object.assign({},n,{count:1,resolveImmediately:!1});let i=N5(t,e,n),a=i.then(r=>r[0]);return a.cancel=i.cancel,a};Lm.exports.multiple=N5;Lm.exports.iterator=(t,e,n)=>{typeof n=="function"&&(n={filter:n});let i=F5(e);n=Object.assign({rejectionEvents:["error"],resolutionEvents:[],limit:1/0,multiArgs:!1},n);let{limit:a}=n;if(!(a>=0&&(a===1/0||Number.isInteger(a))))throw new TypeError("The `limit` option should be a non-negative integer or Infinity");if(a===0)return{[Symbol.asyncIterator](){return this},next(){return Promise.resolve({done:!0,value:void 0})}};let o=!1,{addListener:l,removeListener:c}=D5(t),d=!1,u,p=!1,m=[],f=[],g=0,x=s((...b)=>{g++,o=g===a;let y=n.multiArgs?b:b[0];if(m.length>0){let{resolve:w}=m.shift();w({done:!1,value:y}),o&&_();return}f.push(y),o&&_()},"valueHandler"),_=s(()=>{d=!0;for(let b of i)c(b,x);for(let b of n.rejectionEvents)c(b,h);for(let b of n.resolutionEvents)c(b,v);for(;m.length>0;){let{resolve:b}=m.shift();b({done:!0,value:void 0})}},"cancel"),h=s((...b)=>{if(u=n.multiArgs?b:b[0],m.length>0){let{reject:y}=m.shift();y(u)}else p=!0;_()},"rejectHandler"),v=s((...b)=>{let y=n.multiArgs?b:b[0];if(!(n.filter&&!n.filter(y))){if(m.length>0){let{resolve:w}=m.shift();w({done:!0,value:y})}else f.push(y);_()}},"resolveHandler");for(let b of i)l(b,x);for(let b of n.rejectionEvents)l(b,h);for(let b of n.resolutionEvents)l(b,v);return{[Jfe](){return this},next(){if(f.length>0){let b=f.shift();return Promise.resolve({done:d&&f.length===0&&!o,value:b})}return p?(p=!1,Promise.reject(u)):d?Promise.resolve({done:!0,value:void 0}):new Promise((b,y)=>m.push({resolve:b,reject:y}))},return(b){return _(),Promise.resolve({done:d,value:b})}}}});var B5=oe(Ju=>{"use strict";Ju.stringToBytes=t=>[...t].map(e=>e.charCodeAt(0));var M5=s((t,e,n)=>String.fromCharCode(...t.slice(e,n)),"uint8ArrayUtf8ByteString");Ju.readUInt64LE=(t,e=0)=>{let n=t[e],i=1,a=0;for(;++a<8;)i*=256,n+=t[e+a]*i;return n};Ju.tarHeaderChecksumMatches=t=>{if(t.length<512)return!1;let e=128,n=256,i=0;for(let r=0;r<148;r++){let o=t[r];n+=o,i+=o&e}for(let r=156;r<512;r++){let o=t[r];n+=o,i+=o&e}let a=parseInt(M5(t,148,154),8);return a===n||a===n-(i<<1)};Ju.uint8ArrayUtf8ByteString=M5});var P5=oe((exports,module)=>{"use strict";var{stringToBytes,readUInt64LE,tarHeaderChecksumMatches,uint8ArrayUtf8ByteString}=B5(),xpiZipFilename=stringToBytes("META-INF/mozilla.rsa"),oxmlContentTypes=stringToBytes("[Content_Types].xml"),oxmlRels=stringToBytes("_rels/.rels"),fileType=s(t=>{if(!(t instanceof Uint8Array||t instanceof ArrayBuffer||Buffer.isBuffer(t)))throw new TypeError(`Expected the \`input\` argument to be of type \`Uint8Array\` or \`Buffer\` or \`ArrayBuffer\`, got \`${typeof t}\``);let e=t instanceof Uint8Array?t:new Uint8Array(t);if(!(e&&e.length>1))return;let n=s((a,r)=>{r=Object.assign({offset:0},r);for(let o=0;on(stringToBytes(a),r),"checkString");if(n([255,216,255]))return{ext:"jpg",mime:"image/jpeg"};if(n([137,80,78,71,13,10,26,10]))return{ext:"png",mime:"image/png"};if(n([71,73,70]))return{ext:"gif",mime:"image/gif"};if(n([87,69,66,80],{offset:8}))return{ext:"webp",mime:"image/webp"};if(n([70,76,73,70]))return{ext:"flif",mime:"image/flif"};if((n([73,73,42,0])||n([77,77,0,42]))&&n([67,82],{offset:8}))return{ext:"cr2",mime:"image/x-canon-cr2"};if(n([73,73,82,79,8,0,0,0,24]))return{ext:"orf",mime:"image/x-olympus-orf"};if(n([73,73,42,0,16,251,134,1]))return{ext:"arw",mime:"image/x-sony-arw"};if(n([73,73,42,0,8,0,0,0,45]))return{ext:"dng",mime:"image/x-adobe-dng"};if(n([73,73,42,0,48,61,114,1,28]))return{ext:"nef",mime:"image/x-nikon-nef"};if(n([73,73,42,0])||n([77,77,0,42]))return{ext:"tif",mime:"image/tiff"};if(n([66,77]))return{ext:"bmp",mime:"image/bmp"};if(n([73,73,188]))return{ext:"jxr",mime:"image/vnd.ms-photo"};if(n([56,66,80,83]))return{ext:"psd",mime:"image/vnd.adobe.photoshop"};if(n([80,75,3,4])){if(n([109,105,109,101,116,121,112,101,97,112,112,108,105,99,97,116,105,111,110,47,101,112,117,98,43,122,105,112],{offset:30}))return{ext:"epub",mime:"application/epub+zip"};if(n(xpiZipFilename,{offset:30}))return{ext:"xpi",mime:"application/x-xpinstall"};if(i("mimetypeapplication/vnd.oasis.opendocument.text",{offset:30}))return{ext:"odt",mime:"application/vnd.oasis.opendocument.text"};if(i("mimetypeapplication/vnd.oasis.opendocument.spreadsheet",{offset:30}))return{ext:"ods",mime:"application/vnd.oasis.opendocument.spreadsheet"};if(i("mimetypeapplication/vnd.oasis.opendocument.presentation",{offset:30}))return{ext:"odp",mime:"application/vnd.oasis.opendocument.presentation"};let a=s((c,d=0)=>c.findIndex((u,p,m)=>p>=d&&m[p]===80&&m[p+1]===75&&m[p+2]===3&&m[p+3]===4),"findNextZipHeaderIndex"),r=0,o=!1,l;do{let c=r+30;if(o||(o=n(oxmlContentTypes,{offset:c})||n(oxmlRels,{offset:c})),l||(i("word/",{offset:c})?l={ext:"docx",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}:i("ppt/",{offset:c})?l={ext:"pptx",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"}:i("xl/",{offset:c})&&(l={ext:"xlsx",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})),o&&l)return l;r=a(e,c)}while(r>=0);if(l)return l}if(n([80,75])&&(e[2]===3||e[2]===5||e[2]===7)&&(e[3]===4||e[3]===6||e[3]===8))return{ext:"zip",mime:"application/zip"};if(n([48,48,48,48,48,48],{offset:148,mask:[248,248,248,248,248,248]})&&tarHeaderChecksumMatches(e))return{ext:"tar",mime:"application/x-tar"};if(n([82,97,114,33,26,7])&&(e[6]===0||e[6]===1))return{ext:"rar",mime:"application/x-rar-compressed"};if(n([31,139,8]))return{ext:"gz",mime:"application/gzip"};if(n([66,90,104]))return{ext:"bz2",mime:"application/x-bzip2"};if(n([55,122,188,175,39,28]))return{ext:"7z",mime:"application/x-7z-compressed"};if(n([120,1]))return{ext:"dmg",mime:"application/x-apple-diskimage"};if(n([102,114,101,101],{offset:4})||n([109,100,97,116],{offset:4})||n([109,111,111,118],{offset:4})||n([119,105,100,101],{offset:4}))return{ext:"mov",mime:"video/quicktime"};if(n([102,116,121,112],{offset:4})&&e[8]&96&&e[9]&96&&e[10]&96&&e[11]&96){let a=uint8ArrayUtf8ByteString(e,8,12);switch(a){case"mif1":return{ext:"heic",mime:"image/heif"};case"msf1":return{ext:"heic",mime:"image/heif-sequence"};case"heic":case"heix":return{ext:"heic",mime:"image/heic"};case"hevc":case"hevx":return{ext:"heic",mime:"image/heic-sequence"};case"qt ":return{ext:"mov",mime:"video/quicktime"};case"M4V ":case"M4VH":case"M4VP":return{ext:"m4v",mime:"video/x-m4v"};case"M4P ":return{ext:"m4p",mime:"video/mp4"};case"M4B ":return{ext:"m4b",mime:"audio/mp4"};case"M4A ":return{ext:"m4a",mime:"audio/x-m4a"};case"F4V ":return{ext:"f4v",mime:"video/mp4"};case"F4P ":return{ext:"f4p",mime:"video/mp4"};case"F4A ":return{ext:"f4a",mime:"audio/mp4"};case"F4B ":return{ext:"f4b",mime:"audio/mp4"};default:return a.startsWith("3g")?a.startsWith("3g2")?{ext:"3g2",mime:"video/3gpp2"}:{ext:"3gp",mime:"video/3gpp"}:{ext:"mp4",mime:"video/mp4"}}}if(n([77,84,104,100]))return{ext:"mid",mime:"audio/midi"};if(n([26,69,223,163])){let a=e.subarray(4,4100),r=a.findIndex((o,l,c)=>c[l]===66&&c[l+1]===130);if(r!==-1){let o=r+3,l=s(c=>[...c].every((d,u)=>a[o+u]===d.charCodeAt(0)),"findDocType");if(l("matroska"))return{ext:"mkv",mime:"video/x-matroska"};if(l("webm"))return{ext:"webm",mime:"video/webm"}}}if(n([82,73,70,70])){if(n([65,86,73],{offset:8}))return{ext:"avi",mime:"video/vnd.avi"};if(n([87,65,86,69],{offset:8}))return{ext:"wav",mime:"audio/vnd.wave"};if(n([81,76,67,77],{offset:8}))return{ext:"qcp",mime:"audio/qcelp"}}if(n([48,38,178,117,142,102,207,17,166,217])){let a=30;do{let r=readUInt64LE(e,a+16);if(n([145,7,220,183,183,169,207,17,142,230,0,192,12,32,83,101],{offset:a})){if(n([64,158,105,248,77,91,207,17,168,253,0,128,95,92,68,43],{offset:a+24}))return{ext:"wma",mime:"audio/x-ms-wma"};if(n([192,239,25,188,77,91,207,17,168,253,0,128,95,92,68,43],{offset:a+24}))return{ext:"wmv",mime:"video/x-ms-asf"};break}a+=r}while(a+24<=e.length);return{ext:"asf",mime:"application/vnd.ms-asf"}}if(n([0,0,1,186])||n([0,0,1,179]))return{ext:"mpg",mime:"video/mpeg"};for(let a=0;a<2&&anew Promise((resolve,reject)=>{let stream=eval("require")("stream");readableStream.once("readable",()=>{let t=new stream.PassThrough,e=readableStream.read(module.exports.minimumBytes)||readableStream.read();try{t.fileType=fileType(e)}catch(n){reject(n)}readableStream.unshift(e),stream.pipeline?resolve(stream.pipeline(readableStream,t,()=>{})):resolve(readableStream.pipe(t))})})});var L5=oe((eAe,Gfe)=>{Gfe.exports={"application/1d-interleaved-parityfec":{source:"iana"},"application/3gpdash-qoe-report+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/3gpp-ims+xml":{source:"iana",compressible:!0},"application/3gpphal+json":{source:"iana",compressible:!0},"application/3gpphalforms+json":{source:"iana",compressible:!0},"application/a2l":{source:"iana"},"application/ace+cbor":{source:"iana"},"application/ace+json":{source:"iana",compressible:!0},"application/ace-groupcomm+cbor":{source:"iana"},"application/activemessage":{source:"iana"},"application/activity+json":{source:"iana",compressible:!0},"application/aif+cbor":{source:"iana"},"application/aif+json":{source:"iana",compressible:!0},"application/alto-cdni+json":{source:"iana",compressible:!0},"application/alto-cdnifilter+json":{source:"iana",compressible:!0},"application/alto-costmap+json":{source:"iana",compressible:!0},"application/alto-costmapfilter+json":{source:"iana",compressible:!0},"application/alto-directory+json":{source:"iana",compressible:!0},"application/alto-endpointcost+json":{source:"iana",compressible:!0},"application/alto-endpointcostparams+json":{source:"iana",compressible:!0},"application/alto-endpointprop+json":{source:"iana",compressible:!0},"application/alto-endpointpropparams+json":{source:"iana",compressible:!0},"application/alto-error+json":{source:"iana",compressible:!0},"application/alto-networkmap+json":{source:"iana",compressible:!0},"application/alto-networkmapfilter+json":{source:"iana",compressible:!0},"application/alto-propmap+json":{source:"iana",compressible:!0},"application/alto-propmapparams+json":{source:"iana",compressible:!0},"application/alto-tips+json":{source:"iana",compressible:!0},"application/alto-tipsparams+json":{source:"iana",compressible:!0},"application/alto-updatestreamcontrol+json":{source:"iana",compressible:!0},"application/alto-updatestreamparams+json":{source:"iana",compressible:!0},"application/aml":{source:"iana"},"application/andrew-inset":{source:"iana",extensions:["ez"]},"application/appinstaller":{compressible:!1,extensions:["appinstaller"]},"application/applefile":{source:"iana"},"application/applixware":{source:"apache",extensions:["aw"]},"application/appx":{compressible:!1,extensions:["appx"]},"application/appxbundle":{compressible:!1,extensions:["appxbundle"]},"application/at+jwt":{source:"iana"},"application/atf":{source:"iana"},"application/atfx":{source:"iana"},"application/atom+xml":{source:"iana",compressible:!0,extensions:["atom"]},"application/atomcat+xml":{source:"iana",compressible:!0,extensions:["atomcat"]},"application/atomdeleted+xml":{source:"iana",compressible:!0,extensions:["atomdeleted"]},"application/atomicmail":{source:"iana"},"application/atomsvc+xml":{source:"iana",compressible:!0,extensions:["atomsvc"]},"application/atsc-dwd+xml":{source:"iana",compressible:!0,extensions:["dwd"]},"application/atsc-dynamic-event-message":{source:"iana"},"application/atsc-held+xml":{source:"iana",compressible:!0,extensions:["held"]},"application/atsc-rdt+json":{source:"iana",compressible:!0},"application/atsc-rsat+xml":{source:"iana",compressible:!0,extensions:["rsat"]},"application/atxml":{source:"iana"},"application/auth-policy+xml":{source:"iana",compressible:!0},"application/automationml-aml+xml":{source:"iana",compressible:!0,extensions:["aml"]},"application/automationml-amlx+zip":{source:"iana",compressible:!1,extensions:["amlx"]},"application/bacnet-xdd+zip":{source:"iana",compressible:!1},"application/batch-smtp":{source:"iana"},"application/bdoc":{compressible:!1,extensions:["bdoc"]},"application/beep+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/bufr":{source:"iana"},"application/c2pa":{source:"iana"},"application/calendar+json":{source:"iana",compressible:!0},"application/calendar+xml":{source:"iana",compressible:!0,extensions:["xcs"]},"application/call-completion":{source:"iana"},"application/cals-1840":{source:"iana"},"application/captive+json":{source:"iana",compressible:!0},"application/cbor":{source:"iana"},"application/cbor-seq":{source:"iana"},"application/cccex":{source:"iana"},"application/ccmp+xml":{source:"iana",compressible:!0},"application/ccxml+xml":{source:"iana",compressible:!0,extensions:["ccxml"]},"application/cda+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/cdfx+xml":{source:"iana",compressible:!0,extensions:["cdfx"]},"application/cdmi-capability":{source:"iana",extensions:["cdmia"]},"application/cdmi-container":{source:"iana",extensions:["cdmic"]},"application/cdmi-domain":{source:"iana",extensions:["cdmid"]},"application/cdmi-object":{source:"iana",extensions:["cdmio"]},"application/cdmi-queue":{source:"iana",extensions:["cdmiq"]},"application/cdni":{source:"iana"},"application/cea":{source:"iana"},"application/cea-2018+xml":{source:"iana",compressible:!0},"application/cellml+xml":{source:"iana",compressible:!0},"application/cfw":{source:"iana"},"application/cid-edhoc+cbor-seq":{source:"iana"},"application/city+json":{source:"iana",compressible:!0},"application/clr":{source:"iana"},"application/clue+xml":{source:"iana",compressible:!0},"application/clue_info+xml":{source:"iana",compressible:!0},"application/cms":{source:"iana"},"application/cnrp+xml":{source:"iana",compressible:!0},"application/coap-group+json":{source:"iana",compressible:!0},"application/coap-payload":{source:"iana"},"application/commonground":{source:"iana"},"application/concise-problem-details+cbor":{source:"iana"},"application/conference-info+xml":{source:"iana",compressible:!0},"application/cose":{source:"iana"},"application/cose-key":{source:"iana"},"application/cose-key-set":{source:"iana"},"application/cose-x509":{source:"iana"},"application/cpl+xml":{source:"iana",compressible:!0,extensions:["cpl"]},"application/csrattrs":{source:"iana"},"application/csta+xml":{source:"iana",compressible:!0},"application/cstadata+xml":{source:"iana",compressible:!0},"application/csvm+json":{source:"iana",compressible:!0},"application/cu-seeme":{source:"apache",extensions:["cu"]},"application/cwl":{source:"iana",extensions:["cwl"]},"application/cwl+json":{source:"iana",compressible:!0},"application/cwl+yaml":{source:"iana"},"application/cwt":{source:"iana"},"application/cybercash":{source:"iana"},"application/dart":{compressible:!0},"application/dash+xml":{source:"iana",compressible:!0,extensions:["mpd"]},"application/dash-patch+xml":{source:"iana",compressible:!0,extensions:["mpp"]},"application/dashdelta":{source:"iana"},"application/davmount+xml":{source:"iana",compressible:!0,extensions:["davmount"]},"application/dca-rft":{source:"iana"},"application/dcd":{source:"iana"},"application/dec-dx":{source:"iana"},"application/dialog-info+xml":{source:"iana",compressible:!0},"application/dicom":{source:"iana"},"application/dicom+json":{source:"iana",compressible:!0},"application/dicom+xml":{source:"iana",compressible:!0},"application/dii":{source:"iana"},"application/dit":{source:"iana"},"application/dns":{source:"iana"},"application/dns+json":{source:"iana",compressible:!0},"application/dns-message":{source:"iana"},"application/docbook+xml":{source:"apache",compressible:!0,extensions:["dbk"]},"application/dots+cbor":{source:"iana"},"application/dpop+jwt":{source:"iana"},"application/dskpp+xml":{source:"iana",compressible:!0},"application/dssc+der":{source:"iana",extensions:["dssc"]},"application/dssc+xml":{source:"iana",compressible:!0,extensions:["xdssc"]},"application/dvcs":{source:"iana"},"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/edhoc+cbor-seq":{source:"iana"},"application/edi-consent":{source:"iana"},"application/edi-x12":{source:"iana",compressible:!1},"application/edifact":{source:"iana",compressible:!1},"application/efi":{source:"iana"},"application/elm+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/elm+xml":{source:"iana",compressible:!0},"application/emergencycalldata.cap+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/emergencycalldata.comment+xml":{source:"iana",compressible:!0},"application/emergencycalldata.control+xml":{source:"iana",compressible:!0},"application/emergencycalldata.deviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.ecall.msd":{source:"iana"},"application/emergencycalldata.legacyesn+json":{source:"iana",compressible:!0},"application/emergencycalldata.providerinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.serviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.subscriberinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.veds+xml":{source:"iana",compressible:!0},"application/emma+xml":{source:"iana",compressible:!0,extensions:["emma"]},"application/emotionml+xml":{source:"iana",compressible:!0,extensions:["emotionml"]},"application/encaprtp":{source:"iana"},"application/epp+xml":{source:"iana",compressible:!0},"application/epub+zip":{source:"iana",compressible:!1,extensions:["epub"]},"application/eshop":{source:"iana"},"application/exi":{source:"iana",extensions:["exi"]},"application/expect-ct-report+json":{source:"iana",compressible:!0},"application/express":{source:"iana",extensions:["exp"]},"application/fastinfoset":{source:"iana"},"application/fastsoap":{source:"iana"},"application/fdf":{source:"iana",extensions:["fdf"]},"application/fdt+xml":{source:"iana",compressible:!0,extensions:["fdt"]},"application/fhir+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/fhir+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/fido.trusted-apps+json":{compressible:!0},"application/fits":{source:"iana"},"application/flexfec":{source:"iana"},"application/font-sfnt":{source:"iana"},"application/font-tdpfr":{source:"iana",extensions:["pfr"]},"application/font-woff":{source:"iana",compressible:!1},"application/framework-attributes+xml":{source:"iana",compressible:!0},"application/geo+json":{source:"iana",compressible:!0,extensions:["geojson"]},"application/geo+json-seq":{source:"iana"},"application/geopackage+sqlite3":{source:"iana"},"application/geoxacml+json":{source:"iana",compressible:!0},"application/geoxacml+xml":{source:"iana",compressible:!0},"application/gltf-buffer":{source:"iana"},"application/gml+xml":{source:"iana",compressible:!0,extensions:["gml"]},"application/gnap-binding-jws":{source:"iana"},"application/gnap-binding-jwsd":{source:"iana"},"application/gnap-binding-rotation-jws":{source:"iana"},"application/gnap-binding-rotation-jwsd":{source:"iana"},"application/gpx+xml":{source:"apache",compressible:!0,extensions:["gpx"]},"application/grib":{source:"iana"},"application/gxf":{source:"apache",extensions:["gxf"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/h224":{source:"iana"},"application/held+xml":{source:"iana",compressible:!0},"application/hjson":{extensions:["hjson"]},"application/hl7v2+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/http":{source:"iana"},"application/hyperstudio":{source:"iana",extensions:["stk"]},"application/ibe-key-request+xml":{source:"iana",compressible:!0},"application/ibe-pkg-reply+xml":{source:"iana",compressible:!0},"application/ibe-pp-data":{source:"iana"},"application/iges":{source:"iana"},"application/im-iscomposing+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/index":{source:"iana"},"application/index.cmd":{source:"iana"},"application/index.obj":{source:"iana"},"application/index.response":{source:"iana"},"application/index.vnd":{source:"iana"},"application/inkml+xml":{source:"iana",compressible:!0,extensions:["ink","inkml"]},"application/iotp":{source:"iana"},"application/ipfix":{source:"iana",extensions:["ipfix"]},"application/ipp":{source:"iana"},"application/isup":{source:"iana"},"application/its+xml":{source:"iana",compressible:!0,extensions:["its"]},"application/java-archive":{source:"iana",compressible:!1,extensions:["jar","war","ear"]},"application/java-serialized-object":{source:"apache",compressible:!1,extensions:["ser"]},"application/java-vm":{source:"apache",compressible:!1,extensions:["class"]},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/jf2feed+json":{source:"iana",compressible:!0},"application/jose":{source:"iana"},"application/jose+json":{source:"iana",compressible:!0},"application/jrd+json":{source:"iana",compressible:!0},"application/jscalendar+json":{source:"iana",compressible:!0},"application/jscontact+json":{source:"iana",compressible:!0},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/json-patch+json":{source:"iana",compressible:!0},"application/json-seq":{source:"iana"},"application/json5":{extensions:["json5"]},"application/jsonml+json":{source:"apache",compressible:!0,extensions:["jsonml"]},"application/jsonpath":{source:"iana"},"application/jwk+json":{source:"iana",compressible:!0},"application/jwk-set+json":{source:"iana",compressible:!0},"application/jwt":{source:"iana"},"application/kpml-request+xml":{source:"iana",compressible:!0},"application/kpml-response+xml":{source:"iana",compressible:!0},"application/ld+json":{source:"iana",compressible:!0,extensions:["jsonld"]},"application/lgr+xml":{source:"iana",compressible:!0,extensions:["lgr"]},"application/link-format":{source:"iana"},"application/linkset":{source:"iana"},"application/linkset+json":{source:"iana",compressible:!0},"application/load-control+xml":{source:"iana",compressible:!0},"application/logout+jwt":{source:"iana"},"application/lost+xml":{source:"iana",compressible:!0,extensions:["lostxml"]},"application/lostsync+xml":{source:"iana",compressible:!0},"application/lpf+zip":{source:"iana",compressible:!1},"application/lxf":{source:"iana"},"application/mac-binhex40":{source:"iana",extensions:["hqx"]},"application/mac-compactpro":{source:"apache",extensions:["cpt"]},"application/macwriteii":{source:"iana"},"application/mads+xml":{source:"iana",compressible:!0,extensions:["mads"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/marcxml+xml":{source:"iana",compressible:!0,extensions:["mrcx"]},"application/mathematica":{source:"iana",extensions:["ma","nb","mb"]},"application/mathml+xml":{source:"iana",compressible:!0,extensions:["mathml"]},"application/mathml-content+xml":{source:"iana",compressible:!0},"application/mathml-presentation+xml":{source:"iana",compressible:!0},"application/mbms-associated-procedure-description+xml":{source:"iana",compressible:!0},"application/mbms-deregister+xml":{source:"iana",compressible:!0},"application/mbms-envelope+xml":{source:"iana",compressible:!0},"application/mbms-msk+xml":{source:"iana",compressible:!0},"application/mbms-msk-response+xml":{source:"iana",compressible:!0},"application/mbms-protection-description+xml":{source:"iana",compressible:!0},"application/mbms-reception-report+xml":{source:"iana",compressible:!0},"application/mbms-register+xml":{source:"iana",compressible:!0},"application/mbms-register-response+xml":{source:"iana",compressible:!0},"application/mbms-schedule+xml":{source:"iana",compressible:!0},"application/mbms-user-service-description+xml":{source:"iana",compressible:!0},"application/mbox":{source:"iana",extensions:["mbox"]},"application/media-policy-dataset+xml":{source:"iana",compressible:!0,extensions:["mpf"]},"application/media_control+xml":{source:"iana",compressible:!0},"application/mediaservercontrol+xml":{source:"iana",compressible:!0,extensions:["mscml"]},"application/merge-patch+json":{source:"iana",compressible:!0},"application/metalink+xml":{source:"apache",compressible:!0,extensions:["metalink"]},"application/metalink4+xml":{source:"iana",compressible:!0,extensions:["meta4"]},"application/mets+xml":{source:"iana",compressible:!0,extensions:["mets"]},"application/mf4":{source:"iana"},"application/mikey":{source:"iana"},"application/mipc":{source:"iana"},"application/missing-blocks+cbor-seq":{source:"iana"},"application/mmt-aei+xml":{source:"iana",compressible:!0,extensions:["maei"]},"application/mmt-usd+xml":{source:"iana",compressible:!0,extensions:["musd"]},"application/mods+xml":{source:"iana",compressible:!0,extensions:["mods"]},"application/moss-keys":{source:"iana"},"application/moss-signature":{source:"iana"},"application/mosskey-data":{source:"iana"},"application/mosskey-request":{source:"iana"},"application/mp21":{source:"iana",extensions:["m21","mp21"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/mpeg4-generic":{source:"iana"},"application/mpeg4-iod":{source:"iana"},"application/mpeg4-iod-xmt":{source:"iana"},"application/mrb-consumer+xml":{source:"iana",compressible:!0},"application/mrb-publish+xml":{source:"iana",compressible:!0},"application/msc-ivr+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msc-mixer+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msix":{compressible:!1,extensions:["msix"]},"application/msixbundle":{compressible:!1,extensions:["msixbundle"]},"application/msword":{source:"iana",compressible:!1,extensions:["doc","dot"]},"application/mud+json":{source:"iana",compressible:!0},"application/multipart-core":{source:"iana"},"application/mxf":{source:"iana",extensions:["mxf"]},"application/n-quads":{source:"iana",extensions:["nq"]},"application/n-triples":{source:"iana",extensions:["nt"]},"application/nasdata":{source:"iana"},"application/news-checkgroups":{source:"iana",charset:"US-ASCII"},"application/news-groupinfo":{source:"iana",charset:"US-ASCII"},"application/news-transmission":{source:"iana"},"application/nlsml+xml":{source:"iana",compressible:!0},"application/node":{source:"iana",extensions:["cjs"]},"application/nss":{source:"iana"},"application/oauth-authz-req+jwt":{source:"iana"},"application/oblivious-dns-message":{source:"iana"},"application/ocsp-request":{source:"iana"},"application/ocsp-response":{source:"iana"},"application/octet-stream":{source:"iana",compressible:!1,extensions:["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{source:"iana",extensions:["oda"]},"application/odm+xml":{source:"iana",compressible:!0},"application/odx":{source:"iana"},"application/oebps-package+xml":{source:"iana",compressible:!0,extensions:["opf"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/ohttp-keys":{source:"iana"},"application/omdoc+xml":{source:"apache",compressible:!0,extensions:["omdoc"]},"application/onenote":{source:"apache",extensions:["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{source:"iana",compressible:!0},"application/oscore":{source:"iana"},"application/oxps":{source:"iana",extensions:["oxps"]},"application/p21":{source:"iana"},"application/p21+zip":{source:"iana",compressible:!1},"application/p2p-overlay+xml":{source:"iana",compressible:!0,extensions:["relo"]},"application/parityfec":{source:"iana"},"application/passport":{source:"iana"},"application/patch-ops-error+xml":{source:"iana",compressible:!0,extensions:["xer"]},"application/pdf":{source:"iana",compressible:!1,extensions:["pdf"]},"application/pdx":{source:"iana"},"application/pem-certificate-chain":{source:"iana"},"application/pgp-encrypted":{source:"iana",compressible:!1,extensions:["pgp"]},"application/pgp-keys":{source:"iana",extensions:["asc"]},"application/pgp-signature":{source:"iana",extensions:["sig","asc"]},"application/pics-rules":{source:"apache",extensions:["prf"]},"application/pidf+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pidf-diff+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pkcs10":{source:"iana",extensions:["p10"]},"application/pkcs12":{source:"iana"},"application/pkcs7-mime":{source:"iana",extensions:["p7m","p7c"]},"application/pkcs7-signature":{source:"iana",extensions:["p7s"]},"application/pkcs8":{source:"iana",extensions:["p8"]},"application/pkcs8-encrypted":{source:"iana"},"application/pkix-attr-cert":{source:"iana",extensions:["ac"]},"application/pkix-cert":{source:"iana",extensions:["cer"]},"application/pkix-crl":{source:"iana",extensions:["crl"]},"application/pkix-pkipath":{source:"iana",extensions:["pkipath"]},"application/pkixcmp":{source:"iana",extensions:["pki"]},"application/pls+xml":{source:"iana",compressible:!0,extensions:["pls"]},"application/poc-settings+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/postscript":{source:"iana",compressible:!0,extensions:["ai","eps","ps"]},"application/ppsp-tracker+json":{source:"iana",compressible:!0},"application/private-token-issuer-directory":{source:"iana"},"application/private-token-request":{source:"iana"},"application/private-token-response":{source:"iana"},"application/problem+json":{source:"iana",compressible:!0},"application/problem+xml":{source:"iana",compressible:!0},"application/provenance+xml":{source:"iana",compressible:!0,extensions:["provx"]},"application/prs.alvestrand.titrax-sheet":{source:"iana"},"application/prs.cww":{source:"iana",extensions:["cww"]},"application/prs.cyn":{source:"iana",charset:"7-BIT"},"application/prs.hpub+zip":{source:"iana",compressible:!1},"application/prs.implied-document+xml":{source:"iana",compressible:!0},"application/prs.implied-executable":{source:"iana"},"application/prs.implied-object+json":{source:"iana",compressible:!0},"application/prs.implied-object+json-seq":{source:"iana"},"application/prs.implied-object+yaml":{source:"iana"},"application/prs.implied-structure":{source:"iana"},"application/prs.nprend":{source:"iana"},"application/prs.plucker":{source:"iana"},"application/prs.rdf-xml-crypt":{source:"iana"},"application/prs.vcfbzip2":{source:"iana"},"application/prs.xsf+xml":{source:"iana",compressible:!0,extensions:["xsf"]},"application/pskc+xml":{source:"iana",compressible:!0,extensions:["pskcxml"]},"application/pvd+json":{source:"iana",compressible:!0},"application/qsig":{source:"iana"},"application/raml+yaml":{compressible:!0,extensions:["raml"]},"application/raptorfec":{source:"iana"},"application/rdap+json":{source:"iana",compressible:!0},"application/rdf+xml":{source:"iana",compressible:!0,extensions:["rdf","owl"]},"application/reginfo+xml":{source:"iana",compressible:!0,extensions:["rif"]},"application/relax-ng-compact-syntax":{source:"iana",extensions:["rnc"]},"application/remote-printing":{source:"apache"},"application/reputon+json":{source:"iana",compressible:!0},"application/resource-lists+xml":{source:"iana",compressible:!0,extensions:["rl"]},"application/resource-lists-diff+xml":{source:"iana",compressible:!0,extensions:["rld"]},"application/rfc+xml":{source:"iana",compressible:!0},"application/riscos":{source:"iana"},"application/rlmi+xml":{source:"iana",compressible:!0},"application/rls-services+xml":{source:"iana",compressible:!0,extensions:["rs"]},"application/route-apd+xml":{source:"iana",compressible:!0,extensions:["rapd"]},"application/route-s-tsid+xml":{source:"iana",compressible:!0,extensions:["sls"]},"application/route-usd+xml":{source:"iana",compressible:!0,extensions:["rusd"]},"application/rpki-checklist":{source:"iana"},"application/rpki-ghostbusters":{source:"iana",extensions:["gbr"]},"application/rpki-manifest":{source:"iana",extensions:["mft"]},"application/rpki-publication":{source:"iana"},"application/rpki-roa":{source:"iana",extensions:["roa"]},"application/rpki-signed-tal":{source:"iana"},"application/rpki-updown":{source:"iana"},"application/rsd+xml":{source:"apache",compressible:!0,extensions:["rsd"]},"application/rss+xml":{source:"apache",compressible:!0,extensions:["rss"]},"application/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"application/rtploopback":{source:"iana"},"application/rtx":{source:"iana"},"application/samlassertion+xml":{source:"iana",compressible:!0},"application/samlmetadata+xml":{source:"iana",compressible:!0},"application/sarif+json":{source:"iana",compressible:!0},"application/sarif-external-properties+json":{source:"iana",compressible:!0},"application/sbe":{source:"iana"},"application/sbml+xml":{source:"iana",compressible:!0,extensions:["sbml"]},"application/scaip+xml":{source:"iana",compressible:!0},"application/scim+json":{source:"iana",compressible:!0},"application/scvp-cv-request":{source:"iana",extensions:["scq"]},"application/scvp-cv-response":{source:"iana",extensions:["scs"]},"application/scvp-vp-request":{source:"iana",extensions:["spq"]},"application/scvp-vp-response":{source:"iana",extensions:["spp"]},"application/sdp":{source:"iana",extensions:["sdp"]},"application/secevent+jwt":{source:"iana"},"application/senml+cbor":{source:"iana"},"application/senml+json":{source:"iana",compressible:!0},"application/senml+xml":{source:"iana",compressible:!0,extensions:["senmlx"]},"application/senml-etch+cbor":{source:"iana"},"application/senml-etch+json":{source:"iana",compressible:!0},"application/senml-exi":{source:"iana"},"application/sensml+cbor":{source:"iana"},"application/sensml+json":{source:"iana",compressible:!0},"application/sensml+xml":{source:"iana",compressible:!0,extensions:["sensmlx"]},"application/sensml-exi":{source:"iana"},"application/sep+xml":{source:"iana",compressible:!0},"application/sep-exi":{source:"iana"},"application/session-info":{source:"iana"},"application/set-payment":{source:"iana"},"application/set-payment-initiation":{source:"iana",extensions:["setpay"]},"application/set-registration":{source:"iana"},"application/set-registration-initiation":{source:"iana",extensions:["setreg"]},"application/sgml":{source:"iana"},"application/sgml-open-catalog":{source:"iana"},"application/shf+xml":{source:"iana",compressible:!0,extensions:["shf"]},"application/sieve":{source:"iana",extensions:["siv","sieve"]},"application/simple-filter+xml":{source:"iana",compressible:!0},"application/simple-message-summary":{source:"iana"},"application/simplesymbolcontainer":{source:"iana"},"application/sipc":{source:"iana"},"application/slate":{source:"iana"},"application/smil":{source:"apache"},"application/smil+xml":{source:"iana",compressible:!0,extensions:["smi","smil"]},"application/smpte336m":{source:"iana"},"application/soap+fastinfoset":{source:"iana"},"application/soap+xml":{source:"iana",compressible:!0},"application/sparql-query":{source:"iana",extensions:["rq"]},"application/sparql-results+xml":{source:"iana",compressible:!0,extensions:["srx"]},"application/spdx+json":{source:"iana",compressible:!0},"application/spirits-event+xml":{source:"iana",compressible:!0},"application/sql":{source:"iana",extensions:["sql"]},"application/srgs":{source:"iana",extensions:["gram"]},"application/srgs+xml":{source:"iana",compressible:!0,extensions:["grxml"]},"application/sru+xml":{source:"iana",compressible:!0,extensions:["sru"]},"application/ssdl+xml":{source:"apache",compressible:!0,extensions:["ssdl"]},"application/ssml+xml":{source:"iana",compressible:!0,extensions:["ssml"]},"application/st2110-41":{source:"iana"},"application/stix+json":{source:"iana",compressible:!0},"application/stratum":{source:"iana"},"application/swid+cbor":{source:"iana"},"application/swid+xml":{source:"iana",compressible:!0,extensions:["swidtag"]},"application/tamp-apex-update":{source:"iana"},"application/tamp-apex-update-confirm":{source:"iana"},"application/tamp-community-update":{source:"iana"},"application/tamp-community-update-confirm":{source:"iana"},"application/tamp-error":{source:"iana"},"application/tamp-sequence-adjust":{source:"iana"},"application/tamp-sequence-adjust-confirm":{source:"iana"},"application/tamp-status-query":{source:"iana"},"application/tamp-status-response":{source:"iana"},"application/tamp-update":{source:"iana"},"application/tamp-update-confirm":{source:"iana"},"application/tar":{compressible:!0},"application/taxii+json":{source:"iana",compressible:!0},"application/td+json":{source:"iana",compressible:!0},"application/tei+xml":{source:"iana",compressible:!0,extensions:["tei","teicorpus"]},"application/tetra_isi":{source:"iana"},"application/thraud+xml":{source:"iana",compressible:!0,extensions:["tfi"]},"application/timestamp-query":{source:"iana"},"application/timestamp-reply":{source:"iana"},"application/timestamped-data":{source:"iana",extensions:["tsd"]},"application/tlsrpt+gzip":{source:"iana"},"application/tlsrpt+json":{source:"iana",compressible:!0},"application/tm+json":{source:"iana",compressible:!0},"application/tnauthlist":{source:"iana"},"application/token-introspection+jwt":{source:"iana"},"application/toml":{compressible:!0,extensions:["toml"]},"application/trickle-ice-sdpfrag":{source:"iana"},"application/trig":{source:"iana",extensions:["trig"]},"application/ttml+xml":{source:"iana",compressible:!0,extensions:["ttml"]},"application/tve-trigger":{source:"iana"},"application/tzif":{source:"iana"},"application/tzif-leap":{source:"iana"},"application/ubjson":{compressible:!1,extensions:["ubj"]},"application/ulpfec":{source:"iana"},"application/urc-grpsheet+xml":{source:"iana",compressible:!0},"application/urc-ressheet+xml":{source:"iana",compressible:!0,extensions:["rsheet"]},"application/urc-targetdesc+xml":{source:"iana",compressible:!0,extensions:["td"]},"application/urc-uisocketdesc+xml":{source:"iana",compressible:!0},"application/vc":{source:"iana"},"application/vcard+json":{source:"iana",compressible:!0},"application/vcard+xml":{source:"iana",compressible:!0},"application/vemmi":{source:"iana"},"application/vividence.scriptfile":{source:"apache"},"application/vnd.1000minds.decision-model+xml":{source:"iana",compressible:!0,extensions:["1km"]},"application/vnd.1ob":{source:"iana"},"application/vnd.3gpp-prose+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3a+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3ach+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3ch+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc8+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-v2x-local-service-information":{source:"iana"},"application/vnd.3gpp.5gnas":{source:"iana"},"application/vnd.3gpp.5gsa2x":{source:"iana"},"application/vnd.3gpp.5gsa2x-local-service-information":{source:"iana"},"application/vnd.3gpp.access-transfer-events+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.bsf+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.crs+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.current-location-discovery+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gmop+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gtpc":{source:"iana"},"application/vnd.3gpp.interworking-data":{source:"iana"},"application/vnd.3gpp.lpp":{source:"iana"},"application/vnd.3gpp.mc-signalling-ear":{source:"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-payload":{source:"iana"},"application/vnd.3gpp.mcdata-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-signalling":{source:"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-floor-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-signed+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-init-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-transmission-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mid-call+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ngap":{source:"iana"},"application/vnd.3gpp.pfcp":{source:"iana"},"application/vnd.3gpp.pic-bw-large":{source:"iana",extensions:["plb"]},"application/vnd.3gpp.pic-bw-small":{source:"iana",extensions:["psb"]},"application/vnd.3gpp.pic-bw-var":{source:"iana",extensions:["pvb"]},"application/vnd.3gpp.pinapp-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.s1ap":{source:"iana"},"application/vnd.3gpp.seal-group-doc+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-network-qos-management-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-ue-config-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-unicast-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-user-profile-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.sms":{source:"iana"},"application/vnd.3gpp.sms+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-ext+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.state-and-event-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ussd+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.v2x":{source:"iana"},"application/vnd.3gpp.vae-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.bcmcsinfo+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.sms":{source:"iana"},"application/vnd.3gpp2.tcap":{source:"iana",extensions:["tcap"]},"application/vnd.3lightssoftware.imagescal":{source:"iana"},"application/vnd.3m.post-it-notes":{source:"iana",extensions:["pwn"]},"application/vnd.accpac.simply.aso":{source:"iana",extensions:["aso"]},"application/vnd.accpac.simply.imp":{source:"iana",extensions:["imp"]},"application/vnd.acm.addressxfer+json":{source:"iana",compressible:!0},"application/vnd.acm.chatbot+json":{source:"iana",compressible:!0},"application/vnd.acucobol":{source:"iana",extensions:["acu"]},"application/vnd.acucorp":{source:"iana",extensions:["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{source:"apache",compressible:!1,extensions:["air"]},"application/vnd.adobe.flash.movie":{source:"iana"},"application/vnd.adobe.formscentral.fcdt":{source:"iana",extensions:["fcdt"]},"application/vnd.adobe.fxp":{source:"iana",extensions:["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{source:"iana"},"application/vnd.adobe.xdp+xml":{source:"iana",compressible:!0,extensions:["xdp"]},"application/vnd.adobe.xfdf":{source:"apache",extensions:["xfdf"]},"application/vnd.aether.imp":{source:"iana"},"application/vnd.afpc.afplinedata":{source:"iana"},"application/vnd.afpc.afplinedata-pagedef":{source:"iana"},"application/vnd.afpc.cmoca-cmresource":{source:"iana"},"application/vnd.afpc.foca-charset":{source:"iana"},"application/vnd.afpc.foca-codedfont":{source:"iana"},"application/vnd.afpc.foca-codepage":{source:"iana"},"application/vnd.afpc.modca":{source:"iana"},"application/vnd.afpc.modca-cmtable":{source:"iana"},"application/vnd.afpc.modca-formdef":{source:"iana"},"application/vnd.afpc.modca-mediummap":{source:"iana"},"application/vnd.afpc.modca-objectcontainer":{source:"iana"},"application/vnd.afpc.modca-overlay":{source:"iana"},"application/vnd.afpc.modca-pagesegment":{source:"iana"},"application/vnd.age":{source:"iana",extensions:["age"]},"application/vnd.ah-barcode":{source:"apache"},"application/vnd.ahead.space":{source:"iana",extensions:["ahead"]},"application/vnd.airzip.filesecure.azf":{source:"iana",extensions:["azf"]},"application/vnd.airzip.filesecure.azs":{source:"iana",extensions:["azs"]},"application/vnd.amadeus+json":{source:"iana",compressible:!0},"application/vnd.amazon.ebook":{source:"apache",extensions:["azw"]},"application/vnd.amazon.mobi8-ebook":{source:"iana"},"application/vnd.americandynamics.acc":{source:"iana",extensions:["acc"]},"application/vnd.amiga.ami":{source:"iana",extensions:["ami"]},"application/vnd.amundsen.maze+xml":{source:"iana",compressible:!0},"application/vnd.android.ota":{source:"iana"},"application/vnd.android.package-archive":{source:"apache",compressible:!1,extensions:["apk"]},"application/vnd.anki":{source:"iana"},"application/vnd.anser-web-certificate-issue-initiation":{source:"iana",extensions:["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{source:"apache",extensions:["fti"]},"application/vnd.antix.game-component":{source:"iana",extensions:["atx"]},"application/vnd.apache.arrow.file":{source:"iana"},"application/vnd.apache.arrow.stream":{source:"iana"},"application/vnd.apache.parquet":{source:"iana"},"application/vnd.apache.thrift.binary":{source:"iana"},"application/vnd.apache.thrift.compact":{source:"iana"},"application/vnd.apache.thrift.json":{source:"iana"},"application/vnd.apexlang":{source:"iana"},"application/vnd.api+json":{source:"iana",compressible:!0},"application/vnd.aplextor.warrp+json":{source:"iana",compressible:!0},"application/vnd.apothekende.reservation+json":{source:"iana",compressible:!0},"application/vnd.apple.installer+xml":{source:"iana",compressible:!0,extensions:["mpkg"]},"application/vnd.apple.keynote":{source:"iana",extensions:["key"]},"application/vnd.apple.mpegurl":{source:"iana",extensions:["m3u8"]},"application/vnd.apple.numbers":{source:"iana",extensions:["numbers"]},"application/vnd.apple.pages":{source:"iana",extensions:["pages"]},"application/vnd.apple.pkpass":{compressible:!1,extensions:["pkpass"]},"application/vnd.arastra.swi":{source:"apache"},"application/vnd.aristanetworks.swi":{source:"iana",extensions:["swi"]},"application/vnd.artisan+json":{source:"iana",compressible:!0},"application/vnd.artsquare":{source:"iana"},"application/vnd.astraea-software.iota":{source:"iana",extensions:["iota"]},"application/vnd.audiograph":{source:"iana",extensions:["aep"]},"application/vnd.autopackage":{source:"iana"},"application/vnd.avalon+json":{source:"iana",compressible:!0},"application/vnd.avistar+xml":{source:"iana",compressible:!0},"application/vnd.balsamiq.bmml+xml":{source:"iana",compressible:!0,extensions:["bmml"]},"application/vnd.balsamiq.bmpr":{source:"iana"},"application/vnd.banana-accounting":{source:"iana"},"application/vnd.bbf.usp.error":{source:"iana"},"application/vnd.bbf.usp.msg":{source:"iana"},"application/vnd.bbf.usp.msg+json":{source:"iana",compressible:!0},"application/vnd.bekitzur-stech+json":{source:"iana",compressible:!0},"application/vnd.belightsoft.lhzd+zip":{source:"iana",compressible:!1},"application/vnd.belightsoft.lhzl+zip":{source:"iana",compressible:!1},"application/vnd.bint.med-content":{source:"iana"},"application/vnd.biopax.rdf+xml":{source:"iana",compressible:!0},"application/vnd.blink-idb-value-wrapper":{source:"iana"},"application/vnd.blueice.multipass":{source:"iana",extensions:["mpm"]},"application/vnd.bluetooth.ep.oob":{source:"iana"},"application/vnd.bluetooth.le.oob":{source:"iana"},"application/vnd.bmi":{source:"iana",extensions:["bmi"]},"application/vnd.bpf":{source:"iana"},"application/vnd.bpf3":{source:"iana"},"application/vnd.businessobjects":{source:"iana",extensions:["rep"]},"application/vnd.byu.uapi+json":{source:"iana",compressible:!0},"application/vnd.bzip3":{source:"iana"},"application/vnd.c3voc.schedule+xml":{source:"iana",compressible:!0},"application/vnd.cab-jscript":{source:"iana"},"application/vnd.canon-cpdl":{source:"iana"},"application/vnd.canon-lips":{source:"iana"},"application/vnd.capasystems-pg+json":{source:"iana",compressible:!0},"application/vnd.cendio.thinlinc.clientconf":{source:"iana"},"application/vnd.century-systems.tcp_stream":{source:"iana"},"application/vnd.chemdraw+xml":{source:"iana",compressible:!0,extensions:["cdxml"]},"application/vnd.chess-pgn":{source:"iana"},"application/vnd.chipnuts.karaoke-mmd":{source:"iana",extensions:["mmd"]},"application/vnd.ciedi":{source:"iana"},"application/vnd.cinderella":{source:"iana",extensions:["cdy"]},"application/vnd.cirpack.isdn-ext":{source:"iana"},"application/vnd.citationstyles.style+xml":{source:"iana",compressible:!0,extensions:["csl"]},"application/vnd.claymore":{source:"iana",extensions:["cla"]},"application/vnd.cloanto.rp9":{source:"iana",extensions:["rp9"]},"application/vnd.clonk.c4group":{source:"iana",extensions:["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{source:"iana",extensions:["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{source:"iana",extensions:["c11amz"]},"application/vnd.cncf.helm.chart.content.v1.tar+gzip":{source:"iana"},"application/vnd.cncf.helm.chart.provenance.v1.prov":{source:"iana"},"application/vnd.cncf.helm.config.v1+json":{source:"iana",compressible:!0},"application/vnd.coffeescript":{source:"iana"},"application/vnd.collabio.xodocuments.document":{source:"iana"},"application/vnd.collabio.xodocuments.document-template":{source:"iana"},"application/vnd.collabio.xodocuments.presentation":{source:"iana"},"application/vnd.collabio.xodocuments.presentation-template":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{source:"iana"},"application/vnd.collection+json":{source:"iana",compressible:!0},"application/vnd.collection.doc+json":{source:"iana",compressible:!0},"application/vnd.collection.next+json":{source:"iana",compressible:!0},"application/vnd.comicbook+zip":{source:"iana",compressible:!1},"application/vnd.comicbook-rar":{source:"iana"},"application/vnd.commerce-battelle":{source:"iana"},"application/vnd.commonspace":{source:"iana",extensions:["csp"]},"application/vnd.contact.cmsg":{source:"iana",extensions:["cdbcmsg"]},"application/vnd.coreos.ignition+json":{source:"iana",compressible:!0},"application/vnd.cosmocaller":{source:"iana",extensions:["cmc"]},"application/vnd.crick.clicker":{source:"iana",extensions:["clkx"]},"application/vnd.crick.clicker.keyboard":{source:"iana",extensions:["clkk"]},"application/vnd.crick.clicker.palette":{source:"iana",extensions:["clkp"]},"application/vnd.crick.clicker.template":{source:"iana",extensions:["clkt"]},"application/vnd.crick.clicker.wordbank":{source:"iana",extensions:["clkw"]},"application/vnd.criticaltools.wbs+xml":{source:"iana",compressible:!0,extensions:["wbs"]},"application/vnd.cryptii.pipe+json":{source:"iana",compressible:!0},"application/vnd.crypto-shade-file":{source:"iana"},"application/vnd.cryptomator.encrypted":{source:"iana"},"application/vnd.cryptomator.vault":{source:"iana"},"application/vnd.ctc-posml":{source:"iana",extensions:["pml"]},"application/vnd.ctct.ws+xml":{source:"iana",compressible:!0},"application/vnd.cups-pdf":{source:"iana"},"application/vnd.cups-postscript":{source:"iana"},"application/vnd.cups-ppd":{source:"iana",extensions:["ppd"]},"application/vnd.cups-raster":{source:"iana"},"application/vnd.cups-raw":{source:"iana"},"application/vnd.curl":{source:"iana"},"application/vnd.curl.car":{source:"apache",extensions:["car"]},"application/vnd.curl.pcurl":{source:"apache",extensions:["pcurl"]},"application/vnd.cyan.dean.root+xml":{source:"iana",compressible:!0},"application/vnd.cybank":{source:"iana"},"application/vnd.cyclonedx+json":{source:"iana",compressible:!0},"application/vnd.cyclonedx+xml":{source:"iana",compressible:!0},"application/vnd.d2l.coursepackage1p0+zip":{source:"iana",compressible:!1},"application/vnd.d3m-dataset":{source:"iana"},"application/vnd.d3m-problem":{source:"iana"},"application/vnd.dart":{source:"iana",compressible:!0,extensions:["dart"]},"application/vnd.data-vision.rdz":{source:"iana",extensions:["rdz"]},"application/vnd.datalog":{source:"iana"},"application/vnd.datapackage+json":{source:"iana",compressible:!0},"application/vnd.dataresource+json":{source:"iana",compressible:!0},"application/vnd.dbf":{source:"iana",extensions:["dbf"]},"application/vnd.debian.binary-package":{source:"iana"},"application/vnd.dece.data":{source:"iana",extensions:["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{source:"iana",compressible:!0,extensions:["uvt","uvvt"]},"application/vnd.dece.unspecified":{source:"iana",extensions:["uvx","uvvx"]},"application/vnd.dece.zip":{source:"iana",extensions:["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{source:"iana",extensions:["fe_launch"]},"application/vnd.desmume.movie":{source:"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{source:"iana"},"application/vnd.dm.delegation+xml":{source:"iana",compressible:!0},"application/vnd.dna":{source:"iana",extensions:["dna"]},"application/vnd.document+json":{source:"iana",compressible:!0},"application/vnd.dolby.mlp":{source:"apache",extensions:["mlp"]},"application/vnd.dolby.mobile.1":{source:"iana"},"application/vnd.dolby.mobile.2":{source:"iana"},"application/vnd.doremir.scorecloud-binary-document":{source:"iana"},"application/vnd.dpgraph":{source:"iana",extensions:["dpg"]},"application/vnd.dreamfactory":{source:"iana",extensions:["dfac"]},"application/vnd.drive+json":{source:"iana",compressible:!0},"application/vnd.ds-keypoint":{source:"apache",extensions:["kpxx"]},"application/vnd.dtg.local":{source:"iana"},"application/vnd.dtg.local.flash":{source:"iana"},"application/vnd.dtg.local.html":{source:"iana"},"application/vnd.dvb.ait":{source:"iana",extensions:["ait"]},"application/vnd.dvb.dvbisl+xml":{source:"iana",compressible:!0},"application/vnd.dvb.dvbj":{source:"iana"},"application/vnd.dvb.esgcontainer":{source:"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess2":{source:"iana"},"application/vnd.dvb.ipdcesgpdd":{source:"iana"},"application/vnd.dvb.ipdcroaming":{source:"iana"},"application/vnd.dvb.iptv.alfec-base":{source:"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{source:"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-container+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-generic+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-msglist+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-request+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-response+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-init+xml":{source:"iana",compressible:!0},"application/vnd.dvb.pfr":{source:"iana"},"application/vnd.dvb.service":{source:"iana",extensions:["svc"]},"application/vnd.dxr":{source:"iana"},"application/vnd.dynageo":{source:"iana",extensions:["geo"]},"application/vnd.dzr":{source:"iana"},"application/vnd.easykaraoke.cdgdownload":{source:"iana"},"application/vnd.ecdis-update":{source:"iana"},"application/vnd.ecip.rlp":{source:"iana"},"application/vnd.eclipse.ditto+json":{source:"iana",compressible:!0},"application/vnd.ecowin.chart":{source:"iana",extensions:["mag"]},"application/vnd.ecowin.filerequest":{source:"iana"},"application/vnd.ecowin.fileupdate":{source:"iana"},"application/vnd.ecowin.series":{source:"iana"},"application/vnd.ecowin.seriesrequest":{source:"iana"},"application/vnd.ecowin.seriesupdate":{source:"iana"},"application/vnd.efi.img":{source:"iana"},"application/vnd.efi.iso":{source:"iana"},"application/vnd.eln+zip":{source:"iana",compressible:!1},"application/vnd.emclient.accessrequest+xml":{source:"iana",compressible:!0},"application/vnd.enliven":{source:"iana",extensions:["nml"]},"application/vnd.enphase.envoy":{source:"iana"},"application/vnd.eprints.data+xml":{source:"iana",compressible:!0},"application/vnd.epson.esf":{source:"iana",extensions:["esf"]},"application/vnd.epson.msf":{source:"iana",extensions:["msf"]},"application/vnd.epson.quickanime":{source:"iana",extensions:["qam"]},"application/vnd.epson.salt":{source:"iana",extensions:["slt"]},"application/vnd.epson.ssf":{source:"iana",extensions:["ssf"]},"application/vnd.ericsson.quickcall":{source:"iana"},"application/vnd.erofs":{source:"iana"},"application/vnd.espass-espass+zip":{source:"iana",compressible:!1},"application/vnd.eszigno3+xml":{source:"iana",compressible:!0,extensions:["es3","et3"]},"application/vnd.etsi.aoc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.asic-e+zip":{source:"iana",compressible:!1},"application/vnd.etsi.asic-s+zip":{source:"iana",compressible:!1},"application/vnd.etsi.cug+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvcommand+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-bc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-cod+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-npvr+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvservice+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsync+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvueprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mcid+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mheg5":{source:"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{source:"iana",compressible:!0},"application/vnd.etsi.pstn+xml":{source:"iana",compressible:!0},"application/vnd.etsi.sci+xml":{source:"iana",compressible:!0},"application/vnd.etsi.simservs+xml":{source:"iana",compressible:!0},"application/vnd.etsi.timestamp-token":{source:"iana"},"application/vnd.etsi.tsl+xml":{source:"iana",compressible:!0},"application/vnd.etsi.tsl.der":{source:"iana"},"application/vnd.eu.kasparian.car+json":{source:"iana",compressible:!0},"application/vnd.eudora.data":{source:"iana"},"application/vnd.evolv.ecig.profile":{source:"iana"},"application/vnd.evolv.ecig.settings":{source:"iana"},"application/vnd.evolv.ecig.theme":{source:"iana"},"application/vnd.exstream-empower+zip":{source:"iana",compressible:!1},"application/vnd.exstream-package":{source:"iana"},"application/vnd.ezpix-album":{source:"iana",extensions:["ez2"]},"application/vnd.ezpix-package":{source:"iana",extensions:["ez3"]},"application/vnd.f-secure.mobile":{source:"iana"},"application/vnd.familysearch.gedcom+zip":{source:"iana",compressible:!1},"application/vnd.fastcopy-disk-image":{source:"iana"},"application/vnd.fdf":{source:"apache",extensions:["fdf"]},"application/vnd.fdsn.mseed":{source:"iana",extensions:["mseed"]},"application/vnd.fdsn.seed":{source:"iana",extensions:["seed","dataless"]},"application/vnd.ffsns":{source:"iana"},"application/vnd.ficlab.flb+zip":{source:"iana",compressible:!1},"application/vnd.filmit.zfc":{source:"iana"},"application/vnd.fints":{source:"iana"},"application/vnd.firemonkeys.cloudcell":{source:"iana"},"application/vnd.flographit":{source:"iana",extensions:["gph"]},"application/vnd.fluxtime.clip":{source:"iana",extensions:["ftc"]},"application/vnd.font-fontforge-sfd":{source:"iana"},"application/vnd.framemaker":{source:"iana",extensions:["fm","frame","maker","book"]},"application/vnd.freelog.comic":{source:"iana"},"application/vnd.frogans.fnc":{source:"apache",extensions:["fnc"]},"application/vnd.frogans.ltf":{source:"apache",extensions:["ltf"]},"application/vnd.fsc.weblaunch":{source:"iana",extensions:["fsc"]},"application/vnd.fujifilm.fb.docuworks":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.container":{source:"iana"},"application/vnd.fujifilm.fb.jfi+xml":{source:"iana",compressible:!0},"application/vnd.fujitsu.oasys":{source:"iana",extensions:["oas"]},"application/vnd.fujitsu.oasys2":{source:"iana",extensions:["oa2"]},"application/vnd.fujitsu.oasys3":{source:"iana",extensions:["oa3"]},"application/vnd.fujitsu.oasysgp":{source:"iana",extensions:["fg5"]},"application/vnd.fujitsu.oasysprs":{source:"iana",extensions:["bh2"]},"application/vnd.fujixerox.art-ex":{source:"iana"},"application/vnd.fujixerox.art4":{source:"iana"},"application/vnd.fujixerox.ddd":{source:"iana",extensions:["ddd"]},"application/vnd.fujixerox.docuworks":{source:"iana",extensions:["xdw"]},"application/vnd.fujixerox.docuworks.binder":{source:"iana",extensions:["xbd"]},"application/vnd.fujixerox.docuworks.container":{source:"iana"},"application/vnd.fujixerox.hbpl":{source:"iana"},"application/vnd.fut-misnet":{source:"iana"},"application/vnd.futoin+cbor":{source:"iana"},"application/vnd.futoin+json":{source:"iana",compressible:!0},"application/vnd.fuzzysheet":{source:"iana",extensions:["fzs"]},"application/vnd.ga4gh.passport+jwt":{source:"iana"},"application/vnd.genomatix.tuxedo":{source:"iana",extensions:["txd"]},"application/vnd.genozip":{source:"iana"},"application/vnd.gentics.grd+json":{source:"iana",compressible:!0},"application/vnd.gentoo.catmetadata+xml":{source:"iana",compressible:!0},"application/vnd.gentoo.ebuild":{source:"iana"},"application/vnd.gentoo.eclass":{source:"iana"},"application/vnd.gentoo.gpkg":{source:"iana"},"application/vnd.gentoo.manifest":{source:"iana"},"application/vnd.gentoo.pkgmetadata+xml":{source:"iana",compressible:!0},"application/vnd.gentoo.xpak":{source:"iana"},"application/vnd.geo+json":{source:"apache",compressible:!0},"application/vnd.geocube+xml":{source:"apache",compressible:!0},"application/vnd.geogebra.file":{source:"iana",extensions:["ggb"]},"application/vnd.geogebra.slides":{source:"iana",extensions:["ggs"]},"application/vnd.geogebra.tool":{source:"iana",extensions:["ggt"]},"application/vnd.geometry-explorer":{source:"iana",extensions:["gex","gre"]},"application/vnd.geonext":{source:"iana",extensions:["gxt"]},"application/vnd.geoplan":{source:"iana",extensions:["g2w"]},"application/vnd.geospace":{source:"iana",extensions:["g3w"]},"application/vnd.gerber":{source:"iana"},"application/vnd.globalplatform.card-content-mgt":{source:"iana"},"application/vnd.globalplatform.card-content-mgt-response":{source:"iana"},"application/vnd.gmx":{source:"iana",extensions:["gmx"]},"application/vnd.gnu.taler.exchange+json":{source:"iana",compressible:!0},"application/vnd.gnu.taler.merchant+json":{source:"iana",compressible:!0},"application/vnd.google-apps.document":{compressible:!1,extensions:["gdoc"]},"application/vnd.google-apps.presentation":{compressible:!1,extensions:["gslides"]},"application/vnd.google-apps.spreadsheet":{compressible:!1,extensions:["gsheet"]},"application/vnd.google-earth.kml+xml":{source:"iana",compressible:!0,extensions:["kml"]},"application/vnd.google-earth.kmz":{source:"iana",compressible:!1,extensions:["kmz"]},"application/vnd.gov.sk.e-form+xml":{source:"apache",compressible:!0},"application/vnd.gov.sk.e-form+zip":{source:"iana",compressible:!1},"application/vnd.gov.sk.xmldatacontainer+xml":{source:"iana",compressible:!0,extensions:["xdcf"]},"application/vnd.gpxsee.map+xml":{source:"iana",compressible:!0},"application/vnd.grafeq":{source:"iana",extensions:["gqf","gqs"]},"application/vnd.gridmp":{source:"iana"},"application/vnd.groove-account":{source:"iana",extensions:["gac"]},"application/vnd.groove-help":{source:"iana",extensions:["ghf"]},"application/vnd.groove-identity-message":{source:"iana",extensions:["gim"]},"application/vnd.groove-injector":{source:"iana",extensions:["grv"]},"application/vnd.groove-tool-message":{source:"iana",extensions:["gtm"]},"application/vnd.groove-tool-template":{source:"iana",extensions:["tpl"]},"application/vnd.groove-vcard":{source:"iana",extensions:["vcg"]},"application/vnd.hal+json":{source:"iana",compressible:!0},"application/vnd.hal+xml":{source:"iana",compressible:!0,extensions:["hal"]},"application/vnd.handheld-entertainment+xml":{source:"iana",compressible:!0,extensions:["zmm"]},"application/vnd.hbci":{source:"iana",extensions:["hbci"]},"application/vnd.hc+json":{source:"iana",compressible:!0},"application/vnd.hcl-bireports":{source:"iana"},"application/vnd.hdt":{source:"iana"},"application/vnd.heroku+json":{source:"iana",compressible:!0},"application/vnd.hhe.lesson-player":{source:"iana",extensions:["les"]},"application/vnd.hp-hpgl":{source:"iana",extensions:["hpgl"]},"application/vnd.hp-hpid":{source:"iana",extensions:["hpid"]},"application/vnd.hp-hps":{source:"iana",extensions:["hps"]},"application/vnd.hp-jlyt":{source:"iana",extensions:["jlt"]},"application/vnd.hp-pcl":{source:"iana",extensions:["pcl"]},"application/vnd.hp-pclxl":{source:"iana",extensions:["pclxl"]},"application/vnd.hsl":{source:"iana"},"application/vnd.httphone":{source:"iana"},"application/vnd.hydrostatix.sof-data":{source:"iana",extensions:["sfd-hdstx"]},"application/vnd.hyper+json":{source:"iana",compressible:!0},"application/vnd.hyper-item+json":{source:"iana",compressible:!0},"application/vnd.hyperdrive+json":{source:"iana",compressible:!0},"application/vnd.hzn-3d-crossword":{source:"iana"},"application/vnd.ibm.afplinedata":{source:"apache"},"application/vnd.ibm.electronic-media":{source:"iana"},"application/vnd.ibm.minipay":{source:"iana",extensions:["mpy"]},"application/vnd.ibm.modcap":{source:"apache",extensions:["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{source:"iana",extensions:["irm"]},"application/vnd.ibm.secure-container":{source:"iana",extensions:["sc"]},"application/vnd.iccprofile":{source:"iana",extensions:["icc","icm"]},"application/vnd.ieee.1905":{source:"iana"},"application/vnd.igloader":{source:"iana",extensions:["igl"]},"application/vnd.imagemeter.folder+zip":{source:"iana",compressible:!1},"application/vnd.imagemeter.image+zip":{source:"iana",compressible:!1},"application/vnd.immervision-ivp":{source:"iana",extensions:["ivp"]},"application/vnd.immervision-ivu":{source:"iana",extensions:["ivu"]},"application/vnd.ims.imsccv1p1":{source:"iana"},"application/vnd.ims.imsccv1p2":{source:"iana"},"application/vnd.ims.imsccv1p3":{source:"iana"},"application/vnd.ims.lis.v2.result+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy.id+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings.simple+json":{source:"iana",compressible:!0},"application/vnd.informedcontrol.rms+xml":{source:"iana",compressible:!0},"application/vnd.informix-visionary":{source:"apache"},"application/vnd.infotech.project":{source:"iana"},"application/vnd.infotech.project+xml":{source:"iana",compressible:!0},"application/vnd.innopath.wamp.notification":{source:"iana"},"application/vnd.insors.igm":{source:"iana",extensions:["igm"]},"application/vnd.intercon.formnet":{source:"iana",extensions:["xpw","xpx"]},"application/vnd.intergeo":{source:"iana",extensions:["i2g"]},"application/vnd.intertrust.digibox":{source:"iana"},"application/vnd.intertrust.nncp":{source:"iana"},"application/vnd.intu.qbo":{source:"iana",extensions:["qbo"]},"application/vnd.intu.qfx":{source:"iana",extensions:["qfx"]},"application/vnd.ipfs.ipns-record":{source:"iana"},"application/vnd.ipld.car":{source:"iana"},"application/vnd.ipld.dag-cbor":{source:"iana"},"application/vnd.ipld.dag-json":{source:"iana"},"application/vnd.ipld.raw":{source:"iana"},"application/vnd.iptc.g2.catalogitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.conceptitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.knowledgeitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsmessage+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.packageitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.planningitem+xml":{source:"iana",compressible:!0},"application/vnd.ipunplugged.rcprofile":{source:"iana",extensions:["rcprofile"]},"application/vnd.irepository.package+xml":{source:"iana",compressible:!0,extensions:["irp"]},"application/vnd.is-xpr":{source:"iana",extensions:["xpr"]},"application/vnd.isac.fcs":{source:"iana",extensions:["fcs"]},"application/vnd.iso11783-10+zip":{source:"iana",compressible:!1},"application/vnd.jam":{source:"iana",extensions:["jam"]},"application/vnd.japannet-directory-service":{source:"iana"},"application/vnd.japannet-jpnstore-wakeup":{source:"iana"},"application/vnd.japannet-payment-wakeup":{source:"iana"},"application/vnd.japannet-registration":{source:"iana"},"application/vnd.japannet-registration-wakeup":{source:"iana"},"application/vnd.japannet-setstore-wakeup":{source:"iana"},"application/vnd.japannet-verification":{source:"iana"},"application/vnd.japannet-verification-wakeup":{source:"iana"},"application/vnd.jcp.javame.midlet-rms":{source:"iana",extensions:["rms"]},"application/vnd.jisp":{source:"iana",extensions:["jisp"]},"application/vnd.joost.joda-archive":{source:"iana",extensions:["joda"]},"application/vnd.jsk.isdn-ngn":{source:"iana"},"application/vnd.kahootz":{source:"iana",extensions:["ktz","ktr"]},"application/vnd.kde.karbon":{source:"iana",extensions:["karbon"]},"application/vnd.kde.kchart":{source:"iana",extensions:["chrt"]},"application/vnd.kde.kformula":{source:"iana",extensions:["kfo"]},"application/vnd.kde.kivio":{source:"iana",extensions:["flw"]},"application/vnd.kde.kontour":{source:"iana",extensions:["kon"]},"application/vnd.kde.kpresenter":{source:"iana",extensions:["kpr","kpt"]},"application/vnd.kde.kspread":{source:"iana",extensions:["ksp"]},"application/vnd.kde.kword":{source:"iana",extensions:["kwd","kwt"]},"application/vnd.kenameaapp":{source:"iana",extensions:["htke"]},"application/vnd.kidspiration":{source:"iana",extensions:["kia"]},"application/vnd.kinar":{source:"iana",extensions:["kne","knp"]},"application/vnd.koan":{source:"iana",extensions:["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{source:"iana",extensions:["sse"]},"application/vnd.las":{source:"iana"},"application/vnd.las.las+json":{source:"iana",compressible:!0},"application/vnd.las.las+xml":{source:"iana",compressible:!0,extensions:["lasxml"]},"application/vnd.laszip":{source:"iana"},"application/vnd.ldev.productlicensing":{source:"iana"},"application/vnd.leap+json":{source:"iana",compressible:!0},"application/vnd.liberty-request+xml":{source:"iana",compressible:!0},"application/vnd.llamagraphics.life-balance.desktop":{source:"iana",extensions:["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{source:"iana",compressible:!0,extensions:["lbe"]},"application/vnd.logipipe.circuit+zip":{source:"iana",compressible:!1},"application/vnd.loom":{source:"iana"},"application/vnd.lotus-1-2-3":{source:"iana",extensions:["123"]},"application/vnd.lotus-approach":{source:"iana",extensions:["apr"]},"application/vnd.lotus-freelance":{source:"iana",extensions:["pre"]},"application/vnd.lotus-notes":{source:"iana",extensions:["nsf"]},"application/vnd.lotus-organizer":{source:"iana",extensions:["org"]},"application/vnd.lotus-screencam":{source:"iana",extensions:["scm"]},"application/vnd.lotus-wordpro":{source:"iana",extensions:["lwp"]},"application/vnd.macports.portpkg":{source:"iana",extensions:["portpkg"]},"application/vnd.mapbox-vector-tile":{source:"iana",extensions:["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.conftoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.license+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.mdcf":{source:"iana"},"application/vnd.mason+json":{source:"iana",compressible:!0},"application/vnd.maxar.archive.3tz+zip":{source:"iana",compressible:!1},"application/vnd.maxmind.maxmind-db":{source:"iana"},"application/vnd.mcd":{source:"iana",extensions:["mcd"]},"application/vnd.mdl":{source:"iana"},"application/vnd.mdl-mbsdf":{source:"iana"},"application/vnd.medcalcdata":{source:"iana",extensions:["mc1"]},"application/vnd.mediastation.cdkey":{source:"iana",extensions:["cdkey"]},"application/vnd.medicalholodeck.recordxr":{source:"iana"},"application/vnd.meridian-slingshot":{source:"iana"},"application/vnd.mermaid":{source:"iana"},"application/vnd.mfer":{source:"iana",extensions:["mwf"]},"application/vnd.mfmp":{source:"iana",extensions:["mfm"]},"application/vnd.micro+json":{source:"iana",compressible:!0},"application/vnd.micrografx.flo":{source:"iana",extensions:["flo"]},"application/vnd.micrografx.igx":{source:"iana",extensions:["igx"]},"application/vnd.microsoft.portable-executable":{source:"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{source:"iana"},"application/vnd.miele+json":{source:"iana",compressible:!0},"application/vnd.mif":{source:"iana",extensions:["mif"]},"application/vnd.minisoft-hp3000-save":{source:"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{source:"iana"},"application/vnd.mobius.daf":{source:"iana",extensions:["daf"]},"application/vnd.mobius.dis":{source:"iana",extensions:["dis"]},"application/vnd.mobius.mbk":{source:"iana",extensions:["mbk"]},"application/vnd.mobius.mqy":{source:"iana",extensions:["mqy"]},"application/vnd.mobius.msl":{source:"iana",extensions:["msl"]},"application/vnd.mobius.plc":{source:"iana",extensions:["plc"]},"application/vnd.mobius.txf":{source:"iana",extensions:["txf"]},"application/vnd.modl":{source:"iana"},"application/vnd.mophun.application":{source:"iana",extensions:["mpn"]},"application/vnd.mophun.certificate":{source:"iana",extensions:["mpc"]},"application/vnd.motorola.flexsuite":{source:"iana"},"application/vnd.motorola.flexsuite.adsi":{source:"iana"},"application/vnd.motorola.flexsuite.fis":{source:"iana"},"application/vnd.motorola.flexsuite.gotap":{source:"iana"},"application/vnd.motorola.flexsuite.kmr":{source:"iana"},"application/vnd.motorola.flexsuite.ttc":{source:"iana"},"application/vnd.motorola.flexsuite.wem":{source:"iana"},"application/vnd.motorola.iprm":{source:"iana"},"application/vnd.mozilla.xul+xml":{source:"iana",compressible:!0,extensions:["xul"]},"application/vnd.ms-3mfdocument":{source:"iana"},"application/vnd.ms-artgalry":{source:"iana",extensions:["cil"]},"application/vnd.ms-asf":{source:"iana"},"application/vnd.ms-cab-compressed":{source:"iana",extensions:["cab"]},"application/vnd.ms-color.iccprofile":{source:"apache"},"application/vnd.ms-excel":{source:"iana",compressible:!1,extensions:["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{source:"iana",extensions:["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{source:"iana",extensions:["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{source:"iana",extensions:["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{source:"iana",extensions:["xltm"]},"application/vnd.ms-fontobject":{source:"iana",compressible:!0,extensions:["eot"]},"application/vnd.ms-htmlhelp":{source:"iana",extensions:["chm"]},"application/vnd.ms-ims":{source:"iana",extensions:["ims"]},"application/vnd.ms-lrm":{source:"iana",extensions:["lrm"]},"application/vnd.ms-office.activex+xml":{source:"iana",compressible:!0},"application/vnd.ms-officetheme":{source:"iana",extensions:["thmx"]},"application/vnd.ms-opentype":{source:"apache",compressible:!0},"application/vnd.ms-outlook":{compressible:!1,extensions:["msg"]},"application/vnd.ms-package.obfuscated-opentype":{source:"apache"},"application/vnd.ms-pki.seccat":{source:"apache",extensions:["cat"]},"application/vnd.ms-pki.stl":{source:"apache",extensions:["stl"]},"application/vnd.ms-playready.initiator+xml":{source:"iana",compressible:!0},"application/vnd.ms-powerpoint":{source:"iana",compressible:!1,extensions:["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{source:"iana",extensions:["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{source:"iana",extensions:["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{source:"iana",extensions:["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{source:"iana",extensions:["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{source:"iana",extensions:["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{source:"iana",compressible:!0},"application/vnd.ms-printing.printticket+xml":{source:"apache",compressible:!0},"application/vnd.ms-printschematicket+xml":{source:"iana",compressible:!0},"application/vnd.ms-project":{source:"iana",extensions:["mpp","mpt"]},"application/vnd.ms-tnef":{source:"iana"},"application/vnd.ms-windows.devicepairing":{source:"iana"},"application/vnd.ms-windows.nwprinting.oob":{source:"iana"},"application/vnd.ms-windows.printerpairing":{source:"iana"},"application/vnd.ms-windows.wsd.oob":{source:"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.lic-resp":{source:"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.meter-resp":{source:"iana"},"application/vnd.ms-word.document.macroenabled.12":{source:"iana",extensions:["docm"]},"application/vnd.ms-word.template.macroenabled.12":{source:"iana",extensions:["dotm"]},"application/vnd.ms-works":{source:"iana",extensions:["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{source:"iana",extensions:["wpl"]},"application/vnd.ms-xpsdocument":{source:"iana",compressible:!1,extensions:["xps"]},"application/vnd.msa-disk-image":{source:"iana"},"application/vnd.mseq":{source:"iana",extensions:["mseq"]},"application/vnd.msgpack":{source:"iana"},"application/vnd.msign":{source:"iana"},"application/vnd.multiad.creator":{source:"iana"},"application/vnd.multiad.creator.cif":{source:"iana"},"application/vnd.music-niff":{source:"iana"},"application/vnd.musician":{source:"iana",extensions:["mus"]},"application/vnd.muvee.style":{source:"iana",extensions:["msty"]},"application/vnd.mynfc":{source:"iana",extensions:["taglet"]},"application/vnd.nacamar.ybrid+json":{source:"iana",compressible:!0},"application/vnd.nato.bindingdataobject+cbor":{source:"iana"},"application/vnd.nato.bindingdataobject+json":{source:"iana",compressible:!0},"application/vnd.nato.bindingdataobject+xml":{source:"iana",compressible:!0,extensions:["bdo"]},"application/vnd.nato.openxmlformats-package.iepd+zip":{source:"iana",compressible:!1},"application/vnd.ncd.control":{source:"iana"},"application/vnd.ncd.reference":{source:"iana"},"application/vnd.nearst.inv+json":{source:"iana",compressible:!0},"application/vnd.nebumind.line":{source:"iana"},"application/vnd.nervana":{source:"iana"},"application/vnd.netfpx":{source:"iana"},"application/vnd.neurolanguage.nlu":{source:"iana",extensions:["nlu"]},"application/vnd.nimn":{source:"iana"},"application/vnd.nintendo.nitro.rom":{source:"iana"},"application/vnd.nintendo.snes.rom":{source:"iana"},"application/vnd.nitf":{source:"iana",extensions:["ntf","nitf"]},"application/vnd.noblenet-directory":{source:"iana",extensions:["nnd"]},"application/vnd.noblenet-sealer":{source:"iana",extensions:["nns"]},"application/vnd.noblenet-web":{source:"iana",extensions:["nnw"]},"application/vnd.nokia.catalogs":{source:"iana"},"application/vnd.nokia.conml+wbxml":{source:"iana"},"application/vnd.nokia.conml+xml":{source:"iana",compressible:!0},"application/vnd.nokia.iptv.config+xml":{source:"iana",compressible:!0},"application/vnd.nokia.isds-radio-presets":{source:"iana"},"application/vnd.nokia.landmark+wbxml":{source:"iana"},"application/vnd.nokia.landmark+xml":{source:"iana",compressible:!0},"application/vnd.nokia.landmarkcollection+xml":{source:"iana",compressible:!0},"application/vnd.nokia.n-gage.ac+xml":{source:"iana",compressible:!0,extensions:["ac"]},"application/vnd.nokia.n-gage.data":{source:"iana",extensions:["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{source:"apache",extensions:["n-gage"]},"application/vnd.nokia.ncd":{source:"iana"},"application/vnd.nokia.pcd+wbxml":{source:"iana"},"application/vnd.nokia.pcd+xml":{source:"iana",compressible:!0},"application/vnd.nokia.radio-preset":{source:"iana",extensions:["rpst"]},"application/vnd.nokia.radio-presets":{source:"iana",extensions:["rpss"]},"application/vnd.novadigm.edm":{source:"iana",extensions:["edm"]},"application/vnd.novadigm.edx":{source:"iana",extensions:["edx"]},"application/vnd.novadigm.ext":{source:"iana",extensions:["ext"]},"application/vnd.ntt-local.content-share":{source:"iana"},"application/vnd.ntt-local.file-transfer":{source:"iana"},"application/vnd.ntt-local.ogw_remote-access":{source:"iana"},"application/vnd.ntt-local.sip-ta_remote":{source:"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{source:"iana"},"application/vnd.oai.workflows":{source:"iana"},"application/vnd.oai.workflows+json":{source:"iana",compressible:!0},"application/vnd.oai.workflows+yaml":{source:"iana"},"application/vnd.oasis.opendocument.base":{source:"iana"},"application/vnd.oasis.opendocument.chart":{source:"iana",extensions:["odc"]},"application/vnd.oasis.opendocument.chart-template":{source:"iana",extensions:["otc"]},"application/vnd.oasis.opendocument.database":{source:"apache",extensions:["odb"]},"application/vnd.oasis.opendocument.formula":{source:"iana",extensions:["odf"]},"application/vnd.oasis.opendocument.formula-template":{source:"iana",extensions:["odft"]},"application/vnd.oasis.opendocument.graphics":{source:"iana",compressible:!1,extensions:["odg"]},"application/vnd.oasis.opendocument.graphics-template":{source:"iana",extensions:["otg"]},"application/vnd.oasis.opendocument.image":{source:"iana",extensions:["odi"]},"application/vnd.oasis.opendocument.image-template":{source:"iana",extensions:["oti"]},"application/vnd.oasis.opendocument.presentation":{source:"iana",compressible:!1,extensions:["odp"]},"application/vnd.oasis.opendocument.presentation-template":{source:"iana",extensions:["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{source:"iana",compressible:!1,extensions:["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{source:"iana",extensions:["ots"]},"application/vnd.oasis.opendocument.text":{source:"iana",compressible:!1,extensions:["odt"]},"application/vnd.oasis.opendocument.text-master":{source:"iana",extensions:["odm"]},"application/vnd.oasis.opendocument.text-master-template":{source:"iana"},"application/vnd.oasis.opendocument.text-template":{source:"iana",extensions:["ott"]},"application/vnd.oasis.opendocument.text-web":{source:"iana",extensions:["oth"]},"application/vnd.obn":{source:"iana"},"application/vnd.ocf+cbor":{source:"iana"},"application/vnd.oci.image.manifest.v1+json":{source:"iana",compressible:!0},"application/vnd.oftn.l10n+json":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessdownload+xml":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessstreaming+xml":{source:"iana",compressible:!0},"application/vnd.oipf.cspg-hexbinary":{source:"iana"},"application/vnd.oipf.dae.svg+xml":{source:"iana",compressible:!0},"application/vnd.oipf.dae.xhtml+xml":{source:"iana",compressible:!0},"application/vnd.oipf.mippvcontrolmessage+xml":{source:"iana",compressible:!0},"application/vnd.oipf.pae.gem":{source:"iana"},"application/vnd.oipf.spdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.oipf.spdlist+xml":{source:"iana",compressible:!0},"application/vnd.oipf.ueprofile+xml":{source:"iana",compressible:!0},"application/vnd.oipf.userprofile+xml":{source:"iana",compressible:!0},"application/vnd.olpc-sugar":{source:"iana",extensions:["xo"]},"application/vnd.oma-scws-config":{source:"iana"},"application/vnd.oma-scws-http-request":{source:"iana"},"application/vnd.oma-scws-http-response":{source:"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.drm-trigger+xml":{source:"apache",compressible:!0},"application/vnd.oma.bcast.imd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.ltkm":{source:"iana"},"application/vnd.oma.bcast.notification+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.provisioningtrigger":{source:"iana"},"application/vnd.oma.bcast.sgboot":{source:"iana"},"application/vnd.oma.bcast.sgdd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.sgdu":{source:"iana"},"application/vnd.oma.bcast.simple-symbol-container":{source:"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{source:"apache",compressible:!0},"application/vnd.oma.bcast.sprov+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.stkm":{source:"iana"},"application/vnd.oma.cab-address-book+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-feature-handler+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-pcc+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-subs-invite+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-user-prefs+xml":{source:"iana",compressible:!0},"application/vnd.oma.dcd":{source:"iana"},"application/vnd.oma.dcdc":{source:"iana"},"application/vnd.oma.dd2+xml":{source:"iana",compressible:!0,extensions:["dd2"]},"application/vnd.oma.drm.risd+xml":{source:"iana",compressible:!0},"application/vnd.oma.group-usage-list+xml":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+cbor":{source:"iana"},"application/vnd.oma.lwm2m+json":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+tlv":{source:"iana"},"application/vnd.oma.pal+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.detailed-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.final-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.groups+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.invocation-descriptor+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.optimized-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.push":{source:"iana"},"application/vnd.oma.scidm.messages+xml":{source:"iana",compressible:!0},"application/vnd.oma.xcap-directory+xml":{source:"iana",compressible:!0},"application/vnd.omads-email+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-file+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-folder+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omaloc-supl-init":{source:"iana"},"application/vnd.onepager":{source:"iana"},"application/vnd.onepagertamp":{source:"iana"},"application/vnd.onepagertamx":{source:"iana"},"application/vnd.onepagertat":{source:"iana"},"application/vnd.onepagertatp":{source:"iana"},"application/vnd.onepagertatx":{source:"iana"},"application/vnd.onvif.metadata":{source:"iana"},"application/vnd.openblox.game+xml":{source:"iana",compressible:!0,extensions:["obgx"]},"application/vnd.openblox.game-binary":{source:"iana"},"application/vnd.openeye.oeb":{source:"iana"},"application/vnd.openofficeorg.extension":{source:"apache",extensions:["oxt"]},"application/vnd.openstreetmap.data+xml":{source:"iana",compressible:!0,extensions:["osm"]},"application/vnd.opentimestamps.ots":{source:"iana"},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawing+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{source:"iana",compressible:!1,extensions:["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slide":{source:"iana",extensions:["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{source:"iana",extensions:["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.template":{source:"iana",extensions:["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{source:"iana",compressible:!1,extensions:["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{source:"iana",extensions:["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.theme+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.vmldrawing":{source:"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{source:"iana",compressible:!1,extensions:["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{source:"iana",extensions:["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.core-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.relationships+xml":{source:"iana",compressible:!0},"application/vnd.oracle.resource+json":{source:"iana",compressible:!0},"application/vnd.orange.indata":{source:"iana"},"application/vnd.osa.netdeploy":{source:"iana"},"application/vnd.osgeo.mapguide.package":{source:"iana",extensions:["mgp"]},"application/vnd.osgi.bundle":{source:"iana"},"application/vnd.osgi.dp":{source:"iana",extensions:["dp"]},"application/vnd.osgi.subsystem":{source:"iana",extensions:["esa"]},"application/vnd.otps.ct-kip+xml":{source:"iana",compressible:!0},"application/vnd.oxli.countgraph":{source:"iana"},"application/vnd.pagerduty+json":{source:"iana",compressible:!0},"application/vnd.palm":{source:"iana",extensions:["pdb","pqa","oprc"]},"application/vnd.panoply":{source:"iana"},"application/vnd.paos.xml":{source:"iana"},"application/vnd.patentdive":{source:"iana"},"application/vnd.patientecommsdoc":{source:"iana"},"application/vnd.pawaafile":{source:"iana",extensions:["paw"]},"application/vnd.pcos":{source:"iana"},"application/vnd.pg.format":{source:"iana",extensions:["str"]},"application/vnd.pg.osasli":{source:"iana",extensions:["ei6"]},"application/vnd.piaccess.application-licence":{source:"iana"},"application/vnd.picsel":{source:"iana",extensions:["efif"]},"application/vnd.pmi.widget":{source:"iana",extensions:["wg"]},"application/vnd.poc.group-advertisement+xml":{source:"iana",compressible:!0},"application/vnd.pocketlearn":{source:"iana",extensions:["plf"]},"application/vnd.powerbuilder6":{source:"iana",extensions:["pbd"]},"application/vnd.powerbuilder6-s":{source:"iana"},"application/vnd.powerbuilder7":{source:"iana"},"application/vnd.powerbuilder7-s":{source:"iana"},"application/vnd.powerbuilder75":{source:"iana"},"application/vnd.powerbuilder75-s":{source:"iana"},"application/vnd.preminet":{source:"iana"},"application/vnd.previewsystems.box":{source:"iana",extensions:["box"]},"application/vnd.proteus.magazine":{source:"iana",extensions:["mgz"]},"application/vnd.psfs":{source:"iana"},"application/vnd.pt.mundusmundi":{source:"iana"},"application/vnd.publishare-delta-tree":{source:"iana",extensions:["qps"]},"application/vnd.pvi.ptid1":{source:"iana",extensions:["ptid"]},"application/vnd.pwg-multiplexed":{source:"iana"},"application/vnd.pwg-xhtml-print+xml":{source:"iana",compressible:!0,extensions:["xhtm"]},"application/vnd.qualcomm.brew-app-res":{source:"iana"},"application/vnd.quarantainenet":{source:"iana"},"application/vnd.quark.quarkxpress":{source:"iana",extensions:["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{source:"iana"},"application/vnd.radisys.moml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conn+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-stream+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-base+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-detect+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-group+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-speech+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-transform+xml":{source:"iana",compressible:!0},"application/vnd.rainstor.data":{source:"iana"},"application/vnd.rapid":{source:"iana"},"application/vnd.rar":{source:"iana",extensions:["rar"]},"application/vnd.realvnc.bed":{source:"iana",extensions:["bed"]},"application/vnd.recordare.musicxml":{source:"iana",extensions:["mxl"]},"application/vnd.recordare.musicxml+xml":{source:"iana",compressible:!0,extensions:["musicxml"]},"application/vnd.relpipe":{source:"iana"},"application/vnd.renlearn.rlprint":{source:"iana"},"application/vnd.resilient.logic":{source:"iana"},"application/vnd.restful+json":{source:"iana",compressible:!0},"application/vnd.rig.cryptonote":{source:"iana",extensions:["cryptonote"]},"application/vnd.rim.cod":{source:"apache",extensions:["cod"]},"application/vnd.rn-realmedia":{source:"apache",extensions:["rm"]},"application/vnd.rn-realmedia-vbr":{source:"apache",extensions:["rmvb"]},"application/vnd.route66.link66+xml":{source:"iana",compressible:!0,extensions:["link66"]},"application/vnd.rs-274x":{source:"iana"},"application/vnd.ruckus.download":{source:"iana"},"application/vnd.s3sms":{source:"iana"},"application/vnd.sailingtracker.track":{source:"iana",extensions:["st"]},"application/vnd.sar":{source:"iana"},"application/vnd.sbm.cid":{source:"iana"},"application/vnd.sbm.mid2":{source:"iana"},"application/vnd.scribus":{source:"iana"},"application/vnd.sealed.3df":{source:"iana"},"application/vnd.sealed.csf":{source:"iana"},"application/vnd.sealed.doc":{source:"iana"},"application/vnd.sealed.eml":{source:"iana"},"application/vnd.sealed.mht":{source:"iana"},"application/vnd.sealed.net":{source:"iana"},"application/vnd.sealed.ppt":{source:"iana"},"application/vnd.sealed.tiff":{source:"iana"},"application/vnd.sealed.xls":{source:"iana"},"application/vnd.sealedmedia.softseal.html":{source:"iana"},"application/vnd.sealedmedia.softseal.pdf":{source:"iana"},"application/vnd.seemail":{source:"iana",extensions:["see"]},"application/vnd.seis+json":{source:"iana",compressible:!0},"application/vnd.sema":{source:"iana",extensions:["sema"]},"application/vnd.semd":{source:"iana",extensions:["semd"]},"application/vnd.semf":{source:"iana",extensions:["semf"]},"application/vnd.shade-save-file":{source:"iana"},"application/vnd.shana.informed.formdata":{source:"iana",extensions:["ifm"]},"application/vnd.shana.informed.formtemplate":{source:"iana",extensions:["itp"]},"application/vnd.shana.informed.interchange":{source:"iana",extensions:["iif"]},"application/vnd.shana.informed.package":{source:"iana",extensions:["ipk"]},"application/vnd.shootproof+json":{source:"iana",compressible:!0},"application/vnd.shopkick+json":{source:"iana",compressible:!0},"application/vnd.shp":{source:"iana"},"application/vnd.shx":{source:"iana"},"application/vnd.sigrok.session":{source:"iana"},"application/vnd.simtech-mindmapper":{source:"iana",extensions:["twd","twds"]},"application/vnd.siren+json":{source:"iana",compressible:!0},"application/vnd.smaf":{source:"iana",extensions:["mmf"]},"application/vnd.smart.notebook":{source:"iana"},"application/vnd.smart.teacher":{source:"iana",extensions:["teacher"]},"application/vnd.smintio.portals.archive":{source:"iana"},"application/vnd.snesdev-page-table":{source:"iana"},"application/vnd.software602.filler.form+xml":{source:"iana",compressible:!0,extensions:["fo"]},"application/vnd.software602.filler.form-xml-zip":{source:"iana"},"application/vnd.solent.sdkm+xml":{source:"iana",compressible:!0,extensions:["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{source:"iana",extensions:["dxp"]},"application/vnd.spotfire.sfs":{source:"iana",extensions:["sfs"]},"application/vnd.sqlite3":{source:"iana"},"application/vnd.sss-cod":{source:"iana"},"application/vnd.sss-dtf":{source:"iana"},"application/vnd.sss-ntf":{source:"iana"},"application/vnd.stardivision.calc":{source:"apache",extensions:["sdc"]},"application/vnd.stardivision.draw":{source:"apache",extensions:["sda"]},"application/vnd.stardivision.impress":{source:"apache",extensions:["sdd"]},"application/vnd.stardivision.math":{source:"apache",extensions:["smf"]},"application/vnd.stardivision.writer":{source:"apache",extensions:["sdw","vor"]},"application/vnd.stardivision.writer-global":{source:"apache",extensions:["sgl"]},"application/vnd.stepmania.package":{source:"iana",extensions:["smzip"]},"application/vnd.stepmania.stepchart":{source:"iana",extensions:["sm"]},"application/vnd.street-stream":{source:"iana"},"application/vnd.sun.wadl+xml":{source:"iana",compressible:!0,extensions:["wadl"]},"application/vnd.sun.xml.calc":{source:"apache",extensions:["sxc"]},"application/vnd.sun.xml.calc.template":{source:"apache",extensions:["stc"]},"application/vnd.sun.xml.draw":{source:"apache",extensions:["sxd"]},"application/vnd.sun.xml.draw.template":{source:"apache",extensions:["std"]},"application/vnd.sun.xml.impress":{source:"apache",extensions:["sxi"]},"application/vnd.sun.xml.impress.template":{source:"apache",extensions:["sti"]},"application/vnd.sun.xml.math":{source:"apache",extensions:["sxm"]},"application/vnd.sun.xml.writer":{source:"apache",extensions:["sxw"]},"application/vnd.sun.xml.writer.global":{source:"apache",extensions:["sxg"]},"application/vnd.sun.xml.writer.template":{source:"apache",extensions:["stw"]},"application/vnd.sus-calendar":{source:"iana",extensions:["sus","susp"]},"application/vnd.svd":{source:"iana",extensions:["svd"]},"application/vnd.swiftview-ics":{source:"iana"},"application/vnd.sybyl.mol2":{source:"iana"},"application/vnd.sycle+xml":{source:"iana",compressible:!0},"application/vnd.syft+json":{source:"iana",compressible:!0},"application/vnd.symbian.install":{source:"apache",extensions:["sis","sisx"]},"application/vnd.syncml+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xsm"]},"application/vnd.syncml.dm+wbxml":{source:"iana",charset:"UTF-8",extensions:["bdm"]},"application/vnd.syncml.dm+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xdm"]},"application/vnd.syncml.dm.notification":{source:"iana"},"application/vnd.syncml.dmddf+wbxml":{source:"iana"},"application/vnd.syncml.dmddf+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{source:"iana"},"application/vnd.syncml.dmtnds+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.syncml.ds.notification":{source:"iana"},"application/vnd.tableschema+json":{source:"iana",compressible:!0},"application/vnd.tao.intent-module-archive":{source:"iana",extensions:["tao"]},"application/vnd.tcpdump.pcap":{source:"iana",extensions:["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{source:"iana",compressible:!0},"application/vnd.tmd.mediaflex.api+xml":{source:"iana",compressible:!0},"application/vnd.tml":{source:"iana"},"application/vnd.tmobile-livetv":{source:"iana",extensions:["tmo"]},"application/vnd.tri.onesource":{source:"iana"},"application/vnd.trid.tpt":{source:"iana",extensions:["tpt"]},"application/vnd.triscape.mxs":{source:"iana",extensions:["mxs"]},"application/vnd.trueapp":{source:"iana",extensions:["tra"]},"application/vnd.truedoc":{source:"iana"},"application/vnd.ubisoft.webplayer":{source:"iana"},"application/vnd.ufdl":{source:"iana",extensions:["ufd","ufdl"]},"application/vnd.uiq.theme":{source:"iana",extensions:["utz"]},"application/vnd.umajin":{source:"iana",extensions:["umj"]},"application/vnd.unity":{source:"iana",extensions:["unityweb"]},"application/vnd.uoml+xml":{source:"iana",compressible:!0,extensions:["uoml","uo"]},"application/vnd.uplanet.alert":{source:"iana"},"application/vnd.uplanet.alert-wbxml":{source:"iana"},"application/vnd.uplanet.bearer-choice":{source:"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{source:"iana"},"application/vnd.uplanet.cacheop":{source:"iana"},"application/vnd.uplanet.cacheop-wbxml":{source:"iana"},"application/vnd.uplanet.channel":{source:"iana"},"application/vnd.uplanet.channel-wbxml":{source:"iana"},"application/vnd.uplanet.list":{source:"iana"},"application/vnd.uplanet.list-wbxml":{source:"iana"},"application/vnd.uplanet.listcmd":{source:"iana"},"application/vnd.uplanet.listcmd-wbxml":{source:"iana"},"application/vnd.uplanet.signal":{source:"iana"},"application/vnd.uri-map":{source:"iana"},"application/vnd.valve.source.material":{source:"iana"},"application/vnd.vcx":{source:"iana",extensions:["vcx"]},"application/vnd.vd-study":{source:"iana"},"application/vnd.vectorworks":{source:"iana"},"application/vnd.vel+json":{source:"iana",compressible:!0},"application/vnd.verimatrix.vcas":{source:"iana"},"application/vnd.veritone.aion+json":{source:"iana",compressible:!0},"application/vnd.veryant.thin":{source:"iana"},"application/vnd.ves.encrypted":{source:"iana"},"application/vnd.vidsoft.vidconference":{source:"iana"},"application/vnd.visio":{source:"iana",extensions:["vsd","vst","vss","vsw"]},"application/vnd.visionary":{source:"iana",extensions:["vis"]},"application/vnd.vividence.scriptfile":{source:"iana"},"application/vnd.vsf":{source:"iana",extensions:["vsf"]},"application/vnd.wap.sic":{source:"iana"},"application/vnd.wap.slc":{source:"iana"},"application/vnd.wap.wbxml":{source:"iana",charset:"UTF-8",extensions:["wbxml"]},"application/vnd.wap.wmlc":{source:"iana",extensions:["wmlc"]},"application/vnd.wap.wmlscriptc":{source:"iana",extensions:["wmlsc"]},"application/vnd.wasmflow.wafl":{source:"iana"},"application/vnd.webturbo":{source:"iana",extensions:["wtb"]},"application/vnd.wfa.dpp":{source:"iana"},"application/vnd.wfa.p2p":{source:"iana"},"application/vnd.wfa.wsc":{source:"iana"},"application/vnd.windows.devicepairing":{source:"iana"},"application/vnd.wmc":{source:"iana"},"application/vnd.wmf.bootstrap":{source:"iana"},"application/vnd.wolfram.mathematica":{source:"iana"},"application/vnd.wolfram.mathematica.package":{source:"iana"},"application/vnd.wolfram.player":{source:"iana",extensions:["nbp"]},"application/vnd.wordlift":{source:"iana"},"application/vnd.wordperfect":{source:"iana",extensions:["wpd"]},"application/vnd.wqd":{source:"iana",extensions:["wqd"]},"application/vnd.wrq-hp3000-labelled":{source:"iana"},"application/vnd.wt.stf":{source:"iana",extensions:["stf"]},"application/vnd.wv.csp+wbxml":{source:"iana"},"application/vnd.wv.csp+xml":{source:"iana",compressible:!0},"application/vnd.wv.ssp+xml":{source:"iana",compressible:!0},"application/vnd.xacml+json":{source:"iana",compressible:!0},"application/vnd.xara":{source:"iana",extensions:["xar"]},"application/vnd.xecrets-encrypted":{source:"iana"},"application/vnd.xfdl":{source:"iana",extensions:["xfdl"]},"application/vnd.xfdl.webform":{source:"iana"},"application/vnd.xmi+xml":{source:"iana",compressible:!0},"application/vnd.xmpie.cpkg":{source:"iana"},"application/vnd.xmpie.dpkg":{source:"iana"},"application/vnd.xmpie.plan":{source:"iana"},"application/vnd.xmpie.ppkg":{source:"iana"},"application/vnd.xmpie.xlim":{source:"iana"},"application/vnd.yamaha.hv-dic":{source:"iana",extensions:["hvd"]},"application/vnd.yamaha.hv-script":{source:"iana",extensions:["hvs"]},"application/vnd.yamaha.hv-voice":{source:"iana",extensions:["hvp"]},"application/vnd.yamaha.openscoreformat":{source:"iana",extensions:["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{source:"iana",compressible:!0,extensions:["osfpvg"]},"application/vnd.yamaha.remote-setup":{source:"iana"},"application/vnd.yamaha.smaf-audio":{source:"iana",extensions:["saf"]},"application/vnd.yamaha.smaf-phrase":{source:"iana",extensions:["spf"]},"application/vnd.yamaha.through-ngn":{source:"iana"},"application/vnd.yamaha.tunnel-udpencap":{source:"iana"},"application/vnd.yaoweme":{source:"iana"},"application/vnd.yellowriver-custom-menu":{source:"iana",extensions:["cmp"]},"application/vnd.zul":{source:"iana",extensions:["zir","zirz"]},"application/vnd.zzazz.deck+xml":{source:"iana",compressible:!0,extensions:["zaz"]},"application/voicexml+xml":{source:"iana",compressible:!0,extensions:["vxml"]},"application/voucher-cms+json":{source:"iana",compressible:!0},"application/vp":{source:"iana"},"application/vq-rtcpxr":{source:"iana"},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/watcherinfo+xml":{source:"iana",compressible:!0,extensions:["wif"]},"application/webpush-options+json":{source:"iana",compressible:!0},"application/whoispp-query":{source:"iana"},"application/whoispp-response":{source:"iana"},"application/widget":{source:"iana",extensions:["wgt"]},"application/winhlp":{source:"apache",extensions:["hlp"]},"application/wita":{source:"iana"},"application/wordperfect5.1":{source:"iana"},"application/wsdl+xml":{source:"iana",compressible:!0,extensions:["wsdl"]},"application/wspolicy+xml":{source:"iana",compressible:!0,extensions:["wspolicy"]},"application/x-7z-compressed":{source:"apache",compressible:!1,extensions:["7z"]},"application/x-abiword":{source:"apache",extensions:["abw"]},"application/x-ace-compressed":{source:"apache",extensions:["ace"]},"application/x-amf":{source:"apache"},"application/x-apple-diskimage":{source:"apache",extensions:["dmg"]},"application/x-arj":{compressible:!1,extensions:["arj"]},"application/x-authorware-bin":{source:"apache",extensions:["aab","x32","u32","vox"]},"application/x-authorware-map":{source:"apache",extensions:["aam"]},"application/x-authorware-seg":{source:"apache",extensions:["aas"]},"application/x-bcpio":{source:"apache",extensions:["bcpio"]},"application/x-bdoc":{compressible:!1,extensions:["bdoc"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-blorb":{source:"apache",extensions:["blb","blorb"]},"application/x-bzip":{source:"apache",compressible:!1,extensions:["bz"]},"application/x-bzip2":{source:"apache",compressible:!1,extensions:["bz2","boz"]},"application/x-cbr":{source:"apache",extensions:["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{source:"apache",extensions:["vcd"]},"application/x-cfs-compressed":{source:"apache",extensions:["cfs"]},"application/x-chat":{source:"apache",extensions:["chat"]},"application/x-chess-pgn":{source:"apache",extensions:["pgn"]},"application/x-chrome-extension":{extensions:["crx"]},"application/x-cocoa":{source:"nginx",extensions:["cco"]},"application/x-compress":{source:"apache"},"application/x-conference":{source:"apache",extensions:["nsc"]},"application/x-cpio":{source:"apache",extensions:["cpio"]},"application/x-csh":{source:"apache",extensions:["csh"]},"application/x-deb":{compressible:!1},"application/x-debian-package":{source:"apache",extensions:["deb","udeb"]},"application/x-dgc-compressed":{source:"apache",extensions:["dgc"]},"application/x-director":{source:"apache",extensions:["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{source:"apache",extensions:["wad"]},"application/x-dtbncx+xml":{source:"apache",compressible:!0,extensions:["ncx"]},"application/x-dtbook+xml":{source:"apache",compressible:!0,extensions:["dtb"]},"application/x-dtbresource+xml":{source:"apache",compressible:!0,extensions:["res"]},"application/x-dvi":{source:"apache",compressible:!1,extensions:["dvi"]},"application/x-envoy":{source:"apache",extensions:["evy"]},"application/x-eva":{source:"apache",extensions:["eva"]},"application/x-font-bdf":{source:"apache",extensions:["bdf"]},"application/x-font-dos":{source:"apache"},"application/x-font-framemaker":{source:"apache"},"application/x-font-ghostscript":{source:"apache",extensions:["gsf"]},"application/x-font-libgrx":{source:"apache"},"application/x-font-linux-psf":{source:"apache",extensions:["psf"]},"application/x-font-pcf":{source:"apache",extensions:["pcf"]},"application/x-font-snf":{source:"apache",extensions:["snf"]},"application/x-font-speedo":{source:"apache"},"application/x-font-sunos-news":{source:"apache"},"application/x-font-type1":{source:"apache",extensions:["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{source:"apache"},"application/x-freearc":{source:"apache",extensions:["arc"]},"application/x-futuresplash":{source:"apache",extensions:["spl"]},"application/x-gca-compressed":{source:"apache",extensions:["gca"]},"application/x-glulx":{source:"apache",extensions:["ulx"]},"application/x-gnumeric":{source:"apache",extensions:["gnumeric"]},"application/x-gramps-xml":{source:"apache",extensions:["gramps"]},"application/x-gtar":{source:"apache",extensions:["gtar"]},"application/x-gzip":{source:"apache"},"application/x-hdf":{source:"apache",extensions:["hdf"]},"application/x-httpd-php":{compressible:!0,extensions:["php"]},"application/x-install-instructions":{source:"apache",extensions:["install"]},"application/x-iso9660-image":{source:"apache",extensions:["iso"]},"application/x-iwork-keynote-sffkey":{extensions:["key"]},"application/x-iwork-numbers-sffnumbers":{extensions:["numbers"]},"application/x-iwork-pages-sffpages":{extensions:["pages"]},"application/x-java-archive-diff":{source:"nginx",extensions:["jardiff"]},"application/x-java-jnlp-file":{source:"apache",compressible:!1,extensions:["jnlp"]},"application/x-javascript":{compressible:!0},"application/x-keepass2":{extensions:["kdbx"]},"application/x-latex":{source:"apache",compressible:!1,extensions:["latex"]},"application/x-lua-bytecode":{extensions:["luac"]},"application/x-lzh-compressed":{source:"apache",extensions:["lzh","lha"]},"application/x-makeself":{source:"nginx",extensions:["run"]},"application/x-mie":{source:"apache",extensions:["mie"]},"application/x-mobipocket-ebook":{source:"apache",extensions:["prc","mobi"]},"application/x-mpegurl":{compressible:!1},"application/x-ms-application":{source:"apache",extensions:["application"]},"application/x-ms-shortcut":{source:"apache",extensions:["lnk"]},"application/x-ms-wmd":{source:"apache",extensions:["wmd"]},"application/x-ms-wmz":{source:"apache",extensions:["wmz"]},"application/x-ms-xbap":{source:"apache",extensions:["xbap"]},"application/x-msaccess":{source:"apache",extensions:["mdb"]},"application/x-msbinder":{source:"apache",extensions:["obd"]},"application/x-mscardfile":{source:"apache",extensions:["crd"]},"application/x-msclip":{source:"apache",extensions:["clp"]},"application/x-msdos-program":{extensions:["exe"]},"application/x-msdownload":{source:"apache",extensions:["exe","dll","com","bat","msi"]},"application/x-msmediaview":{source:"apache",extensions:["mvb","m13","m14"]},"application/x-msmetafile":{source:"apache",extensions:["wmf","wmz","emf","emz"]},"application/x-msmoney":{source:"apache",extensions:["mny"]},"application/x-mspublisher":{source:"apache",extensions:["pub"]},"application/x-msschedule":{source:"apache",extensions:["scd"]},"application/x-msterminal":{source:"apache",extensions:["trm"]},"application/x-mswrite":{source:"apache",extensions:["wri"]},"application/x-netcdf":{source:"apache",extensions:["nc","cdf"]},"application/x-ns-proxy-autoconfig":{compressible:!0,extensions:["pac"]},"application/x-nzb":{source:"apache",extensions:["nzb"]},"application/x-perl":{source:"nginx",extensions:["pl","pm"]},"application/x-pilot":{source:"nginx",extensions:["prc","pdb"]},"application/x-pkcs12":{source:"apache",compressible:!1,extensions:["p12","pfx"]},"application/x-pkcs7-certificates":{source:"apache",extensions:["p7b","spc"]},"application/x-pkcs7-certreqresp":{source:"apache",extensions:["p7r"]},"application/x-pki-message":{source:"iana"},"application/x-rar-compressed":{source:"apache",compressible:!1,extensions:["rar"]},"application/x-redhat-package-manager":{source:"nginx",extensions:["rpm"]},"application/x-research-info-systems":{source:"apache",extensions:["ris"]},"application/x-sea":{source:"nginx",extensions:["sea"]},"application/x-sh":{source:"apache",compressible:!0,extensions:["sh"]},"application/x-shar":{source:"apache",extensions:["shar"]},"application/x-shockwave-flash":{source:"apache",compressible:!1,extensions:["swf"]},"application/x-silverlight-app":{source:"apache",extensions:["xap"]},"application/x-sql":{source:"apache",extensions:["sql"]},"application/x-stuffit":{source:"apache",compressible:!1,extensions:["sit"]},"application/x-stuffitx":{source:"apache",extensions:["sitx"]},"application/x-subrip":{source:"apache",extensions:["srt"]},"application/x-sv4cpio":{source:"apache",extensions:["sv4cpio"]},"application/x-sv4crc":{source:"apache",extensions:["sv4crc"]},"application/x-t3vm-image":{source:"apache",extensions:["t3"]},"application/x-tads":{source:"apache",extensions:["gam"]},"application/x-tar":{source:"apache",compressible:!0,extensions:["tar"]},"application/x-tcl":{source:"apache",extensions:["tcl","tk"]},"application/x-tex":{source:"apache",extensions:["tex"]},"application/x-tex-tfm":{source:"apache",extensions:["tfm"]},"application/x-texinfo":{source:"apache",extensions:["texinfo","texi"]},"application/x-tgif":{source:"apache",extensions:["obj"]},"application/x-ustar":{source:"apache",extensions:["ustar"]},"application/x-virtualbox-hdd":{compressible:!0,extensions:["hdd"]},"application/x-virtualbox-ova":{compressible:!0,extensions:["ova"]},"application/x-virtualbox-ovf":{compressible:!0,extensions:["ovf"]},"application/x-virtualbox-vbox":{compressible:!0,extensions:["vbox"]},"application/x-virtualbox-vbox-extpack":{compressible:!1,extensions:["vbox-extpack"]},"application/x-virtualbox-vdi":{compressible:!0,extensions:["vdi"]},"application/x-virtualbox-vhd":{compressible:!0,extensions:["vhd"]},"application/x-virtualbox-vmdk":{compressible:!0,extensions:["vmdk"]},"application/x-wais-source":{source:"apache",extensions:["src"]},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/x-x509-ca-cert":{source:"iana",extensions:["der","crt","pem"]},"application/x-x509-ca-ra-cert":{source:"iana"},"application/x-x509-next-ca-cert":{source:"iana"},"application/x-xfig":{source:"apache",extensions:["fig"]},"application/x-xliff+xml":{source:"apache",compressible:!0,extensions:["xlf"]},"application/x-xpinstall":{source:"apache",compressible:!1,extensions:["xpi"]},"application/x-xz":{source:"apache",extensions:["xz"]},"application/x-zmachine":{source:"apache",extensions:["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{source:"iana"},"application/xacml+xml":{source:"iana",compressible:!0},"application/xaml+xml":{source:"apache",compressible:!0,extensions:["xaml"]},"application/xcap-att+xml":{source:"iana",compressible:!0,extensions:["xav"]},"application/xcap-caps+xml":{source:"iana",compressible:!0,extensions:["xca"]},"application/xcap-diff+xml":{source:"iana",compressible:!0,extensions:["xdf"]},"application/xcap-el+xml":{source:"iana",compressible:!0,extensions:["xel"]},"application/xcap-error+xml":{source:"iana",compressible:!0},"application/xcap-ns+xml":{source:"iana",compressible:!0,extensions:["xns"]},"application/xcon-conference-info+xml":{source:"iana",compressible:!0},"application/xcon-conference-info-diff+xml":{source:"iana",compressible:!0},"application/xenc+xml":{source:"iana",compressible:!0,extensions:["xenc"]},"application/xfdf":{source:"iana",extensions:["xfdf"]},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xliff+xml":{source:"iana",compressible:!0,extensions:["xlf"]},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/xml-dtd":{source:"iana",compressible:!0,extensions:["dtd"]},"application/xml-external-parsed-entity":{source:"iana"},"application/xml-patch+xml":{source:"iana",compressible:!0},"application/xmpp+xml":{source:"iana",compressible:!0},"application/xop+xml":{source:"iana",compressible:!0,extensions:["xop"]},"application/xproc+xml":{source:"apache",compressible:!0,extensions:["xpl"]},"application/xslt+xml":{source:"iana",compressible:!0,extensions:["xsl","xslt"]},"application/xspf+xml":{source:"apache",compressible:!0,extensions:["xspf"]},"application/xv+xml":{source:"iana",compressible:!0,extensions:["mxml","xhvml","xvml","xvm"]},"application/yaml":{source:"iana"},"application/yang":{source:"iana",extensions:["yang"]},"application/yang-data+cbor":{source:"iana"},"application/yang-data+json":{source:"iana",compressible:!0},"application/yang-data+xml":{source:"iana",compressible:!0},"application/yang-patch+json":{source:"iana",compressible:!0},"application/yang-patch+xml":{source:"iana",compressible:!0},"application/yang-sid+json":{source:"iana",compressible:!0},"application/yin+xml":{source:"iana",compressible:!0,extensions:["yin"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zlib":{source:"iana"},"application/zstd":{source:"iana"},"audio/1d-interleaved-parityfec":{source:"iana"},"audio/32kadpcm":{source:"iana"},"audio/3gpp":{source:"iana",compressible:!1,extensions:["3gpp"]},"audio/3gpp2":{source:"iana"},"audio/aac":{source:"iana",extensions:["adts","aac"]},"audio/ac3":{source:"iana"},"audio/adpcm":{source:"apache",extensions:["adp"]},"audio/amr":{source:"iana",extensions:["amr"]},"audio/amr-wb":{source:"iana"},"audio/amr-wb+":{source:"iana"},"audio/aptx":{source:"iana"},"audio/asc":{source:"iana"},"audio/atrac-advanced-lossless":{source:"iana"},"audio/atrac-x":{source:"iana"},"audio/atrac3":{source:"iana"},"audio/basic":{source:"iana",compressible:!1,extensions:["au","snd"]},"audio/bv16":{source:"iana"},"audio/bv32":{source:"iana"},"audio/clearmode":{source:"iana"},"audio/cn":{source:"iana"},"audio/dat12":{source:"iana"},"audio/dls":{source:"iana"},"audio/dsr-es201108":{source:"iana"},"audio/dsr-es202050":{source:"iana"},"audio/dsr-es202211":{source:"iana"},"audio/dsr-es202212":{source:"iana"},"audio/dv":{source:"iana"},"audio/dvi4":{source:"iana"},"audio/eac3":{source:"iana"},"audio/encaprtp":{source:"iana"},"audio/evrc":{source:"iana"},"audio/evrc-qcp":{source:"iana"},"audio/evrc0":{source:"iana"},"audio/evrc1":{source:"iana"},"audio/evrcb":{source:"iana"},"audio/evrcb0":{source:"iana"},"audio/evrcb1":{source:"iana"},"audio/evrcnw":{source:"iana"},"audio/evrcnw0":{source:"iana"},"audio/evrcnw1":{source:"iana"},"audio/evrcwb":{source:"iana"},"audio/evrcwb0":{source:"iana"},"audio/evrcwb1":{source:"iana"},"audio/evs":{source:"iana"},"audio/flac":{source:"iana"},"audio/flexfec":{source:"iana"},"audio/fwdred":{source:"iana"},"audio/g711-0":{source:"iana"},"audio/g719":{source:"iana"},"audio/g722":{source:"iana"},"audio/g7221":{source:"iana"},"audio/g723":{source:"iana"},"audio/g726-16":{source:"iana"},"audio/g726-24":{source:"iana"},"audio/g726-32":{source:"iana"},"audio/g726-40":{source:"iana"},"audio/g728":{source:"iana"},"audio/g729":{source:"iana"},"audio/g7291":{source:"iana"},"audio/g729d":{source:"iana"},"audio/g729e":{source:"iana"},"audio/gsm":{source:"iana"},"audio/gsm-efr":{source:"iana"},"audio/gsm-hr-08":{source:"iana"},"audio/ilbc":{source:"iana"},"audio/ip-mr_v2.5":{source:"iana"},"audio/isac":{source:"apache"},"audio/l16":{source:"iana"},"audio/l20":{source:"iana"},"audio/l24":{source:"iana",compressible:!1},"audio/l8":{source:"iana"},"audio/lpc":{source:"iana"},"audio/matroska":{source:"iana"},"audio/melp":{source:"iana"},"audio/melp1200":{source:"iana"},"audio/melp2400":{source:"iana"},"audio/melp600":{source:"iana"},"audio/mhas":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/midi-clip":{source:"iana"},"audio/mobile-xmf":{source:"iana",extensions:["mxmf"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{source:"iana"},"audio/musepack":{source:"apache"},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/opus":{source:"iana"},"audio/parityfec":{source:"iana"},"audio/pcma":{source:"iana"},"audio/pcma-wb":{source:"iana"},"audio/pcmu":{source:"iana"},"audio/pcmu-wb":{source:"iana"},"audio/prs.sid":{source:"iana"},"audio/qcelp":{source:"iana"},"audio/raptorfec":{source:"iana"},"audio/red":{source:"iana"},"audio/rtp-enc-aescm128":{source:"iana"},"audio/rtp-midi":{source:"iana"},"audio/rtploopback":{source:"iana"},"audio/rtx":{source:"iana"},"audio/s3m":{source:"apache",extensions:["s3m"]},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/smv-qcp":{source:"iana"},"audio/smv0":{source:"iana"},"audio/sofa":{source:"iana"},"audio/sp-midi":{source:"iana"},"audio/speex":{source:"iana"},"audio/t140c":{source:"iana"},"audio/t38":{source:"iana"},"audio/telephone-event":{source:"iana"},"audio/tetra_acelp":{source:"iana"},"audio/tetra_acelp_bb":{source:"iana"},"audio/tone":{source:"iana"},"audio/tsvcis":{source:"iana"},"audio/uemclip":{source:"iana"},"audio/ulpfec":{source:"iana"},"audio/usac":{source:"iana"},"audio/vdvi":{source:"iana"},"audio/vmr-wb":{source:"iana"},"audio/vnd.3gpp.iufp":{source:"iana"},"audio/vnd.4sb":{source:"iana"},"audio/vnd.audiokoz":{source:"iana"},"audio/vnd.celp":{source:"iana"},"audio/vnd.cisco.nse":{source:"iana"},"audio/vnd.cmles.radio-events":{source:"iana"},"audio/vnd.cns.anp1":{source:"iana"},"audio/vnd.cns.inf1":{source:"iana"},"audio/vnd.dece.audio":{source:"iana",extensions:["uva","uvva"]},"audio/vnd.digital-winds":{source:"iana",extensions:["eol"]},"audio/vnd.dlna.adts":{source:"iana"},"audio/vnd.dolby.heaac.1":{source:"iana"},"audio/vnd.dolby.heaac.2":{source:"iana"},"audio/vnd.dolby.mlp":{source:"iana"},"audio/vnd.dolby.mps":{source:"iana"},"audio/vnd.dolby.pl2":{source:"iana"},"audio/vnd.dolby.pl2x":{source:"iana"},"audio/vnd.dolby.pl2z":{source:"iana"},"audio/vnd.dolby.pulse.1":{source:"iana"},"audio/vnd.dra":{source:"iana",extensions:["dra"]},"audio/vnd.dts":{source:"iana",extensions:["dts"]},"audio/vnd.dts.hd":{source:"iana",extensions:["dtshd"]},"audio/vnd.dts.uhd":{source:"iana"},"audio/vnd.dvb.file":{source:"iana"},"audio/vnd.everad.plj":{source:"iana"},"audio/vnd.hns.audio":{source:"iana"},"audio/vnd.lucent.voice":{source:"iana",extensions:["lvp"]},"audio/vnd.ms-playready.media.pya":{source:"iana",extensions:["pya"]},"audio/vnd.nokia.mobile-xmf":{source:"iana"},"audio/vnd.nortel.vbk":{source:"iana"},"audio/vnd.nuera.ecelp4800":{source:"iana",extensions:["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{source:"iana",extensions:["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{source:"iana",extensions:["ecelp9600"]},"audio/vnd.octel.sbc":{source:"iana"},"audio/vnd.presonus.multitrack":{source:"iana"},"audio/vnd.qcelp":{source:"apache"},"audio/vnd.rhetorex.32kadpcm":{source:"iana"},"audio/vnd.rip":{source:"iana",extensions:["rip"]},"audio/vnd.rn-realaudio":{compressible:!1},"audio/vnd.sealedmedia.softseal.mpeg":{source:"iana"},"audio/vnd.vmx.cvsd":{source:"iana"},"audio/vnd.wave":{compressible:!1},"audio/vorbis":{source:"iana",compressible:!1},"audio/vorbis-config":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"chemical/x-cdx":{source:"apache",extensions:["cdx"]},"chemical/x-cif":{source:"apache",extensions:["cif"]},"chemical/x-cmdf":{source:"apache",extensions:["cmdf"]},"chemical/x-cml":{source:"apache",extensions:["cml"]},"chemical/x-csml":{source:"apache",extensions:["csml"]},"chemical/x-pdb":{source:"apache"},"chemical/x-xyz":{source:"apache",extensions:["xyz"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/aces":{source:"iana",extensions:["exr"]},"image/apng":{source:"iana",compressible:!1,extensions:["apng"]},"image/avci":{source:"iana",extensions:["avci"]},"image/avcs":{source:"iana",extensions:["avcs"]},"image/avif":{source:"iana",compressible:!1,extensions:["avif"]},"image/bmp":{source:"iana",compressible:!0,extensions:["bmp","dib"]},"image/cgm":{source:"iana",extensions:["cgm"]},"image/dicom-rle":{source:"iana",extensions:["drle"]},"image/dpx":{source:"iana",extensions:["dpx"]},"image/emf":{source:"iana",extensions:["emf"]},"image/fits":{source:"iana",extensions:["fits"]},"image/g3fax":{source:"iana",extensions:["g3"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/heif-sequence":{source:"iana",extensions:["heifs"]},"image/hej2k":{source:"iana",extensions:["hej2"]},"image/hsj2":{source:"iana",extensions:["hsj2"]},"image/ief":{source:"iana",extensions:["ief"]},"image/j2c":{source:"iana"},"image/jls":{source:"iana",extensions:["jls"]},"image/jp2":{source:"iana",compressible:!1,extensions:["jp2","jpg2"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpeg","jpg","jpe"]},"image/jph":{source:"iana",extensions:["jph"]},"image/jphc":{source:"iana",extensions:["jhc"]},"image/jpm":{source:"iana",compressible:!1,extensions:["jpm","jpgm"]},"image/jpx":{source:"iana",compressible:!1,extensions:["jpx","jpf"]},"image/jxl":{source:"iana",extensions:["jxl"]},"image/jxr":{source:"iana",extensions:["jxr"]},"image/jxra":{source:"iana",extensions:["jxra"]},"image/jxrs":{source:"iana",extensions:["jxrs"]},"image/jxs":{source:"iana",extensions:["jxs"]},"image/jxsc":{source:"iana",extensions:["jxsc"]},"image/jxsi":{source:"iana",extensions:["jxsi"]},"image/jxss":{source:"iana",extensions:["jxss"]},"image/ktx":{source:"iana",extensions:["ktx"]},"image/ktx2":{source:"iana",extensions:["ktx2"]},"image/naplps":{source:"iana"},"image/pjpeg":{compressible:!1},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/prs.btif":{source:"iana",extensions:["btif","btf"]},"image/prs.pti":{source:"iana",extensions:["pti"]},"image/pwg-raster":{source:"iana"},"image/sgi":{source:"apache",extensions:["sgi"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/t38":{source:"iana",extensions:["t38"]},"image/tiff":{source:"iana",compressible:!1,extensions:["tif","tiff"]},"image/tiff-fx":{source:"iana",extensions:["tfx"]},"image/vnd.adobe.photoshop":{source:"iana",compressible:!0,extensions:["psd"]},"image/vnd.airzip.accelerator.azv":{source:"iana",extensions:["azv"]},"image/vnd.cns.inf2":{source:"iana"},"image/vnd.dece.graphic":{source:"iana",extensions:["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{source:"iana",extensions:["djvu","djv"]},"image/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"image/vnd.dwg":{source:"iana",extensions:["dwg"]},"image/vnd.dxf":{source:"iana",extensions:["dxf"]},"image/vnd.fastbidsheet":{source:"iana",extensions:["fbs"]},"image/vnd.fpx":{source:"iana",extensions:["fpx"]},"image/vnd.fst":{source:"iana",extensions:["fst"]},"image/vnd.fujixerox.edmics-mmr":{source:"iana",extensions:["mmr"]},"image/vnd.fujixerox.edmics-rlc":{source:"iana",extensions:["rlc"]},"image/vnd.globalgraphics.pgb":{source:"iana"},"image/vnd.microsoft.icon":{source:"iana",compressible:!0,extensions:["ico"]},"image/vnd.mix":{source:"iana"},"image/vnd.mozilla.apng":{source:"iana"},"image/vnd.ms-dds":{compressible:!0,extensions:["dds"]},"image/vnd.ms-modi":{source:"iana",extensions:["mdi"]},"image/vnd.ms-photo":{source:"apache",extensions:["wdp"]},"image/vnd.net-fpx":{source:"iana",extensions:["npx"]},"image/vnd.pco.b16":{source:"iana",extensions:["b16"]},"image/vnd.radiance":{source:"iana"},"image/vnd.sealed.png":{source:"iana"},"image/vnd.sealedmedia.softseal.gif":{source:"iana"},"image/vnd.sealedmedia.softseal.jpg":{source:"iana"},"image/vnd.svf":{source:"iana"},"image/vnd.tencent.tap":{source:"iana",extensions:["tap"]},"image/vnd.valve.source.texture":{source:"iana",extensions:["vtf"]},"image/vnd.wap.wbmp":{source:"iana",extensions:["wbmp"]},"image/vnd.xiff":{source:"iana",extensions:["xif"]},"image/vnd.zbrush.pcx":{source:"iana",extensions:["pcx"]},"image/webp":{source:"iana",extensions:["webp"]},"image/wmf":{source:"iana",extensions:["wmf"]},"image/x-3ds":{source:"apache",extensions:["3ds"]},"image/x-cmu-raster":{source:"apache",extensions:["ras"]},"image/x-cmx":{source:"apache",extensions:["cmx"]},"image/x-freehand":{source:"apache",extensions:["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{source:"apache",compressible:!0,extensions:["ico"]},"image/x-jng":{source:"nginx",extensions:["jng"]},"image/x-mrsid-image":{source:"apache",extensions:["sid"]},"image/x-ms-bmp":{source:"nginx",compressible:!0,extensions:["bmp"]},"image/x-pcx":{source:"apache",extensions:["pcx"]},"image/x-pict":{source:"apache",extensions:["pic","pct"]},"image/x-portable-anymap":{source:"apache",extensions:["pnm"]},"image/x-portable-bitmap":{source:"apache",extensions:["pbm"]},"image/x-portable-graymap":{source:"apache",extensions:["pgm"]},"image/x-portable-pixmap":{source:"apache",extensions:["ppm"]},"image/x-rgb":{source:"apache",extensions:["rgb"]},"image/x-tga":{source:"apache",extensions:["tga"]},"image/x-xbitmap":{source:"apache",extensions:["xbm"]},"image/x-xcf":{compressible:!1},"image/x-xpixmap":{source:"apache",extensions:["xpm"]},"image/x-xwindowdump":{source:"apache",extensions:["xwd"]},"message/bhttp":{source:"iana"},"message/cpim":{source:"iana"},"message/delivery-status":{source:"iana"},"message/disposition-notification":{source:"iana",extensions:["disposition-notification"]},"message/external-body":{source:"iana"},"message/feedback-report":{source:"iana"},"message/global":{source:"iana",extensions:["u8msg"]},"message/global-delivery-status":{source:"iana",extensions:["u8dsn"]},"message/global-disposition-notification":{source:"iana",extensions:["u8mdn"]},"message/global-headers":{source:"iana",extensions:["u8hdr"]},"message/http":{source:"iana",compressible:!1},"message/imdn+xml":{source:"iana",compressible:!0},"message/mls":{source:"iana"},"message/news":{source:"apache"},"message/ohttp-req":{source:"iana"},"message/ohttp-res":{source:"iana"},"message/partial":{source:"iana",compressible:!1},"message/rfc822":{source:"iana",compressible:!0,extensions:["eml","mime"]},"message/s-http":{source:"apache"},"message/sip":{source:"iana"},"message/sipfrag":{source:"iana"},"message/tracking-status":{source:"iana"},"message/vnd.si.simp":{source:"apache"},"message/vnd.wfa.wsc":{source:"iana",extensions:["wsc"]},"model/3mf":{source:"iana",extensions:["3mf"]},"model/e57":{source:"iana"},"model/gltf+json":{source:"iana",compressible:!0,extensions:["gltf"]},"model/gltf-binary":{source:"iana",compressible:!0,extensions:["glb"]},"model/iges":{source:"iana",compressible:!1,extensions:["igs","iges"]},"model/jt":{source:"iana",extensions:["jt"]},"model/mesh":{source:"iana",compressible:!1,extensions:["msh","mesh","silo"]},"model/mtl":{source:"iana",extensions:["mtl"]},"model/obj":{source:"iana",extensions:["obj"]},"model/prc":{source:"iana",extensions:["prc"]},"model/step":{source:"iana"},"model/step+xml":{source:"iana",compressible:!0,extensions:["stpx"]},"model/step+zip":{source:"iana",compressible:!1,extensions:["stpz"]},"model/step-xml+zip":{source:"iana",compressible:!1,extensions:["stpxz"]},"model/stl":{source:"iana",extensions:["stl"]},"model/u3d":{source:"iana",extensions:["u3d"]},"model/vnd.bary":{source:"iana",extensions:["bary"]},"model/vnd.cld":{source:"iana",extensions:["cld"]},"model/vnd.collada+xml":{source:"iana",compressible:!0,extensions:["dae"]},"model/vnd.dwf":{source:"iana",extensions:["dwf"]},"model/vnd.flatland.3dml":{source:"iana"},"model/vnd.gdl":{source:"iana",extensions:["gdl"]},"model/vnd.gs-gdl":{source:"apache"},"model/vnd.gs.gdl":{source:"iana"},"model/vnd.gtw":{source:"iana",extensions:["gtw"]},"model/vnd.moml+xml":{source:"iana",compressible:!0},"model/vnd.mts":{source:"iana",extensions:["mts"]},"model/vnd.opengex":{source:"iana",extensions:["ogex"]},"model/vnd.parasolid.transmit.binary":{source:"iana",extensions:["x_b"]},"model/vnd.parasolid.transmit.text":{source:"iana",extensions:["x_t"]},"model/vnd.pytha.pyox":{source:"iana",extensions:["pyo","pyox"]},"model/vnd.rosette.annotated-data-model":{source:"iana"},"model/vnd.sap.vds":{source:"iana",extensions:["vds"]},"model/vnd.usda":{source:"iana",extensions:["usda"]},"model/vnd.usdz+zip":{source:"iana",compressible:!1,extensions:["usdz"]},"model/vnd.valve.source.compiled-map":{source:"iana",extensions:["bsp"]},"model/vnd.vtu":{source:"iana",extensions:["vtu"]},"model/vrml":{source:"iana",compressible:!1,extensions:["wrl","vrml"]},"model/x3d+binary":{source:"apache",compressible:!1,extensions:["x3db","x3dbz"]},"model/x3d+fastinfoset":{source:"iana",extensions:["x3db"]},"model/x3d+vrml":{source:"apache",compressible:!1,extensions:["x3dv","x3dvz"]},"model/x3d+xml":{source:"iana",compressible:!0,extensions:["x3d","x3dz"]},"model/x3d-vrml":{source:"iana",extensions:["x3dv"]},"multipart/alternative":{source:"iana",compressible:!1},"multipart/appledouble":{source:"iana"},"multipart/byteranges":{source:"iana"},"multipart/digest":{source:"iana"},"multipart/encrypted":{source:"iana",compressible:!1},"multipart/form-data":{source:"iana",compressible:!1},"multipart/header-set":{source:"iana"},"multipart/mixed":{source:"iana"},"multipart/multilingual":{source:"iana"},"multipart/parallel":{source:"iana"},"multipart/related":{source:"iana",compressible:!1},"multipart/report":{source:"iana"},"multipart/signed":{source:"iana",compressible:!1},"multipart/vnd.bint.med-plus":{source:"iana"},"multipart/voice-message":{source:"iana"},"multipart/x-mixed-replace":{source:"iana"},"text/1d-interleaved-parityfec":{source:"iana"},"text/cache-manifest":{source:"iana",compressible:!0,extensions:["appcache","manifest"]},"text/calendar":{source:"iana",extensions:["ics","ifb"]},"text/calender":{compressible:!0},"text/cmd":{compressible:!0},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/cql":{source:"iana"},"text/cql-expression":{source:"iana"},"text/cql-identifier":{source:"iana"},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/csv":{source:"iana",compressible:!0,extensions:["csv"]},"text/csv-schema":{source:"iana"},"text/directory":{source:"iana"},"text/dns":{source:"iana"},"text/ecmascript":{source:"apache"},"text/encaprtp":{source:"iana"},"text/enriched":{source:"iana"},"text/fhirpath":{source:"iana"},"text/flexfec":{source:"iana"},"text/fwdred":{source:"iana"},"text/gff3":{source:"iana"},"text/grammar-ref-list":{source:"iana"},"text/hl7v2":{source:"iana"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/jcr-cnd":{source:"iana"},"text/jsx":{compressible:!0,extensions:["jsx"]},"text/less":{compressible:!0,extensions:["less"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]},"text/mathml":{source:"nginx",extensions:["mml"]},"text/mdx":{compressible:!0,extensions:["mdx"]},"text/mizar":{source:"iana"},"text/n3":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["n3"]},"text/parameters":{source:"iana",charset:"UTF-8"},"text/parityfec":{source:"iana"},"text/plain":{source:"iana",compressible:!0,extensions:["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{source:"iana",charset:"UTF-8"},"text/prs.fallenstein.rst":{source:"iana"},"text/prs.lines.tag":{source:"iana",extensions:["dsc"]},"text/prs.prop.logic":{source:"iana"},"text/prs.texi":{source:"iana"},"text/raptorfec":{source:"iana"},"text/red":{source:"iana"},"text/rfc822-headers":{source:"iana"},"text/richtext":{source:"iana",compressible:!0,extensions:["rtx"]},"text/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"text/rtp-enc-aescm128":{source:"iana"},"text/rtploopback":{source:"iana"},"text/rtx":{source:"iana"},"text/sgml":{source:"iana",extensions:["sgml","sgm"]},"text/shaclc":{source:"iana"},"text/shex":{source:"iana",extensions:["shex"]},"text/slim":{extensions:["slim","slm"]},"text/spdx":{source:"iana",extensions:["spdx"]},"text/strings":{source:"iana"},"text/stylus":{extensions:["stylus","styl"]},"text/t140":{source:"iana"},"text/tab-separated-values":{source:"iana",compressible:!0,extensions:["tsv"]},"text/troff":{source:"iana",extensions:["t","tr","roff","man","me","ms"]},"text/turtle":{source:"iana",charset:"UTF-8",extensions:["ttl"]},"text/ulpfec":{source:"iana"},"text/uri-list":{source:"iana",compressible:!0,extensions:["uri","uris","urls"]},"text/vcard":{source:"iana",compressible:!0,extensions:["vcard"]},"text/vnd.a":{source:"iana"},"text/vnd.abc":{source:"iana"},"text/vnd.ascii-art":{source:"iana"},"text/vnd.curl":{source:"iana",extensions:["curl"]},"text/vnd.curl.dcurl":{source:"apache",extensions:["dcurl"]},"text/vnd.curl.mcurl":{source:"apache",extensions:["mcurl"]},"text/vnd.curl.scurl":{source:"apache",extensions:["scurl"]},"text/vnd.debian.copyright":{source:"iana",charset:"UTF-8"},"text/vnd.dmclientscript":{source:"iana"},"text/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"text/vnd.esmertec.theme-descriptor":{source:"iana",charset:"UTF-8"},"text/vnd.exchangeable":{source:"iana"},"text/vnd.familysearch.gedcom":{source:"iana",extensions:["ged"]},"text/vnd.ficlab.flt":{source:"iana"},"text/vnd.fly":{source:"iana",extensions:["fly"]},"text/vnd.fmi.flexstor":{source:"iana",extensions:["flx"]},"text/vnd.gml":{source:"iana"},"text/vnd.graphviz":{source:"iana",extensions:["gv"]},"text/vnd.hans":{source:"iana"},"text/vnd.hgl":{source:"iana"},"text/vnd.in3d.3dml":{source:"iana",extensions:["3dml"]},"text/vnd.in3d.spot":{source:"iana",extensions:["spot"]},"text/vnd.iptc.newsml":{source:"iana"},"text/vnd.iptc.nitf":{source:"iana"},"text/vnd.latex-z":{source:"iana"},"text/vnd.motorola.reflex":{source:"iana"},"text/vnd.ms-mediapackage":{source:"iana"},"text/vnd.net2phone.commcenter.command":{source:"iana"},"text/vnd.radisys.msml-basic-layout":{source:"iana"},"text/vnd.senx.warpscript":{source:"iana"},"text/vnd.si.uricatalogue":{source:"apache"},"text/vnd.sosi":{source:"iana"},"text/vnd.sun.j2me.app-descriptor":{source:"iana",charset:"UTF-8",extensions:["jad"]},"text/vnd.trolltech.linguist":{source:"iana",charset:"UTF-8"},"text/vnd.vcf":{source:"iana"},"text/vnd.wap.si":{source:"iana"},"text/vnd.wap.sl":{source:"iana"},"text/vnd.wap.wml":{source:"iana",extensions:["wml"]},"text/vnd.wap.wmlscript":{source:"iana",extensions:["wmls"]},"text/vnd.zoo.kcl":{source:"iana"},"text/vtt":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["vtt"]},"text/wgsl":{source:"iana",extensions:["wgsl"]},"text/x-asm":{source:"apache",extensions:["s","asm"]},"text/x-c":{source:"apache",extensions:["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{source:"nginx",extensions:["htc"]},"text/x-fortran":{source:"apache",extensions:["f","for","f77","f90"]},"text/x-gwt-rpc":{compressible:!0},"text/x-handlebars-template":{extensions:["hbs"]},"text/x-java-source":{source:"apache",extensions:["java"]},"text/x-jquery-tmpl":{compressible:!0},"text/x-lua":{extensions:["lua"]},"text/x-markdown":{compressible:!0,extensions:["mkd"]},"text/x-nfo":{source:"apache",extensions:["nfo"]},"text/x-opml":{source:"apache",extensions:["opml"]},"text/x-org":{compressible:!0,extensions:["org"]},"text/x-pascal":{source:"apache",extensions:["p","pas"]},"text/x-processing":{compressible:!0,extensions:["pde"]},"text/x-sass":{extensions:["sass"]},"text/x-scss":{extensions:["scss"]},"text/x-setext":{source:"apache",extensions:["etx"]},"text/x-sfv":{source:"apache",extensions:["sfv"]},"text/x-suse-ymp":{compressible:!0,extensions:["ymp"]},"text/x-uuencode":{source:"apache",extensions:["uu"]},"text/x-vcalendar":{source:"apache",extensions:["vcs"]},"text/x-vcard":{source:"apache",extensions:["vcf"]},"text/xml":{source:"iana",compressible:!0,extensions:["xml"]},"text/xml-external-parsed-entity":{source:"iana"},"text/yaml":{compressible:!0,extensions:["yaml","yml"]},"video/1d-interleaved-parityfec":{source:"iana"},"video/3gpp":{source:"iana",extensions:["3gp","3gpp"]},"video/3gpp-tt":{source:"iana"},"video/3gpp2":{source:"iana",extensions:["3g2"]},"video/av1":{source:"iana"},"video/bmpeg":{source:"iana"},"video/bt656":{source:"iana"},"video/celb":{source:"iana"},"video/dv":{source:"iana"},"video/encaprtp":{source:"iana"},"video/evc":{source:"iana"},"video/ffv1":{source:"iana"},"video/flexfec":{source:"iana"},"video/h261":{source:"iana",extensions:["h261"]},"video/h263":{source:"iana",extensions:["h263"]},"video/h263-1998":{source:"iana"},"video/h263-2000":{source:"iana"},"video/h264":{source:"iana",extensions:["h264"]},"video/h264-rcdo":{source:"iana"},"video/h264-svc":{source:"iana"},"video/h265":{source:"iana"},"video/h266":{source:"iana"},"video/iso.segment":{source:"iana",extensions:["m4s"]},"video/jpeg":{source:"iana",extensions:["jpgv"]},"video/jpeg2000":{source:"iana"},"video/jpm":{source:"apache",extensions:["jpm","jpgm"]},"video/jxsv":{source:"iana"},"video/matroska":{source:"iana"},"video/matroska-3d":{source:"iana"},"video/mj2":{source:"iana",extensions:["mj2","mjp2"]},"video/mp1s":{source:"iana"},"video/mp2p":{source:"iana"},"video/mp2t":{source:"iana",extensions:["ts","m2t","m2ts","mts"]},"video/mp4":{source:"iana",compressible:!1,extensions:["mp4","mp4v","mpg4"]},"video/mp4v-es":{source:"iana"},"video/mpeg":{source:"iana",compressible:!1,extensions:["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{source:"iana"},"video/mpv":{source:"iana"},"video/nv":{source:"iana"},"video/ogg":{source:"iana",compressible:!1,extensions:["ogv"]},"video/parityfec":{source:"iana"},"video/pointer":{source:"iana"},"video/quicktime":{source:"iana",compressible:!1,extensions:["qt","mov"]},"video/raptorfec":{source:"iana"},"video/raw":{source:"iana"},"video/rtp-enc-aescm128":{source:"iana"},"video/rtploopback":{source:"iana"},"video/rtx":{source:"iana"},"video/scip":{source:"iana"},"video/smpte291":{source:"iana"},"video/smpte292m":{source:"iana"},"video/ulpfec":{source:"iana"},"video/vc1":{source:"iana"},"video/vc2":{source:"iana"},"video/vnd.cctv":{source:"iana"},"video/vnd.dece.hd":{source:"iana",extensions:["uvh","uvvh"]},"video/vnd.dece.mobile":{source:"iana",extensions:["uvm","uvvm"]},"video/vnd.dece.mp4":{source:"iana"},"video/vnd.dece.pd":{source:"iana",extensions:["uvp","uvvp"]},"video/vnd.dece.sd":{source:"iana",extensions:["uvs","uvvs"]},"video/vnd.dece.video":{source:"iana",extensions:["uvv","uvvv"]},"video/vnd.directv.mpeg":{source:"iana"},"video/vnd.directv.mpeg-tts":{source:"iana"},"video/vnd.dlna.mpeg-tts":{source:"iana"},"video/vnd.dvb.file":{source:"iana",extensions:["dvb"]},"video/vnd.fvt":{source:"iana",extensions:["fvt"]},"video/vnd.hns.video":{source:"iana"},"video/vnd.iptvforum.1dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.1dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.2dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.2dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.ttsavc":{source:"iana"},"video/vnd.iptvforum.ttsmpeg2":{source:"iana"},"video/vnd.motorola.video":{source:"iana"},"video/vnd.motorola.videop":{source:"iana"},"video/vnd.mpegurl":{source:"iana",extensions:["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{source:"iana",extensions:["pyv"]},"video/vnd.nokia.interleaved-multimedia":{source:"iana"},"video/vnd.nokia.mp4vr":{source:"iana"},"video/vnd.nokia.videovoip":{source:"iana"},"video/vnd.objectvideo":{source:"iana"},"video/vnd.radgamettools.bink":{source:"iana"},"video/vnd.radgamettools.smacker":{source:"apache"},"video/vnd.sealed.mpeg1":{source:"iana"},"video/vnd.sealed.mpeg4":{source:"iana"},"video/vnd.sealed.swf":{source:"iana"},"video/vnd.sealedmedia.softseal.mov":{source:"iana"},"video/vnd.uvvu.mp4":{source:"iana",extensions:["uvu","uvvu"]},"video/vnd.vivo":{source:"iana",extensions:["viv"]},"video/vnd.youtube.yt":{source:"iana"},"video/vp8":{source:"iana"},"video/vp9":{source:"iana"},"video/webm":{source:"apache",compressible:!1,extensions:["webm"]},"video/x-f4v":{source:"apache",extensions:["f4v"]},"video/x-fli":{source:"apache",extensions:["fli"]},"video/x-flv":{source:"apache",compressible:!1,extensions:["flv"]},"video/x-m4v":{source:"apache",extensions:["m4v"]},"video/x-matroska":{source:"apache",compressible:!1,extensions:["mkv","mk3d","mks"]},"video/x-mng":{source:"apache",extensions:["mng"]},"video/x-ms-asf":{source:"apache",extensions:["asf","asx"]},"video/x-ms-vob":{source:"apache",extensions:["vob"]},"video/x-ms-wm":{source:"apache",extensions:["wm"]},"video/x-ms-wmv":{source:"apache",compressible:!1,extensions:["wmv"]},"video/x-ms-wmx":{source:"apache",extensions:["wmx"]},"video/x-ms-wvx":{source:"apache",extensions:["wvx"]},"video/x-msvideo":{source:"apache",extensions:["avi"]},"video/x-sgi-movie":{source:"apache",extensions:["movie"]},"video/x-smv":{source:"apache",extensions:["smv"]},"x-conference/x-cooltalk":{source:"apache",extensions:["ice"]},"x-shader/x-fragment":{compressible:!0},"x-shader/x-vertex":{compressible:!0}}});var z5=oe((tAe,V5)=>{V5.exports=L5()});var H5=oe((nAe,q5)=>{"use strict";var U5=z5();q5.exports=function(){var t={};return Object.keys(U5).forEach(function(e){var n=U5[e];n.extensions&&n.extensions.length>0&&n.extensions.forEach(function(i){t[i]=e})}),t}});var W5=oe((iAe,G5)=>{"use strict";var J5=i0();G5.exports=function(t,e){if(!J5(t))throw new TypeError("Expected a plain object");e=e||{},typeof e=="function"&&(e={compare:e});var n=e.deep,i=[],a=[],r=s(function(o){var l=i.indexOf(o);if(l!==-1)return a[l];var c={},d=Object.keys(o).sort(e.compare);i.push(o),a.push(c);for(var u=0;u{"use strict";var K5=W5();q0.exports.desc=function(t){return K5(t,function(e,n){return n.length-e.length})};q0.exports.asc=function(t){return K5(t,function(e,n){return e.length-n.length})}});var Q5=oe((oAe,H0)=>{"use strict";var X5=H5(),Z5=Y5();H0.exports=t=>{let e=Z5.desc(X5()),n=Object.keys(e).filter(i=>t.endsWith(i));return n.length===0?[]:n.map(i=>({ext:i,mime:e[i]}))};H0.exports.mime=t=>{let e=Z5.desc(X5()),n=Object.keys(e).filter(i=>e[i]===t);return n.length===0?[]:n.map(i=>({ext:i,mime:e[i]}))}});var nj=oe((sAe,tj)=>{"use strict";var Wfe=Ee("fs"),Gu=Ee("path"),{URL:Kfe}=Ee("url"),Yfe=h1(),$5=v1(),ej=K2(),Xfe=nE(),Zfe=lE(),Qfe=t5(),$fe=C5(),ehe=I5(),the=R5(),nhe=P5(),ihe=Q5(),ahe=ehe(Wfe),rhe=s(t=>Gu.basename(new Kfe(t.requestUrl).pathname),"filenameFromPath"),ohe=s(t=>{let e=t.headers["content-type"];if(!e)return null;let n=ihe.mime(e);return n.length!==1?null:n[0].ext},"getExtFromMime"),she=s((t,e)=>{let n=t.headers["content-disposition"];if(n){let a=Yfe.parse(n);if(a.parameters&&a.parameters.filename)return a.parameters.filename}let i=rhe(t);if(!Gu.extname(i)){let a=(nhe(e)||{}).ext||ohe(t);a&&(i=`${i}.${a}`)}return i},"getFilename");tj.exports=(t,e,n)=>{typeof e=="object"&&(n=e,e=null),n=Object.assign({encoding:null,rejectUnauthorized:!0},n);let i=Qfe.stream(t,n),a=the(i,"response").then(r=>{let o=n.encoding===null?"buffer":n.encoding;return Promise.all([Zfe(i,{encoding:o}),r])}).then(r=>{let[o,l]=r;if(!e)return n.extract&&$5(o)?ej(o,n):o;let c=n.filename||Xfe(she(l,o)),d=Gu.join(e,c);return n.extract&&$5(o)?ej(o,Gu.dirname(d),n):$fe(Gu.dirname(d)).then(()=>ahe.writeFile(d,o)).then(()=>o)});return i.then=a.then.bind(a),i.catch=a.catch.bind(a),i}});var H4=oe((vPe,q4)=>{"use strict";q4.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var vv=oe((bPe,G4)=>{var Ld=H4(),J4={};for(let t of Object.keys(Ld))J4[Ld[t]]=t;var Ye={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};G4.exports=Ye;for(let t of Object.keys(Ye)){if(!("channels"in Ye[t]))throw new Error("missing channels property: "+t);if(!("labels"in Ye[t]))throw new Error("missing channel labels property: "+t);if(Ye[t].labels.length!==Ye[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:n}=Ye[t];delete Ye[t].channels,delete Ye[t].labels,Object.defineProperty(Ye[t],"channels",{value:e}),Object.defineProperty(Ye[t],"labels",{value:n})}Ye.rgb.hsl=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255,a=Math.min(e,n,i),r=Math.max(e,n,i),o=r-a,l,c;r===a?l=0:e===r?l=(n-i)/o:n===r?l=2+(i-e)/o:i===r&&(l=4+(e-n)/o),l=Math.min(l*60,360),l<0&&(l+=360);let d=(a+r)/2;return r===a?c=0:d<=.5?c=o/(r+a):c=o/(2-r-a),[l,c*100,d*100]};Ye.rgb.hsv=function(t){let e,n,i,a,r,o=t[0]/255,l=t[1]/255,c=t[2]/255,d=Math.max(o,l,c),u=d-Math.min(o,l,c),p=s(function(m){return(d-m)/6/u+1/2},"diffc");return u===0?(a=0,r=0):(r=u/d,e=p(o),n=p(l),i=p(c),o===d?a=i-n:l===d?a=1/3+e-i:c===d&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[a*360,r*100,d*100]};Ye.rgb.hwb=function(t){let e=t[0],n=t[1],i=t[2],a=Ye.rgb.hsl(t)[0],r=1/255*Math.min(e,Math.min(n,i));return i=1-1/255*Math.max(e,Math.max(n,i)),[a,r*100,i*100]};Ye.rgb.cmyk=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255,a=Math.min(1-e,1-n,1-i),r=(1-e-a)/(1-a)||0,o=(1-n-a)/(1-a)||0,l=(1-i-a)/(1-a)||0;return[r*100,o*100,l*100,a*100]};function gbe(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}s(gbe,"comparativeDistance");Ye.rgb.keyword=function(t){let e=J4[t];if(e)return e;let n=1/0,i;for(let a of Object.keys(Ld)){let r=Ld[a],o=gbe(t,r);o.04045?((e+.055)/1.055)**2.4:e/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let a=e*.4124+n*.3576+i*.1805,r=e*.2126+n*.7152+i*.0722,o=e*.0193+n*.1192+i*.9505;return[a*100,r*100,o*100]};Ye.rgb.lab=function(t){let e=Ye.rgb.xyz(t),n=e[0],i=e[1],a=e[2];n/=95.047,i/=100,a/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let r=116*i-16,o=500*(n-i),l=200*(i-a);return[r,o,l]};Ye.hsl.rgb=function(t){let e=t[0]/360,n=t[1]/100,i=t[2]/100,a,r,o;if(n===0)return o=i*255,[o,o,o];i<.5?a=i*(1+n):a=i+n-i*n;let l=2*i-a,c=[0,0,0];for(let d=0;d<3;d++)r=e+1/3*-(d-1),r<0&&r++,r>1&&r--,6*r<1?o=l+(a-l)*6*r:2*r<1?o=a:3*r<2?o=l+(a-l)*(2/3-r)*6:o=l,c[d]=o*255;return c};Ye.hsl.hsv=function(t){let e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);i*=2,n*=i<=1?i:2-i,a*=r<=1?r:2-r;let o=(i+n)/2,l=i===0?2*a/(r+a):2*n/(i+n);return[e,l*100,o*100]};Ye.hsv.rgb=function(t){let e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),l=255*i*(1-n*r),c=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,c,o];case 1:return[l,i,o];case 2:return[o,i,c];case 3:return[o,l,i];case 4:return[c,o,i];case 5:return[i,o,l]}};Ye.hsv.hsl=function(t){let e=t[0],n=t[1]/100,i=t[2]/100,a=Math.max(i,.01),r,o;o=(2-n)*i;let l=(2-n)*a;return r=n*a,r/=l<=1?l:2-l,r=r||0,o/=2,[e,r*100,o*100]};Ye.hwb.rgb=function(t){let e=t[0]/360,n=t[1]/100,i=t[2]/100,a=n+i,r;a>1&&(n/=a,i/=a);let o=Math.floor(6*e),l=1-i;r=6*e-o,o&1&&(r=1-r);let c=n+r*(l-n),d,u,p;switch(o){default:case 6:case 0:d=l,u=c,p=n;break;case 1:d=c,u=l,p=n;break;case 2:d=n,u=l,p=c;break;case 3:d=n,u=c,p=l;break;case 4:d=c,u=n,p=l;break;case 5:d=l,u=n,p=c;break}return[d*255,u*255,p*255]};Ye.cmyk.rgb=function(t){let e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100,r=1-Math.min(1,e*(1-a)+a),o=1-Math.min(1,n*(1-a)+a),l=1-Math.min(1,i*(1-a)+a);return[r*255,o*255,l*255]};Ye.xyz.rgb=function(t){let e=t[0]/100,n=t[1]/100,i=t[2]/100,a,r,o;return a=e*3.2406+n*-1.5372+i*-.4986,r=e*-.9689+n*1.8758+i*.0415,o=e*.0557+n*-.204+i*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,r=r>.0031308?1.055*r**(1/2.4)-.055:r*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,a=Math.min(Math.max(0,a),1),r=Math.min(Math.max(0,r),1),o=Math.min(Math.max(0,o),1),[a*255,r*255,o*255]};Ye.xyz.lab=function(t){let e=t[0],n=t[1],i=t[2];e/=95.047,n/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let a=116*n-16,r=500*(e-n),o=200*(n-i);return[a,r,o]};Ye.lab.xyz=function(t){let e=t[0],n=t[1],i=t[2],a,r,o;r=(e+16)/116,a=n/500+r,o=r-i/200;let l=r**3,c=a**3,d=o**3;return r=l>.008856?l:(r-16/116)/7.787,a=c>.008856?c:(a-16/116)/7.787,o=d>.008856?d:(o-16/116)/7.787,a*=95.047,r*=100,o*=108.883,[a,r,o]};Ye.lab.lch=function(t){let e=t[0],n=t[1],i=t[2],a;a=Math.atan2(i,n)*360/2/Math.PI,a<0&&(a+=360);let o=Math.sqrt(n*n+i*i);return[e,o,a]};Ye.lch.lab=function(t){let e=t[0],n=t[1],a=t[2]/360*2*Math.PI,r=n*Math.cos(a),o=n*Math.sin(a);return[e,r,o]};Ye.rgb.ansi16=function(t,e=null){let[n,i,a]=t,r=e===null?Ye.rgb.hsv(t)[2]:e;if(r=Math.round(r/50),r===0)return 30;let o=30+(Math.round(a/255)<<2|Math.round(i/255)<<1|Math.round(n/255));return r===2&&(o+=60),o};Ye.hsv.ansi16=function(t){return Ye.rgb.ansi16(Ye.hsv.rgb(t),t[2])};Ye.rgb.ansi256=function(t){let e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)};Ye.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let n=(~~(t>50)+1)*.5,i=(e&1)*n*255,a=(e>>1&1)*n*255,r=(e>>2&1)*n*255;return[i,a,r]};Ye.ansi256.rgb=function(t){if(t>=232){let r=(t-232)*10+8;return[r,r,r]}t-=16;let e,n=Math.floor(t/36)/5*255,i=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[n,i,a]};Ye.rgb.hex=function(t){let n=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(n.length)+n};Ye.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let n=e[0];e[0].length===3&&(n=n.split("").map(l=>l+l).join(""));let i=parseInt(n,16),a=i>>16&255,r=i>>8&255,o=i&255;return[a,r,o]};Ye.rgb.hcg=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255,a=Math.max(Math.max(e,n),i),r=Math.min(Math.min(e,n),i),o=a-r,l,c;return o<1?l=r/(1-o):l=0,o<=0?c=0:a===e?c=(n-i)/o%6:a===n?c=2+(i-e)/o:c=4+(e-n)/o,c/=6,c%=1,[c*360,o*100,l*100]};Ye.hsl.hcg=function(t){let e=t[1]/100,n=t[2]/100,i=n<.5?2*e*n:2*e*(1-n),a=0;return i<1&&(a=(n-.5*i)/(1-i)),[t[0],i*100,a*100]};Ye.hsv.hcg=function(t){let e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],i*100,a*100]};Ye.hcg.rgb=function(t){let e=t[0]/360,n=t[1]/100,i=t[2]/100;if(n===0)return[i*255,i*255,i*255];let a=[0,0,0],r=e%1*6,o=r%1,l=1-o,c=0;switch(Math.floor(r)){case 0:a[0]=1,a[1]=o,a[2]=0;break;case 1:a[0]=l,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=o;break;case 3:a[0]=0,a[1]=l,a[2]=1;break;case 4:a[0]=o,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=l}return c=(1-n)*i,[(n*a[0]+c)*255,(n*a[1]+c)*255,(n*a[2]+c)*255]};Ye.hcg.hsv=function(t){let e=t[1]/100,n=t[2]/100,i=e+n*(1-e),a=0;return i>0&&(a=e/i),[t[0],a*100,i*100]};Ye.hcg.hsl=function(t){let e=t[1]/100,i=t[2]/100*(1-e)+.5*e,a=0;return i>0&&i<.5?a=e/(2*i):i>=.5&&i<1&&(a=e/(2*(1-i))),[t[0],a*100,i*100]};Ye.hcg.hwb=function(t){let e=t[1]/100,n=t[2]/100,i=e+n*(1-e);return[t[0],(i-e)*100,(1-i)*100]};Ye.hwb.hcg=function(t){let e=t[1]/100,i=1-t[2]/100,a=i-e,r=0;return a<1&&(r=(i-a)/(1-a)),[t[0],a*100,r*100]};Ye.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Ye.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Ye.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Ye.gray.hsl=function(t){return[0,0,t[0]]};Ye.gray.hsv=Ye.gray.hsl;Ye.gray.hwb=function(t){return[0,100,t[0]]};Ye.gray.cmyk=function(t){return[0,0,0,t[0]]};Ye.gray.lab=function(t){return[t[0],0,0]};Ye.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};Ye.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var K4=oe((wPe,W4)=>{var Xf=vv();function _be(){let t={},e=Object.keys(Xf);for(let n=e.length,i=0;i{var bv=vv(),ybe=K4(),Nc={},wbe=Object.keys(bv);function Ebe(t){let e=s(function(...n){let i=n[0];return i==null?i:(i.length>1&&(n=i),t(n))},"wrappedFn");return"conversion"in t&&(e.conversion=t.conversion),e}s(Ebe,"wrapRaw");function kbe(t){let e=s(function(...n){let i=n[0];if(i==null)return i;i.length>1&&(n=i);let a=t(n);if(typeof a=="object")for(let r=a.length,o=0;o{Nc[t]={},Object.defineProperty(Nc[t],"channels",{value:bv[t].channels}),Object.defineProperty(Nc[t],"labels",{value:bv[t].labels});let e=ybe(t);Object.keys(e).forEach(i=>{let a=e[i];Nc[t][i]=kbe(a),Nc[t][i].raw=Ebe(a)})});Y4.exports=Nc});var nC=oe((APe,tC)=>{"use strict";var Z4=s((t,e)=>(...n)=>`\x1B[${t(...n)+e}m`,"wrapAnsi16"),Q4=s((t,e)=>(...n)=>{let i=t(...n);return`\x1B[${38+e};5;${i}m`},"wrapAnsi256"),$4=s((t,e)=>(...n)=>{let i=t(...n);return`\x1B[${38+e};2;${i[0]};${i[1]};${i[2]}m`},"wrapAnsi16m"),Zf=s(t=>t,"ansi2ansi"),eC=s((t,e,n)=>[t,e,n],"rgb2rgb"),Rc=s((t,e,n)=>{Object.defineProperty(t,e,{get:()=>{let i=n();return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},"setLazyProperty"),yv,Mc=s((t,e,n,i)=>{yv===void 0&&(yv=X4());let a=i?10:0,r={};for(let[o,l]of Object.entries(yv)){let c=o==="ansi16"?"ansi":o;o===e?r[c]=t(n,a):typeof l=="object"&&(r[c]=t(l[e],a))}return r},"makeDynamicStyles");function jbe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[n,i]of Object.entries(e)){for(let[a,r]of Object.entries(i))e[a]={open:`\x1B[${r[0]}m`,close:`\x1B[${r[1]}m`},i[a]=e[a],t.set(r[0],r[1]);Object.defineProperty(e,n,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",Rc(e.color,"ansi",()=>Mc(Z4,"ansi16",Zf,!1)),Rc(e.color,"ansi256",()=>Mc(Q4,"ansi256",Zf,!1)),Rc(e.color,"ansi16m",()=>Mc($4,"rgb",eC,!1)),Rc(e.bgColor,"ansi",()=>Mc(Z4,"ansi16",Zf,!0)),Rc(e.bgColor,"ansi256",()=>Mc(Q4,"ansi256",Zf,!0)),Rc(e.bgColor,"ansi16m",()=>Mc($4,"rgb",eC,!0)),e}s(jbe,"assembleStyles");Object.defineProperty(tC,"exports",{enumerable:!0,get:jbe})});var aC=oe((CPe,iC)=>{"use strict";iC.exports=(t,e=process.argv)=>{let n=t.startsWith("-")?"":t.length===1?"-":"--",i=e.indexOf(n+t),a=e.indexOf("--");return i!==-1&&(a===-1||i{"use strict";var Abe=Ee("os"),rC=Ee("tty"),Ta=aC(),{env:Qn}=process,os;Ta("no-color")||Ta("no-colors")||Ta("color=false")||Ta("color=never")?os=0:(Ta("color")||Ta("colors")||Ta("color=true")||Ta("color=always"))&&(os=1);"FORCE_COLOR"in Qn&&(Qn.FORCE_COLOR==="true"?os=1:Qn.FORCE_COLOR==="false"?os=0:os=Qn.FORCE_COLOR.length===0?1:Math.min(parseInt(Qn.FORCE_COLOR,10),3));function wv(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}s(wv,"translateLevel");function Ev(t,e){if(os===0)return 0;if(Ta("color=16m")||Ta("color=full")||Ta("color=truecolor"))return 3;if(Ta("color=256"))return 2;if(t&&!e&&os===void 0)return 0;let n=os||0;if(Qn.TERM==="dumb")return n;if(process.platform==="win32"){let i=Abe.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in Qn)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(i=>i in Qn)||Qn.CI_NAME==="codeship"?1:n;if("TEAMCITY_VERSION"in Qn)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Qn.TEAMCITY_VERSION)?1:0;if(Qn.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Qn){let i=parseInt((Qn.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Qn.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Qn.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Qn.TERM)||"COLORTERM"in Qn?1:n}s(Ev,"supportsColor");function Tbe(t){let e=Ev(t,t&&t.isTTY);return wv(e)}s(Tbe,"getSupportLevel");oC.exports={supportsColor:Tbe,stdout:wv(Ev(!0,rC.isatty(1))),stderr:wv(Ev(!0,rC.isatty(2)))}});var cC=oe((IPe,lC)=>{"use strict";var Cbe=s((t,e,n)=>{let i=t.indexOf(e);if(i===-1)return t;let a=e.length,r=0,o="";do o+=t.substr(r,i-r)+e+n,r=i+a,i=t.indexOf(e,r);while(i!==-1);return o+=t.substr(r),o},"stringReplaceAll"),Sbe=s((t,e,n,i)=>{let a=0,r="";do{let o=t[i-1]==="\r";r+=t.substr(a,(o?i-1:i)-a)+e+(o?`\r `:` `)+n,a=i+1,i=t.indexOf(` `,a)}while(i!==-1);return r+=t.substr(a),r},"stringEncaseCRLFWithFirstIndex");lC.exports={stringReplaceAll:Cbe,stringEncaseCRLFWithFirstIndex:Sbe}});var fC=oe((FPe,mC)=>{"use strict";var Obe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,uC=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,Ibe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,Dbe=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,Fbe=new Map([["n",` `],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function pC(t){let e=t[0]==="u",n=t[1]==="{";return e&&!n&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&n?String.fromCodePoint(parseInt(t.slice(2,-1),16)):Fbe.get(t)||t}s(pC,"unescape");function Nbe(t,e){let n=[],i=e.trim().split(/\s*,\s*/g),a;for(let r of i){let o=Number(r);if(!Number.isNaN(o))n.push(o);else if(a=r.match(Ibe))n.push(a[2].replace(Dbe,(l,c,d)=>c?pC(c):d));else throw new Error(`Invalid Chalk template style argument: ${r} (in style '${t}')`)}return n}s(Nbe,"parseArguments");function Rbe(t){uC.lastIndex=0;let e=[],n;for(;(n=uC.exec(t))!==null;){let i=n[1];if(n[2]){let a=Nbe(i,n[2]);e.push([i].concat(a))}else e.push([i])}return e}s(Rbe,"parseStyle");function dC(t,e){let n={};for(let a of e)for(let r of a.styles)n[r[0]]=a.inverse?null:r.slice(1);let i=t;for(let[a,r]of Object.entries(n))if(Array.isArray(r)){if(!(a in i))throw new Error(`Unknown Chalk style: ${a}`);i=r.length>0?i[a](...r):i[a]}return i}s(dC,"buildStyle");mC.exports=(t,e)=>{let n=[],i=[],a=[];if(e.replace(Obe,(r,o,l,c,d,u)=>{if(o)a.push(pC(o));else if(c){let p=a.join("");a=[],i.push(n.length===0?p:dC(t,n)(p)),n.push({inverse:l,styles:Rbe(c)})}else if(d){if(n.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(dC(t,n)(a.join(""))),a=[],n.pop()}else a.push(u)}),i.push(a.join("")),n.length>0){let r=`Chalk template literal is missing ${n.length} closing bracket${n.length===1?"":"s"} (\`}\`)`;throw new Error(r)}return i.join("")}});var yC=oe((RPe,bC)=>{"use strict";var Vd=nC(),{stdout:jv,stderr:Av}=sC(),{stringReplaceAll:Mbe,stringEncaseCRLFWithFirstIndex:Bbe}=cC(),{isArray:$f}=Array,gC=["ansi","ansi","ansi256","ansi16m"],Bc=Object.create(null),Pbe=s((t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let n=jv?jv.level:0;t.level=e.level===void 0?n:e.level},"applyOptions"),Qf=class{constructor(e){return _C(e)}};s(Qf,"ChalkClass");var _C=s(t=>{let e={};return Pbe(e,t),e.template=(...n)=>vC(e.template,...n),Object.setPrototypeOf(e,eh.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=Qf,e.template},"chalkFactory");function eh(t){return _C(t)}s(eh,"Chalk");for(let[t,e]of Object.entries(Vd))Bc[t]={get(){let n=th(this,Tv(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:n}),n}};Bc.visible={get(){let t=th(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var xC=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of xC)Bc[t]={get(){let{level:e}=this;return function(...n){let i=Tv(Vd.color[gC[e]][t](...n),Vd.color.close,this._styler);return th(this,i,this._isEmpty)}}};for(let t of xC){let e="bg"+t[0].toUpperCase()+t.slice(1);Bc[e]={get(){let{level:n}=this;return function(...i){let a=Tv(Vd.bgColor[gC[n]][t](...i),Vd.bgColor.close,this._styler);return th(this,a,this._isEmpty)}}}}var Lbe=Object.defineProperties(()=>{},{...Bc,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),Tv=s((t,e,n)=>{let i,a;return n===void 0?(i=t,a=e):(i=n.openAll+t,a=e+n.closeAll),{open:t,close:e,openAll:i,closeAll:a,parent:n}},"createStyler"),th=s((t,e,n)=>{let i=s((...a)=>$f(a[0])&&$f(a[0].raw)?hC(i,vC(i,...a)):hC(i,a.length===1?""+a[0]:a.join(" ")),"builder");return Object.setPrototypeOf(i,Lbe),i._generator=t,i._styler=e,i._isEmpty=n,i},"createBuilder"),hC=s((t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let n=t._styler;if(n===void 0)return e;let{openAll:i,closeAll:a}=n;if(e.indexOf("\x1B")!==-1)for(;n!==void 0;)e=Mbe(e,n.close,n.open),n=n.parent;let r=e.indexOf(` `);return r!==-1&&(e=Bbe(e,a,i,r)),i+e+a},"applyStyle"),kv,vC=s((t,...e)=>{let[n]=e;if(!$f(n)||!$f(n.raw))return e.join(" ");let i=e.slice(1),a=[n.raw[0]];for(let r=1;r{if(i){let a=s(r=>{n(r),t.delete(a)},"wrappedCallback");t.add(a)}else t.add(n);return()=>t.delete(n)},publish:n=>{e||(e=!0,t.forEach(i=>i(n)),e=!1)}}}s(kt,"subscribable");var Qr={PLUGIN_LOAD:kt(),PLUGIN_FINISHED_LOADING:kt(),PLUGIN_UNLOAD:kt(),PLUGIN_FINISHED_UNLOADING:kt(),PLUGIN_INSTALL:kt(),PLUGIN_UNINSTALL:kt(),EXTERNAL_PLUGIN_LOAD:kt(),EXTERNAL_PLUGIN_UNLOAD:kt(),INJECT_MODS:kt(),EXTRACT_MODS:kt(),NETWORK_CONNECTED:kt(),MINECRAFT_ASSETS_LOADED:kt(),MINECRAFT_REGISTRY_LOADED:kt(),MINECRAFT_FONTS_LOADED:kt(),BLOCKSTATE_REGISTRY_LOADED:kt(),PRE_SELECT_PROJECT:kt(),POST_SELECT_PROJECT:kt(),SELECT_PROJECT:kt(),UNSELECT_PROJECT:kt(),CLOSE_PROJECT:kt(),SELECT_AJ_PROJECT:kt(),UNSELECT_AJ_PROJECT:kt(),CREATE_VARIANT:kt(),UPDATE_VARIANT:kt(),DELETE_VARIANT:kt(),SELECT_VARIANT:kt(),UPDATE_KEYFRAME_SELECTION:kt(),UPDATE_SELECTION:kt(),UPDATE_VIEW:kt(),UNDO:kt(),REDO:kt()},K=Qr;Blockbench.on("select_project",({project:t})=>{Qr.SELECT_PROJECT.publish(t)});Blockbench.on("unselect_project",({project:t})=>{Qr.UNSELECT_PROJECT.publish(t)});Blockbench.on("close_project",()=>Qr.CLOSE_PROJECT.publish(Project));Blockbench.on("update_keyframe_selection",Qr.UPDATE_KEYFRAME_SELECTION.publish);Blockbench.on("update_selection",Qr.UPDATE_SELECTION.publish);Blockbench.on("update_view",Qr.UPDATE_VIEW.publish);Blockbench.on("undo",Qr.UNDO.publish);Blockbench.on("redo",Qr.REDO.publish);var Eg={};vn(Eg,{"animated_java.action.create_text_display.title":()=>FI,"animated_java.action.create_vanilla_block_display.title":()=>RI,"animated_java.action.create_vanilla_item_display.title":()=>NI,"animated_java.action.export.name":()=>DI,"animated_java.action.open_about.name":()=>CI,"animated_java.action.open_blueprint_settings.name":()=>AI,"animated_java.action.open_bone_config.name":()=>SI,"animated_java.action.open_documentation.name":()=>TI,"animated_java.action.open_locator_config.name":()=>OI,"animated_java.action.open_text_display_config.name":()=>II,"animated_java.action.open_vanilla_block_display_config.name":()=>BI,"animated_java.action.open_vanilla_item_display_config.name":()=>MI,"animated_java.action.upgrade_old_aj_model_loader.body":()=>ON,"animated_java.action.upgrade_old_aj_model_loader.button":()=>IN,"animated_java.action.upgrade_old_aj_model_loader.name":()=>TN,"animated_java.action.upgrade_old_aj_model_loader.select_file":()=>SN,"animated_java.action.variants.create":()=>oR,"animated_java.action.variants.delete":()=>cR,"animated_java.action.variants.duplicate":()=>sR,"animated_java.action.variants.open_config":()=>lR,"animated_java.animation.excluded_nodes":()=>uR,"animated_java.animation.invert_excluded_nodes":()=>dR,"animated_java.block_model_manager.facing_warning":()=>jM,"animated_java.block_model_manager.fluid_warning":()=>EM,"animated_java.block_model_manager.mob_head_warning":()=>kM,"animated_java.dialog.about.close_button":()=>UI,"animated_java.dialog.about.title":()=>zI,"animated_java.dialog.animation_properties.animation_name.description":()=>NN,"animated_java.dialog.animation_properties.animation_name.error.empty":()=>VN,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":()=>zN,"animated_java.dialog.animation_properties.animation_name.title":()=>FN,"animated_java.dialog.animation_properties.bone_lists.description":()=>HN,"animated_java.dialog.animation_properties.excluded_nodes.description":()=>GN,"animated_java.dialog.animation_properties.excluded_nodes.title":()=>JN,"animated_java.dialog.animation_properties.included_nodes.description":()=>KN,"animated_java.dialog.animation_properties.included_nodes.title":()=>WN,"animated_java.dialog.animation_properties.loop_delay.description":()=>qN,"animated_java.dialog.animation_properties.loop_delay.title":()=>UN,"animated_java.dialog.animation_properties.loop_mode.description":()=>MN,"animated_java.dialog.animation_properties.loop_mode.options.hold":()=>PN,"animated_java.dialog.animation_properties.loop_mode.options.loop":()=>LN,"animated_java.dialog.animation_properties.loop_mode.options.once":()=>BN,"animated_java.dialog.animation_properties.loop_mode.title":()=>RN,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":()=>YN,"animated_java.dialog.animation_properties.title":()=>DN,"animated_java.dialog.blueprint_loading.title":()=>ZN,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist":()=>QD,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected":()=>ZD,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file":()=>$D,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description":()=>t8,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist":()=>i8,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected":()=>n8,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder":()=>a8,"animated_java.dialog.blueprint_settings.advanced_settings_warning":()=>YI,"animated_java.dialog.blueprint_settings.auto_bounding_box.description":()=>kD,"animated_java.dialog.blueprint_settings.auto_bounding_box.title":()=>ED,"animated_java.dialog.blueprint_settings.baked_animations.description":()=>O8,"animated_java.dialog.blueprint_settings.baked_animations.title":()=>S8,"animated_java.dialog.blueprint_settings.blueprint_name.description":()=>ZI,"animated_java.dialog.blueprint_settings.blueprint_name.title":()=>XI,"animated_java.dialog.blueprint_settings.bounding_box.description":()=>AD,"animated_java.dialog.blueprint_settings.bounding_box.title":()=>jD,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":()=>BD,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":()=>MD,"animated_java.dialog.blueprint_settings.data_pack.description":()=>d8,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":()=>m8,"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder":()=>g8,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":()=>h8,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":()=>p8,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":()=>f8,"animated_java.dialog.blueprint_settings.data_pack.title":()=>u8,"animated_java.dialog.blueprint_settings.data_pack_export_mode.description":()=>_D,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":()=>bD,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw":()=>xD,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":()=>vD,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":()=>gD,"animated_java.dialog.blueprint_settings.data_pack_settings.title":()=>s8,"animated_java.dialog.blueprint_settings.data_pack_zip.description":()=>x8,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":()=>v8,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":()=>b8,"animated_java.dialog.blueprint_settings.data_pack_zip.title":()=>_8,"animated_java.dialog.blueprint_settings.display_item.description":()=>ID,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":()=>FD,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":()=>ND,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":()=>DD,"animated_java.dialog.blueprint_settings.display_item.title":()=>OD,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":()=>RD,"animated_java.dialog.blueprint_settings.display_item_path.description":()=>XD,"animated_java.dialog.blueprint_settings.display_item_path.title":()=>YD,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description":()=>c8,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title":()=>l8,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description":()=>SD,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":()=>CD,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":()=>uD,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":()=>cD,"animated_java.dialog.blueprint_settings.export_namespace.description":()=>rD,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":()=>oD,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":()=>lD,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":()=>sD,"animated_java.dialog.blueprint_settings.export_namespace.title":()=>aD,"animated_java.dialog.blueprint_settings.export_settings.title":()=>iD,"animated_java.dialog.blueprint_settings.interpolation_duration.description":()=>k8,"animated_java.dialog.blueprint_settings.interpolation_duration.title":()=>E8,"animated_java.dialog.blueprint_settings.json_file.description":()=>D8,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":()=>F8,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":()=>N8,"animated_java.dialog.blueprint_settings.json_file.title":()=>I8,"animated_java.dialog.blueprint_settings.model_folder.title":()=>e8,"animated_java.dialog.blueprint_settings.resource_pack.description":()=>LD,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":()=>zD,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder":()=>HD,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":()=>qD,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":()=>VD,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":()=>UD,"animated_java.dialog.blueprint_settings.resource_pack.title":()=>PD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description":()=>pD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":()=>hD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw":()=>mD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":()=>fD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":()=>dD,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":()=>TD,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":()=>GD,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":()=>WD,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":()=>KD,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":()=>JD,"animated_java.dialog.blueprint_settings.show_bounding_box.description":()=>wD,"animated_java.dialog.blueprint_settings.show_bounding_box.title":()=>yD,"animated_java.dialog.blueprint_settings.summon_commands.description":()=>w8,"animated_java.dialog.blueprint_settings.summon_commands.title":()=>y8,"animated_java.dialog.blueprint_settings.teleportation_duration.description":()=>A8,"animated_java.dialog.blueprint_settings.teleportation_duration.title":()=>j8,"animated_java.dialog.blueprint_settings.texture_folder.description":()=>o8,"animated_java.dialog.blueprint_settings.texture_folder.title":()=>r8,"animated_java.dialog.blueprint_settings.texture_size.description":()=>$I,"animated_java.dialog.blueprint_settings.texture_size.title":()=>QI,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":()=>nD,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":()=>tD,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":()=>eD,"animated_java.dialog.blueprint_settings.title":()=>KI,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":()=>C8,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":()=>T8,"animated_java.dialog.bone_config.billboard.description":()=>mF,"animated_java.dialog.bone_config.billboard.options.center":()=>_F,"animated_java.dialog.bone_config.billboard.options.fixed":()=>fF,"animated_java.dialog.bone_config.billboard.options.horizontal":()=>gF,"animated_java.dialog.bone_config.billboard.options.vertical":()=>hF,"animated_java.dialog.bone_config.billboard.title":()=>pF,"animated_java.dialog.bone_config.brightness_override.description":()=>iF,"animated_java.dialog.bone_config.brightness_override.title":()=>nF,"animated_java.dialog.bone_config.default_variant_subtitle":()=>B8,"animated_java.dialog.bone_config.enchanted.description":()=>rF,"animated_java.dialog.bone_config.enchanted.title":()=>aF,"animated_java.dialog.bone_config.glow_color.description":()=>Y8,"animated_java.dialog.bone_config.glow_color.title":()=>K8,"animated_java.dialog.bone_config.glowing.description":()=>J8,"animated_java.dialog.bone_config.glowing.title":()=>H8,"animated_java.dialog.bone_config.inherit_settings.description":()=>q8,"animated_java.dialog.bone_config.inherit_settings.title":()=>U8,"animated_java.dialog.bone_config.invisible.description":()=>sF,"animated_java.dialog.bone_config.invisible.title":()=>oF,"animated_java.dialog.bone_config.nbt.description":()=>cF,"animated_java.dialog.bone_config.nbt.invalid_nbt.error":()=>dF,"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound":()=>uF,"animated_java.dialog.bone_config.nbt.title":()=>lF,"animated_java.dialog.bone_config.override_brightness.description":()=>tF,"animated_java.dialog.bone_config.override_brightness.title":()=>eF,"animated_java.dialog.bone_config.override_glow_color.description":()=>W8,"animated_java.dialog.bone_config.override_glow_color.title":()=>G8,"animated_java.dialog.bone_config.selected_variant":()=>M8,"animated_java.dialog.bone_config.selected_variant_subtitle":()=>P8,"animated_java.dialog.bone_config.shadow_radius.description":()=>Z8,"animated_java.dialog.bone_config.shadow_radius.title":()=>X8,"animated_java.dialog.bone_config.shadow_strength.description":()=>$8,"animated_java.dialog.bone_config.shadow_strength.title":()=>Q8,"animated_java.dialog.bone_config.title":()=>R8,"animated_java.dialog.bone_config.use_nbt.description":()=>V8,"animated_java.dialog.bone_config.use_nbt.title":()=>L8,"animated_java.dialog.bone_config.use_nbt.use_nbt_warning":()=>z8,"animated_java.dialog.bone_config.vanilla_item_model.description":()=>DF,"animated_java.dialog.bone_config.vanilla_item_model.title":()=>IF,"animated_java.dialog.export_progress.title":()=>XN,"animated_java.dialog.locator_config.entity_type.description":()=>EF,"animated_java.dialog.locator_config.entity_type.error.empty":()=>kF,"animated_java.dialog.locator_config.entity_type.title":()=>wF,"animated_java.dialog.locator_config.entity_type.warning.invalid":()=>jF,"animated_java.dialog.locator_config.plugin_mode_warning":()=>vF,"animated_java.dialog.locator_config.summon_commands.description":()=>TF,"animated_java.dialog.locator_config.summon_commands.title":()=>AF,"animated_java.dialog.locator_config.ticking_commands.description":()=>SF,"animated_java.dialog.locator_config.ticking_commands.title":()=>CF,"animated_java.dialog.locator_config.title":()=>xF,"animated_java.dialog.locator_config.use_entity.description":()=>yF,"animated_java.dialog.locator_config.use_entity.title":()=>bF,"animated_java.dialog.text_display_config.billboard.description":()=>iN,"animated_java.dialog.text_display_config.billboard.options.center":()=>sN,"animated_java.dialog.text_display_config.billboard.options.fixed":()=>aN,"animated_java.dialog.text_display_config.billboard.options.horizontal":()=>oN,"animated_java.dialog.text_display_config.billboard.options.vertical":()=>rN,"animated_java.dialog.text_display_config.billboard.title":()=>nN,"animated_java.dialog.text_display_config.brightness_override.description":()=>ZF,"animated_java.dialog.text_display_config.brightness_override.title":()=>XF,"animated_java.dialog.text_display_config.glow_color.description":()=>qF,"animated_java.dialog.text_display_config.glow_color.title":()=>UF,"animated_java.dialog.text_display_config.glowing.description":()=>LF,"animated_java.dialog.text_display_config.glowing.title":()=>PF,"animated_java.dialog.text_display_config.inherit_settings.description":()=>BF,"animated_java.dialog.text_display_config.inherit_settings.title":()=>MF,"animated_java.dialog.text_display_config.invisible.description":()=>$F,"animated_java.dialog.text_display_config.invisible.title":()=>QF,"animated_java.dialog.text_display_config.nbt.description":()=>tN,"animated_java.dialog.text_display_config.nbt.title":()=>eN,"animated_java.dialog.text_display_config.override_brightness.description":()=>YF,"animated_java.dialog.text_display_config.override_brightness.title":()=>KF,"animated_java.dialog.text_display_config.override_glow_color.description":()=>zF,"animated_java.dialog.text_display_config.override_glow_color.title":()=>VF,"animated_java.dialog.text_display_config.shadow_radius.description":()=>JF,"animated_java.dialog.text_display_config.shadow_radius.title":()=>HF,"animated_java.dialog.text_display_config.shadow_strength.description":()=>WF,"animated_java.dialog.text_display_config.shadow_strength.title":()=>GF,"animated_java.dialog.text_display_config.title":()=>OF,"animated_java.dialog.text_display_config.use_nbt.description":()=>NF,"animated_java.dialog.text_display_config.use_nbt.title":()=>FF,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":()=>RF,"animated_java.dialog.unexpected_error.close_button":()=>HI,"animated_java.dialog.unexpected_error.copy_error_message_button.description":()=>GI,"animated_java.dialog.unexpected_error.copy_error_message_button.message":()=>JI,"animated_java.dialog.unexpected_error.paragraph":()=>WI,"animated_java.dialog.unexpected_error.title":()=>qI,"animated_java.dialog.upgrade_old_aj_model_loader.title":()=>CN,"animated_java.dialog.vanilla_block_display_config.title":()=>lN,"animated_java.dialog.vanilla_item_display_config.title":()=>cN,"animated_java.dialog.variant_config.bone_lists.description":()=>yN,"animated_java.dialog.variant_config.excluded_nodes.description":()=>EN,"animated_java.dialog.variant_config.excluded_nodes.title":()=>wN,"animated_java.dialog.variant_config.generate_name_from_display_name":()=>mN,"animated_java.dialog.variant_config.generate_name_from_display_name.description":()=>fN,"animated_java.dialog.variant_config.included_nodes.description":()=>jN,"animated_java.dialog.variant_config.included_nodes.title":()=>kN,"animated_java.dialog.variant_config.swap_columns_button.tooltip":()=>AN,"animated_java.dialog.variant_config.texture_map.create_new_mapping":()=>vN,"animated_java.dialog.variant_config.texture_map.description":()=>xN,"animated_java.dialog.variant_config.texture_map.no_mappings":()=>bN,"animated_java.dialog.variant_config.texture_map.title":()=>_N,"animated_java.dialog.variant_config.title":()=>uN,"animated_java.dialog.variant_config.variant_display_name":()=>dN,"animated_java.dialog.variant_config.variant_display_name.description":()=>pN,"animated_java.dialog.variant_config.variant_name":()=>hN,"animated_java.dialog.variant_config.variant_name.description":()=>gN,"animated_java.effect_animator.keyframes.commands":()=>hR,"animated_java.effect_animator.keyframes.execute_condition":()=>gR,"animated_java.effect_animator.keyframes.variant":()=>fR,"animated_java.effect_animator.timeline.commands":()=>mR,"animated_java.effect_animator.timeline.variant":()=>pR,"animated_java.error.blueprint_export_path_doesnt_exist.description":()=>TM,"animated_java.error.blueprint_export_path_doesnt_exist.title":()=>AM,"animated_java.format_category.animated_java":()=>wM,"animated_java.misc.failed_to_export.blueprint_settings.error_item":()=>bM,"animated_java.misc.failed_to_export.blueprint_settings.message":()=>vM,"animated_java.misc.failed_to_export.button":()=>yM,"animated_java.misc.failed_to_export.custom_models.message":()=>xM,"animated_java.misc.failed_to_export.title":()=>_M,"animated_java.panel.keyframe.commands.description":()=>yR,"animated_java.panel.keyframe.commands.title":()=>bR,"animated_java.panel.keyframe.easing_args.description":()=>WR,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":()=>ZR,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":()=>XR,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":()=>$R,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":()=>QR,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":()=>YR,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":()=>KR,"animated_java.panel.keyframe.easing_args.title":()=>GR,"animated_java.panel.keyframe.easing_mode.description":()=>UR,"animated_java.panel.keyframe.easing_mode.options.in":()=>qR,"animated_java.panel.keyframe.easing_mode.options.inout":()=>JR,"animated_java.panel.keyframe.easing_mode.options.out":()=>HR,"animated_java.panel.keyframe.easing_mode.title":()=>zR,"animated_java.panel.keyframe.easing_type.description":()=>SR,"animated_java.panel.keyframe.easing_type.options.back":()=>LR,"animated_java.panel.keyframe.easing_type.options.bounce":()=>VR,"animated_java.panel.keyframe.easing_type.options.circ":()=>BR,"animated_java.panel.keyframe.easing_type.options.cubic":()=>FR,"animated_java.panel.keyframe.easing_type.options.elastic":()=>PR,"animated_java.panel.keyframe.easing_type.options.expo":()=>MR,"animated_java.panel.keyframe.easing_type.options.linear":()=>OR,"animated_java.panel.keyframe.easing_type.options.quad":()=>DR,"animated_java.panel.keyframe.easing_type.options.quart":()=>NR,"animated_java.panel.keyframe.easing_type.options.quint":()=>RR,"animated_java.panel.keyframe.easing_type.options.sine":()=>IR,"animated_java.panel.keyframe.easing_type.title":()=>CR,"animated_java.panel.keyframe.execute_condition.description":()=>ER,"animated_java.panel.keyframe.execute_condition.title":()=>wR,"animated_java.panel.keyframe.keyframe_title":()=>_R,"animated_java.panel.keyframe.repeat.description":()=>jR,"animated_java.panel.keyframe.repeat.title":()=>kR,"animated_java.panel.keyframe.repeat_frequency.description":()=>TR,"animated_java.panel.keyframe.repeat_frequency.title":()=>AR,"animated_java.panel.keyframe.variant.description":()=>vR,"animated_java.panel.keyframe.variant.title":()=>xR,"animated_java.panel.text_display.title":()=>eM,"animated_java.panel.vanilla_block_display.description":()=>hM,"animated_java.panel.vanilla_block_display.title":()=>fM,"animated_java.panel.vanilla_item_display.description":()=>mM,"animated_java.panel.vanilla_item_display.title":()=>pM,"animated_java.panel.variants.title":()=>QN,"animated_java.panel.variants.tool.cannot_delete_default_variant":()=>rR,"animated_java.panel.variants.tool.create_new_variant":()=>$N,"animated_java.panel.variants.tool.delete_selected_variant":()=>nR,"animated_java.panel.variants.tool.duplicate_selected_variant":()=>tR,"animated_java.panel.variants.tool.edit_variant":()=>eR,"animated_java.panel.variants.tool.variant_not_visible":()=>aR,"animated_java.panel.variants.tool.variant_visible":()=>iR,"animated_java.popup.loading.loading":()=>PI,"animated_java.popup.loading.offline":()=>VI,"animated_java.popup.loading.success":()=>LI,"animated_java.tool.text_display.background_color.description":()=>aM,"animated_java.tool.text_display.background_color.title":()=>iM,"animated_java.tool.text_display.line_width.description":()=>nM,"animated_java.tool.text_display.line_width.title":()=>tM,"animated_java.tool.text_display.text_alignment.description":()=>lM,"animated_java.tool.text_display.text_alignment.options.center":()=>uM,"animated_java.tool.text_display.text_alignment.options.left":()=>cM,"animated_java.tool.text_display.text_alignment.options.right":()=>dM,"animated_java.tool.text_display.text_alignment.title":()=>sM,"animated_java.tool.text_display.text_shadow.description":()=>oM,"animated_java.tool.text_display.text_shadow.title":()=>rM,"animated_java.vanilla_item_display.title":()=>gM,default:()=>CM});var AI="Blaupause-Einstellungen",TI="Dokumentation",CI="Plugin Info",SI="Knochen-Konfiguration",OI="Locator-Konfiguration",II="Textanzeige-Konfiguration",DI="Projekt exportieren",FI="Textanzeige hinzuf\xFCgen",NI="Vanilla Itemanzeige hinzuf\xFCgen",RI="Vanilla Blockanzeige hinzuf\xFCgen",MI="Vanilla Itemanzeige-Konfiguration",BI="Vanilla Blockanzeige-Konfiguration",PI="Animated Java wird geladen...",LI="Animated Java wurde erfolgreich geladen!",VI=`Animated Java konnte sich nicht verbinden! Einige Funktionen sind m\xF6glicherweise nicht verf\xFCgbar.`,zI="\xDCber Animated Java",UI="Schlie\xDFen",qI="Ein unerwarteter Fehler tritt auf!",HI="Schlie\xDFen",JI="Fehlermeldung wurde in die Zwischenablage kopiert!",GI="Klicken Sie, um die Fehlermeldung in die Zwischenablage zu kopieren.",WI="Bitte melden Sie diesen Fehler, indem Sie unserem {0} beitreten und einen Beitrag im #animated-java-support Kanal erstellen, oder indem Sie ein Issue auf unserem {1} erstellen. Danke!",KI="Blaupause-Einstellungen",YI="Erweiterte Einstellungen sollten nur verwendet werden, wenn sie unbedingt erforderlich sind!",XI="Blaupausenname",ZI="Der name der Blaupause. Wird nur verwendet, um das Projekt im Arbeitsbereich zu identifizieren.",QI="Textur-Gr\xF6\xDFe",$I="Die Aufl\xF6sung des UV-Editors. Diese sollte die gleiche Gr\xF6\xDFe wie die gr\xF6\xDFte Textur sein. Die besten Ergebnisse erzielen Sie mit einer quadratischen Aufl\xF6sung, wobei die Gr\xF6\xDFe eine Potenz von 2 ist.",eD="Die Textur-Gr\xF6\xDFe sollte quadratisch sein f\xFCr die besten Ergebnisse.",tD="Die Textur-Gr\xF6\xDFe sollte eine Potenz von 2 sein f\xFCr die besten Ergebnisse.",nD="Die Textur-Gr\xF6\xDFe sollte mit der Gr\xF6\xDFe der gr\xF6\xDFten Textur \xFCbereinstimmen.",iD="Export-Einstellungen",aD="Export-Namespace",rD="Der Namespace, in den das Projekt exportiert werden soll. Dies ist der Namespace, der im exportierten Ressourcenpaket und Datenpaket verwendet wird.",oD="Der Export-Namespace darf nicht leer sein!",sD='Der Export-Namespace "{0}" ist f\xFCr interne Funktionen reserviert! Bitte w\xE4hlen Sie einen anderen Namespace.',lD="Der Export-Namespace enth\xE4lt ung\xFCltige Zeichen! Ein Namespace darf nur Buchstaben, Nummern und Unterstriche enthalten.",cD="Plugin-Modus",uD="Ob der Plugin-Modus aktiviert werden soll oder nicht. Aktivieren Sie diese Option, falls Sie die .ajblueprint Datei in einem Plugin anstelle eines Ressourcenpaket / Datenpakets verwenden m\xF6chten.",dD="Ressourcenpaket Export-Modus",pD=`Bestimmt, wie das Ressourcenpaket exportiert werden soll. Ordner - Exportiert das Ressourcenpaket als Ordner. Zip - Exportiert das Ressourcenpaket als eine .zip-Datei. Keine - Deaktiviert den Export des Ressourcenpakets.`,mD="Ordner",fD="Zip",hD="Keine",gD="Datenpaket Export-Modus",_D=`Bestimmt, wie das Datenpaket exportiert werden soll. Ordner - Exportiert das Datenpaket als Ordner. Zip - Exportiert das Datenpaket als eine .zip-Datei. Keine - Deaktiviert den Export des Datenpakets.`,xD="Ordner",vD="Zip",bD="Keine",yD="Bounding Box anzeigen",wD="Ob die Bounding Box im Editor angezeigt werden soll oder nicht.",ED="Automatische Bounding Box",kD=`Ob die Bounding Box automatisch anhand der Geometrie des Modells berechnet werden soll oder nicht. HINWEIS: Die automatische Bounding Box ber\xFCcksichtigt NICHT die Knochen-Versetzungen bei Animationen, so dass die Bounding Box manchmals kleiner sein kann als erforderlich.`,jD="Bounding Box",AD="Bestimmt die Culling-Box des Modells. Das Modell wird nicht gerendert sobald diese Box au\xDFerhalb des Bildschirms liegt.",TD="Ressourcenpaket-Einstellungen",CD="Erweiterte Einstellungen benutzen",SD="Ob erweiterte Ressourcenpaket-Einstellungen aktiviert sind oder nicht.",OD="Anzeige-Item",ID="Das Item zur Anzeige der Blaupausenmodelle im Spiel. Mehrere Blaupausen k\xF6nnen auf demselben Item platziert werden und werden automatisch zusammengef\xFChrt.",DD="Kein Item ausgew\xE4hlt!",FD="Das angegebene Item ist ung\xFCltig! Item-IDs m\xFCssen als namespace:item_id formattiert sein.",ND="Die angegebene Item-ID ist ung\xFCltig! Item-IDs d\xFCrfen keine Leerzeichen enthalten.",RD="Das angegebene Item existiert nicht in Vanilla!",MD="CMD-Versetzung",BD="Der Versatz, der f\xFCr die benutzerdefinierten Modelldaten des Anzeige-Items verwendet werden soll. Erlaubt mehrere Blaupausen f\xFCr dasselbe Item, aber in separaten, nicht zugeh\xF6rigen Ressourcenpaketen.",PD="Ressourcenpaket",LD="Der Hauptordner des Ressourcenpakets, in den das Projekt exportiert werden soll.",VD="Kein Ordner ausgew\xE4hlt!",zD="Der ausgew\xE4hlte Ordner existiert nicht!",UD="Der ausgew\xE4hlte Dateipfad ist kein Ordner!",qD="Im ausgew\xE4hlten Ordner fehlt die pack.mcmeta-Datei!",HD="Im ausgew\xE4hlten Ordner fehlt der assets-Ordner!",JD="Ressourcenpaket Zip",GD="Der Dateipfad zu der .zip-Datei, in die das Projekt exportiert werden soll.",WD="Keine Datei ausgew\xE4hlt!",KD="Der ausgew\xE4hlte Dateipfad ist keine Datei!",YD="Anzeige-Item-Pfad",XD="Wo das Anzeige-Item gespeichert werden soll. Dies sollte ein Dateipfad zu einer .json-Datei in einem Ressourcenpaket sein.",ZD="Keine Datei ausgew\xE4hlt!",QD="Die ausgew\xE4hlte Datei existiert nicht!",$D="Der ausgew\xE4hlte Dateipfad ist keine Datei!",e8="Modell-Ordner",t8="Wo alle exportierten Modelle gespeichert werden sollen. Dies sollte ein Dateipfad zu einem Ordner in einem Ressourcenpaket sein.",n8="Kein Ordner ausgew\xE4hlt!",i8="Der ausgew\xE4hlte Ordner existiert nicht!",a8="Der ausgew\xE4hlte Dateipfad ist kein Ordner!",r8="Texturen-Ordner",o8="Wo alle exportierten Texturen gespeichert werden sollen. Dies sollte ein Dateipfad zu einem Ordner in einem Ressourcenpaket sein.",s8="Datenpaket-Einstellungen",l8="Erweiterte Einstellungen benutzen",c8="Ob erweiterte Datenpaket-Einstellungen aktiviert sind oder nicht.",u8="Datenpaket",d8="Der Hauptordner des Datenpakets, in den das Projekt exportiert werden soll.",p8="Kein Ordner ausgew\xE4hlt!",m8="Der ausgew\xE4hlte Ordner existiert nicht!",f8="Der ausgew\xE4hlte Dateipfad ist kein Ordner!",h8="Im ausgew\xE4hlten Ordner fehlt die pack.mcmeta-Datei!",g8="Im ausgew\xE4hlten Ordner fehlt der data-Ordner!",_8="Datenpaket Zip",x8="Der Dateipfad zu der .zip-Datei, in die das Projekt exportiert werden soll.",v8="Keine Datei ausgew\xE4hlt!",b8="Der ausgew\xE4hlte Dateipfad ist keine Datei!",y8="On-Summon-Befehle",w8=`Befehle, die beim Erschaffen des Root-Objektes ausgef\xFChrt werden. Behandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\xFCtzt auch MC-Build-Syntax!)`,E8="Interpolation-Dauer",k8="Die Dauer (in Ticks) der Gl\xE4ttung zwischen Keyframes. Dies ist die Zeit, die das Modell ben\xF6tigt, um von einem Keyframe zum n\xE4chsten zu wechseln. H\xF6here Werte f\xFChren dazu, dass die Animationen ungenauer werden. In der Regel sollten Werte von 1 oder 2 gen\xFCgen.",j8="Teleport-Dauer",A8="Die Dauer (in Ticks) der Teleportation zwischen Keyframes. Dies ist die Zeit, in der das Modell visuell zwischen seiner alten und neuer Position interpoliert. H\xF6here Werte f\xFChren dazu, dass die Animationen ungenauer werden.",T8="NBT-Speicher f\xFCr Animationen benutzen",C8=`Ob NBT-Speicher zum Speichern von Animationsdaten anstelle von Funktionen verwendet werden soll oder nicht. Dadurch wird die Anzahl der Funktionen im generierten Datenpaket erheblich reduziert, ist aber 42% langsamer.`,S8="Animationen verbinden",O8=`Ob die exportierten Animationen verbunden werden oder nicht. Bei verbundenen Animationen werden die Frames vorberechnet und in der exportierten JSON-Datei gespeichert, wodurch die Komplexit\xE4t des Renderings des Modells im Spiel reduziert wird. Bei einigen Plugins muss dies aktiviert sein, damit sie korrekt funktionieren.`,I8="JSON-Datei",D8="Der Dateipfad zu der JSON-Datei, in der das Projekt exportiert wird.",F8="Keine Datei ausgew\xE4hlt!",N8="Der ausgew\xE4hlte Dateipfad ist keine Datei!",R8="Knochen-Konfiguration",M8="Ausgew\xE4hlte Variante: {0}",B8="Die folgenden Einstellungen werden standardm\xE4\xDFig auf diesen Knochen angewendet.",P8="Die folgenden Einstellungen werden nur auf diesen Knochen angewendet, wenn diese Variante verwendet wird.",L8="NBT benutzen",V8="Ob NBT zur Konfiguration des Knochens anstelle von Einstellungen verwendet werden soll oder nicht.",z8="Die Verwendung von NBT setzt alle anderen Einstellungen au\xDFer Kraft, und alle \xC4nderungen, die Sie vornehmen, sind im Editor nicht sichtbar. Verwenden Sie dies nur, wenn Sie wissen, was Sie tun!",U8="Einstellungen erben",q8="Ob die Einstellungen des \xFCbergeordneten Knochens geerbt werden sollen oder nicht.",H8="Leuchten",J8="Ob der Knochen im Spiel leuchten soll oder nicht.",G8="Leuchtfarbe \xFCberschreiben",W8="Ob die Standard-Leuchtfarbe \xFCberschrieben werden soll oder nicht.",K8="Leuchtfarbe",Y8="Die Farbe des Leuchtens.",X8="Schatten-Radius",Z8="Der Radius des Schattens.",Q8="Schatten-Intensit\xE4t",$8="Die Intensit\xE4t des Schattens.",eF="Helligkeit \xFCberschreiben",tF="Ob die Standard-Helligkeit \xFCberschrieben werden soll oder nicht.",nF="Helligkeit",iF="Die Helligkeit des Knochens. Dies sollte ein Wert zwischen 0 und 15 sein.",aF="Verzaubert",rF="Ob dieser Knochen verzaubert sein soll oder nicht.",oF="Unsichtbar",sF="Ob dieser Knochen unsichtbar sein soll oder nicht.",lF="NBT",cF="Die NBT, die auf den Knochen angewendet werden soll.",uF=`Die NBT muss ein compound tag sein! Bsp. {CustomName:'"my name"'}`,dF=`Ung\xFCltige NBT! {0}`,pF="Anzeigetafel",mF="Ob dieser Knochen beim Rendern im Spiel zum Spieler hin drehen soll oder nicht. Es kann fixiert (sowohl vertikal als auch horizontale Winkel sind fixiert), vertikal (dreht sich um die vertikale Achse), horizontal (dreht sich um die horizontale Achse), oder zentriert (dreht sich um den Mittelpunkt) sein.",fF="Fixiert",hF="Vertikal",gF="Horizontal",_F="Zentriert",xF="Locator-Konfiguration",vF=`Plugin-Modus ist aktiviert! Locators k\xF6nnen nicht konfiguriert werden im Plugin-Modus. Verwenden Sie stattdessen die Plugin-API, um Ihren Locators individuelle Funktionen hinzuzuf\xFCgen. Weitere Informationen finden Sie in der offiziellen Plugin-API-Dokumentation.`,bF="Objekt benutzen",yF="Ob ein Objekt an den Locator angeh\xE4ngt werden soll oder nicht.",wF="Objekt-Typ",EF="Das Objekt, dass an den Locator angeh\xE4ngt wird.",kF="Objekt-Typ darf nicht leer sein!",jF="Das ausgew\xE4hlte Objekt existiert nicht in Minecraft {0}",AF="On-Summon Befehle",TF=`Befehle, die beim Erschaffen des Locator-Objektes ausgef\xFChrt werden. Behandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\xFCtzt auch MC-Build-Syntax!)`,CF="Ticking Befehle",SF=`Befehle, die bei jedem Tick an der Position des Locators ausgef\xFChrt werden. Behandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\xFCtzt auch MC-Build-Syntax!)`,OF="Textanzeige-Konfiguration",IF="Vanilla Item Model",DF=`If set, the bone will render as a vanilla item model. This will overwrite the bone's existing cubes.`,FF="NBT benutzen",NF="Ob NBT zur Konfiguration der Textanzeige anstelle von Einstellungen verwendet werden soll oder nicht.",RF="Die Verwendung von NBT setzt alle anderen Einstellungen au\xDFer Kraft, und alle \xC4nderungen, die Sie vornehmen, sind im Editor nicht sichtbar. Verwenden Sie dies nur, wenn Sie wissen, was Sie tun!",MF="Einstellungen erben",BF="Ob die Einstellungen der \xFCbergeordneten Textanzeige geerbt werden sollen oder nicht.",PF="Leuchten",LF="Ob die Textanzeige im Spiel leuchten soll oder nicht.",VF="Leuchtfarbe \xFCberschreiben",zF="Ob die Standard-Leuchtfarbe \xFCberschrieben werden soll oder nicht.",UF="Leuchtfarbe",qF="Die Farbe des Leuchtens.",HF="Schatten-Radius",JF="Der Radius des Schattens.",GF="Schatten-Intensit\xE4t",WF="Die Intensit\xE4t des Schattens.",KF="Helligkeit \xFCberschreiben",YF="Ob die Standard-Helligkeit \xFCberschrieben werden soll oder nicht.",XF="Helligkeit",ZF="Die Helligkeit der Textanzeige. Dies sollte ein Wert zwischen 0 und 15 sein.",QF="Unsichtbar",$F="Ob diese Textanzeige unsichtbar sein soll oder nicht.",eN="NBT",tN="Die NBT, die auf die Textanzeige angewendet werden soll.",nN="Anzeigetafel",iN="Ob diese Textanzeige beim Rendern im Spiel zum Spieler hin drehen soll oder nicht. Es kann fixiert (sowohl vertikal als auch horizontale Winkel sind fixiert), vertikal (dreht sich um die vertikale Achse), horizontal (dreht sich um die horizontale Achse), oder zentriert (dreht sich um den Mittelpunkt) sein.",aN="Fixiert",rN="Vertikal",oN="Horizontal",sN="Zentriert",lN="Vanilla Blockanzeige-Konfiguration",cN="Vanilla Itemanzeige-Konfiguration",uN="Variante-Konfiguration",dN="Anzeigename",pN="Wird verwendet, um die Variante im Editor und in Fehlermeldungen zu identifizieren.",mN="Name aus Anzeigename generieren",fN="Ob der Name automatisch aus dem Anzeigenamen generiert werden soll.",hN="Name",gN="Wird verwendet, um die Variante im exportierten Ressourcenpaket und Datenpaket zu identifizieren.",_N="Textur Zuordnung",xN="Eine Zuordnung mit den Texturen, die bei dieser Variante ausgetauscht werden sollen.",vN="Neue Zuordnung erstellen",bN="Variante hat keine ausgetauschten Texturen.",yN="Eine Liste von Nodes, die von der Variante ein- oder ausgeschlossen werden sollen. Nur die Nodes in der eingeschlossenen Liste werden von der Variante ge\xE4ndert, die Nodes in der ausgeschlossenen Liste werden ignoriert.",wN="Ausgeschlossene Nodes",EN="Eine Liste von Nodes, die von der Variante ausgeschlossen werden sollen. Diese Nodes werden von der Variante ignoriert.",kN="Eingeschlossene Nodes",jN="Eine Liste von Nodes, die von der Variante eingeschlossen werden. Nur diese Nodes werden von der Variante ge\xE4ndert.",AN="Listen tauschen",TN=".ajmodel aktualisieren",CN=".ajmodel aktualisieren",SN=".ajmodel-Datei ausw\xE4hlen",ON="Aktualisieren Sie Ihre veraltete .ajmodel-Datei zum neuen .ajblueprint-Format.",IN="W\xE4hlen Sie eine .ajmodel-Datei f\xFCr das Aktualisieren aus",DN="Animationseigenschaften ({0})",FN="Animationsname",NN="Der Name der Animation.",RN="Schleifen-Modus",MN="Bestimmt, wie die Animation in einer Schleife abgespielt werden soll. Einmal - Die Animation wird einmal abgespielt und h\xF6rt auf. Halten - Die Animation wird einmal abgespielt und das letzte Pose wird gehalten. Schleife - Die Animation wird in einer Endlosschleife abgespielt.",BN="Einmal",PN="Halten",LN="Schleife",VN="Der Animationsname darf nicht leer sein!",zN="Der Animationsname enth\xE4lt ung\xFCltige Zeichen! Animationsnamen d\xFCrfen nur Buchstaben, Zahlen und Punkte enthalten.",UN="Schleifenverz\xF6gerung",qN="Die Verz\xF6gerung zwischen Schleifen. Dies ist die Zeit, die die Animation pausiert, bevor sie wieder beginnt. Dies wird nur benutzt, wenn der Schleifenmodus auf Schleife eingestellt ist.",HN="Eine Liste von Nodes, die von der Animation ein- oder ausgeschlossen werden sollen. Nur die Nodes in der eingeschlossenen Liste werden von der Animation ge\xE4ndert, die Nodes in der ausgeschlossenen Liste werden ignoriert.",JN="Ausgeschlossene Nodes",GN="Eine Liste von Nodes, die von der Animation ausgeschlossen werden sollen. Diese Nodes werden von der Animation ignoriert.",WN="Eingeschlossene Nodes",KN="Eine Liste von Nodes, die von der Animation eingeschlossen werden. Nur diese Nodes werden von der Animation ge\xE4ndert.",YN="Listen tauschen",XN="Projekt wird exportiert...",ZN="Blaupause wird geladen...",QN="Varianten",$N="Neue Variante erstellen",eR="Variante editieren",tR="Ausgew\xE4hlte Variante duplizieren",nR="Ausgew\xE4hlte Variante l\xF6schen",iR="Ausgew\xE4hlte Variante",aR="Nicht ausgew\xE4hlte Variante",rR="Standard-Variante darf nicht gel\xF6scht werden!",oR="Variante erstellen",sR="Variante duplizieren",lR="Variante-Konfiguration \xF6ffnen",cR="Variante l\xF6schen",uR="Ausgeschlossene Nodes",dR="Ausgeschlossene Nodes umkehren",pR="Variante",mR="Befehle",fR="Variante",hR="Befehle",gR="Ausf\xFChrbedingung",_R="Keyframe ({0})",xR="Variante",vR="Die Variante, die bei diesem Keyframe angewendet wird.",bR="Befehle",yR=`Befehle, die ausgef\xFChrt werden, sobald dieses Keyframe erreicht wird. Behandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\xFCtzt auch MC-Build-Syntax!)`,wR="Ausf\xFChrbedingung",ER="Eine bedingung, die erf\xFCllt sein muss, damit das Keyframe ausgef\xFChrt wird. Behandeln Sie diese Texteingabe wie Unterbefehle eines execute Befehls.",kR="Wiederholen?",jR=`Ob dieser Befehl in diesem Keyframe wiederholt ausgef\xFChrt wird. Wenn diese Option aktiviert ist, werden die Befehle einmal pro Wiederholungsfrequenz ausgef\xFChrt.`,AR="Wiederholungsfrequenz",TR=`Wieviele Ticks dieses Keyframe warten soll, bevor die Befehle erneut ausgef\xFChrt werden. Falls dieser Wert 1 ist, werden die Befehle einmal pro Tick ausgef\xFChrt. HINWEIS: Falls die Animation nicht gleichm\xE4\xDFig durch diesen Wert teilbar ist, kann das Intervall beim Schleifen der Animation leicht abweichen. Falls dieser Wert gr\xF6\xDFer als die L\xE4nge der Animation ist, werden die Befehle nur einmal ausgef\xFChrt (sobald der Keyframe erreicht wird).`,CR="Gl\xE4ttungsart",SR="Die Gl\xE4ttungsart, die bei diesem Keyframe angewendet wird.",OR="Linear",IR="Sinus",DR="Quad",FR="Kubisch",NR="Quart",RR="Quint",MR="Expo",BR="Circ",PR="Elastisch",LR="Zur\xFCck",VR="Abprallen",zR="Gl\xE4ttungs-Modus",UR="Die Gl\xE4ttungs-Modus, die bei diesem Keyframe angewendet wird.",qR="Ein",HR="Aus",JR="Ein-Aus",GR="Gl\xE4ttungs-Argumente",WR="Die Argumente, die auf die Gl\xE4ttungsfunktion angewendet werden soll.",KR="Elastizit\xE4t",YR="Die Elastizit\xE4t der Gl\xE4ttungsfunktion.",XR="\xDCberschwingen",ZR="Der Betrag des \xDCberschwingens, der auf die Gl\xE4ttungsfunktion angewendet werden soll.",QR="Sprungkraft",$R="Die Sprungkraft der Gl\xE4ttungsfunktion.",eM="Textanzeige",tM="Zeilenbreite",nM="Die Breite der Textanzeige in Pixeln.",iM="Hintergrundsfarbe",aM="Die Farbe des Hintergrunds der Textanzeige",rM="Textschatten",oM="Ob die Textanzeige einen Schatten hinter dem Text anzeigt oder nicht.",sM="Textausrichtung",lM="Die Ausrichtung des Textes.",cM="Links",uM="Mitte",dM="Rechts",pM="Angezeigtes Item",mM="Das Item, dass angezeigt werden soll.",fM="Angezeigter Block",hM="Der Block, der angezeigt werden soll. Unterst\xFCtzt Block states!",gM="Vanilla Item Anzeige",_M="Fehler beim Exportieren",xM="Sie haben den Export des Ressourcenpakets deaktiviert, haben aber benutzerdefinierte Modelle im Projekt! Bitte aktivieren Sie den Export des Ressourcenpakets oder entfernen sie benutzerdefinierte Modelle vor dem Export.",vM="Ihre Blaupause-Einstellungen ist fehlerhaft! Bitte beheben Sie diese, bevor Sie exportieren.",bM="Ein Problem ist aufgetreten mit {0}:",yM="Ok",wM="Animated Java",EM="Fl\xFCssigkeiten renderen nicht in Blockanzeigen.",kM="Mob-K\xF6pfe renderen nicht in Blockanzeigen. Benutzen Sie stattdessen Itemanzeigen.",jM='Der Blockzustand "facing" wird in Blockanzeigen nicht unterst\xFCtzt.',AM="Blaupause-Exportpfad Existiert Nicht",TM=`Der Exportpfad '{0}' existiert nicht! Vergewissern Sie sich, dass der Ordner, in dem Sie speichern wollen, existiert, und versuchen Sie es erneut.`,CM={"animated_java.action.open_blueprint_settings.name":AI,"animated_java.action.open_documentation.name":TI,"animated_java.action.open_about.name":CI,"animated_java.action.open_bone_config.name":SI,"animated_java.action.open_locator_config.name":OI,"animated_java.action.open_text_display_config.name":II,"animated_java.action.export.name":DI,"animated_java.action.create_text_display.title":FI,"animated_java.action.create_vanilla_item_display.title":NI,"animated_java.action.create_vanilla_block_display.title":RI,"animated_java.action.open_vanilla_item_display_config.name":MI,"animated_java.action.open_vanilla_block_display_config.name":BI,"animated_java.popup.loading.loading":PI,"animated_java.popup.loading.success":LI,"animated_java.popup.loading.offline":VI,"animated_java.dialog.about.title":zI,"animated_java.dialog.about.close_button":UI,"animated_java.dialog.unexpected_error.title":qI,"animated_java.dialog.unexpected_error.close_button":HI,"animated_java.dialog.unexpected_error.copy_error_message_button.message":JI,"animated_java.dialog.unexpected_error.copy_error_message_button.description":GI,"animated_java.dialog.unexpected_error.paragraph":WI,"animated_java.dialog.blueprint_settings.title":KI,"animated_java.dialog.blueprint_settings.advanced_settings_warning":YI,"animated_java.dialog.blueprint_settings.blueprint_name.title":XI,"animated_java.dialog.blueprint_settings.blueprint_name.description":ZI,"animated_java.dialog.blueprint_settings.texture_size.title":QI,"animated_java.dialog.blueprint_settings.texture_size.description":$I,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":eD,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":tD,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":nD,"animated_java.dialog.blueprint_settings.export_settings.title":iD,"animated_java.dialog.blueprint_settings.export_namespace.title":aD,"animated_java.dialog.blueprint_settings.export_namespace.description":rD,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":oD,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":sD,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":lD,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":cD,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":uD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":dD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description":pD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw":mD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":fD,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":hD,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":gD,"animated_java.dialog.blueprint_settings.data_pack_export_mode.description":_D,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw":xD,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":vD,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":bD,"animated_java.dialog.blueprint_settings.show_bounding_box.title":yD,"animated_java.dialog.blueprint_settings.show_bounding_box.description":wD,"animated_java.dialog.blueprint_settings.auto_bounding_box.title":ED,"animated_java.dialog.blueprint_settings.auto_bounding_box.description":kD,"animated_java.dialog.blueprint_settings.bounding_box.title":jD,"animated_java.dialog.blueprint_settings.bounding_box.description":AD,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":TD,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":CD,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description":SD,"animated_java.dialog.blueprint_settings.display_item.title":OD,"animated_java.dialog.blueprint_settings.display_item.description":ID,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":DD,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":FD,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":ND,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":RD,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":MD,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":BD,"animated_java.dialog.blueprint_settings.resource_pack.title":PD,"animated_java.dialog.blueprint_settings.resource_pack.description":LD,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":VD,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":zD,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":UD,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":qD,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder":HD,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":JD,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":GD,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":WD,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":KD,"animated_java.dialog.blueprint_settings.display_item_path.title":YD,"animated_java.dialog.blueprint_settings.display_item_path.description":XD,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected":ZD,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist":QD,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file":$D,"animated_java.dialog.blueprint_settings.model_folder.title":e8,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description":t8,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected":n8,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist":i8,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder":a8,"animated_java.dialog.blueprint_settings.texture_folder.title":r8,"animated_java.dialog.blueprint_settings.texture_folder.description":o8,"animated_java.dialog.blueprint_settings.data_pack_settings.title":s8,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title":l8,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description":c8,"animated_java.dialog.blueprint_settings.data_pack.title":u8,"animated_java.dialog.blueprint_settings.data_pack.description":d8,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":p8,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":m8,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":f8,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":h8,"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder":g8,"animated_java.dialog.blueprint_settings.data_pack_zip.title":_8,"animated_java.dialog.blueprint_settings.data_pack_zip.description":x8,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":v8,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":b8,"animated_java.dialog.blueprint_settings.summon_commands.title":y8,"animated_java.dialog.blueprint_settings.summon_commands.description":w8,"animated_java.dialog.blueprint_settings.interpolation_duration.title":E8,"animated_java.dialog.blueprint_settings.interpolation_duration.description":k8,"animated_java.dialog.blueprint_settings.teleportation_duration.title":j8,"animated_java.dialog.blueprint_settings.teleportation_duration.description":A8,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":T8,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":C8,"animated_java.dialog.blueprint_settings.baked_animations.title":S8,"animated_java.dialog.blueprint_settings.baked_animations.description":O8,"animated_java.dialog.blueprint_settings.json_file.title":I8,"animated_java.dialog.blueprint_settings.json_file.description":D8,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":F8,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":N8,"animated_java.dialog.bone_config.title":R8,"animated_java.dialog.bone_config.selected_variant":M8,"animated_java.dialog.bone_config.default_variant_subtitle":B8,"animated_java.dialog.bone_config.selected_variant_subtitle":P8,"animated_java.dialog.bone_config.use_nbt.title":L8,"animated_java.dialog.bone_config.use_nbt.description":V8,"animated_java.dialog.bone_config.use_nbt.use_nbt_warning":z8,"animated_java.dialog.bone_config.inherit_settings.title":U8,"animated_java.dialog.bone_config.inherit_settings.description":q8,"animated_java.dialog.bone_config.glowing.title":H8,"animated_java.dialog.bone_config.glowing.description":J8,"animated_java.dialog.bone_config.override_glow_color.title":G8,"animated_java.dialog.bone_config.override_glow_color.description":W8,"animated_java.dialog.bone_config.glow_color.title":K8,"animated_java.dialog.bone_config.glow_color.description":Y8,"animated_java.dialog.bone_config.shadow_radius.title":X8,"animated_java.dialog.bone_config.shadow_radius.description":Z8,"animated_java.dialog.bone_config.shadow_strength.title":Q8,"animated_java.dialog.bone_config.shadow_strength.description":$8,"animated_java.dialog.bone_config.override_brightness.title":eF,"animated_java.dialog.bone_config.override_brightness.description":tF,"animated_java.dialog.bone_config.brightness_override.title":nF,"animated_java.dialog.bone_config.brightness_override.description":iF,"animated_java.dialog.bone_config.enchanted.title":aF,"animated_java.dialog.bone_config.enchanted.description":rF,"animated_java.dialog.bone_config.invisible.title":oF,"animated_java.dialog.bone_config.invisible.description":sF,"animated_java.dialog.bone_config.nbt.title":lF,"animated_java.dialog.bone_config.nbt.description":cF,"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound":uF,"animated_java.dialog.bone_config.nbt.invalid_nbt.error":dF,"animated_java.dialog.bone_config.billboard.title":pF,"animated_java.dialog.bone_config.billboard.description":mF,"animated_java.dialog.bone_config.billboard.options.fixed":fF,"animated_java.dialog.bone_config.billboard.options.vertical":hF,"animated_java.dialog.bone_config.billboard.options.horizontal":gF,"animated_java.dialog.bone_config.billboard.options.center":_F,"animated_java.dialog.locator_config.title":xF,"animated_java.dialog.locator_config.plugin_mode_warning":vF,"animated_java.dialog.locator_config.use_entity.title":bF,"animated_java.dialog.locator_config.use_entity.description":yF,"animated_java.dialog.locator_config.entity_type.title":wF,"animated_java.dialog.locator_config.entity_type.description":EF,"animated_java.dialog.locator_config.entity_type.error.empty":kF,"animated_java.dialog.locator_config.entity_type.warning.invalid":jF,"animated_java.dialog.locator_config.summon_commands.title":AF,"animated_java.dialog.locator_config.summon_commands.description":TF,"animated_java.dialog.locator_config.ticking_commands.title":CF,"animated_java.dialog.locator_config.ticking_commands.description":SF,"animated_java.dialog.text_display_config.title":OF,"animated_java.dialog.bone_config.vanilla_item_model.title":IF,"animated_java.dialog.bone_config.vanilla_item_model.description":DF,"animated_java.dialog.text_display_config.use_nbt.title":FF,"animated_java.dialog.text_display_config.use_nbt.description":NF,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":RF,"animated_java.dialog.text_display_config.inherit_settings.title":MF,"animated_java.dialog.text_display_config.inherit_settings.description":BF,"animated_java.dialog.text_display_config.glowing.title":PF,"animated_java.dialog.text_display_config.glowing.description":LF,"animated_java.dialog.text_display_config.override_glow_color.title":VF,"animated_java.dialog.text_display_config.override_glow_color.description":zF,"animated_java.dialog.text_display_config.glow_color.title":UF,"animated_java.dialog.text_display_config.glow_color.description":qF,"animated_java.dialog.text_display_config.shadow_radius.title":HF,"animated_java.dialog.text_display_config.shadow_radius.description":JF,"animated_java.dialog.text_display_config.shadow_strength.title":GF,"animated_java.dialog.text_display_config.shadow_strength.description":WF,"animated_java.dialog.text_display_config.override_brightness.title":KF,"animated_java.dialog.text_display_config.override_brightness.description":YF,"animated_java.dialog.text_display_config.brightness_override.title":XF,"animated_java.dialog.text_display_config.brightness_override.description":ZF,"animated_java.dialog.text_display_config.invisible.title":QF,"animated_java.dialog.text_display_config.invisible.description":$F,"animated_java.dialog.text_display_config.nbt.title":eN,"animated_java.dialog.text_display_config.nbt.description":tN,"animated_java.dialog.text_display_config.billboard.title":nN,"animated_java.dialog.text_display_config.billboard.description":iN,"animated_java.dialog.text_display_config.billboard.options.fixed":aN,"animated_java.dialog.text_display_config.billboard.options.vertical":rN,"animated_java.dialog.text_display_config.billboard.options.horizontal":oN,"animated_java.dialog.text_display_config.billboard.options.center":sN,"animated_java.dialog.vanilla_block_display_config.title":lN,"animated_java.dialog.vanilla_item_display_config.title":cN,"animated_java.dialog.variant_config.title":uN,"animated_java.dialog.variant_config.variant_display_name":dN,"animated_java.dialog.variant_config.variant_display_name.description":pN,"animated_java.dialog.variant_config.generate_name_from_display_name":mN,"animated_java.dialog.variant_config.generate_name_from_display_name.description":fN,"animated_java.dialog.variant_config.variant_name":hN,"animated_java.dialog.variant_config.variant_name.description":gN,"animated_java.dialog.variant_config.texture_map.title":_N,"animated_java.dialog.variant_config.texture_map.description":xN,"animated_java.dialog.variant_config.texture_map.create_new_mapping":vN,"animated_java.dialog.variant_config.texture_map.no_mappings":bN,"animated_java.dialog.variant_config.bone_lists.description":yN,"animated_java.dialog.variant_config.excluded_nodes.title":wN,"animated_java.dialog.variant_config.excluded_nodes.description":EN,"animated_java.dialog.variant_config.included_nodes.title":kN,"animated_java.dialog.variant_config.included_nodes.description":jN,"animated_java.dialog.variant_config.swap_columns_button.tooltip":AN,"animated_java.action.upgrade_old_aj_model_loader.name":TN,"animated_java.dialog.upgrade_old_aj_model_loader.title":CN,"animated_java.action.upgrade_old_aj_model_loader.select_file":SN,"animated_java.action.upgrade_old_aj_model_loader.body":ON,"animated_java.action.upgrade_old_aj_model_loader.button":IN,"animated_java.dialog.animation_properties.title":DN,"animated_java.dialog.animation_properties.animation_name.title":FN,"animated_java.dialog.animation_properties.animation_name.description":NN,"animated_java.dialog.animation_properties.loop_mode.title":RN,"animated_java.dialog.animation_properties.loop_mode.description":MN,"animated_java.dialog.animation_properties.loop_mode.options.once":BN,"animated_java.dialog.animation_properties.loop_mode.options.hold":PN,"animated_java.dialog.animation_properties.loop_mode.options.loop":LN,"animated_java.dialog.animation_properties.animation_name.error.empty":VN,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":zN,"animated_java.dialog.animation_properties.loop_delay.title":UN,"animated_java.dialog.animation_properties.loop_delay.description":qN,"animated_java.dialog.animation_properties.bone_lists.description":HN,"animated_java.dialog.animation_properties.excluded_nodes.title":JN,"animated_java.dialog.animation_properties.excluded_nodes.description":GN,"animated_java.dialog.animation_properties.included_nodes.title":WN,"animated_java.dialog.animation_properties.included_nodes.description":KN,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":YN,"animated_java.dialog.export_progress.title":XN,"animated_java.dialog.blueprint_loading.title":ZN,"animated_java.panel.variants.title":QN,"animated_java.panel.variants.tool.create_new_variant":$N,"animated_java.panel.variants.tool.edit_variant":eR,"animated_java.panel.variants.tool.duplicate_selected_variant":tR,"animated_java.panel.variants.tool.delete_selected_variant":nR,"animated_java.panel.variants.tool.variant_visible":iR,"animated_java.panel.variants.tool.variant_not_visible":aR,"animated_java.panel.variants.tool.cannot_delete_default_variant":rR,"animated_java.action.variants.create":oR,"animated_java.action.variants.duplicate":sR,"animated_java.action.variants.open_config":lR,"animated_java.action.variants.delete":cR,"animated_java.animation.excluded_nodes":uR,"animated_java.animation.invert_excluded_nodes":dR,"animated_java.effect_animator.timeline.variant":pR,"animated_java.effect_animator.timeline.commands":mR,"animated_java.effect_animator.keyframes.variant":fR,"animated_java.effect_animator.keyframes.commands":hR,"animated_java.effect_animator.keyframes.execute_condition":gR,"animated_java.panel.keyframe.keyframe_title":_R,"animated_java.panel.keyframe.variant.title":xR,"animated_java.panel.keyframe.variant.description":vR,"animated_java.panel.keyframe.commands.title":bR,"animated_java.panel.keyframe.commands.description":yR,"animated_java.panel.keyframe.execute_condition.title":wR,"animated_java.panel.keyframe.execute_condition.description":ER,"animated_java.panel.keyframe.repeat.title":kR,"animated_java.panel.keyframe.repeat.description":jR,"animated_java.panel.keyframe.repeat_frequency.title":AR,"animated_java.panel.keyframe.repeat_frequency.description":TR,"animated_java.panel.keyframe.easing_type.title":CR,"animated_java.panel.keyframe.easing_type.description":SR,"animated_java.panel.keyframe.easing_type.options.linear":OR,"animated_java.panel.keyframe.easing_type.options.sine":IR,"animated_java.panel.keyframe.easing_type.options.quad":DR,"animated_java.panel.keyframe.easing_type.options.cubic":FR,"animated_java.panel.keyframe.easing_type.options.quart":NR,"animated_java.panel.keyframe.easing_type.options.quint":RR,"animated_java.panel.keyframe.easing_type.options.expo":MR,"animated_java.panel.keyframe.easing_type.options.circ":BR,"animated_java.panel.keyframe.easing_type.options.elastic":PR,"animated_java.panel.keyframe.easing_type.options.back":LR,"animated_java.panel.keyframe.easing_type.options.bounce":VR,"animated_java.panel.keyframe.easing_mode.title":zR,"animated_java.panel.keyframe.easing_mode.description":UR,"animated_java.panel.keyframe.easing_mode.options.in":qR,"animated_java.panel.keyframe.easing_mode.options.out":HR,"animated_java.panel.keyframe.easing_mode.options.inout":JR,"animated_java.panel.keyframe.easing_args.title":GR,"animated_java.panel.keyframe.easing_args.description":WR,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":KR,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":YR,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":XR,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":ZR,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":QR,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":$R,"animated_java.panel.text_display.title":eM,"animated_java.tool.text_display.line_width.title":tM,"animated_java.tool.text_display.line_width.description":nM,"animated_java.tool.text_display.background_color.title":iM,"animated_java.tool.text_display.background_color.description":aM,"animated_java.tool.text_display.text_shadow.title":rM,"animated_java.tool.text_display.text_shadow.description":oM,"animated_java.tool.text_display.text_alignment.title":sM,"animated_java.tool.text_display.text_alignment.description":lM,"animated_java.tool.text_display.text_alignment.options.left":cM,"animated_java.tool.text_display.text_alignment.options.center":uM,"animated_java.tool.text_display.text_alignment.options.right":dM,"animated_java.panel.vanilla_item_display.title":pM,"animated_java.panel.vanilla_item_display.description":mM,"animated_java.panel.vanilla_block_display.title":fM,"animated_java.panel.vanilla_block_display.description":hM,"animated_java.vanilla_item_display.title":gM,"animated_java.misc.failed_to_export.title":_M,"animated_java.misc.failed_to_export.custom_models.message":xM,"animated_java.misc.failed_to_export.blueprint_settings.message":vM,"animated_java.misc.failed_to_export.blueprint_settings.error_item":bM,"animated_java.misc.failed_to_export.button":yM,"animated_java.format_category.animated_java":wM,"animated_java.block_model_manager.fluid_warning":EM,"animated_java.block_model_manager.mob_head_warning":kM,"animated_java.block_model_manager.facing_warning":jM,"animated_java.error.blueprint_export_path_doesnt_exist.title":AM,"animated_java.error.blueprint_export_path_doesnt_exist.description":TM};var kg={};vn(kg,{"animated_java.action.copy_display_entity_config.message":()=>YM,"animated_java.action.copy_display_entity_config.name":()=>KM,"animated_java.action.create_text_display.title":()=>JM,"animated_java.action.create_vanilla_block_display.title":()=>WM,"animated_java.action.create_vanilla_item_display.title":()=>GM,"animated_java.action.export.name":()=>BM,"animated_java.action.export_all.description":()=>VM,"animated_java.action.export_all.name":()=>LM,"animated_java.action.export_all_debug.description":()=>UM,"animated_java.action.export_all_debug.name":()=>zM,"animated_java.action.export_debug.name":()=>PM,"animated_java.action.extract.confirm":()=>HM,"animated_java.action.extract.name":()=>qM,"animated_java.action.open_about.name":()=>NM,"animated_java.action.open_blueprint_settings.name":()=>IM,"animated_java.action.open_changelog.name":()=>FM,"animated_java.action.open_display_entity_config.name":()=>RM,"animated_java.action.open_documentation.name":()=>DM,"animated_java.action.open_locator_config.name":()=>MM,"animated_java.action.paste_display_entity_config.message":()=>ZM,"animated_java.action.paste_display_entity_config.name":()=>XM,"animated_java.action.upgrade_old_aj_model_loader.body":()=>_9,"animated_java.action.upgrade_old_aj_model_loader.button":()=>x9,"animated_java.action.upgrade_old_aj_model_loader.name":()=>f9,"animated_java.action.upgrade_old_aj_model_loader.select_file":()=>g9,"animated_java.action.variants.create":()=>K9,"animated_java.action.variants.delete":()=>Z9,"animated_java.action.variants.duplicate":()=>Y9,"animated_java.action.variants.open_config":()=>X9,"animated_java.animation.excluded_nodes":()=>Q9,"animated_java.animation.invert_excluded_nodes":()=>$9,"animated_java.block_model_manager.facing_warning":()=>Pz,"animated_java.block_model_manager.fluid_warning":()=>Mz,"animated_java.block_model_manager.mob_head_warning":()=>Bz,"animated_java.dialog.about.close_button":()=>dB,"animated_java.dialog.about.title":()=>uB,"animated_java.dialog.animation_properties.animation_name.description":()=>y9,"animated_java.dialog.animation_properties.animation_name.error.empty":()=>T9,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":()=>C9,"animated_java.dialog.animation_properties.animation_name.title":()=>b9,"animated_java.dialog.animation_properties.bone_lists.description":()=>I9,"animated_java.dialog.animation_properties.excluded_nodes.description":()=>F9,"animated_java.dialog.animation_properties.excluded_nodes.title":()=>D9,"animated_java.dialog.animation_properties.included_nodes.description":()=>R9,"animated_java.dialog.animation_properties.included_nodes.title":()=>N9,"animated_java.dialog.animation_properties.loop_delay.description":()=>O9,"animated_java.dialog.animation_properties.loop_delay.title":()=>S9,"animated_java.dialog.animation_properties.loop_mode.description":()=>E9,"animated_java.dialog.animation_properties.loop_mode.options.hold":()=>j9,"animated_java.dialog.animation_properties.loop_mode.options.loop":()=>A9,"animated_java.dialog.animation_properties.loop_mode.options.once":()=>k9,"animated_java.dialog.animation_properties.loop_mode.title":()=>w9,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":()=>M9,"animated_java.dialog.animation_properties.title":()=>v9,"animated_java.dialog.blueprint_loading.title":()=>P9,"animated_java.dialog.blueprint_settings.advanced_settings_warning":()=>bB,"animated_java.dialog.blueprint_settings.auto_render_box.description":()=>BB,"animated_java.dialog.blueprint_settings.auto_render_box.title":()=>MB,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description":()=>YP,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title":()=>KP,"animated_java.dialog.blueprint_settings.baked_animations.description":()=>$P,"animated_java.dialog.blueprint_settings.baked_animations.title":()=>QP,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":()=>pP,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":()=>dP,"animated_java.dialog.blueprint_settings.data_pack.description":()=>AP,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":()=>SP,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":()=>IP,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":()=>CP,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":()=>OP,"animated_java.dialog.blueprint_settings.data_pack.title":()=>jP,"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder":()=>TP,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder":()=>YB,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":()=>ZB,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":()=>XB,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":()=>KB,"animated_java.dialog.blueprint_settings.data_pack_settings.title":()=>kP,"animated_java.dialog.blueprint_settings.data_pack_zip.description":()=>FP,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":()=>NP,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":()=>RP,"animated_java.dialog.blueprint_settings.data_pack_zip.title":()=>DP,"animated_java.dialog.blueprint_settings.display_item.description":()=>aP,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":()=>oP,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":()=>sP,"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found":()=>uP,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":()=>rP,"animated_java.dialog.blueprint_settings.display_item.title":()=>iP,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":()=>lP,"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated":()=>cP,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title":()=>nP,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":()=>tP,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":()=>qB,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":()=>UB,"animated_java.dialog.blueprint_settings.export_namespace.description":()=>OB,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":()=>IB,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":()=>FB,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":()=>DB,"animated_java.dialog.blueprint_settings.export_namespace.title":()=>SB,"animated_java.dialog.blueprint_settings.export_settings.title":()=>CB,"animated_java.dialog.blueprint_settings.interpolation_duration.description":()=>JP,"animated_java.dialog.blueprint_settings.interpolation_duration.title":()=>HP,"animated_java.dialog.blueprint_settings.json_file.description":()=>tL,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":()=>nL,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":()=>iL,"animated_java.dialog.blueprint_settings.json_file.title":()=>eL,"animated_java.dialog.blueprint_settings.on_post_tick_function.description":()=>qP,"animated_java.dialog.blueprint_settings.on_post_tick_function.title":()=>UP,"animated_java.dialog.blueprint_settings.on_pre_tick_function.description":()=>zP,"animated_java.dialog.blueprint_settings.on_pre_tick_function.title":()=>VP,"animated_java.dialog.blueprint_settings.on_remove_function.description":()=>LP,"animated_java.dialog.blueprint_settings.on_remove_function.title":()=>PP,"animated_java.dialog.blueprint_settings.on_summon_function.description":()=>BP,"animated_java.dialog.blueprint_settings.on_summon_function.title":()=>MP,"animated_java.dialog.blueprint_settings.project_name.description":()=>wB,"animated_java.dialog.blueprint_settings.project_name.title":()=>yB,"animated_java.dialog.blueprint_settings.project_settings.title":()=>vB,"animated_java.dialog.blueprint_settings.render_box.description":()=>LB,"animated_java.dialog.blueprint_settings.render_box.title":()=>PB,"animated_java.dialog.blueprint_settings.resource_pack.description":()=>fP,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":()=>_P,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":()=>vP,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":()=>gP,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":()=>xP,"animated_java.dialog.blueprint_settings.resource_pack.title":()=>mP,"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder":()=>hP,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder":()=>JB,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":()=>WB,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":()=>GB,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":()=>HB,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":()=>eP,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":()=>yP,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":()=>wP,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":()=>EP,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":()=>bP,"animated_java.dialog.blueprint_settings.show_render_box.description":()=>RB,"animated_java.dialog.blueprint_settings.show_render_box.title":()=>NB,"animated_java.dialog.blueprint_settings.target_minecraft_version.description":()=>$B,"animated_java.dialog.blueprint_settings.target_minecraft_version.title":()=>QB,"animated_java.dialog.blueprint_settings.teleportation_duration.description":()=>WP,"animated_java.dialog.blueprint_settings.teleportation_duration.title":()=>GP,"animated_java.dialog.blueprint_settings.texture_size.description":()=>kB,"animated_java.dialog.blueprint_settings.texture_size.title":()=>EB,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":()=>TB,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":()=>AB,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":()=>jB,"animated_java.dialog.blueprint_settings.title":()=>xB,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":()=>ZP,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":()=>XP,"animated_java.dialog.blueprint_settings.view_range.description":()=>zB,"animated_java.dialog.blueprint_settings.view_range.title":()=>VB,"animated_java.dialog.bone_config.vanilla_item_model.description":()=>d7,"animated_java.dialog.bone_config.vanilla_item_model.title":()=>u7,"animated_java.dialog.changelog_dialog.title":()=>pB,"animated_java.dialog.display_entity.billboard.description":()=>LL,"animated_java.dialog.display_entity.billboard.options.center":()=>qL,"animated_java.dialog.display_entity.billboard.options.fixed":()=>VL,"animated_java.dialog.display_entity.billboard.options.horizontal":()=>UL,"animated_java.dialog.display_entity.billboard.options.vertical":()=>zL,"animated_java.dialog.display_entity.billboard.title":()=>PL,"animated_java.dialog.display_entity.brightness_override.description":()=>SL,"animated_java.dialog.display_entity.brightness_override.title":()=>CL,"animated_java.dialog.display_entity.custom_brightness.description":()=>FL,"animated_java.dialog.display_entity.custom_brightness.title":()=>DL,"animated_java.dialog.display_entity.custom_name.description":()=>pL,"animated_java.dialog.display_entity.custom_name.invalid_json.error":()=>mL,"animated_java.dialog.display_entity.custom_name.title":()=>dL,"animated_java.dialog.display_entity.custom_name_visible.description":()=>hL,"animated_java.dialog.display_entity.custom_name_visible.title":()=>fL,"animated_java.dialog.display_entity.enchanted.description":()=>RL,"animated_java.dialog.display_entity.enchanted.title":()=>NL,"animated_java.dialog.display_entity.glow_color.description":()=>yL,"animated_java.dialog.display_entity.glow_color.title":()=>bL,"animated_java.dialog.display_entity.glowing.description":()=>_L,"animated_java.dialog.display_entity.glowing.title":()=>gL,"animated_java.dialog.display_entity.invisible.description":()=>BL,"animated_java.dialog.display_entity.invisible.title":()=>ML,"animated_java.dialog.display_entity.node_options.title":()=>rL,"animated_java.dialog.display_entity.on_apply_function.description":()=>uL,"animated_java.dialog.display_entity.on_apply_function.title":()=>cL,"animated_java.dialog.display_entity.on_summon_function.description":()=>lL,"animated_java.dialog.display_entity.on_summon_function.title":()=>sL,"animated_java.dialog.display_entity.override_brightness.description":()=>TL,"animated_java.dialog.display_entity.override_brightness.title":()=>AL,"animated_java.dialog.display_entity.override_glow_color.description":()=>vL,"animated_java.dialog.display_entity.override_glow_color.title":()=>xL,"animated_java.dialog.display_entity.per_variant_options.title":()=>oL,"animated_java.dialog.display_entity.shadow_radius.description":()=>EL,"animated_java.dialog.display_entity.shadow_radius.title":()=>wL,"animated_java.dialog.display_entity.shadow_strength.description":()=>jL,"animated_java.dialog.display_entity.shadow_strength.title":()=>kL,"animated_java.dialog.display_entity.title":()=>aL,"animated_java.dialog.display_entity.use_custom_brightness.description":()=>IL,"animated_java.dialog.display_entity.use_custom_brightness.title":()=>OL,"animated_java.dialog.export_progress.title":()=>B9,"animated_java.dialog.locator_config.entity_type.description":()=>YL,"animated_java.dialog.locator_config.entity_type.error.empty":()=>XL,"animated_java.dialog.locator_config.entity_type.title":()=>KL,"animated_java.dialog.locator_config.entity_type.warning.invalid":()=>ZL,"animated_java.dialog.locator_config.on_remove_function.description":()=>a7,"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity":()=>r7,"animated_java.dialog.locator_config.on_remove_function.title":()=>i7,"animated_java.dialog.locator_config.on_summon_function.description":()=>t7,"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity":()=>n7,"animated_java.dialog.locator_config.on_summon_function.title":()=>e7,"animated_java.dialog.locator_config.on_tick_function.description":()=>s7,"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity":()=>l7,"animated_java.dialog.locator_config.on_tick_function.title":()=>o7,"animated_java.dialog.locator_config.plugin_mode_warning":()=>JL,"animated_java.dialog.locator_config.sync_passenger_rotation.description":()=>$L,"animated_java.dialog.locator_config.sync_passenger_rotation.title":()=>QL,"animated_java.dialog.locator_config.title":()=>HL,"animated_java.dialog.locator_config.use_entity.description":()=>WL,"animated_java.dialog.locator_config.use_entity.title":()=>GL,"animated_java.dialog.reset":()=>cB,"animated_java.dialog.text_display_config.brightness_override.description":()=>O7,"animated_java.dialog.text_display_config.brightness_override.title":()=>S7,"animated_java.dialog.text_display_config.custom_brightness.description":()=>N7,"animated_java.dialog.text_display_config.custom_brightness.title":()=>F7,"animated_java.dialog.text_display_config.glow_color.description":()=>w7,"animated_java.dialog.text_display_config.glow_color.title":()=>y7,"animated_java.dialog.text_display_config.glowing.description":()=>x7,"animated_java.dialog.text_display_config.glowing.title":()=>_7,"animated_java.dialog.text_display_config.inherit_settings.description":()=>g7,"animated_java.dialog.text_display_config.inherit_settings.title":()=>h7,"animated_java.dialog.text_display_config.invisible.description":()=>M7,"animated_java.dialog.text_display_config.invisible.title":()=>R7,"animated_java.dialog.text_display_config.nbt.description":()=>P7,"animated_java.dialog.text_display_config.nbt.title":()=>B7,"animated_java.dialog.text_display_config.override_brightness.description":()=>C7,"animated_java.dialog.text_display_config.override_brightness.title":()=>T7,"animated_java.dialog.text_display_config.override_glow_color.description":()=>b7,"animated_java.dialog.text_display_config.override_glow_color.title":()=>v7,"animated_java.dialog.text_display_config.shadow_radius.description":()=>k7,"animated_java.dialog.text_display_config.shadow_radius.title":()=>E7,"animated_java.dialog.text_display_config.shadow_strength.description":()=>A7,"animated_java.dialog.text_display_config.shadow_strength.title":()=>j7,"animated_java.dialog.text_display_config.title":()=>c7,"animated_java.dialog.text_display_config.use_custom_brightness.description":()=>D7,"animated_java.dialog.text_display_config.use_custom_brightness.title":()=>I7,"animated_java.dialog.text_display_config.use_nbt.description":()=>m7,"animated_java.dialog.text_display_config.use_nbt.title":()=>p7,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":()=>f7,"animated_java.dialog.unexpected_error.close_button":()=>fB,"animated_java.dialog.unexpected_error.copy_error_message_button.description":()=>gB,"animated_java.dialog.unexpected_error.copy_error_message_button.message":()=>hB,"animated_java.dialog.unexpected_error.paragraph":()=>_B,"animated_java.dialog.unexpected_error.title":()=>mB,"animated_java.dialog.upgrade_old_aj_model_loader.title":()=>h9,"animated_java.dialog.vanilla_block_display.custom_name.description":()=>z7,"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error":()=>U7,"animated_java.dialog.vanilla_block_display.custom_name.title":()=>V7,"animated_java.dialog.vanilla_block_display.custom_name_visible.description":()=>H7,"animated_java.dialog.vanilla_block_display.custom_name_visible.title":()=>q7,"animated_java.dialog.vanilla_block_display_config.title":()=>L7,"animated_java.dialog.vanilla_item_display.custom_name.description":()=>W7,"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error":()=>K7,"animated_java.dialog.vanilla_item_display.custom_name.title":()=>G7,"animated_java.dialog.vanilla_item_display.custom_name_visible.description":()=>X7,"animated_java.dialog.vanilla_item_display.custom_name_visible.title":()=>Y7,"animated_java.dialog.vanilla_item_display_config.title":()=>J7,"animated_java.dialog.variant_config.bone_lists.description":()=>l9,"animated_java.dialog.variant_config.excluded_nodes.description":()=>u9,"animated_java.dialog.variant_config.excluded_nodes.title":()=>c9,"animated_java.dialog.variant_config.generate_name_from_display_name":()=>e9,"animated_java.dialog.variant_config.generate_name_from_display_name.description":()=>t9,"animated_java.dialog.variant_config.included_nodes.description":()=>p9,"animated_java.dialog.variant_config.included_nodes.title":()=>d9,"animated_java.dialog.variant_config.swap_columns_button.tooltip":()=>m9,"animated_java.dialog.variant_config.texture_map.create_new_mapping":()=>o9,"animated_java.dialog.variant_config.texture_map.description":()=>r9,"animated_java.dialog.variant_config.texture_map.no_mappings":()=>s9,"animated_java.dialog.variant_config.texture_map.title":()=>a9,"animated_java.dialog.variant_config.title":()=>Z7,"animated_java.dialog.variant_config.variant_display_name":()=>Q7,"animated_java.dialog.variant_config.variant_display_name.description":()=>$7,"animated_java.dialog.variant_config.variant_name":()=>n9,"animated_java.dialog.variant_config.variant_name.description":()=>i9,"animated_java.effect_animator.keyframe_data_point.execute_condition":()=>aV,"animated_java.effect_animator.keyframe_data_point.function":()=>iV,"animated_java.effect_animator.keyframe_data_point.repeat":()=>rV,"animated_java.effect_animator.keyframe_data_point.repeat_frequency":()=>oV,"animated_java.effect_animator.keyframe_data_point.variant":()=>nV,"animated_java.effect_animator.timeline.function":()=>tV,"animated_java.effect_animator.timeline.variant":()=>eV,"animated_java.error.blueprint_export_path_doesnt_exist.description":()=>Vz,"animated_java.error.blueprint_export_path_doesnt_exist.title":()=>Lz,"animated_java.format.blueprint.name":()=>OM,"animated_java.format_category.animated_java":()=>Rz,"animated_java.menubar.label":()=>SM,"animated_java.misc.failed_to_export.blueprint_settings.error_item":()=>Tz,"animated_java.misc.failed_to_export.blueprint_settings.message":()=>Az,"animated_java.misc.failed_to_export.button":()=>Cz,"animated_java.misc.failed_to_export.custom_models.message":()=>jz,"animated_java.misc.failed_to_export.invalid_rotation.message":()=>Sz,"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6":()=>Oz,"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message":()=>Dz,"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message":()=>Iz,"animated_java.misc.failed_to_export.title":()=>kz,"animated_java.panel.keyframe.easing_args.description":()=>BV,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":()=>zV,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":()=>VV,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":()=>qV,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":()=>UV,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":()=>LV,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":()=>PV,"animated_java.panel.keyframe.easing_args.title":()=>MV,"animated_java.panel.keyframe.easing_mode.description":()=>DV,"animated_java.panel.keyframe.easing_mode.options.in":()=>FV,"animated_java.panel.keyframe.easing_mode.options.inout":()=>RV,"animated_java.panel.keyframe.easing_mode.options.out":()=>NV,"animated_java.panel.keyframe.easing_mode.title":()=>IV,"animated_java.panel.keyframe.easing_type.description":()=>vV,"animated_java.panel.keyframe.easing_type.options.back":()=>SV,"animated_java.panel.keyframe.easing_type.options.bounce":()=>OV,"animated_java.panel.keyframe.easing_type.options.circ":()=>TV,"animated_java.panel.keyframe.easing_type.options.cubic":()=>EV,"animated_java.panel.keyframe.easing_type.options.elastic":()=>CV,"animated_java.panel.keyframe.easing_type.options.expo":()=>AV,"animated_java.panel.keyframe.easing_type.options.linear":()=>bV,"animated_java.panel.keyframe.easing_type.options.quad":()=>wV,"animated_java.panel.keyframe.easing_type.options.quart":()=>kV,"animated_java.panel.keyframe.easing_type.options.quint":()=>jV,"animated_java.panel.keyframe.easing_type.options.sine":()=>yV,"animated_java.panel.keyframe.easing_type.title":()=>xV,"animated_java.panel.keyframe.execute_condition.description":()=>mV,"animated_java.panel.keyframe.execute_condition.title":()=>pV,"animated_java.panel.keyframe.function.description":()=>dV,"animated_java.panel.keyframe.function.title":()=>uV,"animated_java.panel.keyframe.keyframe_title":()=>sV,"animated_java.panel.keyframe.nonlinear_interpolation":()=>HV,"animated_java.panel.keyframe.repeat.description":()=>hV,"animated_java.panel.keyframe.repeat.title":()=>fV,"animated_java.panel.keyframe.repeat_frequency.description":()=>_V,"animated_java.panel.keyframe.repeat_frequency.title":()=>gV,"animated_java.panel.keyframe.variant.description":()=>cV,"animated_java.panel.keyframe.variant.title":()=>lV,"animated_java.panel.text_display.title":()=>JV,"animated_java.panel.vanilla_block_display.description":()=>wz,"animated_java.panel.vanilla_block_display.title":()=>yz,"animated_java.panel.vanilla_item_display.description":()=>cz,"animated_java.panel.vanilla_item_display.title":()=>lz,"animated_java.panel.variants.title":()=>L9,"animated_java.panel.variants.tool.cannot_delete_default_variant":()=>G9,"animated_java.panel.variants.tool.cannot_edit_default_variant":()=>W9,"animated_java.panel.variants.tool.create_new_variant":()=>V9,"animated_java.panel.variants.tool.delete_selected_variant":()=>q9,"animated_java.panel.variants.tool.duplicate_selected_variant":()=>U9,"animated_java.panel.variants.tool.edit_variant":()=>z9,"animated_java.panel.variants.tool.variant_not_visible":()=>J9,"animated_java.panel.variants.tool.variant_visible":()=>H9,"animated_java.plugin_dialog.incompatability_notice":()=>lB,"animated_java.popup.incompatability_popup.button.disable_all":()=>oB,"animated_java.popup.incompatability_popup.button.ignore":()=>sB,"animated_java.popup.incompatability_popup.description":()=>aB,"animated_java.popup.incompatability_popup.disable_button":()=>rB,"animated_java.popup.incompatability_popup.title":()=>iB,"animated_java.popup.installed_popup.close_button":()=>nB,"animated_java.popup.installed_popup.title":()=>tB,"animated_java.popup.loading.loading":()=>QM,"animated_java.popup.loading.offline":()=>eB,"animated_java.popup.loading.success":()=>$M,"animated_java.toast.invalid_rotations":()=>Fz,"animated_java.toast.invalid_rotations_post_1_21_6":()=>Nz,"animated_java.tool.item_display.item_display.description":()=>dz,"animated_java.tool.item_display.item_display.options.firstperson_lefthand":()=>hz,"animated_java.tool.item_display.item_display.options.firstperson_righthand":()=>gz,"animated_java.tool.item_display.item_display.options.fixed":()=>bz,"animated_java.tool.item_display.item_display.options.ground":()=>vz,"animated_java.tool.item_display.item_display.options.gui":()=>xz,"animated_java.tool.item_display.item_display.options.head":()=>_z,"animated_java.tool.item_display.item_display.options.none":()=>pz,"animated_java.tool.item_display.item_display.options.thirdperson_lefthand":()=>mz,"animated_java.tool.item_display.item_display.options.thirdperson_righthand":()=>fz,"animated_java.tool.item_display.item_display.title":()=>uz,"animated_java.tool.text_display.background_color.description":()=>YV,"animated_java.tool.text_display.background_color.title":()=>KV,"animated_java.tool.text_display.copy_text.copied":()=>sz,"animated_java.tool.text_display.copy_text.description":()=>oz,"animated_java.tool.text_display.copy_text.title":()=>rz,"animated_java.tool.text_display.line_width.description":()=>WV,"animated_java.tool.text_display.line_width.title":()=>GV,"animated_java.tool.text_display.see_through.description":()=>az,"animated_java.tool.text_display.see_through.title":()=>iz,"animated_java.tool.text_display.text_alignment.description":()=>$V,"animated_java.tool.text_display.text_alignment.options.center":()=>tz,"animated_java.tool.text_display.text_alignment.options.left":()=>ez,"animated_java.tool.text_display.text_alignment.options.right":()=>nz,"animated_java.tool.text_display.text_alignment.title":()=>QV,"animated_java.tool.text_display.text_shadow.description":()=>ZV,"animated_java.tool.text_display.text_shadow.title":()=>XV,"animated_java.vanilla_item_display.title":()=>Ez,default:()=>zz});var SM="Animated Java",OM="Blueprint",IM="Blueprint Settings",DM="Documentation",FM="Changelog",NM="About",RM="Display Entity Config",MM="Locator Config",BM="Export",PM="Export (Debug)",LM="Export All",VM="Export all open Blueprint projects.",zM="Export All (Debug)",UM="Export all open Blueprint projects in debug mode.",qM="Extract",HM="Confirm Extraction",JM="Add Text Display",GM="Add Item Display",WM="Add Block Display",KM="Copy Display Entity Config",YM='Copied Display Entity Config from "{0}"',XM="Paste Display Entity Config",ZM='Pasted Display Entity Config from "{0}"',QM="Loading Animated Java...",$M="Animated Java Loaded Successfully!",eB=`Animated Java Failed to Connect! Some features may be unavailable.`,tB="Thank you for installing!",nB="Let's Get Animating!",iB="Animated Java Incompatibility Detected",aB=`You have plugins installed that are known to cause issues with Animated Java. Please disable or uninstall the following plugin(s) and restart Blockbench to use Animated Java:`,rB="Disable Plugin",oB="Disable All Incompatible Plugins",sB="Ignore and Continue (Not Recommended)",lB=`This plugin is known to cause issues with Animated Java. You will be unable to install this plugin while Animated Java is installed.`,cB="Reset to Default",uB="About Animated Java",dB="Close",pB="Animated Java Changelog",mB="An Unexpected Error Occurred!",fB="Close",hB="Error Message Copied to Clipboard!",gB="Click to copy the error message to the clipboard.",_B="Please report this error by joining our {0} and creating a thread in the #animated-java-support channel, or by creating an issue on our {1}. Thank you!",xB="Blueprint Settings",vB="Project",bB="Advanced settings should only be used if absolutely needed!",yB="Name",wB=`The Blueprint's filename. This will be overwritten if you save the Blueprint with a different name.`,EB="Texture Size",kB=`The resolution of the UV editor. This should match the size of the largest texture in your Blueprint.`,jB="Texture Size should be square if possible!",AB="Texture Size should be a power of 2 if possible!",TB="The chosen Texture Size does not match the size of the largest texture in your Blueprint!",CB="Export",SB="Namespace",OB=`The namespace to use when generating the Resource Pack and Data Pack. It is recommended to use a unique namespace to avoid conflicts with other Resource Packs and Data Packs.`,IB="The export namespace cannot be empty!",DB='The export namespace "{0}" is reserved for internal functionality! Please choose a different namespace.',FB="The export namespace contains invalid characters! Namespaces can only contain letters, numbers, and underscores.",NB="Show Render Box",RB="When enabled, the render box will be visible in the editor.",MB="Auto-Size Render Box",BB="When enabled, the render box will be automatically calculated based on the model's geometry.",PB="Render Box Size",LB="The [width and height](https://minecraft.wiki/w/Display#Entity_data) of the rig's display entities.",VB="View Range",zB="The default [view range](https://minecraft.wiki/w/Display#Entity_data) of the rig.",UB="Plugin Mode",qB="When enabled, the project will be exported as a JSON file designed for use with plugins.",HB="Resource Pack Export Mode",JB="Folder",GB="Zip",WB="None",KB="Data Pack Export Mode",YB="Folder",XB="Zip",ZB="None",QB="Target Minecraft Version",$B=`The version of Minecraft to target when exporting the project. If the version you are using is not available, select the closest version below it. E.g If you are using \`1.21.8\`, select \`1.21.5\`. Some features may be altered, or unavailable depending on the selected version. Animated Java will inform you of any changes that need to be made.`,eP="Resource Pack",tP="Advanced Settings",nP="Advanced Folders",iP="Display Item",aP=`The item to use for the rig's models. Multiple Blueprints in the same project can use the same item, and they will be merged automatically when exported.`,rP="No item selected!",oP="The provided item ID is invalid! Item IDs should be in the format `namespace:item_id`.",sP="The provided item ID is invalid! Item IDs should not contain any whitespace.",lP="The selected item does not exist in vanilla!",cP="The selected item does not use `minecraft:item/generated` as its parent. This may cause model issues in-game.",uP=`The selected item does not have a model file in the vanilla resource pack! If you believe this is an error, try restarting Blockbench, and waiting for the AJ loading popup to disappear before opening a Blueprint.`,dP="CMD Offset",pP="Offsets the Custom Model Data (CMD) values used in the display item's predicates by the specified amount.",mP="Resource Pack",fP="The root folder of a Resource Pack to export the project to.\n\nThe targeted Resource Pack must contain a `pack.mcmeta` file.",hP="The selected Resource Pack is missing an assets folder!",gP="No folder selected!",_P="The selected folder does not exist!",xP="The selected path is not a folder!",vP="The selected folder is missing a pack.mcmeta file!",bP="Resource Pack Zip",yP="The path to the .zip file to export the project to.",wP="No file selected!",EP="The selected path is not a file!",kP="Data Pack",jP="Data Pack",AP="The root folder of a Data Pack to export the project to.\n\nThe targeted Data Pack must contain a `pack.mcmeta` file.",TP="The selected Data Pack is missing a data folder!",CP="No folder selected!",SP="The selected folder does not exist!",OP="The selected path is not a folder!",IP="The selected folder is missing a pack.mcmeta file!",DP="Data Pack Zip",FP="The path to the .zip file to export the project to.",NP="No file selected!",RP="The selected path is not a file!",MP="On-Summon Function",BP="Commands to execute `as` and `at` the root entity when summoned.\n\nTreat this input as if it were a `.mcfunction` file.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",PP="On-Remove Function",LP="Commands to run `as` and `at` the root entity when removed.\n\nTreat this input as if it were a `.mcfunction` file.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",VP="Pre-Tick Function",zP="Commands to run `as` and `at` the root entity every tick *before* Animated Java's own ticking logic.\n\nTreat this input as if it were a `.mcfunction` file.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",UP="Post-Tick Function",qP="Commands to run `as` and `at` the root entity every tick *after* Animated Java's own ticking logic.\n\nTreat this input as if it were a `.mcfunction` file.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",HP="Interpolation Duration",JP=`The default [interpolation duration](https://minecraft.wiki/w/Display#Entity_data) of the rig. Higher values make animations smoother but less responsive.`,GP="Teleport Duration",WP=`The default [teleport duration](https://minecraft.wiki/w/Display#Entity_data) of the rig. Higher values make large movements smoother but less responsive.`,KP="Auto Update Rig Orientation",YP=`When **enabled**, syncs the positions and rotations of all node entities with the root entity every tick. Allowing you to simply teleport the root entity to move and rotate the entire rig. When **disabled**, you must use the move function to teleport the rig: \`\`\` execute as @e[tag=aj._root] \\ positioned rotated run \\ function animated_java:/move \`\`\` Syncing node positions and rotations every tick can be expensive, especially for large rigs. Disabling this option can improve performance at the cost of convenience.`,XP="Use Storage for Animation",ZP=`When enabled, NBT storage will be used to store animation data instead of functions. This greatly reduces the file count of the exported Data Pack, but is significantly slower.`,QP="Baked Animations",$P=`Whether or not to bake the exported animations. Baked animations have their frames pre-calculated and stored in the exported JSON file, reducing the complexity of rendering the model in-game. Some Plugins may require this to be enabled to function correctly.`,eL="JSON File",tL="The path to the JSON file to export the project to.",nL="No file selected!",iL="The selected path is not a file!",aL='Display Entity Config for "{0}"',rL="Node",oL="Per-Variant",sL="On-Summon Function",lL="Commands to run `as` the display entity when summoned.\n\nTreat this input as if it were a `.mcfunction` file.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",cL="On-Apply Function",uL="Commands to run `as` the display entity when the variant is applied.\n\nTreat this input as if it were a `.mcfunction` file.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",dL="Custom Name",pL="The custom name of the node.",mL=`Invalid JSON Text! {0}`,fL="Custom Name Visible",hL="Whether or not the custom name should always be visible.",gL="Glowing",_L="Whether or not the node should glow in-game.",xL="Override Glow Color",vL="Whether or not to override the default glow color.",bL="Glow Color",yL="The color of the glow.",wL="Shadow Radius",EL="The radius of the shadow.",kL="Shadow Strength",jL="The strength of the shadow.",AL="Override Brightness",TL="Whether or not to override the default brightness.",CL="Brightness",SL="The brightness of the node. This should be a value between 0 and 15.",OL="Use Custom Brightness",IL="Whether or not to enable the custom brightness override for the node.",DL="Custom Brightness",FL="The custom brightness of the node. This should be a value between 0 and 15.",NL="Enchanted",RL="Whether or not the node should be enchanted.",ML="Invisible",BL="Whether or not the node should be invisible.",PL="Billboard",LL=`Controls if this nodes model should pivot to face player when rendered. - **Fixed**: Both vertical and horizontal angles are fixed. - **Vertical**: Pivots around vertical axis. - **Horizontal**: Pivots around horizontal axis. - **Center**: Pivots around center point.`,VL="Fixed",zL="Vertical",UL="Horizontal",qL="Center",HL="Locator Config",JL=`Plugin Mode is enabled! Locators have no configuration in Plugin Mode. Instead, use the Plugin API to add custom functionality to your Locators. For more information, see the Official Plugin API documentation for more information.`,GL="Use Entity",WL="When enabled, the Locator will summon and use an entity to represent itself in-game.",KL="Entity Type",YL="The type of entity to attach to the Locator.",XL="Entity Type cannot be empty!",ZL="The selected entity type doesn't exist in Minecraft {0}",QL="Sync Passenger Rotation",$L="Automatically sync the rotation of the Locator's passenger entities.",e7="On-Summon Function",t7="Commands to run `as` the root entity and `at` the Locator's position when the rig is summoned.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",n7="Commands to run `as` and `at` the Locator's entity when summoned.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",i7="On-Remove Function",a7="Commands to run `as` the root entity and `at` the Locator's position when the rig is removed.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",r7="Commands to run `as` and `at` the Locator's entity when removed.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",o7="On-Tick Function",s7="Commands to run `at` the Locator's position every tick.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",l7="Commands to run `as` and `at` the Locator's entity every tick.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.",c7="Text Display Config",u7="Vanilla Item Model",d7=`If set, the bone will render as a vanilla item model. This will overwrite the bone's existing cubes.`,p7="Use NBT",m7="Whether or not to use NBT to configure the text display instead of settings.",f7="Using NBT will override all other settings, and any changes you make will not be visible in the editor. Only use this if you know what you're doing!",h7="Inherit Settings",g7="Whether or not to inherit the settings from the parent text display.",_7="Glowing",x7="Whether or not the text display should glow in-game.",v7="Override Glow Color",b7="Whether or not to override the default glow color.",y7="Glow Color",w7="The color of the glow.",E7="Shadow Radius",k7="The radius of the shadow.",j7="Shadow Strength",A7="The strength of the shadow.",T7="Override Brightness",C7="Whether or not to override the default brightness.",S7="Brightness",O7="The brightness of the text display. This should be a value between 0 and 15.",I7="Use Custom Brightness",D7="Whether or not to enable the custom brightness override for the bone.",F7="Custom Brightness",N7="The custom brightness of the bone. This should be a value between 0 and 15.",R7="Invisible",M7="Whether or not the text display should be invisible.",B7="NBT",P7="The NBT to apply to the text display.",L7="Block Display Config",V7="Custom Name",z7="The custom name of the block display.",U7=`Invalid JSON Text! {0}`,q7="Custom Name Visible",H7="Whether or not the custom name should always be visible.",J7="Item Display Config",G7="Custom Name",W7="The custom name of the item display.",K7=`Invalid JSON Text! {0}`,Y7="Custom Name Visible",X7="Whether or not the custom name should always be visible.",Z7="Variant Config",Q7="Display Name",$7="Used to identify the Variant in the editor, and in error messages.",e9="Generate Name From Display Name",t9="Whether or not to generate the Name automatically from the Display Name.",n9="Name",i9="Used to identify the Variant in the exported Resource Pack and Data Pack.",a9="Texture Map",r9="A map of which textures to swap out when applying this Variant.",o9="Create New Mapping",s9="Variant has no mapped textures.",l9=`Specify which nodes the Variant should affect. Nodes in the included list will be changed when applying the Variant. Nodes in the excluded list will remain unchanged.`,c9="Excluded Nodes",u9="A list of nodes to exclude from the Variant. These nodes will remain unchanged when applying the Variant.",d9="Included Nodes",p9="A list of nodes to include in the Variant. Only these nodes will be changed when applying the Variant.",m9="Swap Lists",f9="Update .ajmodel",h9="Update .ajmodel",g9="Select .ajmodel File",_9="Upgrade your outdated .ajmodel files to the new .ajblueprint format.",x9="Select an .ajmodel File to Upgrade",v9="Animation Properties ({0})",b9="Animation Name",y9="The name of the animation.",w9="Loop Mode",E9=`- Once: The animation will play once, then reset to the first frame. - Hold: The animation will play once and hold the last frame. - Loop: The animation will loop indefinitely.`,k9="Once",j9="Hold",A9="Loop",T9="The animation name cannot be empty!",C9="The animation name contains invalid characters! Animation names should only contain letters, numbers, underscores, and periods.",S9="Loop Delay",O9=`The number of ticks to wait before restarting the animation when in Loop mode. E.g. A value of 20 will cause the animation to wait 1 second before restarting.`,I9=`Specify which nodes the animation should affect. Nodes in the included list will be modified by the animation. Nodes in the excluded list will remain unchanged.`,D9="Excluded Nodes",F9="A list of nodes to exclude from the animation. These nodes will remain unchanged when applying the animation.",N9="Included Nodes",R9="A list of nodes to include in the animation. Only these nodes will be modified by the animation.",M9="Swap Lists",B9="Exporting...",P9="Loading Blueprint...",L9="Variants",V9="Create New Variant",z9="Edit Variant",U9="Duplicate Selected Variant",q9="Delete Selected Variant",H9="Variant Selected",J9="Variant Not Selected",G9="Cannot delete the default variant!",W9="Cannot edit the default variant!",K9="Create Variant",Y9="Duplicate Variant",X9="Open Variant Config",Z9="Delete Variant",Q9="Excluded Nodes",$9="Invert Excluded Nodes",eV="Variant",tV="Function",nV="Variant",iV="Function",aV="Execute Condition",rV="Repeat",oV="Repeat Frequency",sV="Keyframe ({0})",lV="Variant",cV="The Variant to apply to the keyframe.",uV="Function",dV=`Commands to run when the keyframe is reached. Treat this text input as if it were a \`.mcfunction\` file. Supports [MC-Build](https://mcbuild.dev) syntax.`,pV="Execute Condition",mV="A condition that must be met for the keyframe to execute.\n\nTreat this text input as if it were the condition in an `execute if` command.\n\nE.g. `if score @s myScore matches 1..`",fV="Repeat",hV="When enabled, the commands in this keyframe will repeat at the interval specified by Frequency.",gV="Frequency",_V=`Number of ticks between command repeats. Set to 1 to run every tick of the animation.`,xV="Easing Type",vV="The type of easing to apply to the keyframe.",bV="Linear",yV="Sine",wV="Quad",EV="Cubic",kV="Quart",jV="Quint",AV="Expo",TV="Circ",CV="Elastic",SV="Back",OV="Bounce",IV="Easing Mode",DV="The easing mode to apply to the keyframe.",FV="In",NV="Out",RV="In-Out",MV="Easing Args",BV="The arguments to apply to the easing function.",PV="Elasticity",LV="The elasticity of the easing function.",VV="Overshoot",zV="The amount of overshoot to apply to the easing function.",UV="Bounciness",qV="The bounciness of the easing function.",HV=`Advanced easing options are disabled. Change the keyframe's interpolation mode to 'linear' to enable them.`,JV="Text Display",GV="Line Width",WV="The width of the text display in pixels.",KV="Background Color",YV="The color of the background of the text display.",XV="Text Shadow",ZV="Whether or not to display a shadow behind the text.",QV="Text Alignment",$V="The alignment of the text.",ez="Left",tz="Center",nz="Right",iz="See Through",az="Whether or not the text display should be visible through blocks.",rz="Copy exported text component",oz="Copy the exported text component to your clipboard.",sz="Text copied to clipboard!",lz="Displayed Item",cz="The item to display.",uz="Item Display Mode",dz="Which item model transform to apply to the item (as defined in display field in model JSON).",pz="None",mz="Third Person Left Hand",fz="Third Person Right Hand",hz="First Person Left Hand",gz="First Person Right Hand",_z="Head",xz="GUI",vz="Ground",bz="Fixed",yz="Displayed Block",wz="The block to display. Supports block states!",Ez="Item Display",kz="Failed to Export",jz="You have disabled resource pack exporting, but have custom models in your project! Please enable resource pack exporting or remove the custom models before exporting.",Az="There are errors in your blueprint settings! Please fix them before exporting.",Tz="Found an issue with {0}:",Cz="Ok",Sz=`Some cubes in your model have an invalid rotations! Cubes must have a rotation of -45, -22.5, 0, 22.5, or 45 degrees, and can only be rotated on a single axis at a time when targeting Minecraft versions before 1.21.6. If you want to rotate a cube more precisely, or on multiple axes, put it in a bone and rotate the bone instead. All of the invalid cubes are outlined in red in the editor. Please fix them before exporting.`,Oz=`Some cubes in your model have an invalid rotations! Cubes can only be rotated on a single axis at a time when targeting Minecraft 1.21.6 or later. If you want to rotate a cube on multiple axes, put it in a bone and rotate the bone instead. All of the invalid cubes are outlined in red in the editor. Please fix them before exporting.`,Iz=`You have textures applied to your model, but have no custom models (Cubes) to use them! Please create some Cubes to use these textures, or remove the textures before exporting.`,Dz=`You have custom models (Cubes) in your model, but have no textures applied to them! Please apply textures to your Cubes, or remove the Cubes before exporting.`,Fz=`Invalid Cube Rotations! Cubes must have a rotation of: 45, 22.5, 0, -22.5, or -45, and can only be rotated on a single axis at a time. All cubes with invalid rotations are outlined in red.`,Nz=`Invalid Cube Rotations! Cubes can only be rotated on a single axis at a time when targeting Minecraft 1.21.6 or later. All cubes with invalid rotations are outlined in red.`,Rz="Animated Java",Mz="Fluids don't render in Block Displays.",Bz="Mob Heads don't render in Block Displays. Use an Item Display instead.",Pz='The "facing" blockstate key is not supported in Block Displays.',Lz="Blueprint Export Path Doesn't Exist",Vz=`The export path '{0}' does not exist! Make sure the folder you're saving to exists and try again.`,zz={"animated_java.menubar.label":SM,"animated_java.format.blueprint.name":OM,"animated_java.action.open_blueprint_settings.name":IM,"animated_java.action.open_documentation.name":DM,"animated_java.action.open_changelog.name":FM,"animated_java.action.open_about.name":NM,"animated_java.action.open_display_entity_config.name":RM,"animated_java.action.open_locator_config.name":MM,"animated_java.action.export.name":BM,"animated_java.action.export_debug.name":PM,"animated_java.action.export_all.name":LM,"animated_java.action.export_all.description":VM,"animated_java.action.export_all_debug.name":zM,"animated_java.action.export_all_debug.description":UM,"animated_java.action.extract.name":qM,"animated_java.action.extract.confirm":HM,"animated_java.action.create_text_display.title":JM,"animated_java.action.create_vanilla_item_display.title":GM,"animated_java.action.create_vanilla_block_display.title":WM,"animated_java.action.copy_display_entity_config.name":KM,"animated_java.action.copy_display_entity_config.message":YM,"animated_java.action.paste_display_entity_config.name":XM,"animated_java.action.paste_display_entity_config.message":ZM,"animated_java.popup.loading.loading":QM,"animated_java.popup.loading.success":$M,"animated_java.popup.loading.offline":eB,"animated_java.popup.installed_popup.title":tB,"animated_java.popup.installed_popup.close_button":nB,"animated_java.popup.incompatability_popup.title":iB,"animated_java.popup.incompatability_popup.description":aB,"animated_java.popup.incompatability_popup.disable_button":rB,"animated_java.popup.incompatability_popup.button.disable_all":oB,"animated_java.popup.incompatability_popup.button.ignore":sB,"animated_java.plugin_dialog.incompatability_notice":lB,"animated_java.dialog.reset":cB,"animated_java.dialog.about.title":uB,"animated_java.dialog.about.close_button":dB,"animated_java.dialog.changelog_dialog.title":pB,"animated_java.dialog.unexpected_error.title":mB,"animated_java.dialog.unexpected_error.close_button":fB,"animated_java.dialog.unexpected_error.copy_error_message_button.message":hB,"animated_java.dialog.unexpected_error.copy_error_message_button.description":gB,"animated_java.dialog.unexpected_error.paragraph":_B,"animated_java.dialog.blueprint_settings.title":xB,"animated_java.dialog.blueprint_settings.project_settings.title":vB,"animated_java.dialog.blueprint_settings.advanced_settings_warning":bB,"animated_java.dialog.blueprint_settings.project_name.title":yB,"animated_java.dialog.blueprint_settings.project_name.description":wB,"animated_java.dialog.blueprint_settings.texture_size.title":EB,"animated_java.dialog.blueprint_settings.texture_size.description":kB,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":jB,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":AB,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":TB,"animated_java.dialog.blueprint_settings.export_settings.title":CB,"animated_java.dialog.blueprint_settings.export_namespace.title":SB,"animated_java.dialog.blueprint_settings.export_namespace.description":OB,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":IB,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":DB,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":FB,"animated_java.dialog.blueprint_settings.show_render_box.title":NB,"animated_java.dialog.blueprint_settings.show_render_box.description":RB,"animated_java.dialog.blueprint_settings.auto_render_box.title":MB,"animated_java.dialog.blueprint_settings.auto_render_box.description":BB,"animated_java.dialog.blueprint_settings.render_box.title":PB,"animated_java.dialog.blueprint_settings.render_box.description":LB,"animated_java.dialog.blueprint_settings.view_range.title":VB,"animated_java.dialog.blueprint_settings.view_range.description":zB,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":UB,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":qB,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":HB,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder":JB,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":GB,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":WB,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":KB,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder":YB,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":XB,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":ZB,"animated_java.dialog.blueprint_settings.target_minecraft_version.title":QB,"animated_java.dialog.blueprint_settings.target_minecraft_version.description":$B,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":eP,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":tP,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title":nP,"animated_java.dialog.blueprint_settings.display_item.title":iP,"animated_java.dialog.blueprint_settings.display_item.description":aP,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":rP,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":oP,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":sP,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":lP,"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated":cP,"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found":uP,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":dP,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":pP,"animated_java.dialog.blueprint_settings.resource_pack.title":mP,"animated_java.dialog.blueprint_settings.resource_pack.description":fP,"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder":hP,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":gP,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":_P,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":xP,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":vP,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":bP,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":yP,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":wP,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":EP,"animated_java.dialog.blueprint_settings.data_pack_settings.title":kP,"animated_java.dialog.blueprint_settings.data_pack.title":jP,"animated_java.dialog.blueprint_settings.data_pack.description":AP,"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder":TP,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":CP,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":SP,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":OP,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":IP,"animated_java.dialog.blueprint_settings.data_pack_zip.title":DP,"animated_java.dialog.blueprint_settings.data_pack_zip.description":FP,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":NP,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":RP,"animated_java.dialog.blueprint_settings.on_summon_function.title":MP,"animated_java.dialog.blueprint_settings.on_summon_function.description":BP,"animated_java.dialog.blueprint_settings.on_remove_function.title":PP,"animated_java.dialog.blueprint_settings.on_remove_function.description":LP,"animated_java.dialog.blueprint_settings.on_pre_tick_function.title":VP,"animated_java.dialog.blueprint_settings.on_pre_tick_function.description":zP,"animated_java.dialog.blueprint_settings.on_post_tick_function.title":UP,"animated_java.dialog.blueprint_settings.on_post_tick_function.description":qP,"animated_java.dialog.blueprint_settings.interpolation_duration.title":HP,"animated_java.dialog.blueprint_settings.interpolation_duration.description":JP,"animated_java.dialog.blueprint_settings.teleportation_duration.title":GP,"animated_java.dialog.blueprint_settings.teleportation_duration.description":WP,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title":KP,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description":YP,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":XP,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":ZP,"animated_java.dialog.blueprint_settings.baked_animations.title":QP,"animated_java.dialog.blueprint_settings.baked_animations.description":$P,"animated_java.dialog.blueprint_settings.json_file.title":eL,"animated_java.dialog.blueprint_settings.json_file.description":tL,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":nL,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":iL,"animated_java.dialog.display_entity.title":aL,"animated_java.dialog.display_entity.node_options.title":rL,"animated_java.dialog.display_entity.per_variant_options.title":oL,"animated_java.dialog.display_entity.on_summon_function.title":sL,"animated_java.dialog.display_entity.on_summon_function.description":lL,"animated_java.dialog.display_entity.on_apply_function.title":cL,"animated_java.dialog.display_entity.on_apply_function.description":uL,"animated_java.dialog.display_entity.custom_name.title":dL,"animated_java.dialog.display_entity.custom_name.description":pL,"animated_java.dialog.display_entity.custom_name.invalid_json.error":mL,"animated_java.dialog.display_entity.custom_name_visible.title":fL,"animated_java.dialog.display_entity.custom_name_visible.description":hL,"animated_java.dialog.display_entity.glowing.title":gL,"animated_java.dialog.display_entity.glowing.description":_L,"animated_java.dialog.display_entity.override_glow_color.title":xL,"animated_java.dialog.display_entity.override_glow_color.description":vL,"animated_java.dialog.display_entity.glow_color.title":bL,"animated_java.dialog.display_entity.glow_color.description":yL,"animated_java.dialog.display_entity.shadow_radius.title":wL,"animated_java.dialog.display_entity.shadow_radius.description":EL,"animated_java.dialog.display_entity.shadow_strength.title":kL,"animated_java.dialog.display_entity.shadow_strength.description":jL,"animated_java.dialog.display_entity.override_brightness.title":AL,"animated_java.dialog.display_entity.override_brightness.description":TL,"animated_java.dialog.display_entity.brightness_override.title":CL,"animated_java.dialog.display_entity.brightness_override.description":SL,"animated_java.dialog.display_entity.use_custom_brightness.title":OL,"animated_java.dialog.display_entity.use_custom_brightness.description":IL,"animated_java.dialog.display_entity.custom_brightness.title":DL,"animated_java.dialog.display_entity.custom_brightness.description":FL,"animated_java.dialog.display_entity.enchanted.title":NL,"animated_java.dialog.display_entity.enchanted.description":RL,"animated_java.dialog.display_entity.invisible.title":ML,"animated_java.dialog.display_entity.invisible.description":BL,"animated_java.dialog.display_entity.billboard.title":PL,"animated_java.dialog.display_entity.billboard.description":LL,"animated_java.dialog.display_entity.billboard.options.fixed":VL,"animated_java.dialog.display_entity.billboard.options.vertical":zL,"animated_java.dialog.display_entity.billboard.options.horizontal":UL,"animated_java.dialog.display_entity.billboard.options.center":qL,"animated_java.dialog.locator_config.title":HL,"animated_java.dialog.locator_config.plugin_mode_warning":JL,"animated_java.dialog.locator_config.use_entity.title":GL,"animated_java.dialog.locator_config.use_entity.description":WL,"animated_java.dialog.locator_config.entity_type.title":KL,"animated_java.dialog.locator_config.entity_type.description":YL,"animated_java.dialog.locator_config.entity_type.error.empty":XL,"animated_java.dialog.locator_config.entity_type.warning.invalid":ZL,"animated_java.dialog.locator_config.sync_passenger_rotation.title":QL,"animated_java.dialog.locator_config.sync_passenger_rotation.description":$L,"animated_java.dialog.locator_config.on_summon_function.title":e7,"animated_java.dialog.locator_config.on_summon_function.description":t7,"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity":n7,"animated_java.dialog.locator_config.on_remove_function.title":i7,"animated_java.dialog.locator_config.on_remove_function.description":a7,"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity":r7,"animated_java.dialog.locator_config.on_tick_function.title":o7,"animated_java.dialog.locator_config.on_tick_function.description":s7,"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity":l7,"animated_java.dialog.text_display_config.title":c7,"animated_java.dialog.bone_config.vanilla_item_model.title":u7,"animated_java.dialog.bone_config.vanilla_item_model.description":d7,"animated_java.dialog.text_display_config.use_nbt.title":p7,"animated_java.dialog.text_display_config.use_nbt.description":m7,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":f7,"animated_java.dialog.text_display_config.inherit_settings.title":h7,"animated_java.dialog.text_display_config.inherit_settings.description":g7,"animated_java.dialog.text_display_config.glowing.title":_7,"animated_java.dialog.text_display_config.glowing.description":x7,"animated_java.dialog.text_display_config.override_glow_color.title":v7,"animated_java.dialog.text_display_config.override_glow_color.description":b7,"animated_java.dialog.text_display_config.glow_color.title":y7,"animated_java.dialog.text_display_config.glow_color.description":w7,"animated_java.dialog.text_display_config.shadow_radius.title":E7,"animated_java.dialog.text_display_config.shadow_radius.description":k7,"animated_java.dialog.text_display_config.shadow_strength.title":j7,"animated_java.dialog.text_display_config.shadow_strength.description":A7,"animated_java.dialog.text_display_config.override_brightness.title":T7,"animated_java.dialog.text_display_config.override_brightness.description":C7,"animated_java.dialog.text_display_config.brightness_override.title":S7,"animated_java.dialog.text_display_config.brightness_override.description":O7,"animated_java.dialog.text_display_config.use_custom_brightness.title":I7,"animated_java.dialog.text_display_config.use_custom_brightness.description":D7,"animated_java.dialog.text_display_config.custom_brightness.title":F7,"animated_java.dialog.text_display_config.custom_brightness.description":N7,"animated_java.dialog.text_display_config.invisible.title":R7,"animated_java.dialog.text_display_config.invisible.description":M7,"animated_java.dialog.text_display_config.nbt.title":B7,"animated_java.dialog.text_display_config.nbt.description":P7,"animated_java.dialog.vanilla_block_display_config.title":L7,"animated_java.dialog.vanilla_block_display.custom_name.title":V7,"animated_java.dialog.vanilla_block_display.custom_name.description":z7,"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error":U7,"animated_java.dialog.vanilla_block_display.custom_name_visible.title":q7,"animated_java.dialog.vanilla_block_display.custom_name_visible.description":H7,"animated_java.dialog.vanilla_item_display_config.title":J7,"animated_java.dialog.vanilla_item_display.custom_name.title":G7,"animated_java.dialog.vanilla_item_display.custom_name.description":W7,"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error":K7,"animated_java.dialog.vanilla_item_display.custom_name_visible.title":Y7,"animated_java.dialog.vanilla_item_display.custom_name_visible.description":X7,"animated_java.dialog.variant_config.title":Z7,"animated_java.dialog.variant_config.variant_display_name":Q7,"animated_java.dialog.variant_config.variant_display_name.description":$7,"animated_java.dialog.variant_config.generate_name_from_display_name":e9,"animated_java.dialog.variant_config.generate_name_from_display_name.description":t9,"animated_java.dialog.variant_config.variant_name":n9,"animated_java.dialog.variant_config.variant_name.description":i9,"animated_java.dialog.variant_config.texture_map.title":a9,"animated_java.dialog.variant_config.texture_map.description":r9,"animated_java.dialog.variant_config.texture_map.create_new_mapping":o9,"animated_java.dialog.variant_config.texture_map.no_mappings":s9,"animated_java.dialog.variant_config.bone_lists.description":l9,"animated_java.dialog.variant_config.excluded_nodes.title":c9,"animated_java.dialog.variant_config.excluded_nodes.description":u9,"animated_java.dialog.variant_config.included_nodes.title":d9,"animated_java.dialog.variant_config.included_nodes.description":p9,"animated_java.dialog.variant_config.swap_columns_button.tooltip":m9,"animated_java.action.upgrade_old_aj_model_loader.name":f9,"animated_java.dialog.upgrade_old_aj_model_loader.title":h9,"animated_java.action.upgrade_old_aj_model_loader.select_file":g9,"animated_java.action.upgrade_old_aj_model_loader.body":_9,"animated_java.action.upgrade_old_aj_model_loader.button":x9,"animated_java.dialog.animation_properties.title":v9,"animated_java.dialog.animation_properties.animation_name.title":b9,"animated_java.dialog.animation_properties.animation_name.description":y9,"animated_java.dialog.animation_properties.loop_mode.title":w9,"animated_java.dialog.animation_properties.loop_mode.description":E9,"animated_java.dialog.animation_properties.loop_mode.options.once":k9,"animated_java.dialog.animation_properties.loop_mode.options.hold":j9,"animated_java.dialog.animation_properties.loop_mode.options.loop":A9,"animated_java.dialog.animation_properties.animation_name.error.empty":T9,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":C9,"animated_java.dialog.animation_properties.loop_delay.title":S9,"animated_java.dialog.animation_properties.loop_delay.description":O9,"animated_java.dialog.animation_properties.bone_lists.description":I9,"animated_java.dialog.animation_properties.excluded_nodes.title":D9,"animated_java.dialog.animation_properties.excluded_nodes.description":F9,"animated_java.dialog.animation_properties.included_nodes.title":N9,"animated_java.dialog.animation_properties.included_nodes.description":R9,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":M9,"animated_java.dialog.export_progress.title":B9,"animated_java.dialog.blueprint_loading.title":P9,"animated_java.panel.variants.title":L9,"animated_java.panel.variants.tool.create_new_variant":V9,"animated_java.panel.variants.tool.edit_variant":z9,"animated_java.panel.variants.tool.duplicate_selected_variant":U9,"animated_java.panel.variants.tool.delete_selected_variant":q9,"animated_java.panel.variants.tool.variant_visible":H9,"animated_java.panel.variants.tool.variant_not_visible":J9,"animated_java.panel.variants.tool.cannot_delete_default_variant":G9,"animated_java.panel.variants.tool.cannot_edit_default_variant":W9,"animated_java.action.variants.create":K9,"animated_java.action.variants.duplicate":Y9,"animated_java.action.variants.open_config":X9,"animated_java.action.variants.delete":Z9,"animated_java.animation.excluded_nodes":Q9,"animated_java.animation.invert_excluded_nodes":$9,"animated_java.effect_animator.timeline.variant":eV,"animated_java.effect_animator.timeline.function":tV,"animated_java.effect_animator.keyframe_data_point.variant":nV,"animated_java.effect_animator.keyframe_data_point.function":iV,"animated_java.effect_animator.keyframe_data_point.execute_condition":aV,"animated_java.effect_animator.keyframe_data_point.repeat":rV,"animated_java.effect_animator.keyframe_data_point.repeat_frequency":oV,"animated_java.panel.keyframe.keyframe_title":sV,"animated_java.panel.keyframe.variant.title":lV,"animated_java.panel.keyframe.variant.description":cV,"animated_java.panel.keyframe.function.title":uV,"animated_java.panel.keyframe.function.description":dV,"animated_java.panel.keyframe.execute_condition.title":pV,"animated_java.panel.keyframe.execute_condition.description":mV,"animated_java.panel.keyframe.repeat.title":fV,"animated_java.panel.keyframe.repeat.description":hV,"animated_java.panel.keyframe.repeat_frequency.title":gV,"animated_java.panel.keyframe.repeat_frequency.description":_V,"animated_java.panel.keyframe.easing_type.title":xV,"animated_java.panel.keyframe.easing_type.description":vV,"animated_java.panel.keyframe.easing_type.options.linear":bV,"animated_java.panel.keyframe.easing_type.options.sine":yV,"animated_java.panel.keyframe.easing_type.options.quad":wV,"animated_java.panel.keyframe.easing_type.options.cubic":EV,"animated_java.panel.keyframe.easing_type.options.quart":kV,"animated_java.panel.keyframe.easing_type.options.quint":jV,"animated_java.panel.keyframe.easing_type.options.expo":AV,"animated_java.panel.keyframe.easing_type.options.circ":TV,"animated_java.panel.keyframe.easing_type.options.elastic":CV,"animated_java.panel.keyframe.easing_type.options.back":SV,"animated_java.panel.keyframe.easing_type.options.bounce":OV,"animated_java.panel.keyframe.easing_mode.title":IV,"animated_java.panel.keyframe.easing_mode.description":DV,"animated_java.panel.keyframe.easing_mode.options.in":FV,"animated_java.panel.keyframe.easing_mode.options.out":NV,"animated_java.panel.keyframe.easing_mode.options.inout":RV,"animated_java.panel.keyframe.easing_args.title":MV,"animated_java.panel.keyframe.easing_args.description":BV,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":PV,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":LV,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":VV,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":zV,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":UV,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":qV,"animated_java.panel.keyframe.nonlinear_interpolation":HV,"animated_java.panel.text_display.title":JV,"animated_java.tool.text_display.line_width.title":GV,"animated_java.tool.text_display.line_width.description":WV,"animated_java.tool.text_display.background_color.title":KV,"animated_java.tool.text_display.background_color.description":YV,"animated_java.tool.text_display.text_shadow.title":XV,"animated_java.tool.text_display.text_shadow.description":ZV,"animated_java.tool.text_display.text_alignment.title":QV,"animated_java.tool.text_display.text_alignment.description":$V,"animated_java.tool.text_display.text_alignment.options.left":ez,"animated_java.tool.text_display.text_alignment.options.center":tz,"animated_java.tool.text_display.text_alignment.options.right":nz,"animated_java.tool.text_display.see_through.title":iz,"animated_java.tool.text_display.see_through.description":az,"animated_java.tool.text_display.copy_text.title":rz,"animated_java.tool.text_display.copy_text.description":oz,"animated_java.tool.text_display.copy_text.copied":sz,"animated_java.panel.vanilla_item_display.title":lz,"animated_java.panel.vanilla_item_display.description":cz,"animated_java.tool.item_display.item_display.title":uz,"animated_java.tool.item_display.item_display.description":dz,"animated_java.tool.item_display.item_display.options.none":pz,"animated_java.tool.item_display.item_display.options.thirdperson_lefthand":mz,"animated_java.tool.item_display.item_display.options.thirdperson_righthand":fz,"animated_java.tool.item_display.item_display.options.firstperson_lefthand":hz,"animated_java.tool.item_display.item_display.options.firstperson_righthand":gz,"animated_java.tool.item_display.item_display.options.head":_z,"animated_java.tool.item_display.item_display.options.gui":xz,"animated_java.tool.item_display.item_display.options.ground":vz,"animated_java.tool.item_display.item_display.options.fixed":bz,"animated_java.panel.vanilla_block_display.title":yz,"animated_java.panel.vanilla_block_display.description":wz,"animated_java.vanilla_item_display.title":Ez,"animated_java.misc.failed_to_export.title":kz,"animated_java.misc.failed_to_export.custom_models.message":jz,"animated_java.misc.failed_to_export.blueprint_settings.message":Az,"animated_java.misc.failed_to_export.blueprint_settings.error_item":Tz,"animated_java.misc.failed_to_export.button":Cz,"animated_java.misc.failed_to_export.invalid_rotation.message":Sz,"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6":Oz,"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message":Iz,"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message":Dz,"animated_java.toast.invalid_rotations":Fz,"animated_java.toast.invalid_rotations_post_1_21_6":Nz,"animated_java.format_category.animated_java":Rz,"animated_java.block_model_manager.fluid_warning":Mz,"animated_java.block_model_manager.mob_head_warning":Bz,"animated_java.block_model_manager.facing_warning":Pz,"animated_java.error.blueprint_export_path_doesnt_exist.title":Lz,"animated_java.error.blueprint_export_path_doesnt_exist.description":Vz};var jg={};vn(jg,{"animated_java.action.create_text_display.title":()=>Yz,"animated_java.action.create_vanilla_block_display.title":()=>Zz,"animated_java.action.create_vanilla_item_display.title":()=>Xz,"animated_java.action.export.name":()=>Kz,"animated_java.action.open_about.name":()=>Hz,"animated_java.action.open_blueprint_settings.name":()=>Uz,"animated_java.action.open_bone_config.name":()=>Jz,"animated_java.action.open_documentation.name":()=>qz,"animated_java.action.open_locator_config.name":()=>Gz,"animated_java.action.open_text_display_config.name":()=>Wz,"animated_java.action.open_vanilla_block_display_config.name":()=>$z,"animated_java.action.open_vanilla_item_display_config.name":()=>Qz,"animated_java.action.upgrade_old_aj_model_loader.body":()=>HJ,"animated_java.action.upgrade_old_aj_model_loader.button":()=>JJ,"animated_java.action.upgrade_old_aj_model_loader.name":()=>zJ,"animated_java.action.upgrade_old_aj_model_loader.select_file":()=>qJ,"animated_java.action.variants.create":()=>vG,"animated_java.action.variants.delete":()=>wG,"animated_java.action.variants.duplicate":()=>bG,"animated_java.action.variants.open_config":()=>yG,"animated_java.animation.excluded_nodes":()=>EG,"animated_java.animation.invert_excluded_nodes":()=>kG,"animated_java.block_model_manager.mob_head_warning":()=>MW,"animated_java.dialog.about.close_button":()=>aU,"animated_java.dialog.about.title":()=>iU,"animated_java.dialog.animation_properties.animation_name.description":()=>KJ,"animated_java.dialog.animation_properties.animation_name.error.empty":()=>eG,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":()=>tG,"animated_java.dialog.animation_properties.animation_name.title":()=>WJ,"animated_java.dialog.animation_properties.bone_lists.description":()=>aG,"animated_java.dialog.animation_properties.excluded_nodes.description":()=>oG,"animated_java.dialog.animation_properties.excluded_nodes.title":()=>rG,"animated_java.dialog.animation_properties.included_nodes.description":()=>lG,"animated_java.dialog.animation_properties.included_nodes.title":()=>sG,"animated_java.dialog.animation_properties.loop_delay.description":()=>iG,"animated_java.dialog.animation_properties.loop_delay.title":()=>nG,"animated_java.dialog.animation_properties.loop_mode.description":()=>XJ,"animated_java.dialog.animation_properties.loop_mode.options.hold":()=>QJ,"animated_java.dialog.animation_properties.loop_mode.options.loop":()=>$J,"animated_java.dialog.animation_properties.loop_mode.options.once":()=>ZJ,"animated_java.dialog.animation_properties.loop_mode.title":()=>YJ,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":()=>cG,"animated_java.dialog.animation_properties.title":()=>GJ,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist":()=>fq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected":()=>mq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file":()=>hq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description":()=>_q,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist":()=>vq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected":()=>xq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder":()=>bq,"animated_java.dialog.blueprint_settings.advanced_settings_warning":()=>dU,"animated_java.dialog.blueprint_settings.auto_bounding_box.description":()=>VU,"animated_java.dialog.blueprint_settings.auto_bounding_box.title":()=>LU,"animated_java.dialog.blueprint_settings.baked_animations.description":()=>Gq,"animated_java.dialog.blueprint_settings.baked_animations.title":()=>Jq,"animated_java.dialog.blueprint_settings.blueprint_name.description":()=>mU,"animated_java.dialog.blueprint_settings.blueprint_name.title":()=>pU,"animated_java.dialog.blueprint_settings.bounding_box.description":()=>UU,"animated_java.dialog.blueprint_settings.bounding_box.title":()=>zU,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":()=>$U,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":()=>QU,"animated_java.dialog.blueprint_settings.data_pack.description":()=>Tq,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":()=>Sq,"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder":()=>Dq,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":()=>Iq,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":()=>Cq,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":()=>Oq,"animated_java.dialog.blueprint_settings.data_pack.title":()=>Aq,"animated_java.dialog.blueprint_settings.data_pack_export_mode.description":()=>FU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":()=>MU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw":()=>NU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":()=>RU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":()=>DU,"animated_java.dialog.blueprint_settings.data_pack_settings.title":()=>Eq,"animated_java.dialog.blueprint_settings.data_pack_zip.description":()=>Nq,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":()=>Rq,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":()=>Mq,"animated_java.dialog.blueprint_settings.data_pack_zip.title":()=>Fq,"animated_java.dialog.blueprint_settings.display_item.description":()=>WU,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":()=>YU,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":()=>XU,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":()=>KU,"animated_java.dialog.blueprint_settings.display_item.title":()=>GU,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":()=>ZU,"animated_java.dialog.blueprint_settings.display_item_path.description":()=>pq,"animated_java.dialog.blueprint_settings.display_item_path.title":()=>dq,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description":()=>jq,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title":()=>kq,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description":()=>JU,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":()=>HU,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":()=>AU,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":()=>jU,"animated_java.dialog.blueprint_settings.export_namespace.description":()=>yU,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":()=>wU,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":()=>kU,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":()=>EU,"animated_java.dialog.blueprint_settings.export_namespace.title":()=>bU,"animated_java.dialog.blueprint_settings.export_settings.title":()=>vU,"animated_java.dialog.blueprint_settings.interpolation_duration.description":()=>Vq,"animated_java.dialog.blueprint_settings.interpolation_duration.title":()=>Lq,"animated_java.dialog.blueprint_settings.json_file.description":()=>Kq,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":()=>Yq,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":()=>Xq,"animated_java.dialog.blueprint_settings.json_file.title":()=>Wq,"animated_java.dialog.blueprint_settings.model_folder.title":()=>gq,"animated_java.dialog.blueprint_settings.resource_pack.description":()=>tq,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":()=>iq,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder":()=>oq,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":()=>rq,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":()=>nq,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":()=>aq,"animated_java.dialog.blueprint_settings.resource_pack.title":()=>eq,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description":()=>CU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":()=>IU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw":()=>SU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":()=>OU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":()=>TU,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":()=>qU,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":()=>lq,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":()=>cq,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":()=>uq,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":()=>sq,"animated_java.dialog.blueprint_settings.show_bounding_box.description":()=>PU,"animated_java.dialog.blueprint_settings.show_bounding_box.title":()=>BU,"animated_java.dialog.blueprint_settings.summon_commands.description":()=>Pq,"animated_java.dialog.blueprint_settings.summon_commands.title":()=>Bq,"animated_java.dialog.blueprint_settings.teleportation_duration.description":()=>Uq,"animated_java.dialog.blueprint_settings.teleportation_duration.title":()=>zq,"animated_java.dialog.blueprint_settings.texture_folder.description":()=>wq,"animated_java.dialog.blueprint_settings.texture_folder.title":()=>yq,"animated_java.dialog.blueprint_settings.texture_size.description":()=>hU,"animated_java.dialog.blueprint_settings.texture_size.title":()=>fU,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":()=>xU,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":()=>_U,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":()=>gU,"animated_java.dialog.blueprint_settings.title":()=>uU,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":()=>Hq,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":()=>qq,"animated_java.dialog.bone_config.billboard.description":()=>SH,"animated_java.dialog.bone_config.billboard.options.center":()=>FH,"animated_java.dialog.bone_config.billboard.options.fixed":()=>OH,"animated_java.dialog.bone_config.billboard.options.horizontal":()=>DH,"animated_java.dialog.bone_config.billboard.options.vertical":()=>IH,"animated_java.dialog.bone_config.billboard.title":()=>CH,"animated_java.dialog.bone_config.brightness_override.description":()=>vH,"animated_java.dialog.bone_config.brightness_override.title":()=>xH,"animated_java.dialog.bone_config.default_variant_subtitle":()=>$q,"animated_java.dialog.bone_config.enchanted.description":()=>yH,"animated_java.dialog.bone_config.enchanted.title":()=>bH,"animated_java.dialog.bone_config.glow_color.description":()=>dH,"animated_java.dialog.bone_config.glow_color.title":()=>uH,"animated_java.dialog.bone_config.glowing.description":()=>sH,"animated_java.dialog.bone_config.glowing.title":()=>oH,"animated_java.dialog.bone_config.inherit_settings.description":()=>rH,"animated_java.dialog.bone_config.inherit_settings.title":()=>aH,"animated_java.dialog.bone_config.invisible.description":()=>EH,"animated_java.dialog.bone_config.invisible.title":()=>wH,"animated_java.dialog.bone_config.nbt.description":()=>jH,"animated_java.dialog.bone_config.nbt.invalid_nbt.error":()=>TH,"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound":()=>AH,"animated_java.dialog.bone_config.nbt.title":()=>kH,"animated_java.dialog.bone_config.override_brightness.description":()=>_H,"animated_java.dialog.bone_config.override_brightness.title":()=>gH,"animated_java.dialog.bone_config.override_glow_color.description":()=>cH,"animated_java.dialog.bone_config.override_glow_color.title":()=>lH,"animated_java.dialog.bone_config.selected_variant":()=>Qq,"animated_java.dialog.bone_config.selected_variant_subtitle":()=>eH,"animated_java.dialog.bone_config.shadow_radius.description":()=>mH,"animated_java.dialog.bone_config.shadow_radius.title":()=>pH,"animated_java.dialog.bone_config.shadow_strength.description":()=>hH,"animated_java.dialog.bone_config.shadow_strength.title":()=>fH,"animated_java.dialog.bone_config.title":()=>Zq,"animated_java.dialog.bone_config.use_nbt.description":()=>nH,"animated_java.dialog.bone_config.use_nbt.title":()=>tH,"animated_java.dialog.bone_config.use_nbt.use_nbt_warning":()=>iH,"animated_java.dialog.bone_config.vanilla_item_model.description":()=>KH,"animated_java.dialog.bone_config.vanilla_item_model.title":()=>WH,"animated_java.dialog.export_progress.title":()=>uG,"animated_java.dialog.locator_config.entity_type.description":()=>LH,"animated_java.dialog.locator_config.entity_type.error.empty":()=>VH,"animated_java.dialog.locator_config.entity_type.title":()=>PH,"animated_java.dialog.locator_config.entity_type.warning.invalid":()=>zH,"animated_java.dialog.locator_config.plugin_mode_warning":()=>RH,"animated_java.dialog.locator_config.summon_commands.description":()=>qH,"animated_java.dialog.locator_config.summon_commands.title":()=>UH,"animated_java.dialog.locator_config.ticking_commands.description":()=>JH,"animated_java.dialog.locator_config.ticking_commands.title":()=>HH,"animated_java.dialog.locator_config.title":()=>NH,"animated_java.dialog.locator_config.use_entity.description":()=>BH,"animated_java.dialog.locator_config.use_entity.title":()=>MH,"animated_java.dialog.text_display_config.billboard.description":()=>vJ,"animated_java.dialog.text_display_config.billboard.options.center":()=>EJ,"animated_java.dialog.text_display_config.billboard.options.fixed":()=>bJ,"animated_java.dialog.text_display_config.billboard.options.horizontal":()=>wJ,"animated_java.dialog.text_display_config.billboard.options.vertical":()=>yJ,"animated_java.dialog.text_display_config.billboard.title":()=>xJ,"animated_java.dialog.text_display_config.brightness_override.description":()=>mJ,"animated_java.dialog.text_display_config.brightness_override.title":()=>pJ,"animated_java.dialog.text_display_config.glow_color.description":()=>rJ,"animated_java.dialog.text_display_config.glow_color.title":()=>aJ,"animated_java.dialog.text_display_config.glowing.description":()=>tJ,"animated_java.dialog.text_display_config.glowing.title":()=>eJ,"animated_java.dialog.text_display_config.inherit_settings.description":()=>$H,"animated_java.dialog.text_display_config.inherit_settings.title":()=>QH,"animated_java.dialog.text_display_config.invisible.description":()=>hJ,"animated_java.dialog.text_display_config.invisible.title":()=>fJ,"animated_java.dialog.text_display_config.nbt.description":()=>_J,"animated_java.dialog.text_display_config.nbt.title":()=>gJ,"animated_java.dialog.text_display_config.override_brightness.description":()=>dJ,"animated_java.dialog.text_display_config.override_brightness.title":()=>uJ,"animated_java.dialog.text_display_config.override_glow_color.description":()=>iJ,"animated_java.dialog.text_display_config.override_glow_color.title":()=>nJ,"animated_java.dialog.text_display_config.shadow_radius.description":()=>sJ,"animated_java.dialog.text_display_config.shadow_radius.title":()=>oJ,"animated_java.dialog.text_display_config.shadow_strength.description":()=>cJ,"animated_java.dialog.text_display_config.shadow_strength.title":()=>lJ,"animated_java.dialog.text_display_config.title":()=>GH,"animated_java.dialog.text_display_config.use_nbt.description":()=>XH,"animated_java.dialog.text_display_config.use_nbt.title":()=>YH,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":()=>ZH,"animated_java.dialog.unexpected_error.close_button":()=>oU,"animated_java.dialog.unexpected_error.copy_error_message_button.description":()=>lU,"animated_java.dialog.unexpected_error.copy_error_message_button.message":()=>sU,"animated_java.dialog.unexpected_error.paragraph":()=>cU,"animated_java.dialog.unexpected_error.title":()=>rU,"animated_java.dialog.upgrade_old_aj_model_loader.title":()=>UJ,"animated_java.dialog.variant_config.bone_lists.description":()=>RJ,"animated_java.dialog.variant_config.excluded_nodes.description":()=>BJ,"animated_java.dialog.variant_config.excluded_nodes.title":()=>MJ,"animated_java.dialog.variant_config.generate_name_from_display_name":()=>TJ,"animated_java.dialog.variant_config.generate_name_from_display_name.description":()=>CJ,"animated_java.dialog.variant_config.included_nodes.description":()=>LJ,"animated_java.dialog.variant_config.included_nodes.title":()=>PJ,"animated_java.dialog.variant_config.swap_columns_button.tooltip":()=>VJ,"animated_java.dialog.variant_config.texture_map.create_new_mapping":()=>FJ,"animated_java.dialog.variant_config.texture_map.description":()=>DJ,"animated_java.dialog.variant_config.texture_map.no_mappings":()=>NJ,"animated_java.dialog.variant_config.texture_map.title":()=>IJ,"animated_java.dialog.variant_config.title":()=>kJ,"animated_java.dialog.variant_config.variant_display_name":()=>jJ,"animated_java.dialog.variant_config.variant_display_name.description":()=>AJ,"animated_java.dialog.variant_config.variant_name":()=>SJ,"animated_java.dialog.variant_config.variant_name.description":()=>OJ,"animated_java.effect_animator.keyframes.commands":()=>CG,"animated_java.effect_animator.keyframes.execute_condition":()=>SG,"animated_java.effect_animator.keyframes.variant":()=>TG,"animated_java.effect_animator.timeline.commands":()=>AG,"animated_java.effect_animator.timeline.variant":()=>jG,"animated_java.error.blueprint_export_path_doesnt_exist.description":()=>PW,"animated_java.error.blueprint_export_path_doesnt_exist.title":()=>BW,"animated_java.format_category.animated_java":()=>RW,"animated_java.misc.failed_to_export.blueprint_settings.error_item":()=>FW,"animated_java.misc.failed_to_export.blueprint_settings.message":()=>DW,"animated_java.misc.failed_to_export.button":()=>NW,"animated_java.misc.failed_to_export.custom_models.message":()=>IW,"animated_java.misc.failed_to_export.title":()=>OW,"animated_java.panel.keyframe.commands.description":()=>NG,"animated_java.panel.keyframe.commands.title":()=>FG,"animated_java.panel.keyframe.easing_args.description":()=>oW,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":()=>uW,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":()=>cW,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":()=>pW,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":()=>dW,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":()=>lW,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":()=>sW,"animated_java.panel.keyframe.easing_args.title":()=>rW,"animated_java.panel.keyframe.easing_mode.description":()=>tW,"animated_java.panel.keyframe.easing_mode.options.in":()=>nW,"animated_java.panel.keyframe.easing_mode.options.inout":()=>aW,"animated_java.panel.keyframe.easing_mode.options.out":()=>iW,"animated_java.panel.keyframe.easing_mode.title":()=>eW,"animated_java.panel.keyframe.easing_type.description":()=>UG,"animated_java.panel.keyframe.easing_type.options.back":()=>QG,"animated_java.panel.keyframe.easing_type.options.bounce":()=>$G,"animated_java.panel.keyframe.easing_type.options.circ":()=>XG,"animated_java.panel.keyframe.easing_type.options.cubic":()=>GG,"animated_java.panel.keyframe.easing_type.options.elastic":()=>ZG,"animated_java.panel.keyframe.easing_type.options.expo":()=>YG,"animated_java.panel.keyframe.easing_type.options.linear":()=>qG,"animated_java.panel.keyframe.easing_type.options.quad":()=>JG,"animated_java.panel.keyframe.easing_type.options.quart":()=>WG,"animated_java.panel.keyframe.easing_type.options.quint":()=>KG,"animated_java.panel.keyframe.easing_type.options.sine":()=>HG,"animated_java.panel.keyframe.easing_type.title":()=>zG,"animated_java.panel.keyframe.execute_condition.description":()=>MG,"animated_java.panel.keyframe.execute_condition.title":()=>RG,"animated_java.panel.keyframe.keyframe_title":()=>OG,"animated_java.panel.keyframe.repeat.description":()=>PG,"animated_java.panel.keyframe.repeat.title":()=>BG,"animated_java.panel.keyframe.repeat_frequency.description":()=>VG,"animated_java.panel.keyframe.repeat_frequency.title":()=>LG,"animated_java.panel.keyframe.variant.description":()=>DG,"animated_java.panel.keyframe.variant.title":()=>IG,"animated_java.panel.text_display.title":()=>mW,"animated_java.panel.vanilla_block_display.description":()=>CW,"animated_java.panel.vanilla_block_display.title":()=>TW,"animated_java.panel.vanilla_item_display.description":()=>AW,"animated_java.panel.vanilla_item_display.title":()=>jW,"animated_java.panel.variants.title":()=>dG,"animated_java.panel.variants.tool.cannot_delete_default_variant":()=>xG,"animated_java.panel.variants.tool.create_new_variant":()=>pG,"animated_java.panel.variants.tool.delete_selected_variant":()=>hG,"animated_java.panel.variants.tool.duplicate_selected_variant":()=>fG,"animated_java.panel.variants.tool.edit_variant":()=>mG,"animated_java.panel.variants.tool.variant_not_visible":()=>_G,"animated_java.panel.variants.tool.variant_visible":()=>gG,"animated_java.popup.loading.loading":()=>eU,"animated_java.popup.loading.offline":()=>nU,"animated_java.popup.loading.success":()=>tU,"animated_java.tool.text_display.background_color.description":()=>_W,"animated_java.tool.text_display.background_color.title":()=>gW,"animated_java.tool.text_display.line_width.description":()=>hW,"animated_java.tool.text_display.line_width.title":()=>fW,"animated_java.tool.text_display.text_alignment.description":()=>yW,"animated_java.tool.text_display.text_alignment.options.center":()=>EW,"animated_java.tool.text_display.text_alignment.options.left":()=>wW,"animated_java.tool.text_display.text_alignment.options.right":()=>kW,"animated_java.tool.text_display.text_alignment.title":()=>bW,"animated_java.tool.text_display.text_shadow.description":()=>vW,"animated_java.tool.text_display.text_shadow.title":()=>xW,"animated_java.vanilla_item_display.title":()=>SW,default:()=>LW});var Uz="Blauwdruk Instellingen",qz="Documentatie",Hz="Over",Jz="Bot Configuratie",Gz="Locator Configuratie",Wz="Tekstweergave Configuratie",Kz="Exporteren",Yz="Voeg Tekstweergave toe",Xz="Voeg Vanilla Voorwerpweergave toe",Zz="Voeg Vanilla Blokweergave toe",Qz="Vanilla Voorwerpweergave Configuratie",$z="Vanilla Blokweergave Configuratie",eU="Animated Java Laden...",tU="Animated Java succesvol geladen!",nU=`Animated Java Kon niet Verbinden! Sommige functies zijn mogelijk niet beschikbaar.`,iU="Over Animated Java",aU="Sluiten",rU="Er Is Een Onverwachte Fout Opgetreden!",oU="Sluiten",sU="Foutmelding Gekopieerd naar klembord!",lU="Klik op om de foutmelding naar het klembord te kopi\xEBren.",cU="Meld deze fout door lid te worden van onze {0} en een thread te maken in het #animated-java-support kanaal, of door een probleem aan te maken op onze {1}. Bedankt!",uU="Blauwdruk Instellingen",dU="Geavanceerde instellingen moeten alleen worden gebruikt als het echt nodig is!",pU="Blauwdruk Naam",mU="De naam van de Blauwdruk. Wordt alleen gebruikt om het project in de werkruimte te identificeren.",fU="Textuurgrootte",hU="De resolutie van de UV-editor. Deze moet dezelfde grootte hebben als de grootste textuur. Voor het beste resultaat gebruik je een vierkante textuur en zorg je ervoor dat de grootte een macht van 2 is.",gU="De Textuurgrootte moet vierkant zijn voor de beste resultaten.",_U="De Textuurgrootte moet een macht van 2 zijn voor de beste resultaten.",xU="De Textuurgrootte moet overeenkomen met de grootte van de grootste textuur.",vU="Exportinstellingen",bU="Export Namespace",yU="De Namespace om het project naar te exporteren. Dit is de Namespace die zal worden gebruikt in de ge\xEBxporteerde Resource Pack en Data Pack.",wU="De export namespace Mag niet leeg zijn!",EU='De export namespace "{0}" is gereserveerd voor interne functionaliteit! Kies een andere namespace.',kU="De export namespace bevat ongeldige tekens! Namespaces kunnen alleen letters, cijfers en underscores bevatten.",jU="Plugin-Modus",AU="Plugin-modus wel of niet inschakelen. Inschakelen als je van plan bent om een plugin-gebaseerde oplossing te gebruiken in plaats van een Resource Pack en/of Data Pack.",TU="Resource Pack Export Modus",CU=`Bepaalt hoe de Resource Pack moet worden ge\xEBxporteerd. Raw - Exporteert de Resource Pack als een map. Zip - Exporteert de Resource Pack als een .zip bestand. None - Schakelt het exporteren van Resource Packs uit.`,SU="Raw",OU="Zip",IU="None",DU="Data Pack Export Modus",FU=`Bepaalt hoe de Data Pack moet worden ge\xEBxporteerd. Raw - Exporteert de Data Pack als een map. Zip - Exporteert de Data Pack als een .zip bestand. None - Schakelt het exporteren van Data Packs uit.`,NU="Raw",RU="Zip",MU="None",BU="Toon Bounding Box",PU="Of de bounding box wel of niet moet worden weergegeven in de editor.",LU="Auto Bounding Box",VU=`Wel of niet automatisch de bounding box berekenen op basis van de geometrie van het model. OPMERKING: de automatische bounding box houdt GEEN rekening met botoffsets van animaties, dus de bounding box kan in sommige gevallen kleiner zijn dan nodig.`,zU="Bounding Box",UU="Bepaalt de culling box van het model. Het model stopt met renderen wanneer deze box buiten het scherm valt.",qU="Resource Pack Instellingen",HU="Geavanceerde Instellingen Gebruiken",JU="Of de geavanceerde instellingen voor Resource Packs wel of niet moeten worden ingeschakeld.",GU="Weergave Voorwerp",WU="Het voorwerp om de Blauwdruk-modellen in het spel weer te geven. Meerdere Blauwdrukken kunnen op hetzelfde voorwerp worden geplaatst en ze worden automatisch samengevoegd.",KU="Geen voorwerp geselecteerd!",YU="Het opgegeven voorwerp-ID is ongeldig! Voorwerp ID's moeten het formaat namespace:voorwerp_id hebben.",XU="Het opgegeven voorwerp-ID is ongeldig! Voorwerp ID's mogen geen spaties bevatten.",ZU="Het geselecteerde voorwerp bestaat niet in vanilla!",QU="CMD Offset",$U="De offset die moet worden gebruikt voor de Custom Model Data van het weergave voorwerp. Staat meerdere blauwdrukken op hetzelfde voorwerp toe, maar in afzonderlijke, niet-aangesloten Resource Packs.",eq="Resource Pack",tq="De hoofdmap van de Resource Pack waarnaar het project moet worden ge\xEBxporteerd.",nq="Geen map geselecteerd!",iq="De geselecteerde map bestaat niet!",aq="Het geselecteerde pad is geen map!",rq="De geselecteerde map mist een pack.mcmeta bestand!",oq="De geselecteerde Resource Pack mist een assets map!",sq="Resource Pack Zip",lq="Het pad naar het .zip-bestand om het project naar te exporteren.",cq="Geen bestand geselecteerd!",uq="Het geselecteerde pad is geen bestand!",dq="Display Item Pad",pq="Waar het Weergave Voorwerp moet worden geplaatst. Dit moet een pad zijn naar een .json bestand in een Resource Pack.",mq="Geen bestand geselecteerd!",fq="Het geselecteerde bestand bestaat niet!",hq="Het geselecteerde pad is geen bestand!",gq="Model Map",_q="Waar alle ge\xEBxporteerde modellen moeten worden geplaatst. Dit moet een pad zijn naar een map in een Resource Pack.",xq="Geen map geselecteerd!",vq="De geselecteerde map bestaat niet!",bq="Het geselecteerde pad is geen map!",yq="Textuur Map",wq="Waar alle ge\xEBxporteerde texturen moeten worden geplaatst. Dit moet een pad zijn naar een map in een Resource Pack.",Eq="Data Pack Instellingen",kq="Geavanceerde Instellingen Gebruiken",jq="Of de geavanceerde instellingen voor Data Packs wel of niet moeten worden ingeschakeld.",Aq="Data Pack",Tq="De hoofdmap van de Data Pack waarnaar het project moet worden ge\xEBxporteerd.",Cq="Geen map geselecteerd!",Sq="De geselecteerde map bestaat niet!",Oq="Het geselecteerde pad is geen map!",Iq="De geselecteerde map mist een pack.mcmeta bestand!",Dq="De geselecteerde Data Pack mist een data map!",Fq="Data Pack Zip",Nq="Het pad naar het .zip-bestand om het project naar te exporteren.",Rq="Geen bestand geselecteerd!",Mq="Het geselecteerde pad is geen bestand!",Bq="On-Summon Commando's",Pq=`Commando's om uit te voeren als de hoofdentiteit wanneer deze wordt opgeroepen. Behandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,Lq="Interpolatie Duratie",Vq="De duur van de interpolatie tussen keyframes in ticks. Dit is de tijd die het model nodig heeft om over te gaan van de ene keyframe naar de volgende. Hogere waarden zorgen ervoor dat animaties precisie verliezen. Over het algemeen wil je dat dit een waarde van 1 of 2 heeft.",zq="Teleportatie Duratie",Uq="De duur van de teleportatie tussen keyframes in ticks. Dit is de tijd waarover het model visueel zal interpoleren tussen zijn oude positie en zijn nieuwe positie. Hogere waarden zorgen ervoor dat animaties precisie verliezen.",qq="Opslag gebruiken voor animatie",Hq=`Wel of geen NBT-opslag gebruiken om animatiegegevens op te slaan in plaats van functies. Dit vermindert het aantal functies in het gegenereerde Data Pack enorm, maar is 42% langzamer dan de functiemethode.`,Jq="Gebakken Animaties",Gq=`De ge\xEBxporteerde animaties al dan niet bakken. Bij gebakken animaties worden de frames vooraf berekend en opgeslagen in het ge\xEBxporteerde JSON-bestand, waardoor het minder complex wordt om het model in de game te renderen. Sommige Plugins vereisen dat dit is ingeschakeld om correct te functioneren.`,Wq="JSON Bestand",Kq="Het pad naar het JSON bestand om het project naar te exporteren.",Yq="Geen bestand geselecteerd!",Xq="Het geselecteerde pad is geen bestand!",Zq="Bot Configuratie",Qq="Geselecteerde Variant: {0}",$q="De onderstaande instellingen worden standaard toegepast op dit bot.",eH="De onderstaande instellingen worden alleen op dit bot toegepast wanneer deze variant wordt toegepast.",tH="Gebruik NBT",nH="Of NBT al dan niet moet worden gebruikt om de bot te configureren in plaats van instellingen.",iH="Als je NBT gebruikt, worden alle andere instellingen overschreven en zijn wijzigingen die je maakt niet zichtbaar in de editor. Gebruik dit alleen als je weet wat je doet!",aH="Instellingen Overnemen",rH="Of de instellingen wel of niet moeten worden overgenomen van het parent-bot.",oH="Gloeien",sH="Of het bot wel of niet moet gloeien in het spel.",lH="Overschrijf Gloed Kleur",cH="Of de standaard gloed kleur wel of niet moet worden overschreven.",uH="Gloed Kleur",dH="De kleur van de gloed.",pH="Schaduw Straal",mH="De straal van de schaduw.",fH="Schaduw Sterkte",hH="De sterkte van de schaduw.",gH="Overschrijf Helderheid",_H="Of de standaard helderheid wel of niet moet worden overschreven.",xH="Helderheid",vH="De helderheid van het bot. Dit moet een waarde tussen 0 en 15 zijn.",bH="Betoverd",yH="Of het bot wel of niet betoverd moet worden.",wH="Onzichtbaar",EH="Of het bot wel of niet onzichtbaar moet worden.",kH="NBT",jH="De NBT die op het bot moet worden toegepast.",AH=`De NBT moet een compound tag zijn! Bijv. {CustomName:'"mijn naam"'}`,TH=`Ongeldige NBT! {0}`,CH="Billboard",SH="Bepaalt of dit bot naar de speler moet draaien wanneer het wordt weergegeven. Het kan vast zijn (draait niet met de speler mee), verticaal (draait met de speler mee rond verticale as), horizontaal (draait rond horizontale as) en midden (draait rond middelpunt).",OH="Vast",IH="Verticaal",DH="Horizontaal",FH="Midden",NH="Locator Configuratie",RH=`Plugin-Modus is ingeschakeld! Locators hebben geen configuratie in Plugin-Modus. Gebruik in plaats daarvan de Plugin API om aangepaste functionaliteit aan je Locators toe te voegen. Raadpleeg voor meer informatie de offici\xEBle Plugin API documentatie.`,MH="Gebruik Entiteit",BH="Of er al dan niet een entiteit aan de Locator moet worden gekoppeld.",PH="Type Entiteit",LH="Het type entiteit dat aan de Locator moet worden gekoppeld.",VH="Type Entiteit mag niet leeg zijn!",zH="Het geselecteerde entiteit-type bestaat niet in Minecraft {0}",UH="On-Summon Commando's",qH=`Commando's om als entiteit van de Locator uit te voeren wanneer deze wordt opgeroepen. Behandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,HH="Ticking Commands",JH=`Opdrachten om elke tick uit te voeren op de positie van de Locator. Behandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,GH="Tekstweergave Configuratie",WH="Vanilla Voorwerp Model",KH=`Als dit is ingesteld, wordt het bot weergegeven als een vanilla voorwerp model. Hierdoor worden de bestaande kubussen van het bot overschreven.`,YH="Gebruik NBT",XH="Of NBT al dan niet moet worden gebruikt om de tekstweergave te configureren in plaats van instellingen.",ZH="Als je NBT gebruikt, worden alle andere instellingen overschreven en zijn wijzigingen die je maakt niet zichtbaar in de editor. Gebruik dit alleen als je weet wat je doet!",QH="Instellingen Overnemen",$H="Of de instellingen wel of niet moeten worden overgenomen van de parent-tekstweergave.",eJ="Gloeien",tJ="Of het bot wel of niet moet gloeien in het spel.",nJ="Overschrijf Gloed Kleur",iJ="Of de standaard gloed kleur wel of niet moet worden overschreven.",aJ="Gloed Kleur",rJ="De kleur van de gloed.",oJ="Schaduw Straal",sJ="De straal van de schaduw.",lJ="Schaduw Sterkte",cJ="De sterke van de schaduw.",uJ="Overschrijf Helderheid",dJ="Of de standaard helderheid wel of niet moet worden overschreven.",pJ="Helderheid",mJ="De helderheid van het bot. Dit moet een waarde tussen 0 en 15 zijn.",fJ="Onzichtbaar",hJ="Of de tekstweergave wel of niet onzichtbaar moet worden.",gJ="NBT",_J="De NBT die op de tekstweergave moet worden toegepast.",xJ="Billboard",vJ="Bepaalt of dit bot naar de speler moet draaien wanneer het wordt weergegeven. Het kan vast zijn (draait niet met de speler mee), verticaal (draait met de speler mee rond verticale as), horizontaal (draait rond horizontale as) en midden (draait rond middelpunt).",bJ="Vast",yJ="Verticaal",wJ="Horizontaal",EJ="Midden",kJ="Variant Configuratie",jJ="Weergavenaam",AJ="Wordt gebruikt om de variant te identificeren in de editor en in foutmeldingen.",TJ="Genereer Naam uit Weergavenaam",CJ="Of de Naam al dan niet automatisch moet worden gegenereerd uit de Weergavenaam.",SJ="Naam",OJ="Wordt gebruikt om de variant in de ge\xEBxporteerde Resource Pack en Data Pack te identificeren.",IJ="Textuur Map",DJ="Een map van welke texturen moeten worden verwisseld bij het toepassen van deze variant.",FJ="Nieuwe Mapping Maken",NJ="Variant heeft geen in kaart gebrachte texturen.",RJ="Een lijst met nodes die wel of niet worden meegenomen in de Variant. Alleen nodes in de ge\xEFncludeerde lijst worden gewijzigd door de Variant, en nodes in de uitgesloten lijst worden genegeerd.",MJ="Uitgelosten Nodes",BJ="Een lijst met nodes die uitgesloten moeten worden van de Variant. Deze nodes worden niet gewijzigd door de Variant.",PJ="Inbegrepen Nodes",LJ="Een lijst met nodes die in de Variant moeten worden opgenomen. Alleen deze nodes worden gewijzigd door de Variant.",VJ="Lijsten Omwisselen",zJ="Update .ajmodel",UJ="Update .ajmodel",qJ="Selecteeer .ajmodel Bestand",HJ="Upgrade je verouderde .ajmodel bestanden naar het nieuwe .ajblueprint formaat.",JJ="Selecteer een .ajmodel Bestand om te upgraden",GJ="Animatie Eigenschappen ({0})",WJ="Animatie Naam",KJ="De naam van de animatie.",YJ="Lus Modus",XJ="Bepaalt hoe de animatie moet worden herhaald. Eenmaal - De animatie wordt eenmaal afgespeeld en stopt dan. Houden - De animatie wordt eenmaal afgespeeld en het laatste frame wordt vastgehouden. Lus - De animatie wordt oneindig herhaald.",ZJ="Eenmaal",QJ="Houden",$J="Lus",eG="De naam van de animatie kan niet leeg zijn!",tG="De naam van de animatie bevat ongeldige tekens! Animatie namen mogen alleen letters, cijfers, underscores en punten bevatten.",nG="Lus Vertraging",iG="De vertraging tussen lussen. Dit is de tijd dat de animatie pauzeert voor hij opnieuw begint. Dit wordt alleen gebruikt als de Lus Modus is ingesteld op Lus.",aG="Een lijst van nodes die wel of niet worden meegenomen in de animatie. Alleen nodes in de lijst met inbegrepen nodes worden gewijzigd door de animatie, nodes in de lijst met uitgesloten nodes worden genegeerd.",rG="Uitgesloten Nodes",oG="Een lijst van nodes die uitgesloten moeten worden van de animatie. Deze nodes worden niet gewijzigd door de animatie.",sG="Inbegrepen Nodes",lG="Een lijst van nodes die in de animatie moeten worden opgenomen. Alleen deze nodes worden gewijzigd door de animatie.",cG="Lijsten Omwisselen",uG="Exporteren...",dG="Varianten",pG="Nieuwe Variant Maken",mG="Variant Bewerken",fG="Geselecteerde Variant Dupliceren",hG="Geselecteerde Variant Verwijderen",gG="Variant Geselecteerd",_G="Variant Niet Geselecteerd",xG="Kan de standaard variant niet verwijderen!",vG="Variant Maken",bG="Variant Dupliceren",yG="Open Variant Configuratie",wG="Variant Verwijderen",EG="Uitgesloten Nodes",kG="Uitgesloten Nodes Inverteren",jG="Variant",AG="Commando's",TG="Variant",CG="Commando's",SG="Uitvoer Voorwaarde",OG="Keyframe ({0})",IG="Variant",DG="De Variant die moet worden toegepast op de keyframe.",FG="Commando's",NG=`Commando's die worden uitgevoerd wanneer de keyframe is bereikt. Behandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,RG="Uitvoer Voorwaarde",MG="Een voorwaarde waaraan moet worden voldaan om het keyframe uit te voeren. Behandel deze tekstinvoer als een sub-commando van een execute command.",BG="Herhalen?",PG=`Of de commando's in dit keyframe al dan niet herhaaldelijk moeten worden uitgevoerd. Als deze optie is ingeschakeld, worden de commando's elke Herhaal Frequentie ticks uitgevoerd.`,LG="Herhaal Frequentie",VG=`Hoeveel ticks er moeten worden gewacht voordat de commando's in dit keyframe opnieuw worden uitgevoerd. Als je dit instelt op 1, worden de commando's elke tik uitgevoerd. OPMERKING: Als de animatie niet gelijkmatig deelbaar is door deze waarde, kan het interval enigszins afwijken wanneer de animatie in een lus loopt. Als dit is ingesteld op een waarde groter dan de lengte van de animatie, zullen de commando's worden uitgevoerd alsof herhalen is uitgeschakeld (Zodra het keyframe is bereikt).`,zG="Versoepeling Type",UG="Het type versoepeling dat moet worden toegepast op het keyframe.",qG="Linear",HG="Sine",JG="Quad",GG="Cubic",WG="Quart",KG="Quint",YG="Expo",XG="Circ",ZG="Elastic",QG="Back",$G="Bounce",eW="Versoepling Modus",tW="De versoepelingsmodus die moet worden toegepast op het keyframe.",nW="In",iW="Out",aW="In-Out",rW="Versoepeling Argumenten",oW="De argumenten die moeten worden toegepast op de versoepelings functie.",sW="Elasticiteit",lW="De elasticiteit van de versoepelings functie.",cW="Overschrijding",uW="De hoeveelheid overschrijding die moet worden toegepast op de versoepelings functie.",dW="Stuiterigheid",pW="De stuiterigheid van de versoepelings functie.",mW="Tekstweergave",fW="Lijnbreedte",hW="De breedte van de tekstweergave in pixels.",gW="Achtergrond Kleur",_W="De kleur van de achtergrond van de tekstweergave.",xW="Tekst Schaduw",vW="Wel of geen schaduw achter de tekst weergeven.",bW="Uitlijning Van Tekst",yW="De uitlijning van de tekst.",wW="Links",EW="Midden",kW="Rechts",jW="Weergegeven Voorwerp",AW="Het voorwerp dat moet worden weergegeven.",TW="Weergegeven Blok.",CW="Het blok dat moet worden weergegeven. Ondersteunt block states!",SW="Vanilla Voorwerpweergave",OW="Exporteren Mislukt",IW="Je hebt resource pack exporteren uitgeschakeld, maar je hebt aangepaste modellen in je project! Schakel resource pack exporteren in of verwijder de aangepaste modellen voordat je exporteert.",DW="Er zitten fouten in je blauwdruk instellingen! Herstel deze voordat je exporteert.",FW="Een probleem gevonden met {0}:",NW="Ok",RW="Animated Java",MW="Mob hoofden worden niet weergegeven in Blokweergaves. Gebruik in plaats daarvan een Voorwerpweergave.",BW="Blauwdruk export pad bestaat niet",PW=`Het exportpad '{0}' bestaat niet! Controleer of de map waarin je opslaat bestaat en probeer het opnieuw.`,LW={"animated_java.action.open_blueprint_settings.name":Uz,"animated_java.action.open_documentation.name":qz,"animated_java.action.open_about.name":Hz,"animated_java.action.open_bone_config.name":Jz,"animated_java.action.open_locator_config.name":Gz,"animated_java.action.open_text_display_config.name":Wz,"animated_java.action.export.name":Kz,"animated_java.action.create_text_display.title":Yz,"animated_java.action.create_vanilla_item_display.title":Xz,"animated_java.action.create_vanilla_block_display.title":Zz,"animated_java.action.open_vanilla_item_display_config.name":Qz,"animated_java.action.open_vanilla_block_display_config.name":$z,"animated_java.popup.loading.loading":eU,"animated_java.popup.loading.success":tU,"animated_java.popup.loading.offline":nU,"animated_java.dialog.about.title":iU,"animated_java.dialog.about.close_button":aU,"animated_java.dialog.unexpected_error.title":rU,"animated_java.dialog.unexpected_error.close_button":oU,"animated_java.dialog.unexpected_error.copy_error_message_button.message":sU,"animated_java.dialog.unexpected_error.copy_error_message_button.description":lU,"animated_java.dialog.unexpected_error.paragraph":cU,"animated_java.dialog.blueprint_settings.title":uU,"animated_java.dialog.blueprint_settings.advanced_settings_warning":dU,"animated_java.dialog.blueprint_settings.blueprint_name.title":pU,"animated_java.dialog.blueprint_settings.blueprint_name.description":mU,"animated_java.dialog.blueprint_settings.texture_size.title":fU,"animated_java.dialog.blueprint_settings.texture_size.description":hU,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":gU,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":_U,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":xU,"animated_java.dialog.blueprint_settings.export_settings.title":vU,"animated_java.dialog.blueprint_settings.export_namespace.title":bU,"animated_java.dialog.blueprint_settings.export_namespace.description":yU,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":wU,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":EU,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":kU,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":jU,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":AU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":TU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description":CU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw":SU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":OU,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":IU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":DU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.description":FU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw":NU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":RU,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":MU,"animated_java.dialog.blueprint_settings.show_bounding_box.title":BU,"animated_java.dialog.blueprint_settings.show_bounding_box.description":PU,"animated_java.dialog.blueprint_settings.auto_bounding_box.title":LU,"animated_java.dialog.blueprint_settings.auto_bounding_box.description":VU,"animated_java.dialog.blueprint_settings.bounding_box.title":zU,"animated_java.dialog.blueprint_settings.bounding_box.description":UU,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":qU,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":HU,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description":JU,"animated_java.dialog.blueprint_settings.display_item.title":GU,"animated_java.dialog.blueprint_settings.display_item.description":WU,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":KU,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":YU,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":XU,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":ZU,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":QU,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":$U,"animated_java.dialog.blueprint_settings.resource_pack.title":eq,"animated_java.dialog.blueprint_settings.resource_pack.description":tq,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":nq,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":iq,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":aq,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":rq,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder":oq,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":sq,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":lq,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":cq,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":uq,"animated_java.dialog.blueprint_settings.display_item_path.title":dq,"animated_java.dialog.blueprint_settings.display_item_path.description":pq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected":mq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist":fq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file":hq,"animated_java.dialog.blueprint_settings.model_folder.title":gq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description":_q,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected":xq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist":vq,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder":bq,"animated_java.dialog.blueprint_settings.texture_folder.title":yq,"animated_java.dialog.blueprint_settings.texture_folder.description":wq,"animated_java.dialog.blueprint_settings.data_pack_settings.title":Eq,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title":kq,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description":jq,"animated_java.dialog.blueprint_settings.data_pack.title":Aq,"animated_java.dialog.blueprint_settings.data_pack.description":Tq,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":Cq,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":Sq,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":Oq,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":Iq,"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder":Dq,"animated_java.dialog.blueprint_settings.data_pack_zip.title":Fq,"animated_java.dialog.blueprint_settings.data_pack_zip.description":Nq,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":Rq,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":Mq,"animated_java.dialog.blueprint_settings.summon_commands.title":Bq,"animated_java.dialog.blueprint_settings.summon_commands.description":Pq,"animated_java.dialog.blueprint_settings.interpolation_duration.title":Lq,"animated_java.dialog.blueprint_settings.interpolation_duration.description":Vq,"animated_java.dialog.blueprint_settings.teleportation_duration.title":zq,"animated_java.dialog.blueprint_settings.teleportation_duration.description":Uq,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":qq,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":Hq,"animated_java.dialog.blueprint_settings.baked_animations.title":Jq,"animated_java.dialog.blueprint_settings.baked_animations.description":Gq,"animated_java.dialog.blueprint_settings.json_file.title":Wq,"animated_java.dialog.blueprint_settings.json_file.description":Kq,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":Yq,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":Xq,"animated_java.dialog.bone_config.title":Zq,"animated_java.dialog.bone_config.selected_variant":Qq,"animated_java.dialog.bone_config.default_variant_subtitle":$q,"animated_java.dialog.bone_config.selected_variant_subtitle":eH,"animated_java.dialog.bone_config.use_nbt.title":tH,"animated_java.dialog.bone_config.use_nbt.description":nH,"animated_java.dialog.bone_config.use_nbt.use_nbt_warning":iH,"animated_java.dialog.bone_config.inherit_settings.title":aH,"animated_java.dialog.bone_config.inherit_settings.description":rH,"animated_java.dialog.bone_config.glowing.title":oH,"animated_java.dialog.bone_config.glowing.description":sH,"animated_java.dialog.bone_config.override_glow_color.title":lH,"animated_java.dialog.bone_config.override_glow_color.description":cH,"animated_java.dialog.bone_config.glow_color.title":uH,"animated_java.dialog.bone_config.glow_color.description":dH,"animated_java.dialog.bone_config.shadow_radius.title":pH,"animated_java.dialog.bone_config.shadow_radius.description":mH,"animated_java.dialog.bone_config.shadow_strength.title":fH,"animated_java.dialog.bone_config.shadow_strength.description":hH,"animated_java.dialog.bone_config.override_brightness.title":gH,"animated_java.dialog.bone_config.override_brightness.description":_H,"animated_java.dialog.bone_config.brightness_override.title":xH,"animated_java.dialog.bone_config.brightness_override.description":vH,"animated_java.dialog.bone_config.enchanted.title":bH,"animated_java.dialog.bone_config.enchanted.description":yH,"animated_java.dialog.bone_config.invisible.title":wH,"animated_java.dialog.bone_config.invisible.description":EH,"animated_java.dialog.bone_config.nbt.title":kH,"animated_java.dialog.bone_config.nbt.description":jH,"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound":AH,"animated_java.dialog.bone_config.nbt.invalid_nbt.error":TH,"animated_java.dialog.bone_config.billboard.title":CH,"animated_java.dialog.bone_config.billboard.description":SH,"animated_java.dialog.bone_config.billboard.options.fixed":OH,"animated_java.dialog.bone_config.billboard.options.vertical":IH,"animated_java.dialog.bone_config.billboard.options.horizontal":DH,"animated_java.dialog.bone_config.billboard.options.center":FH,"animated_java.dialog.locator_config.title":NH,"animated_java.dialog.locator_config.plugin_mode_warning":RH,"animated_java.dialog.locator_config.use_entity.title":MH,"animated_java.dialog.locator_config.use_entity.description":BH,"animated_java.dialog.locator_config.entity_type.title":PH,"animated_java.dialog.locator_config.entity_type.description":LH,"animated_java.dialog.locator_config.entity_type.error.empty":VH,"animated_java.dialog.locator_config.entity_type.warning.invalid":zH,"animated_java.dialog.locator_config.summon_commands.title":UH,"animated_java.dialog.locator_config.summon_commands.description":qH,"animated_java.dialog.locator_config.ticking_commands.title":HH,"animated_java.dialog.locator_config.ticking_commands.description":JH,"animated_java.dialog.text_display_config.title":GH,"animated_java.dialog.bone_config.vanilla_item_model.title":WH,"animated_java.dialog.bone_config.vanilla_item_model.description":KH,"animated_java.dialog.text_display_config.use_nbt.title":YH,"animated_java.dialog.text_display_config.use_nbt.description":XH,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":ZH,"animated_java.dialog.text_display_config.inherit_settings.title":QH,"animated_java.dialog.text_display_config.inherit_settings.description":$H,"animated_java.dialog.text_display_config.glowing.title":eJ,"animated_java.dialog.text_display_config.glowing.description":tJ,"animated_java.dialog.text_display_config.override_glow_color.title":nJ,"animated_java.dialog.text_display_config.override_glow_color.description":iJ,"animated_java.dialog.text_display_config.glow_color.title":aJ,"animated_java.dialog.text_display_config.glow_color.description":rJ,"animated_java.dialog.text_display_config.shadow_radius.title":oJ,"animated_java.dialog.text_display_config.shadow_radius.description":sJ,"animated_java.dialog.text_display_config.shadow_strength.title":lJ,"animated_java.dialog.text_display_config.shadow_strength.description":cJ,"animated_java.dialog.text_display_config.override_brightness.title":uJ,"animated_java.dialog.text_display_config.override_brightness.description":dJ,"animated_java.dialog.text_display_config.brightness_override.title":pJ,"animated_java.dialog.text_display_config.brightness_override.description":mJ,"animated_java.dialog.text_display_config.invisible.title":fJ,"animated_java.dialog.text_display_config.invisible.description":hJ,"animated_java.dialog.text_display_config.nbt.title":gJ,"animated_java.dialog.text_display_config.nbt.description":_J,"animated_java.dialog.text_display_config.billboard.title":xJ,"animated_java.dialog.text_display_config.billboard.description":vJ,"animated_java.dialog.text_display_config.billboard.options.fixed":bJ,"animated_java.dialog.text_display_config.billboard.options.vertical":yJ,"animated_java.dialog.text_display_config.billboard.options.horizontal":wJ,"animated_java.dialog.text_display_config.billboard.options.center":EJ,"animated_java.dialog.variant_config.title":kJ,"animated_java.dialog.variant_config.variant_display_name":jJ,"animated_java.dialog.variant_config.variant_display_name.description":AJ,"animated_java.dialog.variant_config.generate_name_from_display_name":TJ,"animated_java.dialog.variant_config.generate_name_from_display_name.description":CJ,"animated_java.dialog.variant_config.variant_name":SJ,"animated_java.dialog.variant_config.variant_name.description":OJ,"animated_java.dialog.variant_config.texture_map.title":IJ,"animated_java.dialog.variant_config.texture_map.description":DJ,"animated_java.dialog.variant_config.texture_map.create_new_mapping":FJ,"animated_java.dialog.variant_config.texture_map.no_mappings":NJ,"animated_java.dialog.variant_config.bone_lists.description":RJ,"animated_java.dialog.variant_config.excluded_nodes.title":MJ,"animated_java.dialog.variant_config.excluded_nodes.description":BJ,"animated_java.dialog.variant_config.included_nodes.title":PJ,"animated_java.dialog.variant_config.included_nodes.description":LJ,"animated_java.dialog.variant_config.swap_columns_button.tooltip":VJ,"animated_java.action.upgrade_old_aj_model_loader.name":zJ,"animated_java.dialog.upgrade_old_aj_model_loader.title":UJ,"animated_java.action.upgrade_old_aj_model_loader.select_file":qJ,"animated_java.action.upgrade_old_aj_model_loader.body":HJ,"animated_java.action.upgrade_old_aj_model_loader.button":JJ,"animated_java.dialog.animation_properties.title":GJ,"animated_java.dialog.animation_properties.animation_name.title":WJ,"animated_java.dialog.animation_properties.animation_name.description":KJ,"animated_java.dialog.animation_properties.loop_mode.title":YJ,"animated_java.dialog.animation_properties.loop_mode.description":XJ,"animated_java.dialog.animation_properties.loop_mode.options.once":ZJ,"animated_java.dialog.animation_properties.loop_mode.options.hold":QJ,"animated_java.dialog.animation_properties.loop_mode.options.loop":$J,"animated_java.dialog.animation_properties.animation_name.error.empty":eG,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":tG,"animated_java.dialog.animation_properties.loop_delay.title":nG,"animated_java.dialog.animation_properties.loop_delay.description":iG,"animated_java.dialog.animation_properties.bone_lists.description":aG,"animated_java.dialog.animation_properties.excluded_nodes.title":rG,"animated_java.dialog.animation_properties.excluded_nodes.description":oG,"animated_java.dialog.animation_properties.included_nodes.title":sG,"animated_java.dialog.animation_properties.included_nodes.description":lG,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":cG,"animated_java.dialog.export_progress.title":uG,"animated_java.panel.variants.title":dG,"animated_java.panel.variants.tool.create_new_variant":pG,"animated_java.panel.variants.tool.edit_variant":mG,"animated_java.panel.variants.tool.duplicate_selected_variant":fG,"animated_java.panel.variants.tool.delete_selected_variant":hG,"animated_java.panel.variants.tool.variant_visible":gG,"animated_java.panel.variants.tool.variant_not_visible":_G,"animated_java.panel.variants.tool.cannot_delete_default_variant":xG,"animated_java.action.variants.create":vG,"animated_java.action.variants.duplicate":bG,"animated_java.action.variants.open_config":yG,"animated_java.action.variants.delete":wG,"animated_java.animation.excluded_nodes":EG,"animated_java.animation.invert_excluded_nodes":kG,"animated_java.effect_animator.timeline.variant":jG,"animated_java.effect_animator.timeline.commands":AG,"animated_java.effect_animator.keyframes.variant":TG,"animated_java.effect_animator.keyframes.commands":CG,"animated_java.effect_animator.keyframes.execute_condition":SG,"animated_java.panel.keyframe.keyframe_title":OG,"animated_java.panel.keyframe.variant.title":IG,"animated_java.panel.keyframe.variant.description":DG,"animated_java.panel.keyframe.commands.title":FG,"animated_java.panel.keyframe.commands.description":NG,"animated_java.panel.keyframe.execute_condition.title":RG,"animated_java.panel.keyframe.execute_condition.description":MG,"animated_java.panel.keyframe.repeat.title":BG,"animated_java.panel.keyframe.repeat.description":PG,"animated_java.panel.keyframe.repeat_frequency.title":LG,"animated_java.panel.keyframe.repeat_frequency.description":VG,"animated_java.panel.keyframe.easing_type.title":zG,"animated_java.panel.keyframe.easing_type.description":UG,"animated_java.panel.keyframe.easing_type.options.linear":qG,"animated_java.panel.keyframe.easing_type.options.sine":HG,"animated_java.panel.keyframe.easing_type.options.quad":JG,"animated_java.panel.keyframe.easing_type.options.cubic":GG,"animated_java.panel.keyframe.easing_type.options.quart":WG,"animated_java.panel.keyframe.easing_type.options.quint":KG,"animated_java.panel.keyframe.easing_type.options.expo":YG,"animated_java.panel.keyframe.easing_type.options.circ":XG,"animated_java.panel.keyframe.easing_type.options.elastic":ZG,"animated_java.panel.keyframe.easing_type.options.back":QG,"animated_java.panel.keyframe.easing_type.options.bounce":$G,"animated_java.panel.keyframe.easing_mode.title":eW,"animated_java.panel.keyframe.easing_mode.description":tW,"animated_java.panel.keyframe.easing_mode.options.in":nW,"animated_java.panel.keyframe.easing_mode.options.out":iW,"animated_java.panel.keyframe.easing_mode.options.inout":aW,"animated_java.panel.keyframe.easing_args.title":rW,"animated_java.panel.keyframe.easing_args.description":oW,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":sW,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":lW,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":cW,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":uW,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":dW,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":pW,"animated_java.panel.text_display.title":mW,"animated_java.tool.text_display.line_width.title":fW,"animated_java.tool.text_display.line_width.description":hW,"animated_java.tool.text_display.background_color.title":gW,"animated_java.tool.text_display.background_color.description":_W,"animated_java.tool.text_display.text_shadow.title":xW,"animated_java.tool.text_display.text_shadow.description":vW,"animated_java.tool.text_display.text_alignment.title":bW,"animated_java.tool.text_display.text_alignment.description":yW,"animated_java.tool.text_display.text_alignment.options.left":wW,"animated_java.tool.text_display.text_alignment.options.center":EW,"animated_java.tool.text_display.text_alignment.options.right":kW,"animated_java.panel.vanilla_item_display.title":jW,"animated_java.panel.vanilla_item_display.description":AW,"animated_java.panel.vanilla_block_display.title":TW,"animated_java.panel.vanilla_block_display.description":CW,"animated_java.vanilla_item_display.title":SW,"animated_java.misc.failed_to_export.title":OW,"animated_java.misc.failed_to_export.custom_models.message":IW,"animated_java.misc.failed_to_export.blueprint_settings.message":DW,"animated_java.misc.failed_to_export.blueprint_settings.error_item":FW,"animated_java.misc.failed_to_export.button":NW,"animated_java.format_category.animated_java":RW,"animated_java.block_model_manager.mob_head_warning":MW,"animated_java.error.blueprint_export_path_doesnt_exist.title":BW,"animated_java.error.blueprint_export_path_doesnt_exist.description":PW};var Ag={};vn(Ag,{"animated_java.action.copy_display_entity_config.message":()=>oK,"animated_java.action.copy_display_entity_config.name":()=>rK,"animated_java.action.create_text_display.title":()=>nK,"animated_java.action.create_vanilla_block_display.title":()=>aK,"animated_java.action.create_vanilla_item_display.title":()=>iK,"animated_java.action.export.name":()=>KW,"animated_java.action.export_all.description":()=>ZW,"animated_java.action.export_all.name":()=>XW,"animated_java.action.export_all_debug.description":()=>$W,"animated_java.action.export_all_debug.name":()=>QW,"animated_java.action.export_debug.name":()=>YW,"animated_java.action.extract.confirm":()=>tK,"animated_java.action.extract.name":()=>eK,"animated_java.action.open_about.name":()=>JW,"animated_java.action.open_blueprint_settings.name":()=>UW,"animated_java.action.open_changelog.name":()=>HW,"animated_java.action.open_display_entity_config.name":()=>GW,"animated_java.action.open_documentation.name":()=>qW,"animated_java.action.open_locator_config.name":()=>WW,"animated_java.action.paste_display_entity_config.message":()=>lK,"animated_java.action.paste_display_entity_config.name":()=>sK,"animated_java.action.upgrade_old_aj_model_loader.body":()=>CQ,"animated_java.action.upgrade_old_aj_model_loader.button":()=>SQ,"animated_java.action.upgrade_old_aj_model_loader.name":()=>jQ,"animated_java.action.upgrade_old_aj_model_loader.select_file":()=>TQ,"animated_java.action.variants.create":()=>r$,"animated_java.action.variants.delete":()=>l$,"animated_java.action.variants.duplicate":()=>o$,"animated_java.action.variants.open_config":()=>s$,"animated_java.animation.excluded_nodes":()=>c$,"animated_java.animation.invert_excluded_nodes":()=>u$,"animated_java.block_model_manager.facing_warning":()=>Yee,"animated_java.block_model_manager.fluid_warning":()=>Wee,"animated_java.block_model_manager.mob_head_warning":()=>Kee,"animated_java.dialog.about.close_button":()=>wK,"animated_java.dialog.about.title":()=>yK,"animated_java.dialog.animation_properties.animation_name.description":()=>DQ,"animated_java.dialog.animation_properties.animation_name.error.empty":()=>PQ,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":()=>LQ,"animated_java.dialog.animation_properties.animation_name.title":()=>IQ,"animated_java.dialog.animation_properties.bone_lists.description":()=>UQ,"animated_java.dialog.animation_properties.excluded_nodes.description":()=>HQ,"animated_java.dialog.animation_properties.excluded_nodes.title":()=>qQ,"animated_java.dialog.animation_properties.included_nodes.description":()=>GQ,"animated_java.dialog.animation_properties.included_nodes.title":()=>JQ,"animated_java.dialog.animation_properties.loop_delay.description":()=>zQ,"animated_java.dialog.animation_properties.loop_delay.title":()=>VQ,"animated_java.dialog.animation_properties.loop_mode.description":()=>NQ,"animated_java.dialog.animation_properties.loop_mode.options.hold":()=>MQ,"animated_java.dialog.animation_properties.loop_mode.options.loop":()=>BQ,"animated_java.dialog.animation_properties.loop_mode.options.once":()=>RQ,"animated_java.dialog.animation_properties.loop_mode.title":()=>FQ,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":()=>WQ,"animated_java.dialog.animation_properties.title":()=>OQ,"animated_java.dialog.blueprint_loading.title":()=>YQ,"animated_java.dialog.blueprint_settings.advanced_settings_warning":()=>IK,"animated_java.dialog.blueprint_settings.auto_render_box.description":()=>KK,"animated_java.dialog.blueprint_settings.auto_render_box.title":()=>WK,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description":()=>oX,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title":()=>rX,"animated_java.dialog.blueprint_settings.baked_animations.description":()=>uX,"animated_java.dialog.blueprint_settings.baked_animations.title":()=>cX,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":()=>EY,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":()=>wY,"animated_java.dialog.blueprint_settings.data_pack.description":()=>BY,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":()=>VY,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":()=>UY,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":()=>LY,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":()=>zY,"animated_java.dialog.blueprint_settings.data_pack.title":()=>MY,"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder":()=>PY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder":()=>oY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":()=>lY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":()=>sY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":()=>rY,"animated_java.dialog.blueprint_settings.data_pack_settings.title":()=>RY,"animated_java.dialog.blueprint_settings.data_pack_zip.description":()=>HY,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":()=>JY,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":()=>GY,"animated_java.dialog.blueprint_settings.data_pack_zip.title":()=>qY,"animated_java.dialog.blueprint_settings.display_item.description":()=>hY,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":()=>_Y,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":()=>xY,"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found":()=>yY,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":()=>gY,"animated_java.dialog.blueprint_settings.display_item.title":()=>fY,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":()=>vY,"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated":()=>bY,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title":()=>mY,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":()=>pY,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":()=>eY,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":()=>$K,"animated_java.dialog.blueprint_settings.export_namespace.description":()=>zK,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":()=>UK,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":()=>HK,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":()=>qK,"animated_java.dialog.blueprint_settings.export_namespace.title":()=>VK,"animated_java.dialog.blueprint_settings.export_settings.title":()=>LK,"animated_java.dialog.blueprint_settings.interpolation_duration.description":()=>nX,"animated_java.dialog.blueprint_settings.interpolation_duration.title":()=>tX,"animated_java.dialog.blueprint_settings.json_file.description":()=>pX,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":()=>mX,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":()=>fX,"animated_java.dialog.blueprint_settings.json_file.title":()=>dX,"animated_java.dialog.blueprint_settings.on_post_tick_function.description":()=>eX,"animated_java.dialog.blueprint_settings.on_post_tick_function.title":()=>$Y,"animated_java.dialog.blueprint_settings.on_pre_tick_function.description":()=>QY,"animated_java.dialog.blueprint_settings.on_pre_tick_function.title":()=>ZY,"animated_java.dialog.blueprint_settings.on_remove_function.description":()=>XY,"animated_java.dialog.blueprint_settings.on_remove_function.title":()=>YY,"animated_java.dialog.blueprint_settings.on_summon_function.description":()=>KY,"animated_java.dialog.blueprint_settings.on_summon_function.title":()=>WY,"animated_java.dialog.blueprint_settings.project_name.description":()=>FK,"animated_java.dialog.blueprint_settings.project_name.title":()=>DK,"animated_java.dialog.blueprint_settings.project_settings.title":()=>OK,"animated_java.dialog.blueprint_settings.render_box.description":()=>XK,"animated_java.dialog.blueprint_settings.render_box.title":()=>YK,"animated_java.dialog.blueprint_settings.resource_pack.description":()=>jY,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":()=>CY,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":()=>OY,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":()=>TY,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":()=>SY,"animated_java.dialog.blueprint_settings.resource_pack.title":()=>kY,"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder":()=>AY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder":()=>nY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":()=>aY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":()=>iY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":()=>tY,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":()=>dY,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":()=>DY,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":()=>FY,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":()=>NY,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":()=>IY,"animated_java.dialog.blueprint_settings.show_render_box.description":()=>GK,"animated_java.dialog.blueprint_settings.show_render_box.title":()=>JK,"animated_java.dialog.blueprint_settings.target_minecraft_version.description":()=>uY,"animated_java.dialog.blueprint_settings.target_minecraft_version.title":()=>cY,"animated_java.dialog.blueprint_settings.teleportation_duration.description":()=>aX,"animated_java.dialog.blueprint_settings.teleportation_duration.title":()=>iX,"animated_java.dialog.blueprint_settings.texture_size.description":()=>RK,"animated_java.dialog.blueprint_settings.texture_size.title":()=>NK,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":()=>PK,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":()=>BK,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":()=>MK,"animated_java.dialog.blueprint_settings.title":()=>SK,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":()=>lX,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":()=>sX,"animated_java.dialog.blueprint_settings.view_range.description":()=>QK,"animated_java.dialog.blueprint_settings.view_range.title":()=>ZK,"animated_java.dialog.bone_config.vanilla_item_model.description":()=>wZ,"animated_java.dialog.bone_config.vanilla_item_model.title":()=>yZ,"animated_java.dialog.changelog_dialog.title":()=>EK,"animated_java.dialog.display_entity.billboard.description":()=>XX,"animated_java.dialog.display_entity.billboard.options.center":()=>eZ,"animated_java.dialog.display_entity.billboard.options.fixed":()=>ZX,"animated_java.dialog.display_entity.billboard.options.horizontal":()=>$X,"animated_java.dialog.display_entity.billboard.options.vertical":()=>QX,"animated_java.dialog.display_entity.billboard.title":()=>YX,"animated_java.dialog.display_entity.brightness_override.description":()=>VX,"animated_java.dialog.display_entity.brightness_override.title":()=>LX,"animated_java.dialog.display_entity.custom_brightness.description":()=>HX,"animated_java.dialog.display_entity.custom_brightness.title":()=>qX,"animated_java.dialog.display_entity.custom_name.description":()=>EX,"animated_java.dialog.display_entity.custom_name.invalid_json.error":()=>kX,"animated_java.dialog.display_entity.custom_name.title":()=>wX,"animated_java.dialog.display_entity.custom_name_visible.description":()=>AX,"animated_java.dialog.display_entity.custom_name_visible.title":()=>jX,"animated_java.dialog.display_entity.enchanted.description":()=>GX,"animated_java.dialog.display_entity.enchanted.title":()=>JX,"animated_java.dialog.display_entity.glow_color.description":()=>DX,"animated_java.dialog.display_entity.glow_color.title":()=>IX,"animated_java.dialog.display_entity.glowing.description":()=>CX,"animated_java.dialog.display_entity.glowing.title":()=>TX,"animated_java.dialog.display_entity.invisible.description":()=>KX,"animated_java.dialog.display_entity.invisible.title":()=>WX,"animated_java.dialog.display_entity.node_options.title":()=>gX,"animated_java.dialog.display_entity.on_apply_function.description":()=>yX,"animated_java.dialog.display_entity.on_apply_function.title":()=>bX,"animated_java.dialog.display_entity.on_summon_function.description":()=>vX,"animated_java.dialog.display_entity.on_summon_function.title":()=>xX,"animated_java.dialog.display_entity.override_brightness.description":()=>PX,"animated_java.dialog.display_entity.override_brightness.title":()=>BX,"animated_java.dialog.display_entity.override_glow_color.description":()=>OX,"animated_java.dialog.display_entity.override_glow_color.title":()=>SX,"animated_java.dialog.display_entity.per_variant_options.title":()=>_X,"animated_java.dialog.display_entity.shadow_radius.description":()=>NX,"animated_java.dialog.display_entity.shadow_radius.title":()=>FX,"animated_java.dialog.display_entity.shadow_strength.description":()=>MX,"animated_java.dialog.display_entity.shadow_strength.title":()=>RX,"animated_java.dialog.display_entity.title":()=>hX,"animated_java.dialog.display_entity.use_custom_brightness.description":()=>UX,"animated_java.dialog.display_entity.use_custom_brightness.title":()=>zX,"animated_java.dialog.export_progress.title":()=>KQ,"animated_java.dialog.locator_config.entity_type.description":()=>oZ,"animated_java.dialog.locator_config.entity_type.error.empty":()=>sZ,"animated_java.dialog.locator_config.entity_type.title":()=>rZ,"animated_java.dialog.locator_config.entity_type.warning.invalid":()=>lZ,"animated_java.dialog.locator_config.on_remove_function.description":()=>hZ,"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity":()=>gZ,"animated_java.dialog.locator_config.on_remove_function.title":()=>fZ,"animated_java.dialog.locator_config.on_summon_function.description":()=>pZ,"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity":()=>mZ,"animated_java.dialog.locator_config.on_summon_function.title":()=>dZ,"animated_java.dialog.locator_config.on_tick_function.description":()=>xZ,"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity":()=>vZ,"animated_java.dialog.locator_config.on_tick_function.title":()=>_Z,"animated_java.dialog.locator_config.plugin_mode_warning":()=>nZ,"animated_java.dialog.locator_config.sync_passenger_rotation.description":()=>uZ,"animated_java.dialog.locator_config.sync_passenger_rotation.title":()=>cZ,"animated_java.dialog.locator_config.title":()=>tZ,"animated_java.dialog.locator_config.use_entity.description":()=>aZ,"animated_java.dialog.locator_config.use_entity.title":()=>iZ,"animated_java.dialog.reset":()=>bK,"animated_java.dialog.text_display_config.brightness_override.description":()=>zZ,"animated_java.dialog.text_display_config.brightness_override.title":()=>VZ,"animated_java.dialog.text_display_config.custom_brightness.description":()=>JZ,"animated_java.dialog.text_display_config.custom_brightness.title":()=>HZ,"animated_java.dialog.text_display_config.glow_color.description":()=>FZ,"animated_java.dialog.text_display_config.glow_color.title":()=>DZ,"animated_java.dialog.text_display_config.glowing.description":()=>SZ,"animated_java.dialog.text_display_config.glowing.title":()=>CZ,"animated_java.dialog.text_display_config.inherit_settings.description":()=>TZ,"animated_java.dialog.text_display_config.inherit_settings.title":()=>AZ,"animated_java.dialog.text_display_config.invisible.description":()=>WZ,"animated_java.dialog.text_display_config.invisible.title":()=>GZ,"animated_java.dialog.text_display_config.nbt.description":()=>YZ,"animated_java.dialog.text_display_config.nbt.title":()=>KZ,"animated_java.dialog.text_display_config.override_brightness.description":()=>LZ,"animated_java.dialog.text_display_config.override_brightness.title":()=>PZ,"animated_java.dialog.text_display_config.override_glow_color.description":()=>IZ,"animated_java.dialog.text_display_config.override_glow_color.title":()=>OZ,"animated_java.dialog.text_display_config.shadow_radius.description":()=>RZ,"animated_java.dialog.text_display_config.shadow_radius.title":()=>NZ,"animated_java.dialog.text_display_config.shadow_strength.description":()=>BZ,"animated_java.dialog.text_display_config.shadow_strength.title":()=>MZ,"animated_java.dialog.text_display_config.title":()=>bZ,"animated_java.dialog.text_display_config.use_custom_brightness.description":()=>qZ,"animated_java.dialog.text_display_config.use_custom_brightness.title":()=>UZ,"animated_java.dialog.text_display_config.use_nbt.description":()=>kZ,"animated_java.dialog.text_display_config.use_nbt.title":()=>EZ,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":()=>jZ,"animated_java.dialog.unexpected_error.close_button":()=>jK,"animated_java.dialog.unexpected_error.copy_error_message_button.description":()=>TK,"animated_java.dialog.unexpected_error.copy_error_message_button.message":()=>AK,"animated_java.dialog.unexpected_error.paragraph":()=>CK,"animated_java.dialog.unexpected_error.title":()=>kK,"animated_java.dialog.upgrade_old_aj_model_loader.title":()=>AQ,"animated_java.dialog.vanilla_block_display.custom_name.description":()=>QZ,"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error":()=>$Z,"animated_java.dialog.vanilla_block_display.custom_name.title":()=>ZZ,"animated_java.dialog.vanilla_block_display.custom_name_visible.description":()=>tQ,"animated_java.dialog.vanilla_block_display.custom_name_visible.title":()=>eQ,"animated_java.dialog.vanilla_block_display_config.title":()=>XZ,"animated_java.dialog.vanilla_item_display.custom_name.description":()=>aQ,"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error":()=>rQ,"animated_java.dialog.vanilla_item_display.custom_name.title":()=>iQ,"animated_java.dialog.vanilla_item_display.custom_name_visible.description":()=>sQ,"animated_java.dialog.vanilla_item_display.custom_name_visible.title":()=>oQ,"animated_java.dialog.vanilla_item_display_config.title":()=>nQ,"animated_java.dialog.variant_config.bone_lists.description":()=>vQ,"animated_java.dialog.variant_config.excluded_nodes.description":()=>yQ,"animated_java.dialog.variant_config.excluded_nodes.title":()=>bQ,"animated_java.dialog.variant_config.generate_name_from_display_name":()=>dQ,"animated_java.dialog.variant_config.generate_name_from_display_name.description":()=>pQ,"animated_java.dialog.variant_config.included_nodes.description":()=>EQ,"animated_java.dialog.variant_config.included_nodes.title":()=>wQ,"animated_java.dialog.variant_config.swap_columns_button.tooltip":()=>kQ,"animated_java.dialog.variant_config.texture_map.create_new_mapping":()=>_Q,"animated_java.dialog.variant_config.texture_map.description":()=>gQ,"animated_java.dialog.variant_config.texture_map.no_mappings":()=>xQ,"animated_java.dialog.variant_config.texture_map.title":()=>hQ,"animated_java.dialog.variant_config.title":()=>lQ,"animated_java.dialog.variant_config.variant_display_name":()=>cQ,"animated_java.dialog.variant_config.variant_display_name.description":()=>uQ,"animated_java.dialog.variant_config.variant_name":()=>mQ,"animated_java.dialog.variant_config.variant_name.description":()=>fQ,"animated_java.effect_animator.keyframe_data_point.execute_condition":()=>h$,"animated_java.effect_animator.keyframe_data_point.function":()=>f$,"animated_java.effect_animator.keyframe_data_point.repeat":()=>g$,"animated_java.effect_animator.keyframe_data_point.repeat_frequency":()=>_$,"animated_java.effect_animator.keyframe_data_point.variant":()=>m$,"animated_java.effect_animator.timeline.function":()=>p$,"animated_java.effect_animator.timeline.variant":()=>d$,"animated_java.error.blueprint_export_path_doesnt_exist.description":()=>Zee,"animated_java.error.blueprint_export_path_doesnt_exist.title":()=>Xee,"animated_java.format.blueprint.name":()=>zW,"animated_java.format_category.animated_java":()=>Gee,"animated_java.menubar.label":()=>VW,"animated_java.misc.failed_to_export.blueprint_settings.error_item":()=>Pee,"animated_java.misc.failed_to_export.blueprint_settings.message":()=>Bee,"animated_java.misc.failed_to_export.button":()=>Lee,"animated_java.misc.failed_to_export.custom_models.message":()=>Mee,"animated_java.misc.failed_to_export.invalid_rotation.message":()=>Vee,"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6":()=>zee,"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message":()=>qee,"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message":()=>Uee,"animated_java.misc.failed_to_export.title":()=>Ree,"animated_java.panel.keyframe.easing_args.description":()=>K$,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":()=>Q$,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":()=>Z$,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":()=>eee,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":()=>$$,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":()=>X$,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":()=>Y$,"animated_java.panel.keyframe.easing_args.title":()=>W$,"animated_java.panel.keyframe.easing_mode.description":()=>q$,"animated_java.panel.keyframe.easing_mode.options.in":()=>H$,"animated_java.panel.keyframe.easing_mode.options.inout":()=>G$,"animated_java.panel.keyframe.easing_mode.options.out":()=>J$,"animated_java.panel.keyframe.easing_mode.title":()=>U$,"animated_java.panel.keyframe.easing_type.description":()=>O$,"animated_java.panel.keyframe.easing_type.options.back":()=>V$,"animated_java.panel.keyframe.easing_type.options.bounce":()=>z$,"animated_java.panel.keyframe.easing_type.options.circ":()=>P$,"animated_java.panel.keyframe.easing_type.options.cubic":()=>N$,"animated_java.panel.keyframe.easing_type.options.elastic":()=>L$,"animated_java.panel.keyframe.easing_type.options.expo":()=>B$,"animated_java.panel.keyframe.easing_type.options.linear":()=>I$,"animated_java.panel.keyframe.easing_type.options.quad":()=>F$,"animated_java.panel.keyframe.easing_type.options.quart":()=>R$,"animated_java.panel.keyframe.easing_type.options.quint":()=>M$,"animated_java.panel.keyframe.easing_type.options.sine":()=>D$,"animated_java.panel.keyframe.easing_type.title":()=>S$,"animated_java.panel.keyframe.execute_condition.description":()=>k$,"animated_java.panel.keyframe.execute_condition.title":()=>E$,"animated_java.panel.keyframe.function.description":()=>w$,"animated_java.panel.keyframe.function.title":()=>y$,"animated_java.panel.keyframe.keyframe_title":()=>x$,"animated_java.panel.keyframe.nonlinear_interpolation":()=>tee,"animated_java.panel.keyframe.repeat.description":()=>A$,"animated_java.panel.keyframe.repeat.title":()=>j$,"animated_java.panel.keyframe.repeat_frequency.description":()=>C$,"animated_java.panel.keyframe.repeat_frequency.title":()=>T$,"animated_java.panel.keyframe.variant.description":()=>b$,"animated_java.panel.keyframe.variant.title":()=>v$,"animated_java.panel.text_display.title":()=>nee,"animated_java.panel.vanilla_block_display.description":()=>Fee,"animated_java.panel.vanilla_block_display.title":()=>Dee,"animated_java.panel.vanilla_item_display.description":()=>bee,"animated_java.panel.vanilla_item_display.title":()=>vee,"animated_java.panel.variants.title":()=>XQ,"animated_java.panel.variants.tool.cannot_delete_default_variant":()=>i$,"animated_java.panel.variants.tool.cannot_edit_default_variant":()=>a$,"animated_java.panel.variants.tool.create_new_variant":()=>ZQ,"animated_java.panel.variants.tool.delete_selected_variant":()=>e$,"animated_java.panel.variants.tool.duplicate_selected_variant":()=>$Q,"animated_java.panel.variants.tool.edit_variant":()=>QQ,"animated_java.panel.variants.tool.variant_not_visible":()=>n$,"animated_java.panel.variants.tool.variant_visible":()=>t$,"animated_java.plugin_dialog.incompatability_notice":()=>vK,"animated_java.popup.incompatability_popup.button.disable_all":()=>_K,"animated_java.popup.incompatability_popup.button.ignore":()=>xK,"animated_java.popup.incompatability_popup.description":()=>hK,"animated_java.popup.incompatability_popup.disable_button":()=>gK,"animated_java.popup.incompatability_popup.title":()=>fK,"animated_java.popup.installed_popup.close_button":()=>mK,"animated_java.popup.installed_popup.title":()=>pK,"animated_java.popup.loading.loading":()=>cK,"animated_java.popup.loading.offline":()=>dK,"animated_java.popup.loading.success":()=>uK,"animated_java.toast.invalid_rotations":()=>Hee,"animated_java.toast.invalid_rotations_post_1_21_6":()=>Jee,"animated_java.tool.item_display.item_display.description":()=>wee,"animated_java.tool.item_display.item_display.options.firstperson_lefthand":()=>Aee,"animated_java.tool.item_display.item_display.options.firstperson_righthand":()=>Tee,"animated_java.tool.item_display.item_display.options.fixed":()=>Iee,"animated_java.tool.item_display.item_display.options.ground":()=>Oee,"animated_java.tool.item_display.item_display.options.gui":()=>See,"animated_java.tool.item_display.item_display.options.head":()=>Cee,"animated_java.tool.item_display.item_display.options.none":()=>Eee,"animated_java.tool.item_display.item_display.options.thirdperson_lefthand":()=>kee,"animated_java.tool.item_display.item_display.options.thirdperson_righthand":()=>jee,"animated_java.tool.item_display.item_display.title":()=>yee,"animated_java.tool.text_display.background_color.description":()=>oee,"animated_java.tool.text_display.background_color.title":()=>ree,"animated_java.tool.text_display.copy_text.copied":()=>xee,"animated_java.tool.text_display.copy_text.description":()=>_ee,"animated_java.tool.text_display.copy_text.title":()=>gee,"animated_java.tool.text_display.line_width.description":()=>aee,"animated_java.tool.text_display.line_width.title":()=>iee,"animated_java.tool.text_display.see_through.description":()=>hee,"animated_java.tool.text_display.see_through.title":()=>fee,"animated_java.tool.text_display.text_alignment.description":()=>uee,"animated_java.tool.text_display.text_alignment.options.center":()=>pee,"animated_java.tool.text_display.text_alignment.options.left":()=>dee,"animated_java.tool.text_display.text_alignment.options.right":()=>mee,"animated_java.tool.text_display.text_alignment.title":()=>cee,"animated_java.tool.text_display.text_shadow.description":()=>lee,"animated_java.tool.text_display.text_shadow.title":()=>see,"animated_java.vanilla_item_display.title":()=>Nee,default:()=>Qee});var VW="Animated Java",zW="\u0427\u0435\u0440\u0442\u0451\u0436",UW="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0447\u0435\u0440\u0442\u0435\u0436\u0430",qW="\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F",HW="\u0421\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439",JW="\u041E \u043D\u0430\u0441",GW="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438",WW="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430",KW="\u042D\u043A\u0441\u043F\u043E\u0440\u0442",YW="\u042D\u043A\u0441\u043F\u043E\u0440\u0442 (\u041E\u0442\u043B\u0430\u0434\u043A\u0430)",XW="\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u0432\u0441\u0435\u0433\u043E",ZW="\u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0435 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0447\u0435\u0440\u0442\u0435\u0436\u0438.",QW="\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u0432\u0441\u0435\u0433\u043E (\u041E\u0442\u043B\u0430\u0434\u043A\u0430)",$W="\u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0435 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0447\u0435\u0440\u0442\u0435\u0436\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u043E\u0442\u043B\u0430\u0434\u043A\u0438.",eK="\u0418\u0437\u0432\u043B\u0435\u0447\u044C",tK="\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u0438\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u0435",nK="\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u044F",iK="\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u044F",aK="\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0431\u043B\u043E\u043A \u0434\u0438\u0441\u043F\u043B\u0435\u044F",rK="\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438",oK='\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0438\u0437 "{0}"',sK="\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438",lK='\u0412\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0438\u0437 "{0}"',cK="\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 Animated Java...",uK="Animated Java \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u043E!",dK=`Animated Java \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C! \u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D.`,pK="\u0421\u043F\u0430\u0441\u0438\u0431\u043E \u0437\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443!",mK="\u041D\u0430\u0447\u043D\u0451\u043C \u0430\u043D\u0438\u043C\u0438\u0440\u043E\u0432\u0430\u0442\u044C!",fK="Animated Java \u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u0430 \u043D\u0435\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C",hK=`\u0423 \u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u044B \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u044B\u0437\u044B\u0432\u0430\u044E\u0442 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B \u0441 Animated Java. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0438\u0442\u0435 \u044D\u0442\u0438 \u043F\u043B\u0430\u0433\u0438\u043D(\u044B) \u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0435 Blockbench \u0447\u0442\u043E\u0431\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C Animated Java:`,gK="\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043B\u0430\u0433\u0438\u043D",_K="\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u0441\u0435 \u043D\u0435\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B",xK="\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C (\u041D\u0435 \u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F)",vK=`\u042D\u0442\u043E\u0442 \u043F\u043B\u0430\u0433\u0438\u043D \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B \u0441 Animated Java. \u0412\u044B \u043D\u0435 \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u043F\u043B\u0430\u0433\u0438\u043D \u043F\u043E\u043A\u0430 Animated Java \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D.`,bK="\u0421\u0431\u0440\u043E\u0441 \u043A \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u043C \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E",yK="\u041F\u0440\u043E Animated Java",wK="\u0417\u0430\u043A\u0440\u044B\u0442\u044C",EK="Animated Java \u0421\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439",kK="\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u043F\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043D\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430!",jK="\u0417\u0430\u043A\u0440\u044B\u0442\u044C",AK="\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439 \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430!",TK="\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0447\u0442\u043E\u0431\u044B \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439.",CK="\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0441\u043E\u043E\u0431\u0449\u0438\u0442\u0435 \u043E\u0431 \u044D\u0442\u043E\u0439 \u043E\u0448\u0438\u0431\u043A\u0435 \u0432 \u043D\u0430\u0448\u0435\u043C {0} \u0438 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u0442\u0438\u043A\u0435\u0442 \u0432 #animated-java-support \u043A\u0430\u043D\u0430\u043B\u0435, \u0438\u043B\u0438 \u0441\u043E\u0437\u0434\u0430\u0432 \u0437\u0430\u0434\u0430\u0447\u0443 \u043D\u0430 \u043D\u0430\u0448\u0435\u043C {1}. \u0421\u043F\u0430\u0441\u0438\u0431\u043E!",SK="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0447\u0435\u0440\u0442\u0435\u0436\u0430",OK="\u041F\u0440\u043E\u0435\u043A\u0442",IK="\u041F\u0440\u043E\u0434\u0432\u0438\u043D\u0443\u0442\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0434\u043E\u043B\u0436\u043D\u044B \u0431\u044B\u0442\u044C \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438!",DK="\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435",FK=`\u0418\u043C\u044F \u0444\u0430\u0439\u043B\u0430 \u0447\u0435\u0440\u0442\u0435\u0436\u0430. \u042D\u0442\u043E \u0431\u0443\u0434\u0435\u0442 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043E, \u0435\u0441\u043B\u0438 \u0432\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u0435 \u0447\u0435\u0440\u0442\u0451\u0436 \u043F\u043E \u0434\u0440\u0443\u0433\u0438\u043C \u0438\u043C\u0435\u043D\u0435\u043C.`,NK="\u0420\u0430\u0437\u043C\u0435\u0440 \u0422\u0435\u043A\u0441\u0442\u0443\u0440\u044B",RK=`\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 UV. \u042D\u0442\u043E \u0434\u043E\u043B\u0436\u043D\u043E \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440\u0443 \u0441\u0430\u043C\u043E\u0439 \u0431\u043E\u043B\u044C\u0448\u043E\u0439 \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u044B \u0432 \u0432\u0430\u0448\u0435\u043C \u0447\u0435\u0440\u0442\u0435\u0436\u0435.`,MK="\u0420\u0430\u0437\u043C\u0435\u0440 \u0422\u0435\u043A\u0441\u0442\u0443\u0440\u044B \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u044B\u043C!",BK="\u0420\u0430\u0437\u043C\u0435\u0440 \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u044B \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0441\u0442\u0435\u043F\u0435\u043D\u044C\u044E \u0447\u0438\u0441\u043B\u0430 2, \u0435\u0441\u043B\u0438 \u044D\u0442\u043E \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E!",PK="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0420\u0430\u0437\u043C\u0435\u0440 \u0422\u0435\u043A\u0441\u0442\u0443\u0440\u044B \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440\u0443 \u0441\u0430\u043C\u043E\u0439 \u0431\u043E\u043B\u044C\u0448\u043E\u0439 \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u044B \u0432 \u0432\u0430\u0448\u0435\u043C \u0447\u0435\u0440\u0442\u0435\u0436\u0435!",LK="\u042D\u043A\u0441\u043F\u043E\u0440\u0442",VK="\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0435\u043D",zK=`\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0451\u043D \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043E \u043F\u0440\u0438 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0420\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0430 \u0438 \u0414\u0430\u0442\u0430\u043F\u0430\u043A\u0430. \u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0451\u043D \u0447\u0442\u043E\u0431\u044B \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432 \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u0420\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0430\u043C\u0438 \u0438 \u0414\u0430\u0442\u0430\u043F\u0430\u043A\u0430\u043C\u0438.`,UK="\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0451\u043D \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u043C!",qK='\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0451\u043D \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 "{0}" \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0439 \u0440\u0430\u0431\u043E\u0442\u044B \u043F\u043B\u0430\u0433\u0438\u043D\u0430! \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0451\u043D.',HK="\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0451\u043D \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 \u0438\u043C\u0435\u0435\u0442 \u0437\u0430\u043F\u0440\u0435\u0449\u0451\u043D\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B! \u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u043C\u0451\u043D \u043C\u043E\u0433\u0443\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u0431\u0443\u043A\u0432\u044B, \u0446\u0438\u0444\u0440\u044B \u0438 \u043D\u0438\u0436\u043D\u0438\u0435 \u043F\u043E\u0434\u0447\u0451\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F.",JK="\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u041E\u0431\u043B\u0430\u0441\u0442\u044C \u0420\u0435\u043D\u0434\u0435\u0440\u0430",GK="\u041A\u043E\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0440\u0435\u043D\u0434\u0435\u0440 \u043A\u043E\u0440\u043E\u0431\u043A\u0443 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",WK="\u0410\u0432\u0442\u043E-\u0440\u0430\u0437\u043C\u0435\u0440 \u041E\u0431\u043B\u0430\u0441\u0442\u0438 \u0420\u0435\u043D\u0434\u0435\u0440\u0430",KK="\u041A\u043E\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u043E\u0431\u043B\u0430\u0441\u0442\u044C \u0440\u0435\u043D\u0434\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0433\u0435\u043E\u043C\u0435\u0442\u0440\u0438\u0438 \u043C\u043E\u0434\u0435\u043B\u0438.",YK="\u0420\u0430\u0437\u043C\u0435\u0440 \u041E\u0431\u043B\u0430\u0441\u0442\u0438 \u0420\u0435\u043D\u0434\u0435\u0440\u0430",XK="[\u0420\u0430\u0437\u043C\u0435\u0440 \u0438 \u0412\u044B\u0441\u043E\u0442\u0430](https://minecraft.wiki/w/Display#Entity_data) \u0434\u0438\u0441\u043F\u043B\u0435\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0440\u0438\u0433\u0430.",ZK="\u041E\u0431\u043B\u0430\u0441\u0442\u044C \u043E\u0431\u0437\u043E\u0440\u0430",QK="[\u041E\u0431\u043B\u0430\u0441\u0442\u044C \u043E\u0431\u0437\u043E\u0440\u0430](https://minecraft.wiki/w/Display#Entity_data) \u0440\u0438\u0433\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.",$K="\u0420\u0435\u0436\u0438\u043C \u041F\u043B\u0430\u0433\u0438\u043D\u0430",eY="\u041A\u043E\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u043F\u0440\u043E\u0435\u043A\u0442 \u0431\u0443\u0434\u0435\u0442 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D \u043A\u0430\u043A JSON \u0444\u0430\u0439\u043B \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u043B\u0430\u0433\u0438\u043D\u0430\u043C\u0438.",tY="\u0420\u0435\u0436\u0438\u043C \u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 \u0420\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0430",nY="\u041F\u0430\u043F\u043A\u0430",iY="Zip \u0410\u0440\u0445\u0438\u0432",aY="\u041D\u0438\u0447\u0435\u0433\u043E",rY="\u0420\u0435\u0436\u0438\u043C \u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 \u0414\u0430\u0442\u0430\u043F\u0430\u043A\u0430",oY="\u041F\u0430\u043F\u043A\u0430",sY="Zip \u0410\u0440\u0445\u0438\u0432",lY="\u041D\u0438\u0447\u0435\u0433\u043E",cY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u0430\u044F \u041C\u0430\u0439\u043D\u043A\u0440\u0430\u0444\u0442 \u0432\u0435\u0440\u0441\u0438\u044F",uY=`\u0412\u0435\u0440\u0441\u0438\u044F \u041C\u0430\u0439\u043D\u043A\u0440\u0430\u0444\u0442\u0430 \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u0431\u0443\u0434\u0435\u0442 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D \u043F\u0440\u043E\u0435\u043A\u0442. \u0415\u0441\u043B\u0438 \u0432\u0435\u0440\u0441\u0438\u044F \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u0432\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0443\u044E \u0432\u0435\u0440\u0441\u0438\u044E \u043D\u0438\u0436\u0435 \u043D\u0443\u0436\u043D\u043E\u0439. \u0422.\u0435 \u0415\u0441\u043B\u0438 \u0432\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 \`1.21.8\`, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \`1.21.5\`. \u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B, \u0438\u043B\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. Animated Java \u0443\u0432\u0435\u0434\u043E\u043C\u0438\u0442 \u0432\u0430\u0441 \u043E \u043B\u044E\u0431\u044B\u0445 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F\u0445, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u043E\u0441\u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u044B.`,dY="\u0420\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A",pY="\u041F\u0440\u043E\u0434\u0432\u0438\u043D\u0443\u0442\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",mY="\u041F\u0440\u043E\u0434\u0432\u0438\u043D\u0443\u0442\u044B\u0435 \u043F\u0430\u043F\u043A\u0438",fY="\u041F\u0440\u0435\u0434\u043C\u0435\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439",hY=`\u041F\u0440\u0435\u0434\u043C\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043C\u043E\u0434\u0435\u043B\u0435\u0439 \u0440\u0438\u0433\u0430. \u041C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u043E \u0447\u0435\u0440\u0442\u0435\u0436\u0435\u0439 \u0432 \u043E\u0434\u043D\u043E\u043C \u0438 \u0442\u043E\u043C \u0436\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0435 \u043C\u043E\u0433\u0443\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043E\u0434\u0438\u043D \u0438 \u0442\u043E\u0442 \u0436\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442, \u0438 \u043E\u043D\u0438 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u044B \u043F\u0440\u0438 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0435.`,gY="\u041D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D \u043F\u0440\u0435\u0434\u043C\u0435\u0442!",_Y="\u0412\u044B\u0431\u0440\u0430\u043D \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0439 ID \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430! ID \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 \u0434\u043E\u043B\u0436\u043D\u044B \u0431\u044B\u0442\u044C \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435`namespace:item_id`.",xY="\u0412\u044B\u0431\u0440\u0430\u043D \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0439 ID \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430! ID \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 \u043D\u0435 \u0434\u043E\u043B\u0436\u043D\u044B \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432.",vY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u0430\u043D\u0438\u043B\u044C\u043D\u043E\u0439 \u0438\u0433\u0440\u0435!",bY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 `minecraft:item/generated` \u0432 \u0444\u043E\u0440\u043C\u0435 \u0441\u0432\u043E\u0435\u0433\u043E \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044F. \u042D\u0442\u043E \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043A \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C \u0432 \u0438\u0433\u0440\u0435.",yY=`\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u043D\u0435 \u0438\u043C\u0435\u0435\u0442 \u0444\u0430\u0439\u043B\u0430 \u043C\u043E\u0434\u0435\u043B\u0438 \u0432 \u0432\u0430\u043D\u0438\u043B\u044C\u043D\u043E\u043C \u0440\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0435! \u0415\u0441\u043B\u0438 \u0432\u044B \u043F\u0440\u0435\u0434\u043F\u043E\u043B\u0430\u0433\u0430\u0435\u0442\u0435, \u0447\u0442\u043E \u044D\u0442\u043E \u043E\u0448\u0438\u0431\u043A\u0430, \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C Blockbench, \u0438 \u043F\u043E\u0434\u043E\u0436\u0434\u0430\u0442\u044C \u043F\u043E\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 AJ \u043F\u0440\u043E\u043F\u0430\u0434\u0451\u0442 \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u0447\u0435\u0440\u0442\u0435\u0436\u0430.`,wY="CMD \u0421\u043C\u0435\u0449\u0435\u043D\u0438\u0435",EY="\u0421\u043C\u0435\u0449\u0430\u0435\u0442 Custom Model Data (CMD) \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0432 \u043F\u0440\u0435\u0434\u0438\u043A\u0430\u0442\u0430\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u044F \u043D\u0430 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435.",kY="\u0420\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A",jY="\u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u0420\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0430 \u0434\u043B\u044F \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430.\n\n\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A \u0434\u043E\u043B\u0436\u0435\u043D \u0438\u043C\u0435\u0442\u044C \u0444\u0430\u0439\u043B `pack.mcmeta`.",AY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043F\u0430\u043F\u043A\u0443 `assets`!",TY="\u041F\u0430\u043F\u043A\u0430 \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u0430!",CY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442!",SY="\u0423\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u0430\u043F\u043A\u043E\u0439!",OY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0430\u0439\u043B pack.mcmeta!",IY="\u0420\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A Zip \u0410\u0440\u0445\u0438\u0432",DY="\u041F\u0443\u0442\u044C \u043A .zip \u0430\u0440\u0445\u0438\u0432\u0443 \u0434\u043B\u044F \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430.",FY="\u0424\u0430\u0439\u043B \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D!",NY="\u0423\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0444\u0430\u0439\u043B\u043E\u043C!",RY="\u0414\u0430\u0442\u0430\u043F\u0430\u043A",MY="\u0414\u0430\u0442\u0430\u043F\u0430\u043A",BY="\u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u0414\u0430\u0442\u0430\u043F\u0430\u043A\u0430 \u0434\u043B\u044F \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430.\n\n\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0434\u0430\u0442\u0430\u043F\u0430\u043A \u0434\u043E\u043B\u0436\u0435\u043D \u0438\u043C\u0435\u0442\u044C \u0444\u0430\u0439\u043B `pack.mcmeta`.",PY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0434\u0430\u0442\u0430\u043F\u0430\u043A \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043F\u0430\u043F\u043A\u0443 `data`!",LY="\u041F\u0430\u043F\u043A\u0430 \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u0430!",VY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442!",zY="\u0423\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u0430\u043F\u043A\u043E\u0439!",UY="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0430\u0439\u043B pack.mcmeta!",qY="\u0414\u0430\u0442\u0430\u043F\u0430\u043A Zip \u0410\u0440\u0445\u0438\u0432",HY="\u041F\u0443\u0442\u044C \u043A .zip \u0430\u0440\u0445\u0438\u0432\u0443 \u0434\u043B\u044F \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430.",JY="\u0424\u0430\u0439\u043B \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D!",GY="\u0423\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0444\u0430\u0439\u043B\u043E\u043C!",WY="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435",KY="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435.\n\n\u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A `.mcfunction` \u0444\u0430\u0439\u043B.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",YY="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438",XY="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438.\n\n\u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A `.mcfunction` \u0444\u0430\u0439\u043B.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",ZY="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u0434\u043E \u0442\u0438\u043A\u0430",QY="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 *\u043F\u0435\u0440\u0435\u0434* \u0442\u0438\u043A \u043B\u043E\u0433\u0438\u043A\u043E\u0439 Animated Java.\n\n\u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A `.mcfunction` \u0444\u0430\u0439\u043B.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",$Y="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u043E\u0441\u043B\u0435 \u0442\u0438\u043A\u0430",eX="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 *\u043F\u043E\u0441\u043B\u0435* \u0442\u0438\u043A \u043B\u043E\u0433\u0438\u043A\u0438 Animated Java.\n\n\u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A `.mcfunction` \u0444\u0430\u0439\u043B.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",tX="\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0418\u043D\u0442\u0435\u0440\u043F\u043E\u043B\u044F\u0446\u0438\u0438",nX=`[\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0438\u043D\u0442\u0435\u0440\u043F\u043E\u043B\u044F\u0446\u0438\u0438](https://minecraft.wiki/w/Display#Entity_data) \u0440\u0438\u0433\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E. \u0427\u0435\u043C \u0432\u044B\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0442\u0435\u043C \u043F\u043B\u0430\u0432\u043D\u0435\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F, \u043D\u043E \u043C\u0435\u043D\u044C\u0448\u0435 \u043E\u0442\u0437\u044B\u0432\u0447\u0438\u0432\u043E\u0441\u0442\u044C.`,iX="\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u0438",aX=`[\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u0438](https://minecraft.wiki/w/Display#Entity_data) \u0440\u0438\u0433\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E. \u0427\u0435\u043C \u0432\u044B\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0442\u0435\u043C \u043F\u043B\u0430\u0432\u043D\u0435\u0435 \u043A\u0440\u0443\u043F\u043D\u044B\u0435 \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u044F, \u043D\u043E \u043C\u0435\u043D\u044C\u0448\u0435 \u043E\u0442\u0437\u044B\u0432\u0447\u0438\u0432\u043E\u0441\u0442\u044C.`,rX="\u0410\u0432\u0442\u043E\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u043E\u0440\u0438\u0435\u043D\u0442\u0430\u0446\u0438\u0438 \u0440\u0438\u0433\u0430",oX=`\u041A\u043E\u0433\u0434\u0430 **\u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E**, \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0438 \u043F\u043E\u0432\u043E\u0440\u043E\u0442\u044B \u0432\u0441\u0435\u0445 \u043D\u043E\u0434\u043E\u0432\u044B\u0445 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u0441 \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u044C\u044E \u043A\u0430\u0436\u0434\u044B\u0439 \u0442\u0438\u043A. \u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u043E \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u044C \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0442\u044C \u0440\u0438\u0433. \u041A\u043E\u0433\u0434\u0430 **\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E**, \u0432\u0430\u043C \u0441\u0442\u043E\u0438\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C move \u0444\u0443\u043D\u043A\u0446\u0438\u044E \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u044F \u0440\u0438\u0433\u0430: \`\`\` execute as @e[tag=aj.<\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E_\u0438\u043C\u0451\u043D>_root] \\ positioned rotated run \\ function animated_java:<\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E_\u0438\u043C\u0451\u043D>/move \`\`\` \u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0438 \u043F\u043E\u0432\u043E\u0440\u043E\u0442\u044B \u043D\u043E\u0434\u043E\u0432 \u043A\u0430\u0436\u0434\u044B\u0439 \u0442\u0438\u043A \u043C\u043E\u0436\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044C \u043D\u0430\u0433\u0440\u0443\u0437\u043A\u0443, \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E \u0434\u043B\u044F \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0440\u0438\u0433\u043E\u0432. \u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u043C\u043E\u0436\u0435\u0442 \u0443\u043B\u0443\u0447\u0448\u0438\u0442\u044C \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0436\u0435\u0440\u0442\u0432\u0443\u044F \u0443\u0434\u043E\u0431\u0441\u0442\u0432\u043E\u043C.`,sX="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u0434\u043B\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438",lX=`\u041A\u043E\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E, NBT \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043E \u0434\u043B\u044F \u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u0434\u0430\u043D\u043D\u044B\u0445 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 \u0432\u043C\u0435\u0441\u0442\u043E \u0444\u0443\u043D\u043A\u0446\u0438\u0439. \u042D\u0442\u043E \u0437\u043D\u0430\u0447\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0435\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0444\u0430\u0439\u043B\u043E\u0432 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0434\u0430\u0442\u0430\u043F\u0430\u043A\u0430, \u0431\u0443\u0434\u0443\u0447\u0438 \u0432 \u0440\u0430\u0437\u044B \u043C\u0435\u043D\u0435\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C.`,cX="\u0417\u0430\u043F\u0435\u0447\u0451\u043D\u043D\u044B\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438",uX=`\u0417\u0430\u043F\u0435\u043A\u0430\u0442\u044C \u0438\u043B\u0438 \u043D\u0435\u0442 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438. \u0417\u0430\u043F\u0435\u0447\u0451\u043D\u043D\u044B\u0435 \u043A\u0430\u0434\u0440\u044B \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0439 \u0437\u0430\u0440\u0430\u043D\u0435\u0435 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u044E\u0442\u0441\u044F \u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u044E\u0442\u0441\u044F \u0432 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 JSON \u0444\u0430\u0439\u043B, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u0440\u0435\u043D\u0434\u0435\u0440\u0430 \u043C\u043E\u0434\u0435\u043B\u0438 \u0432 \u0438\u0433\u0440\u0435. \u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u041F\u043B\u0430\u0433\u0438\u043D\u044B \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u0442\u044C \u044D\u0442\u0443 \u043E\u043F\u0446\u0438\u044E \u0447\u0442\u043E\u0431\u044B \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E.`,dX="JSON \u0424\u0430\u0439\u043B",pX="\u041F\u0443\u0442\u044C \u043A JSON \u0444\u0430\u0439\u043B\u0443 \u0434\u043B\u044F \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430.",mX="\u0424\u0430\u0439\u043B \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D!",fX="\u0423\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0444\u0430\u0439\u043B\u043E\u043C!",hX='\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0434\u043B\u044F "{0}"',gX="\u041D\u043E\u0434",_X="\u0414\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430",xX="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435",vX="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435.\n\n\u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A `.mcfunction` \u0444\u0430\u0439\u043B.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",bX="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438",yX="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430.\n\n\u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A `.mcfunction` \u0444\u0430\u0439\u043B.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",wX="\u0418\u043C\u044F",EX="\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0438\u043C\u044F \u043D\u043E\u0434\u0430.",kX=`\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 JSON \u0442\u0435\u043A\u0441\u0442! {0}`,jX="\u0412\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0438\u043C\u0435\u043D\u0438",AX="\u0412\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u043B\u0438 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0438\u043C\u0435\u043D\u0438.",TX="\u0421\u0432\u0435\u0447\u0435\u043D\u0438\u0435",CX="\u0412\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u043B\u0438 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u0435 \u043D\u043E\u0434\u0430 \u0432 \u0438\u0433\u0440\u0435.",SX="\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0446\u0432\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F",OX="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043B\u0438 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0446\u0432\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F.",IX="\u0426\u0432\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F",DX="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043E\u043A\u0440\u0430\u0441 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F \u043D\u043E\u0434\u0430.",FX="\u0420\u0430\u0434\u0438\u0443\u0441 \u0442\u0435\u043D\u0438",NX="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0434\u0438\u0443\u0441 \u0442\u0435\u043D\u0438.",RX="\u0418\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0442\u0435\u043D\u0438",MX="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0442\u0435\u043D\u0438.",BX="\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u044F\u0440\u043A\u043E\u0441\u0442\u044C",PX="\u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u044F\u0440\u043A\u043E\u0441\u0442\u044C \u043D\u043E\u0434\u0430.",LX="\u042F\u0440\u043A\u043E\u0441\u0442\u044C",VX="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u044F\u0440\u043A\u043E\u0441\u0442\u044C \u043D\u043E\u0434\u0430. \u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043E\u0442 0 \u0434\u043E 15.",zX="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u044F\u0440\u043A\u043E\u0441\u0442\u044C",UX="\u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u044F\u0440\u043A\u043E\u0441\u0442\u044C \u043D\u043E\u0434\u0430..",qX="\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u044F\u0440\u043A\u043E\u0441\u0442\u044C",HX="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u044F\u0440\u043A\u043E\u0441\u0442\u044C \u043D\u043E\u0434\u0430. \u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043E\u0442 0 \u0434\u043E 15.",JX="\u0417\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439",GX="\u0412\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u043B\u0438 \u0431\u043B\u0435\u0441\u043A \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0441\u0442\u0438 \u043D\u043E\u0434\u0430.",WX="\u041D\u0435\u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C",KX="\u0412\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u043B\u0438 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u043D\u043E\u0434\u0430 \u0432 \u0438\u0433\u0440\u0435.",YX="\u0411\u0438\u043B\u0431\u043E\u0440\u0434",XX=`\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043F\u043E\u0432\u043E\u0440\u043E\u0442 \u043A \u0432\u0437\u0433\u043B\u044F\u0434\u0443 \u0438\u0433\u0440\u043E\u043A\u0430 \u043F\u0440\u0438 \u0440\u0435\u043D\u0434\u0435\u0440\u0435. - **\u0424\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439**: \u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u043E\u0441\u0438 \u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u044B. - **\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0439**: \u041F\u043E\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438. - **\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0439**: \u041F\u043E\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438. - **\u0426\u0435\u043D\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439**: \u041F\u043E\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u0446\u0435\u043D\u0442\u0440\u0443.`,ZX="\u0424\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439",QX="\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0439",$X="\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0439",eZ="\u0426\u0435\u043D\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439",tZ="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430",nZ=`\u0420\u0435\u0436\u0438\u043C \u041F\u043B\u0430\u0433\u0438\u043D\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D! \u041B\u043E\u043A\u0430\u0442\u043E\u0440\u044B \u043D\u0435 \u0438\u043C\u0435\u044E\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u041F\u043B\u0430\u0433\u0438\u043D\u0430. \u0412\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 Plugin API \u0447\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0432\u0430\u0448\u0438\u043C \u041B\u043E\u043A\u0430\u0442\u043E\u0440\u0430\u043C. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u043E Plugin API \u043C\u043E\u0436\u043D\u043E \u0443\u0437\u043D\u0430\u0442\u044C \u0432 \u041E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0439 Plugin API \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438.`,iZ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u044C",aZ="\u041A\u043E\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u043B\u043E\u043A\u0430\u0442\u043E\u0440 \u0441\u043E\u0437\u0434\u0430\u0441\u0442 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u044C \u0432\u043C\u0435\u0441\u0442\u043E \u043A\u043E\u043E\u0440\u0434\u0438\u043D\u0430\u0442 \u0432 \u0438\u0433\u0440\u0435.",rZ="\u0422\u0438\u043F \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438",oZ="\u0422\u0438\u043F \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u0438\u0432\u044F\u0437\u0430\u043D \u043A \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0443.",sZ="\u0422\u0438\u043F \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u043C!",lZ="\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043C\u0430\u0439\u043D\u043A\u0440\u0430\u0444\u0442\u0435 {0}",cZ="\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u041F\u043E\u0432\u043E\u0440\u043E\u0442 \u041F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043E\u0432",uZ="\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043F\u043E\u0432\u043E\u0440\u043E\u0442 \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043E\u0432 \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430.",dZ="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435",pZ="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430 \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",mZ="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430 \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",fZ="\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438",hZ="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",gZ="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `as` (\u043E\u0442 \u043B\u0438\u0446\u0430) \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0438 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",_Z="\u0422\u0438\u043A \u0444\u0443\u043D\u043A\u0446\u0438\u044F",xZ="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u0442\u0438\u043A.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",vZ="\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 `at` (\u043D\u0430 \u043C\u0435\u0441\u0442\u0435) \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043B\u043E\u043A\u0430\u0442\u043E\u0440\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u0442\u0438\u043A.\n\n\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.",bZ="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u044F",yZ="\u0412\u0430\u043D\u0438\u043B\u044C\u043D\u0430\u044F \u043C\u043E\u0434\u0435\u043B\u044C \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430",wZ=`\u0415\u0441\u043B\u0438 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D, \u043A\u043E\u0441\u0442\u044C \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043D\u0434\u0435\u0440\u0438\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0432\u0430\u043D\u0438\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u0435\u0434\u043C\u0435\u0442. \u042D\u0442\u043E \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0448\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043A\u0443\u0431\u044B \u043A\u043E\u0441\u0442\u0438.`,EZ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C NBT",kZ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 NBT \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u044C \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.",jZ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 NBT \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0448\u0435\u0442 \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438, \u0438 \u043B\u044E\u0431\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044B \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438!",AZ="\u041D\u0430\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",TZ="\u041D\u0430\u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043E\u0442 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438.",CZ="\u0421\u0432\u0435\u0447\u0435\u043D\u0438\u0435",SZ="\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0432 \u0438\u0433\u0440\u0435.",OZ="\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0446\u0432\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F",IZ="\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0446\u0432\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F \u0432 \u0438\u0433\u0440\u0435.",DZ="\u0426\u0432\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F",FZ="\u0426\u0432\u0435\u0442 \u0441\u0432\u0435\u0447\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438.",NZ="\u0420\u0430\u0434\u0438\u0443\u0441 \u0442\u0435\u043D\u0438",RZ="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0434\u0438\u0443\u0441 \u0442\u0435\u043D\u0438.",MZ="\u0418\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0442\u0435\u043D\u0438",BZ="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0442\u0435\u043D\u0438.",PZ="\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u044F\u0440\u043A\u043E\u0441\u0442\u044C",LZ="\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u044F\u0440\u043A\u043E\u0441\u0442\u044C.",VZ="\u042F\u0440\u043A\u043E\u0441\u0442\u044C",zZ="\u042F\u0440\u043A\u043E\u0441\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438. \u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043E\u0442 0 \u0434\u043E 15.",UZ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u042F\u0440\u043A\u043E\u0441\u0442\u044C",qZ="\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u044F\u0440\u043A\u043E\u0441\u0442\u044C \u0434\u043B\u044F \u043A\u043E\u0441\u0442\u0438.",HZ="\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u044F\u0440\u043A\u043E\u0441\u0442\u044C",JZ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u044F\u0440\u043A\u043E\u0441\u0442\u044C \u0434\u043B\u044F \u043A\u043E\u0441\u0442\u0438. \u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043E\u0442 0 \u0434\u043E 15.",GZ="\u041D\u0435\u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C",WZ="\u0412\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u043B\u0438 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u0432 \u0438\u0433\u0440\u0435.",KZ="NBT",YZ="NBT \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u043E\u0435 \u043A \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439-\u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438.",XZ="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0431\u043B\u043E\u043A \u0434\u0438\u0441\u043F\u043B\u0435\u044F",ZZ="\u0418\u043C\u044F",QZ="\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0438\u043C\u044F \u0431\u043B\u043E\u043A \u0434\u0438\u0441\u043F\u043B\u0435\u044F.",$Z=`\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 JSON \u0442\u0435\u043A\u0441\u0442! {0}`,eQ="\u0412\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0438\u043C\u0435\u043D\u0438",tQ="\u0412\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u043B\u0438 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0438\u043C\u0435\u043D\u0438.",nQ="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u044F",iQ="\u0418\u043C\u044F",aQ="\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0438\u043C\u044F \u0431\u043B\u043E\u043A \u0434\u0438\u0441\u043F\u043B\u0435\u044F.",rQ=`\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 JSON \u0442\u0435\u043A\u0441\u0442! {0}`,oQ="\u0412\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0438\u043C\u0435\u043D\u0438",sQ="\u0412\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u043B\u0438 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u0443\u044E \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0438\u043C\u0435\u043D\u0438.",lQ="\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",cQ="\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0435 \u0438\u043C\u044F",uQ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0438 \u0432 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u0445 \u043E\u0448\u0438\u0431\u043E\u043A.",dQ="\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u043C\u044F \u0438\u0437 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438",pQ="\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u043C\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0433\u043E \u0438\u043C\u0435\u043D\u0438.",mQ="\u0418\u043C\u044F",fQ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u0434\u0430\u0442\u0430\u043F\u0430\u043A\u0435 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0435.",hQ="\u0422\u0435\u043A\u0441\u0442\u0443\u0440\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430",gQ="\u041A\u0430\u0440\u0442\u0430 \u0442\u0435\u043A\u0441\u0442\u0443\u0440, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u044B \u043F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u044D\u0442\u043E\u0433\u043E \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430.",_Q="\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043C\u0430\u043F\u043F\u0438\u043D\u0433",xQ="\u0423 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430 \u043D\u0435\u0442 \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u043C\u044B\u0445 \u0442\u0435\u043A\u0441\u0442\u0443\u0440.",vQ=`\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043D\u043E\u0434\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0434\u043E\u043B\u0436\u043D\u044B \u0431\u044B\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430. \u041D\u043E\u0434\u044B \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0435 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430. \u041D\u043E\u0434\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0435 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u043E\u0441\u0442\u0430\u043D\u0443\u0442\u0441\u044F \u043D\u0435\u0442\u0440\u043E\u043D\u0443\u0442\u044B\u043C\u0438.`,bQ="\u0418\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043D\u043E\u0434\u044B",yQ="\u0421\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0434\u043E\u0432 \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u0434\u043E\u043B\u0436\u0435\u043D \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C. \u042D\u0442\u0438 \u043D\u043E\u0434\u044B \u043E\u0441\u0442\u0430\u043D\u0443\u0442\u0441\u044F \u043D\u0435\u0442\u0440\u043E\u043D\u0443\u0442\u044B\u043C\u0438.",wQ="\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043D\u043E\u0434\u044B",EQ="\u0421\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0434\u043E\u0432 \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u0434\u043E\u043B\u0436\u0435\u043D \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C. \u0422\u043E\u043B\u044C\u043A\u043E \u044D\u0442\u0438 \u043D\u043E\u0434\u044B \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B.",kQ="\u041F\u043E\u043C\u0435\u043D\u044F\u0442\u044C \u043C\u0435\u0441\u0442\u0430\u043C\u0438",jQ="\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C .ajmodel",AQ="\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C .ajmodel",TQ="\u0412\u044B\u0431\u0440\u0430\u0442\u044C .ajmodel \u0444\u0430\u0439\u043B",CQ="\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0432\u043E\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 .ajmodel \u0444\u0430\u0439\u043B\u044B \u043D\u0430 \u043D\u043E\u0432\u044B\u0439 .ajblueprint \u0444\u043E\u0440\u043C\u0430\u0442.",SQ="\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 .ajmodel \u0444\u0430\u0439\u043B \u0434\u043B\u044F \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F",OQ="\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 ({0})",IQ="\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438",DQ="\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u0434\u0430\u0442\u0430\u043F\u0430\u043A\u0435.",FQ="\u0420\u0435\u0436\u0438\u043C \u0446\u0438\u043A\u043B\u0430",NQ=`- \u041E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u044B\u0439: \u0410\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0451\u0442\u0441\u044F \u0435\u0434\u0438\u043D\u043E\u0436\u0434\u044B, \u0437\u0430\u0442\u0435\u043C \u0432\u0435\u0440\u043D\u0435\u0442\u0441\u044F \u043A \u043F\u0435\u0440\u0432\u043E\u043C\u0443 \u043A\u0430\u0434\u0440\u0443. - \u0423\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435: \u0410\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0451\u0442\u0441\u044F \u0435\u0434\u0438\u043D\u043E\u0436\u0434\u044B \u0438 \u043E\u0441\u0442\u0430\u043D\u0435\u0442\u0441\u044F \u043D\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u043C \u043A\u0430\u0434\u0440\u0435. - \u0426\u0438\u043A\u043B: \u0410\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0441\u043A\u043E\u043D\u0435\u0447\u043D\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C\u0441\u044F.`,RQ="\u041E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u044B\u0439",MQ="\u0423\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435",BQ="\u0426\u0438\u043A\u043B",PQ="\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u043C!",LQ="\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B! \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0439 \u043C\u043E\u0433\u0443\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u0431\u0443\u043A\u0432\u044B, \u0447\u0438\u0441\u043B\u0430, \u043D\u0438\u0436\u043D\u0438\u0435 \u043F\u043E\u0434\u0447\u0451\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F \u0438 \u0442\u043E\u0447\u043A\u0438.",VQ="\u0417\u0430\u0434\u0435\u0440\u0436\u043A\u0430 \u0446\u0438\u043A\u043B\u0430",zQ=`\u0417\u0430\u0434\u0435\u0440\u0436\u043A\u0430 \u0432 \u0442\u0438\u043A\u0430\u0445 \u043F\u0435\u0440\u0435\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u043C \u0437\u0430\u043F\u0443\u0441\u043A\u043E\u043C \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0426\u0438\u043A\u043B. \u0422.\u0435. \u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 20 \u0437\u043D\u0430\u0447\u0438\u0442, \u0447\u0442\u043E \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u0437\u0430\u0441\u0442\u044B\u043D\u0435\u0442 \u043D\u0430 1 \u0441\u0435\u043A\u0443\u043D\u0434\u0443 \u043F\u0435\u0440\u0435\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u043C \u0437\u0430\u043F\u0443\u0441\u043A\u043E\u043C.`,UQ=`\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043D\u043E\u0434\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u0434\u043E\u043B\u0436\u043D\u0430 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C. \u041D\u043E\u0434\u044B \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0435 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0435\u0439. \u041D\u043E\u0434\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0435 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u043E\u0441\u0442\u0430\u043D\u0443\u0442\u0441\u044F \u043D\u0435\u0442\u0440\u043E\u043D\u0443\u0442\u044B\u043C\u0438.`,qQ="\u0418\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043D\u043E\u0434\u044B",HQ="\u0421\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0434\u043E\u0432 \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u0431\u0443\u0434\u0435\u0442 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C. \u042D\u0442\u0438 \u043D\u043E\u0434\u044B \u043E\u0441\u0442\u0430\u043D\u0443\u0442\u0441\u044F \u043D\u0435\u0442\u0440\u043E\u043D\u0443\u0442\u044B\u043C\u0438.",JQ="\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043D\u043E\u0434\u044B",GQ="\u0421\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0434\u043E\u0432 \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C. \u0422\u043E\u043B\u044C\u043A\u043E \u044D\u0442\u0438 \u043D\u043E\u0434\u044B \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B.",WQ="\u041F\u043E\u043C\u0435\u043D\u044F\u0442\u044C \u043C\u0435\u0441\u0442\u0430\u043C\u0438",KQ="\u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435...",YQ="\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0447\u0435\u0440\u0442\u0435\u0436\u0430...",XQ="\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u044B",ZQ="\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442",QQ="\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442",$Q="\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442",e$="\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442",t$="\u0412\u0430\u0440\u0438\u0430\u043D\u0442 \u0432\u044B\u0431\u0440\u0430\u043D",n$="\u0412\u0430\u0440\u0438\u0430\u043D\u0442 \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D",i$="\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043D\u0435\u043B\u044C\u0437\u044F!",a$="\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043D\u0435\u043B\u044C\u0437\u044F!",r$="\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442",o$="\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442",s$="\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0430",l$="\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0430\u0440\u0438\u0430\u043D\u0442",c$="\u0418\u0441\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u0435 \u043D\u043E\u0434\u044B",u$="\u0418\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0441\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u0435 \u043D\u043E\u0434\u044B",d$="\u0412\u0430\u0440\u0438\u0430\u043D\u0442",p$="\u0424\u0443\u043D\u043A\u0446\u0438\u044F",m$="\u0412\u0430\u0440\u0438\u0430\u043D\u0442",f$="\u0424\u0443\u043D\u043A\u0446\u0438\u044F",h$="\u0423\u0441\u043B\u043E\u0432\u0438\u0435 Execute",g$="\u041F\u043E\u0432\u0442\u043E\u0440",_$="\u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u043F\u043E\u0432\u0442\u043E\u0440\u0430",x$="\u041A\u043B\u044E\u0447\u0435\u0432\u043E\u0439 \u043A\u0430\u0434\u0440 ({0})",v$="\u0412\u0430\u0440\u0438\u0430\u043D\u0442",b$="\u0412\u0430\u0440\u0438\u0430\u043D\u0442 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u044B\u0439 \u043A \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u043C\u0443 \u043A\u0430\u0434\u0440\u0443.",y$="\u0424\u0443\u043D\u043A\u0446\u0438\u044F",w$=`\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0438\u0436\u0435\u043D\u0438\u0438 \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0433\u043E \u043A\u0430\u0434\u0440\u0430. \u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A \`.mcfunction\` \u0444\u0430\u0439\u043B. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [MC-Build](https://mcbuild.dev) \u0441\u0438\u043D\u0442\u0430\u043A\u0441.`,E$="\u0423\u0441\u043B\u043E\u0432\u0438\u0435 Execute",k$="\u0423\u0441\u043B\u043E\u0432\u0438\u0435 \u043F\u0440\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0439 \u043A\u0430\u0434\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D.\n\n\u0412\u043E\u0441\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u043A\u0430\u043A `execute if` \u043A\u043E\u043C\u0430\u043D\u0434\u0443.\n\n\u0422.\u0435. `if score @s myScore matches 1..`",j$="\u041F\u043E\u0432\u0442\u043E\u0440",A$="\u041A\u043E\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0432 \u044D\u0442\u043E\u043C \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u043C \u043A\u0430\u0434\u0440\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C\u0441\u044F \u0432 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u043C \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0435.",T$="\u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B",C$=`\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0442\u0438\u043A\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u043F\u043E\u0432\u0442\u043E\u0440\u043E\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B. \u041F\u043E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 1 \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C \u043A\u0430\u0436\u0434\u044B\u0439 \u0442\u0438\u043A \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438.`,S$="\u0422\u0438\u043F \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F",O$="The type of easing to apply to the keyframe.",I$="\u041B\u0438\u043D\u0435\u0439\u043D\u043E\u0435",D$="\u0421\u0438\u043D\u0443\u0441\u043E\u0438\u0434\u0430\u043B\u044C\u043D\u043E\u0435",F$="\u041A\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043D\u043E\u0435",N$="\u041A\u0443\u0431\u0438\u0447\u0435\u0441\u043A\u043E\u0435",R$="\u0411\u0438\u043A\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043D\u043E\u0435",M$="\u0411\u0438\u043A\u0443\u0431\u0438\u0447\u0435\u0441\u043A\u043E\u0435",B$="\u042D\u043A\u0441\u043F\u043E\u043D\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0435",P$="\u041A\u0440\u0443\u0433\u043E\u0432\u043E\u0435",L$="\u042D\u043B\u0430\u0441\u0442\u0438\u0447\u043D\u043E\u0435",V$="\u041E\u0442\u0441\u043A\u043E\u043A \u043D\u0430\u0437\u0430\u0434",z$="\u041F\u0440\u044B\u0433\u0430\u044E\u0449\u0435\u0435",U$="\u0420\u0435\u0436\u0438\u043C \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F",q$="\u0420\u0435\u0436\u0438\u043C \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F \u043A \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u043C\u0443 \u043A\u0430\u0434\u0440\u0443.",H$="\u0412 \u043D\u0430\u0447\u0430\u043B\u0435",J$="\u0412 \u043A\u043E\u043D\u0446\u0435",G$="\u0412 \u043D\u0430\u0447\u0430\u043B\u0435 \u0438 \u0432 \u043A\u043E\u043D\u0446\u0435",W$="\u0410\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u044B \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F",K$="\u0410\u0433\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u044B\u0435 \u043A \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F.",Y$="\u042D\u043B\u0430\u0441\u0442\u0438\u0447\u043D\u043E\u0441\u0442\u044C",X$="\u042D\u043B\u0430\u0441\u0442\u0438\u0447\u043D\u043E\u0441\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F.",Z$="\u041F\u0435\u0440\u0435\u0440\u0430\u0441\u0442\u044F\u0436\u0435\u043D\u0438\u0435",Q$="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0442\u0435\u043F\u0435\u043D\u044C \u043F\u0435\u0440\u0435\u0440\u0430\u0441\u0442\u044F\u0436\u0435\u043D\u0438\u044F \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F.",$$="\u041F\u0440\u044B\u0433\u0443\u0447\u0435\u0441\u0442\u044C",eee="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0442\u0435\u043F\u0435\u043D\u044C \u043F\u0440\u044B\u0433\u0443\u0447\u0435\u0441\u0442\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F.",tee=`\u041F\u0440\u043E\u0434\u0432\u0438\u043D\u0443\u0442\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u044F \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u044B. \u0421\u043C\u0435\u043D\u0438\u0442\u0435 \u0440\u0435\u0436\u0438\u043C \u0438\u043D\u0442\u0435\u0440\u043F\u043E\u043B\u044F\u0446\u0438\u0438 \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0433\u043E \u043A\u0430\u0434\u0440\u0430 \u043D\u0430 \u043B\u0438\u043D\u0435\u0439\u043D\u044B\u0439 \u0434\u043B\u044F \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F.`,nee="\u0422\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439",iee="\u0414\u043B\u0438\u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0438",aee="\u0428\u0438\u0440\u0438\u043D\u0430 \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u044F \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.",ree="\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430",oee="\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0442\u0435\u043A\u0441\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u044F.",see="\u0422\u0435\u043D\u044C \u0442\u0435\u043A\u0441\u0442\u0430",lee="\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0442\u0435\u043D\u0438 \u0442\u0435\u043A\u0441\u0442\u0430.",cee="\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430",uee="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430.",dee="\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",pee="\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",mee="\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",fee="\u0421\u043A\u0432\u043E\u0437\u043D\u0430\u044F \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C",hee="\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0442\u0435\u043A\u0441\u0442 \u0432\u0438\u0434\u0435\u043D \u0441\u043A\u0432\u043E\u0437\u044C \u0431\u043B\u043E\u043A\u0438.",gee="\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442",_ee="\u041A\u043E\u043F\u0438\u0440\u0443\u0435\u0442 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430.",xee="\u0422\u0435\u043A\u0441\u0442 \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430!",vee="\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0439 \u043F\u0440\u0435\u0434\u043C\u0435\u0442",bee="\u041F\u0440\u0435\u0434\u043C\u0435\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F.",yee="\u0420\u0435\u0436\u0438\u043C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430",wee='\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u0430\u043A\u0430\u044F \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043C\u043E\u0434\u0435\u043B\u0438 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0430 \u043A \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0443 (\u043A\u0430\u043A \u0443\u043A\u0430\u0437\u0430\u043D\u043E \u0432 \u043F\u043E\u043B\u0435 "display" JSON-\u0444\u0430\u0439\u043B\u0430 \u043C\u043E\u0434\u0435\u043B\u0438).',Eee="\u041D\u0435\u0442",kee="\u041E\u0442 \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E \u043B\u0438\u0446\u0430 (\u043B\u0435\u0432\u0430\u044F \u0440\u0443\u043A\u0430)",jee="\u041E\u0442 \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E \u043B\u0438\u0446\u0430 (\u043F\u0440\u0430\u0432\u0430\u044F \u0440\u0443\u043A\u0430)",Aee="\u041E\u0442 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043B\u0438\u0446\u0430 (\u043B\u0435\u0432\u0430\u044F \u0440\u0443\u043A\u0430)",Tee="\u041E\u0442 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043B\u0438\u0446\u0430 (\u043F\u0440\u0430\u0432\u0430\u044F \u0440\u0443\u043A\u0430)",Cee="\u0413\u043E\u043B\u043E\u0432\u0430",See="\u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (GUI)",Oee="\u041D\u0430 \u0437\u0435\u043C\u043B\u0435",Iee="\u0424\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E",Dee="\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0439 \u0431\u043B\u043E\u043A",Fee="\u0411\u043B\u043E\u043A, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0431\u043B\u043E\u043A\u043E\u0432!",Nee="\u041F\u0440\u0435\u0434\u043C\u0435\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439",Ree="\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C",Mee="\u0412\u044B \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u043B\u0438 \u044D\u043A\u0441\u043F\u043E\u0440\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0430, \u043D\u043E \u0432 \u0432\u0430\u0448\u0435\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435 \u0435\u0441\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043C\u043E\u0434\u0435\u043B\u0438! \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u044D\u043A\u0441\u043F\u043E\u0440\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043F\u0430\u043A\u0430 \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0438\u0442\u0435 \u043C\u043E\u0434\u0435\u043B\u0438 \u043F\u0435\u0440\u0435\u0434 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u043E\u043C.",Bee="\u0412 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0447\u0435\u0440\u0442\u0435\u0436\u0430 \u043D\u0430\u0439\u0434\u0435\u043D\u044B \u043E\u0448\u0438\u0431\u043A\u0438! \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u0438\u0445 \u043F\u0435\u0440\u0435\u0434 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u043E\u043C.",Pee="\u041D\u0430\u0439\u0434\u0435\u043D\u0430 \u043E\u0448\u0438\u0431\u043A\u0430 \u0441 {0}:",Lee="\u041E\u043A",Vee=`\u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043A\u0443\u0431\u044B \u0432 \u0432\u0430\u0448\u0435\u0439 \u043C\u043E\u0434\u0435\u043B\u0438 \u0438\u043C\u0435\u044E\u0442 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0435 \u043F\u043E\u0432\u043E\u0440\u043E\u0442\u044B! \u041A\u0443\u0431\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0438\u043C\u0435\u0442\u044C \u043F\u043E\u0432\u043E\u0440\u043E\u0442 \u0432 -45, -22.5, 0, 22.5, \u0438\u043B\u0438 45 \u0433\u0440\u0430\u0434\u0443\u0441\u043E\u0432, \u0438 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u043F\u043E\u0432\u0451\u0440\u043D\u0443\u0442\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043E\u0441\u0438 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u041C\u0430\u0439\u043D\u043A\u0440\u0430\u0444\u0442 \u0432\u0435\u0440\u0441\u0438\u0439 \u043D\u0438\u0436\u0435 1.21.6. \u0415\u0441\u043B\u0438 \u0445\u043E\u0442\u0438\u0442\u0435 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043A\u0443\u0431 \u0431\u043E\u043B\u0435\u0435 \u0442\u043E\u0447\u043D\u043E, \u0438\u043B\u0438 \u043D\u0430 \u043C\u043D\u043E\u0436\u0438\u0441\u0442\u0432\u0435 \u043E\u0441\u0435\u0439, \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u043A\u0443\u0431 \u0432 \u043A\u043E\u0441\u0442\u044C \u0438 \u043F\u043E\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0439\u0442\u0435 \u0435\u0451 \u0432\u043C\u0435\u0441\u0442\u043E \u043A\u0443\u0431\u0430. \u0412\u0441\u0435 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u043A\u0443\u0431\u044B \u043F\u043E\u0434\u0441\u0432\u0435\u0447\u0435\u043D\u044B \u043A\u0440\u0430\u0441\u043D\u044B\u043C. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u0438\u0445 \u043F\u0435\u0440\u0435\u0434 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u043E\u043C.`,zee=`\u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043A\u0443\u0431\u044B \u0432 \u0432\u0430\u0448\u0435\u0439 \u043C\u043E\u0434\u0435\u043B\u0438 \u0438\u043C\u0435\u044E\u0442 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0435 \u043F\u043E\u0432\u043E\u0440\u043E\u0442\u044B! \u041A\u0443\u0431\u044B \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u043F\u043E\u0432\u0451\u0440\u043D\u0443\u0442\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043E\u0441\u0438 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u041C\u0430\u0439\u043D\u043A\u0440\u0430\u0444\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 1.21.6 \u0438\u043B\u0438 \u0432\u044B\u0448\u0435. \u0415\u0441\u043B\u0438 \u0445\u043E\u0442\u0438\u0442\u0435 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043A\u0443\u0431 \u043D\u0430 \u043C\u043D\u043E\u0436\u0438\u0441\u0442\u0432\u0435 \u043E\u0441\u0435\u0439, \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u043A\u0443\u0431 \u0432 \u043A\u043E\u0441\u0442\u044C \u0438 \u043F\u043E\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0439\u0442\u0435 \u0435\u0451 \u0432\u043C\u0435\u0441\u0442\u043E \u043A\u0443\u0431\u0430. \u0412\u0441\u0435 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u043A\u0443\u0431\u044B \u043F\u043E\u0434\u0441\u0432\u0435\u0447\u0435\u043D\u044B \u043A\u0440\u0430\u0441\u043D\u044B\u043C. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u0438\u0445 \u043F\u0435\u0440\u0435\u0434 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u043E\u043C.`,Uee=`\u0423 \u0432\u0430\u0448\u0435\u0439 \u043C\u043E\u0434\u0435\u043B\u0438 \u0435\u0441\u0442\u044C \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u044B, \u043D\u043E \u043D\u0435\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439 (\u041A\u0443\u0431\u043E\u0432) \u043A \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u0438\u0445 \u043C\u043E\u0436\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C! \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u043A\u0443\u0431\u044B \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u044D\u0442\u0438 \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u044B, \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u044B \u043F\u0435\u0440\u0435\u0434 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u043E\u043C.`,qee=`\u0423 \u0432\u0430\u0448\u0435\u0439 \u043C\u043E\u0434\u0435\u043B\u0438 \u0435\u0441\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043C\u043E\u0434\u0435\u043B\u0438 (\u041A\u0443\u0431\u044B), \u043D\u043E \u043D\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0443\u0440 \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0436\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u043A \u043D\u0438\u043C! \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0434\u043E\u0431\u0430\u0432\u044C\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u044B \u043A \u0432\u0430\u0448\u0438\u043C \u043A\u0443\u0431\u0430\u043C, \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0438\u0442\u0435 \u0438\u0445 \u043F\u0435\u0440\u0435\u0434 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u043E\u043C.`,Hee=`\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u043E\u0432\u043E\u0440\u043E\u0442 \u043A\u0443\u0431\u043E\u0432! \u041A\u0443\u0431\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0438\u043C\u0435\u0442\u044C \u043F\u043E\u0432\u043E\u0440\u043E\u0442 \u0432 -45, -22.5, 0, 22.5, \u0438\u043B\u0438 45 \u0433\u0440\u0430\u0434\u0443\u0441\u043E\u0432, \u0438 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u043F\u043E\u0432\u0451\u0440\u043D\u0443\u0442\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043E\u0441\u0438 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u041C\u0430\u0439\u043D\u043A\u0440\u0430\u0444\u0442 \u0432\u0435\u0440\u0441\u0438\u0439 \u043D\u0438\u0436\u0435 1.21.6. \u0412\u0441\u0435 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u043A\u0443\u0431\u044B \u043F\u043E\u0434\u0441\u0432\u0435\u0447\u0435\u043D\u044B \u043A\u0440\u0430\u0441\u043D\u044B\u043C.`,Jee=`\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u043E\u0432\u043E\u0440\u043E\u0442 \u043A\u0443\u0431\u043E\u0432! \u041A\u0443\u0431\u044B \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u043F\u043E\u0432\u0451\u0440\u043D\u0443\u0442\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043E\u0441\u0438 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u041C\u0430\u0439\u043D\u043A\u0440\u0430\u0444\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 1.21.6 \u0438 \u0432\u044B\u0448\u0435. \u0412\u0441\u0435 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u043A\u0443\u0431\u044B \u043F\u043E\u0434\u0441\u0432\u0435\u0447\u0435\u043D\u044B \u043A\u0440\u0430\u0441\u043D\u044B\u043C.`,Gee="Animated Java",Wee="\u0416\u0438\u0434\u043A\u043E\u0441\u0442\u0438 \u043D\u0435 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u0432 \u0431\u043B\u043E\u043A \u0434\u0438\u0441\u043F\u043B\u0435\u044F\u0445.",Kee="\u0413\u043E\u043B\u043E\u0432\u044B \u043C\u043E\u0431\u043E\u0432 \u043D\u0435 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u0432 \u0431\u043B\u043E\u043A \u0434\u0438\u0441\u043F\u043B\u0435\u044F\u0445. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0434\u0438\u0441\u043F\u043B\u0435\u0439.",Yee='\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 "facing" \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0431\u043B\u043E\u043A \u0434\u0438\u0441\u043F\u043B\u0435\u044F\u0445.',Xee="\u041F\u0443\u0442\u044C \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 \u0447\u0435\u0440\u0442\u0435\u0436\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.",Zee=`\u041F\u0443\u0442\u044C \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 \u0447\u0435\u0440\u0442\u0435\u0436\u0430 '{0}' \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C \u0447\u0442\u043E \u043F\u0430\u043F\u043A\u0430 \u0432 \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u043F\u0440\u043E\u0438\u0441\u0445\u043E\u0434\u0438\u0442 \u044D\u043A\u0441\u043F\u043E\u0440\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.`,Qee={"animated_java.menubar.label":VW,"animated_java.format.blueprint.name":zW,"animated_java.action.open_blueprint_settings.name":UW,"animated_java.action.open_documentation.name":qW,"animated_java.action.open_changelog.name":HW,"animated_java.action.open_about.name":JW,"animated_java.action.open_display_entity_config.name":GW,"animated_java.action.open_locator_config.name":WW,"animated_java.action.export.name":KW,"animated_java.action.export_debug.name":YW,"animated_java.action.export_all.name":XW,"animated_java.action.export_all.description":ZW,"animated_java.action.export_all_debug.name":QW,"animated_java.action.export_all_debug.description":$W,"animated_java.action.extract.name":eK,"animated_java.action.extract.confirm":tK,"animated_java.action.create_text_display.title":nK,"animated_java.action.create_vanilla_item_display.title":iK,"animated_java.action.create_vanilla_block_display.title":aK,"animated_java.action.copy_display_entity_config.name":rK,"animated_java.action.copy_display_entity_config.message":oK,"animated_java.action.paste_display_entity_config.name":sK,"animated_java.action.paste_display_entity_config.message":lK,"animated_java.popup.loading.loading":cK,"animated_java.popup.loading.success":uK,"animated_java.popup.loading.offline":dK,"animated_java.popup.installed_popup.title":pK,"animated_java.popup.installed_popup.close_button":mK,"animated_java.popup.incompatability_popup.title":fK,"animated_java.popup.incompatability_popup.description":hK,"animated_java.popup.incompatability_popup.disable_button":gK,"animated_java.popup.incompatability_popup.button.disable_all":_K,"animated_java.popup.incompatability_popup.button.ignore":xK,"animated_java.plugin_dialog.incompatability_notice":vK,"animated_java.dialog.reset":bK,"animated_java.dialog.about.title":yK,"animated_java.dialog.about.close_button":wK,"animated_java.dialog.changelog_dialog.title":EK,"animated_java.dialog.unexpected_error.title":kK,"animated_java.dialog.unexpected_error.close_button":jK,"animated_java.dialog.unexpected_error.copy_error_message_button.message":AK,"animated_java.dialog.unexpected_error.copy_error_message_button.description":TK,"animated_java.dialog.unexpected_error.paragraph":CK,"animated_java.dialog.blueprint_settings.title":SK,"animated_java.dialog.blueprint_settings.project_settings.title":OK,"animated_java.dialog.blueprint_settings.advanced_settings_warning":IK,"animated_java.dialog.blueprint_settings.project_name.title":DK,"animated_java.dialog.blueprint_settings.project_name.description":FK,"animated_java.dialog.blueprint_settings.texture_size.title":NK,"animated_java.dialog.blueprint_settings.texture_size.description":RK,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":MK,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":BK,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":PK,"animated_java.dialog.blueprint_settings.export_settings.title":LK,"animated_java.dialog.blueprint_settings.export_namespace.title":VK,"animated_java.dialog.blueprint_settings.export_namespace.description":zK,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":UK,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":qK,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":HK,"animated_java.dialog.blueprint_settings.show_render_box.title":JK,"animated_java.dialog.blueprint_settings.show_render_box.description":GK,"animated_java.dialog.blueprint_settings.auto_render_box.title":WK,"animated_java.dialog.blueprint_settings.auto_render_box.description":KK,"animated_java.dialog.blueprint_settings.render_box.title":YK,"animated_java.dialog.blueprint_settings.render_box.description":XK,"animated_java.dialog.blueprint_settings.view_range.title":ZK,"animated_java.dialog.blueprint_settings.view_range.description":QK,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":$K,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":eY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":tY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder":nY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":iY,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":aY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":rY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder":oY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":sY,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":lY,"animated_java.dialog.blueprint_settings.target_minecraft_version.title":cY,"animated_java.dialog.blueprint_settings.target_minecraft_version.description":uY,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":dY,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":pY,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title":mY,"animated_java.dialog.blueprint_settings.display_item.title":fY,"animated_java.dialog.blueprint_settings.display_item.description":hY,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":gY,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":_Y,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":xY,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":vY,"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated":bY,"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found":yY,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":wY,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":EY,"animated_java.dialog.blueprint_settings.resource_pack.title":kY,"animated_java.dialog.blueprint_settings.resource_pack.description":jY,"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder":AY,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":TY,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":CY,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":SY,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":OY,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":IY,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":DY,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":FY,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":NY,"animated_java.dialog.blueprint_settings.data_pack_settings.title":RY,"animated_java.dialog.blueprint_settings.data_pack.title":MY,"animated_java.dialog.blueprint_settings.data_pack.description":BY,"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder":PY,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":LY,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":VY,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":zY,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":UY,"animated_java.dialog.blueprint_settings.data_pack_zip.title":qY,"animated_java.dialog.blueprint_settings.data_pack_zip.description":HY,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":JY,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":GY,"animated_java.dialog.blueprint_settings.on_summon_function.title":WY,"animated_java.dialog.blueprint_settings.on_summon_function.description":KY,"animated_java.dialog.blueprint_settings.on_remove_function.title":YY,"animated_java.dialog.blueprint_settings.on_remove_function.description":XY,"animated_java.dialog.blueprint_settings.on_pre_tick_function.title":ZY,"animated_java.dialog.blueprint_settings.on_pre_tick_function.description":QY,"animated_java.dialog.blueprint_settings.on_post_tick_function.title":$Y,"animated_java.dialog.blueprint_settings.on_post_tick_function.description":eX,"animated_java.dialog.blueprint_settings.interpolation_duration.title":tX,"animated_java.dialog.blueprint_settings.interpolation_duration.description":nX,"animated_java.dialog.blueprint_settings.teleportation_duration.title":iX,"animated_java.dialog.blueprint_settings.teleportation_duration.description":aX,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title":rX,"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description":oX,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":sX,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":lX,"animated_java.dialog.blueprint_settings.baked_animations.title":cX,"animated_java.dialog.blueprint_settings.baked_animations.description":uX,"animated_java.dialog.blueprint_settings.json_file.title":dX,"animated_java.dialog.blueprint_settings.json_file.description":pX,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":mX,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":fX,"animated_java.dialog.display_entity.title":hX,"animated_java.dialog.display_entity.node_options.title":gX,"animated_java.dialog.display_entity.per_variant_options.title":_X,"animated_java.dialog.display_entity.on_summon_function.title":xX,"animated_java.dialog.display_entity.on_summon_function.description":vX,"animated_java.dialog.display_entity.on_apply_function.title":bX,"animated_java.dialog.display_entity.on_apply_function.description":yX,"animated_java.dialog.display_entity.custom_name.title":wX,"animated_java.dialog.display_entity.custom_name.description":EX,"animated_java.dialog.display_entity.custom_name.invalid_json.error":kX,"animated_java.dialog.display_entity.custom_name_visible.title":jX,"animated_java.dialog.display_entity.custom_name_visible.description":AX,"animated_java.dialog.display_entity.glowing.title":TX,"animated_java.dialog.display_entity.glowing.description":CX,"animated_java.dialog.display_entity.override_glow_color.title":SX,"animated_java.dialog.display_entity.override_glow_color.description":OX,"animated_java.dialog.display_entity.glow_color.title":IX,"animated_java.dialog.display_entity.glow_color.description":DX,"animated_java.dialog.display_entity.shadow_radius.title":FX,"animated_java.dialog.display_entity.shadow_radius.description":NX,"animated_java.dialog.display_entity.shadow_strength.title":RX,"animated_java.dialog.display_entity.shadow_strength.description":MX,"animated_java.dialog.display_entity.override_brightness.title":BX,"animated_java.dialog.display_entity.override_brightness.description":PX,"animated_java.dialog.display_entity.brightness_override.title":LX,"animated_java.dialog.display_entity.brightness_override.description":VX,"animated_java.dialog.display_entity.use_custom_brightness.title":zX,"animated_java.dialog.display_entity.use_custom_brightness.description":UX,"animated_java.dialog.display_entity.custom_brightness.title":qX,"animated_java.dialog.display_entity.custom_brightness.description":HX,"animated_java.dialog.display_entity.enchanted.title":JX,"animated_java.dialog.display_entity.enchanted.description":GX,"animated_java.dialog.display_entity.invisible.title":WX,"animated_java.dialog.display_entity.invisible.description":KX,"animated_java.dialog.display_entity.billboard.title":YX,"animated_java.dialog.display_entity.billboard.description":XX,"animated_java.dialog.display_entity.billboard.options.fixed":ZX,"animated_java.dialog.display_entity.billboard.options.vertical":QX,"animated_java.dialog.display_entity.billboard.options.horizontal":$X,"animated_java.dialog.display_entity.billboard.options.center":eZ,"animated_java.dialog.locator_config.title":tZ,"animated_java.dialog.locator_config.plugin_mode_warning":nZ,"animated_java.dialog.locator_config.use_entity.title":iZ,"animated_java.dialog.locator_config.use_entity.description":aZ,"animated_java.dialog.locator_config.entity_type.title":rZ,"animated_java.dialog.locator_config.entity_type.description":oZ,"animated_java.dialog.locator_config.entity_type.error.empty":sZ,"animated_java.dialog.locator_config.entity_type.warning.invalid":lZ,"animated_java.dialog.locator_config.sync_passenger_rotation.title":cZ,"animated_java.dialog.locator_config.sync_passenger_rotation.description":uZ,"animated_java.dialog.locator_config.on_summon_function.title":dZ,"animated_java.dialog.locator_config.on_summon_function.description":pZ,"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity":mZ,"animated_java.dialog.locator_config.on_remove_function.title":fZ,"animated_java.dialog.locator_config.on_remove_function.description":hZ,"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity":gZ,"animated_java.dialog.locator_config.on_tick_function.title":_Z,"animated_java.dialog.locator_config.on_tick_function.description":xZ,"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity":vZ,"animated_java.dialog.text_display_config.title":bZ,"animated_java.dialog.bone_config.vanilla_item_model.title":yZ,"animated_java.dialog.bone_config.vanilla_item_model.description":wZ,"animated_java.dialog.text_display_config.use_nbt.title":EZ,"animated_java.dialog.text_display_config.use_nbt.description":kZ,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":jZ,"animated_java.dialog.text_display_config.inherit_settings.title":AZ,"animated_java.dialog.text_display_config.inherit_settings.description":TZ,"animated_java.dialog.text_display_config.glowing.title":CZ,"animated_java.dialog.text_display_config.glowing.description":SZ,"animated_java.dialog.text_display_config.override_glow_color.title":OZ,"animated_java.dialog.text_display_config.override_glow_color.description":IZ,"animated_java.dialog.text_display_config.glow_color.title":DZ,"animated_java.dialog.text_display_config.glow_color.description":FZ,"animated_java.dialog.text_display_config.shadow_radius.title":NZ,"animated_java.dialog.text_display_config.shadow_radius.description":RZ,"animated_java.dialog.text_display_config.shadow_strength.title":MZ,"animated_java.dialog.text_display_config.shadow_strength.description":BZ,"animated_java.dialog.text_display_config.override_brightness.title":PZ,"animated_java.dialog.text_display_config.override_brightness.description":LZ,"animated_java.dialog.text_display_config.brightness_override.title":VZ,"animated_java.dialog.text_display_config.brightness_override.description":zZ,"animated_java.dialog.text_display_config.use_custom_brightness.title":UZ,"animated_java.dialog.text_display_config.use_custom_brightness.description":qZ,"animated_java.dialog.text_display_config.custom_brightness.title":HZ,"animated_java.dialog.text_display_config.custom_brightness.description":JZ,"animated_java.dialog.text_display_config.invisible.title":GZ,"animated_java.dialog.text_display_config.invisible.description":WZ,"animated_java.dialog.text_display_config.nbt.title":KZ,"animated_java.dialog.text_display_config.nbt.description":YZ,"animated_java.dialog.vanilla_block_display_config.title":XZ,"animated_java.dialog.vanilla_block_display.custom_name.title":ZZ,"animated_java.dialog.vanilla_block_display.custom_name.description":QZ,"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error":$Z,"animated_java.dialog.vanilla_block_display.custom_name_visible.title":eQ,"animated_java.dialog.vanilla_block_display.custom_name_visible.description":tQ,"animated_java.dialog.vanilla_item_display_config.title":nQ,"animated_java.dialog.vanilla_item_display.custom_name.title":iQ,"animated_java.dialog.vanilla_item_display.custom_name.description":aQ,"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error":rQ,"animated_java.dialog.vanilla_item_display.custom_name_visible.title":oQ,"animated_java.dialog.vanilla_item_display.custom_name_visible.description":sQ,"animated_java.dialog.variant_config.title":lQ,"animated_java.dialog.variant_config.variant_display_name":cQ,"animated_java.dialog.variant_config.variant_display_name.description":uQ,"animated_java.dialog.variant_config.generate_name_from_display_name":dQ,"animated_java.dialog.variant_config.generate_name_from_display_name.description":pQ,"animated_java.dialog.variant_config.variant_name":mQ,"animated_java.dialog.variant_config.variant_name.description":fQ,"animated_java.dialog.variant_config.texture_map.title":hQ,"animated_java.dialog.variant_config.texture_map.description":gQ,"animated_java.dialog.variant_config.texture_map.create_new_mapping":_Q,"animated_java.dialog.variant_config.texture_map.no_mappings":xQ,"animated_java.dialog.variant_config.bone_lists.description":vQ,"animated_java.dialog.variant_config.excluded_nodes.title":bQ,"animated_java.dialog.variant_config.excluded_nodes.description":yQ,"animated_java.dialog.variant_config.included_nodes.title":wQ,"animated_java.dialog.variant_config.included_nodes.description":EQ,"animated_java.dialog.variant_config.swap_columns_button.tooltip":kQ,"animated_java.action.upgrade_old_aj_model_loader.name":jQ,"animated_java.dialog.upgrade_old_aj_model_loader.title":AQ,"animated_java.action.upgrade_old_aj_model_loader.select_file":TQ,"animated_java.action.upgrade_old_aj_model_loader.body":CQ,"animated_java.action.upgrade_old_aj_model_loader.button":SQ,"animated_java.dialog.animation_properties.title":OQ,"animated_java.dialog.animation_properties.animation_name.title":IQ,"animated_java.dialog.animation_properties.animation_name.description":DQ,"animated_java.dialog.animation_properties.loop_mode.title":FQ,"animated_java.dialog.animation_properties.loop_mode.description":NQ,"animated_java.dialog.animation_properties.loop_mode.options.once":RQ,"animated_java.dialog.animation_properties.loop_mode.options.hold":MQ,"animated_java.dialog.animation_properties.loop_mode.options.loop":BQ,"animated_java.dialog.animation_properties.animation_name.error.empty":PQ,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":LQ,"animated_java.dialog.animation_properties.loop_delay.title":VQ,"animated_java.dialog.animation_properties.loop_delay.description":zQ,"animated_java.dialog.animation_properties.bone_lists.description":UQ,"animated_java.dialog.animation_properties.excluded_nodes.title":qQ,"animated_java.dialog.animation_properties.excluded_nodes.description":HQ,"animated_java.dialog.animation_properties.included_nodes.title":JQ,"animated_java.dialog.animation_properties.included_nodes.description":GQ,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":WQ,"animated_java.dialog.export_progress.title":KQ,"animated_java.dialog.blueprint_loading.title":YQ,"animated_java.panel.variants.title":XQ,"animated_java.panel.variants.tool.create_new_variant":ZQ,"animated_java.panel.variants.tool.edit_variant":QQ,"animated_java.panel.variants.tool.duplicate_selected_variant":$Q,"animated_java.panel.variants.tool.delete_selected_variant":e$,"animated_java.panel.variants.tool.variant_visible":t$,"animated_java.panel.variants.tool.variant_not_visible":n$,"animated_java.panel.variants.tool.cannot_delete_default_variant":i$,"animated_java.panel.variants.tool.cannot_edit_default_variant":a$,"animated_java.action.variants.create":r$,"animated_java.action.variants.duplicate":o$,"animated_java.action.variants.open_config":s$,"animated_java.action.variants.delete":l$,"animated_java.animation.excluded_nodes":c$,"animated_java.animation.invert_excluded_nodes":u$,"animated_java.effect_animator.timeline.variant":d$,"animated_java.effect_animator.timeline.function":p$,"animated_java.effect_animator.keyframe_data_point.variant":m$,"animated_java.effect_animator.keyframe_data_point.function":f$,"animated_java.effect_animator.keyframe_data_point.execute_condition":h$,"animated_java.effect_animator.keyframe_data_point.repeat":g$,"animated_java.effect_animator.keyframe_data_point.repeat_frequency":_$,"animated_java.panel.keyframe.keyframe_title":x$,"animated_java.panel.keyframe.variant.title":v$,"animated_java.panel.keyframe.variant.description":b$,"animated_java.panel.keyframe.function.title":y$,"animated_java.panel.keyframe.function.description":w$,"animated_java.panel.keyframe.execute_condition.title":E$,"animated_java.panel.keyframe.execute_condition.description":k$,"animated_java.panel.keyframe.repeat.title":j$,"animated_java.panel.keyframe.repeat.description":A$,"animated_java.panel.keyframe.repeat_frequency.title":T$,"animated_java.panel.keyframe.repeat_frequency.description":C$,"animated_java.panel.keyframe.easing_type.title":S$,"animated_java.panel.keyframe.easing_type.description":O$,"animated_java.panel.keyframe.easing_type.options.linear":I$,"animated_java.panel.keyframe.easing_type.options.sine":D$,"animated_java.panel.keyframe.easing_type.options.quad":F$,"animated_java.panel.keyframe.easing_type.options.cubic":N$,"animated_java.panel.keyframe.easing_type.options.quart":R$,"animated_java.panel.keyframe.easing_type.options.quint":M$,"animated_java.panel.keyframe.easing_type.options.expo":B$,"animated_java.panel.keyframe.easing_type.options.circ":P$,"animated_java.panel.keyframe.easing_type.options.elastic":L$,"animated_java.panel.keyframe.easing_type.options.back":V$,"animated_java.panel.keyframe.easing_type.options.bounce":z$,"animated_java.panel.keyframe.easing_mode.title":U$,"animated_java.panel.keyframe.easing_mode.description":q$,"animated_java.panel.keyframe.easing_mode.options.in":H$,"animated_java.panel.keyframe.easing_mode.options.out":J$,"animated_java.panel.keyframe.easing_mode.options.inout":G$,"animated_java.panel.keyframe.easing_args.title":W$,"animated_java.panel.keyframe.easing_args.description":K$,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":Y$,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":X$,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":Z$,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":Q$,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":$$,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":eee,"animated_java.panel.keyframe.nonlinear_interpolation":tee,"animated_java.panel.text_display.title":nee,"animated_java.tool.text_display.line_width.title":iee,"animated_java.tool.text_display.line_width.description":aee,"animated_java.tool.text_display.background_color.title":ree,"animated_java.tool.text_display.background_color.description":oee,"animated_java.tool.text_display.text_shadow.title":see,"animated_java.tool.text_display.text_shadow.description":lee,"animated_java.tool.text_display.text_alignment.title":cee,"animated_java.tool.text_display.text_alignment.description":uee,"animated_java.tool.text_display.text_alignment.options.left":dee,"animated_java.tool.text_display.text_alignment.options.center":pee,"animated_java.tool.text_display.text_alignment.options.right":mee,"animated_java.tool.text_display.see_through.title":fee,"animated_java.tool.text_display.see_through.description":hee,"animated_java.tool.text_display.copy_text.title":gee,"animated_java.tool.text_display.copy_text.description":_ee,"animated_java.tool.text_display.copy_text.copied":xee,"animated_java.panel.vanilla_item_display.title":vee,"animated_java.panel.vanilla_item_display.description":bee,"animated_java.tool.item_display.item_display.title":yee,"animated_java.tool.item_display.item_display.description":wee,"animated_java.tool.item_display.item_display.options.none":Eee,"animated_java.tool.item_display.item_display.options.thirdperson_lefthand":kee,"animated_java.tool.item_display.item_display.options.thirdperson_righthand":jee,"animated_java.tool.item_display.item_display.options.firstperson_lefthand":Aee,"animated_java.tool.item_display.item_display.options.firstperson_righthand":Tee,"animated_java.tool.item_display.item_display.options.head":Cee,"animated_java.tool.item_display.item_display.options.gui":See,"animated_java.tool.item_display.item_display.options.ground":Oee,"animated_java.tool.item_display.item_display.options.fixed":Iee,"animated_java.panel.vanilla_block_display.title":Dee,"animated_java.panel.vanilla_block_display.description":Fee,"animated_java.vanilla_item_display.title":Nee,"animated_java.misc.failed_to_export.title":Ree,"animated_java.misc.failed_to_export.custom_models.message":Mee,"animated_java.misc.failed_to_export.blueprint_settings.message":Bee,"animated_java.misc.failed_to_export.blueprint_settings.error_item":Pee,"animated_java.misc.failed_to_export.button":Lee,"animated_java.misc.failed_to_export.invalid_rotation.message":Vee,"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6":zee,"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message":Uee,"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message":qee,"animated_java.toast.invalid_rotations":Hee,"animated_java.toast.invalid_rotations_post_1_21_6":Jee,"animated_java.format_category.animated_java":Gee,"animated_java.block_model_manager.fluid_warning":Wee,"animated_java.block_model_manager.mob_head_warning":Kee,"animated_java.block_model_manager.facing_warning":Yee,"animated_java.error.blueprint_export_path_doesnt_exist.title":Xee,"animated_java.error.blueprint_export_path_doesnt_exist.description":Zee};var Tg={};vn(Tg,{"animated_java.action.create_text_display.title":()=>ote,"animated_java.action.create_vanilla_block_display.title":()=>lte,"animated_java.action.create_vanilla_item_display.title":()=>ste,"animated_java.action.export.name":()=>rte,"animated_java.action.open_about.name":()=>tte,"animated_java.action.open_blueprint_settings.name":()=>$ee,"animated_java.action.open_bone_config.name":()=>nte,"animated_java.action.open_documentation.name":()=>ete,"animated_java.action.open_locator_config.name":()=>ite,"animated_java.action.open_text_display_config.name":()=>ate,"animated_java.action.open_vanilla_block_display_config.name":()=>ute,"animated_java.action.open_vanilla_item_display_config.name":()=>cte,"animated_java.action.upgrade_old_aj_model_loader.body":()=>Rre,"animated_java.action.upgrade_old_aj_model_loader.button":()=>Mre,"animated_java.action.upgrade_old_aj_model_loader.name":()=>Dre,"animated_java.action.upgrade_old_aj_model_loader.select_file":()=>Nre,"animated_java.action.variants.create":()=>doe,"animated_java.action.variants.delete":()=>foe,"animated_java.action.variants.duplicate":()=>poe,"animated_java.action.variants.open_config":()=>moe,"animated_java.animation.excluded_nodes":()=>hoe,"animated_java.animation.invert_excluded_nodes":()=>goe,"animated_java.block_model_manager.facing_warning":()=>Hse,"animated_java.block_model_manager.fluid_warning":()=>Use,"animated_java.block_model_manager.mob_head_warning":()=>qse,"animated_java.dialog.about.close_button":()=>xte,"animated_java.dialog.about.title":()=>_te,"animated_java.dialog.animation_properties.animation_name.description":()=>Lre,"animated_java.dialog.animation_properties.animation_name.error.empty":()=>Jre,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":()=>Gre,"animated_java.dialog.animation_properties.animation_name.title":()=>Pre,"animated_java.dialog.animation_properties.bone_lists.description":()=>Yre,"animated_java.dialog.animation_properties.excluded_nodes.description":()=>Zre,"animated_java.dialog.animation_properties.excluded_nodes.title":()=>Xre,"animated_java.dialog.animation_properties.included_nodes.description":()=>$re,"animated_java.dialog.animation_properties.included_nodes.title":()=>Qre,"animated_java.dialog.animation_properties.loop_delay.description":()=>Kre,"animated_java.dialog.animation_properties.loop_delay.title":()=>Wre,"animated_java.dialog.animation_properties.loop_mode.description":()=>zre,"animated_java.dialog.animation_properties.loop_mode.options.hold":()=>qre,"animated_java.dialog.animation_properties.loop_mode.options.loop":()=>Hre,"animated_java.dialog.animation_properties.loop_mode.options.once":()=>Ure,"animated_java.dialog.animation_properties.loop_mode.title":()=>Vre,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":()=>eoe,"animated_java.dialog.animation_properties.title":()=>Bre,"animated_java.dialog.blueprint_loading.title":()=>noe,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist":()=>Dne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected":()=>Ine,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file":()=>Fne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist":()=>Bne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected":()=>Mne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder":()=>Pne,"animated_java.dialog.blueprint_settings.advanced_settings_warning":()=>jte,"animated_java.dialog.blueprint_settings.auto_bounding_box.description":()=>ene,"animated_java.dialog.blueprint_settings.auto_bounding_box.title":()=>$te,"animated_java.dialog.blueprint_settings.baked_animations.description":()=>pie,"animated_java.dialog.blueprint_settings.baked_animations.title":()=>die,"animated_java.dialog.blueprint_settings.blueprint_name.description":()=>Tte,"animated_java.dialog.blueprint_settings.blueprint_name.title":()=>Ate,"animated_java.dialog.blueprint_settings.bounding_box.description":()=>nne,"animated_java.dialog.blueprint_settings.bounding_box.title":()=>tne,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":()=>_ne,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":()=>gne,"animated_java.dialog.blueprint_settings.data_pack.description":()=>Jne,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":()=>Wne,"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder":()=>Xne,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":()=>Yne,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":()=>Gne,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":()=>Kne,"animated_java.dialog.blueprint_settings.data_pack.title":()=>Hne,"animated_java.dialog.blueprint_settings.data_pack_export_mode.description":()=>Wte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":()=>Xte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw":()=>Kte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":()=>Yte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":()=>Gte,"animated_java.dialog.blueprint_settings.data_pack_settings.title":()=>zne,"animated_java.dialog.blueprint_settings.data_pack_zip.description":()=>Qne,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":()=>$ne,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":()=>eie,"animated_java.dialog.blueprint_settings.data_pack_zip.title":()=>Zne,"animated_java.dialog.blueprint_settings.display_item.description":()=>cne,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":()=>dne,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":()=>pne,"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found":()=>hne,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":()=>une,"animated_java.dialog.blueprint_settings.display_item.title":()=>lne,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":()=>mne,"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated":()=>fne,"animated_java.dialog.blueprint_settings.display_item_path.description":()=>One,"animated_java.dialog.blueprint_settings.display_item_path.title":()=>Sne,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description":()=>qne,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title":()=>Une,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.description":()=>sne,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title":()=>one,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description":()=>rne,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":()=>ane,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":()=>Vte,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":()=>Lte,"animated_java.dialog.blueprint_settings.export_namespace.description":()=>Rte,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":()=>Mte,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":()=>Pte,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":()=>Bte,"animated_java.dialog.blueprint_settings.export_namespace.title":()=>Nte,"animated_java.dialog.blueprint_settings.export_settings.title":()=>Fte,"animated_java.dialog.blueprint_settings.interpolation_duration.description":()=>oie,"animated_java.dialog.blueprint_settings.interpolation_duration.title":()=>rie,"animated_java.dialog.blueprint_settings.json_file.description":()=>fie,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":()=>hie,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":()=>gie,"animated_java.dialog.blueprint_settings.json_file.title":()=>mie,"animated_java.dialog.blueprint_settings.model_folder.description":()=>Rne,"animated_java.dialog.blueprint_settings.model_folder.title":()=>Nne,"animated_java.dialog.blueprint_settings.resource_pack.description":()=>vne,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":()=>yne,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder":()=>kne,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":()=>Ene,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":()=>bne,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":()=>wne,"animated_java.dialog.blueprint_settings.resource_pack.title":()=>xne,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description":()=>Ute,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":()=>Jte,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw":()=>qte,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":()=>Hte,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":()=>zte,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":()=>ine,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":()=>Ane,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":()=>Tne,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":()=>Cne,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":()=>jne,"animated_java.dialog.blueprint_settings.show_bounding_box.description":()=>Qte,"animated_java.dialog.blueprint_settings.show_bounding_box.title":()=>Zte,"animated_java.dialog.blueprint_settings.summon_commands.description":()=>nie,"animated_java.dialog.blueprint_settings.summon_commands.title":()=>tie,"animated_java.dialog.blueprint_settings.teleportation_duration.description":()=>lie,"animated_java.dialog.blueprint_settings.teleportation_duration.title":()=>sie,"animated_java.dialog.blueprint_settings.texture_folder.description":()=>Vne,"animated_java.dialog.blueprint_settings.texture_folder.title":()=>Lne,"animated_java.dialog.blueprint_settings.texture_size.description":()=>Ste,"animated_java.dialog.blueprint_settings.texture_size.title":()=>Cte,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":()=>Dte,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":()=>Ite,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":()=>Ote,"animated_java.dialog.blueprint_settings.ticking_commands.description":()=>aie,"animated_java.dialog.blueprint_settings.ticking_commands.title":()=>iie,"animated_java.dialog.blueprint_settings.title":()=>kte,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":()=>uie,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":()=>cie,"animated_java.dialog.bone_config.billboard.description":()=>aae,"animated_java.dialog.bone_config.billboard.options.center":()=>lae,"animated_java.dialog.bone_config.billboard.options.fixed":()=>rae,"animated_java.dialog.bone_config.billboard.options.horizontal":()=>sae,"animated_java.dialog.bone_config.billboard.options.vertical":()=>oae,"animated_java.dialog.bone_config.billboard.title":()=>iae,"animated_java.dialog.bone_config.brightness_override.description":()=>Hie,"animated_java.dialog.bone_config.brightness_override.title":()=>qie,"animated_java.dialog.bone_config.custom_brightness.description":()=>Kie,"animated_java.dialog.bone_config.custom_brightness.title":()=>Wie,"animated_java.dialog.bone_config.custom_name.description":()=>Tie,"animated_java.dialog.bone_config.custom_name.invalid_json.error":()=>Cie,"animated_java.dialog.bone_config.custom_name.title":()=>Aie,"animated_java.dialog.bone_config.custom_name_visible.description":()=>Oie,"animated_java.dialog.bone_config.custom_name_visible.title":()=>Sie,"animated_java.dialog.bone_config.default_variant_subtitle":()=>vie,"animated_java.dialog.bone_config.enchanted.description":()=>Xie,"animated_java.dialog.bone_config.enchanted.title":()=>Yie,"animated_java.dialog.bone_config.glow_color.description":()=>Mie,"animated_java.dialog.bone_config.glow_color.title":()=>Rie,"animated_java.dialog.bone_config.glowing.description":()=>Die,"animated_java.dialog.bone_config.glowing.title":()=>Iie,"animated_java.dialog.bone_config.inherit_settings.description":()=>jie,"animated_java.dialog.bone_config.inherit_settings.title":()=>kie,"animated_java.dialog.bone_config.invisible.description":()=>Qie,"animated_java.dialog.bone_config.invisible.title":()=>Zie,"animated_java.dialog.bone_config.nbt.description":()=>eae,"animated_java.dialog.bone_config.nbt.invalid_nbt.error":()=>nae,"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound":()=>tae,"animated_java.dialog.bone_config.nbt.title":()=>$ie,"animated_java.dialog.bone_config.override_brightness.description":()=>Uie,"animated_java.dialog.bone_config.override_brightness.title":()=>zie,"animated_java.dialog.bone_config.override_glow_color.description":()=>Nie,"animated_java.dialog.bone_config.override_glow_color.title":()=>Fie,"animated_java.dialog.bone_config.selected_variant":()=>xie,"animated_java.dialog.bone_config.selected_variant_subtitle":()=>bie,"animated_java.dialog.bone_config.shadow_radius.description":()=>Pie,"animated_java.dialog.bone_config.shadow_radius.title":()=>Bie,"animated_java.dialog.bone_config.shadow_strength.description":()=>Vie,"animated_java.dialog.bone_config.shadow_strength.title":()=>Lie,"animated_java.dialog.bone_config.title":()=>_ie,"animated_java.dialog.bone_config.use_custom_brightness.description":()=>Gie,"animated_java.dialog.bone_config.use_custom_brightness.title":()=>Jie,"animated_java.dialog.bone_config.use_nbt.description":()=>wie,"animated_java.dialog.bone_config.use_nbt.title":()=>yie,"animated_java.dialog.bone_config.use_nbt.use_nbt_warning":()=>Eie,"animated_java.dialog.bone_config.vanilla_item_model.description":()=>Eae,"animated_java.dialog.bone_config.vanilla_item_model.title":()=>wae,"animated_java.dialog.export_progress.title":()=>toe,"animated_java.dialog.installed_popup.close_button":()=>hte,"animated_java.dialog.installed_popup.title":()=>fte,"animated_java.dialog.locator_config.entity_type.description":()=>fae,"animated_java.dialog.locator_config.entity_type.error.empty":()=>hae,"animated_java.dialog.locator_config.entity_type.title":()=>mae,"animated_java.dialog.locator_config.entity_type.warning.invalid":()=>gae,"animated_java.dialog.locator_config.plugin_mode_warning":()=>uae,"animated_java.dialog.locator_config.summon_commands.description":()=>xae,"animated_java.dialog.locator_config.summon_commands.title":()=>_ae,"animated_java.dialog.locator_config.ticking_commands.description":()=>bae,"animated_java.dialog.locator_config.ticking_commands.title":()=>vae,"animated_java.dialog.locator_config.title":()=>cae,"animated_java.dialog.locator_config.use_entity.description":()=>pae,"animated_java.dialog.locator_config.use_entity.title":()=>dae,"animated_java.dialog.reset":()=>gte,"animated_java.dialog.text_display_config.billboard.description":()=>Qae,"animated_java.dialog.text_display_config.billboard.options.center":()=>nre,"animated_java.dialog.text_display_config.billboard.options.fixed":()=>$ae,"animated_java.dialog.text_display_config.billboard.options.horizontal":()=>tre,"animated_java.dialog.text_display_config.billboard.options.vertical":()=>ere,"animated_java.dialog.text_display_config.billboard.title":()=>Zae,"animated_java.dialog.text_display_config.brightness_override.description":()=>Uae,"animated_java.dialog.text_display_config.brightness_override.title":()=>zae,"animated_java.dialog.text_display_config.custom_brightness.description":()=>Gae,"animated_java.dialog.text_display_config.custom_brightness.title":()=>Jae,"animated_java.dialog.text_display_config.glow_color.description":()=>Nae,"animated_java.dialog.text_display_config.glow_color.title":()=>Fae,"animated_java.dialog.text_display_config.glowing.description":()=>Oae,"animated_java.dialog.text_display_config.glowing.title":()=>Sae,"animated_java.dialog.text_display_config.inherit_settings.description":()=>Cae,"animated_java.dialog.text_display_config.inherit_settings.title":()=>Tae,"animated_java.dialog.text_display_config.invisible.description":()=>Kae,"animated_java.dialog.text_display_config.invisible.title":()=>Wae,"animated_java.dialog.text_display_config.nbt.description":()=>Xae,"animated_java.dialog.text_display_config.nbt.title":()=>Yae,"animated_java.dialog.text_display_config.override_brightness.description":()=>Vae,"animated_java.dialog.text_display_config.override_brightness.title":()=>Lae,"animated_java.dialog.text_display_config.override_glow_color.description":()=>Dae,"animated_java.dialog.text_display_config.override_glow_color.title":()=>Iae,"animated_java.dialog.text_display_config.shadow_radius.description":()=>Mae,"animated_java.dialog.text_display_config.shadow_radius.title":()=>Rae,"animated_java.dialog.text_display_config.shadow_strength.description":()=>Pae,"animated_java.dialog.text_display_config.shadow_strength.title":()=>Bae,"animated_java.dialog.text_display_config.title":()=>yae,"animated_java.dialog.text_display_config.use_custom_brightness.description":()=>Hae,"animated_java.dialog.text_display_config.use_custom_brightness.title":()=>qae,"animated_java.dialog.text_display_config.use_nbt.description":()=>jae,"animated_java.dialog.text_display_config.use_nbt.title":()=>kae,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":()=>Aae,"animated_java.dialog.unexpected_error.close_button":()=>bte,"animated_java.dialog.unexpected_error.copy_error_message_button.description":()=>wte,"animated_java.dialog.unexpected_error.copy_error_message_button.message":()=>yte,"animated_java.dialog.unexpected_error.paragraph":()=>Ete,"animated_java.dialog.unexpected_error.title":()=>vte,"animated_java.dialog.upgrade_old_aj_model_loader.title":()=>Fre,"animated_java.dialog.vanilla_block_display.custom_name.description":()=>rre,"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error":()=>ore,"animated_java.dialog.vanilla_block_display.custom_name.title":()=>are,"animated_java.dialog.vanilla_block_display.custom_name_visible.description":()=>lre,"animated_java.dialog.vanilla_block_display.custom_name_visible.title":()=>sre,"animated_java.dialog.vanilla_block_display_config.title":()=>ire,"animated_java.dialog.vanilla_item_display.custom_name.description":()=>dre,"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error":()=>pre,"animated_java.dialog.vanilla_item_display.custom_name.title":()=>ure,"animated_java.dialog.vanilla_item_display.custom_name_visible.description":()=>fre,"animated_java.dialog.vanilla_item_display.custom_name_visible.title":()=>mre,"animated_java.dialog.vanilla_item_display_config.title":()=>cre,"animated_java.dialog.variant_config.bone_lists.description":()=>Are,"animated_java.dialog.variant_config.excluded_nodes.description":()=>Cre,"animated_java.dialog.variant_config.excluded_nodes.title":()=>Tre,"animated_java.dialog.variant_config.generate_name_from_display_name":()=>xre,"animated_java.dialog.variant_config.generate_name_from_display_name.description":()=>vre,"animated_java.dialog.variant_config.included_nodes.description":()=>Ore,"animated_java.dialog.variant_config.included_nodes.title":()=>Sre,"animated_java.dialog.variant_config.swap_columns_button.tooltip":()=>Ire,"animated_java.dialog.variant_config.texture_map.create_new_mapping":()=>kre,"animated_java.dialog.variant_config.texture_map.description":()=>Ere,"animated_java.dialog.variant_config.texture_map.no_mappings":()=>jre,"animated_java.dialog.variant_config.texture_map.title":()=>wre,"animated_java.dialog.variant_config.title":()=>hre,"animated_java.dialog.variant_config.variant_display_name":()=>gre,"animated_java.dialog.variant_config.variant_display_name.description":()=>_re,"animated_java.dialog.variant_config.variant_name":()=>bre,"animated_java.dialog.variant_config.variant_name.description":()=>yre,"animated_java.effect_animator.keyframes.commands":()=>boe,"animated_java.effect_animator.keyframes.execute_condition":()=>yoe,"animated_java.effect_animator.keyframes.variant":()=>voe,"animated_java.effect_animator.timeline.commands":()=>xoe,"animated_java.effect_animator.timeline.variant":()=>_oe,"animated_java.error.blueprint_export_path_doesnt_exist.description":()=>Gse,"animated_java.error.blueprint_export_path_doesnt_exist.title":()=>Jse,"animated_java.format_category.animated_java":()=>zse,"animated_java.misc.failed_to_export.blueprint_settings.error_item":()=>Lse,"animated_java.misc.failed_to_export.blueprint_settings.message":()=>Pse,"animated_java.misc.failed_to_export.button":()=>Vse,"animated_java.misc.failed_to_export.custom_models.message":()=>Bse,"animated_java.misc.failed_to_export.title":()=>Mse,"animated_java.panel.keyframe.commands.description":()=>Aoe,"animated_java.panel.keyframe.commands.title":()=>joe,"animated_java.panel.keyframe.easing_args.description":()=>Qoe,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":()=>nse,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":()=>tse,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":()=>ase,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":()=>ise,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":()=>ese,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":()=>$oe,"animated_java.panel.keyframe.easing_args.title":()=>Zoe,"animated_java.panel.keyframe.easing_mode.description":()=>Woe,"animated_java.panel.keyframe.easing_mode.options.in":()=>Koe,"animated_java.panel.keyframe.easing_mode.options.inout":()=>Xoe,"animated_java.panel.keyframe.easing_mode.options.out":()=>Yoe,"animated_java.panel.keyframe.easing_mode.title":()=>Goe,"animated_java.panel.keyframe.easing_type.description":()=>Noe,"animated_java.panel.keyframe.easing_type.options.back":()=>Hoe,"animated_java.panel.keyframe.easing_type.options.bounce":()=>Joe,"animated_java.panel.keyframe.easing_type.options.circ":()=>Uoe,"animated_java.panel.keyframe.easing_type.options.cubic":()=>Poe,"animated_java.panel.keyframe.easing_type.options.elastic":()=>qoe,"animated_java.panel.keyframe.easing_type.options.expo":()=>zoe,"animated_java.panel.keyframe.easing_type.options.linear":()=>Roe,"animated_java.panel.keyframe.easing_type.options.quad":()=>Boe,"animated_java.panel.keyframe.easing_type.options.quart":()=>Loe,"animated_java.panel.keyframe.easing_type.options.quint":()=>Voe,"animated_java.panel.keyframe.easing_type.options.sine":()=>Moe,"animated_java.panel.keyframe.easing_type.title":()=>Foe,"animated_java.panel.keyframe.execute_condition.description":()=>Coe,"animated_java.panel.keyframe.execute_condition.title":()=>Toe,"animated_java.panel.keyframe.keyframe_title":()=>woe,"animated_java.panel.keyframe.nonlinear_interpolation":()=>rse,"animated_java.panel.keyframe.repeat.description":()=>Ooe,"animated_java.panel.keyframe.repeat.title":()=>Soe,"animated_java.panel.keyframe.repeat_frequency.description":()=>Doe,"animated_java.panel.keyframe.repeat_frequency.title":()=>Ioe,"animated_java.panel.keyframe.variant.description":()=>koe,"animated_java.panel.keyframe.variant.title":()=>Eoe,"animated_java.panel.text_display.title":()=>ose,"animated_java.panel.vanilla_block_display.description":()=>Nse,"animated_java.panel.vanilla_block_display.title":()=>Fse,"animated_java.panel.vanilla_item_display.description":()=>yse,"animated_java.panel.vanilla_item_display.title":()=>bse,"animated_java.panel.variants.title":()=>ioe,"animated_java.panel.variants.tool.cannot_delete_default_variant":()=>uoe,"animated_java.panel.variants.tool.create_new_variant":()=>aoe,"animated_java.panel.variants.tool.delete_selected_variant":()=>soe,"animated_java.panel.variants.tool.duplicate_selected_variant":()=>ooe,"animated_java.panel.variants.tool.edit_variant":()=>roe,"animated_java.panel.variants.tool.variant_not_visible":()=>coe,"animated_java.panel.variants.tool.variant_visible":()=>loe,"animated_java.popup.loading.loading":()=>dte,"animated_java.popup.loading.offline":()=>mte,"animated_java.popup.loading.success":()=>pte,"animated_java.tool.item_display.item_display.description":()=>Ese,"animated_java.tool.item_display.item_display.options.firstperson_lefthand":()=>Tse,"animated_java.tool.item_display.item_display.options.firstperson_righthand":()=>Cse,"animated_java.tool.item_display.item_display.options.fixed":()=>Dse,"animated_java.tool.item_display.item_display.options.ground":()=>Ise,"animated_java.tool.item_display.item_display.options.gui":()=>Ose,"animated_java.tool.item_display.item_display.options.head":()=>Sse,"animated_java.tool.item_display.item_display.options.none":()=>kse,"animated_java.tool.item_display.item_display.options.thirdperson_lefthand":()=>jse,"animated_java.tool.item_display.item_display.options.thirdperson_righthand":()=>Ase,"animated_java.tool.item_display.item_display.title":()=>wse,"animated_java.tool.text_display.background_color.description":()=>use,"animated_java.tool.text_display.background_color.title":()=>cse,"animated_java.tool.text_display.line_width.description":()=>lse,"animated_java.tool.text_display.line_width.title":()=>sse,"animated_java.tool.text_display.see_through.description":()=>vse,"animated_java.tool.text_display.see_through.title":()=>xse,"animated_java.tool.text_display.text_alignment.description":()=>fse,"animated_java.tool.text_display.text_alignment.options.center":()=>gse,"animated_java.tool.text_display.text_alignment.options.left":()=>hse,"animated_java.tool.text_display.text_alignment.options.right":()=>_se,"animated_java.tool.text_display.text_alignment.title":()=>mse,"animated_java.tool.text_display.text_shadow.description":()=>pse,"animated_java.tool.text_display.text_shadow.title":()=>dse,"animated_java.vanilla_item_display.title":()=>Rse,default:()=>Wse});var $ee="\u84DD\u56FE\u8BBE\u7F6E",ete="\u6587\u6863",tte="\u5173\u4E8E",nte="\u9AA8\u9ABC\u914D\u7F6E",ite="\u5B9A\u4F4D\u5668\u914D\u7F6E",ate="\u6587\u672C\u5C55\u793A\u914D\u7F6E",rte="\u5BFC\u51FA",ote="\u6DFB\u52A0\u6587\u672C\u5C55\u793A\u5B9E\u4F53",ste="\u6DFB\u52A0\u7269\u54C1\u5C55\u793A\u5B9E\u4F53",lte="\u6DFB\u52A0\u65B9\u5757\u5C55\u793A\u5B9E\u4F53",cte="\u7269\u54C1\u5C55\u793A\u914D\u7F6E",ute="\u65B9\u5757\u5C55\u793A\u914D\u7F6E",dte="Animated Java \u52A0\u8F7D\u4E2D...",pte="Animated Java \u52A0\u8F7D\u5B8C\u6210\uFF01",mte=`Animated Java \u8FDE\u63A5\u5931\u8D25\uFF01 \u90E8\u5206\u529F\u80FD\u5C06\u4E0D\u53EF\u7528\u3002`,fte="\u611F\u8C22\u5B89\u88C5\uFF01",hte="\u662F\u65F6\u5019\u52A8\u8D77\u6765\u4E86\uFF01",gte="\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u503C",_te="\u5173\u4E8E Animated Java",xte="\u5173\u95ED",vte="\u53D1\u751F\u4E86\u610F\u5916\u9519\u8BEF\uFF01",bte="\u5173\u95ED",yte="\u5DF2\u590D\u5236\u9519\u8BEF\u4FE1\u606F\uFF01",wte="\u70B9\u51FB\u4FDD\u5B58\u9519\u8BEF\u4FE1\u606F\u5230\u526A\u5207\u677F\u3002",Ete="\u53EF\u52A0\u5165 Discord \u670D\u52A1\u5668 {0} \u5E76\u5728 #animated-java-support \u9891\u9053\u521B\u5EFA\u8BA8\u8BBA\u4E32\u6765\u62A5\u544A\u8BE5\u9519\u8BEF\u4FE1\u606F\uFF0C\u6216\u5728 {1} \u4E0B\u521B\u5EFA\u4E00\u4E2Aissue\u3002\u8C22\u8C22\uFF01",kte="\u84DD\u56FE\u8BBE\u7F6E",jte="\u4EC5\u5728\u5341\u5206\u5FC5\u8981\u65F6\u4F7F\u7528\u9AD8\u7EA7\u8BBE\u7F6E\uFF01",Ate="\u84DD\u56FE\u540D\u79F0",Tte="\u84DD\u56FE\u7684\u540D\u79F0\uFF0C\u4EC5\u7528\u4E8E\u8BC6\u522B\u5DE5\u4F5C\u533A\u4E2D\u7684\u9879\u76EE\u3002",Cte="\u7EB9\u7406\u5C3A\u5BF8",Ste="UV\u7F16\u8F91\u5668\u7684\u5206\u8FA8\u7387\uFF0C\u5E94\u5F53\u4E0E\u6700\u5927\u7684\u7EB9\u7406\u5C3A\u5BF8\u4E00\u81F4\u3002\u4E3A\u8FBE\u5230\u66F4\u597D\u7684\u6E38\u620F\u6548\u679C\uFF0C\u5EFA\u8BAE\u4F7F\u7528\u957F\u5BBD\u76F8\u7B49\u4E14\u4E3A2\u7684\u5E42\u6B21\u65B9\u7684\u8D34\u56FE\u3002",Ote="\u4E3A\u8FBE\u5230\u6700\u4F73\u6548\u679C\uFF0C\u7EB9\u7406\u7684\u957F\u4E0E\u5BBD\u5E94\u8BE5\u76F8\u7B49\u3002",Ite="\u4E3A\u8FBE\u5230\u6700\u4F73\u6548\u679C\uFF0C\u7EB9\u7406\u7684\u5C3A\u5BF8\u5E94\u4E3A2\u7684\u5E42\u6B21\u65B9\u3002",Dte="\u7EB9\u7406\u7684\u5C3A\u5BF8\u5E94\u5F53\u4E0E\u6700\u5927\u7EB9\u7406\u7684\u5C3A\u5BF8\u4E00\u81F4\u3002",Fte="\u5BFC\u51FA\u8BBE\u7F6E",Nte="\u5BFC\u51FA\u547D\u540D\u7A7A\u95F4",Rte="\u9879\u76EE\u5BFC\u51FA\u65F6\u6240\u4F7F\u7528\u7684\u540D\u79F0\uFF0C\u6216\u8005\u8BF4\u662F\u5BFC\u51FA\u4E3A\u8D44\u6E90\u5305\u4E0E\u6570\u636E\u5305\u65F6\u6240\u4F7F\u7528\u7684\u547D\u540D\u7A7A\u95F4\u3002",Mte="\u5BFC\u51FA\u547D\u540D\u7A7A\u95F4\u4E0D\u80FD\u4E3A\u7A7A\uFF01",Bte="\u5BFC\u51FA\u547D\u540D\u7A7A\u95F4 \u201C{0}\u201D \u4EC5\u7528\u4E8E\u5185\u90E8\u8FD0\u4F5C\uFF01\u8BF7\u4F7F\u7528\u5176\u4ED6\u547D\u540D\u7A7A\u95F4\u3002",Pte="\u5BFC\u51FA\u547D\u540D\u7A7A\u95F4\u7684\u540D\u79F0\u5305\u542B\u4E86\u975E\u6CD5\u5B57\u7B26\uFF01\u8BF7\u4EC5\u4F7F\u7528\u82F1\u6587\u5B57\u7B26\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF\u3002",Lte="\u63D2\u4EF6\u6A21\u5F0F",Vte="\u662F\u5426\u5F00\u542F\u63D2\u4EF6\u6A21\u5F0F\uFF0C\u8BA1\u5212\u4F7F\u7528\u57FA\u4E8E\u63D2\u4EF6\u800C\u975E\u8D44\u6E90\u5305/\u6570\u636E\u5305\u7684\u8BDD\u542F\u7528\u8BE5\u6A21\u5F0F\u3002",zte="\u8D44\u6E90\u5305\u5BFC\u51FA\u6A21\u5F0F",Ute=`\u8D44\u6E90\u5305\u7684\u5BFC\u51FA\u65B9\u5F0F\u3002 \u539F\u59CB - \u8D44\u6E90\u5305\u4EE5\u6587\u4EF6\u5939\u7684\u65B9\u5F0F\u5BFC\u51FA\u3002 \u538B\u7F29 - \u8D44\u6E90\u5305\u4EE5 .zip \u538B\u7F29\u5305\u7684\u65B9\u5F0F\u5BFC\u51FA\u3002 \u65E0 - \u5173\u95ED\u5BF9\u8D44\u6E90\u5305\u7684\u5BFC\u51FA\u3002`,qte="\u539F\u59CB",Hte="\u538B\u7F29",Jte="\u65E0",Gte="\u6570\u636E\u5305\u5BFC\u51FA\u6A21\u5F0F",Wte=`\u6570\u636E\u5305\u7684\u5BFC\u51FA\u65B9\u5F0F\u3002 \u539F\u59CB - \u6570\u636E\u5305\u4EE5\u6587\u4EF6\u5939\u7684\u65B9\u5F0F\u5BFC\u51FA\u3002 \u538B\u7F29 - \u6570\u636E\u5305\u4EE5 .zip \u538B\u7F29\u5305\u7684\u65B9\u5F0F\u5BFC\u51FA\u3002 \u65E0 - \u5173\u95ED\u5BF9\u6570\u636E\u5305\u7684\u5BFC\u51FA\u3002`,Kte="\u539F\u59CB",Yte="\u538B\u7F29",Xte="\u65E0",Zte="\u663E\u793A\u8FB9\u754C\u6846",Qte="\u662F\u5426\u5728\u7F16\u8F91\u6A21\u5F0F\u4E0B\u663E\u793A\u8FB9\u754C\u6846\u3002",$te="\u81EA\u52A8\u8FB9\u754C\u6846",ene=`\u662F\u5426\u6839\u636E\u6A21\u578B\u7684\u5F62\u72B6\u81EA\u52A8\u8BA1\u7B97\u8FB9\u754C\u6846\u3002 \u6CE8\uFF1A\u81EA\u52A8\u8FB9\u754C\u6846\u5E76\u4E0D\u4F1A\u6839\u636E\u52A8\u753B\u65F6\u9AA8\u9ABC\u7684\u504F\u79FB\u8FDB\u884C\u8BA1\u7B97\uFF0C\u6240\u4EE5\u53EF\u80FD\u5BFC\u81F4\u6BD4\u9884\u60F3\u4E2D\u8981\u5C0F\u7684\u60C5\u51B5\u3002`,tne="\u8FB9\u754C\u6846",nne="\u786E\u5B9A\u6A21\u578B\u7684\u5254\u9664\u6846\uFF0C\u5F53\u8BE5\u6846\u79BB\u5F00\u5C4F\u5E55\u65F6\u5C06\u505C\u6B62\u8BE5\u6A21\u578B\u7684\u6E32\u67D3\u3002",ine="\u8D44\u6E90\u5305\u8BBE\u7F6E",ane="\u9AD8\u7EA7\u8BBE\u7F6E",rne="\u662F\u5426\u542F\u7528\u8D44\u6E90\u5305\u7684\u9AD8\u7EA7\u8BBE\u7F6E\u3002",one="\u9AD8\u7EA7\u6587\u4EF6\u5939",sne="\u662F\u5426\u542F\u7528\u9AD8\u7EA7\u8D44\u6E90\u5305\u6587\u4EF6\u5939\u8BBE\u7F6E\u3002",lne="\u627F\u8F7D\u7269",cne="\u6E38\u620F\u4E2D\u7528\u4E8E\u663E\u793A\u84DD\u56FE\u5185\u6A21\u578B\u7684\u7269\u54C1\u3002\u591A\u4E2A\u84DD\u56FE\u4F7F\u7528\u76F8\u540C\u7684\u7269\u54C1\u65F6\u4F1A\u88AB\u81EA\u52A8\u5408\u5E76\u3002",une="\u672A\u6307\u5B9A\u7269\u54C1\uFF01",dne="\u6240\u63D0\u4F9B\u7684\u7269\u54C1ID\u65E0\u6548\uFF01\u7269\u54C1ID\u7684\u586B\u5199\u683C\u5F0F\u5E94\u4E3A \u547D\u540D\u7A7A\u95F4:\u7269\u54C1id \u3002",pne="\u6240\u63D0\u4F9B\u7684\u7269\u54C1ID\u65E0\u6548\uFF01\u7269\u54C1ID\u4E0D\u5E94\u5305\u542B\u7A7A\u683C\u3002",mne="\u539F\u7248\u4E0D\u5B58\u5728\u6240\u6307\u5B9A\u7684\u7269\u54C1\uFF01",fne="\u6240\u9009\u7269\u54C1\u5E76\u672A\u4F7F\u7528 'minecraft:item/generated' \u4E3A\u7236\u7C7B\u3002\u53EF\u80FD\u4F1A\u5BFC\u81F4\u6E38\u620F\u4E2D\u7684\u6A21\u578B\u51FA\u73B0\u95EE\u9898\u3002",hne="\u6240\u9009\u7269\u54C1\u5728\u539F\u7248\u8D44\u6E90\u5305\u4E2D\u4E0D\u5B58\u5728\u6A21\u578B\u6587\u4EF6\uFF01",gne="CMD \u504F\u4F4D",_ne="\u627F\u8F7D\u7269\u7684 Custom Model Data \u6240\u4F7F\u7528\u7684\u504F\u79FB\u91CF\u3002\u5141\u8BB8\u4E92\u76F8\u72EC\u7ACB\u7684\u8D44\u6E90\u5305\u5185\u7684\u591A\u4E2A\u84DD\u56FE\u4F7F\u7528\u76F8\u540C\u7684\u7269\u54C1\u4E3A\u627F\u8F7D\u7269\u3002",xne="\u8D44\u6E90\u5305",vne="\u9879\u76EE\u5BFC\u51FA\u5230\u7684\u8D44\u6E90\u5305\u7684\u6839\u6587\u4EF6\u5939\u3002",bne="\u672A\u6307\u5B9A\u6587\u4EF6\u5939\uFF01",yne="\u6240\u6307\u5B9A\u7684\u6587\u4EF6\u5939\u4E0D\u5B58\u5728\uFF01",wne="\u6240\u6307\u5B9A\u7684\u8DEF\u5F84\u5E76\u975E\u6587\u4EF6\u5939\uFF01",Ene="\u6240\u6307\u5B9A\u7684\u6587\u4EF6\u5939\u7F3A\u5C11 pack.mcmeta \u6587\u4EF6\uFF01",kne="\u6240\u6307\u5B9A\u7684\u8D44\u6E90\u5305\u7F3A\u5C11 assets \u6587\u4EF6\u5939\uFF01",jne="\u538B\u7F29\u8D44\u6E90\u5305",Ane="\u9879\u76EE\u5BFC\u51FA\u5230 .zip \u6587\u4EF6\u7684\u8DEF\u5F84\u3002",Tne="\u672A\u6307\u5B9A\u6587\u4EF6\uFF01",Cne="\u6240\u6307\u5B9A\u7684\u8DEF\u5F84\u5E76\u975E\u6587\u4EF6\uFF01",Sne="\u627F\u8F7D\u7269\u8DEF\u5F84",One="\u6240\u6709\u627F\u8F7D\u7269\u7684\u5B58\u653E\u4F4D\u7F6E\u3002\u5E94\u4E3A\u8D44\u6E90\u5305\u5185\u5230 .json \u6587\u4EF6\u7684\u8DEF\u5F84\u3002",Ine="\u672A\u6307\u5B9A\u6587\u4EF6\uFF01",Dne="\u6240\u6307\u5B9A\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF01",Fne="\u6240\u6307\u5B9A\u7684\u8DEF\u5F84\u5E76\u975E\u6587\u4EF6\uFF01",Nne="\u6A21\u578B\u6587\u4EF6\u5939",Rne="\u6240\u6709\u5BFC\u51FA\u6A21\u578B\u7684\u5B58\u653E\u4F4D\u7F6E\u3002\u5E94\u4E3A\u8D44\u6E90\u5305\u5185\u5230\u6587\u4EF6\u5939\u7684\u8DEF\u5F84\u3002",Mne="\u672A\u6307\u5B9A\u6587\u4EF6\u5939\uFF01",Bne="\u6240\u6307\u5B9A\u7684\u6587\u4EF6\u5939\u4E0D\u5B58\u5728\uFF01",Pne="\u6240\u6307\u5B9A\u7684\u8DEF\u5F84\u5E76\u975E\u6587\u4EF6\u5939\uFF01",Lne="\u7EB9\u7406\u6587\u4EF6\u5939",Vne="\u6240\u6709\u5BFC\u51FA\u7EB9\u7406\u7684\u5B58\u653E\u4F4D\u7F6E\u3002\u5E94\u4E3A\u8D44\u6E90\u5305\u5185\u5230\u6587\u4EF6\u5939\u7684\u8DEF\u5F84\u3002",zne="\u6570\u636E\u5305\u8BBE\u7F6E",Une="\u542F\u7528\u9AD8\u7EA7\u8BBE\u7F6E",qne="\u662F\u5426\u542F\u7528\u6570\u636E\u5305\u7684\u9AD8\u7EA7\u8BBE\u7F6E\u3002",Hne="\u6570\u636E\u5305",Jne="\u9879\u76EE\u5BFC\u51FA\u5230\u7684\u6570\u636E\u5305\u7684\u6839\u6587\u4EF6\u5939\u3002",Gne="\u672A\u6307\u5B9A\u6587\u4EF6\u5939\uFF01",Wne="\u6240\u6307\u5B9A\u7684\u6587\u4EF6\u5939\u4E0D\u5B58\u5728\uFF01",Kne="\u6240\u6307\u5B9A\u7684\u8DEF\u5F84\u5E76\u975E\u6587\u4EF6\u5939\uFF01",Yne="\u6240\u6307\u5B9A\u7684\u6587\u4EF6\u5939\u7F3A\u5C11 pack.mcmeta \u6587\u4EF6\uFF01",Xne="\u6240\u6307\u5B9A\u7684\u6570\u636E\u5305\u7F3A\u5C11 data \u6587\u4EF6\u5939\uFF01",Zne="\u538B\u7F29\u6570\u636E\u5305",Qne="\u9879\u76EE\u5BFC\u51FA\u5230 .zip \u6587\u4EF6\u7684\u8DEF\u5F84\u3002",$ne="\u672A\u6307\u5B9A\u6587\u4EF6\uFF01",eie="\u6240\u6307\u5B9A\u7684\u8DEF\u5F84\u5E76\u975E\u6587\u4EF6\uFF01",tie="\u8FDB\u573A\u547D\u4EE4",nie=`\u88AB summon \u65F6\u4EE5\u6839\u5B9E\u4F53\u6267\u884C\u7684\u547D\u4EE4\u3002 \u8BE5\u4F4D\u7F6E\u7684\u6587\u672C\u8F93\u5165\u53EF\u89C6\u4E3A\u5728 .mcfunction \u4E2D\u8FD0\u884C\u3002\uFF08\u4E5F\u652F\u6301 MC-Build \u8BED\u6CD5\uFF01\uFF09`,iie="\u9AD8\u9891\u547D\u4EE4",aie=`\u5728\u6839\u5B9E\u4F53\u4F4D\u7F6E\u9AD8\u9891\u6267\u884C\u7684\u547D\u4EE4\u3002 \u8BE5\u4F4D\u7F6E\u7684\u6587\u672C\u8F93\u5165\u53EF\u89C6\u4E3A\u5728 .mcfunction \u4E2D\u8FD0\u884C\u3002\uFF08\u4E5F\u652F\u6301 MC-Build \u8BED\u6CD5\uFF01\uFF09 \u8BE5\u547D\u4EE4\u5C06\u5728\u52A8\u753B\u903B\u8F91\u4E4B\u540E\u6267\u884C\u3002`,rie="\u63D2\u503C\u65F6\u95F4",oie="\u4EE5tick\u4E3A\u5355\u4F4D\uFF0C\u5173\u952E\u5E27\u4E4B\u95F4\u5E73\u6ED1\u8FC7\u6E21\u7684\u6301\u7EED\u65F6\u95F4\u3002\u662F\u6A21\u578B\u8FC7\u6E21\u5230\u4E0B\u4E00\u4E2A\u5173\u952E\u5E27\u6240\u7528\u7684\u65F6\u95F4\u3002\u8F83\u9AD8\u7684\u63D2\u503C\u65F6\u95F4\u5C06\u5BFC\u81F4\u52A8\u753B\u5931\u53BB\u7CBE\u5EA6\uFF0C\u56E0\u6B64\u8BE5\u503C\u4E00\u822C\u5EFA\u8BAE\u4E3A1\u62162\u3002",sie="\u4F20\u9001\u65F6\u95F4",lie="\u4EE5tick\u4E3A\u5355\u4F4D\uFF0C\u5173\u952E\u5E27\u4E4B\u95F4\u4F20\u9001\u7684\u6301\u7EED\u65F6\u95F4\u3002\u662F\u6A21\u578B\u5728\u89C6\u89C9\u4E0A\u4ECE\u4E0A\u4E00\u4E2A\u4F4D\u7F6E\u8FC7\u6E21\u5230\u65B0\u4F4D\u7F6E\u6240\u7528\u7684\u65F6\u95F4\u3002\u8F83\u9AD8\u7684\u4F20\u9001\u65F6\u95F4\u5C06\u5BFC\u81F4\u52A8\u753B\u5931\u53BB\u7CBE\u5EA6\u3002",cie="\u4F7F\u7528 storage \u5B58\u50A8\u52A8\u753B",uie=`\u662F\u5426\u4F7F\u7528 NBT storage \u4EE3\u66FF\u51FD\u6570\u8FDB\u884C\u52A8\u753B\u6570\u636E\u5B58\u50A8\u3002 \u5C06\u4F1A\u5927\u5927\u51CF\u5C11\u6570\u636E\u5305\u751F\u6210\u65F6\u7684\u51FD\u6570\u6587\u4EF6\u6570\u91CF\uFF0C\u76F8\u5BF9\u7684\u8FD9\u4F1A\u6BD4\u4F7F\u7528\u51FD\u6570\u5B58\u50A8\u7684\u529E\u6CD5\u616242%\u3002`,die="\u70D8\u57F9\u52A8\u753B",pie=`\u662F\u5426\u70D8\u57F9\u5BFC\u51FA\u7684\u52A8\u753B\u3002 \u5DF2\u70D8\u57F9\u52A8\u753B\u7684\u5E27\u4F1A\u9884\u5148\u8BA1\u7B97\u5E76\u5B58\u50A8\u5728\u5BFC\u51FA\u7684 JSON \u6587\u4EF6\u4E2D\uFF0C\u4ECE\u800C\u964D\u4F4E\u5728\u6E38\u620F\u4E2D\u6E32\u67D3\u6A21\u578B\u65F6\u7684\u590D\u6742\u6027\u3002 \u90E8\u5206\u63D2\u4EF6\u53EF\u80FD\u9700\u8981\u5F00\u542F\u8FD9\u9879\u4EE5\u786E\u4FDD\u6B63\u5E38\u8FD0\u4F5C\u3002`,mie="JSON \u6587\u4EF6",fie="\u9879\u76EE\u5BFC\u51FA\u5230 JSON \u6587\u4EF6\u7684\u8DEF\u5F84\u3002",hie="\u672A\u6307\u5B9A\u6587\u4EF6\uFF01",gie="\u6240\u6307\u5B9A\u7684\u8DEF\u5F84\u5E76\u975E\u6587\u4EF6\uFF01",_ie="\u9AA8\u9ABC\u914D\u7F6E",xie="\u201C\u5DF2\u9009\u53D8\u4F53\uFF1A{0}\u201D",vie="\u4EE5\u4E0B\u8BBE\u7F6E\u5C06\u9ED8\u8BA4\u5E94\u7528\u5230\u8BE5\u9AA8\u9ABC\u3002",bie="\u4EE5\u4E0B\u8BBE\u7F6E\u4EC5\u5728\u5E94\u7528\u8BE5\u53D8\u4F53\u65F6\u5E94\u7528\u5230\u8BE5\u9AA8\u9ABC\u3002",yie="\u4F7F\u7528 NBT",wie="\u662F\u5426\u4F7F\u7528 NBT \u53D6\u4EE3\u8BBE\u7F6E\u8FDB\u884C\u9AA8\u9ABC\u914D\u7F6E\u3002",Eie="\u4F7F\u7528 NBT \u5C06\u4F1A\u8986\u76D6\u6240\u6709\u5176\u4ED6\u8BBE\u7F6E\uFF0C\u4EFB\u4F55\u66F4\u6539\u4E5F\u4E0D\u4F1A\u5728\u7F16\u8F91\u5668\u4E2D\u53EF\u89C1\u3002\u4EC5\u5728\u719F\u6089\u6B64\u529F\u80FD\u7684\u60C5\u51B5\u4E0B\u4F7F\u7528\uFF01",kie="\u7EE7\u627F\u8BBE\u7F6E",jie="\u662F\u5426\u4ECE\u7236\u7EA7\u9AA8\u9ABC\u7EE7\u627F\u8BBE\u7F6E\u3002",Aie="\u81EA\u5B9A\u4E49\u540D\u79F0",Tie="\u9AA8\u9ABC\u7684\u81EA\u5B9A\u4E49\u540D\u79F0\u3002",Cie=`\u65E0\u6548\u7684 JSON \u6587\u672C\uFF01 {0}`,Sie="\u81EA\u5B9A\u4E49\u540D\u79F0\u53EF\u89C1\u6027",Oie="\u81EA\u5B9A\u4E49\u540D\u79F0\u662F\u5426\u603B\u662F\u53EF\u89C1\u3002",Iie="\u53D1\u5149",Die="\u9AA8\u9ABC\u662F\u5426\u5728\u6E38\u620F\u4E2D\u53D1\u5149\u3002",Fie="\u4FEE\u6539\u53D1\u5149\u989C\u8272",Nie="\u662F\u5426\u6539\u53D8\u53D1\u5149\u7684\u9ED8\u8BA4\u989C\u8272\u3002",Rie="\u53D1\u5149\u989C\u8272",Mie="\u53D1\u5149\u7684\u989C\u8272\u3002",Bie="\u9634\u5F71\u534A\u5F84",Pie="\u9634\u5F71\u7684\u534A\u5F84\u3002",Lie="\u9634\u5F71\u5F3A\u5EA6",Vie="\u9634\u5F71\u7684\u5F3A\u5EA6\u3002",zie="\u4FEE\u6539\u4EAE\u5EA6",Uie="\u662F\u5426\u4FEE\u6539\u4EAE\u5EA6\u7684\u9ED8\u8BA4\u7B49\u7EA7\u3002",qie="\u4EAE\u5EA6",Hie="\u9AA8\u9ABC\u7684\u4EAE\u5EA6\u3002\u53D6\u503C\u8303\u56F4\u4E3A0\u81F315\u4E4B\u95F4\u3002",Jie="\u4F7F\u7528\u81EA\u5B9A\u4E49\u4EAE\u5EA6",Gie="\u9AA8\u9ABC\u662F\u5426\u542F\u7528\u81EA\u5B9A\u4E49\u4EAE\u5EA6\u3002",Wie="\u81EA\u5B9A\u4E49\u4EAE\u5EA6",Kie="\u9AA8\u9ABC\u7684\u81EA\u5B9A\u4E49\u4EAE\u5EA6\u3002\u53D6\u503C\u8303\u56F4\u4E3A0\u81F315\u4E4B\u95F4\u3002",Yie="\u9644\u9B54",Xie="\u9AA8\u9ABC\u662F\u5426\u4E3A\u9644\u9B54\u72B6\u6001\u6548\u679C\u3002",Zie="\u9690\u5F62",Qie="\u9AA8\u9ABC\u662F\u5426\u9690\u5F62\u3002",$ie="NBT",eae="\u5E94\u7528\u5230\u9AA8\u9ABC\u7684NBT\u3002",tae=`\u586B\u5199\u7684NBT\u5E94\u4E3A\u590D\u5408\u6807\u7B7E\uFF01\u4F8B\uFF1A{CustomName:'"\u4F60\u7684\u540D\u5B57"'}`,nae=`\u65E0\u6548\u7684NBT\uFF01 {0}`,iae="\u5E7F\u544A\u724C",aae="\u63A7\u5236\u6B64\u9AA8\u9ABC\u5728\u6E32\u67D3\u65F6\u5982\u4F55\u65CB\u8F6C\u4EE5\u9762\u5411\u73A9\u5BB6\u3002\u53EF\u8BBE\u7F6E\u4E3A\u56FA\u5B9A\uFF08\u56FA\u5B9A\u5782\u76F4\u548C\u6C34\u5E73\u8F74\uFF0C\u65E0\u65CB\u8F6C\uFF09\uFF0C\u5782\u76F4\uFF08\u56FA\u5B9A\u5782\u76F4\u8F74\uFF09\uFF0C\u6C34\u5E73\uFF08\u56FA\u5B9A\u6C34\u5E73\u8F74\uFF09\uFF0C\u548C\u4E2D\u5FC3\uFF08\u6309\u7167\u4E2D\u5FC3\u65CB\u8F6C\u8DDF\u968F\u73A9\u5BB6\u89C6\u89D2\uFF09\u3002",rae="\u56FA\u5B9A",oae="\u5782\u76F4",sae="\u6C34\u5E73",lae="\u4E2D\u5FC3",cae="\u5B9A\u4F4D\u5668\u914D\u7F6E",uae=`\u63D2\u4EF6\u6A21\u5F0F\u5DF2\u542F\u7528\uFF01\u8BE5\u6A21\u5F0F\u4E0B\u6CA1\u6709\u5B9A\u4F4D\u5668\u914D\u7F6E\u3002 \u8BF7\u4F7F\u7528\u63D2\u4EF6API\u4E3A\u5B9A\u4F4D\u5668\u6DFB\u52A0\u81EA\u5B9A\u4E49\u529F\u80FD\u3002 \u8BE6\u60C5\u8BF7\u67E5\u770B\u5B98\u65B9\u7684\u63D2\u4EF6API\u6587\u6863\u3002`,dae="\u4F7F\u7528\u5B9E\u4F53",pae="\u662F\u5426\u5728\u5B9A\u4F4D\u5668\u5904\u9644\u52A0\u8DDF\u968F\u5B9E\u4F53\u3002",mae="\u5B9E\u4F53\u7C7B\u578B",fae="\u9644\u52A0\u5230\u5B9A\u4F4D\u5668\u7684\u5B9E\u4F53\u7C7B\u578B\u3002",hae="\u5B9E\u4F53\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A\uFF01",gae="\u6240\u9009\u7684\u5B9E\u4F53\u7C7B\u578B {0} \u4E0D\u5B58\u5728\u4E8EMinecraft\u4E2D\u3002",_ae="\u8FDB\u573A\u547D\u4EE4",xae=`\u88AB summon \u65F6\u4EE5\u5B9A\u4F4D\u5668\u5B9E\u4F53\u6267\u884C\u7684\u547D\u4EE4\u3002 \u8BE5\u4F4D\u7F6E\u7684\u6587\u672C\u8F93\u5165\u53EF\u89C6\u4E3A\u5728 .mcfunction \u4E2D\u8FD0\u884C\u3002\uFF08\u4E5F\u652F\u6301 MC-Build \u8BED\u6CD5\uFF01\uFF09`,vae="\u9AD8\u9891\u547D\u4EE4",bae=`\u5728\u5B9A\u4F4D\u5668\u4F4D\u7F6E\u9AD8\u9891\u6267\u884C\u7684\u547D\u4EE4\u3002 \u8BE5\u4F4D\u7F6E\u7684\u6587\u672C\u8F93\u5165\u53EF\u89C6\u4E3A\u5728 .mcfunction \u4E2D\u8FD0\u884C\u3002\uFF08\u4E5F\u652F\u6301 MC-Build \u8BED\u6CD5\uFF01\uFF09`,yae="\u6587\u672C\u5C55\u793A\u914D\u7F6E",wae="\u539F\u7248\u7269\u54C1\u6A21\u578B",Eae=`\u82E5\u8BBE\u7F6E\uFF0C\u6B64\u9AA8\u9ABC\u5C06\u663E\u793A\u4E3A\u539F\u7248\u7269\u54C1\u6A21\u578B\u3002 \u5E76\u4E14\u8986\u76D6\u9AA8\u9ABC\u73B0\u6709\u7684\u65B9\u5757\u3002`,kae="\u4F7F\u7528 NBT",jae="\u662F\u5426\u4F7F\u7528 NBT \u53D6\u4EE3\u8BBE\u7F6E\u8FDB\u884C\u6587\u672C\u5C55\u793A\u914D\u7F6E\u3002",Aae="\u4F7F\u7528 NBT \u5C06\u4F1A\u8986\u76D6\u6240\u6709\u5176\u4ED6\u8BBE\u7F6E\uFF0C\u4EFB\u4F55\u66F4\u6539\u4E5F\u4E0D\u4F1A\u5728\u7F16\u8F91\u5668\u4E2D\u53EF\u89C1\u3002\u4EC5\u5728\u719F\u6089\u6B64\u529F\u80FD\u7684\u60C5\u51B5\u4E0B\u4F7F\u7528\uFF01",Tae="\u7EE7\u627F\u8BBE\u7F6E",Cae="\u662F\u5426\u4ECE\u7236\u7EA7\u6587\u672C\u5C55\u793A\u7EE7\u627F\u8BBE\u7F6E\u3002",Sae="\u53D1\u5149",Oae="\u6587\u672C\u5C55\u793A\u662F\u5426\u5728\u6E38\u620F\u4E2D\u53D1\u5149\u3002",Iae="\u4FEE\u6539\u53D1\u5149\u989C\u8272",Dae="\u662F\u5426\u6539\u53D8\u53D1\u5149\u7684\u9ED8\u8BA4\u989C\u8272\u3002",Fae="\u53D1\u5149\u989C\u8272",Nae="\u53D1\u5149\u7684\u989C\u8272",Rae="\u9634\u5F71\u534A\u5F84",Mae="\u9634\u5F71\u7684\u534A\u5F84\u3002",Bae="\u9634\u5F71\u5F3A\u5EA6",Pae="\u9634\u5F71\u7684\u5F3A\u5EA6",Lae="\u4FEE\u6539\u4EAE\u5EA6",Vae="\u662F\u5426\u4FEE\u6539\u4EAE\u5EA6\u7684\u9ED8\u8BA4\u7B49\u7EA7\u3002",zae="\u4EAE\u5EA6",Uae="\u6587\u672C\u5C55\u793A\u7684\u4EAE\u5EA6\u3002\u53D6\u503C\u8303\u56F4\u4E3A0\u81F315\u4E4B\u95F4\u3002",qae="\u4F7F\u7528\u81EA\u5B9A\u4E49\u4EAE\u5EA6",Hae="\u9AA8\u9ABC\u662F\u5426\u542F\u7528\u81EA\u5B9A\u4E49\u4EAE\u5EA6\u3002",Jae="\u81EA\u5B9A\u4E49\u4EAE\u5EA6",Gae="\u9AA8\u9ABC\u7684\u81EA\u5B9A\u4E49\u4EAE\u5EA6\u3002\u53D6\u503C\u8303\u56F4\u4E3A0\u81F315\u4E4B\u95F4\u3002",Wae="\u9690\u5F62",Kae="\u6587\u672C\u5C55\u793A\u662F\u5426\u9690\u5F62\u3002",Yae="NBT",Xae="\u5E94\u7528\u5230\u6587\u672C\u5C55\u793A\u7684NBT\u3002",Zae="\u5E7F\u544A\u724C",Qae="\u63A7\u5236\u6B64\u6587\u672C\u5C55\u793A\u5728\u6E32\u67D3\u65F6\u5982\u4F55\u65CB\u8F6C\u4EE5\u9762\u5411\u73A9\u5BB6\u3002\u53EF\u8BBE\u7F6E\u4E3A\u56FA\u5B9A\uFF08\u56FA\u5B9A\u5782\u76F4\u548C\u6C34\u5E73\u8F74\uFF0C\u65E0\u65CB\u8F6C\uFF09\uFF0C\u5782\u76F4\uFF08\u56FA\u5B9A\u5782\u76F4\u8F74\uFF09\uFF0C\u6C34\u5E73\uFF08\u56FA\u5B9A\u6C34\u5E73\u8F74\uFF09\uFF0C\u548C\u4E2D\u5FC3\uFF08\u6309\u7167\u4E2D\u5FC3\u65CB\u8F6C\u8DDF\u968F\u73A9\u5BB6\u89C6\u89D2\uFF09\u3002",$ae="\u56FA\u5B9A",ere="\u5782\u76F4",tre="\u6C34\u5E73",nre="\u4E2D\u5FC3",ire="\u65B9\u5757\u5C55\u793A\u914D\u7F6E",are="\u81EA\u5B9A\u4E49\u540D\u79F0",rre="\u65B9\u5757\u5C55\u793A\u7684\u81EA\u5B9A\u4E49\u540D\u79F0\u3002",ore=`\u65E0\u6548\u7684 JSON \u6587\u672C\uFF01 {0}`,sre="\u81EA\u5B9A\u4E49\u540D\u79F0\u53EF\u89C1\u6027",lre="\u81EA\u5B9A\u4E49\u540D\u79F0\u662F\u5426\u603B\u662F\u53EF\u89C1\u3002",cre="\u7269\u54C1\u5C55\u793A\u914D\u7F6E",ure="\u81EA\u5B9A\u4E49\u540D\u79F0",dre="\u7269\u54C1\u5C55\u793A\u7684\u81EA\u5B9A\u4E49\u540D\u79F0\u3002",pre=`\u65E0\u6548\u7684 JSON \u6587\u672C\uFF01 {0}`,mre="\u81EA\u5B9A\u4E49\u540D\u79F0\u53EF\u89C1\u6027",fre="\u81EA\u5B9A\u4E49\u540D\u79F0\u662F\u5426\u603B\u662F\u53EF\u89C1\u3002",hre="\u53D8\u4F53\u914D\u7F6E",gre="\u663E\u793A\u540D\u79F0",_re="\u7528\u4E8E\u5728\u7F16\u8F91\u5668\u548C\u9519\u8BEF\u4FE1\u606F\u4E2D\u8BC6\u522B\u53D8\u4F53\u3002",xre="\u751F\u6210\u663E\u793A\u540D\u79F0",vre="\u662F\u5426\u6839\u636E\u663E\u793A\u540D\u79F0\u81EA\u52A8\u751F\u6210\u540D\u79F0\u3002",bre="\u540D\u79F0",yre="\u7528\u4E8E\u5728\u5BFC\u51FA\u7684\u8D44\u6E90\u5305\u548C\u6570\u636E\u5305\u4E2D\u8BC6\u522B\u53D8\u4F53\u3002",wre="\u7EB9\u7406\u6620\u5C04",Ere="\u5E94\u7528\u8BE5\u53D8\u4F53\u65F6\u6240\u4F7F\u7528\u7684\u8D34\u56FE\u3002",kre="\u521B\u5EFA\u65B0\u7684\u6620\u5C04",jre="\u53D8\u4F53\u4E0D\u5B58\u5728\u6620\u5C04\u7684\u7EB9\u7406\u3002",Are="\u5305\u542B\u6216\u6392\u9664\u5728\u53D8\u4F53\u7684\u8282\u70B9\u5217\u8868\u3002\u5305\u542B\u7684\u8282\u70B9\u5C06\u4F1A\u88AB\u53D8\u4F53\u4FEE\u6539\uFF0C\u6392\u9664\u7684\u8282\u70B9\u5219\u4F1A\u88AB\u8282\u70B9\u5FFD\u7565\u3002",Tre="\u6392\u9664\u8282\u70B9",Cre="\u6392\u9664\u5728\u53D8\u4F53\u7684\u8282\u70B9\u5217\u8868\u3002\u8BE5\u8282\u70B9\u5C06\u4E0D\u4F1A\u88AB\u53D8\u4F53\u4FEE\u6539\u3002",Sre="\u5305\u542B\u8282\u70B9",Ore="\u5305\u542B\u5728\u53D8\u4F53\u7684\u8282\u70B9\u5217\u8868\u3002\u8BE5\u8282\u70B9\u5C06\u4F1A\u88AB\u53D8\u4F53\u4FEE\u6539\u3002",Ire="\u4E92\u6362\u5217\u8868",Dre="\u66F4\u65B0 .ajmodel",Fre="\u66F4\u65B0 .ajmodel",Nre="\u9009\u62E9 .ajmodel \u6587\u4EF6",Rre="\u5347\u7EA7\u65E7\u7248 .ajmodel \u6587\u4EF6\u4E3A\u65B0\u7684 .ajblueprint \u683C\u5F0F\u6587\u4EF6\u3002",Mre="\u9009\u62E9\u9700\u8981\u66F4\u65B0\u7684 .ajmodel \u6587\u4EF6",Bre="\u52A8\u753B\u5C5E\u6027 ({0})",Pre="\u52A8\u753B\u540D\u79F0",Lre="\u52A8\u753B\u7684\u540D\u79F0\u3002",Vre="\u5FAA\u73AF\u6A21\u5F0F",zre="\u52A8\u753B\u7684\u5FAA\u73AF\u65B9\u5F0F\u3002\u5355\u6B21 - \u52A8\u753B\u64AD\u653E\u4E00\u6B21\u540E\u505C\u6B62\u3002\u505C\u7559 - \u52A8\u753B\u64AD\u653E\u4E00\u6B21\u540E\u505C\u7559\u5728\u6700\u540E\u5E27\u3002\u5FAA\u73AF - \u52A8\u753B\u91CD\u590D\u64AD\u653E\u3002",Ure="\u5355\u6B21",qre="\u505C\u7559",Hre="\u5FAA\u73AF",Jre="\u52A8\u753B\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF01",Gre="\u52A8\u753B\u7684\u540D\u79F0\u5305\u542B\u4E86\u975E\u6CD5\u5B57\u7B26\uFF01\u8BF7\u4EC5\u4F7F\u7528\u82F1\u6587\u5B57\u7B26\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u82F1\u6587\u70B9\u53F7\u3002",Wre="\u5FAA\u73AF\u5EF6\u8FDF",Kre="\u5FAA\u73AF\u7684\u5EF6\u8FDF\u3002\u52A8\u753B\u7ED3\u675F\u540E\u5230\u518D\u6B21\u64AD\u653E\u7684\u95F4\u9694\u65F6\u95F4\u3002\u4EC5\u5728\u5FAA\u73AF\u6A21\u5F0F\u4E3A\u5FAA\u73AF\u65F6\u9002\u7528\u3002",Yre="\u5305\u542B\u6216\u6392\u9664\u5728\u52A8\u753B\u4E2D\u7684\u8282\u70B9\u5217\u8868\u3002\u5305\u542B\u7684\u8282\u70B9\u5C06\u4F1A\u88AB\u52A8\u753B\u4FEE\u6539\uFF0C\u6392\u9664\u7684\u8282\u70B9\u5219\u4F1A\u88AB\u52A8\u753B\u5FFD\u7565\u3002",Xre="\u6392\u9664\u8282\u70B9",Zre="\u6392\u9664\u5728\u52A8\u753B\u4E2D\u7684\u8282\u70B9\u5217\u8868\u3002\u8BE5\u8282\u70B9\u5C06\u4E0D\u4F1A\u88AB\u52A8\u753B\u4FEE\u6539\u3002",Qre="\u5305\u542B\u8282\u70B9",$re="\u5305\u542B\u5728\u52A8\u753B\u4E2D\u7684\u8282\u70B9\u5217\u8868\u3002\u8BE5\u8282\u70B9\u5C06\u4F1A\u88AB\u52A8\u753B\u4FEE\u6539\u3002",eoe="\u4E92\u6362\u5217\u8868",toe="\u5BFC\u51FA\u4E2D...",noe="\u84DD\u56FE\u52A0\u8F7D\u4E2D...",ioe="\u53D8\u4F53",aoe="\u521B\u5EFA\u65B0\u53D8\u4F53",roe="\u7F16\u8F91\u53D8\u4F53",ooe="\u590D\u5236\u6240\u9009\u53D8\u4F53",soe="\u5220\u9664\u6240\u9009\u53D8\u4F53",loe="\u5DF2\u9009\u62E9\u53D8\u4F53",coe="\u672A\u9009\u62E9\u53D8\u4F53",uoe="\u4E0D\u53EF\u5220\u9664\u9ED8\u8BA4\u53D8\u4F53\uFF01",doe="\u521B\u5EFA\u53D8\u4F53",poe="\u590D\u5236\u53D8\u4F53",moe="\u6253\u5F00\u53D8\u4F53\u914D\u7F6E",foe="\u5220\u9664\u53D8\u4F53",hoe="\u6392\u9664\u8282\u70B9",goe="\u53CD\u8F6C\u6392\u9664\u8282\u70B9",_oe="\u53D8\u4F53",xoe="\u547D\u4EE4",voe="\u53D8\u4F53",boe="\u547D\u4EE4",yoe="\u6267\u884C\u6761\u4EF6",woe="\u5173\u952E\u5E27 ({0})",Eoe="\u53D8\u4F53",koe="\u5E94\u7528\u5230\u5173\u952E\u5E27\u7684\u53D8\u4F53\u3002",joe="\u547D\u4EE4",Aoe=`\u5230\u8FBE\u76EE\u6807\u5173\u952E\u5E27\u65F6\u8FD0\u884C\u7684\u547D\u4EE4\u3002 \u8BE5\u4F4D\u7F6E\u7684\u6587\u672C\u8F93\u5165\u53EF\u89C6\u4E3A\u5728 .mcfunction \u4E2D\u8FD0\u884C\u3002\uFF08\u4E5F\u652F\u6301 MC-Build \u8BED\u6CD5\uFF01\uFF09`,Toe="\u6267\u884C\u6761\u4EF6",Coe="\u5173\u952E\u5E27\u6267\u884C\u547D\u4EE4\u65F6\u5FC5\u987B\u6EE1\u8DB3\u7684\u6761\u4EF6\u3002\u53EF\u89C6\u8F93\u5165\u7684\u6587\u672C\u4E3A execute \u547D\u4EE4\u7684\u5B50\u547D\u4EE4\u3002",Soe="\u91CD\u590D\u6267\u884C\uFF1F",Ooe=`\u662F\u5426\u5728\u8BE5\u5173\u952E\u5E27\u91CD\u590D\u6267\u884C\u547D\u4EE4\u3002 \u82E5\u542F\u7528\uFF0C\u5219\u4F1A\u4EE5\u76F8\u5E94\u7684\u9891\u7387\u6267\u884C\u547D\u4EE4\u3002`,Ioe="\u91CD\u590D\u9891\u7387",Doe=`\u8BE5\u5173\u952E\u5E27\u518D\u6B21\u6267\u884C\u547D\u4EE4\u7684\u7B49\u5F85\u523B\u6570\u3002 \u8BBE\u7F6E\u4E3A1\u5219\u5728\u6BCF\u4E00\u523B\u6267\u884C\u4E00\u6B21\u547D\u4EE4\u3002 \u6CE8\u610F\uFF1A\u82E5\u52A8\u753B\u4E0D\u80FD\u88AB\u8BE5\u503C\u6574\u9664\uFF0C\u5219\u52A8\u753B\u5FAA\u73AF\u65F6\u95F4\u9694\u53EF\u80FD\u4F1A\u7565\u6709\u504F\u5DEE\u3002 \u82E5\u8BBE\u503C\u5927\u4E8E\u52A8\u753B\u7684\u957F\u5EA6\uFF0C\u547D\u4EE4\u5219\u4F1A\u89C6\u4E3A\u91CD\u590D\u88AB\u7981\u6B62\u65F6\u6267\u884C\u3002\uFF08\u5230\u8FBE\u5173\u952E\u5E27\u65F6\u6267\u884C\u4E00\u6B21\uFF09`,Foe="\u7F13\u52A8\u7C7B\u578B",Noe="\u5E94\u7528\u5230\u5173\u952E\u5E27\u7684\u7F13\u52A8\u7C7B\u578B\u3002",Roe="\u7EBF\u6027",Moe="\u6B63\u5F26",Boe="\u4E8C\u6B21\u65B9",Poe="\u4E09\u6B21\u65B9",Loe="\u56DB\u6B21\u65B9",Voe="\u4E94\u6B21\u65B9",zoe="\u6307\u6570",Uoe="\u5706",qoe="\u5F39\u6027",Hoe="\u540E\u89C6\u56FE",Joe="\u5F39\u8DF3",Goe="\u7F13\u52A8\u6A21\u5F0F",Woe="\u5E94\u7528\u5230\u5173\u952E\u5E27\u7684\u7F13\u52A8\u6A21\u5F0F\u3002",Koe="\u6DE1\u5165",Yoe="\u6DE1\u51FA",Xoe="\u6DE1\u5165\u6DE1\u51FA",Zoe="\u7F13\u52A8\u53C2\u6570",Qoe="\u7F13\u52A8\u51FD\u6570\u4F7F\u7528\u7684\u53C2\u6570\u3002",$oe="\u5F39\u6027",ese="\u7F13\u52A8\u51FD\u6570\u7684\u5F39\u6027\u3002",tse="\u8FC7\u51B2",nse="\u7F13\u52A8\u51FD\u6570\u4E2D\u7684\u8FC7\u51B2\u6B21\u6570\u3002",ise="\u5F39\u8DF3",ase="\u7F13\u52A8\u51FD\u6570\u7684\u5F39\u8DF3\u6027\u3002",rse=`\u5F53\u524D\u7981\u7528\u9AD8\u7EA7\u7F13\u52A8\u8BBE\u7F6E\u3002 \u4FEE\u6539\u5173\u952E\u5E27\u7684\u63D2\u503C\u6A21\u5F0F\u4E3A\u201C\u7EBF\u6027\u201D\u4EE5\u542F\u7528\u3002`,ose="\u6587\u672C\u5C55\u793A",sse="\u884C\u5BBD",lse="\u6587\u672C\u5C55\u793A\u7684\u884C\u5BBD\uFF0C\u4EE5\u50CF\u7D20\u4E3A\u5355\u4F4D\u3002",cse="\u80CC\u666F\u989C\u8272",use="\u6587\u672C\u5C55\u793A\u7684\u80CC\u666F\u989C\u8272\u3002",dse="\u6587\u5B57\u9634\u5F71",pse="\u662F\u5426\u5728\u663E\u793A\u7684\u6587\u5B57\u540E\u9762\u663E\u793A\u9634\u5F71\u3002",mse="\u6587\u672C\u5BF9\u9F50",fse="\u6587\u672C\u7684\u5BF9\u9F50\u65B9\u5F0F\u3002",hse="\u9760\u5DE6",gse="\u5C45\u4E2D",_se="\u9760\u53F3",xse="\u7A7F\u900F",vse="\u6587\u672C\u5C55\u793A\u662F\u5426\u5728\u65B9\u5757\u540E\u4F9D\u7136\u53EF\u89C1\u3002",bse="\u663E\u793A\u7269\u54C1",yse="\u6240\u663E\u793A\u7684\u7269\u54C1\u3002",wse="\u7269\u54C1\u663E\u793A\u6A21\u5F0F",Ese="\u5E94\u7528\u5230\u7269\u54C1\u6A21\u578B\u7684\u53D8\u5316\u3002\uFF08\u53C2\u8003\u81EA JSON \u6A21\u578B\u4E2D display \u7684\u5B9A\u4E49\uFF09",kse="\u65E0",jse="\u7B2C\u4E09\u4EBA\u79F0\u5DE6\u624B",Ase="\u7B2C\u4E09\u4EBA\u79F0\u53F3\u624B",Tse="\u7B2C\u4E00\u4EBA\u79F0\u5DE6\u624B",Cse="\u7B2C\u4E00\u4EBA\u79F0\u53F3\u624B",Sse="\u5934\u90E8",Ose="GUI",Ise="\u5730\u9762",Dse="\u56FA\u5B9A",Fse="\u663E\u793A\u65B9\u5757",Nse="\u6240\u663E\u793A\u7684\u65B9\u5757\u3002\u652F\u6301\u8F93\u5165\u65B9\u5757\u72B6\u6001\uFF01",Rse="\u539F\u7248\u7269\u54C1\u5C55\u793A",Mse="\u5BFC\u51FA\u5931\u8D25",Bse="\u5F53\u524D\u8BBE\u7F6E\u4E3A\u4E0D\u5BFC\u51FA\u8D44\u6E90\u5305\uFF0C\u4F46\u9879\u76EE\u4E2D\u5B58\u5728\u81EA\u5B9A\u4E49\u6A21\u578B\uFF01\u8BF7\u542F\u7528\u8D44\u6E90\u5305\u5BFC\u51FA\u6216\u79FB\u9664\u81EA\u5B9A\u4E49\u6A21\u578B\u540E\u518D\u6B21\u5C1D\u8BD5\u5BFC\u51FA\u3002",Pse="\u84DD\u56FE\u8BBE\u7F6E\u5B58\u5728\u9519\u8BEF\uFF01\u8BF7\u5728\u4FEE\u6B63\u540E\u518D\u6B21\u5C1D\u8BD5\u5BFC\u51FA\u3002",Lse="\u627E\u5230\u9519\u8BEF {0}\uFF1A",Vse="\u597D",zse="Animated Java",Use="\u65B9\u5757\u5C55\u793A\u4E0B\u4E0D\u4F1A\u6E32\u67D3\u6D41\u4F53\u3002",qse="\u65B9\u5757\u5C55\u793A\u4E0B\u4E0D\u4F1A\u6E32\u67D3\u751F\u7269\u5934\u9885\uFF0C\u8BF7\u6539\u7528\u7269\u54C1\u5C55\u793A\u3002",Hse="\u65B9\u5757\u5C55\u793A\u4E0D\u652F\u6301\u65B9\u5757\u72B6\u6001 \u201Cfacing\u201D\u3002",Jse="\u84DD\u56FE\u5BFC\u51FA\u8DEF\u5F84\u4E0D\u5B58\u5728",Gse=`\u4E0D\u5B58\u5728\u6240\u6307\u5B9A\u7684\u5BFC\u51FA\u8DEF\u5F84 '{0}' \uFF01 \u8BF7\u5728\u786E\u4FDD\u8DEF\u5F84\u4E0B\u5B58\u5728\u6307\u5B9A\u7684\u6587\u4EF6\u5939\u540E\u518D\u6B21\u5C1D\u8BD5\u3002`,Wse={"animated_java.action.open_blueprint_settings.name":$ee,"animated_java.action.open_documentation.name":ete,"animated_java.action.open_about.name":tte,"animated_java.action.open_bone_config.name":nte,"animated_java.action.open_locator_config.name":ite,"animated_java.action.open_text_display_config.name":ate,"animated_java.action.export.name":rte,"animated_java.action.create_text_display.title":ote,"animated_java.action.create_vanilla_item_display.title":ste,"animated_java.action.create_vanilla_block_display.title":lte,"animated_java.action.open_vanilla_item_display_config.name":cte,"animated_java.action.open_vanilla_block_display_config.name":ute,"animated_java.popup.loading.loading":dte,"animated_java.popup.loading.success":pte,"animated_java.popup.loading.offline":mte,"animated_java.dialog.installed_popup.title":fte,"animated_java.dialog.installed_popup.close_button":hte,"animated_java.dialog.reset":gte,"animated_java.dialog.about.title":_te,"animated_java.dialog.about.close_button":xte,"animated_java.dialog.unexpected_error.title":vte,"animated_java.dialog.unexpected_error.close_button":bte,"animated_java.dialog.unexpected_error.copy_error_message_button.message":yte,"animated_java.dialog.unexpected_error.copy_error_message_button.description":wte,"animated_java.dialog.unexpected_error.paragraph":Ete,"animated_java.dialog.blueprint_settings.title":kte,"animated_java.dialog.blueprint_settings.advanced_settings_warning":jte,"animated_java.dialog.blueprint_settings.blueprint_name.title":Ate,"animated_java.dialog.blueprint_settings.blueprint_name.description":Tte,"animated_java.dialog.blueprint_settings.texture_size.title":Cte,"animated_java.dialog.blueprint_settings.texture_size.description":Ste,"animated_java.dialog.blueprint_settings.texture_size.warning.not_square":Ote,"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2":Ite,"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture":Dte,"animated_java.dialog.blueprint_settings.export_settings.title":Fte,"animated_java.dialog.blueprint_settings.export_namespace.title":Nte,"animated_java.dialog.blueprint_settings.export_namespace.description":Rte,"animated_java.dialog.blueprint_settings.export_namespace.error.empty":Mte,"animated_java.dialog.blueprint_settings.export_namespace.error.reserved":Bte,"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters":Pte,"animated_java.dialog.blueprint_settings.enable_plugin_mode.title":Lte,"animated_java.dialog.blueprint_settings.enable_plugin_mode.description":Vte,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title":zte,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description":Ute,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw":qte,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip":Hte,"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none":Jte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.title":Gte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.description":Wte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw":Kte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip":Yte,"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none":Xte,"animated_java.dialog.blueprint_settings.show_bounding_box.title":Zte,"animated_java.dialog.blueprint_settings.show_bounding_box.description":Qte,"animated_java.dialog.blueprint_settings.auto_bounding_box.title":$te,"animated_java.dialog.blueprint_settings.auto_bounding_box.description":ene,"animated_java.dialog.blueprint_settings.bounding_box.title":tne,"animated_java.dialog.blueprint_settings.bounding_box.description":nne,"animated_java.dialog.blueprint_settings.resource_pack_settings.title":ine,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title":ane,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description":rne,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title":one,"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.description":sne,"animated_java.dialog.blueprint_settings.display_item.title":lne,"animated_java.dialog.blueprint_settings.display_item.description":cne,"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected":une,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace":dne,"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace":pne,"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist":mne,"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated":fne,"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found":hne,"animated_java.dialog.blueprint_settings.custom_model_data_offset.title":gne,"animated_java.dialog.blueprint_settings.custom_model_data_offset.description":_ne,"animated_java.dialog.blueprint_settings.resource_pack.title":xne,"animated_java.dialog.blueprint_settings.resource_pack.description":vne,"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected":bne,"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist":yne,"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder":wne,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta":Ene,"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder":kne,"animated_java.dialog.blueprint_settings.resource_pack_zip.title":jne,"animated_java.dialog.blueprint_settings.resource_pack_zip.description":Ane,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected":Tne,"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file":Cne,"animated_java.dialog.blueprint_settings.display_item_path.title":Sne,"animated_java.dialog.blueprint_settings.display_item_path.description":One,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected":Ine,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist":Dne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file":Fne,"animated_java.dialog.blueprint_settings.model_folder.title":Nne,"animated_java.dialog.blueprint_settings.model_folder.description":Rne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected":Mne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist":Bne,"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder":Pne,"animated_java.dialog.blueprint_settings.texture_folder.title":Lne,"animated_java.dialog.blueprint_settings.texture_folder.description":Vne,"animated_java.dialog.blueprint_settings.data_pack_settings.title":zne,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title":Une,"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description":qne,"animated_java.dialog.blueprint_settings.data_pack.title":Hne,"animated_java.dialog.blueprint_settings.data_pack.description":Jne,"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected":Gne,"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist":Wne,"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder":Kne,"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta":Yne,"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder":Xne,"animated_java.dialog.blueprint_settings.data_pack_zip.title":Zne,"animated_java.dialog.blueprint_settings.data_pack_zip.description":Qne,"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected":$ne,"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file":eie,"animated_java.dialog.blueprint_settings.summon_commands.title":tie,"animated_java.dialog.blueprint_settings.summon_commands.description":nie,"animated_java.dialog.blueprint_settings.ticking_commands.title":iie,"animated_java.dialog.blueprint_settings.ticking_commands.description":aie,"animated_java.dialog.blueprint_settings.interpolation_duration.title":rie,"animated_java.dialog.blueprint_settings.interpolation_duration.description":oie,"animated_java.dialog.blueprint_settings.teleportation_duration.title":sie,"animated_java.dialog.blueprint_settings.teleportation_duration.description":lie,"animated_java.dialog.blueprint_settings.use_storage_for_animation.title":cie,"animated_java.dialog.blueprint_settings.use_storage_for_animation.description":uie,"animated_java.dialog.blueprint_settings.baked_animations.title":die,"animated_java.dialog.blueprint_settings.baked_animations.description":pie,"animated_java.dialog.blueprint_settings.json_file.title":mie,"animated_java.dialog.blueprint_settings.json_file.description":fie,"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected":hie,"animated_java.dialog.blueprint_settings.json_file.error.not_a_file":gie,"animated_java.dialog.bone_config.title":_ie,"animated_java.dialog.bone_config.selected_variant":xie,"animated_java.dialog.bone_config.default_variant_subtitle":vie,"animated_java.dialog.bone_config.selected_variant_subtitle":bie,"animated_java.dialog.bone_config.use_nbt.title":yie,"animated_java.dialog.bone_config.use_nbt.description":wie,"animated_java.dialog.bone_config.use_nbt.use_nbt_warning":Eie,"animated_java.dialog.bone_config.inherit_settings.title":kie,"animated_java.dialog.bone_config.inherit_settings.description":jie,"animated_java.dialog.bone_config.custom_name.title":Aie,"animated_java.dialog.bone_config.custom_name.description":Tie,"animated_java.dialog.bone_config.custom_name.invalid_json.error":Cie,"animated_java.dialog.bone_config.custom_name_visible.title":Sie,"animated_java.dialog.bone_config.custom_name_visible.description":Oie,"animated_java.dialog.bone_config.glowing.title":Iie,"animated_java.dialog.bone_config.glowing.description":Die,"animated_java.dialog.bone_config.override_glow_color.title":Fie,"animated_java.dialog.bone_config.override_glow_color.description":Nie,"animated_java.dialog.bone_config.glow_color.title":Rie,"animated_java.dialog.bone_config.glow_color.description":Mie,"animated_java.dialog.bone_config.shadow_radius.title":Bie,"animated_java.dialog.bone_config.shadow_radius.description":Pie,"animated_java.dialog.bone_config.shadow_strength.title":Lie,"animated_java.dialog.bone_config.shadow_strength.description":Vie,"animated_java.dialog.bone_config.override_brightness.title":zie,"animated_java.dialog.bone_config.override_brightness.description":Uie,"animated_java.dialog.bone_config.brightness_override.title":qie,"animated_java.dialog.bone_config.brightness_override.description":Hie,"animated_java.dialog.bone_config.use_custom_brightness.title":Jie,"animated_java.dialog.bone_config.use_custom_brightness.description":Gie,"animated_java.dialog.bone_config.custom_brightness.title":Wie,"animated_java.dialog.bone_config.custom_brightness.description":Kie,"animated_java.dialog.bone_config.enchanted.title":Yie,"animated_java.dialog.bone_config.enchanted.description":Xie,"animated_java.dialog.bone_config.invisible.title":Zie,"animated_java.dialog.bone_config.invisible.description":Qie,"animated_java.dialog.bone_config.nbt.title":$ie,"animated_java.dialog.bone_config.nbt.description":eae,"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound":tae,"animated_java.dialog.bone_config.nbt.invalid_nbt.error":nae,"animated_java.dialog.bone_config.billboard.title":iae,"animated_java.dialog.bone_config.billboard.description":aae,"animated_java.dialog.bone_config.billboard.options.fixed":rae,"animated_java.dialog.bone_config.billboard.options.vertical":oae,"animated_java.dialog.bone_config.billboard.options.horizontal":sae,"animated_java.dialog.bone_config.billboard.options.center":lae,"animated_java.dialog.locator_config.title":cae,"animated_java.dialog.locator_config.plugin_mode_warning":uae,"animated_java.dialog.locator_config.use_entity.title":dae,"animated_java.dialog.locator_config.use_entity.description":pae,"animated_java.dialog.locator_config.entity_type.title":mae,"animated_java.dialog.locator_config.entity_type.description":fae,"animated_java.dialog.locator_config.entity_type.error.empty":hae,"animated_java.dialog.locator_config.entity_type.warning.invalid":gae,"animated_java.dialog.locator_config.summon_commands.title":_ae,"animated_java.dialog.locator_config.summon_commands.description":xae,"animated_java.dialog.locator_config.ticking_commands.title":vae,"animated_java.dialog.locator_config.ticking_commands.description":bae,"animated_java.dialog.text_display_config.title":yae,"animated_java.dialog.bone_config.vanilla_item_model.title":wae,"animated_java.dialog.bone_config.vanilla_item_model.description":Eae,"animated_java.dialog.text_display_config.use_nbt.title":kae,"animated_java.dialog.text_display_config.use_nbt.description":jae,"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning":Aae,"animated_java.dialog.text_display_config.inherit_settings.title":Tae,"animated_java.dialog.text_display_config.inherit_settings.description":Cae,"animated_java.dialog.text_display_config.glowing.title":Sae,"animated_java.dialog.text_display_config.glowing.description":Oae,"animated_java.dialog.text_display_config.override_glow_color.title":Iae,"animated_java.dialog.text_display_config.override_glow_color.description":Dae,"animated_java.dialog.text_display_config.glow_color.title":Fae,"animated_java.dialog.text_display_config.glow_color.description":Nae,"animated_java.dialog.text_display_config.shadow_radius.title":Rae,"animated_java.dialog.text_display_config.shadow_radius.description":Mae,"animated_java.dialog.text_display_config.shadow_strength.title":Bae,"animated_java.dialog.text_display_config.shadow_strength.description":Pae,"animated_java.dialog.text_display_config.override_brightness.title":Lae,"animated_java.dialog.text_display_config.override_brightness.description":Vae,"animated_java.dialog.text_display_config.brightness_override.title":zae,"animated_java.dialog.text_display_config.brightness_override.description":Uae,"animated_java.dialog.text_display_config.use_custom_brightness.title":qae,"animated_java.dialog.text_display_config.use_custom_brightness.description":Hae,"animated_java.dialog.text_display_config.custom_brightness.title":Jae,"animated_java.dialog.text_display_config.custom_brightness.description":Gae,"animated_java.dialog.text_display_config.invisible.title":Wae,"animated_java.dialog.text_display_config.invisible.description":Kae,"animated_java.dialog.text_display_config.nbt.title":Yae,"animated_java.dialog.text_display_config.nbt.description":Xae,"animated_java.dialog.text_display_config.billboard.title":Zae,"animated_java.dialog.text_display_config.billboard.description":Qae,"animated_java.dialog.text_display_config.billboard.options.fixed":$ae,"animated_java.dialog.text_display_config.billboard.options.vertical":ere,"animated_java.dialog.text_display_config.billboard.options.horizontal":tre,"animated_java.dialog.text_display_config.billboard.options.center":nre,"animated_java.dialog.vanilla_block_display_config.title":ire,"animated_java.dialog.vanilla_block_display.custom_name.title":are,"animated_java.dialog.vanilla_block_display.custom_name.description":rre,"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error":ore,"animated_java.dialog.vanilla_block_display.custom_name_visible.title":sre,"animated_java.dialog.vanilla_block_display.custom_name_visible.description":lre,"animated_java.dialog.vanilla_item_display_config.title":cre,"animated_java.dialog.vanilla_item_display.custom_name.title":ure,"animated_java.dialog.vanilla_item_display.custom_name.description":dre,"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error":pre,"animated_java.dialog.vanilla_item_display.custom_name_visible.title":mre,"animated_java.dialog.vanilla_item_display.custom_name_visible.description":fre,"animated_java.dialog.variant_config.title":hre,"animated_java.dialog.variant_config.variant_display_name":gre,"animated_java.dialog.variant_config.variant_display_name.description":_re,"animated_java.dialog.variant_config.generate_name_from_display_name":xre,"animated_java.dialog.variant_config.generate_name_from_display_name.description":vre,"animated_java.dialog.variant_config.variant_name":bre,"animated_java.dialog.variant_config.variant_name.description":yre,"animated_java.dialog.variant_config.texture_map.title":wre,"animated_java.dialog.variant_config.texture_map.description":Ere,"animated_java.dialog.variant_config.texture_map.create_new_mapping":kre,"animated_java.dialog.variant_config.texture_map.no_mappings":jre,"animated_java.dialog.variant_config.bone_lists.description":Are,"animated_java.dialog.variant_config.excluded_nodes.title":Tre,"animated_java.dialog.variant_config.excluded_nodes.description":Cre,"animated_java.dialog.variant_config.included_nodes.title":Sre,"animated_java.dialog.variant_config.included_nodes.description":Ore,"animated_java.dialog.variant_config.swap_columns_button.tooltip":Ire,"animated_java.action.upgrade_old_aj_model_loader.name":Dre,"animated_java.dialog.upgrade_old_aj_model_loader.title":Fre,"animated_java.action.upgrade_old_aj_model_loader.select_file":Nre,"animated_java.action.upgrade_old_aj_model_loader.body":Rre,"animated_java.action.upgrade_old_aj_model_loader.button":Mre,"animated_java.dialog.animation_properties.title":Bre,"animated_java.dialog.animation_properties.animation_name.title":Pre,"animated_java.dialog.animation_properties.animation_name.description":Lre,"animated_java.dialog.animation_properties.loop_mode.title":Vre,"animated_java.dialog.animation_properties.loop_mode.description":zre,"animated_java.dialog.animation_properties.loop_mode.options.once":Ure,"animated_java.dialog.animation_properties.loop_mode.options.hold":qre,"animated_java.dialog.animation_properties.loop_mode.options.loop":Hre,"animated_java.dialog.animation_properties.animation_name.error.empty":Jre,"animated_java.dialog.animation_properties.animation_name.error.invalid_characters":Gre,"animated_java.dialog.animation_properties.loop_delay.title":Wre,"animated_java.dialog.animation_properties.loop_delay.description":Kre,"animated_java.dialog.animation_properties.bone_lists.description":Yre,"animated_java.dialog.animation_properties.excluded_nodes.title":Xre,"animated_java.dialog.animation_properties.excluded_nodes.description":Zre,"animated_java.dialog.animation_properties.included_nodes.title":Qre,"animated_java.dialog.animation_properties.included_nodes.description":$re,"animated_java.dialog.animation_properties.swap_columns_button.tooltip":eoe,"animated_java.dialog.export_progress.title":toe,"animated_java.dialog.blueprint_loading.title":noe,"animated_java.panel.variants.title":ioe,"animated_java.panel.variants.tool.create_new_variant":aoe,"animated_java.panel.variants.tool.edit_variant":roe,"animated_java.panel.variants.tool.duplicate_selected_variant":ooe,"animated_java.panel.variants.tool.delete_selected_variant":soe,"animated_java.panel.variants.tool.variant_visible":loe,"animated_java.panel.variants.tool.variant_not_visible":coe,"animated_java.panel.variants.tool.cannot_delete_default_variant":uoe,"animated_java.action.variants.create":doe,"animated_java.action.variants.duplicate":poe,"animated_java.action.variants.open_config":moe,"animated_java.action.variants.delete":foe,"animated_java.animation.excluded_nodes":hoe,"animated_java.animation.invert_excluded_nodes":goe,"animated_java.effect_animator.timeline.variant":_oe,"animated_java.effect_animator.timeline.commands":xoe,"animated_java.effect_animator.keyframes.variant":voe,"animated_java.effect_animator.keyframes.commands":boe,"animated_java.effect_animator.keyframes.execute_condition":yoe,"animated_java.panel.keyframe.keyframe_title":woe,"animated_java.panel.keyframe.variant.title":Eoe,"animated_java.panel.keyframe.variant.description":koe,"animated_java.panel.keyframe.commands.title":joe,"animated_java.panel.keyframe.commands.description":Aoe,"animated_java.panel.keyframe.execute_condition.title":Toe,"animated_java.panel.keyframe.execute_condition.description":Coe,"animated_java.panel.keyframe.repeat.title":Soe,"animated_java.panel.keyframe.repeat.description":Ooe,"animated_java.panel.keyframe.repeat_frequency.title":Ioe,"animated_java.panel.keyframe.repeat_frequency.description":Doe,"animated_java.panel.keyframe.easing_type.title":Foe,"animated_java.panel.keyframe.easing_type.description":Noe,"animated_java.panel.keyframe.easing_type.options.linear":Roe,"animated_java.panel.keyframe.easing_type.options.sine":Moe,"animated_java.panel.keyframe.easing_type.options.quad":Boe,"animated_java.panel.keyframe.easing_type.options.cubic":Poe,"animated_java.panel.keyframe.easing_type.options.quart":Loe,"animated_java.panel.keyframe.easing_type.options.quint":Voe,"animated_java.panel.keyframe.easing_type.options.expo":zoe,"animated_java.panel.keyframe.easing_type.options.circ":Uoe,"animated_java.panel.keyframe.easing_type.options.elastic":qoe,"animated_java.panel.keyframe.easing_type.options.back":Hoe,"animated_java.panel.keyframe.easing_type.options.bounce":Joe,"animated_java.panel.keyframe.easing_mode.title":Goe,"animated_java.panel.keyframe.easing_mode.description":Woe,"animated_java.panel.keyframe.easing_mode.options.in":Koe,"animated_java.panel.keyframe.easing_mode.options.out":Yoe,"animated_java.panel.keyframe.easing_mode.options.inout":Xoe,"animated_java.panel.keyframe.easing_args.title":Zoe,"animated_java.panel.keyframe.easing_args.description":Qoe,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title":$oe,"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description":ese,"animated_java.panel.keyframe.easing_args.easing_arg.back.title":tse,"animated_java.panel.keyframe.easing_args.easing_arg.back.description":nse,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title":ise,"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description":ase,"animated_java.panel.keyframe.nonlinear_interpolation":rse,"animated_java.panel.text_display.title":ose,"animated_java.tool.text_display.line_width.title":sse,"animated_java.tool.text_display.line_width.description":lse,"animated_java.tool.text_display.background_color.title":cse,"animated_java.tool.text_display.background_color.description":use,"animated_java.tool.text_display.text_shadow.title":dse,"animated_java.tool.text_display.text_shadow.description":pse,"animated_java.tool.text_display.text_alignment.title":mse,"animated_java.tool.text_display.text_alignment.description":fse,"animated_java.tool.text_display.text_alignment.options.left":hse,"animated_java.tool.text_display.text_alignment.options.center":gse,"animated_java.tool.text_display.text_alignment.options.right":_se,"animated_java.tool.text_display.see_through.title":xse,"animated_java.tool.text_display.see_through.description":vse,"animated_java.panel.vanilla_item_display.title":bse,"animated_java.panel.vanilla_item_display.description":yse,"animated_java.tool.item_display.item_display.title":wse,"animated_java.tool.item_display.item_display.description":Ese,"animated_java.tool.item_display.item_display.options.none":kse,"animated_java.tool.item_display.item_display.options.thirdperson_lefthand":jse,"animated_java.tool.item_display.item_display.options.thirdperson_righthand":Ase,"animated_java.tool.item_display.item_display.options.firstperson_lefthand":Tse,"animated_java.tool.item_display.item_display.options.firstperson_righthand":Cse,"animated_java.tool.item_display.item_display.options.head":Sse,"animated_java.tool.item_display.item_display.options.gui":Ose,"animated_java.tool.item_display.item_display.options.ground":Ise,"animated_java.tool.item_display.item_display.options.fixed":Dse,"animated_java.panel.vanilla_block_display.title":Fse,"animated_java.panel.vanilla_block_display.description":Nse,"animated_java.vanilla_item_display.title":Rse,"animated_java.misc.failed_to_export.title":Mse,"animated_java.misc.failed_to_export.custom_models.message":Bse,"animated_java.misc.failed_to_export.blueprint_settings.message":Pse,"animated_java.misc.failed_to_export.blueprint_settings.error_item":Lse,"animated_java.misc.failed_to_export.button":Vse,"animated_java.format_category.animated_java":zse,"animated_java.block_model_manager.fluid_warning":Use,"animated_java.block_model_manager.mob_head_warning":qse,"animated_java.block_model_manager.facing_warning":Hse,"animated_java.error.blueprint_export_path_doesnt_exist.title":Jse,"animated_java.error.blueprint_export_path_doesnt_exist.description":Gse};var Kse=[Eg,kg,jg,Ag,Tg],Cy=Kse,Sy=["../lang/de.yml","../lang/en.yml","../lang/nl.yml","../lang/ru.yml","../lang/zh_cn.yml"];var Oy=Sy.map(t=>PathModule.basename(t,".yml"));function A(t,...e){let n=Oy.indexOf(settings.language.value);n===-1&&(console.warn(`Could not find language '${settings.language.value}'`),n=Oy.indexOf("en"));let i=Cy[n];t.startsWith("animated_java.")||(t=`animated_java.${t}`);let a=i[t];return a?a.replace(/\{(\d+)\}/g,(r,o)=>e[o]||""):(console.warn(`Could not find translation for '${t}'`),t)}s(A,"translate");var vp=class extends Error{constructor(e,n){super(`'${e}' failed to install: ${n.message}`+(n.stack?` `+n.stack:""))}};s(vp,"ModInstallError");var bp=class extends Error{constructor(e,n){super(`'${e}' failed to uninstall: ${n.message}`+(n.stack?` `+n.stack:""))}};s(bp,"ModUninstallError");var ws=new Map,$r=[];K.PLUGIN_LOAD.subscribe(async()=>{console.groupCollapsed("Installing Mods...");try{for(let t of $r){let e=ws.get(t);e.isInstalled()||await e.install()}}catch(t){throw console.groupEnd(),t}for(let t of Object.values(Plugins.registered))t.id!==Ke.name&&K.EXTERNAL_PLUGIN_LOAD.publish(t);console.groupEnd(),K.PLUGIN_FINISHED_LOADING.publish()});K.PLUGIN_UNLOAD.subscribe(async()=>{console.groupCollapsed("Uninstalling Mods...");try{for(let t of[...$r].reverse()){let e=ws.get(t);e.isInstalled()&&await e.uninstall()}}catch(t){throw console.groupEnd(),t}for(let t of Object.values(Plugins.registered))t.id!==Ke.name&&K.EXTERNAL_PLUGIN_UNLOAD.publish(t);console.groupEnd(),K.PLUGIN_FINISHED_UNLOADING.publish()});function Yse(){$r.sort((t,e)=>{let n=ws.get(t);return ws.get(e).priority-n.priority});for(let t of $r){let e=ws.get(t);if(e.dependencies!==void 0)for(let n of e.dependencies){let i=$r.indexOf(n);if(i===-1)throw new Error(`Mod '${t}' depends on unknown mod '${n}'`);let a=$r.indexOf(t);i>a&&($r.splice(i,1),$r.splice(a,0,n))}}}s(Yse,"updateModInstallOrder");function St(t){let e,n=!1;if(ws.has(t.id))throw new Error(`A Mod with the ID '${t.id}' is already registered!`);let i={id:t.id,dependencies:t.dependencies,priority:t.priority??0,isInstalled(){return n},async install(){console.log(`Installing '${t.id}'`);try{if(n)throw new Error(`Attempted to install '${t.id}' while it was already installed.`);e=await t.apply(),n=!0}catch(a){throw new vp(t.id,a)}},async uninstall(){console.log(`Uninstalling '${t.id}'`);try{if(!n)throw new Error(`Attempted to uninstall '${t.id}' before it was installed.`);await t.revert(e),n=!1}catch(a){throw new bp(t.id,a)}}};return ws.set(t.id,i),$r.push(t.id),Yse(),i}s(St,"registerMod");function da(t){let e=null;return St({...t,apply:()=>[K.PRE_SELECT_PROJECT.subscribe(n=>{e===null&&t.condition(n)&&(console.log(`Applying project mod '${t.id}'`),e=t.apply())}),K.UNSELECT_PROJECT.subscribe(()=>{e!==null&&(console.log(`Reverting project mod '${t.id}'`),t.revert(e),e=null)})],revert:n=>{n.forEach(i=>i())}})}s(da,"registerProjectMod");function Dy(t){let e;return St({...t,apply:()=>[K.EXTERNAL_PLUGIN_LOAD.subscribe(n=>{Condition(t.condition,n)&&(console.log(`Applying plugin mod '${t.id}'`),e=t.apply())}),K.EXTERNAL_PLUGIN_UNLOAD.subscribe(()=>{e!==void 0&&(console.log(`Reverting plugin mod '${t.id}'`),t.revert(e),e=void 0)})],revert:n=>{n.forEach(i=>i())}})}s(Dy,"registerPluginMod");function yl(t,e){return s(function({id:i,priority:a,dependencies:r},...o){let l,c=kt(),d=kt(),u={get:()=>l,onCreated:c.subscribe,onDeleted:d.subscribe};return St({id:i,priority:a,dependencies:r,apply:()=>(l=t(i,...o),c.publish(l),l),revert:p=>{e(p),l=null,d.publish(p)}}),u},"handler")}s(yl,"registerDeletableFactory");var nn=yl((t,e)=>new Action(t,e),t=>t.delete()),Fy=yl((t,e)=>new ModelFormat({...e,id:t}),t=>t.delete()),Ny=yl((t,e)=>new Codec(t,{...e}),t=>t.delete()),Ry=yl((t,e,n)=>new BarMenu(t,e,n),t=>{t.node.remove(),t.label.remove(),delete MenuBar.menus[t.id]}),My=yl((t,e)=>new ModelLoader(t,e),t=>t.delete()),By=yl((t,e,n)=>new Menu(t,e,n),t=>{t.node.remove()});function iu(t){St({...t,apply:()=>{if(t.object==null)throw new Error("Cannot override property on undefined object.");let e={value:void 0,descriptor:void 0};if(e.value=t.object[t.key],e.descriptor=Object.getOwnPropertyDescriptor(t.object,t.key)??{value:e.value,writable:!0,configurable:!0},e.descriptor.configurable===!1)throw new Error(`Cannot override property '${String(t.key)}' on object because it is not configurable.`);return Object.defineProperty(t.object,t.key,{configurable:!0,get(){return t.get.call(this,e.value)},set(n){e.value=n}}),{original:e}},revert:({original:e})=>{Object.defineProperty(t.object,t.key,e.descriptor)}})}s(iu,"registerPropertyOverrideMod");function Nt(t){St({...t,apply:()=>{if(t.object==null)throw new Error("Cannot override property on undefined object.");let e={value:void 0,descriptor:void 0};if(e.value=t.object[t.key],e.descriptor=Object.getOwnPropertyDescriptor(t.object,t.key)??{value:e.value,writable:!0,configurable:!0},e.descriptor.configurable===!1)throw new Error(`Cannot override property '${String(t.key)}' on object because it is not configurable.`);return Object.defineProperty(t.object,t.key,{configurable:!0,enumerable:e.descriptor.enumerable,get:function(){return Condition(t.condition,this)?t.get.call(this,e.value):e.value},set:t.set?function(n){Condition(t.condition,this)?t.set.call(this,n):e.value=n}:n=>{e.value=n}}),{original:e}},revert:({original:e})=>{Object.defineProperty(t.object,t.key,e.descriptor)}})}s(Nt,"registerConditionalPropertyOverrideMod");var Iy=new Map;function Py(t,e){let n=Iy.get(t),i={value:t[e]};if(n===void 0){let a=kt(),r=kt();n=[a,r],Iy.set(t,n),Object.defineProperty(t,e,{get(){return a.publish({storage:i,value:i.value}),i.value},set(o){i.value=o,r.publish({storage:i,newValue:o})},configurable:!0}),K.PLUGIN_UNLOAD.subscribe(()=>{let o=t[e];delete t[e],Object.defineProperty(t,e,{value:o,configurable:!0})},!0)}return n}s(Py,"createPropertySubscribable");var Cg=class extends Property{constructor(e,n,i){super(e,"object",n,i)}copy(e,n){e[this.name]==null?n[this.name]=e[this.name]:n[this.name]=JSON.parse(JSON.stringify(e[this.name]))}merge(e,n){n[this.name]==null?e[this.name]=this.default:e[this.name]=JSON.parse(JSON.stringify(n[this.name]))}};s(Cg,"ObjectProperty");var wl=class extends Error{constructor(){super("Polling was cancelled"),this.name="PollingCancelledError"}};s(wl,"PollingCancelledError");function El(t,e,n=1e3*60,i){let a=performance.now(),r=i!==void 0?o=>setTimeout(o,i):requestAnimationFrame;return new Promise((o,l)=>{let c=s(()=>{if(e())return l(new wl);let d=t();if(d!=null)return o(d);if(performance.now()-a>n)return l(new Error("Polling timed out"));r(c)},"poll");r(c)})}s(El,"pollUntilResult");function Gn(t){let e;if(typeof t.target=="string"?e=document.querySelector(t.target):typeof t.target=="function"?e=t.target():e=t.target,!e)throw new Error("Target element not found");let n;if(t.replaceChildren)e.replaceChildren();else{if(t.hideTargetChildren)for(let a of Array.from(e.children))a instanceof HTMLElement&&(a.style.display="none");t.prepend?n=e.children[0]:t.injectIndex!==void 0&&(n=e.children[t.injectIndex])}let i=new t.component({target:e,anchor:n,props:t.props});return t.onMount?.(i,e),i.$on("destroy",()=>{t.onDestroy?.(i)}),i}s(Gn,"mountSvelteComponent");function yp(t){let e=typeof t.target=="string"?document.querySelector.bind(document,t.target):t.target,n,i=s(()=>{n!=null&&(t.onDestroy?.(n),n?.$destroy(),n=void 0)},"destroy"),a=St({...t,apply:()=>{i(),El(()=>e(),()=>!a.isInstalled()||!!t.cancelCondition?.()).catch(r=>{if(r instanceof wl){console.error("Mounting Svelte component cancelled for mod",t.id);return}else console.error("Error mounting Svelte component for mod",t.id,r)}).then(r=>{r&&(n=Gn({...t,target:r}))})},revert:i});return a}s(yp,"registerMountSvelteComponentMod");function ie(){}s(ie,"noop");var ou=s(t=>t,"identity");function zy(t,e){for(let n in e)t[n]=e[n];return t}s(zy,"assign");function Xse(t){return!!t&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"}s(Xse,"is_promise");function Fg(t){return t()}s(Fg,"run");function Ly(){return Object.create(null)}s(Ly,"blank_object");function Rt(t){t.forEach(Fg)}s(Rt,"run_all");function qn(t){return typeof t=="function"}s(qn,"is_function");function De(t,e){return t!=t?e==e:t!==e||t&&typeof t=="object"||typeof t=="function"}s(De,"safe_not_equal");var wp;function Ht(t,e){return wp||(wp=document.createElement("a")),wp.href=e,t===wp.href}s(Ht,"src_url_equal");function Uy(t){return Object.keys(t).length===0}s(Uy,"is_empty");function rt(t,...e){if(t==null)return ie;let n=t.subscribe(...e);return n.unsubscribe?()=>n.unsubscribe():n}s(rt,"subscribe");function Ng(t){let e;return rt(t,n=>e=n)(),e}s(Ng,"get_store_value");function Pa(t,e,n){t.$$.on_destroy.push(rt(e,n))}s(Pa,"component_subscribe");function qy(t,e,n,i){if(t){let a=Hy(t,e,n,i);return t[0](a)}}s(qy,"create_slot");function Hy(t,e,n,i){return t[1]&&i?zy(n.ctx.slice(),t[1](i(e))):n.ctx}s(Hy,"get_slot_context");function Jy(t,e,n,i){if(t[2]&&i){let a=t[2](i(n));if(e.dirty===void 0)return a;if(typeof a=="object"){let r=[],o=Math.max(e.dirty.length,a.length);for(let l=0;l32){let e=[],n=t.ctx.length/32;for(let i=0;iwindow.performance.now():()=>Date.now(),Rg=Ky?t=>requestAnimationFrame(t):ie;var Al=new Set;function Xy(t){Al.forEach(e=>{e.c(t)||(Al.delete(e),e.f())}),Al.size!==0&&Rg(Xy)}s(Xy,"run_tasks");function Zy(t){let e;return Al.size===0&&Rg(Xy),{promise:new Promise(n=>{Al.add(e={c:t,f:n})}),abort(){Al.delete(e)}}}s(Zy,"loop");var Qy=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global,Tl=class{constructor(e){this.options=e,this._listeners="WeakMap"in Qy?new WeakMap:void 0}observe(e,n){return this._listeners.set(e,n),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(n=>{var i;for(let a of n)Tl.entries.set(a.target,a),(i=this._listeners.get(a.target))===null||i===void 0||i(a)})}};s(Tl,"ResizeObserverSingleton");Tl.entries="WeakMap"in Qy?new WeakMap:void 0;var $y=!1;function Zse(){$y=!0}s(Zse,"start_hydrating");function Qse(){$y=!1}s(Qse,"end_hydrating");function I(t,e){t.appendChild(e)}s(I,"append");function e1(t){if(!t)return document;let e=t.getRootNode?t.getRootNode():t.ownerDocument;return e&&e.host?e:t.ownerDocument}s(e1,"get_root_for_style");function $se(t){let e=L("style");return ele(e1(t),e),e.sheet}s($se,"append_empty_stylesheet");function ele(t,e){return I(t.head||t,e),e.sheet}s(ele,"append_stylesheet");function U(t,e,n){t.insertBefore(e,n||null)}s(U,"insert");function z(t){t.parentNode&&t.parentNode.removeChild(t)}s(z,"detach");function Wn(t,e){for(let n=0;nt.removeEventListener(e,n,i)}s(Ue,"listen");function t1(t){return function(e){return e.stopPropagation(),t.call(this,e)}}s(t1,"stop_propagation");function E(t,e,n){n==null?t.removeAttribute(e):t.getAttribute(e)!==n&&t.setAttribute(e,n)}s(E,"attr");function Sl(t){return t===""?null:+t}s(Sl,"to_number");function nle(t){return Array.from(t.childNodes)}s(nle,"children");function ct(t,e){e=""+e,t.data!==e&&(t.data=e)}s(ct,"set_data");function Bt(t,e){t.value=e??""}s(Bt,"set_input_value");function Xe(t,e,n,i){n==null?t.style.removeProperty(e):t.style.setProperty(e,n,i?"important":"")}s(Xe,"set_style");function n1(t,e,{bubbles:n=!1,cancelable:i=!1}={}){let a=document.createEvent("CustomEvent");return a.initCustomEvent(t,n,i,e),a}s(n1,"custom_event");var Yi=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,n,i=null){this.e||(this.is_svg?this.e=tle(n.nodeName):this.e=L(n.nodeType===11?"TEMPLATE":n.nodeName),this.t=n.tagName!=="TEMPLATE"?n:n.content,this.c(e)),this.i(i)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let n=0;n>>0}s(ile,"hash");function ale(t,e){let n={stylesheet:$se(e),rules:{}};return kp.set(t,n),n}s(ale,"create_style_information");function i1(t,e,n,i,a,r,o,l=0){let c=16.666/i,d=`{ `;for(let _=0;_<=1;_+=c){let h=e+(n-e)*r(_);d+=_*100+`%{${o(h,1-h)}} `}let u=d+`100% {${o(n,1-n)}} }`,p=`__svelte_${ile(u)}_${l}`,m=e1(t),{stylesheet:f,rules:g}=kp.get(m)||ale(m,t);g[p]||(g[p]=!0,f.insertRule(`@keyframes ${p} ${u}`,f.cssRules.length));let x=t.style.animation||"";return t.style.animation=`${x?`${x}, `:""}${p} ${i}ms linear ${a}ms 1 both`,jp+=1,p}s(i1,"create_rule");function Og(t,e){let n=(t.style.animation||"").split(", "),i=n.filter(e?r=>r.indexOf(e)<0:r=>r.indexOf("__svelte")===-1),a=n.length-i.length;a&&(t.style.animation=i.join(", "),jp-=a,jp||rle())}s(Og,"delete_rule");function rle(){Rg(()=>{jp||(kp.forEach(t=>{let{ownerNode:e}=t.stylesheet;e&&z(e)}),kp.clear())})}s(rle,"clear_rules");function su(t,e,n,i){if(!e)return ie;let a=t.getBoundingClientRect();if(e.left===a.left&&e.right===a.right&&e.top===a.top&&e.bottom===a.bottom)return ie;let{delay:r=0,duration:o=300,easing:l=ou,start:c=Yy()+r,end:d=c+o,tick:u=ie,css:p}=n(t,{from:e,to:a},i),m=!0,f=!1,g;function x(){p&&(g=i1(t,0,1,o,r,l,p)),r||(f=!0)}s(x,"start");function _(){p&&Og(t,g),m=!1}return s(_,"stop"),Zy(h=>{if(!f&&h>=c&&(f=!0),f&&h>=d&&(u(1,0),_()),!m)return!1;if(f){let v=h-c,b=0+1*l(v/o);u(b,1-b)}return!0}),x(),u(0,1),_}s(su,"create_animation");function lu(t){let e=getComputedStyle(t);if(e.position!=="absolute"&&e.position!=="fixed"){let{width:n,height:i}=e,a=t.getBoundingClientRect();t.style.position="absolute",t.style.width=n,t.style.height=i,ole(t,a)}}s(lu,"fix_position");function ole(t,e){let n=t.getBoundingClientRect();if(e.left!==n.left||e.top!==n.top){let i=getComputedStyle(t),a=i.transform==="none"?"":i.transform;t.style.transform=`${a} translate(${e.left-n.left}px, ${e.top-n.top}px)`}}s(ole,"add_transform");var ru;function eo(t){ru=t}s(eo,"set_current_component");function Mg(){if(!ru)throw new Error("Function called outside component initialization");return ru}s(Mg,"get_current_component");function Zi(t){Mg().$$.on_destroy.push(t)}s(Zi,"onDestroy");function Bg(){let t=Mg();return(e,n,{cancelable:i=!1}={})=>{let a=t.$$.callbacks[e];if(a){let r=n1(e,n,{cancelable:i});return a.slice().forEach(o=>{o.call(t,r)}),!r.defaultPrevented}return!0}}s(Bg,"createEventDispatcher");var jl=[];var Te=[],Cl=[],Ig=[],sle=Promise.resolve(),Dg=!1;function lle(){Dg||(Dg=!0,sle.then(Pg))}s(lle,"schedule_update");function to(t){Cl.push(t)}s(to,"add_render_callback");function Me(t){Ig.push(t)}s(Me,"add_flush_callback");var Sg=new Set,kl=0;function Pg(){if(kl!==0)return;let t=ru;do{try{for(;klt.indexOf(i)===-1?e.push(i):n.push(i)),n.forEach(i=>i()),Cl=e}s(ule,"flush_render_callbacks");var au;function dle(){return au||(au=Promise.resolve(),au.then(()=>{au=null})),au}s(dle,"wait");function Vy(t,e,n){t.dispatchEvent(n1(`${e?"intro":"outro"}${n}`))}s(Vy,"dispatch");var Ep=new Set,Es;function Sn(){Es={r:0,c:[],p:Es}}s(Sn,"group_outros");function On(){Es.r||Rt(Es.c),Es=Es.p}s(On,"check_outros");function ae(t,e){t&&t.i&&(Ep.delete(t),t.i(e))}s(ae,"transition_in");function de(t,e,n,i){if(t&&t.o){if(Ep.has(t))return;Ep.add(t),Es.c.push(()=>{Ep.delete(t),i&&(n&&t.d(1),i())}),t.o(e)}else i&&i()}s(de,"transition_out");var ple={duration:0};function cu(t,e,n){let i={direction:"in"},a=e(t,n,i),r=!1,o,l,c=0;function d(){o&&Og(t,o)}s(d,"cleanup");function u(){let{delay:m=0,duration:f=300,easing:g=ou,tick:x=ie,css:_}=a||ple;_&&(o=i1(t,0,1,f,m,g,_,c++)),x(0,1);let h=Yy()+m,v=h+f;l&&l.abort(),r=!0,to(()=>Vy(t,!0,"start")),l=Zy(b=>{if(r){if(b>=v)return x(1,0),Vy(t,!0,"end"),d(),r=!1;if(b>=h){let y=g((b-h)/f);x(y,1-y)}}return r})}s(u,"go");let p=!1;return{start(){p||(p=!0,Og(t),qn(a)?(a=a(i),dle().then(u)):u())},invalidate(){p=!1},end(){r&&(d(),r=!1)}}}s(cu,"create_in_transition");function a1(t,e){let n=e.token={};function i(a,r,o,l){if(e.token!==n)return;e.resolved=l;let c=e.ctx;o!==void 0&&(c=c.slice(),c[o]=l);let d=a&&(e.current=a)(c),u=!1;e.block&&(e.blocks?e.blocks.forEach((p,m)=>{m!==r&&p&&(Sn(),de(p,1,1,()=>{e.blocks[m]===p&&(e.blocks[m]=null)}),On())}):e.block.d(1),d.c(),ae(d,1),d.m(e.mount(),e.anchor),u=!0),e.block=d,e.blocks&&(e.blocks[r]=d),u&&Pg()}if(s(i,"update"),Xse(t)){let a=Mg();if(t.then(r=>{eo(a),i(e.then,1,e.value,r),eo(null)},r=>{if(eo(a),i(e.catch,2,e.error,r),eo(null),!e.hasCatch)throw r}),e.current!==e.pending)return i(e.pending,0),!0}else{if(e.current!==e.then)return i(e.then,1,e.value,t),!0;e.resolved=t}}s(a1,"handle_promise");function r1(t,e,n){let i=e.slice(),{resolved:a}=t;t.current===t.then&&(i[t.value]=a),t.current===t.catch&&(i[t.error]=a),t.block.p(i,n)}s(r1,"update_await_block_branch");function mle(t,e){t.d(1),e.delete(t.key)}s(mle,"destroy_block");function uu(t,e){t.f(),mle(t,e)}s(uu,"fix_and_destroy_block");function du(t,e,n,i,a,r,o,l,c,d,u,p){let m=t.length,f=r.length,g=m,x={};for(;g--;)x[t[g].key]=g;let _=[],h=new Map,v=new Map,b=[];for(g=f;g--;){let F=p(a,r,g),N=n(F),k=o.get(N);k?i&&b.push(()=>k.p(F,e)):(k=d(N,F),k.c()),h.set(N,_[g]=k),N in x&&v.set(N,Math.abs(g-x[N]))}let y=new Set,w=new Set;function S(F){ae(F,1),F.m(l,u),o.set(F.key,F),u=F.first,f--}for(s(S,"insert");m&&f;){let F=_[f-1],N=t[m-1],k=F.key,R=N.key;F===N?(u=F.first,m--,f--):h.has(R)?!o.has(k)||y.has(k)?S(F):w.has(R)?m--:v.get(k)>v.get(R)?(w.add(k),S(F)):(y.add(R),m--):(c(N,o),m--)}for(;m--;){let F=t[m];h.has(F.key)||c(F,o)}for(;f;)S(_[f-1]);return Rt(b),_}s(du,"update_keyed_each");var fle=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],S2e=new Set([...fle]);function Be(t,e,n){let i=t.$$.props[e];i!==void 0&&(t.$$.bound[i]=n,n(t.$$.ctx[i]))}s(Be,"bind");function Ce(t){t&&t.c()}s(Ce,"create_component");function Ae(t,e,n,i){let{fragment:a,after_update:r}=t.$$;a&&a.m(e,n),i||to(()=>{let o=t.$$.on_mount.map(Fg).filter(qn);t.$$.on_destroy?t.$$.on_destroy.push(...o):Rt(o),t.$$.on_mount=[]}),r.forEach(to)}s(Ae,"mount_component");function je(t,e){let n=t.$$;n.fragment!==null&&(ule(n.after_update),Rt(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}s(je,"destroy_component");function hle(t,e){t.$$.dirty[0]===-1&&(jl.push(t),lle(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{let g=f.length?f[0]:m;return d.ctx&&a(d.ctx[p],d.ctx[p]=g)&&(!d.skip_bound&&d.bound[p]&&d.bound[p](g),u&&hle(t,p)),m}):[],d.update(),u=!0,Rt(d.before_update),d.fragment=i?i(d.ctx):!1,e.target){if(e.hydrate){Zse();let p=nle(e.target);d.fragment&&d.fragment.l(p),p.forEach(z)}else d.fragment&&d.fragment.c();e.intro&&ae(t.$$.fragment),Ae(t,e.target,e.anchor,e.customElement),Qse(),Pg()}eo(c)}s(Ve,"init");var gle;typeof HTMLElement=="function"&&(gle=s(class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:t}=this.$$;this.$$.on_disconnect=t.map(Fg).filter(qn);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(t,e,n){this[t]=n}disconnectedCallback(){Rt(this.$$.on_disconnect)}$destroy(){je(this,1),this.$destroy=ie}$on(t,e){if(!qn(e))return ie;let n=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return n.push(e),()=>{let i=n.indexOf(e);i!==-1&&n.splice(i,1)}}$set(t){this.$$set&&!Uy(t)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}},"SvelteElement"));var Pe=class{$destroy(){je(this,1),this.$destroy=ie}$on(e,n){if(!qn(n))return ie;let i=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return i.push(n),()=>{let a=i.indexOf(n);a!==-1&&i.splice(a,1)}}$set(e){this.$$set&&!Uy(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};s(Pe,"SvelteComponent");function _le(t){let e,n,i,a,r,o=xle()+"",l,c,d,u,p=A("dialog.unexpected_error.paragraph",'Discord','Github')+"",m,f,g,x,_,h,v,b;return{c(){e=L("div"),n=L("div"),i=L("i"),a=J(),r=L("h2"),l=J(),c=L("i"),d=J(),u=L("p"),m=J(),f=L("div"),g=L("textarea"),x=J(),_=L("i"),E(i,"class","fas fa-quote-left dialog_form_warning text_icon svelte-hszt7f"),Xe(r,"font-size","24px"),Xe(r,"text-align","center"),E(c,"class","fas fa-quote-right dialog_form_warning text_icon svelte-hszt7f"),E(n,"class","quote svelte-hszt7f"),g.readOnly=!0,E(g,"class","svelte-hszt7f"),E(_,"class","fas fa-copy dialog_form_warning text_icon svelte-hszt7f"),E(_,"title",h=A("dialog.unexpected_error.copy_error_message_button.description")),E(f,"class","codebox dark_bordered svelte-hszt7f"),E(e,"class","container svelte-hszt7f")},m(y,w){U(y,e,w),I(e,n),I(n,i),I(n,a),I(n,r),r.innerHTML=o,I(n,l),I(n,c),I(e,d),I(e,u),u.innerHTML=p,I(e,m),I(e,f),I(f,g),Bt(g,t[0]),I(f,x),I(f,_),v||(b=[Ue(g,"input",t[3]),Ue(_,"click",t[1])],v=!0)},p(y,[w]){w&1&&Bt(g,y[0])},i:ie,o:ie,d(y){y&&z(e),v=!1,Rt(b)}}}s(_le,"create_fragment");var o1=["Uh oh!","Time to fire up the ol' debugger!","Your item displays are sad \u{1F97A}",'Ok, who pushed the big red button?',"Skill Issue.","You have how many elements!?","I'll export successfully some day!","When I grow up, I wanna be just like Blender!","Should'a seen that one comming...","It's all Jannis' fault! :(","Snaviewavie did an oopsie poopsie x3","We to a little trolling","execute run execute run execute run execute run say This is fine.","This is why we can't have nice things. :(","Have you tried turning it off and on again?","What if I put my command block next to yours? Haha just kidding... Unless?","If at first you don't succeed, Try, try again!","B:01010111 01100101 00100000 01100100 01101111 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110100 01110010 01101111 01101100 01101100 01101001 01101110 01100111",`

SnaveSutit would like to know your location

`,"I've decided to stop working for today. Try again tomorrow!","Every time you see this error message, a developer vanishes in a puff of binary.",`"Flavor Text"? I've never tasted text before...`,"( \u0361\xB0 \u035C\u0296 \u0361\xB0)","That's a nice model you have there, it'd be a shame if something were to happen to it...","Some day you'll learn. But until then, I control the cheese","Please deposit 5 coins!",'Click here to find a solution!','roflcopter',"Failed to find global 'pandemic'"];function xle(){return o1[Math.floor(Math.random()*o1.length)]}s(xle,"pickRandomFlavorQuote");function vle(t,e,n){let{error:i}=e,a=i.message+` `+(i.stack??"");function r(){navigator.clipboard.writeText(a).then(()=>{Blockbench.showQuickMessage(A("dialog.unexpected_error.copy_error_message_button.message"))})}s(r,"copyError");function o(){a=this.value,n(0,a)}return s(o,"textarea_input_handler"),t.$$set=l=>{"error"in l&&n(2,i=l.error)},[a,r,i,o]}s(vle,"instance");var Ap=class extends Pe{constructor(e){super(),Ve(this,e,vle,_le,De,{error:2})}};s(Ap,"UnexpectedErrorDialog");var s1=Ap;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".container.svelte-hszt7f{height:25rem;display:flex;flex-direction:column}.codebox.svelte-hszt7f{height:25rem;display:flex;margin-top:16px}.quote.svelte-hszt7f{display:flex;justify-content:center;align-items:center;margin-bottom:1rem}textarea.svelte-hszt7f{width:100%;height:100%;border:unset}i.svelte-hszt7f{cursor:pointer;padding:5px;max-height:2rem}i.svelte-hszt7f:hover{color:var(--color-light)}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Lg=[];function Vg(t,e){for(let[n,i]of Object.entries(e))t.style[n]=i??""}s(Vg,"applyStyleObject");var cn=class extends Dialog{wrapperElement=null;contentElement=null;contentComponent=null;extraComponent=null;constructor(e){let n=document.createComment("svelte-dialog-"+guid()),i={...e};delete i.component,super(e.id,{...i,lines:[n]}),this.onOpen=()=>{if(!this.contentComponent){if(this.contentElement=n.parentElement,!this.contentElement){console.error("Failed to find dialog content element");return}if(this.wrapperElement=this.contentElement.parentElement,!this.wrapperElement){console.error("Failed to find dialog wrapper element");return}e.contentStyle&&Vg(this.contentElement,e.contentStyle),e.wrapperStyle&&Vg(this.wrapperElement,e.wrapperStyle),e.dialogStyle&&Vg(this.object,e.dialogStyle),this.contentComponent=new e.content.component({target:this.contentElement,props:e.content.props}),e.extra&&(this.extraComponent=new e.extra.component({target:this.object,props:e.extra.props})),e.onOpen&&e.onOpen(),e.stackable||(Lg.forEach(a=>a.cancel()),Lg.empty()),Lg.push(this),requestAnimationFrame(()=>{let r=$(this.object).height(),o=Math.max(window.innerHeight-r,0),l=o*.25;this.object.style.top=Math.clamp(o/2-l,26,2e3)+"px"})}},this.confirm=a=>{if(a instanceof KeyboardEvent){if(e.preventKeybinds){a.preventDefault(),a.stopPropagation();return}else if(e.preventKeybindConfirm&&a.key===Keybinds.extra.confirm.keybind.getCode()){a.preventDefault(),a.stopPropagation();return}else if(e.preventKeybindCancel&&a.key===Keybinds.extra.cancel.keybind.getCode()){a.preventDefault(),a.stopPropagation();return}}this.close(this.confirmIndex,a)},this.onButton=(...a)=>{this.contentComponent&&(this.extraComponent?.$destroy(),this.contentComponent.$destroy(),this.contentComponent=null,e.onButton&&e.onButton(...a),e.onClose&&e.onClose())},this.onCancel=(...a)=>{this.contentComponent&&(this.extraComponent?.$destroy(),this.contentComponent.$destroy(),this.contentComponent=null,e.onCancel&&e.onCancel(...a),e.onClose&&e.onClose())}}};s(cn,"SvelteDialog");function Fo(t){new cn({id:`${Ke.name}:unexpectedError`,title:A("dialog.unexpected_error.title"),width:600,content:{component:s1,props:{error:t}},preventKeybinds:!0,buttons:[A("dialog.unexpected_error.close_button")]}).show()}s(Fo,"openUnexpectedErrorDialog");var qc=wi(Ee("path"),1);var mf={};vn(mf,{assetsLoaded:()=>Qo,checkForAssetsUpdate:()=>Ux,extractAssets:()=>TS,getJSONAsset:()=>Mi,getLatestVersionClientDownloadUrl:()=>yh,getPngAssetAsDataUrl:()=>Zo,getRawAsset:()=>sb,hasAsset:()=>Lx,updateAssets:()=>bh});var ble="https://launchermeta.mojang.com/mc/game/version_manifest_v2.json",Ol;async function no(){if(Ol)return Ol;if(!window.navigator.onLine){if(console.warn("Not connected to the internet! Using last known latest version."),Ol=Il(),!Ol)throw new Error("No internet connection, and no previous latest version cached!");return Ol}let t;try{t=await fetch(ble)}catch(e){throw new Error(`Failed to fetch latest Minecraft version manifest: ${e.message}`)}if(t?.ok){let e=await t.json(),n=e.versions.find(i=>i.id===e.latest.snapshot);if(!n)throw new Error(`Failed to find version data for '${e.latest.snapshot}'`);return Ol=n,localStorage.setItem("animated_java:minecraftVersion",JSON.stringify(n)),n}throw new Error("Failed to fetch latest Minecraft version manifest.")}s(no,"getLatestVersion");function Il(){let t=localStorage.getItem("animated_java:minecraftVersion");if(t)return JSON.parse(t)}s(Il,"getCurrentVersion");var AS=wi(nj(),1);var ij={"assets/animated_java/textures/steve.png":"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABL1BMVEUBAABGOqUwKHIAr6+qfWaWX0EAaGgAf38AqKgAmZlqQDB1Ry8qHQ0mIVs/Pz9ra2uHVTuWb1soKCgAYGBWScwmGgoAzMwvHw86MYkkGAgoGwoAW1sAAABRMSUAnp4pHAwsHg6GUzQrHg2BUzkfEAsmGAsoGg0nGwstHQ4tIBCaY0QzJBFFIg6cZ0gjFwkkGAomGgwoGwsoHAsrHg4sHhEvIhEyIxBBIQw6KBRiQy9SPYl0SC+KTD2EUjGHWDqIWjmKWTucY0WcaUydak+iake0hG27iXL///8vIA1CHQo0JRI/KhVCKhJSKCZtQypvRSx6TjOAUzSDVTuPXj6QXkOWX0CcY0aaZEqfaEmcclysdlqze2K1e2etgG23gnK2iWy+iGy9i3K9jnK9jnTGloCtoI9HAAAAAXRSTlMAQObYZgAAAwBJREFUWMPtlmd7okAQxyNL2UX04O4QhAvNWNN7v/Tkeu+9ff/PcLO7bqIYA8a3/h8fdyjzY2aZh5mpqa4Mowq/6kyxq6lRZVQdBwDVos50C4Dj2BzwAPR8dEDVoTk4BgfcKgLDtp1xAMx/HIDthPYMBcR6HN/mLYQ2yDBGfo2eZzfDjXb7UeKsVO3EaLc3wqbteaIu8gDsKExmkySZffY0WplNwsimgG5dZAKiuh2uLi+Gyc8//37//fIkXFxeDe16JOoiO4JGK/Ka0bp8Jn//fH58vB41vajV8ERd5EjBW1p4eLR1drHz7XznQt46eriwBCdFXeQANOpr+8rBh68/dP3X6esDZX+t3qCbyOsiew+81vZJJy6+e7+5tzf3tlaMOyfbLS8SdZEJiONOPK8c7r58sfl4bu7Nq93DT/Mf5ztQS7QuinGuWrgPugsSxxVeS5V7XYnzuFLB+rQ+nQ3g34QBQAU0LgCDvz5WCgMASSpJBRAsdHU1TfNJUDut1YIAbC3AGCOEMbcRWxHoClDqAxQ0VdUwDsAfIbBVTO8GAJgawiig11MAqQ/AbkQ4IOAJtoq4MAMjBr0Z4KuqD9cDAn/cJggTDoCgbogADBek+r5PCHUjBEyfecOxoiimDDLBoGs/wHULdC8oAHxUwh9KAKYidoA5wJJlxbwO0LsHFAABYAaAPaDeADE5wGIAy+oBSNLAWxAAjW3iJYA+mQLM/ggEQLoCIOaFiNgwKvDjACUFKJcFoFy+A9JUTSOEBsABYLNtUDhAVmgkkEoPgDuKFVIpUWDBBQAtMtfFhLgFDrBkFkkGgEUEBCLKm8AffTL4WWY6gokmmmiiUeYFPKwr5x44QGMB8LDBYpQUcgN65wWX9gkQfOODgbkgG1C6bDQBNAmt2+rzA6RSb6fCA219FMC1c8FQQGpeGDoXDAeU+LxwCRAtLS8glQIFWBxg9s0F2QCeiskArCubOSOQUgCFA8ycgPS8oHRzp6MNTSUHoL/dsydb4wAgd8tio821gP/oPFz1ouD5GQAAAABJRU5ErkJggg==","assets/index.json":`{}\r `,"assets/minecraft/blockstates/black_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/black_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/black_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/black_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/blue_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/blue_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/blue_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/blue_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/brown_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/brown_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/brown_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/brown_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/chest.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/chest"\r }\r }\r }\r `,"assets/minecraft/blockstates/conduit.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/conduit"\r }\r }\r }\r `,"assets/minecraft/blockstates/cyan_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/cyan_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/cyan_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/cyan_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/ender_chest.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/ender_chest"\r }\r }\r }\r `,"assets/minecraft/blockstates/gray_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/gray_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/gray_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/gray_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/green_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/green_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/green_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/green_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/light_blue_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/light_blue_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/light_blue_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/light_blue_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/light_gray_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/light_gray_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/light_gray_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/light_gray_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/lime_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/lime_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/lime_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/lime_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/magenta_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/magenta_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/magenta_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/magenta_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/orange_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/orange_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/orange_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/orange_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/pink_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/pink_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/pink_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/pink_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/purple_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/purple_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/purple_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/purple_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/red_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/red_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/red_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/red_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/white_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/white_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/white_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/white_shulker_box"\r }\r }\r }\r `,"assets/minecraft/blockstates/yellow_bed.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/yellow_bed"\r }\r }\r }\r `,"assets/minecraft/blockstates/yellow_shulker_box.json":`{\r "variants": {\r "": {\r "model": "minecraft:block/yellow_shulker_box"\r }\r }\r }\r `,"assets/minecraft/models/block/bed.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 64],\r "elements": [\r {\r "name": "bed",\r "from": [0, 3, 0],\r "to": [16, 9, 16],\r "rotation": {"angle": 0, "axis": "x", "origin": [8, 0, 0]},\r "faces": {\r "north": {"uv": [9.5, 0, 5.5, 1.5], "rotation": 180, "texture": "#0"},\r "east": {"uv": [0, 1.5, 1.5, 5.5], "rotation": 270, "texture": "#0"},\r "south": {"uv": [5.5, 1.5, 1.5, 0], "texture": "#0"},\r "west": {"uv": [5.5, 1.5, 7, 5.5], "rotation": 90, "texture": "#0"},\r "up": {"uv": [1.5, 1.5, 5.5, 5.5], "rotation": 180, "texture": "#0"},\r "down": {"uv": [7, 1.5, 11, 5.5], "texture": "#0"}\r }\r },\r {\r "name": "bed",\r "from": [0, 3, -16],\r "to": [16, 9, 0],\r "rotation": {"angle": 0, "axis": "x", "origin": [8, 0, 0]},\r "faces": {\r "north": {"uv": [9.5, 5.5, 5.5, 7], "rotation": 180, "texture": "#0"},\r "east": {"uv": [0, 7, 1.5, 11], "rotation": 270, "texture": "#0"},\r "south": {"uv": [5.5, 7, 1.5, 5.5], "texture": "#0"},\r "west": {"uv": [5.5, 7, 7, 11], "rotation": 90, "texture": "#0"},\r "up": {"uv": [1.5, 7, 5.5, 11], "rotation": 180, "texture": "#0"},\r "down": {"uv": [7, 7, 11, 11], "texture": "#0"}\r }\r },\r {\r "name": "leg0",\r "from": [13, 0, -16],\r "to": [16, 3, -13],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]},\r "faces": {\r "north": {"uv": [13.25, 0.75, 14, 1.5], "texture": "#0"},\r "east": {"uv": [12.5, 0.75, 13.25, 1.5], "texture": "#0"},\r "south": {"uv": [14.75, 0.75, 15.5, 1.5], "texture": "#0"},\r "west": {"uv": [14, 0.75, 14.75, 1.5], "texture": "#0"},\r "up": {"uv": [14, 0.75, 13.25, 0], "texture": "#0"},\r "down": {"uv": [14.75, 0, 14, 0.75], "texture": "#0"}\r }\r },\r {\r "name": "leg1",\r "from": [13, 0, 13],\r "to": [16, 3, 16],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]},\r "faces": {\r "north": {"uv": [13.25, 2.25, 14, 3], "texture": "#0"},\r "east": {"uv": [12.5, 2.25, 13.25, 3], "texture": "#0"},\r "south": {"uv": [14.75, 2.25, 15.5, 3], "texture": "#0"},\r "west": {"uv": [14, 2.25, 14.75, 3], "texture": "#0"},\r "up": {"uv": [14, 2.25, 13.25, 1.5], "texture": "#0"},\r "down": {"uv": [14.75, 1.5, 14, 2.25], "texture": "#0"}\r }\r },\r {\r "name": "leg2",\r "from": [0, 0, -16],\r "to": [3, 3, -13],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]},\r "faces": {\r "north": {"uv": [13.25, 3.75, 14, 4.5], "texture": "#0"},\r "east": {"uv": [12.5, 3.75, 13.25, 4.5], "texture": "#0"},\r "south": {"uv": [14.75, 3.75, 15.5, 4.5], "texture": "#0"},\r "west": {"uv": [14, 3.75, 14.75, 4.5], "texture": "#0"},\r "up": {"uv": [14, 3.75, 13.25, 3], "texture": "#0"},\r "down": {"uv": [14.75, 3, 14, 3.75], "texture": "#0"}\r }\r },\r {\r "name": "leg3",\r "from": [0, 0, 13],\r "to": [3, 3, 16],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]},\r "faces": {\r "north": {"uv": [13.25, 5.25, 14, 6], "texture": "#0"},\r "east": {"uv": [12.5, 5.25, 13.25, 6], "texture": "#0"},\r "south": {"uv": [14.75, 5.25, 15.5, 6], "texture": "#0"},\r "west": {"uv": [14, 5.25, 14.75, 6], "texture": "#0"},\r "up": {"uv": [14, 5.25, 13.25, 4.5], "texture": "#0"},\r "down": {"uv": [14.75, 4.5, 14, 5.25], "texture": "#0"}\r }\r }\r ],\r "groups": [\r {\r "name": "bed",\r "origin": [8, 0, 8],\r "color": 0,\r "children": [0, 1]\r },\r {\r "name": "leg0",\r "origin": [14.5, 1.5, -6.5],\r "color": 0,\r "children": [2]\r },\r {\r "name": "leg1",\r "origin": [14.5, 1.5, 22.5],\r "color": 0,\r "children": [3]\r },\r {\r "name": "leg2",\r "origin": [1.5, 1.5, -6.5],\r "color": 0,\r "children": [4]\r },\r {\r "name": "leg3",\r "origin": [1.5, 1.5, 22.5],\r "color": 0,\r "children": [5]\r }\r ]\r }`,"assets/minecraft/models/block/black_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/black"\r }\r }\r `,"assets/minecraft/models/block/black_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_black"\r }\r }\r `,"assets/minecraft/models/block/blue_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/blue"\r }\r }\r `,"assets/minecraft/models/block/blue_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_blue"\r }\r }\r `,"assets/minecraft/models/block/brown_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/brown"\r }\r }\r `,"assets/minecraft/models/block/brown_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_brown"\r }\r }\r `,"assets/minecraft/models/block/chest.json":`{\r "parent": "block/block",\r "textures": {\r "0": "entity/chest/normal"\r },\r "elements": [\r {\r "from": [1, 9, 1],\r "to": [15, 14, 15],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 11.5, 8] },\r "faces": {\r "north": { "uv": [7, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" },\r "east": { "uv": [3.5, 3.5, 0, 4.75], "rotation": 180, "texture": "#0" },\r "south": { "uv": [14, 3.5, 10.5, 4.75], "rotation": 180, "texture": "#0" },\r "west": { "uv": [10.5, 3.5, 7, 4.75], "rotation": 180, "texture": "#0" },\r "up": { "uv": [7, 3.5, 10.5, 0], "texture": "#0" },\r "down": { "uv": [3.5, 3.5, 7, 0], "texture": "#0" }\r }\r },\r {\r "from": [7, 8, 15],\r "to": [9, 12, 16],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 10, 15.5] },\r "faces": {\r "north": { "uv": [1, 1.25, 0.5, 0.25], "texture": "#0" },\r "east": { "uv": [0.5, 1.25, 0.25, 0.25], "texture": "#0" },\r "south": { "uv": [1, 1.25, 0.5, 0.25], "texture": "#0" },\r "west": { "uv": [1.25, 1.25, 1, 0.25], "texture": "#0" },\r "up": { "uv": [0.5, 0.25, 1, 0], "texture": "#0" },\r "down": { "uv": [0.5, 0.25, 1, 0], "texture": "#0" }\r }\r },\r {\r "from": [1, 0, 1],\r "to": [15, 10, 15],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 5, 8] },\r "faces": {\r "north": { "uv": [7, 8.25, 3.5, 10.75], "rotation": 180, "texture": "#0" },\r "east": { "uv": [10.5, 8.25, 7, 10.75], "rotation": 180, "texture": "#0" },\r "south": { "uv": [14, 8.25, 10.5, 10.75], "rotation": 180, "texture": "#0" },\r "west": { "uv": [3.5, 8.25, 0, 10.75], "rotation": 180, "texture": "#0" },\r "up": { "uv": [7, 8.25, 10.5, 4.75], "texture": "#0" },\r "down": { "uv": [3.5, 8.25, 7, 4.75], "rotation": 180, "texture": "#0" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/block/conduit.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [32, 16],\r "textures": {\r "0": "minecraft:entity/conduit/base",\r "particle": "minecraft:entity/conduit/base"\r },\r "elements": [\r {\r "from": [5, 5, 5],\r "to": [11, 11, 11],\r "rotation": { "angle": 0, "axis": "y", "origin": [5, 5, 5] },\r "faces": {\r "north": { "uv": [3, 6, 6, 12], "texture": "#0" },\r "east": { "uv": [0, 6, 3, 12], "texture": "#0" },\r "south": { "uv": [9, 6, 12, 12], "texture": "#0" },\r "west": { "uv": [6, 6, 9, 12], "texture": "#0" },\r "up": { "uv": [6, 6, 3, 0], "texture": "#0" },\r "down": { "uv": [9, 0, 6, 6], "texture": "#0" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/block/cyan_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/cyan"\r }\r }\r `,"assets/minecraft/models/block/cyan_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_cyan"\r }\r }\r `,"assets/minecraft/models/block/ender_chest.json":`{\r "textures": {\r "0": "entity/chest/ender"\r },\r "elements": [\r {\r "from": [1, 9, 1],\r "to": [15, 14, 15],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 11.5, 8] },\r "faces": {\r "north": { "uv": [10.5, 3.5, 14, 4.75], "rotation": 180, "texture": "#0" },\r "east": { "uv": [0, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" },\r "south": { "uv": [3.5, 3.5, 7, 4.75], "rotation": 180, "texture": "#0" },\r "west": { "uv": [7, 3.5, 10.5, 4.75], "rotation": 180, "texture": "#0" },\r "up": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" },\r "down": { "uv": [3.5, 0, 7, 3.5], "texture": "#0" }\r }\r },\r {\r "from": [7, 8, 0],\r "to": [9, 12, 1],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 10, 0.5] },\r "faces": {\r "north": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" },\r "east": { "uv": [0.25, 1.25, 0.5, 0.25], "texture": "#0" },\r "south": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" },\r "west": { "uv": [1, 1.25, 1.25, 0.25], "texture": "#0" },\r "up": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" },\r "down": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" }\r }\r },\r {\r "from": [1, 0, 1],\r "to": [15, 10, 15],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 5, 8] },\r "faces": {\r "north": { "uv": [10.5, 8.25, 14, 10.75], "rotation": 180, "texture": "#0" },\r "east": { "uv": [7, 8.25, 10.5, 10.75], "rotation": 180, "texture": "#0" },\r "south": { "uv": [3.5, 8.25, 7, 10.75], "rotation": 180, "texture": "#0" },\r "west": { "uv": [0, 8.25, 3.5, 10.75], "rotation": 180, "texture": "#0" },\r "up": { "uv": [7, 4.75, 10.5, 8.25], "texture": "#0" },\r "down": { "uv": [3.5, 4.75, 7, 8.25], "rotation": 180, "texture": "#0" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/block/gray_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/gray"\r }\r }\r `,"assets/minecraft/models/block/gray_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_gray"\r }\r }\r `,"assets/minecraft/models/block/green_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/green"\r }\r }\r `,"assets/minecraft/models/block/green_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_green"\r }\r }\r `,"assets/minecraft/models/block/light_blue_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/light_blue"\r }\r }\r `,"assets/minecraft/models/block/light_blue_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_light_blue"\r }\r }\r `,"assets/minecraft/models/block/light_gray_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/light_gray"\r }\r }\r `,"assets/minecraft/models/block/light_gray_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_light_gray"\r }\r }\r `,"assets/minecraft/models/block/lime_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/lime"\r }\r }\r `,"assets/minecraft/models/block/lime_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_lime"\r }\r }\r `,"assets/minecraft/models/block/magenta_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/magenta"\r }\r }\r `,"assets/minecraft/models/block/magenta_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_magenta"\r }\r }\r `,"assets/minecraft/models/block/orange_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/orange"\r }\r }\r `,"assets/minecraft/models/block/orange_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_orange"\r }\r }\r `,"assets/minecraft/models/block/pink_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/pink"\r }\r }\r `,"assets/minecraft/models/block/pink_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_pink"\r }\r }\r `,"assets/minecraft/models/block/purple_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/purple"\r }\r }\r `,"assets/minecraft/models/block/purple_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_purple"\r }\r }\r `,"assets/minecraft/models/block/red_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/red"\r }\r }\r `,"assets/minecraft/models/block/red_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_red"\r }\r }\r `,"assets/minecraft/models/block/shulker_box.json":`{\r "credit": "Made with Blockbench",\r "textures": {\r "0": "entity/shulker/shulker",\r "particle": "entity/shulker/shulker"\r },\r "elements": [\r {\r "from": [0, 0, 0],\r "to": [16, 16, 16],\r "faces": {\r "north": { "uv": [0, 9, 4, 13], "texture": "#0" },\r "east": { "uv": [0, 9, 4, 13], "texture": "#0" },\r "south": { "uv": [0, 9, 4, 13], "texture": "#0" },\r "west": { "uv": [0, 9, 4, 13], "texture": "#0" },\r "down": { "uv": [8, 7, 12, 11], "texture": "#0" }\r }\r },\r {\r "from": [0, 0, 0],\r "to": [16, 16, 16],\r "faces": {\r "north": { "uv": [0, 4, 4, 8], "texture": "#0" },\r "east": { "uv": [0, 4, 4, 8], "texture": "#0" },\r "south": { "uv": [0, 4, 4, 8], "texture": "#0" },\r "west": { "uv": [0, 4, 4, 8], "texture": "#0" },\r "up": { "uv": [4, 0, 8, 4], "texture": "#0" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/block/white_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/white"\r }\r }\r `,"assets/minecraft/models/block/white_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_white"\r }\r }\r `,"assets/minecraft/models/block/yellow_bed.json":`{\r "parent": "block/bed",\r "textures": {\r "0": "entity/bed/yellow"\r }\r }\r `,"assets/minecraft/models/block/yellow_shulker_box.json":`{\r "parent": "block/shulker_box",\r "textures": {\r "0": "entity/shulker/shulker_yellow"\r }\r }\r `,"assets/minecraft/models/item/black_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/black_shulker_box.json":`{\r "parent": "block/black_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/blue_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/blue_shulker_box.json":`{\r "parent": "block/blue_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/brown_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/brown_shulker_box.json":`{\r "parent": "block/brown_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/conduit.json":`{\r "parent": "block/conduit",\r "textures": {\r "particle": "block/conduit"\r },\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [1.0, 1.0, 1.0]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.8, 0.8, 0.8]\r }\r }\r }\r `,"assets/minecraft/models/item/creeper_head.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 32],\r "textures": {\r "0": "entity/creeper/creeper"\r },\r "elements": [\r {\r "name": "Head",\r "from": [4, -8, 4],\r "to": [12, 0, 12],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -4, 8]},\r "faces": {\r "north": {"uv": [2, 4, 4, 8], "texture": "#0"},\r "east": {"uv": [0, 4, 2, 8], "texture": "#0"},\r "south": {"uv": [6, 4, 8, 8], "texture": "#0"},\r "west": {"uv": [4, 4, 6, 8], "texture": "#0"},\r "up": {"uv": [4, 4, 2, 0], "texture": "#0"},\r "down": {"uv": [6, 0, 4, 4], "texture": "#0"}\r }\r }\r ]\r }`,"assets/minecraft/models/item/cyan_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/cyan_shulker_box.json":`{\r "parent": "block/cyan_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/decorated_pot.json":`{\r "credit": "Made with Blockbench",\r "textures": {\r "0": "entity/decorated_pot/decorated_pot_side",\r "1": "entity/decorated_pot/decorated_pot_base",\r "particle": "entity/decorated_pot/decorated_pot_side"\r },\r "elements": [\r {\r "from": [1, 0, 1],\r "to": [15, 16, 15],\r "faces": {\r "north": { "uv": [1, 0, 15, 16], "texture": "#0" },\r "east": { "uv": [1, 0, 15, 16], "texture": "#0" },\r "south": { "uv": [1, 0, 15, 16], "texture": "#0" },\r "west": { "uv": [1, 0, 15, 16], "texture": "#0" },\r "up": { "uv": [7, 6.5, 14, 13.5], "texture": "#1" },\r "down": { "uv": [0, 6.5, 7, 13.5], "texture": "#1" }\r }\r },\r {\r "from": [4.75, 16, 4.75],\r "to": [11.25, 20, 11.25],\r "rotation": { "angle": 0, "axis": "y", "origin": [6, 16, 6] },\r "faces": {\r "north": { "uv": [0, 4, 4, 6], "texture": "#1" },\r "east": { "uv": [0, 4, 4, 6], "texture": "#1" },\r "south": { "uv": [0, 4, 4, 6], "texture": "#1" },\r "west": { "uv": [0, 4, 4, 6], "texture": "#1" }\r }\r },\r {\r "from": [4, 17, 4],\r "to": [12, 20, 12],\r "rotation": { "angle": 0, "axis": "y", "origin": [6, 17, 6] },\r "faces": {\r "north": { "uv": [12, 4, 16, 5.5], "texture": "#1" },\r "east": { "uv": [12, 4, 16, 5.5], "texture": "#1" },\r "south": { "uv": [12, 4, 16, 5.5], "texture": "#1" },\r "west": { "uv": [12, 4, 16, 5.5], "texture": "#1" },\r "up": { "uv": [4, 0, 8, 4], "texture": "#1" },\r "down": { "uv": [8, 0, 12, 4], "texture": "#1" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/item/dragon_head.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [256, 256],\r "textures": {\r "0": "enderdragon"\r },\r "elements": [\r {\r "name": "head",\r "from": [2, -6, -16],\r "to": [14, -1, 0],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 8]},\r "faces": {\r "north": {"uv": [12, 3.75, 12.75, 4.0625], "texture": "#0"},\r "east": {"uv": [11, 3.75, 12, 4.0625], "texture": "#0"},\r "south": {"uv": [13.75, 3.75, 14.5, 4.0625], "texture": "#0"},\r "west": {"uv": [12.75, 3.75, 13.75, 4.0625], "texture": "#0"},\r "up": {"uv": [12.75, 3.75, 12, 2.75], "texture": "#0"},\r "down": {"uv": [13.5, 2.75, 12.75, 3.75], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [0, -10, 0],\r "to": [16, 6, 16],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 24]},\r "faces": {\r "north": {"uv": [8, 2.875, 9, 3.875], "texture": "#0"},\r "east": {"uv": [7, 2.875, 8, 3.875], "texture": "#0"},\r "south": {"uv": [10, 2.875, 11, 3.875], "texture": "#0"},\r "west": {"uv": [9, 2.875, 10, 3.875], "texture": "#0"},\r "up": {"uv": [9, 2.875, 8, 1.875], "texture": "#0"},\r "down": {"uv": [10, 1.875, 9, 2.875], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [11, 6, 6],\r "to": [13, 10, 12],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 30]},\r "faces": {\r "north": {"uv": [0.5, 0.375, 0.375, 0.625], "texture": "#0"},\r "east": {"uv": [0.875, 0.375, 0.5, 0.625], "texture": "#0"},\r "south": {"uv": [1, 0.375, 0.875, 0.625], "texture": "#0"},\r "west": {"uv": [0.375, 0.375, 0, 0.625], "texture": "#0"},\r "up": {"uv": [0.375, 0.375, 0.5, 0], "texture": "#0"},\r "down": {"uv": [0.5, 0, 0.625, 0.375], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [11, -1, -16],\r "to": [13, 1, -12],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 8]},\r "faces": {\r "north": {"uv": [7.375, 0.25, 7.25, 0.375], "texture": "#0"},\r "east": {"uv": [7.625, 0.25, 7.375, 0.375], "texture": "#0"},\r "south": {"uv": [7.75, 0.25, 7.625, 0.375], "texture": "#0"},\r "west": {"uv": [7.25, 0.25, 7, 0.375], "texture": "#0"},\r "up": {"uv": [7.25, 0.25, 7.375, 0], "texture": "#0"},\r "down": {"uv": [7.375, 0, 7.5, 0.25], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [3, 6, 6],\r "to": [5, 10, 12],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 30]},\r "faces": {\r "north": {"uv": [0.375, 0.375, 0.5, 0.625], "texture": "#0"},\r "east": {"uv": [0, 0.375, 0.375, 0.625], "texture": "#0"},\r "south": {"uv": [0.875, 0.375, 1, 0.625], "texture": "#0"},\r "west": {"uv": [0.5, 0.375, 0.875, 0.625], "texture": "#0"},\r "up": {"uv": [0.5, 0.375, 0.375, 0], "texture": "#0"},\r "down": {"uv": [0.625, 0, 0.5, 0.375], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [3, -1, -16],\r "to": [5, 1, -12],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 8]},\r "faces": {\r "north": {"uv": [7.25, 0.25, 7.375, 0.375], "texture": "#0"},\r "east": {"uv": [7, 0.25, 7.25, 0.375], "texture": "#0"},\r "south": {"uv": [7.625, 0.25, 7.75, 0.375], "texture": "#0"},\r "west": {"uv": [7.375, 0.25, 7.625, 0.375], "texture": "#0"},\r "up": {"uv": [7.375, 0.25, 7.25, 0], "texture": "#0"},\r "down": {"uv": [7.5, 0, 7.375, 0.25], "texture": "#0"}\r }\r },\r {\r "name": "jaw",\r "from": [2, -10, -16],\r "to": [14, -6, 0],\r "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -6, 0]},\r "faces": {\r "north": {"uv": [12, 5.0625, 12.75, 5.3125], "texture": "#0"},\r "east": {"uv": [11, 5.0625, 12, 5.3125], "texture": "#0"},\r "south": {"uv": [13.75, 5.0625, 14.5, 5.3125], "texture": "#0"},\r "west": {"uv": [12.75, 5.0625, 13.75, 5.3125], "texture": "#0"},\r "up": {"uv": [12.75, 5.0625, 12, 4.0625], "texture": "#0"},\r "down": {"uv": [13.5, 4.0625, 12.75, 5.0625], "texture": "#0"}\r }\r }\r ],\r "groups": [\r {\r "name": "head",\r "origin": [8, 7, -50],\r "color": 0,\r "children": [\r 0,\r 1,\r 2,\r 3,\r 4,\r 5,\r {\r "name": "jaw",\r "origin": [8, 3, -63],\r "color": 0,\r "children": [6]\r }\r ]\r }\r ]\r }`,"assets/minecraft/models/item/ender_chest.json":`{\r "parent": "minecraft:block/ender_chest"\r }\r `,"assets/minecraft/models/item/gray_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/gray_shulker_box.json":`{\r "parent": "block/gray_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/green_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/green_shulker_box.json":`{\r "parent": "block/green_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/light_blue_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/light_blue_shulker_box.json":`{\r "parent": "block/light_blue_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/light_gray_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/light_gray_shulker_box.json":`{\r "parent": "block/light_gray_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/lime_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/lime_shulker_box.json":`{\r "parent": "block/lime_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/magenta_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/magenta_shulker_box.json":`{\r "parent": "block/magenta_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/mob_skull.json":`{\r "elements": [\r {\r "name": "head",\r "from": [4, 0, 4],\r "to": [12, 8, 12],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },\r "faces": {\r "north": { "uv": [2, 4, 4, 8], "texture": "#skull" },\r "east": { "uv": [0, 4, 2, 8], "texture": "#skull" },\r "south": { "uv": [6, 4, 8, 8], "texture": "#skull" },\r "west": { "uv": [4, 4, 6, 8], "texture": "#skull" },\r "up": { "uv": [4, 4, 2, 0], "texture": "#skull" },\r "down": { "uv": [6, 0, 4, 4], "texture": "#skull" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/item/orange_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/orange_shulker_box.json":`{\r "parent": "block/orange_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/piglin_head.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 64],\r "textures": {\r "0": "entity/piglin/piglin"\r },\r "elements": [\r {\r "name": "rightear",\r "from": [12.5, -7, 6],\r "to": [13.5, -2, 10],\r "rotation": {"angle": 45, "axis": "z", "origin": [13, -2, 8]},\r "faces": {\r "north": {"uv": [10.75, 2.5, 11, 3.75], "texture": "#0"},\r "east": {"uv": [9.75, 2.5, 10.75, 3.75], "texture": "#0"},\r "south": {"uv": [12, 2.5, 12.25, 3.75], "texture": "#0"},\r "west": {"uv": [11, 2.5, 12, 3.75], "texture": "#0"},\r "up": {"uv": [11, 2.5, 10.75, 1.5], "texture": "#0"},\r "down": {"uv": [11.25, 1.5, 11, 2.5], "texture": "#0"}\r }\r },\r {\r "name": "leftear",\r "from": [2.5, -7, 6],\r "to": [3.5, -2, 10],\r "rotation": {"angle": -45, "axis": "z", "origin": [3, -2, 8]},\r "faces": {\r "north": {"uv": [13.75, 2.5, 14, 3.75], "texture": "#0"},\r "east": {"uv": [12.75, 2.5, 13.75, 3.75], "texture": "#0"},\r "south": {"uv": [15, 2.5, 15.25, 3.75], "texture": "#0"},\r "west": {"uv": [14, 2.5, 15, 3.75], "texture": "#0"},\r "up": {"uv": [14, 2.5, 13.75, 1.5], "texture": "#0"},\r "down": {"uv": [14.25, 1.5, 14, 2.5], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [10, -8, 3],\r "to": [11, -6, 4],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]},\r "faces": {\r "north": {"uv": [0.75, 0.25, 1, 0.75], "texture": "#0"},\r "east": {"uv": [0.5, 0.25, 0.75, 0.75], "texture": "#0"},\r "south": {"uv": [1.25, 0.25, 1.5, 0.75], "texture": "#0"},\r "west": {"uv": [1, 0.25, 1.25, 0.75], "texture": "#0"},\r "up": {"uv": [1, 0.25, 0.75, 0], "texture": "#0"},\r "down": {"uv": [1.25, 0, 1, 0.25], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [5, -8, 3],\r "to": [6, -6, 4],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]},\r "faces": {\r "north": {"uv": [0.75, 1.25, 1, 1.75], "texture": "#0"},\r "east": {"uv": [0.5, 1.25, 0.75, 1.75], "texture": "#0"},\r "south": {"uv": [1.25, 1.25, 1.5, 1.75], "texture": "#0"},\r "west": {"uv": [1, 1.25, 1.25, 1.75], "texture": "#0"},\r "up": {"uv": [1, 1.25, 0.75, 1], "texture": "#0"},\r "down": {"uv": [1.25, 1, 1, 1.25], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [6, -8, 3],\r "to": [10, -4, 4],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]},\r "faces": {\r "north": {"uv": [8, 0.5, 9, 1.5], "texture": "#0"},\r "east": {"uv": [7.75, 0.5, 8, 1.5], "texture": "#0"},\r "south": {"uv": [9.25, 0.5, 10.25, 1.5], "texture": "#0"},\r "west": {"uv": [9, 0.5, 9.25, 1.5], "texture": "#0"},\r "up": {"uv": [9, 0.5, 8, 0.25], "texture": "#0"},\r "down": {"uv": [10, 0.25, 9, 0.5], "texture": "#0"}\r }\r },\r {\r "name": "head",\r "from": [3.02, -7.98, 4.02],\r "to": [12.98, -0.02, 11.98],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]},\r "faces": {\r "north": {"uv": [2, 2, 4.5, 4], "texture": "#0"},\r "east": {"uv": [0, 2, 2, 4], "texture": "#0"},\r "south": {"uv": [6.5, 2, 9, 4], "texture": "#0"},\r "west": {"uv": [4.5, 2, 6.5, 4], "texture": "#0"},\r "up": {"uv": [4.5, 2, 2, 0], "texture": "#0"},\r "down": {"uv": [7, 0, 4.5, 2], "texture": "#0"}\r }\r }\r ]\r }`,"assets/minecraft/models/item/pink_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/pink_shulker_box.json":`{\r "parent": "block/pink_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/player_head.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 64],\r "textures": {\r "0": "animated_java:steve"\r },\r "elements": [\r {\r "name": "Hat Layer",\r "from": [3.5, -8.5, 3.5],\r "to": [12.5, 0.5, 12.5],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -31.5, 8]},\r "faces": {\r "north": {"uv": [10, 2, 12, 4], "texture": "#0"},\r "east": {"uv": [8, 2, 10, 4], "texture": "#0"},\r "south": {"uv": [14, 2, 16, 4], "texture": "#0"},\r "west": {"uv": [12, 2, 14, 4], "texture": "#0"},\r "up": {"uv": [12, 2, 10, 0], "texture": "#0"},\r "down": {"uv": [14, 0, 12, 2], "texture": "#0"}\r }\r },\r {\r "name": "Head",\r "from": [4, -8, 4],\r "to": [12, 0, 12],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]},\r "faces": {\r "north": {"uv": [2, 2, 4, 4], "texture": "#0"},\r "east": {"uv": [0, 2, 2, 4], "texture": "#0"},\r "south": {"uv": [6, 2, 8, 4], "texture": "#0"},\r "west": {"uv": [4, 2, 6, 4], "texture": "#0"},\r "up": {"uv": [4, 2, 2, 0], "texture": "#0"},\r "down": {"uv": [6, 0, 4, 2], "texture": "#0"}\r }\r }\r ]\r }`,"assets/minecraft/models/item/purple_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/purple_shulker_box.json":`{\r "parent": "block/purple_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/red_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/red_shulker_box.json":`{\r "parent": "block/red_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/shield.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 64],\r "textures": {\r "0": "entity/shield_base"\r },\r "elements": [\r {\r "name": "shield",\r "from": [16, -11, 13],\r "to": [18, -5, 19],\r "rotation": {"angle": 0, "axis": "y", "origin": [18, -36, 13]},\r "faces": {\r "north": {"uv": [8, 1.5, 8.5, 3], "texture": "#0"},\r "east": {"uv": [6.5, 1.5, 8, 3], "texture": "#0"},\r "south": {"uv": [10, 1.5, 10.5, 3], "texture": "#0"},\r "west": {"uv": [8.5, 1.5, 10, 3], "texture": "#0"},\r "up": {"uv": [8.5, 1.5, 8, 0], "texture": "#0"},\r "down": {"uv": [9, 0, 8.5, 1.5], "texture": "#0"}\r }\r },\r {\r "name": "shield",\r "from": [11, -19, 12],\r "to": [23, 3, 13],\r "rotation": {"angle": 0, "axis": "y", "origin": [18, -29, 13]},\r "faces": {\r "north": {"uv": [0.25, 0.25, 3.25, 5.75], "texture": "#0"},\r "east": {"uv": [0, 0.25, 0.25, 5.75], "texture": "#0"},\r "south": {"uv": [3.5, 0.25, 6.5, 5.75], "texture": "#0"},\r "west": {"uv": [3.25, 0.25, 3.5, 5.75], "texture": "#0"},\r "up": {"uv": [3.25, 0.25, 0.25, 0], "texture": "#0"},\r "down": {"uv": [6.25, 0, 3.25, 0.25], "texture": "#0"}\r }\r }\r ],\r "groups": [\r {\r "name": "shield",\r "origin": [7, 15.5, 11],\r "color": 0,\r "children": [0, 1]\r }\r ]\r }`,"assets/minecraft/models/item/shulker_box.json":`{\r "parent": "block/shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/skeleton_skull.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 32],\r "textures": {\r "0": "minecraft:entity/skeleton/skeleton"\r },\r "elements": [\r {\r "name": "Hat Layer",\r "from": [3.5, -8.5, 3.5],\r "to": [12.5, 0.5, 12.5],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, -31.5, 8] },\r "faces": {\r "north": { "uv": [10, 4, 12, 8], "texture": "#0" },\r "east": { "uv": [8, 4, 10, 8], "texture": "#0" },\r "south": { "uv": [14, 4, 16, 8], "texture": "#0" },\r "west": { "uv": [12, 4, 14, 8], "texture": "#0" },\r "up": { "uv": [12, 4, 10, 0], "texture": "#0" },\r "down": { "uv": [14, 0, 12, 4], "texture": "#0" }\r }\r },\r {\r "name": "Head",\r "from": [4, -8, 4],\r "to": [12, 0, 12],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, -32, 8] },\r "faces": {\r "north": { "uv": [2, 4, 4, 8], "texture": "#0" },\r "east": { "uv": [0, 4, 2, 8], "texture": "#0" },\r "south": { "uv": [6, 4, 8, 8], "texture": "#0" },\r "west": { "uv": [4, 4, 6, 8], "texture": "#0" },\r "up": { "uv": [4, 4, 2, 0], "texture": "#0" },\r "down": { "uv": [6, 0, 4, 4], "texture": "#0" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/item/template_banner.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 64],\r "textures": {\r "0": "entity/banner_base",\r "tint": "entity/banner_base"\r },\r "elements": [\r {\r "name": "stand",\r "from": [-2, 30, 7],\r "to": [18, 32, 9],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 7] },\r "faces": {\r "north": { "uv": [0.5, 11, 5.5, 11.5], "texture": "#0" },\r "east": { "uv": [0, 11, 0.5, 11.5], "texture": "#0" },\r "south": { "uv": [6, 11, 11, 11.5], "texture": "#0" },\r "west": { "uv": [5.5, 11, 6, 11.5], "texture": "#0" },\r "up": { "uv": [5.5, 11, 0.5, 10.5], "texture": "#0" },\r "down": { "uv": [10.5, 10.5, 5.5, 11], "texture": "#0" }\r }\r },\r {\r "name": "stand",\r "from": [7, -12, 7],\r "to": [9, 30, 9],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, -2, 7] },\r "faces": {\r "north": { "uv": [11.5, 0.5, 12, 11], "texture": "#0" },\r "east": { "uv": [11, 0.5, 11.5, 11], "texture": "#0" },\r "south": { "uv": [12.5, 0.5, 13, 11], "texture": "#0" },\r "west": { "uv": [12, 0.5, 12.5, 11], "texture": "#0" },\r "up": { "uv": [12, 0.5, 11.5, 0], "texture": "#0" },\r "down": { "uv": [12.5, 0, 12, 0.5], "texture": "#0" }\r }\r },\r {\r "name": "banner",\r "from": [-2, -8, 6],\r "to": [18, 32, 7],\r "rotation": { "angle": 0.5, "axis": "x", "origin": [8, 32, 7] },\r "faces": {\r "north": { "uv": [0.25, 0.25, 5.25, 10.25], "texture": "#tint" },\r "east": { "uv": [0, 0.25, 0.25, 10.25], "texture": "#tint" },\r "south": { "uv": [5.5, 0.25, 10.5, 10.25], "texture": "#tint" },\r "west": { "uv": [5.25, 0.25, 5.5, 10.25], "texture": "#tint" },\r "up": { "uv": [5.25, 0.25, 0.25, 0], "texture": "#tint" },\r "down": { "uv": [10.25, 0, 5.25, 0.25], "texture": "#tint" }\r }\r }\r ],\r "display": {\r "thirdperson_righthand": {\r "rotation": [0, 90, 0],\r "translation": [0, 2, 0.5],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 90, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "ground": {\r "translation": [0, 1, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "gui": {\r "rotation": [30, 20, 0],\r "translation": [0, -3.25, 0],\r "scale": [0.5325, 0.5325, 0.5325]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 16, 7],\r "scale": [1.5, 1.5, 1.5]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "scale": [0.5, 0.5, 0.5]\r }\r },\r "groups": [\r {\r "name": "stand",\r "origin": [8, 0, 8],\r "color": 0,\r "children": [\r 0,\r 1,\r {\r "name": "banner",\r "origin": [8, 44, 8],\r "color": 0,\r "children": [2]\r }\r ]\r }\r ]\r }\r `,"assets/minecraft/models/item/template_chest.json":`{\r "parent": "block/block",\r "textures": {\r "0": "entity/chest/normal"\r },\r "elements": [\r {\r "from": [1, 9, 1],\r "to": [15, 14, 15],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 11.5, 8] },\r "faces": {\r "north": { "uv": [10.5, 3.5, 14, 4.75], "rotation": 180, "texture": "#0" },\r "east": { "uv": [0, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" },\r "south": { "uv": [3.5, 3.5, 7, 4.75], "rotation": 180, "texture": "#0" },\r "west": { "uv": [7, 3.5, 10.5, 4.75], "rotation": 180, "texture": "#0" },\r "up": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" },\r "down": { "uv": [3.5, 0, 7, 3.5], "texture": "#0" }\r }\r },\r {\r "from": [7, 8, 0],\r "to": [9, 12, 1],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 10, 0.5] },\r "faces": {\r "north": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" },\r "east": { "uv": [0.25, 1.25, 0.5, 0.25], "texture": "#0" },\r "south": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" },\r "west": { "uv": [1, 1.25, 1.25, 0.25], "texture": "#0" },\r "up": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" },\r "down": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" }\r }\r },\r {\r "from": [1, 0, 1],\r "to": [15, 10, 15],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, 5, 8] },\r "faces": {\r "north": { "uv": [10.5, 8.25, 14, 10.75], "rotation": 180, "texture": "#0" },\r "east": { "uv": [7, 8.25, 10.5, 10.75], "rotation": 180, "texture": "#0" },\r "south": { "uv": [3.5, 8.25, 7, 10.75], "rotation": 180, "texture": "#0" },\r "west": { "uv": [0, 8.25, 3.5, 10.75], "rotation": 180, "texture": "#0" },\r "up": { "uv": [7, 4.75, 10.5, 8.25], "texture": "#0" },\r "down": { "uv": [3.5, 4.75, 7, 8.25], "rotation": 180, "texture": "#0" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/item/trident.json":`{\r "credit": "Made with Blockbench",\r "textures": {\r "0": "entity/trident",\r "particle": "entity/trident"\r },\r "elements": [\r {\r "from": [15, -34, 15],\r "to": [16, -3, 16],\r "rotation": {"angle": 0, "axis": "y", "origin": [15, -18, 15]},\r "faces": {\r "north": {"uv": [1.5, 0.5, 2, 16], "texture": "#0"},\r "east": {"uv": [1, 0.5, 1.5, 16], "texture": "#0"},\r "south": {"uv": [0.5, 0.5, 1, 16], "texture": "#0"},\r "west": {"uv": [0, 0.5, 0.5, 16], "texture": "#0"},\r "up": {"uv": [0.5, 0, 1, 0.5], "texture": "#0"},\r "down": {"uv": [1, 0, 1.5, 0.5], "texture": "#0"}\r }\r },\r {\r "from": [14, -9, 15],\r "to": [17, -7, 16],\r "rotation": {"angle": 0, "axis": "y", "origin": [14, -18, 15]},\r "faces": {\r "north": {"uv": [2.5, 0.5, 4, 1.5], "texture": "#0"},\r "east": {"uv": [2, 0.5, 2.5, 1.5], "texture": "#0"},\r "south": {"uv": [2.5, 0.5, 4, 1.5], "texture": "#0"},\r "west": {"uv": [3, 0.5, 3.5, 1.5], "texture": "#0"},\r "up": {"uv": [2.5, 0, 4, 0.5], "texture": "#0"},\r "down": {"uv": [4, 0, 5.5, 0.5], "texture": "#0"}\r }\r },\r {\r "from": [13, -8, 15],\r "to": [14, -4, 16],\r "rotation": {"angle": 0, "axis": "y", "origin": [13, -17, 15]},\r "faces": {\r "north": {"uv": [2.5, 2, 3, 4], "texture": "#0"},\r "east": {"uv": [2, 2, 2.5, 4], "texture": "#0"},\r "south": {"uv": [3.5, 2, 4, 4], "texture": "#0"},\r "west": {"uv": [3, 2, 3.5, 4], "texture": "#0"},\r "up": {"uv": [2.5, 1.5, 3, 2], "texture": "#0"},\r "down": {"uv": [3, 1.5, 3.5, 2], "texture": "#0"}\r }\r },\r {\r "from": [17, -8, 15],\r "to": [18, -4, 16],\r "rotation": {"angle": 0, "axis": "y", "origin": [17, -17, 15]},\r "faces": {\r "north": {"uv": [2.5, 2, 3, 4], "texture": "#0"},\r "east": {"uv": [2, 2, 2.5, 4], "texture": "#0"},\r "south": {"uv": [3.5, 2, 4, 4], "texture": "#0"},\r "west": {"uv": [3, 2, 3.5, 4], "texture": "#0"},\r "up": {"uv": [2.5, 1.5, 3, 2], "texture": "#0"},\r "down": {"uv": [3, 1.5, 3.5, 2], "texture": "#0"}\r }\r }\r ]\r }`,"assets/minecraft/models/item/white_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/white_shulker_box.json":`{\r "parent": "block/white_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/wither_skeleton_skull.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 32],\r "textures": {\r "0": "entity/skeleton/wither_skeleton"\r },\r "elements": [\r {\r "name": "Hat Layer",\r "from": [3.5, -1, 3.5],\r "to": [12.5, 8, 12.5],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, -24, 8] },\r "faces": {\r "north": { "uv": [10, 4, 12, 8], "texture": "#0" },\r "east": { "uv": [8, 4, 10, 8], "texture": "#0" },\r "south": { "uv": [14, 4, 16, 8], "texture": "#0" },\r "west": { "uv": [12, 4, 14, 8], "texture": "#0" },\r "up": { "uv": [12, 4, 10, 0], "texture": "#0" },\r "down": { "uv": [14, 0, 12, 4], "texture": "#0" }\r }\r },\r {\r "name": "Head",\r "from": [4, 0, 4],\r "to": [12, 8, 12],\r "rotation": { "angle": 0, "axis": "y", "origin": [8, -24, 8] },\r "faces": {\r "north": { "uv": [2, 4, 4, 8], "texture": "#0" },\r "east": { "uv": [0, 4, 2, 8], "texture": "#0" },\r "south": { "uv": [6, 4, 8, 8], "texture": "#0" },\r "west": { "uv": [4, 4, 6, 8], "texture": "#0" },\r "up": { "uv": [4, 4, 2, 0], "texture": "#0" },\r "down": { "uv": [6, 0, 4, 4], "texture": "#0" }\r }\r }\r ]\r }\r `,"assets/minecraft/models/item/yellow_banner.json":`{\r "parent": "item/template_banner"\r }\r `,"assets/minecraft/models/item/yellow_shulker_box.json":`{\r "parent": "block/yellow_shulker_box",\r "display": {\r "gui": {\r "rotation": [30, 45, 0],\r "translation": [0, 0, 0],\r "scale": [0.625, 0.625, 0.625]\r },\r "ground": {\r "rotation": [0, 0, 0],\r "translation": [0, 3, 0],\r "scale": [0.25, 0.25, 0.25]\r },\r "head": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [1, 1, 1]\r },\r "fixed": {\r "rotation": [0, 180, 0],\r "translation": [0, 0, 0],\r "scale": [0.5, 0.5, 0.5]\r },\r "thirdperson_righthand": {\r "rotation": [75, 315, 0],\r "translation": [0, 2.5, 0],\r "scale": [0.375, 0.375, 0.375]\r },\r "firstperson_righthand": {\r "rotation": [0, 315, 0],\r "translation": [0, 0, 0],\r "scale": [0.4, 0.4, 0.4]\r }\r }\r }\r `,"assets/minecraft/models/item/zombie_head.json":`{\r "credit": "Made with Blockbench",\r "texture_size": [64, 64],\r "textures": {\r "0": "entity/zombie/zombie"\r },\r "elements": [\r {\r "name": "Hat Layer",\r "from": [3.5, -8.5, 3.5],\r "to": [12.5, 0.5, 12.5],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -31.5, 8]},\r "faces": {\r "north": {"uv": [10, 2, 12, 4], "texture": "#0"},\r "east": {"uv": [8, 2, 10, 4], "texture": "#0"},\r "south": {"uv": [14, 2, 16, 4], "texture": "#0"},\r "west": {"uv": [12, 2, 14, 4], "texture": "#0"},\r "up": {"uv": [12, 2, 10, 0], "texture": "#0"},\r "down": {"uv": [14, 0, 12, 2], "texture": "#0"}\r }\r },\r {\r "name": "Head",\r "from": [4, -8, 4],\r "to": [12, 0, 12],\r "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]},\r "faces": {\r "north": {"uv": [2, 2, 4, 4], "texture": "#0"},\r "east": {"uv": [0, 2, 2, 4], "texture": "#0"},\r "south": {"uv": [6, 2, 8, 4], "texture": "#0"},\r "west": {"uv": [4, 2, 6, 4], "texture": "#0"},\r "up": {"uv": [4, 2, 2, 0], "texture": "#0"},\r "down": {"uv": [6, 0, 4, 2], "texture": "#0"}\r }\r }\r ]\r }`};var nc=[];function aj(t,e=ie){let n,i=new Set;function a(l){if(De(t,l)&&(t=l,n)){let c=!nc.length;for(let d of i)d[1](),nc.push(d,t);if(c){for(let d=0;d{i.delete(d),i.size===0&&n&&(n(),n=null)}}return s(o,"subscribe"),{set:a,update:r,subscribe:o}}s(aj,"writable");var J0=class{store;valueValidator;constructor(e,n){this.store=aj(e),this.valueValidator=n??(i=>i),J0.all.push(this)}get(){return this.valueValidator(Ng(this.store))}set(e){return this.store.set(this.valueValidator(e))}update(e){return this.store.update(n=>this.valueValidator(e(n)))}subscribe(e,n){return this.store.subscribe(e,n)}},ke=J0;s(ke,"Valuable"),lt(ke,"all",[]);var Vm="data:image/webp;base64,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";function che(t){let e,n,i,a,r,o,l,c=(t[6]!==""||t[7]!==0)&&rj(t);return{c(){e=L("div"),n=L("div"),n.textContent=`${A("popup.loading.loading")}`,i=J(),a=L("img"),o=J(),c&&c.c(),l=_t(),E(n,"class","text svelte-biysx8"),Ht(a.src,r=Vm)||E(a,"src",r),E(a,"alt","Running Armor Stand"),E(a,"class","svelte-biysx8"),Xe(e,"display","flex"),Xe(e,"flex-direction","row")},m(d,u){U(d,e,u),I(e,n),I(e,i),I(e,a),U(d,o,u),c&&c.m(d,u),U(d,l,u)},p(d,u){d[6]!==""||d[7]!==0?c?c.p(d,u):(c=rj(d),c.c(),c.m(l.parentNode,l)):c&&(c.d(1),c=null)},d(d){d&&z(e),d&&z(o),c&&c.d(d),d&&z(l)}}}s(che,"create_else_block");function uhe(t){let e;return{c(){e=L("div"),e.textContent=`${A("popup.loading.success")}`},m(n,i){U(n,e,i)},p:ie,d(n){n&&z(e)}}}s(uhe,"create_if_block_1");function dhe(t){let e,n=A("popup.loading.offline").split(` `).map(mhe).join("")+"";return{c(){e=L("div"),Xe(e,"display","flex"),Xe(e,"flex-direction","column")},m(i,a){U(i,e,a),e.innerHTML=n},p:ie,d(i){i&&z(e)}}}s(dhe,"create_if_block");function rj(t){let e,n,i,a;return{c(){e=L("div"),n=Re(t[6]),i=J(),a=L("progress"),a.value=t[7],E(a,"max","100"),E(a,"class","svelte-biysx8")},m(r,o){U(r,e,o),I(e,n),U(r,i,o),U(r,a,o)},p(r,o){o&64&&ct(n,r[6]),o&128&&(a.value=r[7])},d(r){r&&z(e),r&&z(i),r&&z(a)}}}s(rj,"create_if_block_2");function phe(t){let e,n;function i(o,l){return o[4]?dhe:o[5]?uhe:che}s(i,"select_block_type");let a=i(t,-1),r=a(t);return{c(){e=L("div"),r.c(),E(e,"class",n=Xi(`floating ${t[4]?"red-border":"blue-border"}`)+" svelte-biysx8")},m(o,l){U(o,e,l),r.m(e,null)},p(o,[l]){a===(a=i(o,l))&&r?r.p(o,l):(r.d(1),r=a(o),r&&(r.c(),r.m(e,null))),l&16&&n!==(n=Xi(`floating ${o[4]?"red-border":"blue-border"}`)+" svelte-biysx8")&&E(e,"class",n)},i:ie,o:ie,d(o){o&&z(e),r.d()}}}s(phe,"create_fragment");var mhe=s(t=>"

"+t+"

","func");function fhe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(_,b=>n(4,i=b)),_),"$$subscribe_offline"),o,l=ie,c=s(()=>(l(),l=rt(x,b=>n(5,o=b)),x),"$$subscribe_loaded"),d,u=ie,p=s(()=>(u(),u=rt(v,b=>n(6,d=b)),v),"$$subscribe_progressLabel"),m,f=ie,g=s(()=>(f(),f=rt(h,b=>n(7,m=b)),h),"$$subscribe_progress");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l()),t.$$.on_destroy.push(()=>u()),t.$$.on_destroy.push(()=>f());let{loaded:x}=e;c();let{offline:_}=e;r();let{progress:h}=e;g();let{progressLabel:v}=e;return p(),t.$$set=b=>{"loaded"in b&&c(n(0,x=b.loaded)),"offline"in b&&r(n(1,_=b.offline)),"progress"in b&&g(n(2,h=b.progress)),"progressLabel"in b&&p(n(3,v=b.progressLabel))},[x,_,h,v,i,o,d,m]}s(fhe,"instance");var zm=class extends Pe{constructor(e){super(),Ve(this,e,fhe,phe,De,{loaded:0,offline:1,progress:2,progressLabel:3})}};s(zm,"AnimatedJavaLoadingPopup");var oj=zm;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".floating.svelte-biysx8{position:absolute;bottom:2rem;right:2rem;background:var(--color-ui);padding:8px 16px;display:flex;align-items:center;flex-direction:column}.blue-border.svelte-biysx8{border:1px solid var(--color-accent)}.red-border.svelte-biysx8{border:1px solid var(--color-error)}.text.svelte-biysx8{margin-right:16px}img.svelte-biysx8{width:32px;height:32px;margin:-4px -10px}progress.svelte-biysx8{width:100%}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var sj=new ke(!1),lj=new ke(!1),cj=new ke(0),uj=new ke(""),kr;function dj(){kr||(kr=Gn({component:oj,props:{loaded:sj,offline:lj,progress:cj,progressLabel:uj},target:document.body}))}s(dj,"showLoadingPopup");function pj(){kr&&(sj.set(!0),setTimeout(()=>{kr&&(kr.$destroy(),kr=void 0)},2e3))}s(pj,"hideLoadingPopup");function G0(){kr&&(lj.set(!0),setTimeout(()=>{kr&&(kr.$destroy(),kr=void 0)},1e4))}s(G0,"showOfflineError");function mj(t){cj.set(t)}s(mj,"updateLoadingProgress");function fj(t){uj.set(t)}s(fj,"updateLoadingProgressLabel");function hj(t){var e=t.slice(0,2);return e.length===2&&e[0]===31&&e[1]===139}s(hj,"hasGzipHeader");function gj(t){let e=t.slice(0,2);return e.length===2&&e[0]===120&&(e[1]===1||e[1]===94||e[1]===156||e[2]===218)}s(gj,"hasZlibHeader");function _j(t){let e=t.slice(0,8),n=new DataView(e.buffer,e.byteOffset),i=n.getUint32(0,!0),a=n.getUint32(4,!0);if(e.length===8&&i>0&&i<100&&a===t.byteLength-8)return i}s(_j,"getBedrockHeader");function xj(t){var e=[],n,i;for(n=0;n>6),e.push(128|i&63)):i<65536?(e.push(224|i>>12),e.push(128|i>>6&63),e.push(128|i&63)):(e.push(240|i>>18&7),e.push(128|i>>12&63),e.push(128|i>>6&63),e.push(128|i&63));return e}s(xj,"encodeUTF8");function vj(t){var e=[],n;for(n=0;n=n)return;let i=this.buffer.byteLength;for(;ithis.buffer.byteLength&&r.fill(0,this.buffer.byteLength,this.offset),this.buffer=a,this.view=new DataView(a),this.array=r}writeNumber(e,n,i){this.accommodate(n),this.view[e](this.offset,i,this.littleEndian),this.offset+=n}writeByte=this.writeNumber.bind(this,"setInt8",1);writeShort=this.writeNumber.bind(this,"setInt16",2);writeInt=this.writeNumber.bind(this,"setInt32",4);writeFloat=this.writeNumber.bind(this,"setFloat32",4);writeDouble=this.writeNumber.bind(this,"setFloat64",8);writeBytes(e){this.accommodate(e.length),this.array.set(e,this.offset),this.offset+=e.length}writeString(e){let n=xj(e);this.writeShort(n.length),this.writeBytes(n)}getData(){return this.accommodate(0),this.array.slice(0,this.offset)}};s(Ku,"RawDataOutput");var ut;(function(t){function e(p){return typeof p=="number"?p:void 0}s(e,"readNumber"),t.readNumber=e;function n(p){return typeof p=="number"?Math.floor(p):void 0}s(n,"readInt"),t.readInt=n;function i(p){return typeof p=="string"?p:void 0}s(i,"readString"),t.readString=i;function a(p){return typeof p=="boolean"?p:void 0}s(a,"readBoolean"),t.readBoolean=a;function r(p){return typeof p=="object"&&p!==null&&!Array.isArray(p)?p:void 0}s(r,"readObject"),t.readObject=r;function o(p,m){if(Array.isArray(p))return m?p.map(f=>m(f)):p}s(o,"readArray"),t.readArray=o;function l(p,m){if(Array.isArray(p))return[0,1].map(f=>m(p[f]))}s(l,"readPair"),t.readPair=l;function c(p,m){let f=r(p)??{};return Object.fromEntries(Object.entries(f).map(([g,x])=>[g,m(x)]))}s(c,"readMap"),t.readMap=c;function d(p,m,f){let g=m(p);return g?f(g):void 0}s(d,"compose"),t.compose=d;function u(p,m){return typeof p!="string"?m[0]:m.includes(p)?p:m[0]}s(u,"readEnum"),t.readEnum=u})(ut||(ut={}));var ci=class{source;cursor;constructor(e){this.source=e,this.cursor=0}get remainingLength(){return this.source.length-this.cursor}get totalLength(){return this.source.length}getRead(e=0){return this.source.substring(e,this.cursor)}getRemaining(){return this.source.substring(this.cursor)}canRead(e=1){return this.cursor+e<=this.source.length}peek(e=0){return this.source.charAt(this.cursor+e)}read(){return this.source.charAt(this.cursor++)}skip(){this.cursor+=1}skipWhitespace(){for(;this.canRead()&&ci.isWhitespace(this.peek());)this.skip()}expect(e,n=!1){if(n&&this.skipWhitespace(),!this.canRead()||this.peek()!==e)throw this.createError(`Expected '${e}'`);this.skip()}readInt(){let e=this.cursor;for(;this.canRead()&&ci.isAllowedInNumber(this.peek());)this.skip();let n=this.getRead(e);if(n.length===0)throw this.createError("Expected integer");try{let i=Number(n);if(isNaN(i)||!Number.isInteger(i))throw new Error;return i}catch{throw this.cursor=e,this.createError(`Invalid integer '${n}'`)}}readFloat(){let e=this.cursor;for(;this.canRead()&&ci.isAllowedInNumber(this.peek());)this.skip();let n=this.getRead(e);if(n.length===0)throw this.createError("Expected float");try{let i=Number(n);if(isNaN(i))throw new Error;return i}catch{throw this.cursor=e,this.createError(`Invalid float '${n}'`)}}readUnquotedString(){let e=this.cursor;for(;this.canRead()&&ci.isAllowedInUnquotedString(this.peek());)this.skip();return this.getRead(e)}readQuotedString(){if(!this.canRead())return"";let e=this.peek();if(!ci.isQuotedStringStart(e))throw this.createError("Expected quote to start a string");return this.skip(),this.readStringUntil(e)}readString(){if(!this.canRead())return"";let e=this.peek();return ci.isQuotedStringStart(e)?(this.skip(),this.readStringUntil(e)):this.readUnquotedString()}readStringUntil(e){let n=[],i=!1;for(;this.canRead();){let a=this.read();if(i)if(a===e||a==="\\")n.push(a),i=!1;else throw this.cursor-=1,this.createError(`Invalid escape sequence '${a}' in quoted string`);else if(a==="\\")i=!0;else{if(a===e)return n.join("");n.push(a)}}throw this.createError("Unclosed quoted string")}readBoolean(){let e=this.cursor,n=this.readUnquotedString();if(n.length===0)throw this.createError("Expected bool");if(n==="true")return!0;if(n==="false")return!1;throw this.cursor=e,this.createError(`Invalid bool, expected true or false but found '${n}'`)}static isAllowedInNumber(e){return e>="0"&&e<="9"||e==="."||e==="-"}static isAllowedInUnquotedString(e){return e>="0"&&e<="9"||e>="A"&&e<="Z"||e>="a"&&e<="z"||e==="_"||e==="-"||e==="."||e==="+"}static isQuotedStringStart(e){return e==="'"||e==='"'}static isWhitespace(e){return e===" "||e===" "||e===` `||e==="\r"}createError(e){let n=Math.min(this.source.length,this.cursor),i=(n>10?"...":"")+this.source.substring(Math.max(0,n-10),n);return new Error(`${e} at position ${this.cursor}: ${i}<--[HERE]`)}};s(ci,"StringReader");function lc(t){let e=t.length;for(;--e>=0;)t[e]=0}s(lc,"zero$1");var hhe=0,aA=1,ghe=2,_he=3,xhe=258,gx=29,cd=256,td=cd+1+gx,rc=30,_x=19,rA=2*td+1,Bs=15,W0=16,vhe=7,xx=256,oA=16,sA=17,lA=18,sx=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),Wm=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),bhe=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),cA=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),yhe=512,ho=new Array((td+2)*2);lc(ho);var Qu=new Array(rc*2);lc(Qu);var nd=new Array(yhe);lc(nd);var id=new Array(xhe-_he+1);lc(id);var vx=new Array(gx);lc(vx);var Km=new Array(rc);lc(Km);function K0(t,e,n,i,a){this.static_tree=t,this.extra_bits=e,this.extra_base=n,this.elems=i,this.max_length=a,this.has_stree=t&&t.length}s(K0,"StaticTreeDesc");var uA,dA,pA;function Y0(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}s(Y0,"TreeDesc");var mA=s(t=>t<256?nd[t]:nd[256+(t>>>7)],"d_code"),ad=s((t,e)=>{t.pending_buf[t.pending++]=e&255,t.pending_buf[t.pending++]=e>>>8&255},"put_short"),Ri=s((t,e,n)=>{t.bi_valid>W0-n?(t.bi_buf|=e<>W0-t.bi_valid,t.bi_valid+=n-W0):(t.bi_buf|=e<{Ri(t,n[e*2],n[e*2+1])},"send_code"),fA=s((t,e)=>{let n=0;do n|=t&1,t>>>=1,n<<=1;while(--e>0);return n>>>1},"bi_reverse"),whe=s(t=>{t.bi_valid===16?(ad(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=t.bi_buf&255,t.bi_buf>>=8,t.bi_valid-=8)},"bi_flush"),Ehe=s((t,e)=>{let n=e.dyn_tree,i=e.max_code,a=e.stat_desc.static_tree,r=e.stat_desc.has_stree,o=e.stat_desc.extra_bits,l=e.stat_desc.extra_base,c=e.stat_desc.max_length,d,u,p,m,f,g,x=0;for(m=0;m<=Bs;m++)t.bl_count[m]=0;for(n[t.heap[t.heap_max]*2+1]=0,d=t.heap_max+1;dc&&(m=c,x++),n[u*2+1]=m,!(u>i)&&(t.bl_count[m]++,f=0,u>=l&&(f=o[u-l]),g=n[u*2],t.opt_len+=g*(m+f),r&&(t.static_len+=g*(a[u*2+1]+f)));if(x!==0){do{for(m=c-1;t.bl_count[m]===0;)m--;t.bl_count[m]--,t.bl_count[m+1]+=2,t.bl_count[c]--,x-=2}while(x>0);for(m=c;m!==0;m--)for(u=t.bl_count[m];u!==0;)p=t.heap[--d],!(p>i)&&(n[p*2+1]!==m&&(t.opt_len+=(m-n[p*2+1])*n[p*2],n[p*2+1]=m),u--)}},"gen_bitlen"),hA=s((t,e,n)=>{let i=new Array(Bs+1),a=0,r,o;for(r=1;r<=Bs;r++)a=a+n[r-1]<<1,i[r]=a;for(o=0;o<=e;o++){let l=t[o*2+1];l!==0&&(t[o*2]=fA(i[l]++,l))}},"gen_codes"),khe=s(()=>{let t,e,n,i,a,r=new Array(Bs+1);for(n=0,i=0;i>=7;i{let e;for(e=0;e{t.bi_valid>8?ad(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},"bi_windup"),bj=s((t,e,n,i)=>{let a=e*2,r=n*2;return t[a]{let i=t.heap[n],a=n<<1;for(;a<=t.heap_len&&(a{let i,a,r=0,o,l;if(t.sym_next!==0)do i=t.pending_buf[t.sym_buf+r++]&255,i+=(t.pending_buf[t.sym_buf+r++]&255)<<8,a=t.pending_buf[t.sym_buf+r++],i===0?Ar(t,a,e):(o=id[a],Ar(t,o+cd+1,e),l=sx[o],l!==0&&(a-=vx[o],Ri(t,a,l)),i--,o=mA(i),Ar(t,o,n),l=Wm[o],l!==0&&(i-=Km[o],Ri(t,i,l)));while(r{let n=e.dyn_tree,i=e.stat_desc.static_tree,a=e.stat_desc.has_stree,r=e.stat_desc.elems,o,l,c=-1,d;for(t.heap_len=0,t.heap_max=rA,o=0;o>1;o>=1;o--)X0(t,n,o);d=r;do o=t.heap[1],t.heap[1]=t.heap[t.heap_len--],X0(t,n,1),l=t.heap[1],t.heap[--t.heap_max]=o,t.heap[--t.heap_max]=l,n[d*2]=n[o*2]+n[l*2],t.depth[d]=(t.depth[o]>=t.depth[l]?t.depth[o]:t.depth[l])+1,n[o*2+1]=n[l*2+1]=d,t.heap[1]=d++,X0(t,n,1);while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],Ehe(t,e),hA(n,c,t.bl_count)},"build_tree"),wj=s((t,e,n)=>{let i,a=-1,r,o=e[0*2+1],l=0,c=7,d=4;for(o===0&&(c=138,d=3),e[(n+1)*2+1]=65535,i=0;i<=n;i++)r=o,o=e[(i+1)*2+1],!(++l{let i,a=-1,r,o=e[0*2+1],l=0,c=7,d=4;for(o===0&&(c=138,d=3),i=0;i<=n;i++)if(r=o,o=e[(i+1)*2+1],!(++l{let e;for(wj(t,t.dyn_ltree,t.l_desc.max_code),wj(t,t.dyn_dtree,t.d_desc.max_code),lx(t,t.bl_desc),e=_x-1;e>=3&&t.bl_tree[cA[e]*2+1]===0;e--);return t.opt_len+=3*(e+1)+5+5+4,e},"build_bl_tree"),Ahe=s((t,e,n,i)=>{let a;for(Ri(t,e-257,5),Ri(t,n-1,5),Ri(t,i-4,4),a=0;a{let e=4093624447,n;for(n=0;n<=31;n++,e>>>=1)if(e&1&&t.dyn_ltree[n*2]!==0)return 0;if(t.dyn_ltree[9*2]!==0||t.dyn_ltree[10*2]!==0||t.dyn_ltree[13*2]!==0)return 1;for(n=32;n{kj||(khe(),kj=!0),t.l_desc=new Y0(t.dyn_ltree,uA),t.d_desc=new Y0(t.dyn_dtree,dA),t.bl_desc=new Y0(t.bl_tree,pA),t.bi_buf=0,t.bi_valid=0,gA(t)},"_tr_init$1"),xA=s((t,e,n,i)=>{Ri(t,(hhe<<1)+(i?1:0),3),_A(t),ad(t,n),ad(t,~n),n&&t.pending_buf.set(t.window.subarray(e,e+n),t.pending),t.pending+=n},"_tr_stored_block$1"),She=s(t=>{Ri(t,aA<<1,3),Ar(t,xx,ho),whe(t)},"_tr_align$1"),Ohe=s((t,e,n,i)=>{let a,r,o=0;t.level>0?(t.strm.data_type===2&&(t.strm.data_type=The(t)),lx(t,t.l_desc),lx(t,t.d_desc),o=jhe(t),a=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=a&&(a=r)):a=r=n+5,n+4<=a&&e!==-1?xA(t,e,n,i):t.strategy===4||r===a?(Ri(t,(aA<<1)+(i?1:0),3),yj(t,ho,Qu)):(Ri(t,(ghe<<1)+(i?1:0),3),Ahe(t,t.l_desc.max_code+1,t.d_desc.max_code+1,o+1),yj(t,t.dyn_ltree,t.dyn_dtree)),gA(t),i&&_A(t)},"_tr_flush_block$1"),Ihe=s((t,e,n)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=n,e===0?t.dyn_ltree[n*2]++:(t.matches++,e--,t.dyn_ltree[(id[n]+cd+1)*2]++,t.dyn_dtree[mA(e)*2]++),t.sym_next===t.sym_end),"_tr_tally$1"),Dhe=Che,Fhe=xA,Nhe=Ohe,Rhe=Ihe,Mhe=She,Bhe={_tr_init:Dhe,_tr_stored_block:Fhe,_tr_flush_block:Nhe,_tr_tally:Rhe,_tr_align:Mhe},Phe=s((t,e,n,i)=>{let a=t&65535|0,r=t>>>16&65535|0,o=0;for(;n!==0;){o=n>2e3?2e3:n,n-=o;do a=a+e[i++]|0,r=r+a|0;while(--o);a%=65521,r%=65521}return a|r<<16|0},"adler32"),rd=Phe,Lhe=s(()=>{let t,e=[];for(var n=0;n<256;n++){t=n;for(var i=0;i<8;i++)t=t&1?3988292384^t>>>1:t>>>1;e[n]=t}return e},"makeTable"),Vhe=new Uint32Array(Lhe()),zhe=s((t,e,n,i)=>{let a=Vhe,r=i+n;t^=-1;for(let o=i;o>>8^a[(t^e[o])&255];return t^-1},"crc32"),Kn=zhe,Vs={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},qs={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},{_tr_init:Uhe,_tr_stored_block:cx,_tr_flush_block:qhe,_tr_tally:Ho,_tr_align:Hhe}=Bhe,{Z_NO_FLUSH:Jo,Z_PARTIAL_FLUSH:Jhe,Z_FULL_FLUSH:Ghe,Z_FINISH:fa,Z_BLOCK:jj,Z_OK:ui,Z_STREAM_END:Aj,Z_STREAM_ERROR:Tr,Z_DATA_ERROR:Whe,Z_BUF_ERROR:Z0,Z_DEFAULT_COMPRESSION:Khe,Z_FILTERED:Yhe,Z_HUFFMAN_ONLY:Um,Z_RLE:Xhe,Z_FIXED:Zhe,Z_DEFAULT_STRATEGY:Qhe,Z_UNKNOWN:$he,Z_DEFLATED:Zm}=qs,ege=9,tge=15,nge=8,ige=29,age=256,ux=age+1+ige,rge=30,oge=19,sge=2*ux+1,lge=15,It=3,qo=258,Cr=qo+It+1,cge=32,oc=42,bx=57,dx=69,px=73,mx=91,fx=103,Ps=113,Xu=666,ji=1,cc=2,zs=3,uc=4,uge=3,Ls=s((t,e)=>(t.msg=Vs[e],e),"err"),Tj=s(t=>t*2-(t>4?9:0),"rank"),Uo=s(t=>{let e=t.length;for(;--e>=0;)t[e]=0},"zero"),dge=s(t=>{let e,n,i,a=t.w_size;e=t.hash_size,i=e;do n=t.head[--i],t.head[i]=n>=a?n-a:0;while(--e);e=a,i=e;do n=t.prev[--i],t.prev[i]=n>=a?n-a:0;while(--e)},"slide_hash"),pge=s((t,e,n)=>(e<{let e=t.state,n=e.pending;n>t.avail_out&&(n=t.avail_out),n!==0&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+n),t.next_out),t.next_out+=n,e.pending_out+=n,t.total_out+=n,t.avail_out-=n,e.pending-=n,e.pending===0&&(e.pending_out=0))},"flush_pending"),na=s((t,e)=>{qhe(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,ta(t.strm)},"flush_block_only"),Vt=s((t,e)=>{t.pending_buf[t.pending++]=e},"put_byte"),Yu=s((t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=e&255},"putShortMSB"),hx=s((t,e,n,i)=>{let a=t.avail_in;return a>i&&(a=i),a===0?0:(t.avail_in-=a,e.set(t.input.subarray(t.next_in,t.next_in+a),n),t.state.wrap===1?t.adler=rd(t.adler,e,a,n):t.state.wrap===2&&(t.adler=Kn(t.adler,e,a,n)),t.next_in+=a,t.total_in+=a,a)},"read_buf"),vA=s((t,e)=>{let n=t.max_chain_length,i=t.strstart,a,r,o=t.prev_length,l=t.nice_match,c=t.strstart>t.w_size-Cr?t.strstart-(t.w_size-Cr):0,d=t.window,u=t.w_mask,p=t.prev,m=t.strstart+qo,f=d[i+o-1],g=d[i+o];t.prev_length>=t.good_match&&(n>>=2),l>t.lookahead&&(l=t.lookahead);do if(a=e,!(d[a+o]!==g||d[a+o-1]!==f||d[a]!==d[i]||d[++a]!==d[i+1])){i+=2,a++;do;while(d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&io){if(t.match_start=e,o=r,r>=l)break;f=d[i+o-1],g=d[i+o]}}while((e=p[e&u])>c&&--n!==0);return o<=t.lookahead?o:t.lookahead},"longest_match"),sc=s(t=>{let e=t.w_size,n,i,a;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Cr)&&(t.window.set(t.window.subarray(e,e+e-i),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),dge(t),i+=e),t.strm.avail_in===0)break;if(n=hx(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=It)for(a=t.strstart-t.insert,t.ins_h=t.window[a],t.ins_h=Go(t,t.ins_h,t.window[a+1]);t.insert&&(t.ins_h=Go(t,t.ins_h,t.window[a+It-1]),t.prev[a&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=a,a++,t.insert--,!(t.lookahead+t.insert{let n=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,i,a,r,o=0,l=t.strm.avail_in;do{if(i=65535,r=t.bi_valid+42>>3,t.strm.avail_outa+t.strm.avail_in&&(i=a+t.strm.avail_in),i>r&&(i=r),i>8,t.pending_buf[t.pending-2]=~i,t.pending_buf[t.pending-1]=~i>>8,ta(t.strm),a&&(a>i&&(a=i),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+a),t.strm.next_out),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a,t.block_start+=a,i-=a),i&&(hx(t.strm,t.strm.output,t.strm.next_out,i),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i)}while(o===0);return l-=t.strm.avail_in,l&&(l>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=l&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-l,t.strm.next_in),t.strstart),t.strstart+=l,t.insert+=l>t.w_size-t.insert?t.w_size-t.insert:l),t.block_start=t.strstart),t.high_waterr&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,r+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),r>t.strm.avail_in&&(r=t.strm.avail_in),r&&(hx(t.strm,t.window,t.strstart,r),t.strstart+=r,t.insert+=r>t.w_size-t.insert?t.w_size-t.insert:r),t.high_water>3,r=t.pending_buf_size-r>65535?65535:t.pending_buf_size-r,n=r>t.w_size?t.w_size:r,a=t.strstart-t.block_start,(a>=n||(a||e===fa)&&e!==Jo&&t.strm.avail_in===0&&a<=r)&&(i=a>r?r:a,o=e===fa&&t.strm.avail_in===0&&i===a?1:0,cx(t,t.block_start,i,o),t.block_start+=i,ta(t.strm)),o?zs:ji)},"deflate_stored"),Q0=s((t,e)=>{let n,i;for(;;){if(t.lookahead=It&&(t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),n!==0&&t.strstart-n<=t.w_size-Cr&&(t.match_length=vA(t,n)),t.match_length>=It)if(i=Ho(t,t.strstart-t.match_start,t.match_length-It),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=It){t.match_length--;do t.strstart++,t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart;while(--t.match_length!==0);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=Go(t,t.ins_h,t.window[t.strstart+1]);else i=Ho(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(i&&(na(t,!1),t.strm.avail_out===0))return ji}return t.insert=t.strstart{let n,i,a;for(;;){if(t.lookahead=It&&(t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=It-1,n!==0&&t.prev_length4096)&&(t.match_length=It-1)),t.prev_length>=It&&t.match_length<=t.prev_length){a=t.strstart+t.lookahead-It,i=Ho(t,t.strstart-1-t.prev_match,t.prev_length-It),t.lookahead-=t.prev_length-1,t.prev_length-=2;do++t.strstart<=a&&(t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart);while(--t.prev_length!==0);if(t.match_available=0,t.match_length=It-1,t.strstart++,i&&(na(t,!1),t.strm.avail_out===0))return ji}else if(t.match_available){if(i=Ho(t,0,t.window[t.strstart-1]),i&&na(t,!1),t.strstart++,t.lookahead--,t.strm.avail_out===0)return ji}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(i=Ho(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart{let n,i,a,r,o=t.window;for(;;){if(t.lookahead<=qo){if(sc(t),t.lookahead<=qo&&e===Jo)return ji;if(t.lookahead===0)break}if(t.match_length=0,t.lookahead>=It&&t.strstart>0&&(a=t.strstart-1,i=o[a],i===o[++a]&&i===o[++a]&&i===o[++a])){r=t.strstart+qo;do;while(i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&at.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=It?(n=Ho(t,1,t.match_length-It),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(n=Ho(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),n&&(na(t,!1),t.strm.avail_out===0))return ji}return t.insert=0,e===fa?(na(t,!0),t.strm.avail_out===0?zs:uc):t.sym_next&&(na(t,!1),t.strm.avail_out===0)?ji:cc},"deflate_rle"),fge=s((t,e)=>{let n;for(;;){if(t.lookahead===0&&(sc(t),t.lookahead===0)){if(e===Jo)return ji;break}if(t.match_length=0,n=Ho(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,n&&(na(t,!1),t.strm.avail_out===0))return ji}return t.insert=0,e===fa?(na(t,!0),t.strm.avail_out===0?zs:uc):t.sym_next&&(na(t,!1),t.strm.avail_out===0)?ji:cc},"deflate_huff");function jr(t,e,n,i,a){this.good_length=t,this.max_lazy=e,this.nice_length=n,this.max_chain=i,this.func=a}s(jr,"Config");var Zu=[new jr(0,0,0,0,bA),new jr(4,4,8,4,Q0),new jr(4,5,16,8,Q0),new jr(4,6,32,32,Q0),new jr(4,4,16,16,ic),new jr(8,16,32,32,ic),new jr(8,16,128,128,ic),new jr(8,32,128,256,ic),new jr(32,128,258,1024,ic),new jr(32,258,258,4096,ic)],hge=s(t=>{t.window_size=2*t.w_size,Uo(t.head),t.max_lazy_match=Zu[t.level].max_lazy,t.good_match=Zu[t.level].good_length,t.nice_match=Zu[t.level].nice_length,t.max_chain_length=Zu[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=It-1,t.match_available=0,t.ins_h=0},"lm_init");function gge(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Zm,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(sge*2),this.dyn_dtree=new Uint16Array((2*rge+1)*2),this.bl_tree=new Uint16Array((2*oge+1)*2),Uo(this.dyn_ltree),Uo(this.dyn_dtree),Uo(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(lge+1),this.heap=new Uint16Array(2*ux+1),Uo(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(2*ux+1),Uo(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}s(gge,"DeflateState");var ud=s(t=>{if(!t)return 1;let e=t.state;return!e||e.strm!==t||e.status!==oc&&e.status!==bx&&e.status!==dx&&e.status!==px&&e.status!==mx&&e.status!==fx&&e.status!==Ps&&e.status!==Xu?1:0},"deflateStateCheck"),yA=s(t=>{if(ud(t))return Ls(t,Tr);t.total_in=t.total_out=0,t.data_type=$he;let e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap===2?bx:e.wrap?oc:Ps,t.adler=e.wrap===2?0:1,e.last_flush=-2,Uhe(e),ui},"deflateResetKeep"),wA=s(t=>{let e=yA(t);return e===ui&&hge(t.state),e},"deflateReset"),_ge=s((t,e)=>ud(t)||t.state.wrap!==2?Tr:(t.state.gzhead=e,ui),"deflateSetHeader"),EA=s((t,e,n,i,a,r)=>{if(!t)return Tr;let o=1;if(e===Khe&&(e=6),i<0?(o=0,i=-i):i>15&&(o=2,i-=16),a<1||a>ege||n!==Zm||i<8||i>15||e<0||e>9||r<0||r>Zhe||i===8&&o!==1)return Ls(t,Tr);i===8&&(i=9);let l=new gge;return t.state=l,l.strm=t,l.status=oc,l.wrap=o,l.gzhead=null,l.w_bits=i,l.w_size=1<EA(t,e,Zm,tge,nge,Qhe),"deflateInit"),vge=s((t,e)=>{if(ud(t)||e>jj||e<0)return t?Ls(t,Tr):Tr;let n=t.state;if(!t.output||t.avail_in!==0&&!t.input||n.status===Xu&&e!==fa)return Ls(t,t.avail_out===0?Z0:Tr);let i=n.last_flush;if(n.last_flush=e,n.pending!==0){if(ta(t),t.avail_out===0)return n.last_flush=-1,ui}else if(t.avail_in===0&&Tj(e)<=Tj(i)&&e!==fa)return Ls(t,Z0);if(n.status===Xu&&t.avail_in!==0)return Ls(t,Z0);if(n.status===oc&&n.wrap===0&&(n.status=Ps),n.status===oc){let a=Zm+(n.w_bits-8<<4)<<8,r=-1;if(n.strategy>=Um||n.level<2?r=0:n.level<6?r=1:n.level===6?r=2:r=3,a|=r<<6,n.strstart!==0&&(a|=cge),a+=31-a%31,Yu(n,a),n.strstart!==0&&(Yu(n,t.adler>>>16),Yu(n,t.adler&65535)),t.adler=1,n.status=Ps,ta(t),n.pending!==0)return n.last_flush=-1,ui}if(n.status===bx){if(t.adler=0,Vt(n,31),Vt(n,139),Vt(n,8),n.gzhead)Vt(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),Vt(n,n.gzhead.time&255),Vt(n,n.gzhead.time>>8&255),Vt(n,n.gzhead.time>>16&255),Vt(n,n.gzhead.time>>24&255),Vt(n,n.level===9?2:n.strategy>=Um||n.level<2?4:0),Vt(n,n.gzhead.os&255),n.gzhead.extra&&n.gzhead.extra.length&&(Vt(n,n.gzhead.extra.length&255),Vt(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(t.adler=Kn(t.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=dx;else if(Vt(n,0),Vt(n,0),Vt(n,0),Vt(n,0),Vt(n,0),Vt(n,n.level===9?2:n.strategy>=Um||n.level<2?4:0),Vt(n,uge),n.status=Ps,ta(t),n.pending!==0)return n.last_flush=-1,ui}if(n.status===dx){if(n.gzhead.extra){let a=n.pending,r=(n.gzhead.extra.length&65535)-n.gzindex;for(;n.pending+r>n.pending_buf_size;){let l=n.pending_buf_size-n.pending;if(n.pending_buf.set(n.gzhead.extra.subarray(n.gzindex,n.gzindex+l),n.pending),n.pending=n.pending_buf_size,n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),n.gzindex+=l,ta(t),n.pending!==0)return n.last_flush=-1,ui;a=0,r-=l}let o=new Uint8Array(n.gzhead.extra);n.pending_buf.set(o.subarray(n.gzindex,n.gzindex+r),n.pending),n.pending+=r,n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),n.gzindex=0}n.status=px}if(n.status===px){if(n.gzhead.name){let a=n.pending,r;do{if(n.pending===n.pending_buf_size){if(n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),ta(t),n.pending!==0)return n.last_flush=-1,ui;a=0}n.gzindexa&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),n.gzindex=0}n.status=mx}if(n.status===mx){if(n.gzhead.comment){let a=n.pending,r;do{if(n.pending===n.pending_buf_size){if(n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),ta(t),n.pending!==0)return n.last_flush=-1,ui;a=0}n.gzindexa&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a))}n.status=fx}if(n.status===fx){if(n.gzhead.hcrc){if(n.pending+2>n.pending_buf_size&&(ta(t),n.pending!==0))return n.last_flush=-1,ui;Vt(n,t.adler&255),Vt(n,t.adler>>8&255),t.adler=0}if(n.status=Ps,ta(t),n.pending!==0)return n.last_flush=-1,ui}if(t.avail_in!==0||n.lookahead!==0||e!==Jo&&n.status!==Xu){let a=n.level===0?bA(n,e):n.strategy===Um?fge(n,e):n.strategy===Xhe?mge(n,e):Zu[n.level].func(n,e);if((a===zs||a===uc)&&(n.status=Xu),a===ji||a===zs)return t.avail_out===0&&(n.last_flush=-1),ui;if(a===cc&&(e===Jhe?Hhe(n):e!==jj&&(cx(n,0,0,!1),e===Ghe&&(Uo(n.head),n.lookahead===0&&(n.strstart=0,n.block_start=0,n.insert=0))),ta(t),t.avail_out===0))return n.last_flush=-1,ui}return e!==fa?ui:n.wrap<=0?Aj:(n.wrap===2?(Vt(n,t.adler&255),Vt(n,t.adler>>8&255),Vt(n,t.adler>>16&255),Vt(n,t.adler>>24&255),Vt(n,t.total_in&255),Vt(n,t.total_in>>8&255),Vt(n,t.total_in>>16&255),Vt(n,t.total_in>>24&255)):(Yu(n,t.adler>>>16),Yu(n,t.adler&65535)),ta(t),n.wrap>0&&(n.wrap=-n.wrap),n.pending!==0?ui:Aj)},"deflate$2"),bge=s(t=>{if(ud(t))return Tr;let e=t.state.status;return t.state=null,e===Ps?Ls(t,Whe):ui},"deflateEnd"),yge=s((t,e)=>{let n=e.length;if(ud(t))return Tr;let i=t.state,a=i.wrap;if(a===2||a===1&&i.status!==oc||i.lookahead)return Tr;if(a===1&&(t.adler=rd(t.adler,e,n,0)),i.wrap=0,n>=i.w_size){a===0&&(Uo(i.head),i.strstart=0,i.block_start=0,i.insert=0);let c=new Uint8Array(i.w_size);c.set(e.subarray(n-i.w_size,n),0),e=c,n=i.w_size}let r=t.avail_in,o=t.next_in,l=t.input;for(t.avail_in=n,t.next_in=0,t.input=e,sc(i);i.lookahead>=It;){let c=i.strstart,d=i.lookahead-(It-1);do i.ins_h=Go(i,i.ins_h,i.window[c+It-1]),i.prev[c&i.w_mask]=i.head[i.ins_h],i.head[i.ins_h]=c,c++;while(--d);i.strstart=c,i.lookahead=It-1,sc(i)}return i.strstart+=i.lookahead,i.block_start=i.strstart,i.insert=i.lookahead,i.lookahead=0,i.match_length=i.prev_length=It-1,i.match_available=0,t.next_in=o,t.input=l,t.avail_in=r,i.wrap=a,ui},"deflateSetDictionary"),wge=xge,Ege=EA,kge=wA,jge=yA,Age=_ge,Tge=vge,Cge=bge,Sge=yge,Oge="pako deflate (from Nodeca project)",$u={deflateInit:wge,deflateInit2:Ege,deflateReset:kge,deflateResetKeep:jge,deflateSetHeader:Age,deflate:Tge,deflateEnd:Cge,deflateSetDictionary:Sge,deflateInfo:Oge},Ige=s((t,e)=>Object.prototype.hasOwnProperty.call(t,e),"_has"),Dge=s(function(t){let e=Array.prototype.slice.call(arguments,1);for(;e.length;){let n=e.shift();if(n){if(typeof n!="object")throw new TypeError(n+"must be non-object");for(let i in n)Ige(n,i)&&(t[i]=n[i])}}return t},"assign"),Fge=s(t=>{let e=0;for(let i=0,a=t.length;i=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;od[254]=od[254]=1;var Nge=s(t=>{if(typeof TextEncoder=="function"&&TextEncoder.prototype.encode)return new TextEncoder().encode(t);let e,n,i,a,r,o=t.length,l=0;for(a=0;a>>6,e[r++]=128|n&63):n<65536?(e[r++]=224|n>>>12,e[r++]=128|n>>>6&63,e[r++]=128|n&63):(e[r++]=240|n>>>18,e[r++]=128|n>>>12&63,e[r++]=128|n>>>6&63,e[r++]=128|n&63);return e},"string2buf"),Rge=s((t,e)=>{if(e<65534&&t.subarray&&kA)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let n="";for(let i=0;i{let n=e||t.length;if(typeof TextDecoder=="function"&&TextDecoder.prototype.decode)return new TextDecoder().decode(t.subarray(0,e));let i,a,r=new Array(n*2);for(a=0,i=0;i4){r[a++]=65533,i+=l-1;continue}for(o&=l===2?31:l===3?15:7;l>1&&i1){r[a++]=65533;continue}o<65536?r[a++]=o:(o-=65536,r[a++]=55296|o>>10&1023,r[a++]=56320|o&1023)}return Rge(r,a)},"buf2string"),Bge=s((t,e)=>{e=e||t.length,e>t.length&&(e=t.length);let n=e-1;for(;n>=0&&(t[n]&192)===128;)n--;return n<0||n===0?e:n+od[t[n]]>e?n:e},"utf8border"),sd={string2buf:Nge,buf2string:Mge,utf8border:Bge};function Pge(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}s(Pge,"ZStream");var jA=Pge,AA=Object.prototype.toString,{Z_NO_FLUSH:Lge,Z_SYNC_FLUSH:Vge,Z_FULL_FLUSH:zge,Z_FINISH:Uge,Z_OK:Ym,Z_STREAM_END:qge,Z_DEFAULT_COMPRESSION:Hge,Z_DEFAULT_STRATEGY:Jge,Z_DEFLATED:Gge}=qs;function dd(t){this.options=Qm.assign({level:Hge,method:Gge,chunkSize:16384,windowBits:15,memLevel:8,strategy:Jge},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new jA,this.strm.avail_out=0;let n=$u.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(n!==Ym)throw new Error(Vs[n]);if(e.header&&$u.deflateSetHeader(this.strm,e.header),e.dictionary){let i;if(typeof e.dictionary=="string"?i=sd.string2buf(e.dictionary):AA.call(e.dictionary)==="[object ArrayBuffer]"?i=new Uint8Array(e.dictionary):i=e.dictionary,n=$u.deflateSetDictionary(this.strm,i),n!==Ym)throw new Error(Vs[n]);this._dict_set=!0}}s(dd,"Deflate$1");dd.prototype.push=function(t,e){let n=this.strm,i=this.options.chunkSize,a,r;if(this.ended)return!1;for(e===~~e?r=e:r=e===!0?Uge:Lge,typeof t=="string"?n.input=sd.string2buf(t):AA.call(t)==="[object ArrayBuffer]"?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;;){if(n.avail_out===0&&(n.output=new Uint8Array(i),n.next_out=0,n.avail_out=i),(r===Vge||r===zge)&&n.avail_out<=6){this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;continue}if(a=$u.deflate(n,r),a===qge)return n.next_out>0&&this.onData(n.output.subarray(0,n.next_out)),a=$u.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===Ym;if(n.avail_out===0){this.onData(n.output);continue}if(r>0&&n.next_out>0){this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;continue}if(n.avail_in===0)break}return!0};dd.prototype.onData=function(t){this.chunks.push(t)};dd.prototype.onEnd=function(t){t===Ym&&(this.result=Qm.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};function yx(t,e){let n=new dd(e);if(n.push(t,!0),n.err)throw n.msg||Vs[n.err];return n.result}s(yx,"deflate$1");function Wge(t,e){return e=e||{},e.raw=!0,yx(t,e)}s(Wge,"deflateRaw$1");function Kge(t,e){return e=e||{},e.gzip=!0,yx(t,e)}s(Kge,"gzip$1");var Yge=dd,Xge=yx,Zge=Wge,Qge=Kge,$ge=qs,e_e={Deflate:Yge,deflate:Xge,deflateRaw:Zge,gzip:Qge,constants:$ge},qm=16209,t_e=16191,n_e=s(function(e,n){let i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D=e.state;i=e.next_in,k=e.input,a=i+(e.avail_in-5),r=e.next_out,R=e.output,o=r-(n-e.avail_out),l=r+(e.avail_out-257),c=D.dmax,d=D.wsize,u=D.whave,p=D.wnext,m=D.window,f=D.hold,g=D.bits,x=D.lencode,_=D.distcode,h=(1<>>24,f>>>=y,g-=y,y=b>>>16&255,y===0)R[r++]=b&65535;else if(y&16){w=b&65535,y&=15,y&&(g>>=y,g-=y),g<15&&(f+=k[i++]<>>24,f>>>=y,g-=y,y=b>>>16&255,y&16){if(S=b&65535,y&=15,gc){e.msg="invalid distance too far back",D.mode=qm;break e}if(f>>>=y,g-=y,y=r-o,S>y){if(y=S-y,y>u&&D.sane){e.msg="invalid distance too far back",D.mode=qm;break e}if(F=0,N=m,p===0){if(F+=d-y,y2;)R[r++]=N[F++],R[r++]=N[F++],R[r++]=N[F++],w-=3;w&&(R[r++]=N[F++],w>1&&(R[r++]=N[F++]))}else{F=r-S;do R[r++]=R[F++],R[r++]=R[F++],R[r++]=R[F++],w-=3;while(w>2);w&&(R[r++]=R[F++],w>1&&(R[r++]=R[F++]))}}else if(y&64){e.msg="invalid distance code",D.mode=qm;break e}else{b=_[(b&65535)+(f&(1<>3,i-=w,g-=w<<3,f&=(1<{let c=l.bits,d=0,u=0,p=0,m=0,f=0,g=0,x=0,_=0,h=0,v=0,b,y,w,S,F,N=null,k,R=new Uint16Array(ac+1),D=new Uint16Array(ac+1),B=null,q,G,W;for(d=0;d<=ac;d++)R[d]=0;for(u=0;u=1&&R[m]===0;m--);if(f>m&&(f=m),m===0)return a[r++]=1<<24|64<<16|0,a[r++]=1<<24|64<<16|0,l.bits=1,0;for(p=1;p0&&(t===Oj||m!==1))return-1;for(D[1]=0,d=1;dCj||t===Ij&&h>Sj)return 1;for(;;){q=d-x,o[u]+1=k?(G=B[o[u]-k],W=N[o[u]-k]):(G=32+64,W=0),b=1<>x)+y]=q<<24|G<<16|W|0;while(y!==0);for(b=1<>=1;if(b!==0?(v&=b-1,v+=b):v=0,u++,--R[d]===0){if(d===m)break;d=e[n+o[u]]}if(d>f&&(v&S)!==w){for(x===0&&(x=f),F+=p,g=d-x,_=1<Cj||t===Ij&&h>Sj)return 1;w=v&S,a[w]=f<<24|g<<16|F-r|0}}return v!==0&&(a[F+v]=d-x<<24|64<<16|0),l.bits=f,0},"inflate_table"),ed=s_e,l_e=0,TA=1,CA=2,{Z_FINISH:Dj,Z_BLOCK:c_e,Z_TREES:Hm,Z_OK:Us,Z_STREAM_END:u_e,Z_NEED_DICT:d_e,Z_STREAM_ERROR:ha,Z_DATA_ERROR:SA,Z_MEM_ERROR:OA,Z_BUF_ERROR:p_e,Z_DEFLATED:Fj}=qs,$m=16180,Nj=16181,Rj=16182,Mj=16183,Bj=16184,Pj=16185,Lj=16186,Vj=16187,zj=16188,Uj=16189,Xm=16190,fo=16191,ex=16192,qj=16193,tx=16194,Hj=16195,Jj=16196,Gj=16197,Wj=16198,Jm=16199,Gm=16200,Kj=16201,Yj=16202,Xj=16203,Zj=16204,Qj=16205,nx=16206,$j=16207,eA=16208,yn=16209,IA=16210,DA=16211,m_e=852,f_e=592,h_e=15,g_e=h_e,tA=s(t=>(t>>>24&255)+(t>>>8&65280)+((t&65280)<<8)+((t&255)<<24),"zswap32");function __e(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}s(__e,"InflateState");var Hs=s(t=>{if(!t)return 1;let e=t.state;return!e||e.strm!==t||e.mode<$m||e.mode>DA?1:0},"inflateStateCheck"),FA=s(t=>{if(Hs(t))return ha;let e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=e.wrap&1),e.mode=$m,e.last=0,e.havedict=0,e.flags=-1,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(m_e),e.distcode=e.distdyn=new Int32Array(f_e),e.sane=1,e.back=-1,Us},"inflateResetKeep"),NA=s(t=>{if(Hs(t))return ha;let e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,FA(t)},"inflateReset"),RA=s((t,e)=>{let n;if(Hs(t))return ha;let i=t.state;return e<0?(n=0,e=-e):(n=(e>>4)+5,e<48&&(e&=15)),e&&(e<8||e>15)?ha:(i.window!==null&&i.wbits!==e&&(i.window=null),i.wrap=n,i.wbits=e,NA(t))},"inflateReset2"),MA=s((t,e)=>{if(!t)return ha;let n=new __e;t.state=n,n.strm=t,n.window=null,n.mode=$m;let i=RA(t,e);return i!==Us&&(t.state=null),i},"inflateInit2"),x_e=s(t=>MA(t,g_e),"inflateInit"),nA=!0,ix,ax,v_e=s(t=>{if(nA){ix=new Int32Array(512),ax=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(ed(TA,t.lens,0,288,ix,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;ed(CA,t.lens,0,32,ax,0,t.work,{bits:5}),nA=!1}t.lencode=ix,t.lenbits=9,t.distcode=ax,t.distbits=5},"fixedtables"),BA=s((t,e,n,i)=>{let a,r=t.state;return r.window===null&&(r.wsize=1<=r.wsize?(r.window.set(e.subarray(n-r.wsize,n),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>i&&(a=i),r.window.set(e.subarray(n-i,n-i+a),r.wnext),i-=a,i?(r.window.set(e.subarray(n-i,n),0),r.wnext=i,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave{let n,i,a,r,o,l,c,d,u,p,m,f,g,x,_=0,h,v,b,y,w,S,F,N,k=new Uint8Array(4),R,D,B=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(Hs(t)||!t.output||!t.input&&t.avail_in!==0)return ha;n=t.state,n.mode===fo&&(n.mode=ex),o=t.next_out,a=t.output,c=t.avail_out,r=t.next_in,i=t.input,l=t.avail_in,d=n.hold,u=n.bits,p=l,m=c,N=Us;e:for(;;)switch(n.mode){case $m:if(n.wrap===0){n.mode=ex;break}for(;u<16;){if(l===0)break e;l--,d+=i[r++]<>>8&255,n.check=Kn(n.check,k,2,0),d=0,u=0,n.mode=Nj;break}if(n.head&&(n.head.done=!1),!(n.wrap&1)||(((d&255)<<8)+(d>>8))%31){t.msg="incorrect header check",n.mode=yn;break}if((d&15)!==Fj){t.msg="unknown compression method",n.mode=yn;break}if(d>>>=4,u-=4,F=(d&15)+8,n.wbits===0&&(n.wbits=F),F>15||F>n.wbits){t.msg="invalid window size",n.mode=yn;break}n.dmax=1<>8&1),n.flags&512&&n.wrap&4&&(k[0]=d&255,k[1]=d>>>8&255,n.check=Kn(n.check,k,2,0)),d=0,u=0,n.mode=Rj;case Rj:for(;u<32;){if(l===0)break e;l--,d+=i[r++]<>>8&255,k[2]=d>>>16&255,k[3]=d>>>24&255,n.check=Kn(n.check,k,4,0)),d=0,u=0,n.mode=Mj;case Mj:for(;u<16;){if(l===0)break e;l--,d+=i[r++]<>8),n.flags&512&&n.wrap&4&&(k[0]=d&255,k[1]=d>>>8&255,n.check=Kn(n.check,k,2,0)),d=0,u=0,n.mode=Bj;case Bj:if(n.flags&1024){for(;u<16;){if(l===0)break e;l--,d+=i[r++]<>>8&255,n.check=Kn(n.check,k,2,0)),d=0,u=0}else n.head&&(n.head.extra=null);n.mode=Pj;case Pj:if(n.flags&1024&&(f=n.length,f>l&&(f=l),f&&(n.head&&(F=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Uint8Array(n.head.extra_len)),n.head.extra.set(i.subarray(r,r+f),F)),n.flags&512&&n.wrap&4&&(n.check=Kn(n.check,i,f,r)),l-=f,r+=f,n.length-=f),n.length))break e;n.length=0,n.mode=Lj;case Lj:if(n.flags&2048){if(l===0)break e;f=0;do F=i[r+f++],n.head&&F&&n.length<65536&&(n.head.name+=String.fromCharCode(F));while(F&&f>9&1,n.head.done=!0),t.adler=n.check=0,n.mode=fo;break;case Uj:for(;u<32;){if(l===0)break e;l--,d+=i[r++]<>>=u&7,u-=u&7,n.mode=nx;break}for(;u<3;){if(l===0)break e;l--,d+=i[r++]<>>=1,u-=1,d&3){case 0:n.mode=qj;break;case 1:if(v_e(n),n.mode=Jm,e===Hm){d>>>=2,u-=2;break e}break;case 2:n.mode=Jj;break;case 3:t.msg="invalid block type",n.mode=yn}d>>>=2,u-=2;break;case qj:for(d>>>=u&7,u-=u&7;u<32;){if(l===0)break e;l--,d+=i[r++]<>>16^65535)){t.msg="invalid stored block lengths",n.mode=yn;break}if(n.length=d&65535,d=0,u=0,n.mode=tx,e===Hm)break e;case tx:n.mode=Hj;case Hj:if(f=n.length,f){if(f>l&&(f=l),f>c&&(f=c),f===0)break e;a.set(i.subarray(r,r+f),o),l-=f,r+=f,c-=f,o+=f,n.length-=f;break}n.mode=fo;break;case Jj:for(;u<14;){if(l===0)break e;l--,d+=i[r++]<>>=5,u-=5,n.ndist=(d&31)+1,d>>>=5,u-=5,n.ncode=(d&15)+4,d>>>=4,u-=4,n.nlen>286||n.ndist>30){t.msg="too many length or distance symbols",n.mode=yn;break}n.have=0,n.mode=Gj;case Gj:for(;n.have>>=3,u-=3}for(;n.have<19;)n.lens[B[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,R={bits:n.lenbits},N=ed(l_e,n.lens,0,19,n.lencode,0,n.work,R),n.lenbits=R.bits,N){t.msg="invalid code lengths set",n.mode=yn;break}n.have=0,n.mode=Wj;case Wj:for(;n.have>>24,v=_>>>16&255,b=_&65535,!(h<=u);){if(l===0)break e;l--,d+=i[r++]<>>=h,u-=h,n.lens[n.have++]=b;else{if(b===16){for(D=h+2;u>>=h,u-=h,n.have===0){t.msg="invalid bit length repeat",n.mode=yn;break}F=n.lens[n.have-1],f=3+(d&3),d>>>=2,u-=2}else if(b===17){for(D=h+3;u>>=h,u-=h,F=0,f=3+(d&7),d>>>=3,u-=3}else{for(D=h+7;u>>=h,u-=h,F=0,f=11+(d&127),d>>>=7,u-=7}if(n.have+f>n.nlen+n.ndist){t.msg="invalid bit length repeat",n.mode=yn;break}for(;f--;)n.lens[n.have++]=F}}if(n.mode===yn)break;if(n.lens[256]===0){t.msg="invalid code -- missing end-of-block",n.mode=yn;break}if(n.lenbits=9,R={bits:n.lenbits},N=ed(TA,n.lens,0,n.nlen,n.lencode,0,n.work,R),n.lenbits=R.bits,N){t.msg="invalid literal/lengths set",n.mode=yn;break}if(n.distbits=6,n.distcode=n.distdyn,R={bits:n.distbits},N=ed(CA,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,R),n.distbits=R.bits,N){t.msg="invalid distances set",n.mode=yn;break}if(n.mode=Jm,e===Hm)break e;case Jm:n.mode=Gm;case Gm:if(l>=6&&c>=258){t.next_out=o,t.avail_out=c,t.next_in=r,t.avail_in=l,n.hold=d,n.bits=u,n_e(t,m),o=t.next_out,a=t.output,c=t.avail_out,r=t.next_in,i=t.input,l=t.avail_in,d=n.hold,u=n.bits,n.mode===fo&&(n.back=-1);break}for(n.back=0;_=n.lencode[d&(1<>>24,v=_>>>16&255,b=_&65535,!(h<=u);){if(l===0)break e;l--,d+=i[r++]<>y)],h=_>>>24,v=_>>>16&255,b=_&65535,!(y+h<=u);){if(l===0)break e;l--,d+=i[r++]<>>=y,u-=y,n.back+=y}if(d>>>=h,u-=h,n.back+=h,n.length=b,v===0){n.mode=Qj;break}if(v&32){n.back=-1,n.mode=fo;break}if(v&64){t.msg="invalid literal/length code",n.mode=yn;break}n.extra=v&15,n.mode=Kj;case Kj:if(n.extra){for(D=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=Yj;case Yj:for(;_=n.distcode[d&(1<>>24,v=_>>>16&255,b=_&65535,!(h<=u);){if(l===0)break e;l--,d+=i[r++]<>y)],h=_>>>24,v=_>>>16&255,b=_&65535,!(y+h<=u);){if(l===0)break e;l--,d+=i[r++]<>>=y,u-=y,n.back+=y}if(d>>>=h,u-=h,n.back+=h,v&64){t.msg="invalid distance code",n.mode=yn;break}n.offset=b,n.extra=v&15,n.mode=Xj;case Xj:if(n.extra){for(D=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){t.msg="invalid distance too far back",n.mode=yn;break}n.mode=Zj;case Zj:if(c===0)break e;if(f=m-c,n.offset>f){if(f=n.offset-f,f>n.whave&&n.sane){t.msg="invalid distance too far back",n.mode=yn;break}f>n.wnext?(f-=n.wnext,g=n.wsize-f):g=n.wnext-f,f>n.length&&(f=n.length),x=n.window}else x=a,g=o-n.offset,f=n.length;f>c&&(f=c),c-=f,n.length-=f;do a[o++]=x[g++];while(--f);n.length===0&&(n.mode=Gm);break;case Qj:if(c===0)break e;a[o++]=n.length,c--,n.mode=Gm;break;case nx:if(n.wrap){for(;u<32;){if(l===0)break e;l--,d|=i[r++]<{if(Hs(t))return ha;let e=t.state;return e.window&&(e.window=null),t.state=null,Us},"inflateEnd"),w_e=s((t,e)=>{if(Hs(t))return ha;let n=t.state;return n.wrap&2?(n.head=e,e.done=!1,Us):ha},"inflateGetHeader"),E_e=s((t,e)=>{let n=e.length,i,a,r;return Hs(t)||(i=t.state,i.wrap!==0&&i.mode!==Xm)?ha:i.mode===Xm&&(a=1,a=rd(a,e,n,0),a!==i.check)?SA:(r=BA(t,e,n,n),r?(i.mode=IA,OA):(i.havedict=1,Us))},"inflateSetDictionary"),k_e=NA,j_e=RA,A_e=FA,T_e=x_e,C_e=MA,S_e=b_e,O_e=y_e,I_e=w_e,D_e=E_e,F_e="pako inflate (from Nodeca project)",go={inflateReset:k_e,inflateReset2:j_e,inflateResetKeep:A_e,inflateInit:T_e,inflateInit2:C_e,inflate:S_e,inflateEnd:O_e,inflateGetHeader:I_e,inflateSetDictionary:D_e,inflateInfo:F_e};function N_e(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}s(N_e,"GZheader");var R_e=N_e,PA=Object.prototype.toString,{Z_NO_FLUSH:M_e,Z_FINISH:B_e,Z_OK:ld,Z_STREAM_END:rx,Z_NEED_DICT:ox,Z_STREAM_ERROR:P_e,Z_DATA_ERROR:iA,Z_MEM_ERROR:L_e}=qs;function pd(t){this.options=Qm.assign({chunkSize:1024*64,windowBits:15,to:""},t||{});let e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,e.windowBits===0&&(e.windowBits=-15)),e.windowBits>=0&&e.windowBits<16&&!(t&&t.windowBits)&&(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&(e.windowBits&15||(e.windowBits|=15)),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new jA,this.strm.avail_out=0;let n=go.inflateInit2(this.strm,e.windowBits);if(n!==ld)throw new Error(Vs[n]);if(this.header=new R_e,go.inflateGetHeader(this.strm,this.header),e.dictionary&&(typeof e.dictionary=="string"?e.dictionary=sd.string2buf(e.dictionary):PA.call(e.dictionary)==="[object ArrayBuffer]"&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(n=go.inflateSetDictionary(this.strm,e.dictionary),n!==ld)))throw new Error(Vs[n])}s(pd,"Inflate$1");pd.prototype.push=function(t,e){let n=this.strm,i=this.options.chunkSize,a=this.options.dictionary,r,o,l;if(this.ended)return!1;for(e===~~e?o=e:o=e===!0?B_e:M_e,PA.call(t)==="[object ArrayBuffer]"?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;;){for(n.avail_out===0&&(n.output=new Uint8Array(i),n.next_out=0,n.avail_out=i),r=go.inflate(n,o),r===ox&&a&&(r=go.inflateSetDictionary(n,a),r===ld?r=go.inflate(n,o):r===iA&&(r=ox));n.avail_in>0&&r===rx&&n.state.wrap>0&&t[n.next_in]!==0;)go.inflateReset(n),r=go.inflate(n,o);switch(r){case P_e:case iA:case ox:case L_e:return this.onEnd(r),this.ended=!0,!1}if(l=n.avail_out,n.next_out&&(n.avail_out===0||r===rx))if(this.options.to==="string"){let c=sd.utf8border(n.output,n.next_out),d=n.next_out-c,u=sd.buf2string(n.output,c);n.next_out=d,n.avail_out=i-d,d&&n.output.set(n.output.subarray(c,c+d),0),this.onData(u)}else this.onData(n.output.length===n.next_out?n.output:n.output.subarray(0,n.next_out));if(!(r===ld&&l===0)){if(r===rx)return r=go.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(n.avail_in===0)break}}return!0};pd.prototype.onData=function(t){this.chunks.push(t)};pd.prototype.onEnd=function(t){t===ld&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=Qm.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};function wx(t,e){let n=new pd(e);if(n.push(t),n.err)throw n.msg||Vs[n.err];return n.result}s(wx,"inflate$1");function V_e(t,e){return e=e||{},e.raw=!0,wx(t,e)}s(V_e,"inflateRaw$1");var z_e=pd,U_e=wx,q_e=V_e,H_e=wx,J_e=qs,G_e={Inflate:z_e,inflate:U_e,inflateRaw:q_e,ungzip:H_e,constants:J_e},{Deflate:W_e,deflate:K_e,deflateRaw:Y_e,gzip:X_e}=e_e,{Inflate:Z_e,inflate:Q_e,inflateRaw:$_e,ungzip:e0e}=G_e,t0e=W_e,n0e=K_e,i0e=Y_e,a0e=X_e,r0e=Z_e,o0e=Q_e,s0e=$_e,l0e=e0e,c0e=qs,ef={Deflate:t0e,deflate:n0e,deflateRaw:i0e,gzip:a0e,Inflate:r0e,inflate:o0e,inflateRaw:s0e,ungzip:l0e,constants:c0e};var Oe;(function(t){t[t.End=0]="End",t[t.Byte=1]="Byte",t[t.Short=2]="Short",t[t.Int=3]="Int",t[t.Long=4]="Long",t[t.Float=5]="Float",t[t.Double=6]="Double",t[t.ByteArray=7]="ByteArray",t[t.String=8]="String",t[t.List=9]="List",t[t.Compound=10]="Compound",t[t.IntArray=11]="IntArray",t[t.LongArray=12]="LongArray"})(Oe||(Oe={}));var tf=class{static register(e,n){let i=n.create().getId();if(i!==e)throw new Error(`Registered factory ${Oe[i]} does not match type ${Oe[e]}`);tf.FACTORIES.set(e,n)}isEnd(){return this.getId()===Oe.End}isByte(){return this.getId()===Oe.Byte}isShort(){return this.getId()===Oe.Short}isInt(){return this.getId()===Oe.Int}isLong(){return this.getId()===Oe.Long}isFloat(){return this.getId()===Oe.Float}isDouble(){return this.getId()===Oe.Double}isByteArray(){return this.getId()===Oe.ByteArray}isString(){return this.getId()===Oe.String}isList(){return this.getId()===Oe.List}isCompound(){return this.getId()===Oe.Compound}isIntArray(){return this.getId()===Oe.IntArray}isLongArray(){return this.getId()===Oe.LongArray}isNumber(){return this.isByte()||this.isShort()||this.isInt()||this.isLong()||this.isFloat()||this.isDouble()}isArray(){return this.isByteArray()||this.isIntArray()||this.isLongArray()}isListOrArray(){return this.isList()||this.isArray()}getAsNumber(){return 0}getAsString(){return""}toJsonWithId(){return{type:this.getId(),value:this.toJson()}}static getFactory(e){let n=this.FACTORIES.get(e);if(!n)throw new Error(`Invalid tag id ${e}`);return n}static create(e){return this.getFactory(e).create()}static fromString(e){let n=typeof e=="string"?new ci(e):e;return this.getFactory(Oe.Compound).fromString(n)}static fromJson(e,n=Oe.Compound){return this.getFactory(n).fromJson(e)}static fromJsonWithId(e){let n=ut.readObject(e)??{},i=ut.readInt(n.type)??0;return tf.fromJson(n.value??{},i)}static fromBytes(e,n=Oe.Compound){return this.getFactory(n).fromBytes(e)}},st=tf;s(st,"NbtTag"),lt(st,"FACTORIES",new Map);var Js=class extends st{value;constructor(e){super(),this.value=typeof e=="number"?e:e?1:0}getId(){return Oe.Byte}getAsNumber(){return this.value}toString(){return this.value.toFixed()+"b"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeByte(this.value)}static create(){return Js.ZERO}static fromJson(e){return new Js(ut.readInt(e)??0)}static fromBytes(e){let n=e.readByte();return new Js(n)}},di=Js;s(di,"NbtByte"),lt(di,"ZERO",new Js(0)),lt(di,"ONE",new Js(1));st.register(Oe.Byte,di);var za=class extends st{items;constructor(e){super(),this.items=e}getItems(){return this.items.slice(0)}getAsTuple(e,n){return[...Array(e)].map((i,a)=>n(this.items[a]))}get(e){if(e=Math.floor(e),!(e<0||e>=this.items.length))return this.items[e]}get length(){return this.items.length}map(e){return this.items.map(e)}filter(e){return this.items.filter(e)}forEach(e){this.items.forEach(e)}set(e,n){this.items[e]=n}add(e){this.items.push(e)}insert(e,n){this.items.splice(e,0,n)}delete(e){this.items.splice(e,1)}clear(){this.items=[]}};s(za,"NbtAbstractList");var ga=class extends za{constructor(e){super(Array.from(e??[],n=>typeof n=="number"?new di(n):n))}getId(){return Oe.ByteArray}getType(){return Oe.Byte}toString(){return"[B;"+this.items.map(n=>n.getAsNumber().toFixed()+"B").join(",")+"]"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.items.map(e=>e.getAsNumber())}toJson(){return this.items.map(e=>e.getAsNumber())}toBytes(e){e.writeInt(this.items.length),e.writeBytes(this.items.map(n=>n.getAsNumber()))}static create(){return new ga([])}static fromJson(e){let n=ut.readArray(e,i=>ut.readNumber(i)??0)??[];return new ga(n)}static fromBytes(e){let n=e.readInt(),i=e.readBytes(n);return new ga(i)}};s(ga,"NbtByteArray");st.register(Oe.ByteArray,ga);var fn=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.Float}getAsNumber(){return this.value}toString(){return this.value.toString()+"f"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeFloat(this.value)}static create(){return new fn(0)}static fromJson(e){return new fn(ut.readNumber(e)??0)}static fromBytes(e){let n=e.readFloat();return new fn(n)}};s(fn,"NbtFloat");st.register(Oe.Float,fn);var an=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.Int}getAsNumber(){return this.value}toString(){return this.value.toFixed()}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeInt(this.value)}static create(){return new an(0)}static fromJson(e){return new an(ut.readInt(e)??0)}static fromBytes(e){let n=e.readInt();return new an(n)}};s(an,"NbtInt");st.register(Oe.Int,an);var _a=class extends za{constructor(e){super(Array.from(e??[],n=>typeof n=="number"?new an(n):n))}getId(){return Oe.IntArray}getType(){return Oe.Int}get length(){return this.items.length}toString(){return"[I;"+this.items.map(n=>n.getAsNumber().toFixed()).join(",")+"]"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.items.map(e=>e.getAsNumber())}toJson(){return this.items.map(e=>e.getAsNumber())}toBytes(e){e.writeInt(this.items.length);for(let n of this.items)e.writeInt(n.getAsNumber())}static create(){return new _a}static fromJson(e){let n=ut.readArray(e,i=>ut.readNumber(i)??0)??[];return new _a(n)}static fromBytes(e){let n=e.readInt(),i=[];for(let a=0;anew e(i)))}getId(){return Oe.List}getType(){return this.type}getNumber(e){let n=this.get(e);return n?.isNumber()?n.getAsNumber():0}getString(e){let n=this.get(e);return n?.isString()?n.getAsString():""}getList(e,n){let i=this.get(e);return i?.isList()&&i.getType()===n?i:Tn.create()}getCompound(e){let n=this.get(e);return n?.isCompound()?n:ot.create()}set(e,n){this.updateType(n),super.set(e,n)}add(e){this.updateType(e),super.add(e)}insert(e,n){this.updateType(n),super.insert(e,n)}updateType(e){if(e.getId()!==Oe.End){if(this.type===Oe.End)this.type=e.getId();else if(this.type!==e.getId())throw new Error(`Trying to add tag of type ${Oe[e.getId()]} to list of ${Oe[this.type]}`)}}clear(){super.clear(),this.type=Oe.End}toString(){return"["+this.items.map(e=>e.toString()).join(",")+"]"}toPrettyString(e=" ",n=0){if(this.length===0)return"[]";let i=e.repeat(n),a=e.repeat(n+1);return`[ `+this.map(r=>a+r.toPrettyString(e,n+1)).join(`, `)+` `+i+"]"}toSimplifiedJson(){return this.map(e=>e.toSimplifiedJson())}toJson(){return{type:this.type,items:this.items.map(e=>e.toJson())}}toBytes(e){this.items.length===0?this.type=Oe.End:this.type=this.items[0].getId(),e.writeByte(this.type),e.writeInt(this.items.length);for(let n of this.items)n.toBytes(e)}static create(){return new Tn}static fromJson(e){let n=ut.readObject(e)??{},i=ut.readNumber(n.type)??Oe.Compound,a=(ut.readArray(n.items)??[]).flatMap(r=>r!==void 0?[st.fromJson(r,i)]:[]);return new Tn(a,i)}static fromBytes(e){let n=e.readByte(),i=e.readInt();if(n===Oe.End&&i>0)throw new Error(`Missing type on ListTag but length is ${i}`);let a=[];for(let r=0;rtypeof n=="number"?n:0):[0,0])}static fromBytes(e){let n=e.readInt(),i=e.readInt();return new Jn([n,i])}},_o=Jn;s(_o,"NbtLong"),lt(_o,"dataview",new DataView(new Uint8Array(8).buffer));st.register(Oe.Long,_o);var xa=class extends za{constructor(e){super(Array.from(e??[],n=>typeof n=="bigint"||Array.isArray(n)?new _o(n):n))}getId(){return Oe.LongArray}getType(){return Oe.Long}get length(){return this.items.length}toString(){return"[I;"+this.items.map(n=>n.toString()).join(",")+"]"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.items.map(e=>e.getAsPair())}toJson(){return this.items.map(e=>e.getAsPair())}toBytes(e){e.writeInt(this.items.length);for(let n of this.items){let[i,a]=n.getAsPair();e.writeInt(i),e.writeInt(a)}}static create(){return new xa}static fromJson(e){let n=ut.readArray(e,i=>ut.readPair(i,a=>ut.readNumber(a)??0)??[0,0])??[];return new xa(n)}static fromBytes(e){let n=e.readInt(),i=[];for(let a=0;ae(n,i,this)))}forEach(e){[...this.properties.entries()].forEach(([n,i])=>e(n,i,this))}set(e,n){return this.properties.set(e,n),this}delete(e){return this.properties.delete(e)}clear(){return this.properties.clear(),this}toString(){let e=[];for(let[n,i]of this.properties.entries()){let a=n.split("").some(r=>!ci.isAllowedInUnquotedString(r));e.push((a?JSON.stringify(n):n)+":"+i.toString())}return"{"+e.join(",")+"}"}toPrettyString(e=" ",n=0){if(this.size===0)return"{}";let i=e.repeat(n),a=e.repeat(n+1);return`{ `+Object.values(this.map((r,o)=>[r,a+r+": "+o.toPrettyString(e,n+1)])).join(`, `)+` `+i+"}"}toSimplifiedJson(){return this.map((e,n)=>[e,n.toSimplifiedJson()])}toJson(){return this.map((e,n)=>[e,{type:n.getId(),value:n.toJson()}])}toBytes(e){for(let[n,i]of this.properties.entries()){let a=i.getId();e.writeByte(a),e.writeString(n),i.toBytes(e)}e.writeByte(Oe.End)}static create(){return new ot}static fromString(e){return nf.readTag(e)}static fromJson(e){let n=ut.readMap(e,i=>{let{type:a,value:r}=ut.readObject(i)??{},o=ut.readNumber(a);return st.fromJson(r??{},o)});return new ot(new Map(Object.entries(n)))}static fromBytes(e){let n=new Map;for(;;){let i=e.readByte();if(i===Oe.End)break;let a=e.readString(),r=st.fromBytes(e,i);n.set(a,r)}return new ot(n)}};s(ot,"NbtCompound");st.register(Oe.Compound,ot);var Wo=class{name;root;compression;littleEndian;bedrockHeader;constructor(e,n,i,a,r){this.name=e,this.root=n,this.compression=i,this.littleEndian=a,this.bedrockHeader=r}writeNamedTag(e){e.writeByte(Oe.Compound),e.writeString(this.name),this.root.toBytes(e)}write(){let e=this.littleEndian===!0||this.bedrockHeader!==void 0,n=new Ku({littleEndian:e,offset:this.bedrockHeader&&8});if(this.writeNamedTag(n),this.bedrockHeader!==void 0){let a=n.offset;n.offset=0,n.writeInt(this.bedrockHeader),n.writeInt(a-8),n.offset=a}let i=n.getData();return this.compression==="gzip"?ef.gzip(i):this.compression==="zlib"?ef.deflate(i):i}static readNamedTag(e){if(e.readByte()!==Oe.Compound)throw new Error("Top tag should be a compound");return{name:e.readString(),root:ot.fromBytes(e)}}static create(e={}){let n=e.name??Wo.DEFAULT_NAME,i=ot.create(),a=e.compression??"none",r=typeof e.bedrockHeader=="boolean"?Wo.DEFAULT_BEDROCK_HEADER:e.bedrockHeader,o=e.littleEndian??e.bedrockHeader!==void 0;return new Wo(n,i,a,o,r)}static read(e,n={}){let i=typeof n.bedrockHeader=="number"?n.bedrockHeader:n.bedrockHeader?_j(e):void 0,a=n.compression==="gzip"||!i&&n.compression===void 0&&hj(e),r=n.compression==="zlib"||!i&&n.compression===void 0&&gj(e),o=r||a?ef.inflate(e):e,l=n.littleEndian||i!==void 0,c=a?"gzip":r?"zlib":"none",d=new Wu(o,{littleEndian:l,offset:i&&8}),{name:u,root:p}=Wo.readNamedTag(d);return new Wo(n.name??u,p,c,l,i)}toJson(){return{name:this.name,root:this.root.toJson(),compression:this.compression,littleEndian:this.littleEndian,bedrockHeader:this.bedrockHeader??null}}static fromJson(e){let n=ut.readObject(e)??{},i=ut.readString(n.name)??"",a=ot.fromJson(n.root??{}),r=ut.readString(n.compression)??"none",o=ut.readBoolean(n.littleEndian)??!1,l=ut.readNumber(n.bedrockHeader);return new Wo(i,a,r,o,l)}},qa=Wo;s(qa,"NbtFile"),lt(qa,"DEFAULT_NAME",""),lt(qa,"DEFAULT_BEDROCK_HEADER",4);var va=class{x;z;compression;timestamp;raw;file;dirty;constructor(e,n,i,a,r){this.x=e,this.z=n,this.compression=i,this.timestamp=a,this.raw=r,this.dirty=!1}getCompression(){switch(this.compression){case 1:return"gzip";case 2:return"zlib";case 3:return"none";default:throw new Error(`Invalid compression mode ${this.compression}`)}}setCompression(e){switch(e){case"gzip":this.compression=1;break;case"zlib":this.compression=2;break;case"none":this.compression=3;break;default:throw new Error(`Invalid compression mode ${e}`)}}getFile(){return this.file===void 0&&(this.file=qa.read(this.raw,{compression:this.getCompression()})),this.file}getRoot(){return this.getFile().root}setRoot(e){this.file===void 0&&(this.file=qa.create({compression:this.getCompression()})),this.file.root=e,this.markDirty()}markDirty(){this.dirty=!0}getRaw(){if(this.file===void 0||this.dirty===!1)return this.raw;this.file.compression=this.getCompression();let e=this.file.write();return this.raw=e,this.dirty=!1,e}toJson(){return{x:this.x,z:this.z,compression:this.compression,timestamp:this.timestamp,size:this.raw.byteLength}}toRef(e){return new va.Ref(this.x,this.z,this.compression,this.timestamp,this.raw.byteLength,e)}static create(e,n,i,a){let r=new va(e,n,0,a??0,i.write());return r.setCompression(i.compression),r}static fromJson(e,n){let i=ut.readObject(e)??{},a=ut.readInt(i.x)??0,r=ut.readInt(i.z)??0,o=ut.readNumber(i.compression)??2,l=ut.readInt(i.timestamp)??0,c=ut.readInt(i.size)??0;return new va.Ref(a,r,o,l,c,n)}};s(va,"NbtChunk");(function(t){class e{x;z;compression;timestamp;size;resolver;file;constructor(i,a,r,o,l,c){this.x=i,this.z=a,this.compression=r,this.timestamp=o,this.size=l,this.resolver=c}getFile(){if(this.file instanceof qa)return this.file}getRoot(){if(this.file instanceof qa)return this.file.root}async getFileAsync(){return this.file?this.file:(this.file=(async()=>{let i=await this.resolver(this.x,this.z);return this.file=i,i})(),this.file)}async getRootAsync(){return(await this.getFileAsync()).root}isResolved(){return this.file instanceof qa}}s(e,"Ref"),t.Ref=e})(va||(va={}));var md=class{chunks;constructor(e){this.chunks=Array(32*32).fill(void 0);for(let n of e){let i=Or.getIndex(n.x,n.z);this.chunks[i]=n}}getChunkPositions(){return this.chunks.flatMap(e=>e?[[e.x,e.z]]:[])}getChunk(e){if(!(e<0||e>=32*32))return this.chunks[e]}findChunk(e,n){return this.getChunk(Or.getIndex(e,n))}getFirstChunk(){return this.chunks.filter(e=>e!==void 0)[0]}filter(e){return this.chunks.filter(n=>n!==void 0&&e(n))}map(e){return this.chunks.flatMap(n=>n!==void 0?[e(n)]:[])}};s(md,"NbtAbstractRegion");var Or=class extends md{constructor(e){super(e)}write(){let e=0;for(let r of this.chunks)r!==void 0&&(e+=Math.ceil(r.getRaw().length/4096));let n=new Uint8Array(8192+e*4096),i=new DataView(n.buffer),a=2;for(let r of this.chunks){if(r===void 0)continue;let o=r.getRaw(),l=4*((r.x&31)+(r.z&31)*32),c=Math.ceil(o.length/4096);i.setInt8(l,a>>16),i.setInt16(l+1,a&65535),i.setInt8(l+3,c),i.setInt32(l+4096,r.timestamp);let d=a*4096;i.setInt32(d,o.length+1),i.setInt8(d+4,r.compression),n.set(o,d+5),a+=c}return n}static read(e){let n=[];for(let i=0;i<32;i+=1)for(let a=0;a<32;a+=1){let r=4*((i&31)+(a&31)*32);if(e[r+3]===0)continue;let l=(e[r]<<16)+(e[r+1]<<8)+e[r+2],c=(e[r+4096]<<24)+(e[r+4097]<<16)+(e[r+4098]<<8)+e[r+4099],d=l*4096,u=(e[d]<<24)+(e[d+1]<<16)+(e[d+2]<<8)+e[d+3],p=e[d+4],m=e.slice(d+5,d+4+u);n.push(new va(i,a,p,c,m))}return new Or(n)}static getIndex(e,n){return(e&31)+(n&31)*32}toJson(){return{chunks:this.map(e=>e.toJson())}}static fromJson(e,n){let i=ut.readObject(e)??{},r=(ut.readArray(i.chunks)??[]).flatMap(o=>o!==void 0?[va.fromJson(o,n)]:[]);return new Or.Ref(r)}};s(Or,"NbtRegion");(function(t){class e extends md{}s(e,"Ref"),t.Ref=e})(Or||(Or={}));var Ua=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.Double}getAsNumber(){return this.value}toString(){return Number.isInteger(this.value)?this.value.toFixed(1):this.value.toString()}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeDouble(this.value)}static create(){return new Ua(0)}static fromJson(e){return new Ua(ut.readNumber(e)??0)}static fromBytes(e){let n=e.readDouble();return new Ua(n)}};s(Ua,"NbtDouble");st.register(Oe.Double,Ua);var pc=class extends st{constructor(){super()}getId(){return Oe.End}toString(){return"END"}toPrettyString(){return this.toString()}toSimplifiedJson(){return null}toJson(){return null}toBytes(){}static create(){return pc.INSTANCE}static fromJson(){return pc.INSTANCE}static fromBytes(){return pc.INSTANCE}},fd=pc;s(fd,"NbtEnd"),lt(fd,"INSTANCE",new pc);st.register(Oe.End,fd);var LA={},u0e=s(function(t,e,n,i,a){var r=new Worker(LA[e]||(LA[e]=URL.createObjectURL(new Blob([t+';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'],{type:"text/javascript"}))));return r.onmessage=function(o){var l=o.data,c=l.$e$;if(c){var d=new Error(c[0]);d.code=c[1],d.stack=c[2],a(d,null)}else a(null,l)},r.postMessage(n,i),r},"wk"),Ti=Uint8Array,Gs=Uint16Array,UA=Int32Array,jx=new Ti([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Ax=new Ti([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),qA=new Ti([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),HA=s(function(t,e){for(var n=new Gs(31),i=0;i<31;++i)n[i]=e+=1<>1|(zt&21845)<<1,xo=(xo&52428)>>2|(xo&13107)<<2,xo=(xo&61680)>>4|(xo&3855)<<4,sf[zt]=((xo&65280)>>8|(xo&255)<<8)>>1;var xo,zt,mc=s(function(t,e,n){for(var i=t.length,a=0,r=new Gs(e);a>c]=d}else for(l=new Gs(i),a=0;a>15-t[a]);return l},"hMap"),hd=new Ti(288);for(zt=0;zt<144;++zt)hd[zt]=8;var zt;for(zt=144;zt<256;++zt)hd[zt]=9;var zt;for(zt=256;zt<280;++zt)hd[zt]=7;var zt;for(zt=280;zt<288;++zt)hd[zt]=8;var zt,KA=new Ti(32);for(zt=0;zt<32;++zt)KA[zt]=5;var zt;var YA=mc(hd,9,1);var XA=mc(KA,5,1),rf=s(function(t){for(var e=t[0],n=1;ne&&(e=t[n]);return e},"max"),ba=s(function(t,e,n){var i=e/8|0;return(t[i]|t[i+1]<<8)>>(e&7)&n},"bits"),of=s(function(t,e){var n=e/8|0;return(t[n]|t[n+1]<<8|t[n+2]<<16)>>(e&7)},"bits16"),ZA=s(function(t){return(t+7)/8|0},"shft"),lf=s(function(t,e,n){return(e==null||e<0)&&(e=0),(n==null||n>t.length)&&(n=t.length),new Ti(t.subarray(e,n))},"slc");var QA=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],Ai=s(function(t,e,n){var i=new Error(e||QA[t]);if(i.code=t,Error.captureStackTrace&&Error.captureStackTrace(i,Ai),!n)throw i;return i},"err"),$A=s(function(t,e,n,i){var a=t.length,r=i?i.length:0;if(!a||e.f&&!e.l)return n||new Ti(0);var o=!n,l=o||e.i!=2,c=e.i;o&&(n=new Ti(a*3));var d=s(function(Y){var we=n.length;if(Y>we){var Le=new Ti(Math.max(we*2,Y));Le.set(n),n=Le}},"cbuf"),u=e.f||0,p=e.p||0,m=e.b||0,f=e.l,g=e.d,x=e.m,_=e.n,h=a*8;do{if(!f){u=ba(t,p,1);var v=ba(t,p+1,3);if(p+=3,v)if(v==1)f=YA,g=XA,x=9,_=5;else if(v==2){var S=ba(t,p,31)+257,F=ba(t,p+10,15)+4,N=S+ba(t,p+5,31)+1;p+=14;for(var k=new Ti(N),R=new Ti(19),D=0;D>4;if(b<16)k[D++]=b;else{var ee=0,Z=0;for(b==16?(Z=3+ba(t,p,3),p+=2,ee=k[D-1]):b==17?(Z=3+ba(t,p,7),p+=3):b==18&&(Z=11+ba(t,p,127),p+=7);Z--;)k[D++]=ee}}var me=k.subarray(0,S),X=k.subarray(S);x=rf(me),_=rf(X),f=mc(me,x,1),g=mc(X,_,1)}else Ai(1);else{var b=ZA(p)+4,y=t[b-4]|t[b-3]<<8,w=b+y;if(w>a){c&&Ai(0);break}l&&d(m+y),n.set(t.subarray(b,w),m),e.b=m+=y,e.p=p=w*8,e.f=u;continue}if(p>h){c&&Ai(0);break}}l&&d(m+131072);for(var Q=(1<>4;if(p+=ee&15,p>h){c&&Ai(0);break}if(ee||Ai(2),le<256)n[m++]=le;else if(le==256){Ie=p,f=null;break}else{var ge=le-254;if(le>264){var D=le-257,V=jx[D];ge=ba(t,p,(1<>4;H||Ai(3),p+=H&15;var X=WA[re];if(re>3){var V=Ax[re];X+=of(t,p)&(1<h){c&&Ai(0);break}l&&d(m+131072);var xe=m+ge;if(m>>0},"b4"),Ex=s(function(t,e){return Ha(t,e)+Ha(t,e+4)*4294967296},"b8");function x0e(t,e,n){return n||(n=e,e={}),typeof n!="function"&&Ai(7),_0e(t,e,[g0e],function(i){return eT(Cx(i.data[0],tT(i.data[1])))},1,n)}s(x0e,"inflate");function Cx(t,e){return $A(t,{i:2},e&&e.out,e&&e.dictionary)}s(Cx,"inflateSync");var kx=typeof TextDecoder<"u"&&new TextDecoder,v0e=0;try{kx.decode(p0e,{stream:!0}),v0e=1}catch{}var b0e=s(function(t){for(var e="",n=0;;){var i=t[n++],a=(i>127)+(i>223)+(i>239);if(n+a>t.length)return{s:e,r:lf(t,n-1)};a?a==3?(i=((i&15)<<18|(t[n++]&63)<<12|(t[n++]&63)<<6|t[n++]&63)-65536,e+=String.fromCharCode(55296|i>>10,56320|i&1023)):a&1?e+=String.fromCharCode((i&31)<<6|t[n++]&63):e+=String.fromCharCode((i&15)<<12|(t[n++]&63)<<6|t[n++]&63):e+=String.fromCharCode(i)}},"dutf8");function y0e(t,e){if(e){for(var n="",i=0;i65558)return o(Ai(13,0,1),null),a;var c=Ir(t,l+8);if(c){var d=c,u=Ha(t,l+16),p=u==4294967295||d==65535;if(p){var m=Ha(t,l-12);p=Ha(t,m)==101075792,p&&(d=c=Ha(t,m+32),u=Ha(t,m+48))}for(var f=e&&e.filter,g=s(function(_){var h=E0e(t,u,p),v=h[0],b=h[1],y=h[2],w=h[3],S=h[4],F=h[5],N=w0e(t,F);u=S;var k=s(function(D,B){D?(a(),o(D,null)):(B&&(r[w]=B),--c||o(null,r))},"cbl");if(!f||f({name:w,size:b,originalSize:y,compression:v}))if(!v)k(null,lf(t,N,N+b));else if(v==8){var R=t.subarray(N,N+b);if(y<524288||b>.8*y)try{k(null,Cx(R,{out:new Ti(y)}))}catch(D){k(D,null)}else i.push(x0e(R,{size:y},k))}else k(Ai(14,"unknown compression type "+v,1),null);else k(null,null)},"_loop_3"),x=0;xTarget: Minecraft: Java Edition`,a=J(),r=L("h3"),r.innerHTML='

Getting Started

',o=J(),l=L("p"),l.innerHTML='Check out the Docs to learn how to use Animated Java.',c=J(),d=L("div"),u=L("button"),u.innerHTML=`arrow_forward Create new AJ Blueprint`,E(e,"class","format_description"),E(i,"class","format_target"),E(r,"class","markdown"),E(u,"class","svelte-16p5p64"),E(d,"class","button_bar")},m(f,g){U(f,e,g),U(f,n,g),U(f,i,g),U(f,a,g),U(f,r,g),U(f,o,g),U(f,l,g),U(f,c,g),U(f,d,g),I(d,u),p||(m=Ue(u,"click",t[0]),p=!0)},p:ie,i:ie,o:ie,d(f){f&&z(e),f&&z(n),f&&z(i),f&&z(a),f&&z(r),f&&z(o),f&&z(l),f&&z(c),f&&z(d),p=!1,m()}}}s(j0e,"create_fragment");function A0e(t){return[s(()=>aT(),"click_handler")]}s(A0e,"instance");var cf=class extends Pe{constructor(e){super(),Ve(this,e,A0e,j0e,De,{})}};s(cf,"FormatPage");var iT=cf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("button.svelte-16p5p64{width:100%;height:40px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var rT='data:image/svg+xml,%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A';var ya='data:image/svg+xml,%0D%0A%09%0D%0A%09%0D%0A%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%0D%0A%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%0D%0A%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%0D%0A%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%0D%0A%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%0D%0A%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%0D%0A%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%09%0D%0A%09%09%0D%0A%09%0D%0A%09%0D%0A%0D%0A%09%0D%0A';function S0e(t){let e,n;return{c(){e=L("img"),Ht(e.src,n=ya)||E(e,"src",n),E(e,"alt",""),E(e,"class","svelte-uye5l3")},m(i,a){U(i,e,a)},p:ie,d(i){i&&z(e)}}}s(S0e,"create_else_block");function O0e(t){let e,n;return{c(){e=L("img"),Ht(e.src,n=rT)||E(e,"src",n),E(e,"alt",""),E(e,"class","svelte-uye5l3")},m(i,a){U(i,e,a)},p:ie,d(i){i&&z(e)}}}s(O0e,"create_if_block");function I0e(t){let e;function n(r,o){return r[1]?O0e:S0e}s(n,"select_block_type");let i=n(t,-1),a=i(t);return{c(){a.c(),e=_t()},m(r,o){a.m(r,o),U(r,e,o)},p(r,[o]){i===(i=n(r,o))&&a?a.p(r,o):(a.d(1),a=i(r),a&&(a.c(),a.m(e.parentNode,e)))},i:ie,o:ie,d(r){a.d(r),r&&z(e)}}}s(I0e,"create_fragment");function D0e(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(o,l=>n(1,i=l)),o),"$$subscribe_pluginMode");t.$$.on_destroy.push(()=>a());let{pluginMode:o}=e;return r(),t.$$set=l=>{"pluginMode"in l&&r(n(0,o=l.pluginMode))},[o,i]}s(D0e,"instance");var uf=class extends Pe{constructor(e){super(),Ve(this,e,D0e,I0e,De,{pluginMode:0})}};s(uf,"ProjectTitle");var oT=uf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("img.svelte-uye5l3{width:20px;height:20px;margin-top:2px;margin-right:2px;border-radius:2px;box-shadow:1px 1px 1px #000000aa}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Ws=class{map;constructor(){this.map=new Map}add(e,n){this.map.set(e,n)}get(e){return this.map.get(e)}has(e){return this.map.has(e)}delete(e){this.map.delete(e)}getMappedTexture(e){let n=this.map.get(e instanceof Texture?e.uuid:e);return Texture.all.find(i=>i.uuid===n)}setMappedTexture(e,n){this.map.set(e.uuid,n.uuid)}toJSON(){return Object.fromEntries(this.map)}static fromJSON(e){let n=new Ws;for(let[i,a]of Object.entries(e))n.add(i,a);return n}copy(){let e=new Ws;return e.map=new Map(this.map),e}verifyTextures(){for(let[e,n]of this.map)Texture.all.some(i=>i.uuid===n)||this.map.delete(e)}};s(Ws,"TextureMap");var rn=class{id;displayName;name;uuid;textureMap;isDefault=!1;generateNameFromDisplayName=!0;excludedNodes=[];constructor(e,n=!1){if(this.displayName=rn.makeDisplayNameUnique(this,e),this.name=rn.makeNameUnique(this,this.displayName),this.isDefault=n,this.uuid=guid(),this.textureMap=new Ws,this.id=rn.all.length,this.isDefault){if(rn.hasDefault())throw new Error("There can only be one default variant!");this.displayName="Default",this.name="default"}rn.all.push(this),K.CREATE_VARIANT.publish(this)}select(){rn.selected&&rn.selected.unselect(),rn.selected=this,Canvas.updateAllFaces(),K.SELECT_VARIANT.publish(this)}unselect(){rn.selected=void 0}delete(){if(this.isDefault)return;let e=rn.all.indexOf(this);e>-1&&rn.all.splice(e,1),rn.selected===this&&(this.unselect(),rn.selectDefault()),K.DELETE_VARIANT.publish(this)}toJSON(){let e={name:this.name,display_name:this.displayName,uuid:this.uuid,texture_map:Object.fromEntries(this.textureMap.map),excluded_nodes:this.excludedNodes.map(n=>n.value)};return this.isDefault&&(e.is_default=!0),e}duplicate(){let e=new rn(this.displayName,!1);e.uuid=guid(),e.isDefault=!1,e.generateNameFromDisplayName=this.generateNameFromDisplayName,e.textureMap=this.textureMap.copy(),e.excludedNodes=this.excludedNodes.map(n=>({...n})),e.select()}verifyTextureMap(){this.textureMap.verifyTextures()}static fromJSON(e,n=!1){let i=new rn(e.display_name,n);if(i.uuid=e.uuid,e.is_default)return i;for(let[a,r]of Object.entries(e.texture_map))i.textureMap.add(a,r);return i.excludedNodes=e.excluded_nodes.map(a=>{let r=Group.all.find(o=>o.uuid===a);return r?{name:r.name,value:a}:void 0}).filter(Boolean),i}static makeDisplayNameUnique(e,n){if(!rn.all.some(o=>o!==e&&o.displayName===n))return n;let i=1,a=/\d+$/.exec(n);a&&(i=parseInt(a[0]),n=n.slice(0,-a[0].length));let r=1e3;for(;r-- >0;){let o=`${n}${i}`;if(!rn.all.some(l=>l!==e&&l.displayName===o))return o;i++}throw new Error("Could not make Variant display name unique!")}static makeNameUnique(e,n){if(n=Kt(n),!rn.all.some(o=>o!==e&&o.name===n))return n;let i=1,a=/\d+$/.exec(n);a&&(i=parseInt(a[0]),n=n.slice(0,-a[0].length));let r=1e3;for(;r-- >0;){let o=`${n}${i}`;if(!rn.all.some(l=>l!==e&&l.name===o))return o;i++}throw new Error("Could not make Variant name unique!")}static selectDefault(){rn.getDefault().select()}static getByUUID(e){return rn.all.find(n=>n.uuid===e)}static allExcludingDefault(){return rn.all.filter(e=>!e.isDefault)}static hasDefault(){return rn.all.some(e=>e.isDefault)}static getDefault(){return rn.all.find(e=>e.isDefault)??new rn("Default",!0)}},qe=rn;s(qe,"Variant"),lt(qe,"all",[]),lt(qe,"selected");K.SELECT_PROJECT.subscribe(t=>{t.variants??=[],qe.all=t.variants});K.UNSELECT_PROJECT.subscribe(()=>{qe.all=[]});var df=s(class{item;index=-1;string;itemCode;line=1;column=0;lineStart=0;lines=[{number:1,startIndex:0,content:""}];constructor(t){this.string=t,this.consume()}get length(){return this.string.length}get progress(){return Math.min(this.index/this.length,1)}get next(){return this.string.at(this.index+1)}get nextCode(){return this.string.charCodeAt(this.index+1)}get currentLine(){return this.lines[this.line-1]}look(t,e=1){return this.string.slice(this.index+t,this.index+t+e)}consume(){let t=this.item;this.item&&(this.currentLine.content+=this.item),this.item=this.string.at(this.index+1),this.itemCode=this.item?.charCodeAt(0),this.index++,this.column++,(t===` `||t!=null&&this.item==null)&&this.completeLine()}consumeN(t){for(let e=0;e0&&(n[0]+=` `),console.log(...n,...e),this}stop(){if(this.startTime===void 0)throw new Error("Stopwatch not started");return this.endTime=performance.now(),this.duration=this.endTime-this.startTime,this.duration}createMessage(){let e=this.duration===void 0?"Not finished":`${Ja(this.duration,5)}ms`;return[`%c\u23F1\uFE0F ${this.name}%c: %c${e}`,"color: #FFFF55","color: #AAAAAA","color: #55FFFF"]}static function(e,n){return(...i)=>{let a=new pi(e).start(),r=n(...i);return r instanceof Promise?r.finally(a.debug.bind(a)):(a.debug(),r)}}static promise(e,n){let i=new pi(e).start();return n.finally(i.debug.bind(i))}};s(pi,"Stopwatch");var gd=class{constructor(e){this.minecraftVersion=e;fc(this.minecraftVersion,"1.21.5")>=0&&(this.enabledFeatures&=-2,this.enabledFeatures&=-3)}enabledFeatures=3;stringify(e){return this.stringifyTextElement(e)}stringifyString(e){e=e.replaceAll(` `,"\\n"),this.enabledFeatures&2&&(e=e.replaceAll("\\s"," "));let n=e.replace(/\\'/g,"'").replace(/\\"/g,'"'),i=n.includes("'"),a=n.includes('"');return this.enabledFeatures&1?`"${n.replace(/"/g,'\\"')}"`:i&&a?`'${n.replace(/'/g,"\\'")}'`:i?`"${n.replace(/"/g,'\\"')}"`:`'${n.replace(/'/g,"\\'")}'`}stringifyTextElementArray(e){return`[${e.map(n=>this.stringifyTextElement(n)).join(",")}]`}stringifyScoreObject(e){return this.enabledFeatures&1?`{"name":${this.stringifyString(e.name)},"objective":${this.stringifyString(e.objective)}}`:`{name:${this.stringifyString(e.name)},objective:${this.stringifyString(e.objective)}}`}stringifyPlayerObject(e){let n=this.enabledFeatures&1?'"':"",i=[];if(e.name!==void 0&&i.push(`${n}name${n}:${this.stringifyString(e.name)}`),e.id!==void 0&&i.push(`${n}id${n}:${JSON.stringify(e.id)}`),e.texture!==void 0&&i.push(`${n}texture${n}:${e.texture}`),e.cape!==void 0&&i.push(`${n}cape${n}:${e.cape}`),e.model!==void 0&&i.push(`${n}model${n}:${this.stringifyString(e.model)}`),e.hat!==void 0&&i.push(`${n}hat${n}:${e.hat}`),e.properties!==void 0)for(let a of e.properties)i.push(`{name:${this.stringifyString(a.name)},value:${this.stringifyString(a.value)}`+(a.signature===void 0?"":`,signature:${this.stringifyString(a.signature)}`)+"}");return"{"+i.join(",")+"}"}stringifyLegacyHoverEvent(e){switch(e.action){case"show_text":return`{"action":"show_text","contents":${this.stringifyTextElement(e.contents)}}`;case"show_item":{let n='{"action":"show_item","contents":';return typeof e.contents=="string"?n+=this.stringifyString(e.contents):(n+='{"id":'+this.stringifyString(e.contents.id),e.contents.count!==void 0&&(n+=`,"count":${e.contents.count}`),e.contents.tag!==void 0&&(n+=`,"tag":${this.stringifyTextElement(e.contents.tag)}`)),n+"}}"}case"show_entity":{let n=`{"action":"show_entity","contents":{"type":${this.stringifyString(e.contents.type)}`;return Array.isArray(e.contents.id)?n+=`,"id":[${e.contents.id.join(",")}]`:typeof e.contents.id=="string"&&(n+=`,"id":${this.stringifyString(e.contents.id)}`),e.contents.name!==void 0&&(n+=`,"name":${this.stringifyTextElement(e.contents.name)}`),n+"}}"}}}stringifyModernHoverEvent(e){switch(e.action){case"show_text":return`{action:show_text,value:${this.stringifyTextElement(e.value)}}`;case"show_item":{let n=`{action:show_item,id:${this.stringifyString(e.id)}`;return e.count!==void 0&&(n+=`,count:${e.count}`),n+"}"}case"show_entity":{let n=`{action:show_entity,id:${this.stringifyString(e.id)}`;return e.name!==void 0&&(n+=`,name:${this.stringifyTextElement(e.name)}`),Array.isArray(e.uuid)?n+=`,uuid:[I;${e.uuid.join(",")}]`:typeof e.uuid=="string"&&(n+=`,uuid:${this.stringifyString(e.uuid)}`),n+"}"}}}stringifyLegacyClickEvent(e){return`{"action":"${e.action}","value":${this.stringifyString(e.value)}}`}stringifyModernClickEvent(e){switch(e.action){case"open_url":return`{action:open_url,url:${this.stringifyString(e.url)}}`;case"open_file":return`{action:open_file,path:${this.stringifyString(e.path)}}`;case"run_command":return`{action:run_command,command:${this.stringifyString(e.command)}}`;case"suggest_command":return`{action:suggest_command,command:${this.stringifyString(e.command)}}`;case"copy_to_clipboard":return`{action:copy_to_clipboard,value:${this.stringifyString(e.value)}}`;case"change_page":return`{action:change_page,page:${e.page}}`;case"show_dialog":throw new Error("show_dialog click events are not supported in text displays");case"custom":let n=`{action:custom,id:${this.stringifyString(e.id)}`;return e.payload!==void 0&&(n+=`,payload:${this.stringifyTextElement(e.payload)}`),n+"}"}}stringifyTextObject(e){let n=[];for(let i of Object.keys(e)){if(e[i]===void 0)continue;let a=this.enabledFeatures&1?'"':"",r=a+i+a;switch(i){case"type":case"text":case"translate":case"fallback":case"keybind":case"nbt":case"source":case"block":case"entity":case"storage":case"selector":case"font":case"insertion":case"object":case"sprite":case"atlas":case"color":n.push(`${r}:${this.stringifyString(e[i])}`);break;case"shadow_color":if(Array.isArray(e[i])){n.push(`${r}:${JSON.stringify(e[i])}`);break}case"bold":case"italic":case"obfuscated":case"strikethrough":case"underlined":case"interpret":n.push(`${r}:${e[i]}`);break;case"with":case"extra":case"separator":n.push(`${r}:${this.stringifyTextElement(e[i])}`);break;case"score":n.push(`${r}:${this.stringifyScoreObject(e[i])}`);break;case"player":n.push(`${r}:${this.stringifyPlayerObject(e[i])}`);break;case"clickEvent":n.push(`${r}:${this.stringifyLegacyClickEvent(e[i])}`);break;case"click_event":n.push(`${r}:${this.stringifyModernClickEvent(e[i])}`);break;case"hoverEvent":n.push(`${r}:${this.stringifyLegacyHoverEvent(e[i])}`);break;case"hover_event":n.push(`${r}:${this.stringifyModernHoverEvent(e[i])}`);break;default:console.warn(`Unknown key in TextObject: '${i}'`);break}}return`{${n.join(",")}}`}stringifyTextElement(e){if(typeof e=="string")return this.stringifyString(e);if(Array.isArray(e))return this.stringifyTextElementArray(e);if(typeof e=="object"&&e!==null)return this.stringifyTextObject(e);throw console.error(e),new Error("Invalid TextElement")}};s(gd,"JsonTextStringifier");var Sx=(c=>(c.BOLD="bold",c.ITALIC="italic",c.UNDERLINED="underlined",c.STRIKETHROUGH="strikethrough",c.OBFUSCATED="obfuscated",c.COLOR="color",c.FONT="font",c.SHADOW_COLOR="shadow_color",c))(Sx||{}),Ox=(l=>(l.TEXT="text",l.TRANSLATABLE="translatable",l.SCORE="score",l.SELECTOR="selector",l.KEYBIND="keybind",l.NBT="nbt",l.OBJECT="object",l))(Ox||{}),_d=(c=>(c.TEXT="text",c.TRANSLATE="translate",c.SCORE="score",c.SELECTOR="selector",c.KEYBIND="keybind",c.NBT="nbt",c.SPRITE="sprite",c.PLAYER="player",c))(_d||{});var vo={dark_red:"#AA0000",red:"#FF5555",gold:"#FFAA00",yellow:"#FFFF55",dark_green:"#00AA00",green:"#55FF55",aqua:"#55FFFF",dark_aqua:"#00AAAA",dark_blue:"#0000AA",blue:"#5555FF",light_purple:"#FF55FF",dark_purple:"#AA00AA",white:"#FFFFFF",gray:"#AAAAAA",dark_gray:"#555555",black:"#000000"},Ix=(c=>(c.ID="id",c.URL="url",c.PATH="path",c.COMMAND="command",c.PAGE="page",c.VALUE="value",c.DIALOG="dialog",c.PAYLOAD="payload",c))(Ix||{}),ia=class{isJsonTextClass=!0;content;constructor(e){this.content=e}toString(e=!0,n=ia.defaultMinecraftVersion){let i=e?this.flatten():this.content;return new gd(n).stringify(i)}toJSON(){return structuredClone(this.content)}flatten(e=!1){let n=[],i=s((a,r={})=>{let o=ia.getComponentStyle(a,r),l=n[n.length-1];switch(!0){case Array.isArray(a):{for(let c of a)i(c,o);break}case typeof a=="string":if(typeof l=="string"&&ia.hasSameStyle(o,r)){n[n.length-1]=l+a;break}else if(typeof l=="object"&&l.text!==void 0&&ia.hasSameStyle(o,l)){l.text+=a;break}if(!e&&ia.hasSameStyle(o,r)){n.push(a);break}n.push({...r,text:a});break;case typeof a=="object":{let c=ia.getComponentStyle(a,r),d={...a};delete d.with,delete d.extra,n.push({...c,...d});let{with:u=[],extra:p=[]}=a;u.length>0&&i(u,c),p.length>0&&i(p,c);break}default:console.warn("Unknown component type in flatten:",a);break}},"processComponent");return i(this.content),n}static getComponentStyle(e,n=ia.defaultStyle){switch(!0){case Array.isArray(e):return e.length===0?{...n}:ia.getComponentStyle(e[0],n);case typeof e=="string":return{...n};case typeof e=="object":{let i={...n};for(let a of Object.values(Sx))e[a]!==void 0&&(i[a]=e[a]);return i}default:return console.warn("Unknown component type in getComponentStyle:",e),{...n}}}static hasSameStyle(e,n){for(let i of Object.values(Sx))if(e[i]!==n[i])return!1;return!0}static intToRgba(e){let n=e>>24&255,i=e>>16&255,a=e>>8&255,r=e&255;return[i/255,a/255,r/255,n/255]}static rgbaToInt([e,n,i,a]){return e=Math.floor(e*255),n=Math.floor(n*255),i=Math.floor(i*255),a=Math.floor(a*255),a<<24|e<<16|n<<8|i}static intToHex8(e){return`#${(e>>>0).toString(16).padStart(8,"0")}`}static hexToRgba(e){return ia.intToRgba(ia.hexToInt(e))}static moveHex8AlphaToStart(e){return"#"+e.slice(-2)+e.slice(1,-2)}static hexToInt(e){if(!e.startsWith("#")||e.length!==7&&e.length!==9)throw new Error("Invalid hex color format. Expected #RRGGBB or #AARRGGBB.");e.length===7&&(e="#ff"+e.slice(1));let n=parseInt(e.slice(1),16);return n>2147483647?n-4294967296:n}static getColor(e){if(Array.isArray(e))return tinycolor({r:e[0]*255,g:e[1]*255,b:e[2]*255,a:e[3]??1*255});if(typeof e=="number"){let n=ia.intToRgba(e);return tinycolor({r:n[0]*255,g:n[1]*255,b:n[2]*255,a:n[3]*255})}else return e.startsWith("#")?tinycolor(e):e in vo?tinycolor(vo[e]):(console.warn("Unknown color:",e),tinycolor("white"))}static fromString(e,n){return new Yn(n).parse(e)}},jt=ia;s(jt,"JsonText"),lt(jt,"defaultStyle",{color:"white"}),lt(jt,"defaultMinecraftVersion","1.21.9");var lT=(v=>(v[v.LITERAL_KEYS=1]="LITERAL_KEYS",v[v.LITERAL_STRINGS=2]="LITERAL_STRINGS",v[v.SINGLE_QUOTES=4]="SINGLE_QUOTES",v[v.TRAILING_COMMAS=8]="TRAILING_COMMAS",v[v.OPTIONAL_COMMAS=16]="OPTIONAL_COMMAS",v[v.MODERN_EVENT_FORMAT=32]="MODERN_EVENT_FORMAT",v[v.CLICK_EVENT_ACTION_SHOW_DIALOG=64]="CLICK_EVENT_ACTION_SHOW_DIALOG",v[v.TEXT_OBJECT_TYPE_OBJECT=128]="TEXT_OBJECT_TYPE_OBJECT",v[v.SHADOW_COLOR=256]="SHADOW_COLOR",v[v.SHADOW_COLOR_ACCEPTS_STRING=512]="SHADOW_COLOR_ACCEPTS_STRING",v[v.SPACE_ESCAPE_SEQUENCE=1024]="SPACE_ESCAPE_SEQUENCE",v[v.HEX_ESCAPE_SEQUENCE=2048]="HEX_ESCAPE_SEQUENCE",v[v.EIGHT_DIGIT_UNICODE_ESCAPE_SEQUENCE=4096]="EIGHT_DIGIT_UNICODE_ESCAPE_SEQUENCE",v[v.NAMED_UNICODE_ESCAPE_SEQUENCE=8192]="NAMED_UNICODE_ESCAPE_SEQUENCE",v[v.IMPLICIT_TEXT_KEY=16384]="IMPLICIT_TEXT_KEY",v[v.TEXT_OBJECT_INFERRED_KEYS=32768]="TEXT_OBJECT_INFERRED_KEYS",v[v.ALLOW_CLICK_EVENTS=65536]="ALLOW_CLICK_EVENTS",v[v.ALLOW_HOVER_EVENTS=131072]="ALLOW_HOVER_EVENTS",v))(lT||{});function fc(t,e){let n=t.split(".").map(Number),i=e.split(".").map(Number);for(let a=0;ao)return 1;if(r(x.ALPHA_LOWER=Array.from("abcdefghijklmnopqrstuvwxyz"),x.ALPHA_UPPER=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),x.ALPHA=x.ALPHA_LOWER.concat(x.ALPHA_UPPER),x.NUMBER=Array.from("0123456789"),x.INT_START=Array.from("-123456789"),x.NUMBER_START=x.NUMBER.concat(Array.from("-.")),x.ALPHANUMERIC=x.ALPHA.concat(x.NUMBER),x.VERTICAL_WHITESPACE=Array.from(` \r`),x.WHITESPACE=Array.from(" ").concat(x.VERTICAL_WHITESPACE),x.LITERAL=x.ALPHANUMERIC.concat(Array.from("._-+")),x.LITERAL_START=x.ALPHA.concat("_"),x.QUOTES=Array.from(`"'`),x.BINARY=Array.from("01"),x.HEXADECIMAL=x.NUMBER.concat(Array.from("abcdef"),Array.from("ABCDEF")),x.SYNTAX_BOUNDARY=x.WHITESPACE.concat(x.QUOTES,Array.from(",:[]{}"))))(wn||={});var hc=class{s;currentNestingDepth=0;minecraftVersion;enabledFeatures=0;constructor(e){let{minecraftVersion:n=jt.defaultMinecraftVersion,featureFlags:i}=e??{};this.minecraftVersion=n,this.reset(),typeof i=="number"?this.enabledFeatures=i:(this.enabledFeatures|=hc.defaultFeatures,fc(this.minecraftVersion,"1.21.4")>=0&&(this.enabledFeatures|=256),fc(this.minecraftVersion,"1.21.5")>=0&&(this.enabledFeatures|=15392),fc(this.minecraftVersion,"1.21.6")>=0&&(this.enabledFeatures|=64),fc(this.minecraftVersion,"1.21.9")>=0&&(this.enabledFeatures|=128))}parse(e){let n=new pi("Parse JSON Text").start();this.s=new df(e),this.reset();try{this.consumeWhitespace();let i=this.parseTextElement();return this.consumeWhitespace(),this.s.item&&this.throwSyntax(`Unexpected trailing '${this.s.item}' after JsonTextElement`),n.debug(i),new jt(i)}catch(i){throw i instanceof Ys?new Ys(`Internal Parser Error: ${i.message} This is a bug, please report it.`):i}}throwSyntax(e,n){throw new Ko(e,this.s,n)}recordPosition(){return{index:this.s.index,line:this.s.line,column:this.s.column,equals(e){return this.line===e.line&&this.column===e.column}}}reset(){this.currentNestingDepth=0}consumeWhitespace(){this.s.consumeWhile(e=>!!e.item&&wn.WHITESPACE.includes(e.item))}parseTextElement(){let e;return this.s.item==="{"?e=this.parseTextObject():this.s.item==="["?e=this.parseTextElementArray():!this.s.item||wn.QUOTES.includes(this.s.item)||wn.LITERAL_START.includes(this.s.item)?e=this.parseString():this.throwSyntax(`Unexpected '${this.s.item}' in JsonTextElement`),e}parseObject({objectName:e,keys:n=new Set,required:i,parseKey:a,parseValue:r,validateResult:o}){this.currentNestingDepth++,this.currentNestingDepth>hc.maxNestingDepth&&this.throwSyntax("Nesting depth limit exceeded");let l=this.recordPosition();try{this.expect(this.s.item,"{","to begin "+e,!0),this.consumeWhitespace();let c={};for(;this.s.item!=="}";){let d=this.recordPosition();wn.QUOTES.includes(this.s.item)&&d.column++;let p,m=a?.(n,c);if(m?p=m.key:this.enabledFeatures&1?p=this.parseString():p=this.parseQuotedString(),m?.value!==void 0)c[p]=m.value,this.consumeWhitespace(),this.s.item===":"&&this.throwSyntax(`Unknown key '${m.value}' in ${e}`,{...d,pointerLength:m.value.length});else{c[p]!==void 0&&this.throwSyntax(`Duplicate key '${p}'`,{...d,pointerLength:p.length}),n.size>0&&!n.has(p)&&this.throwSyntax(`Unknown key '${p}' in ${e}`,{...d,pointerLength:p.length}),this.expectSyntaxBoundaryAfter(`key '${p}'`),this.consumeWhitespace(),this.expect(this.s.item,":",`to follow key '${p}'`,!0),this.consumeWhitespace(),this.s.item||this.throwSyntax("Unexpected EOF in "+e,this.s);let f=this.recordPosition();r(p,c),f.equals(this.s)&&this.throwSyntax(`Missing value for '${p}'`,this.s)}if(this.consumeWhitespace(),this.s.item===",")this.s.consume(),this.consumeWhitespace(),this.s.item===","&&this.throwSyntax("Extra comma",this.s),this.s.item==="}"&&!(this.enabledFeatures&8)&&this.throwSyntax("Trailing comma in "+e,this.s);else{if(this.s.item==="}")break;this.s.item===void 0?this.throwSyntax("Unexpected EOF in "+e,this.s):this.enabledFeatures&16||this.throwSyntax(`Expected ',' or '}' after ${e} entry`)}}if(this.s.consume(),i)for(let d of i)c[d]===void 0&&this.throwSyntax(`Missing required field '${String(d)}' in `+e,l);if(o){let d=o(c);d&&this.throwSyntax(d,l)}return this.currentNestingDepth--,c}catch(c){this.throwSyntax("Invalid "+e,{child:c,...l})}}normalizeHexColor(e){return e.startsWith("0x")&&(e="#"+e.substring(2)),/^#[0-9a-fA-F]{6}$/i.test(e)||this.throwSyntax(`Invalid hex color '${e}'`,this.s),e.toLowerCase()}normalizeHex8Color(e){return e.startsWith("0x")&&(e="#"+e.substring(2)),/^#[0-9a-fA-F]{8}$/i.test(e)||this.throwSyntax(`Invalid hex color '${e}'`,this.s),e.toLowerCase()}assertTextObjectColorIsValid(e){e.startsWith("#")?this.normalizeHexColor(e):e in vo||this.throwSyntax(`Unknown color '${e}'`,this.s)}parseTextObjectColor(){let e=this.parseString();if(e.startsWith("#"))return this.normalizeHexColor(e),e;if(e in vo)return e;this.throwSyntax(`Unknown color '${e}'`,this.s)}parseTextObjectShadowColor(){if(this.enabledFeatures&256||this.throwSyntax("'shadow_color' field is only available in Minecraft 1.21.4 and above"),this.s.item==="["){let n=this.parseFloatArray(4);for(let i of n)(typeof i!="number"||i<0||i>1)&&this.throwSyntax("'shadow_color' array values must be numbers between 0 and 1");return n}else if(wn.NUMBER.includes(this.s.item)){let n=this.parseNumber("int"),i;return n.startsWith("0x")?i=parseInt(n.substring(2),16):i=parseInt(n,10),(typeof i!="number"||i<0||i>4294967295)&&this.throwSyntax("'shadow_color' value must be a number between 0 and 0xffffffff"),jt.intToRgba(i)}this.enabledFeatures&512||this.throwSyntax("Expected value of 'shadow_color' to be a float-array or integer.");let e=this.parseString();return e.startsWith("#")?e=this.normalizeHex8Color(e):e in vo?e=vo[e]:this.throwSyntax(`Unknown color '${e}'`,this.s),jt.hexToRgba(e)}parseTextObject(){return this.parseObject({objectName:"TextObject",keys:new Set(["type","font","color","bold","italic","underlined","strikethrough","obfuscated","extra","insertion","clickEvent","hoverEvent","shadow_color","click_event","hover_event","text","translate","fallback","with","score","selector","separator","keybind","nbt","block","entity","storage","interpret","object","sprite","atlas","player"]),parseKey:(e,n)=>{if(this.enabledFeatures&32768){if(this.s.item==="#")return n.color!==void 0&&this.throwSyntax("Cannot infer keyless value as 'color' when 'color' is already defined",this.s),{key:"color",value:this.parseHashedHexColor()};if(this.s.look(0,2)==="0x"){n.color!==void 0&&this.throwSyntax("Cannot infer keyless value as 'color' when 'color' is already defined",this.s);let a=this.parseNumber("hexadecimal");return{key:"color",value:this.normalizeHexColor(a)}}}let i;if(this.enabledFeatures&1?i=this.parseString():i=this.parseQuotedString(),e.has(i)||n[i]!=null)return{key:i};if(this.enabledFeatures&32768){if(n.color===void 0&&(n.text!==void 0||n.translate!==void 0))return this.assertTextObjectColorIsValid(i),{key:"color",value:i};if(n.translate===void 0&&(n.fallback!==void 0||n.with!==void 0))return{key:"translate",value:i};if(n.text===void 0)return{key:"text",value:i}}return{key:i}},parseValue:(e,n)=>{switch(e){case"sprite":case"atlas":this.enabledFeatures&128||this.throwSyntax(`'${e}' field is only available in Minecraft 1.21.9 and above`);case"insertion":case"font":case"keybind":case"selector":case"nbt":case"block":case"entity":case"storage":case"text":case"translate":case"fallback":n[e]=this.parseString();break;case"bold":case"italic":case"obfuscated":case"strikethrough":case"underlined":case"interpret":n[e]=this.parseBoolean();break;case"source":n[e]=this.parseString(["storage","block","entity"]);break;case"separator":n[e]=this.parseTextElement();break;case"object":this.enabledFeatures&128||this.throwSyntax("'object' field is only available in Minecraft 1.21.9 and above"),n[e]=this.parseString(["atlas","player"]);break;case"player":this.enabledFeatures&128||this.throwSyntax("'player' field is only available in Minecraft 1.21.9 and above"),n[e]=this.parsePlayerObject();break;case"type":{let a=this.parseString(Object.values(Ox));a==="object"&&!(this.enabledFeatures&128)&&this.throwSyntax(`Object type '${"object"}' is only available in Minecraft 1.21.9 and above`),n[e]=a;break}case"color":n[e]=this.parseTextObjectColor();break;case"shadow_color":n[e]=this.parseTextObjectShadowColor();break;case"with":case"extra":n[e]=this.parseTextElementArray();break;case"score":n[e]=this.parseScoreObject();break;case"clickEvent":{this.enabledFeatures&65536||this.throwSyntax("'clickEvent' field is not allowed");let a=this.parseLegacyClickEventObject();if(this.enabledFeatures&32){n.click_event!==void 0&&this.throwSyntax("Cannot use both 'clickEvent' and 'click_event' fields. For Minecraft versions below 1.21.5, use only 'clickEvent'"),n.click_event=this.transformLegacyClickEventToModern(a),delete n.clickEvent;break}n[e]=a;break}case"click_event":{this.enabledFeatures&65536||this.throwSyntax("'click_event' field is not allowed");let a=this.parseModernClickEventObject();if(!(this.enabledFeatures&32)){n.clickEvent!==void 0&&this.throwSyntax("Cannot use both 'clickEvent' and 'click_event' fields. For Minecraft versions 1.21.5 and above, use only 'click_event'"),n.clickEvent=this.transformModernClickEventObjectToLegacy(a),delete n.click_event;break}n[e]=a;break}case"hoverEvent":{this.enabledFeatures&131072||this.throwSyntax("'hoverEvent' field is not allowed");let a=this.parseLegacyHoverEventObject();if(this.enabledFeatures&32){n.hover_event!==void 0&&this.throwSyntax("Cannot use both 'hoverEvent' and 'hover_event' fields. For Minecraft versions below 1.21.5, use only 'hoverEvent'"),n.hover_event=this.transformLegacyHoverEventObjectToModern(a),delete n.hoverEvent;break}n[e]=a;break}case"hover_event":this.enabledFeatures&131072||this.throwSyntax("'hover_event' field is not allowed");let i=this.parseModernHoverEventObject();if(!(this.enabledFeatures&32)){n.hoverEvent!==void 0&&this.throwSyntax("Cannot use both 'hoverEvent' and 'hover_event' fields. For Minecraft versions 1.21.5 and above, use only 'hover_event'"),n.hoverEvent=this.transformModernHoverEventObjectToLegacy(i),delete n.hover_event;break}n[e]=i;break}},validateResult:e=>{this.enabledFeatures&32768&&e.text!==void 0&&e.translate===void 0&&(e.with!==void 0||e.fallback!==void 0)&&(e.translate=e.text,delete e.text);let n=Object.values(_d).filter(i=>e[i]!==void 0);if(n.length>1)return`Only one content field may be present, but found ${n.length}: '${n.join("', '")}'`;if(Object.values(_d).every(i=>e[i]==null))if(this.enabledFeatures&16384)e.text??="";else return`At least one content field must be present: ${Object.values(_d).join(", ")}`;switch(e.type){case"text":if(e.text==null)return`'text' is required when 'type' is '${"text"}'`;break;case"translatable":if(e.translate==null)return`'translate' is required when 'type' is '${"translatable"}'`;break;case"score":if(e.score==null)return`'score' is required when 'type' is '${"score"}'`;break;case"selector":if(e.selector==null)return`'selector' is required when 'type' is '${"selector"}'`;break;case"keybind":if(e.keybind==null)return`'keybind' is required when 'type' is '${"keybind"}'`;break;case"nbt":if(e.nbt==null)return`'nbt' is required when 'type' is '${"nbt"}'`;break;case"object":if(e.sprite==null)return`'sprite' is required when 'type' is '${"object"}'`;break}if(e.translate==null&&e.with!=null)return"'with' requires 'translate'";if(e.translate==null&&e.fallback!=null)return"'fallback' requires 'translate'";if(e.separator!=null&&e.nbt==null&&e.selector==null)return"'separator' requires 'nbt' or 'selector'";if(e.object!=null){if(e.object==="player"&&e.player==null)return"player object requires 'player'";if(e.object==="atlas"&&e.sprite==null)return"atlas object requires 'sprite'";if(e.player==null&&e.sprite==null)return"'object' requires 'player' or 'sprite'"}if(e.atlas!=null&&e.sprite==null)return"'atlas' requires 'sprite'";if(e.nbt==null){if(e.source!=null)return"'source' requires 'nbt'";if(e.block!=null)return"'block' requires 'nbt'";if(e.entity!=null)return"'entity' requires 'nbt'";if(e.storage!=null)return"'storage' requires 'nbt'"}if(e.nbt!=null){if(e.block==null&&e.entity==null&&e.storage==null)return"'nbt' requires 'block', 'entity', or 'storage'";switch(e.source){case"block":if(e.block==null)return"'nbt' with source of 'block' requires 'block'";break;case"entity":if(e.entity==null)return"'nbt' with source of 'entity' requires 'entity'";break;case"storage":if(e.storage==null)return"'nbt' with source of 'storage' requires 'storage'";break}}}})}parsePlayerPropertyObject(){return this.parseObject({objectName:"player property object",keys:new Set(["name","value","signature"]),required:new Set(["name","value"]),parseValue:(e,n)=>{switch(e){case"name":case"value":case"signature":n[e]=this.parseString();break}}})}parsePlayerPropertiesArray(){return this.parseArray({arrayName:"player properties array",parseItem:this.parsePlayerPropertyObject.bind(this)})}parsePlayerObject(){return this.parseObject({objectName:"player object",keys:new Set(["name","id","texture","cape","model","properties","hat"]),parseValue:(e,n)=>{switch(e){case"id":if(this.s.item==="["){n[e]=this.parseIntArray(!1,4);break}case"name":case"texture":case"cape":n[e]=this.parseString();break;case"hat":n[e]=this.parseBoolean();break;case"model":n[e]=this.parseString(["wide","slim"]);break;case"properties":n[e]=this.parsePlayerPropertiesArray();break}}})}parseUnknownArray(e){return this.parseArray({arrayName:e,parseItem:this.parseUnknownValue.bind(this)})}parseUnknownValue(){if(this.s.item==="{")return this.parseUnknownObject("object");if(this.s.item==="[")return this.parseUnknownArray("array");if(!this.s.item)this.throwSyntax("Unexpected EOF",this.s);else{if(wn.QUOTES.includes(this.s.item))return this.parseQuotedString();if(this.s.item==="t"||this.s.item==="f")return this.parseBoolean();if(wn.NUMBER_START.includes(this.s.item))return this.parseNumber();if(wn.LITERAL_START.includes(this.s.item))return this.parseLiteral();this.throwSyntax(`Unexpected '${this.s.item}'`,this.s)}}parseUnknownObject(e){return this.parseObject({objectName:e,parseValue:(n,i)=>{i[n]=this.parseUnknownValue()}})}parseScoreObject(){return this.parseObject({objectName:"score object",keys:new Set(["name","objective"]),required:new Set(["name","objective"]),parseValue:(e,n)=>{switch(e){case"name":case"objective":n[e]=this.parseString();break}}})}parseLegacyClickEventObject(){return this.parseObject({objectName:"clickEvent",keys:new Set(["action","value"]),required:new Set(["action","value"]),parseValue:(e,n)=>{switch(e){case"action":let i=this.parseString(["open_url","open_file","run_command","suggest_command","change_page","copy_to_clipboard"]);i==="open_file"&&this.throwSyntax("clickEvent 'open_file' cannot be used by commands"),n[e]=i;break;case"value":n[e]=this.parseString();break}}})}parseModernClickEventObject(){return this.parseObject({objectName:"click_event",keys:new Set(["action","url","path","command","page","value","dialog","id","payload"]),required:new Set(["action"]),parseValue:(e,n)=>{switch(e){case"action":let i=this.parseString(["open_url","open_file","run_command","suggest_command","change_page","copy_to_clipboard","show_dialog","custom"]);i==="open_file"&&this.throwSyntax("Click event 'open_file' cannot be used by commands"),i==="show_dialog"&&(this.enabledFeatures&64||this.throwSyntax("Click event 'show_dialog' is only available in Minecraft 1.21.6 and above")),n[e]=i;break;case"url":let a=this.parseString(),r;try{r=new URL(a)}catch(o){this.throwSyntax(`Invalid URL format for 'url' in 'open_url' clickEvent: ${o.message}`)}r.protocol!=="http:"&&r.protocol!=="https:"&&this.throwSyntax("Invalid URL: Protocol must be 'http:' or 'https:'"),n[e]=a;break;case"path":n[e]=this.parseString();break;case"command":n[e]=this.parseString();break;case"page":n[e]=parseInt(this.parseNumber("int"));break;case"value":n[e]=this.parseString();break;case"dialog":n[e]=this.parseUnknownObject("click_event.dialog");break;case"id":n[e]=this.parseString();break;case"payload":n[e]=this.parseUnknownValue();break}},validateResult:e=>{let n=Object.values(Ix);switch(e.action){case"open_url":if(e.url===void 0)return"Click event of type 'open_url' missing required key 'url'";n=n.filter(i=>i!=="url");break;case"open_file":if(e.path===void 0)return"Click event of type 'open_file' missing required key 'path'";n=n.filter(i=>i!=="path");break;case"run_command":if(e.command===void 0)return"Click event of type 'run_command' missing required key 'command'";n=n.filter(i=>i!=="command");break;case"suggest_command":if(e.command===void 0)return"Click event of type 'suggest_command' missing required key 'command'";n=n.filter(i=>i!=="command");break;case"change_page":if(e.page===void 0)return"Click event of type 'change_page' missing required key 'page'";n=n.filter(i=>i!=="page");break;case"copy_to_clipboard":if(e.value===void 0)return"Click event of type 'copy_to_clipboard' missing required key 'value'";n=n.filter(i=>i!=="value");break;case"custom":if(e.id===void 0)return"Click event of type 'custom' missing required key 'id'";n=n.filter(i=>i!=="id"),n=n.filter(i=>i!=="payload");break;case"show_dialog":if(e.dialog===void 0)return"Click event of type 'show_dialog' missing required key 'dialog'";n=n.filter(i=>i!=="dialog");break}if(n.some(i=>e[i]!==void 0))return`Click event of type '${e.action}' cannot have keys: ${n.map(i=>`'${i}'`).join(", ")}`}})}transformModernClickEventObjectToLegacy(e){switch(e.action){case"open_url":return{action:"open_url",value:e.url};case"open_file":this.throwSyntax("Click event 'open_file' cannot be used by commands");case"run_command":case"suggest_command":return{action:e.action,value:e.command};case"change_page":return{action:"change_page",value:String(e.page)};case"copy_to_clipboard":return{action:"copy_to_clipboard",value:e.value};case"show_dialog":this.throwSyntax("Click events of type 'show_dialog' are not supported in versions below 1.21.6");case"custom":this.throwSyntax("Click events of type 'custom' are not supported in versions below 1.21.5")}}transformLegacyClickEventToModern(e){switch(e.action){case"open_url":{let n;try{n=new URL(e.value).toString()}catch{this.throwSyntax("Invalid URL format for 'open_url' clickEvent")}return/^https?:\/\//.exec(e.value)||this.throwSyntax("Invalid URL format for 'open_url' clickEvent. URL must start with 'http://' or 'https://'"),{action:"open_url",url:n}}case"open_file":this.throwSyntax("Click event 'open_file' cannot be used by commands");case"run_command":case"suggest_command":return{action:e.action,command:e.value};case"change_page":return{action:"change_page",page:Number(e.value)};case"copy_to_clipboard":return{action:"copy_to_clipboard",value:e.value}}}parseLegacyHoverEventObjectShowItemContents(){return this.parseObject({objectName:"hoverEvent.contents",keys:new Set(["id","count","tag"]),required:new Set(["id"]),parseValue:(e,n)=>{switch(e){case"id":n[e]=this.parseString();break;case"count":n[e]=parseInt(this.parseNumber("byte"));break;case"tag":n[e]=this.parseUnknownValue();break}}})}parseLegacyHoverEventObjectShowEntityContents(){return this.parseObject({objectName:"hoverEvent.contents",keys:new Set(["type","id","name"]),required:new Set(["type","id"]),parseValue:(e,n)=>{switch(e){case"id":if(this.s.item==="["){n[e]=this.parseIntArray(!1,4);break}case"type":case"name":n[e]=this.parseString();break}}})}parseLegacyHoverEventObject(){return this.parseObject({objectName:"hoverEvent",keys:new Set(["action","contents"]),required:new Set(["action","contents"]),parseValue:(e,n)=>{switch(e){case"action":n[e]=this.parseString(["show_text","show_item","show_entity"]);break;case"contents":switch(n.action){case void 0:this.throwSyntax("'action' must be defined before 'contents' in hoverEvent");case"show_text":{n[e]=this.parseTextElement();break}case"show_item":{if(this.s.item==="{"){n[e]=this.parseLegacyHoverEventObjectShowItemContents();break}n[e]=this.parseString();break}case"show_entity":{n[e]=this.parseLegacyHoverEventObjectShowEntityContents();break}}break}}})}parseModernHoverEventObject(){return this.parseObject({objectName:"hover_event",keys:new Set(["action","value","id","count","components","name","uuid"]),required:new Set(["action"]),parseValue:(e,n)=>{switch(e){case"action":n[e]=this.parseString(["show_text","show_item","show_entity"]);break;case"uuid":if(this.s.item==="["){n[e]=this.parseIntArray(!1,4);break}case"id":case"name":n[e]=this.parseString();break;case"value":n[e]=this.parseTextElement();break;case"count":n[e]=parseInt(this.parseNumber("byte"));break;case"components":n[e]=this.parseUnknownValue();break}},validateResult:e=>{if(e.action===void 0)return"Hover event must include 'action' field";switch(e.action){case"show_text":if(e.value===void 0)return"Hover event 'show_text' missing required field 'value'";break;case"show_item":if(e.id===void 0)return"Hover event 'show_item' missing required field 'id'";break;case"show_entity":if(e.id===void 0)return"Hover event 'show_entity' missing required field 'id'";if(e.uuid===void 0)return"Hover event 'show_entity' missing required field 'uuid'";break}switch(!0){case(e.value!==void 0&&e.action!=="show_text"):return"'value' is only valid when hover_event action is 'show_text'";case(e.count!==void 0&&e.action!=="show_item"):return"'count' is only valid when hover_event action is 'show_item'";case(e.id!==void 0&&e.action!=="show_item"&&e.action!=="show_entity"):return"'id' is only valid when hover_event action is 'show_item' or 'show_entity'";case(e.components!==void 0&&e.action!=="show_item"):return"'components' is only valid when hover_event action is 'show_item'";case(e.name!==void 0&&e.action!=="show_entity"):return"'name' is only valid when hover_event action is 'show_entity'";case(e.uuid!==void 0&&e.action!=="show_entity"):return"'uuid' is only valid when hover_event action is 'show_entity'"}}})}transformLegacyHoverEventObjectToModern(e){switch(e.action){case"show_text":return{action:"show_text",value:e.contents};case"show_item":return typeof e.contents=="string"?{action:"show_item",id:e.contents}:(e.contents.tag!==void 0&&this.throwSyntax("Cannot transform 'hoverEvent' with 'tag' into modern 'hover_event'. Please use 'hover_event' for Minecraft versions 1.21.5 and above"),{action:"show_item",id:e.contents.id,count:e.contents.count});case"show_entity":return{action:"show_entity",id:e.contents.type,uuid:e.contents.id,name:e.contents.name}}}transformModernHoverEventObjectToLegacy(e){switch(e.action){case"show_text":return{action:"show_text",contents:e.value};case"show_item":return e.components!==void 0&&this.throwSyntax("Cannot transform 'hover_event' with 'components' into legacy 'hoverEvent'. Please use 'hoverEvent' for Minecraft versions below 1.21.5"),{action:"show_item",contents:{id:e.id,count:e.count}};case"show_entity":return Array.isArray(e.uuid)&&this.throwSyntax("Cannot transform 'hover_event' with 'uuid' as int-array into legacy 'hoverEvent'. Please either use a string UUID, or use 'hoverEvent' for Minecraft versions below 1.21.5"),{action:"show_entity",contents:{type:e.id,id:e.uuid,name:e.name}}}}parseArray({arrayName:e,parsePrefix:n,parseItem:i,expectedLength:a}){this.currentNestingDepth++,this.currentNestingDepth>hc.maxNestingDepth&&this.throwSyntax("Nesting depth limit exceeded",this.s),this.expect(this.s.item,"[","to begin "+e,!0),this.consumeWhitespace(),n&&(n(),this.consumeWhitespace());let r=[];for(;this.s.item!=="]";){this.consumeWhitespace();let o=this.recordPosition(),l=i();if(o.equals(this.s))throw new Ys(`parseItem function for ${e} did not consume any input`);if(r.push(l),r.length>hc.maxArrayLength&&this.throwSyntax("Array length limit exceeded",this.s),this.expectSyntaxBoundaryAfter("array item"),this.consumeWhitespace(),a!==void 0&&r.length>a&&this.throwSyntax("Too many items in "+e+` (expected ${a})`,o),this.s.item===",")this.s.consume(),this.consumeWhitespace(),this.s.item===","&&this.throwSyntax("Extra comma",this.s),this.s.item==="]"&&!(this.enabledFeatures&8)&&this.throwSyntax("Trailing comma in "+e,this.s);else{if(this.s.item==="]")break;this.s.item===void 0?this.throwSyntax("Unexpected EOF in "+e,this.s):this.enabledFeatures&16||this.throwSyntax(`Expected ',' or ']' after ${e} item`,this.s)}}return a!==void 0&&r.length{this.s.item==="I"?(this.s.consume(),this.consumeWhitespace(),this.expect(this.s.item,";","to follow array type identifier",!0)):e&&this.throwSyntax("Expected explicit int-array",this.s)},parseItem:()=>parseInt(this.parseNumber("int")),expectedLength:n})}parseFloatArray(e){return this.parseArray({arrayName:"float-array",parseItem:()=>parseFloat(this.parseNumber("float")),expectedLength:e})}collectHexDigits(e){let n="";for(let i=0;i!!n.item&&wn.LITERAL.includes(n.item));if(e.length===0)throw new Ys("Literal string parsing failed unexpectedly");return e}parseString(e){let n,i=this.recordPosition();return this.s.item&&wn.QUOTES.includes(this.s.item)?n=this.parseQuotedString():n=this.parseLiteral(),e&&!e.includes(n)&&this.throwSyntax(`Expected one of ${e.join(", ")}`,i),n}parseBoolean(){if(this.s.look(0,4).toLowerCase()==="true")return this.s.consumeN(4),!0;if(this.s.look(0,5).toLowerCase()==="false")return this.s.consumeN(5),!1;this.throwSyntax("Expected boolean",this.s)}parseDigits(e,n=wn.NUMBER,i=0,a=1/0){let r="";for(;this.s.item&&n.includes(this.s.item);){r+=this.s.item,r.length>a&&this.throwSyntax(`Too many ${e} digits (max ${a})`,this.s),this.s.consume();let o=this.recordPosition(),l=wn.WHITESPACE.includes(this.s.item);if(this.consumeWhitespace(),this.s.item==="_")l&&this.throwSyntax(`Underscore must be between ${e} digits`,this.s),this.s.consumeWhile(c=>c.item==="_"),this.s.item&&n.includes(this.s.item)||this.throwSyntax(`Underscore must be between ${e} digits`,this.s);else if(l){this.s.index=o.index-1,this.s.consume();break}}return r.length(t.properties={...t.properties},t),"fixClassPropertyInheritance");var hT=Ee("crypto");var cT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9ba0UqCnYQcYjQOtlFRRxLFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi7OCk6CIl/i8ptIjx4Lgf7+497t4B3maVKUZPDFBUU08n4kIuvyoEXuHHEHoxjojIDC2ZWczCdXzdw8PXuyjPcj/35xiQCwYDPAJxjGm6SbxBPLtpapz3iUOsLMrE58STOl2Q+JHrksNvnEs2e3lmSM+m54lDxEKpi6UuZmVdIZ4hDsuKSvnenMMy5y3OSrXO2vfkLwwW1JUM12mOIYElJJGCAAl1VFCFiSitKikG0rQfd/GP2v4UuSRyVcDIsYAaFIi2H/wPfndrFKennKRgHPC/WNZHBAjsAq2GZX0fW1brBPA9A1dqx19rAnOfpDc6WvgIGNwGLq47mrQHXO4AI0+aqIu25KPpLRaB9zP6pjwwfAv0rzm9tfdx+gBkqavlG+DgEJgoUfa6y7v7unv790y7vx+v+3K/mrIdyAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFEAYjBv19RUYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAJUlEQVQY02P8////fwY0wMjIyAjnoCtA5zMxEAB0UMCCzWEkAQDoPxACvFjV6wAAAABJRU5ErkJggg==";var{BufferAttribute:N0e,BufferGeometry:R0e,Float32BufferAttribute:ySe,InstancedBufferAttribute:wSe,InterleavedBuffer:ESe,InterleavedBufferAttribute:kSe,TriangleFanDrawMode:jSe,TriangleStripDrawMode:ASe,TrianglesDrawMode:TSe,Vector3:CSe}=THREE;function wa(t,e=!1){let n=t[0].index!==null,i=new Set(Object.keys(t[0].attributes)),a=new Set(Object.keys(t[0].morphAttributes)),r={},o={},l=t[0].morphTargetsRelative,c=new R0e,d=0;for(let u=0;u"||o===""||gc.set(o,String.fromCodePoint(l))}console.log(`Loaded ${gc.size} Unicode character mappings`,gc);for(let i of ve.all)i.updateTextMesh()}s(M0e,"loadUnicodeCharMappings");K.NETWORK_CONNECTED.subscribe(()=>{M0e()});function B0e(t,e){let n="";for(let i=0;i1114111?(console.warn(`Invalid unicode code point: ${i}`),`\\${e}${i}`):String.fromCodePoint(a)}s(L0e,"resolveUnicodeEscapeSequence");function V0e(t){let e="",n=new df(t);for(;n.item;){if(n.item==="\\"){let i=n.look(1);if((i==="\\"||i==="'"||i==='"'||i==="n"||i==="s"||i==="t"||i==="b"||i==="f"||i==="r")&&Dx[i]){if(Dx[i]){n.consume(),n.consume(),e+=Dx[i];continue}}else if(i==="N"){n.consume(),e+=P0e(n);continue}else if(i==="u"||i==="U"||i==="x"){n.consume(),e+=L0e(n);continue}}e+=n.item,n.consume()}return e}s(V0e,"resolveEscapeSequences");var xd=class{chars=[];str;constructor(e){if(this.str=e,this.str!==""){this.str=V0e(e);for(let n of this.str.matchAll(xd.regex))this.chars.push(n[0])}}[Symbol.iterator](){return this.chars[Symbol.iterator]()}get length(){return this.chars.length}includes(e){return this.chars.includes(e)}indexOf(e){return this.chars.indexOf(e)}slice(e,n){let i=this.chars.slice(e,n);return xd.fromChars(i)}at(e){if(!(e<0||e>=this.chars.length))return this.chars[e]}append(e){this.chars.push(e),this.str+=e}toString(){return this.str}static fromChars(e){return new xd(e.join(""))}},hn=xd;s(hn,"UnicodeString"),lt(hn,"regex",/[^]/gmu);function dT(t){if(typeof t=="string")return new hn(t);switch(!0){case t.text!==void 0:return new hn(t.text);case t.translate!==void 0:return new hn(`{${t.translate}}`);case t.selector!==void 0:return new hn(`{${t.selector}}`);case t.score!==void 0:return new hn(`{${t.score.name}:${t.score.objective}}`);case t.keybind!==void 0:return new hn(`{${t.keybind}}`);case t.nbt!==void 0:switch(!0){case t.block!==void 0:return new hn(`{${t.block}:${t.nbt}}`);case t.entity!==void 0:return new hn(`{${t.entity}:${t.nbt}}`);case t.storage!==void 0:return new hn(`{${t.storage}:${t.nbt}}`);default:return new hn(`{${t.nbt}}`)}case t.sprite!==void 0:return new hn(`{sprite:${t.sprite}}`);case t.player!==void 0:return new hn(`{player:${t.player}}`);default:return console.warn("Unknown JSON Text element:",t),new hn("{Unknown Element}")}}s(dT,"getRawText");function z0e(t){let e=new pi("Parse Words").start(),n=new jt(t).flatten(!0);if(!n.length)return[];let i=[],a,r=n.shift();if(r===void 0)return i;let o=dT(r),l={style:jt.getComponentStyle(r),start:0,end:0};for(;r!==void 0;){for(let c of o){if(c===" ")a&&a.text.at(-1)!==" "&&(l.end++,Object.keys(l.style).length&&(a.styles.push({...l}),l.start=0,l.end=0),i.push(a),a=void 0);else if(c===` `){a&&(Object.keys(l.style).length&&(l.starte){l.words.length&&(a.push(l),o=Math.max(o,l.width)),l={words:[],width:0};let p=new hn(""),m=0,f=0,g=u.shift();if(!g)throw new Error(`No active style found for word '${c.text.toString()}'`);for(let x=0;x1&&x>=g.end&&(g=u.shift());let h=r.getTextWidth(new hn(_),g);if(p.length>0&&m+(h-1)>e){let v=c.styles.filter(b=>b.start=f).map(b=>({...b,start:Math.max(b.start-f,0),end:Math.min(b.end-f,p.length)}));a.push({words:[{text:p,styles:v,width:d}],width:m}),o=Math.max(o,m),f+=p.length,p=new hn(""),m=0}p.append(_),m+=h}if(p){let x=c.styles.filter(_=>_.start=f).map(_=>({..._,start:Math.max(_.start-f,0),end:Math.min(_.end-f,p.length)}));o=Math.max(o,m),l={words:[{text:p,styles:x,width:d}],width:m}}continue}else if(c.forceWrap)l.words.length&&(a.push(l),o=Math.max(o,l.width)),l={words:[],width:0};else if(l.words.length&&l.width+(d-1)>e){let p=l.words.at(-1);p?.text.at(-1)===" "&&(l.words.pop(),l.width-=p.width),a.push(l),o=Math.max(o,l.width),l={words:[],width:0}}c.width=d,l.words.push(c),l.width+=d}return l.words.length&&(a.push(l),o=Math.max(o,l.width)),n.debug(),{lines:a,backgroundWidth:o}}s(pT,"wrapJsonText");var gT=new THREE.TextureLoader().load(cT);function _T(){return{type:"bitmap",ascent:7,width:6,atlas:gT,bitmapUV:{x:0,y:0,width:8,height:8}}}s(_T,"createMissingCharacter");var vc=class{type;loaded=!1;constructor(e){this.type=e.type}static fromAssetPath(e){e.endsWith(".json")||(e+=".json");let n=Mi(e);switch(n.type){case"bitmap":return new yd(n);case"reference":return new vd(n);case"space":return new bd(n);default:throw new Error(`Unsupported font provider type: ${n.type}`)}}};s(vc,"FontProvider");var vd=class extends vc{reference;constructor(e){super(e);let n=Fr(e.id,"font");this.reference=new Xo(e.id,n+".json")}async load(){return this.loaded?this:(await this.reference.load(),this.loaded=!0,this)}getChar(e){let n=this.reference.getChar(e);if(!(n.type==="bitmap"&&n.atlas===gT))return n}};s(vd,"ReferenceFontProvider");var bd=class extends vc{advances;constructor(e){super(e),this.advances=e.advances}load(){return this.loaded?this:(this.loaded=!0,this)}getChar(e){if(this.advances[e]!==void 0)return{type:"space",width:this.advances[e]}}};s(bd,"SpaceFontProvider");var yd=class extends vc{bitmapPath;charHeight;charWidth;ascent;chars=[];atlas=THREE.Texture.DEFAULT_IMAGE;canvas=document.createElement("canvas");charCache=new Map;constructor(e){super(e),this.type=e.type,this.bitmapPath=Fr(e.file,"textures"),this.charHeight=e.height??8,this.charWidth=8,this.ascent=e.ascent;for(let n of e.chars)this.chars.push(new hn(n))}async load(){if(this.loaded)return this;let e=Zo(this.bitmapPath),n=await new THREE.TextureLoader().loadAsync(e);return this.atlas=n,this.charHeight=n.image.height/this.chars.length,this.charWidth=n.image.width/this.chars[0].length,this.canvas.width=n.image.width,this.canvas.height=n.image.height,this.canvas.getContext("2d",{willReadFrequently:!0}).drawImage(this.atlas.image,0,0),this.loaded=!0,this}getCharIndex(e){for(let n of this.chars)if(n.includes(e))return[this.chars.indexOf(n),n.indexOf(e)];return[-1,-1]}getChar(e){let n=this.charCache.get(e);if(n)return n;let i=this.getCharIndex(e);if(i[0]===-1)return;let a=i[1]*this.charWidth,r=i[0]*this.charHeight,o=this.canvas.getContext("2d").getImageData(a,r,this.charWidth,this.charHeight),l=0;for(let c=0;c0){l=c+1;break}}return l===0?_T():(this.charCache.set(e,{type:"bitmap",ascent:this.ascent,width:l+1,atlas:this.atlas,bitmapUV:{x:a,y:r,width:l,height:this.charHeight}}),this.charCache.get(e))}};s(yd,"BitmapFontProvider");var Xs=class{id;providers=[];fallback;loaded=!1;charCache=new Map;geoCache=new Map;materialCache=new Map;constructor(e,n,i){this.id=e,this.fallback=i;let a;try{a=Mi(n)}catch(r){throw console.error(`Failed to load font JSON from ${n}:`,r),r}for(let r of a.providers)switch(r.type){case"bitmap":this.providers.push(new yd(r));break;case"reference":this.providers.push(new vd(r));break;case"space":this.providers.push(new bd(r));break;default:throw new Error(`Unsupported font provider type: ${r.type}`)}Xs.all.push(this)}static getById(e){return Xs.all.find(n=>n.id===e)}async load(){return this.loaded?this:(await Promise.all(this.providers.map(e=>e.load())),this.loaded=!0,this)}getChar(e){let n=this.charCache.get(e);if(n)return n;for(let i of this.providers){let a=i.getChar(e);if(a)return this.charCache.set(e,a),a}return _T()}getTextWidth(e,n){let i=0,a=n?.style.bold?1:0,r=this;if(n?.style.font&&n.style.font!==this.id){let o=Xs.getById(n.style.font);o&&(r=o)}for(let o of e){if(o===` `)break;let l=r.getChar(o);if(!l){console.warn("Encountered unknown character while getting text width:",o);continue}i+=l.width+a}return Math.max(i,0)}getWordWidth(e){let n=0,i=this;for(let a of e.styles){if(a.style.font&&a.style.font!==this.id){let l=Xs.getById(a.style.font);l&&(i=l)}let r=e.text.slice(a.start,a.end),o=i.getTextWidth(r,a);n+=o}return Math.max(n,0)}getColorMaterial(e){let n=e.toHex8String(),i=this.materialCache.get(n);if(!i){let a=e.getAlpha();a<1?i=new THREE.MeshBasicMaterial({color:e.toHexString(),transparent:!0,opacity:a}):i=new THREE.MeshBasicMaterial({color:e.toHexString()}),this.materialCache.set(n,i)}return i}async generateTextDisplayMesh({jsonText:e,maxLineWidth:n=ve.properties.maxLineWidth.default,backgroundColor:i=tinycolor(ve.properties.backgroundColor.default),shadow:a=ve.properties.shadow.default,alignment:r=ve.properties.align.default}){let o=new pi("Generate Text Display Mesh").start(),{lines:l,backgroundWidth:c}=await pT(e,n),d=c+1,u=(l.length||1)*10+1,p=[],m=[],f={x:0,y:u-9};for(let b of l){switch(r){case"center":f.x=-d/2+Math.ceil((d-b.width)/2);break;case"right":f.x=-d/2+d-b.width;break;default:f.x=-d/2+1}for(let y of b.words)for(let w of y.styles){let S=[],F=[],N=y.text.slice(w.start,w.end);for(let k of N){let R=this.getCharGeo(k,w.style);if(!R){console.error("Failed to get character geometry:",k);continue}if(R.geo){let D=R.geo.clone();if(D.translate(f.x,f.y,0),S.push(D),a){let B=R.geo.clone();B.translate(f.x+1,f.y-1,-.01),F.push(B)}}f.x+=R.width}if(S.length>0){p.push(wa(S));let k=jt.getColor(w.style.color??vo.white);m.push(this.getColorMaterial(k)),a&&F.length>0&&(p.push(wa(F)),w.style.shadow_color?m.push(this.getColorMaterial(jt.getColor(w.style.shadow_color))):m.push(this.getColorMaterial(tinycolor(new THREE.Color(k.toHexString()).multiplyScalar(.25).getHexString()))))}}f.y-=10}let g=new THREE.Mesh,x=s(b=>(b.scale(.4,.4,.4),b.rotateY(Math.PI),b.translate(1/5,0,0),b),"transform");if(p.length>0){let b=x(wa(p,!0)),y=new THREE.Mesh(b,m);y.name="text",g.add(y)}let _=x(new THREE.PlaneBufferGeometry(d,u).translate(0,u/2,-.05)),h=new THREE.Mesh(_,new THREE.MeshBasicMaterial({color:i.toHexString(),opacity:i.getAlpha(),transparent:!0}));h.name="background",g.add(h);let v=new THREE.LineSegments(new THREE.EdgesGeometry(_),Canvas.outlineMaterial);return v.no_export=!0,v.renderOrder=2,v.frustumCulled=!1,o.debug({mesh:g,hitbox:_,outline:v}),{mesh:g,hitbox:_,outline:v}}getCharGeo(e,n){let i=this;if(n.font){let d=Xs.getById(n.font);d&&(i=d)}let a=(0,hT.createHash)("sha256");a.update(e),a.update(";"+i.id),n.bold&&a.update("bold"),n.italic&&a.update("italic"),n.underlined&&a.update("underlined"),n.strikethrough&&a.update("strikethrough"),n.font&&a.update(";"+i.id);let r=a.digest("hex"),o=i.getChar(e),l=n.bold?1:0,c=this.geoCache.get(r);if(c===void 0){let d=document.createElement("canvas");o.type==="space"?(d.width=o.width,d.height=7):(d.width=o.bitmapUV.width,d.height=o.bitmapUV.height);let u=d.getContext("2d",{willReadFrequently:!0});u.imageSmoothingEnabled=!1,u.clearRect(0,0,d.width,d.height),o.type!=="space"&&u.drawImage(o.atlas.image,o.bitmapUV.x,o.bitmapUV.y,o.bitmapUV.width,o.bitmapUV.height,0,0,d.width,d.height);let p=u.getImageData(0,0,d.width,d.height),m=new THREE.BufferGeometry,f={vertices:[],indices:[],uvs:[]},g=s((x,_,h,v)=>{let b=f.vertices.length/3;f.vertices.push(x,_,0,x+h,_,0,x+h,_+v,0,x,_+v,0),f.indices.push(b,b+1,b+2,b,b+2,b+3)},"createQuad");if(o.type!=="space")for(let x=0;x0&&(g(v-h,_,h+l,1),h=0);continue}else h++}h>0&&g(d.width-h,_,h+l,1)}if(m.setIndex(f.indices),m.setAttribute("position",new THREE.BufferAttribute(new Float32Array(f.vertices),3)),n.italic&&(m.applyMatrix4(new THREE.Matrix4().makeShear(0,0,.2,0,0,0)),m.translate(-1,0,0)),f.vertices=Array.from(m.getAttribute("position").array),f.indices=Array.from(m.getIndex().array),n.underlined&&g(-1,-1,d.width+2,1),o.type==="space")n.strikethrough&&g(-1,3.5,d.width+2,1);else if(n.strikethrough){let x=o.ascent/2;g(-1,x,d.width+2,1)}m.setIndex(f.indices),m.setAttribute("position",new THREE.BufferAttribute(new Float32Array(f.vertices),3)),m.attributes.position.needsUpdate=!0,c={geo:m,width:o.width+l},this.geoCache.set(r,c)}return c}},Xo=Xs;s(Xo,"MinecraftFont"),lt(Xo,"all",[]);var xc,mT,fT;function U0e(){console.log("Loading Minecraft fonts..."),xc=new Xo("minecraft:default","assets/minecraft/font/default.json"),mT=new Xo("minecraft:illageralt","assets/minecraft/font/illageralt.json",xc),fT=new Xo("minecraft:alt","assets/minecraft/font/alt.json",xc),Promise.all([xc.load(),mT.load(),fT.load()]).then(()=>{console.log("Minecraft fonts loaded!"),requestAnimationFrame(()=>K.MINECRAFT_FONTS_LOADED.publish())})}s(U0e,"loadMinecraftFonts");async function _c(){return xc||await new Promise(t=>{K.MINECRAFT_FONTS_LOADED.subscribe(()=>t())}),xc.load()}s(_c,"getVanillaFont");K.MINECRAFT_ASSETS_LOADED.subscribe(()=>{U0e()});var gn=class extends OutlinerElement{type="resizable";name;position;rotation;scale;visibility;preview_controller=q0e;movable=!0;rotatable=!0;scalable=!0;resizable=!0;get from(){return this.position}set from(e){this.position=e}get to(){return[0,0,0]}get stretch(){return[]}get uv_offset(){return[]}constructor(e,n=guid()){super(e,n),this.extend(e),this.name??="resizable_outliner_element",this.position??=[0,0,0],this.rotation??=[0,0,0],this.scale??=[1,1,1],this.visibility??=!0}get origin(){return this.position}getWorldCenter(){return Reusable.vec3.set(0,0,0),THREE.fastWorldPosition(this.mesh,Reusable.vec2).add(Reusable.vec3)}extend(e){let n=this.constructor.properties;for(let i in n)n[i].merge(this,e);return this}selectLow(){return Project.selected_elements.safePush(this),this.selected=!0,TickUpdates.selection=!0,this}size(e,n){return e===void 0?n?this.scale.map(i=>Math.floor(i)):[...this.scale]:n?Math.floor(this.scale[e]):this.scale[e]}oldScale;resize(e,n){let i=this.oldScale??this.size(n);i instanceof Array&&(i=i[n]);let a=i<0&&n!==1?-1:1,r=typeof e=="function"?e:o=>o+e*a/16;this.scale[n]=r(i),this.preview_controller.updateGeometry?.(this),this.preview_controller.updateTransform(this)}getSaveCopy(){let e=super.getSaveCopy?.()??{};return e.uuid=this.uuid,e.type=this.type,e}};s(gn,"ResizableOutlinerElement"),gn=Do([Yo],gn);new Property(gn,"string","name",{default:"resizable_outliner_element"});new Property(gn,"vector","position",{default:[0,0,0]});new Property(gn,"vector","rotation",{default:[0,0,0]});new Property(gn,"vector","scale",{default:[1,1,1]});new Property(gn,"boolean","visibility",{default:!0});new Property(gn,"boolean","locked",{default:!1});new Property(gn,"boolean","export",{default:!0});var q0e=new NodePreviewController(gn,{setup(t){let e=new THREE.Mesh;e.isElement=!0,e.fix_rotation=new THREE.Euler(0,0,0,"ZYX"),e.fix_rotation.x=Math.degToRad(t.rotation[0]),e.fix_rotation.y=Math.degToRad(t.rotation[1]),e.fix_rotation.z=Math.degToRad(t.rotation[2]),e.fix_position=new THREE.Vector3(...t.position),e.fix_scale=new THREE.Vector3(...t.scale),Project.nodes_3d[t.uuid]=e,t.preview_controller.updateGeometry?.(t),t.preview_controller.dispatchEvent("setup",{element:t})},updateTransform(t){NodePreviewController.prototype.updateTransform.call(t.preview_controller,t),t.mesh.fix_position&&(t.mesh.fix_position.set(...t.position),t.parent instanceof Group&&(t.mesh.fix_position.x-=t.parent.origin[0],t.mesh.fix_position.y-=t.parent.origin[1],t.mesh.fix_position.z-=t.parent.origin[2])),t.mesh.fix_rotation&&t.mesh.fix_rotation.copy(t.mesh.rotation),t.mesh.fix_scale&&(t.mesh.fix_scale.set(...t.scale),sT(t.mesh.fix_scale)),t.preview_controller.dispatchEvent("update_transform",{element:t})}});var Px={};vn(Px,{getBlockModel:()=>Mx,parseBlockModel:()=>Wa,parseBlockState:()=>ET,validateBlockState:()=>Bx});var Nx={};vn(Nx,{applyModelDisplayTransform:()=>gf,getItemModel:()=>Fx});var ff=` attribute float highlight; uniform bool SHADE; uniform int LIGHTSIDE; varying vec2 vUv; varying float light; varying float lift; float AMBIENT = 0.5; float XFAC = -0.15; float ZFAC = 0.05; void main() { if (SHADE) { vec3 N = normalize( vec3( modelMatrix * vec4(normal, 0.0) ) ); if (LIGHTSIDE == 1) { float temp = N.y; N.y = N.z * -1.0; N.z = temp; } if (LIGHTSIDE == 2) { float temp = N.y; N.y = N.x; N.x = temp; } if (LIGHTSIDE == 3) { N.y = N.y * -1.0; } if (LIGHTSIDE == 4) { float temp = N.y; N.y = N.z; N.z = temp; } if (LIGHTSIDE == 5) { float temp = N.y; N.y = N.x * -1.0; N.x = temp; } float yLight = (1.0+N.y) * 0.5; light = yLight * (1.0-AMBIENT) + N.x*N.x * XFAC + N.z*N.z * ZFAC + AMBIENT; } else { light = 1.0; } if (highlight == 2.0) { lift = 0.22; } else if (highlight == 1.0) { lift = 0.1; } else { lift = 0.0; } vUv = uv; vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); gl_Position = projectionMatrix * mvPosition; }`,hf=` #ifdef GL_ES precision highp float; #endif uniform sampler2D map; uniform bool SHADE; uniform bool EMISSIVE; uniform vec3 LIGHTCOLOR; varying vec2 vUv; varying float light; varying float lift; void main(void) { vec4 color = texture2D(map, vUv); if (color.a < 0.01) discard; if (EMISSIVE == false) { gl_FragColor = vec4(lift + color.rgb * light, color.a); gl_FragColor.r = gl_FragColor.r * LIGHTCOLOR.r; gl_FragColor.g = gl_FragColor.g * LIGHTCOLOR.g; gl_FragColor.b = gl_FragColor.b * LIGHTCOLOR.b; } else { float light_r = (light * LIGHTCOLOR.r) + (1.0 - light * LIGHTCOLOR.r) * (1.0 - color.a); float light_g = (light * LIGHTCOLOR.g) + (1.0 - light * LIGHTCOLOR.g) * (1.0 - color.a); float light_b = (light * LIGHTCOLOR.b) + (1.0 - light * LIGHTCOLOR.b) * (1.0 - color.a); gl_FragColor = vec4(lift + color.r * light_r, lift + color.g * light_g, lift + color.b * light_b, 1.0); } if (lift > 0.2) { gl_FragColor.r = gl_FragColor.r * 0.6; gl_FragColor.g = gl_FragColor.g * 0.7; } }`;var H0e=new THREE.TextureLoader,xT=new Map;async function Fx(t,e){await Qo();let n=t+"|"+e,i=xT.get(n);if(i||(i=await vT(J0e(t),e),xT.set(n,i)),!!i)return i={mesh:i.mesh.clone(!0),outline:i.outline.clone(!0),boundingBox:i.boundingBox.clone(),isBlock:i.isBlock},i.mesh.geometry=i.mesh.geometry.clone(),i.outline.geometry=i.outline.geometry.clone(),i.mesh.name=t,i.isBlock?i.mesh.isVanillaBlockModel=!0:i.mesh.isVanillaItemModel=!0,i}s(Fx,"getItemModel");function J0e(t){let e=bc(t);return e.namespace+":item/"+e.path}s(J0e,"getItemResourceLocation");var G0e={thirdperson_righthand:{translation:[0,3,1],scale:[.55,.55,.55]},thirdperson_lefthand:{translation:[0,3,1],scale:[.55,.55,.55]},firstperson_righthand:{rotation:[0,-90,25],translation:[1.13,3.2,1.13],scale:[.68,.68,.68]},firstperson_lefthand:{rotation:[0,-90,25],translation:[1.13,3.2,1.13],scale:[.68,.68,.68]},ground:{translation:[0,2,0],scale:[.5,.5,.5]},head:{rotation:[0,-180,0],translation:[0,13,7]},fixed:{rotation:[0,-180,0]}};function gf(t,e,n){if(n==="none"||!e.display)return;!e.display.thirdperson_lefthand&&e.display.thirdperson_righthand&&(e.display.thirdperson_lefthand=structuredClone(e.display.thirdperson_righthand)),!e.display.firstperson_lefthand&&e.display.firstperson_righthand&&(e.display.firstperson_lefthand=structuredClone(e.display.thirdperson_righthand));let i=e.display[n];if(!i)return;let a=new THREE.Matrix4;if(i.rotation){let r=i.rotation.map(o=>o*Math.PI/180);a.makeRotationFromEuler(Reusable.euler1.set(-r[0],-r[1],r[2]))}i.translation&&a.setPosition(Reusable.vec1.set(i.translation[0],i.translation[1],i.translation[2])),i.scale&&a.scale(Reusable.vec2.set(...i.scale)),t.boundingBox.applyMatrix4(a),t.outline.geometry.applyMatrix4(a),t.mesh.applyMatrix4(a)}s(gf,"applyModelDisplayTransform");async function vT(t,e,n){let i=Fr(t,"models"),a;try{a=Mi(i+".json")}catch{a=Mi(i.replace("item/","block/")+".json")}if(n&&(n.textures!==void 0&&(a.textures??={},Object.assign(a.textures,n.textures)),n.elements!==void 0&&(a.elements=n.elements),n.display!==void 0&&Object.assign(a.display,n.display),n.gui_light!==void 0&&(a.gui_light=n.gui_light),n.overrides!==void 0&&(a.overrides=n.overrides)),a.parent){let r=bc(a.parent);if(r.type==="block")return await Wa({model:a.parent,isItemModel:!0},a,e);if(r.path==="item/generated"){let o=await W0e(t,a);return a.display??=G0e,gf(o,a,e),o}else return await vT(a.parent,e,a)}else return await Wa({model:t,isItemModel:!0},a,e)}s(vT,"parseItemModel");async function W0e(t,e){let n=new THREE.Mesh,i=[],a=[];for(let c of Object.values(e.textures)){let d=Fr(c,"textures")+".png",u=Zo(d),p=await H0e.loadAsync(u);p.magFilter=THREE.NearestFilter,p.minFilter=THREE.NearestFilter;let m=new THREE.ShaderMaterial({uniforms:{map:{type:"t",value:p},SHADE:{type:"bool",value:settings.shading.value},LIGHTCOLOR:{type:"vec3",value:new THREE.Color().copy(Canvas.global_light_color).multiplyScalar(settings.brightness.value/50)},LIGHTSIDE:{type:"int",value:Canvas.global_light_side},EMISSIVE:{type:"bool",value:!1}},vertexShader:ff,fragmentShader:hf,blending:THREE.NormalBlending,side:Canvas.getRenderSide(),transparent:!0});m.map=p,m.name=t;let f=new THREE.Mesh(new THREE.BoxGeometry(1,1,1),m),g=[],x=[],_=[],h=[],v=[],b=s((S,F,N)=>{h.push(S,F,N,S,F,N,S,F,N,S,F,N)},"addNormal");if(p?.image.width){let S=document.createElement("canvas"),F=S.getContext("2d");S.width=p.image.width,S.height=p.image.height,F.drawImage(p.image,0,0);let N=s((G,W,ee,Z,me)=>{let X=g.length/3,Q=me===1?-1:0;g.push(-G,Q,W,-G,Q,W+1,-G-ee,Q,W+Z,-G-ee,Q,W+Z-1),me===1?x.push(X+0,X+1,X+2,X+0,X+2,X+3):me===-1&&x.push(X+0,X+2,X+1,X+0,X+3,X+2),b(me,0,0),_.push((G+ee)/S.width,1-W/S.height,(G+ee)/S.width,1-(W+Z)/S.height,G/S.width,1-(W+Z)/S.height,G/S.width,1-W/S.height),v.push(1,1,1,1,1,1,1,1,1,1,1,1)},"addFace"),k=s((G,W,ee,Z,me)=>{let X=g.length/3;g.push(-G,0,W,-G,-1,W,-ee,-1,Z,-ee,0,Z),me===1?x.push(X+0,X+1,X+2,X+0,X+2,X+3):me===-1&&x.push(X+0,X+2,X+1,X+0,X+3,X+2),G==ee&&(G+=.1*-me,ee+=.4*-me,W+=.1,Z-=.1,b(-me,0,0)),W==Z&&(W+=.1*me,Z+=.4*me,G+=.1,ee-=.1,b(0,0,-me)),_.push(ee/S.width,1-W/S.height,ee/S.width,1-Z/S.height,G/S.width,1-Z/S.height,G/S.width,1-W/S.height),v.push(1,1,1,1,1,1,1,1,1,1,1,1)},"addEdge"),R=F.getImageData(0,0,S.width,S.height),D=[];for(let G=0;G140?1:0);let B=D.slice(),q=0;for(let G=0;G{g[F]=S+[8,.5,-8][F%3]}),f.geometry.setAttribute("position",new THREE.BufferAttribute(new Float32Array(g),3)),f.geometry.setAttribute("highlight",new THREE.BufferAttribute(new Uint8Array(f.geometry.attributes.position.count),1)),f.geometry.setIndex(x),f.geometry.setAttribute("uv",new THREE.BufferAttribute(new Float32Array(_),2)),f.geometry.setAttribute("color",new THREE.BufferAttribute(new Float32Array(v),3)),f.geometry.setAttribute("normal",new THREE.BufferAttribute(new Float32Array(h),3)),f.geometry.attributes.color.needsUpdate=!0,f.geometry.attributes.normal.needsUpdate=!0,f.geometry.rotateX(Math.PI/2);let y=f.geometry.clone(),w=Array.from(y.attributes.position.array);w.splice(0,24),y.setAttribute("position",new THREE.BufferAttribute(new Float32Array(w),3)),a.push(y),i.push(f.geometry.clone()),n.add(f)}let r=wa(a),o=wa(i),l=new THREE.LineSegments(new THREE.EdgesGeometry(r),Canvas.outlineMaterial);return{mesh:n,outline:l,boundingBox:o}}s(W0e,"generateItemMesh");var K0e=new THREE.TextureLoader,bT=new Map,yT=new Map([["water",A("block_model_manager.fluid_warning")],["lava",A("block_model_manager.fluid_warning")],["player_head",A("block_model_manager.mob_head_warning")],["player_wall_head",A("block_model_manager.mob_head_warning")],["skeleton_skull",A("block_model_manager.mob_head_warning")],["skeleton_wall_skull",A("block_model_manager.mob_head_warning")],["wither_skeleton_skull",A("block_model_manager.mob_head_warning")],["wither_skeleton_wall_skull",A("block_model_manager.mob_head_warning")],["creeper_head",A("block_model_manager.mob_head_warning")],["creeper_wall_head",A("block_model_manager.mob_head_warning")],["zombie_head",A("block_model_manager.mob_head_warning")],["zombie_wall_head",A("block_model_manager.mob_head_warning")],["dragon_head",A("block_model_manager.mob_head_warning")],["dragon_wall_head",A("block_model_manager.mob_head_warning")],["piglin_head",A("block_model_manager.mob_head_warning")],["piglin_wall_head",A("block_model_manager.mob_head_warning")]]);async function Mx(t){await Qo();let e=bT.get(t);if(!e){let n=await wd(t);if(!n)return;if(yT.has(t))throw new Error(yT.get(t));e=await ET(n),bT.set(t,e)}if(e){e={mesh:e.mesh.clone(!0),outline:e.outline.clone(!0),boundingBox:e.boundingBox.clone(),isBlock:!0};for(let n of e.mesh.children)n.geometry=n.geometry.clone();return e.mesh.geometry=e.mesh.geometry.clone(),e.mesh.name=t,e.mesh.isVanillaBlockModel=!0,e}}s(Mx,"getBlockModel");async function Wa(t,e,n="none"){let i=Fr(t.model,"models"),a=Mi(i+".json");if(e&&(e.textures!==void 0&&(a.textures??={},Object.assign(a.textures,e.textures)),e.elements!==void 0&&(a.elements=e.elements),e.display!==void 0&&(a.display=Object.assign(a.display??{},e.display)),e.ambientocclusion!==void 0&&(a.ambientocclusion=e.ambientocclusion)),a.parent){let o={...t,model:a.parent};return await Wa(o,a,n)}let r=await Y0e(t,a);return gf(r,a,n),r}s(Wa,"parseBlockModel");async function Y0e(t,e){if(console.log(`Generating block mesh for '${t.model}':`,` - Variant`,t,` - Model`,e),!e.elements)throw new Error(`No elements defined in block model '${t.model}'`);if(!e.textures)throw new Error(`No textures defined in block model '${t.model}'`);let n=new THREE.Mesh,i=[],a=[];for(let c of e.elements){let d=[c.to[0]-c.from[0],c.to[1]-c.from[1],c.to[2]-c.from[2]],u=[c.from[0]+(c.to[0]-c.from[0])/2,c.from[1]+(c.to[1]-c.from[1])/2,c.from[2]+(c.to[2]-c.from[2])/2];d[0]===0&&(d[0]+=.01,u[0]-=.005),d[1]===0&&(d[1]+=.01,u[1]-=.005),d[2]===0&&(d[2]+=.01,u[2]-=.005);let p=new THREE.BoxGeometry(...d);if(p.translate(...u),c.rotation){let h;c.rotation.rescale&&(h=getRescalingFactor(c.rotation.angle));let v=c.rotation.origin;switch(v&&p.translate(...v.map(b=>-b)),c.rotation.axis){case"x":p.rotateX(Math.degToRad(c.rotation.angle)),h!==void 0&&p.scale(1,h,h);break;case"y":p.rotateY(Math.degToRad(c.rotation.angle)),h!==void 0&&p.scale(h,1,h);break;case"z":p.rotateZ(Math.degToRad(c.rotation.angle)),h!==void 0&&p.scale(h,h,1);break}v&&p.translate(...v)}p.translate(-8,-8,-8),p.rotateY(Math.degToRad(180)),t.x&&p.rotateX(Math.degToRad(t.x)),t.y&&p.rotateY(-Math.degToRad(t.y)),p.rotateY(Math.degToRad(-180)),t.isItemModel||p.translate(8,8,8);let m=[];for(let h=0;h<6;h++)m.push(0+h*4,2+h*4,1+h*4,2+h*4,3+h*4,1+h*4),p.addGroup(h*6,6,h);if(p.setIndex(m),p.setAttribute("highlight",new THREE.BufferAttribute(new Uint8Array(p.attributes.position.count),1)),!c.faces)throw new Error(`No faces defined in element for block model '${t.model}'`);let f=[],g=[];for(let h of Canvas.face_order){let v=c.faces[h];if(!v){g.push(Canvas.transparentMaterial),f.push(0,0,0,0,0,0,0,0);continue}let b=(await wT(e.textures,v.texture)).clone(),y=new THREE.ShaderMaterial({uniforms:{map:new THREE.Uniform(b),SHADE:{type:"bool",value:settings.shading.value},LIGHTCOLOR:{type:"vec3",value:new THREE.Color().copy(Canvas.global_light_color).multiplyScalar(settings.brightness.value/50)},LIGHTSIDE:{type:"int",value:Canvas.global_light_side},EMISSIVE:{type:"bool",value:!1}},vertexShader:ff,fragmentShader:hf,blending:THREE.NormalBlending,side:Canvas.getRenderSide(),transparent:!0});y.map=b,y.name=t.model,g.push(y);let w=16,S=16;if(v.uv){let[F,N,k,R]=v.uv,D=[[F/w,N/S],[k/w,N/S],[F/w,R/S],[k/w,R/S]];if(v.rotation){let B=v.rotation+0;for(;B>0;){let q=D[0];D[0]=D[2],D[2]=D[3],D[3]=D[1],D[1]=q,B-=90}}b.flipY=!1,f.push(...D.flat())}else{let[F,N,k]=c.from,[R,D,B]=d;switch(h){case"down":f.push(F/w,k/S,(F+R)/w,k/S,F/w,(k+B)/S,(F+R)/w,(k+B)/S);break;case"up":f.push(F/w,k/S,(F+R)/w,k/S,F/w,(k+B)/S,(F+R)/w,(k+B)/S);break;case"north":f.push((F+R)/w,(N+D)/S,F/w,(N+D)/S,(F+R)/w,N/S,F/w,N/S);break;case"south":f.push((F+R)/w,(N+D)/S,F/w,(N+D)/S,(F+R)/w,N/S,F/w,N/S);break;case"west":f.push((k+B)/w,(N+D)/S,k/w,(N+D)/S,(k+B)/w,N/S,k/w,N/S);break;case"east":f.push((k+B)/w,(N+D)/S,k/w,(N+D)/S,(k+B)/w,N/S,k/w,N/S);break}}b.needsUpdate=!0}p.setAttribute("uv",new THREE.Float32BufferAttribute(f,2)),p.attributes.uv.needsUpdate=!0,i.push(p.clone());let x=new THREE.EdgesGeometry(p);a.push(x);let _=new THREE.Mesh(p,g);n.add(_)}let r=wa(a),o=new THREE.LineSegments(r,Canvas.outlineMaterial),l=wa(i);return o.no_export=!0,o.renderOrder=2,o.frustumCulled=!1,{mesh:n,outline:o,boundingBox:l,isBlock:!0}}s(Y0e,"generateModelMesh");var Rx=new Map;async function wT(t,e){e.at(0)==="#"&&(e=e.slice(1));let n=t[e];if(n?.at(0)==="#")return await wT(t,n.slice(1));let i=Fr(n,"textures")+".png";if(Rx.has(i))return Rx.get(i);let a;if(Lx(i+".mcmeta")){let r=new Image;r.src=Zo(i);let o=document.createElement("canvas"),l=o.getContext("2d");await new Promise(c=>{r.onload=()=>{o.width=r.width,o.height=r.width,l.drawImage(r,0,0),c()}}),a=new THREE.CanvasTexture(o)}else a=await K0e.loadAsync(Zo(i));return a.magFilter=THREE.NearestFilter,a.minFilter=THREE.NearestFilter,Rx.set(i,a),a}s(wT,"loadTexture");function Bx(t){if(t.blockStateRegistryEntry)for(let[e,n]of Object.entries(t.states))if(t.blockStateRegistryEntry.stateValues[e]){if(!t.blockStateRegistryEntry.stateValues[e].includes(n))return`Invalid block state value '${n.toString()}' for '${e}'. Expected one of: ${t.blockStateRegistryEntry.stateValues[e].join(", ")}`}else return`Invalid block state '${e}' for '${t.resource.name}' Expected one of: ${Object.keys(t.blockStateRegistryEntry.stateValues).join(", ")}`;else if(Object.keys(t.states).length>0)return`${t.resource.name} has no block states`;return""}s(Bx,"validateBlockState");async function ET(t){let e=Fr(t.resourceLocation,"blockstates"),n=await Mi(e+".json");if(!t.blockStateRegistryEntry)throw new Error(`Block state registry entry not found for '${t.resource.name}'`);t.states=Object.assign({},t.blockStateRegistryEntry.defaultStates,t.states),console.log("Block states for",t.resourceLocation,` - States`,t.states,` - Registry entry`,t.blockStateRegistryEntry);for(let[i,a]of Object.entries(t.states))if(t.blockStateRegistryEntry.stateValues[i]){if(!t.blockStateRegistryEntry.stateValues[i].includes(a))throw new Error(`Invalid block state value '${a.toString()}' for '${i}'. Expected one of: ${t.blockStateRegistryEntry.stateValues[i].join(", ")}`)}else throw new Error(`Invalid block state '${i}' for '${t.resource.name}' Expected one of: ${Object.keys(t.blockStateRegistryEntry.stateValues).join(", ")}`);if(n.variants){let i=n.variants[""];if(i)return Array.isArray(i)?(console.warn(`Multiple weighted variants found for '${t.resourceLocation}' default variant. Using the first one.`),await Wa(i[0])):await Wa(i);for(let[a,r]of Object.entries(n.variants)){let o={},l=a.split(",");for(let u of l){let[p,m]=u.trim().split("="),f=Zs(m,!1);o[p]=f}if(!Object.entries(o).allAre(([u,p])=>kT(t,u,p,!1)))continue;let d;return Array.isArray(r)?(console.warn(`Multiple weighted variants found for '${t.resourceLocation}' variant '${a}'. Using the first one.`),d=await Wa(r[0])):d=await Wa(r),d}}else if(n.multipart){let i=new THREE.Mesh,a=[],r=[];for(let d of n.multipart){let u=await X0e(t,d);if(!u)continue;for(let m of u.mesh.children){let f=m.clone();f.geometry=f.geometry.clone(),f.rotateY(u.mesh.rotation.y),f.rotateX(u.mesh.rotation.x),i.add(f);let g=u.boundingBox.clone();g.rotateY(u.mesh.rotation.y),g.rotateX(u.mesh.rotation.x),a.push(g)}let p=u.outline.geometry.clone();p.rotateY(u.mesh.rotation.y),p.rotateX(u.mesh.rotation.x),r.push(p)}if(r.length===0)throw new Error(`The selected block state for '${t.resourceLocation}' has no model!`);let o=wa(r),l=new THREE.LineSegments(o,Canvas.outlineMaterial),c=wa(a);return l.no_export=!0,l.renderOrder=2,l.frustumCulled=!1,{mesh:i,outline:l,boundingBox:c,isBlock:!0}}throw new Error(`Unsupported block state '${t.resourceLocation}'`)}s(ET,"parseBlockState");async function X0e(t,e){if(e.when){let n=s(a=>{if(a.OR&&a.AND)throw new Error("Cannot have both OR and AND in a multipart case condition");if(a.OR)return a.OR.some(o=>n(o));if(a.AND)return a.AND.every(o=>n(o));let r=!0;for(let[o,l]of Object.entries(a)){let c=Zs(l,!0);if(r=kT(t,o,c,!0),!r)break}return r},"recurse");if(!n(e.when))return}return Array.isArray(e.apply)?await Wa(e.apply[0]):await Wa(e.apply)}s(X0e,"parseMultipartCase");function kT(t,e,n,i){if(typeof n=="string"&&n.includes("|")){if(!i)throw new Error(`Unsupported OR condition in block state '${e}': '${n}'`);n=n.split("|")}if(typeof n=="boolean")return t.states[e]===n;if(typeof n=="string")return t.states[e]===n;if(typeof n=="number")return n===0?t.states[e]===n||t.states[e]===void 0:t.states[e]===n;if(i)return n.includes(t.states[e]);throw new Error(`Unsupported variant state type '${typeof n}'`)}s(kT,"checkIfBlockStateMatches");var Z0e="https://raw.githubusercontent.com/misode/mcmeta/summary/blocks/data.json",_f=class{defaultStates={};stateValues={};constructor(e){for(let[n,i]of Object.entries(e[1]))this.defaultStates[n]=Zs(i,!1);for(let[n,i]of Object.entries(e[0]))this.stateValues[n]=i.map(a=>Zs(a,!1))}};s(_f,"BlockStateRegistryEntry");var yc={};function Q0e(){let t=localStorage.getItem("animated_java:blockStateRegistry");if(!t){console.error("BlockState Registry not found in local storage");return}let e=JSON.parse(t);for(let n in e)yc[n]=new _f(e[n])}s(Q0e,"updateMemoryRegistry");async function Vx(){console.log("Updating BlockState Registry...");let t=3;for(;t-->=0;){let e;try{e=await fetch(Z0e)}catch(n){console.error("Failed to fetch latest BlockState registry:",n)}if(e?.ok){let n=await e.json();localStorage.setItem("animated_java:blockStateRegistry",JSON.stringify(n));let i=await no();localStorage.setItem("animated_java:blockStateRegistryVersion",JSON.stringify(i)),console.log("BlockState Registry updated!");return}}throw new Error("Failed to fetch latest BlockState registry after 3 retries.")}s(Vx,"updateLocalRegistry");async function $0e(){if(console.log("Checking if BlockState Registry update..."),!localStorage.getItem("animated_java:blockStateRegistry")){console.log("No BlockState Registry found. Updating..."),await Vx();return}let e=localStorage.getItem("animated_java:blockStateRegistryVersion");if(!e){console.log("No BlockState Registry version found. Updating..."),await Vx();return}let n=JSON.parse(e),i=await no();if(n.id!==i.id){console.log("BlockState Registry is outdated. Updating..."),await Vx();return}console.log("BlockState Registry is up to date!"),Q0e(),requestAnimationFrame(()=>K.BLOCKSTATE_REGISTRY_LOADED.publish())}s($0e,"checkForRegistryUpdate");async function wc(t){return Object.keys(yc).length===0?new Promise(e=>{K.BLOCKSTATE_REGISTRY_LOADED.subscribe(()=>{e(yc[t])},!0)}):yc[t]}s(wc,"getBlockState");K.PLUGIN_LOAD.subscribe(()=>{$0e().catch(t=>{console.error(t)})});var exe="https://raw.githubusercontent.com/misode/mcmeta/summary/registries/data.json",xf=class{items=[];constructor(e){this.items=e}has(e){return this.items.includes(e)}find(e){return this.items.find(e)}};s(xf,"MinecraftRegistryEntry");var Xn={};function txe(){let t=localStorage.getItem("animated_java:minecraftRegistry");if(!t){console.error("Minecraft Registry not found in local storage");return}let e=JSON.parse(t);for(let n in e)Xn[n]=new xf(e[n])}s(txe,"updateMemoryRegistry");async function zx(){console.log("Updating Minecraft Registry...");let t=3;for(;t-->=0;){let e;try{e=await fetch(exe)}catch(n){console.error("Failed to fetch latest Minecraft registry:",n)}if(e?.ok){let n=await e.json();localStorage.setItem("animated_java:minecraftRegistry",JSON.stringify(n));let i=await no();localStorage.setItem("animated_java:minecraftRegistryVersion",JSON.stringify(i)),console.log("Minecraft Registry updated!");return}}throw new Error("Failed to fetch latest Minecraft registry after 3 retries.")}s(zx,"updateLocalRegistry");async function nxe(){if(console.log("Checking if Minecraft Registry update..."),!localStorage.getItem("animated_java:minecraftRegistry")){console.log("No Minecraft Registry found. Updating..."),await zx();return}let e=localStorage.getItem("animated_java:minecraftRegistryVersion");if(!e){console.log("No Minecraft Registry version found. Updating..."),await zx();return}let n=JSON.parse(e),i=await no();if(n.id!==i.id){console.log("Minecraft Registry is outdated. Updating..."),await zx();return}console.log("Minecraft Registry is up to date!"),txe(),requestAnimationFrame(()=>K.MINECRAFT_REGISTRY_LOADED.publish())}s(nxe,"checkForRegistryUpdate");K.NETWORK_CONNECTED.subscribe(()=>{nxe().then(async()=>{await Ux()})});var qx=Canvas.outlineMaterial.clone();qx.color.set("#ff0000");var $e=class extends gn{type=$e.type;icon=$e.icon;needsUniqueName=!0;__block=new ke("minecraft:stone");onSummonFunction=$e.properties.onSummonFunction.default;configs;error=new ke("");buttons=[Outliner.buttons.export,Outliner.buttons.locked,Outliner.buttons.visibility];preview_controller=ixe;constructor(e,n=guid()){super(e,n),$e.all.push(this);for(let i in $e.properties)$e.properties[i].reset(this);this.name="block_display",this.extend(e),this.sanitizeName(),this.__block.subscribe(()=>{this.updateBlock()})}get block(){return this.__block===void 0?"minecraft:stone":this.__block.get()}set block(e){this.__block!==void 0&&this.block!==e&&this.__block.set(e)}getBlockValuable(){return this.__block}sanitizeName(){return this.name=Ea(this.name,this.uuid),this.name}getUndoCopy(){let e={};for(let n in $e.properties)$e.properties[n].copy(this,e);return e.uuid=this.uuid,e.type=this.type,e}getSaveCopy(){let e=super.getSaveCopy?.()??{};for(let n in $e.properties)$e.properties[n].copy(this,e);return e}select(){return Group.first_selected&&Group.first_selected.unselect(),!Pressing.ctrl&&!Pressing.shift&&(Cube.selected.length&&Cube.selected.forEachReverse(e=>e.unselect()),selected.length&&selected.forEachReverse(e=>e!==this&&e.unselect())),$e.selected.safePush(this),this.selectLow(),this.showInOutliner(),updateSelection(),Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator(this).select(),this}unselect(){this.selected&&(Animator.open&&Timeline.selected_animator&&Timeline.selected_animator.element===this&&Timeline.selected&&Timeline.selected.empty(),Project.selected_elements.remove(this),$e.selected.remove(this),this.selected=!1,TickUpdates.selection=!0,this.preview_controller.updateHighlight(this))}async updateBlock(){let e=await vf(this.block);if(e){this.error.set(e),this.mesh?.outline instanceof THREE.LineSegments&&(this.error.get()?this.mesh.outline.material=qx:this.mesh.outline.material=Canvas.outlineMaterial);return}this.preview_controller.updateGeometry(this)}applyBlockModel(e){let n=this.mesh;n.name=this.uuid,n.geometry=e.boundingBox,n.material=Canvas.transparentMaterial,n.clear(),e.outline.name=this.uuid+"_outline",e.outline.visible=this.selected,n.outline=e.outline,n.add(e.mesh),n.add(e.outline),this.preview_controller.updateHighlight(this),this.preview_controller.updateTransform(this),n.visible=this.visibility}};s($e,"VanillaBlockDisplay"),lt($e,"type",`${Ke.name}:vanilla_block_display`),lt($e,"icon","deployed_code"),lt($e,"selected",[]),lt($e,"all",[]),$e=Do([Yo],$e);$e.prototype.icon=$e.icon;new Property($e,"string","block",{default:"minecraft:stone"});new Property($e,"string","onSummonFunction",{default:""});new Ga($e,"configs",{default:()=>({default:{},variants:{}})});OutlinerElement.registerType($e,$e.type);var Hx=new THREE.TextureLoader().load("data:image/svg+xml,"+encodeURIComponent(''));Hx.minFilter=THREE.NearestFilter;Hx.magFilter=THREE.NearestFilter;var ixe=new NodePreviewController($e,{setup(t){gn.prototype.preview_controller.setup(t);let e=new THREE.SpriteMaterial({map:Hx,alphaTest:.1,sizeAttenuation:!1}),n=new THREE.Sprite(e);n.scale.setScalar(1/32);let i=t.mesh;i.add(n),i.sprite=n},updateGeometry(t){t.mesh&&Mx(t.block).then(e=>{e?.mesh&&t.applyBlockModel(e)}).catch(e=>{console.error("Failed to get block model:",e),typeof e.message=="string"&&t.error.set(e.message)}).finally(()=>{t.mesh?.outline instanceof THREE.LineSegments&&(t.error.get()?t.mesh.outline.material=qx:t.mesh.outline.material=Canvas.outlineMaterial)})},updateTransform(t){gn.prototype.preview_controller.updateTransform(t)},updateHighlight(t,e){if(!Fe()||!t?.mesh)return;let n=Modes.edit&&(e===!0||e===t||t.selected)?1:0,i=t.mesh.children.at(0);if(i)for(let a of i.children){if(!(a instanceof THREE.Mesh))continue;let r=a.geometry.attributes.highlight;r.array[0]!=n&&(r.array.set(Array(r.count).fill(n)),r.needsUpdate=!0)}}}),Ed=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(!this.element.selected&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element?.parent&&this.element.parent!=="root"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayRotation(e,n=1){let i=this.getElement().mesh;if(i.fix_rotation&&i.rotation.copy(i.fix_rotation),e)if(e.length===4){let a=new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(e),"ZYX");i.rotation.x-=a.x*n,i.rotation.y-=a.y*n,i.rotation.z+=a.z*n}else i.rotation.x-=Math.degToRad(e[0])*n,i.rotation.y-=Math.degToRad(e[1])*n,i.rotation.z+=Math.degToRad(e[2])*n;if(this.rotation_global){let a=i.parent?.getWorldQuaternion(Reusable.quat1);if(!a)return this;a.invert(),i.quaternion.premultiply(a)}return this}displayPosition(e,n=1){let i=this.getElement().mesh;return i.fix_position&&i.position.copy(i.fix_position),e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}displayScale(e,n=1){if(!e)return this;let i=this.getElement().mesh;return i.fix_scale&&i.scale.copy(i.fix_scale),i.scale.x*=1+(e[0]-1)*n||1e-5,i.scale.y*=1+(e[1]-1)*n||1e-5,i.scale.z*=1+(e[2]-1)*n||1e-5,this}};s(Ed,"VanillaBlockDisplayAnimator");Ed.prototype.type=$e.type;$e.animator=Ed;var jT=nn({id:"animated-java:create-vanilla-block-display"},{name:A("action.create_vanilla_block_display.title"),icon:"deployed_code",category:"animated_java",condition(){return Fe()&&Mode.selected.id===Modes.options.edit.id},click(){Undo.initEdit({outliner:!0,elements:[],selection:!0});let t=new $e({}).init(),e=getCurrentGroup();return e instanceof Group&&(t.addTo(e),t.extend({position:e.origin.slice()})),selected.forEachReverse(n=>n.unselect()),Group.first_selected?.unselect(),t.select(),Undo.finishEdit("Create Vanilla Block Display",{outliner:!0,elements:selected,selection:!0}),t}}),AT=[];jT.onCreated(t=>{Interface.Panels.outliner.menu.addAction(t,3),Toolbars.outliner.add(t,0),MenuBar.menus.edit.addAction(t,8),AT.push(K.SELECT_PROJECT.subscribe(e=>{e.vanillaBlockDisplays??=[],$e.all.empty(),$e.all.push(...e.vanillaBlockDisplays)}),K.UNSELECT_PROJECT.subscribe(e=>{e.vanillaBlockDisplays=[...$e.all],$e.all.empty()}))});jT.onDeleted(t=>{Interface.Panels.outliner.menu.removeAction(t),Toolbars.outliner.remove(t),MenuBar.menus.edit.removeAction(t),AT.forEach(e=>e())});function TT(){let t=Math.floor(Math.sqrt(Xn.block.items.length));for(let e=0;e`${n}=${i.toString()}`).join(",")}]`}s(axe,"generateBlockStateString");function rxe(t){let e=Object.values(t).reduce((i,a)=>i*a.length,1),n=[];for(let i=0;i{let c=r%l.length;a[o]=String(l[c]),r=Math.floor(r/l.length)}),n.push(a)}return n}s(rxe,"computeAllStatePermutations");var We=class extends gn{type=We.type;icon=We.icon;needsUniqueName=!0;__item=new ke("minecraft:diamond");__itemDisplay=new ke("none");onSummonFunction=We.properties.onSummonFunction.default;configs;error=new ke("");buttons=[Outliner.buttons.export,Outliner.buttons.locked,Outliner.buttons.visibility];preview_controller=oxe;constructor(e,n=guid()){super(e,n),We.all.push(this);for(let i in We.properties)We.properties[i].reset(this);this.name="item_display",this.extend(e),this.sanitizeName(),this.__item.subscribe(()=>{this.updateItem()})}get item(){return this.__item===void 0?"minecraft:diamond":this.__item.get()}set item(e){this.__item!==void 0&&this.__item.set(e)}get itemDisplay(){return this.__itemDisplay===void 0?"none":this.__itemDisplay.get()}set itemDisplay(e){this.__itemDisplay!==void 0&&this.__itemDisplay.set(e)}sanitizeName(){return this.name=Ea(this.name,this.uuid),this.name}getUndoCopy(){let e={};for(let n in We.properties)We.properties[n].copy(this,e);return e.uuid=this.uuid,e.type=this.type,e}getSaveCopy(){let e=super.getSaveCopy?.()??{};for(let n in We.properties)We.properties[n].copy(this,e);return e}select(){return Group.first_selected&&Group.first_selected.unselect(),!Pressing.ctrl&&!Pressing.shift&&(Cube.selected.length&&Cube.selected.forEachReverse(e=>e.unselect()),selected.length&&selected.forEachReverse(e=>e!==this&&e.unselect())),We.selected.safePush(this),this.selectLow(),this.showInOutliner(),updateSelection(),Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator(this).select(),this}unselect(){this.selected&&(Animator.open&&Timeline.selected_animator&&Timeline.selected_animator.element===this&&Timeline.selected&&Timeline.selected.empty(),Project.selected_elements.remove(this),We.selected.remove(this),this.selected=!1,TickUpdates.selection=!0,this.preview_controller.updateHighlight(this))}async updateItem(){let e=await bf(this.item);if(e){this.error.set(e);return}this.error.set(""),this.preview_controller.updateGeometry(this)}};s(We,"VanillaItemDisplay"),lt(We,"type",`${Ke.name}:vanilla_item_display`),lt(We,"icon","icecream"),lt(We,"selected",[]),lt(We,"all",[]),We=Do([Yo],We);We.prototype.icon=We.icon;new Property(We,"string","item",{default:"minecraft:diamond"});new Property(We,"string","itemDisplay",{default:"none"});new Property(We,"string","onSummonFunction",{default:""});new Ga(We,"configs",{default:()=>({default:{},variants:{}})});OutlinerElement.registerType(We,We.type);var Gx=new THREE.TextureLoader().load("data:image/svg+xml,"+encodeURIComponent(''));Gx.minFilter=THREE.NearestFilter;Gx.magFilter=THREE.NearestFilter;var oxe=new NodePreviewController(We,{setup(t){gn.prototype.preview_controller.setup(t);let e=new THREE.SpriteMaterial({map:Gx,alphaTest:.1,sizeAttenuation:!1}),n=new THREE.Sprite(e);n.scale.setScalar(1/20);let i=t.mesh;i.add(n),i.sprite=n},updateGeometry(t){t.mesh&&Fx(t.item,t.itemDisplay).then(e=>{if(!e)return;let n=t.mesh;n.name=t.uuid,n.geometry=e.boundingBox,n.material=Canvas.transparentMaterial,n.clear(),n.add(e.mesh),n.add(e.outline),n.outline=e.outline,n.outline.visible=t.selected,t.preview_controller.updateHighlight(t),t.preview_controller.updateTransform(t),n.visible=t.visibility}).catch(e=>{typeof e.message=="string"&&t.error.set(e.message)})},updateTransform(t){gn.prototype.preview_controller.updateTransform(t)},updateHighlight(t,e){if(!Fe()||!t?.mesh)return;let n=Modes.edit&&(e===!0||e===t||t.selected)?1:0,i=t.mesh.children.at(0);if(i)for(let a of i.children){if(!(a instanceof THREE.Mesh))continue;let r=a.geometry.attributes.highlight;r.array[0]!=n&&(r.array.set(Array(r.count).fill(n)),r.needsUpdate=!0)}}}),kd=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(!this.element.selected&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element?.parent&&this.element.parent!=="root"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayRotation(e,n=1){let i=this.getElement().mesh;if(i.fix_rotation&&i.rotation.copy(i.fix_rotation),e)if(e.length===4){let a=new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(e),"ZYX");i.rotation.x-=a.x*n,i.rotation.y-=a.y*n,i.rotation.z+=a.z*n}else i.rotation.x+=Math.degToRad(-e[0])*n,i.rotation.y+=Math.degToRad(-e[1])*n,i.rotation.z+=Math.degToRad(e[2])*n;if(this.rotation_global){let a=i.parent?.getWorldQuaternion(Reusable.quat1);if(!a)return this;a.invert(),i.quaternion.premultiply(a)}return this}displayPosition(e,n=1){let i=this.getElement().mesh;return i.fix_position&&i.position.copy(i.fix_position),e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}displayScale(e,n=1){if(!e)return this;let i=this.getElement().mesh;return i.fix_scale&&i.scale.copy(i.fix_scale),i.scale.x=1+(e[0]-1)*n||1e-5,i.scale.y=1+(e[1]-1)*n||1e-5,i.scale.z=1+(e[2]-1)*n||1e-5,this}};s(kd,"VanillaItemDisplayAnimator");kd.prototype.type=We.type;We.animator=kd;var ST=nn({id:"animated-java:action/create-vanilla-item-display"},{name:A("action.create_vanilla_item_display.title"),icon:"icecream",category:"animated_java",condition(){return Fe()&&Mode.selected.id===Modes.options.edit.id},click(){Undo.initEdit({outliner:!0,elements:[],selection:!0});let t=new We({}).init(),e=getCurrentGroup();return e instanceof Group&&(t.addTo(e),t.extend({position:e.origin.slice()})),selected.forEachReverse(n=>n.unselect()),Group.first_selected?.unselect(),t.select(),Undo.finishEdit("Create Vanilla Item Display",{outliner:!0,elements:selected,selection:!0}),t}}),Jx=[];ST.onCreated(t=>{Interface.Panels.outliner.menu.addAction(t,3),Toolbars.outliner.add(t,0),MenuBar.menus.edit.addAction(t,8),Jx.push(K.SELECT_PROJECT.subscribe(e=>{e.vanillaItemDisplays??=[],We.all.empty(),We.all.push(...e.vanillaItemDisplays)}),K.UNSELECT_PROJECT.subscribe(e=>{e.vanillaItemDisplays=[...We.all],We.all.empty()}))});ST.onDeleted(t=>{Interface.Panels.outliner.menu.removeAction(t),Toolbars.outliner.remove(t),MenuBar.menus.edit.removeAction(t),Jx.forEach(e=>e()),Jx.empty()});function Ea(t,e){t=Kt(t);let n=[...$e.all,...Group.all,...ve.all,...We.all,...Locator.all];OutlinerElement.types.camera&&n.push(...OutlinerElement.types.camera.all),n=n.filter(l=>l.uuid!==e);let i=new Set(n.map(l=>l.name));if(!i.has(t))return t;let a=1,r=/\d+$/.exec(t);r&&(a=parseInt(r[0]),t=t.slice(0,-r[0].length));let o=1e4;for(;o-- >0;){let l=`${t}${a}`;if(!i.has(l))return t=l,l;a++}throw new Error(`Could not make name unique for ${t} (${e})!`)}s(Ea,"sanitizeOutlinerElementName");var ve=class extends gn{type=ve.type;icon=ve.icon;needsUniqueName=!0;configs;buttons=[Outliner.buttons.export,Outliner.buttons.locked,Outliner.buttons.visibility];preview_controller=sxe;textError=new ke("");needsMeshUpdate=!1;__pendingMeshUpdate;__text=new ke("Hello World!");__lineWidth=ve.properties.lineWidth.default;__backgroundColor=ve.properties.backgroundColor.default;__shadow=ve.properties.shadow.default;__align=ve.properties.align.default;seeThrough=ve.properties.seeThrough.default;onSummonFunction=ve.properties.onSummonFunction.default;constructor(e,n=guid()){super(e,n),ve.all.push(this);for(let i in ve.properties)ve.properties[i].reset(this);this.name="text_display",this.extend(e),this.sanitizeName()}sanitizeName(){return this.name=Ea(this.name,this.uuid),this.name}get text(){return this.__text===void 0?ve.properties.text.default:this.__text.get()}set text(e){this.__text!==void 0&&e!==this.__text.get()&&(this.__text.set(e),this.needsMeshUpdate=!0)}get lineWidth(){return this.__lineWidth===void 0?ve.properties.lineWidth.default:this.__lineWidth}set lineWidth(e){this.__lineWidth!==void 0&&e!==this.__lineWidth&&(this.__lineWidth=e,this.needsMeshUpdate=!0)}get backgroundColor(){return this.__backgroundColor===void 0?ve.properties.backgroundColor.default:this.__backgroundColor}set backgroundColor(e){this.__backgroundColor!==void 0&&e!==this.__backgroundColor&&(this.__backgroundColor=e,this.needsMeshUpdate=!0)}get shadow(){return this.__shadow===void 0?ve.properties.shadow.default:this.__shadow}set shadow(e){this.__shadow!==void 0&&e!==this.__shadow&&(this.__shadow=e,this.needsMeshUpdate=!0)}get align(){return this.__align===void 0?ve.properties.align.default:this.__align}set align(e){this.__align!==void 0&&e!==this.__align&&(this.__align=e,this.needsMeshUpdate=!0)}getTextValuable(){return this.__text}getUndoCopy(){let e=new ve(this);for(let n in ve.properties)ve.properties[n].copy(this,e);return e.uuid=this.uuid,e.type=this.type,delete e.parent,e}getSaveCopy(){let e=super.getSaveCopy?.()??{};for(let n in ve.properties)ve.properties[n].copy(this,e);return e}select(){return Group.first_selected&&Group.first_selected.unselect(),!Pressing.ctrl&&!Pressing.shift&&(Cube.selected.length&&Cube.selected.forEachReverse(e=>e.unselect()),selected.length&&selected.forEachReverse(e=>e!==this&&e.unselect())),ve.selected.safePush(this),this.selectLow(),this.showInOutliner(),updateSelection(),Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator(this).select(),this}unselect(){this.selected&&(Animator.open&&Timeline.selected_animator&&Timeline.selected_animator.element===this&&Timeline.selected&&Timeline.selected.empty(),Project.selected_elements.remove(this),ve.selected.remove(this),this.selected=!1,TickUpdates.selection=!0)}updateTextMesh(){let e;try{let n=new Yn({minecraftVersion:Project.animated_java.target_minecraft_version});n.enabledFeatures&=~(Yn.FEATURES.ALLOW_CLICK_EVENTS|Yn.FEATURES.ALLOW_HOVER_EVENTS),e=n.parse(this.text),this.textError.set("")}catch(n){console.error(n),n instanceof Ko?this.textError.set(n.getOriginErrorMessage()):this.textError.set(n.message)}e??=new jt({text:"Invalid JSON Text!",color:"red"}),this.renderTextMesh(e).then(({mesh:n,hitbox:i,outline:a})=>{this.applyTextMesh(n,i,a)})}renderTextMesh(e){let n=_c().then(i=>i.generateTextDisplayMesh({jsonText:e,maxLineWidth:this.lineWidth,backgroundColor:tinycolor(this.backgroundColor),shadow:this.shadow,alignment:this.align})).then(i=>this.__pendingMeshUpdate===n?(this.__pendingMeshUpdate=void 0,i):this.__pendingMeshUpdate);return this.__pendingMeshUpdate=n,n}applyTextMesh(e,n,i){e.name=this.uuid+"_text",e.isTextDisplayText=!0;let a=this.mesh;if(!a){console.warn("TextDisplay mesh not found");return}a.clear(),delete a.sprite,a.name=this.uuid,a.material=Canvas.transparentMaterial,a.geometry=n,a.add(e),i.name=this.uuid+"_outline",i.visible=this.selected,a.outline=i,a.add(i),a.visible=this.visibility,Canvas.updateView({elements:[],element_aspects:{}})}};s(ve,"TextDisplay"),lt(ve,"type",`${Ke.name}:text_display`),lt(ve,"icon","text_fields"),lt(ve,"selected",[]),lt(ve,"all",[]),lt(ve,"invalidJsonText",{text:"Invalid JSON Text!",color:"red"}),ve=Do([Yo],ve);ve.prototype.icon=ve.icon;new Property(ve,"string","text",{default:'"Hello World!"'});new Property(ve,"number","lineWidth",{default:200});new Property(ve,"string","backgroundColor",{default:"#00000040"});new Property(ve,"string","align",{default:"center"});new Property(ve,"boolean","shadow",{default:!1});new Property(ve,"boolean","seeThrough",{default:!1});new Property(ve,"string","onSummonFunction",{default:""});new Ga(ve,"configs",{default:()=>({default:{},variants:{}})});OutlinerElement.registerType(ve,ve.type);var Wx=new THREE.TextureLoader().load("data:image/svg+xml,"+encodeURIComponent(''));Wx.minFilter=THREE.NearestFilter;Wx.magFilter=THREE.NearestFilter;var sxe=new NodePreviewController(ve,{setup(t){gn.prototype.preview_controller.setup(t);let e=new THREE.SpriteMaterial({map:Wx,alphaTest:.1,sizeAttenuation:!1}),n=new THREE.Sprite(e);n.scale.setScalar(1/32);let i=t.mesh;i.add(n),i.sprite=n,i.renderOrder=-1,t.preview_controller.dispatchEvent("setup",{element:t})},updateGeometry(t){t.needsMeshUpdate&&(t.updateTextMesh(),t.needsMeshUpdate=!1)},updateTransform(t){gn.prototype.preview_controller.updateTransform(t)}}),jd=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(!this.element.selected&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element.parent&&this.element.parent!=="root"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayRotation(e,n=1){let i=this.getElement().mesh;if(i.fix_rotation&&i.rotation.copy(i.fix_rotation),e)if(e.length===4){let a=new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(e),"ZYX");i.rotation.x-=a.x*n,i.rotation.y-=a.y*n,i.rotation.z+=a.z*n}else i.rotation.x-=Math.degToRad(e[0])*n,i.rotation.y-=Math.degToRad(e[1])*n,i.rotation.z+=Math.degToRad(e[2])*n;if(this.rotation_global){let a=i.parent?.getWorldQuaternion(Reusable.quat1);if(!a)return this;a.invert(),i.quaternion.premultiply(a)}return this}displayPosition(e,n=1){let i=this.getElement().mesh;return i.fix_position&&i.position.copy(i.fix_position),e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}displayScale(e,n=1){if(!e)return this;let i=this.getElement().mesh;return i.fix_scale&&i.scale.copy(i.fix_scale),i.scale.x*=1+(e[0]-1)*n||1e-5,i.scale.y*=1+(e[1]-1)*n||1e-5,i.scale.z*=1+(e[2]-1)*n||1e-5,this}};s(jd,"TextDisplayAnimator");jd.prototype.type=ve.type;ve.animator=jd;var OT=nn({id:"animated-java:create-text-display"},{name:A("action.create_text_display.title"),icon:"text_fields",category:"animated_java",condition(){return Fe()&&Mode.selected.id===Modes.options.edit.id},click(){Undo.initEdit({outliner:!0,elements:[],selection:!0});let t=new ve({}).init(),e=getCurrentGroup();return e instanceof Group&&(t.addTo(e),t.extend({position:e.origin.slice()})),selected.forEachReverse(n=>n.unselect()),Group.first_selected?.unselect(),t.select(),Undo.finishEdit("Create Text Display",{outliner:!0,elements:selected,selection:!0}),t}}),IT=[];OT.onCreated(t=>{Interface.Panels.outliner.menu.addAction(t,3),Toolbars.outliner.add(t,0),MenuBar.menus.edit.addAction(t,8),IT.push(K.SELECT_PROJECT.subscribe(e=>{Fe()&&(e.textDisplays??=[],ve.all.empty(),ve.all.push(...e.textDisplays))}),K.UNSELECT_PROJECT.subscribe(e=>{Fe()&&(e.textDisplays=[...ve.all],ve.all.empty())}))});OT.onDeleted(t=>{Interface.Panels.outliner.menu.removeAction(t),Toolbars.outliner.remove(t),MenuBar.menus.edit.removeAction(t),IT.forEach(e=>e())});var DT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABgWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kTtIA0EURY+JokjEwhQiFltEK21UxFKiKIKBkETwV7i7MVHIrmE3YmMp2AYs/DRGLWystbWwFQTBD4i1hZWijcj6ZhNIEOPAMIc7cy9v3oNAKWdabuMoWHbBSUxGtdm5ea35hSaCQIAR3XTzseREirrr844Gdd72q6z67/5cbell14QGTXjUzDsF4SXh4Y1CXvGecNhc0dPCZ8J9jhQo/KB0o8yvirM+B1Rm2EklxoTDwlq2ho0aNlccS3hIOJK2bMkPzJY5rXhTsZVbNyt1qh+Glu2ZpNJldzPJFDHiaBiss0qOAv1y2qK4JOQ+Wsff5fvj4jLEtYopjnHWsNB9P2oGv3vrZgYHykmhKDQ9e957DzTvwHfR876OPO/7GIJPcGlX/WslGPkQvVjVIofQvgXnV1XN2IWLbeh8zOuO7kv+/DMZeDuVMc1Bxw20LpT7Vrnn5B5S0qvpa9g/gN6sZC/W+XdLbd/+fVPp3w9iNHKgdXImZAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAwAFKkpaLkIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAEklEQVQ4y2NgGAWjYBSMAggAAAQQAAGFP6pyAAAAAElFTkSuQmCC";var wt=class{__onApplyFunction;__billboard;__overrideBrightness;__brightnessOverride;__enchanted;__glowing;__overrideGlowColor;__glowColor;__invisible;__shadowRadius;__shadowStrength;static getDefault(){return wt.fromJSON({on_apply_function:"",billboard:"fixed",override_brightness:!1,brightness_override:0,enchanted:!1,glowing:!1,override_glow_color:!1,glow_color:"#ffffff",invisible:!1,shadow_radius:0,shadow_strength:1})}get onApplyFunction(){return this.__onApplyFunction!==void 0?this.__onApplyFunction:""}set onApplyFunction(e){this.__onApplyFunction=e}get billboard(){return this.__billboard!==void 0?this.__billboard:wt.getDefault().billboard}set billboard(e){this.__billboard=e}get overrideBrightness(){return this.__overrideBrightness!==void 0?this.__overrideBrightness:wt.getDefault().overrideBrightness}set overrideBrightness(e){this.__overrideBrightness=e}get brightnessOverride(){return this.__brightnessOverride!==void 0?this.__brightnessOverride:wt.getDefault().brightnessOverride}set brightnessOverride(e){this.__brightnessOverride=e}get enchanted(){return this.__enchanted!==void 0?this.__enchanted:wt.getDefault().enchanted}set enchanted(e){this.__enchanted=e}get glowing(){return this.__glowing!==void 0?this.__glowing:wt.getDefault().glowing}set glowing(e){this.__glowing=e}get overrideGlowColor(){return this.__overrideGlowColor!==void 0?this.__overrideGlowColor:wt.getDefault().overrideGlowColor}set overrideGlowColor(e){this.__overrideGlowColor=e}get glowColor(){return this.__glowColor!==void 0?this.__glowColor:wt.getDefault().glowColor}set glowColor(e){this.__glowColor=e}get invisible(){return this.__invisible!==void 0?this.__invisible:wt.getDefault().invisible}set invisible(e){this.__invisible=e}get shadowRadius(){return this.__shadowRadius!==void 0?this.__shadowRadius:wt.getDefault().shadowRadius}set shadowRadius(e){this.__shadowRadius=e}get shadowStrength(){return this.__shadowStrength!==void 0?this.__shadowStrength:wt.getDefault().shadowStrength}set shadowStrength(e){this.__shadowStrength=e}checkIfEqual(e){return this.__onApplyFunction===e.__onApplyFunction&&this.__billboard===e.__billboard&&this.__overrideBrightness===e.__overrideBrightness&&this.__brightnessOverride===e.__brightnessOverride&&this.__enchanted===e.__enchanted&&this.__glowing===e.__glowing&&this.__overrideGlowColor===e.__overrideGlowColor&&this.__glowColor===e.__glowColor&&this.__invisible===e.__invisible&&this.__shadowRadius===e.__shadowRadius&&this.__shadowStrength===e.__shadowStrength}isDefault(){return this.checkIfEqual(wt.getDefault())}toJSON(){return Ks({on_apply_function:this.__onApplyFunction,billboard:this.__billboard,override_brightness:this.__overrideBrightness,brightness_override:this.__brightnessOverride,enchanted:this.__enchanted,glowing:this.__glowing,override_glow_color:this.__overrideGlowColor,glow_color:this.__glowColor,invisible:this.__invisible,shadow_radius:this.__shadowRadius,shadow_strength:this.__shadowStrength})}inheritFrom(e){e.__onApplyFunction!==void 0&&(this.onApplyFunction=e.onApplyFunction),e.__billboard!==void 0&&(this.billboard=e.billboard),e.__overrideBrightness!==void 0&&(this.overrideBrightness=e.overrideBrightness),e.__brightnessOverride!==void 0&&(this.brightnessOverride=e.brightnessOverride),e.__enchanted!==void 0&&(this.enchanted=e.enchanted),e.__glowing!==void 0&&(this.glowing=e.glowing),e.__overrideGlowColor!==void 0&&(this.overrideGlowColor=e.overrideGlowColor),e.__glowColor!==void 0&&(this.glowColor=e.glowColor),e.__invisible!==void 0&&(this.invisible=e.invisible),e.__shadowRadius!==void 0&&(this.shadowRadius=e.shadowRadius),e.__shadowStrength!==void 0&&(this.shadowStrength=e.shadowStrength)}static fromJSON(e){let n=new wt;return e.on_apply_function!==void 0&&(n.__onApplyFunction=e.on_apply_function),e.billboard!==void 0&&(n.__billboard=e.billboard),e.override_brightness!==void 0&&(n.__overrideBrightness=e.override_brightness),e.brightness_override!==void 0&&(n.__brightnessOverride=e.brightness_override),e.enchanted!==void 0&&(n.__enchanted=e.enchanted),e.glowing!==void 0&&(n.__glowing=e.glowing),e.override_glow_color!==void 0&&(n.__overrideGlowColor=e.override_glow_color),e.glow_color!==void 0&&(n.__glowColor=e.glow_color),e.invisible!==void 0&&(n.__invisible=e.invisible),e.shadow_radius!==void 0&&(n.__shadowRadius=e.shadow_radius),e.shadow_strength!==void 0&&(n.__shadowStrength=e.shadow_strength),n}toNBT(e=new ot){if(this.__billboard&&e.set("billboard",new xt(this.billboard)),this.overrideBrightness&&e.set("brightness",new ot().set("block",new fn(this.brightnessOverride)).set("sky",new fn(this.brightnessOverride))),this.enchanted){let n=e.get("item")??new ot;if(compareVersions("1.21.5",Project.animated_java.target_minecraft_version))if(compareVersions(Project.animated_java.target_minecraft_version,"1.20.4")){let i=n.get("components")??new ot;n.set("components",i);let a=i.get("minecraft:enchantments")??new ot;i.set("minecraft:enchantments",a),a.set("levels",new ot().set("minecraft:infinity",new an(1)))}else{let i=n.get("tag")??new ot;n.set("tag",i);let a=i.get("Enchantments")??new Tn;i.set("Enchantments",a),a.add(new ot().set("id",new xt("minecraft:infinity")).set("lvl",new an(1)))}else{let i=n.get("components")??new ot;n.set("components",i);let a=i.get("minecraft:enchantments")??new ot;i.set("minecraft:enchantments",a),a.set("minecraft:infinity",new an(1))}e.set("item",n)}return this.glowing&&e.set("Glowing",new di(Number(this.glowing))),this.overrideGlowColor&&e.set("glow_color_override",new an(Number(this.glowColor.replace("#","0x")))),this.__shadowRadius&&e.set("shadow_radius",new fn(this.shadowRadius)),this.__shadowStrength&&e.set("shadow_strength",new fn(this.shadowStrength)),e}};s(wt,"DisplayEntityConfig");var Nr=class{__useEntity;__entityType;__syncPassengerRotation;__onSummonFunction;__onRemoveFunction;__onTickFunction;getDefault(){return Nr.fromJSON({use_entity:!1,entity_type:"minecraft:pig",sync_passenger_rotation:!1,on_summon_function:"",on_remove_function:"",on_tick_function:""})}get useEntity(){return this.__useEntity!==void 0?this.__useEntity:this.getDefault().useEntity}set useEntity(e){this.__useEntity=e}get entityType(){return this.__entityType!==void 0?this.__entityType:this.getDefault().entityType}set entityType(e){this.__entityType=e}get syncPassengerRotation(){return this.__syncPassengerRotation!==void 0?this.__syncPassengerRotation:this.getDefault().syncPassengerRotation}set syncPassengerRotation(e){this.__syncPassengerRotation=e}get onSummonFunction(){return this.__onSummonFunction!==void 0?this.__onSummonFunction:this.getDefault().onSummonFunction}set onSummonFunction(e){this.__onSummonFunction=e}get onRemoveFunction(){return this.__onRemoveFunction!==void 0?this.__onRemoveFunction:this.getDefault().onRemoveFunction}set onRemoveFunction(e){this.__onRemoveFunction=e}get onTickFunction(){return this.__onTickFunction!==void 0?this.__onTickFunction:this.getDefault().onTickFunction}set onTickFunction(e){this.__onTickFunction=e}toJSON(){return Ks({use_entity:this.__useEntity,entity_type:this.__entityType,sync_passenger_rotation:this.__syncPassengerRotation,on_summon_function:this.__onSummonFunction,on_remove_function:this.__onRemoveFunction,on_tick_function:this.__onTickFunction})}static fromJSON(e){let n=new Nr;return e.use_entity!==void 0&&(n.__useEntity=e.use_entity),e.entity_type!==void 0&&(n.__entityType=e.entity_type),e.sync_passenger_rotation!==void 0&&(n.__syncPassengerRotation=e.sync_passenger_rotation),e.on_summon_function!==void 0&&(n.__onSummonFunction=e.on_summon_function),e.on_remove_function!==void 0&&(n.__onRemoveFunction=e.on_remove_function),e.on_tick_function!==void 0&&(n.__onTickFunction=e.on_tick_function),n}isDefault(){return this.checkIfEqual(new Nr)}checkIfEqual(e){return this.useEntity===e.useEntity&&this.entityType===e.entityType&&this.syncPassengerRotation===e.syncPassengerRotation&&this.onSummonFunction===e.onSummonFunction&&this.onRemoveFunction===e.onRemoveFunction&&this.onTickFunction===e.onTickFunction}};s(Nr,"LocatorConfig");function yf(t){t?.meta?.model_format==="animatedJava/ajmodel"&&(t.meta.model_format="animated_java/ajmodel",t.meta.format_version="0.0");try{let e=t.meta.format_version.length===3;if(e=e||compareVersions(Ke.version,t.meta.format_version),!e)return t;if(console.groupCollapsed("Upgrading project from",t.meta.format_version,"to",Ke.version),console.log("Original model:",JSON.parse(JSON.stringify(t))),t.meta.format_version.length===3){console.groupCollapsed("Discovered outdated ajmodel format! Upgrading to blueprint format...");try{compareVersions("1.0",t.meta.format_version)&&(t=cxe(t)),compareVersions("1.1",t.meta.format_version)&&(t=uxe(t)),compareVersions("1.2",t.meta.format_version)&&(t=dxe(t)),compareVersions("1.3",t.meta.format_version)&&(t=pxe(t)),compareVersions("1.4",t.meta.format_version)&&(t=mxe(t)),t.meta.format_version="0.3.9",console.log("Upgrade to blueprint format complete",JSON.parse(JSON.stringify(t)))}catch(i){throw console.error("Failed to upgrade from ajmodel format to blueprint format",i),i}finally{console.groupEnd()}}switch(!0){case compareVersions("0.3.10",t.meta.format_version):t=fxe(t);case compareVersions("0.5.0",t.meta.format_version):t=hxe(t);case compareVersions("0.5.5",t.meta.format_version):t=gxe(t);case compareVersions("0.5.6",t.meta.format_version):t=_xe(t);case compareVersions("0.5.7",t.meta.format_version):t=xxe(t);case compareVersions("1.4.0",t.meta.format_version):t=vxe(t);case compareVersions("1.6.3",t.meta.format_version):t=bxe(t);case compareVersions("1.6.5",t.meta.format_version):t=yxe(t);case compareVersions("1.8.0",t.meta.format_version):t=wxe(t)}let n=Qs();for(let i in t.blueprint_settings)i in n||(console.warn("Removing unknown blueprint setting",i,t.blueprint_settings[i]),delete t.blueprint_settings[i]);return t.meta.format_version="1.8.0",console.log("Upgrade complete",JSON.parse(JSON.stringify(t))),t}catch(e){throw Fo(e),e}finally{console.groupEnd()}}s(yf,"process");function cxe(t){console.log("Processing model format 1.0",t);let e=JSON.parse(JSON.stringify(t));if(e.meta.settings){console.log("Upgrading settings...");let n={settings:{project_name:e.meta.settings.animatedJava.projectName,verbose:e.meta.settings.animatedJava.verbose,rig_item:e.meta.settings.animatedJava.rigItem,rig_item_model:e.meta.settings.animatedJava.predicateFilePath,rig_export_folder:e.meta.settings.animatedJava.rigModelsExportFolder},exporter_settings:{},variants:[]};e.animated_java=n}if(e.meta.variants){console.log("Upgrading variants...");let n=[];for(let[i,a]of Object.entries(e.meta.variants))n.push({name:i,uuid:guid(),textureMap:a,default:i==="default",boneConfig:{},affectedBones:[],affectedBonesIsAWhitelist:!1});e.animated_java.variants=n}if(e.animations?.find(n=>Object.keys(n.animators).find(i=>i==="effects"))){console.log("Upgrading effects...");for(let n of e.animations){let i=n.animators.effects;if(i){for(let a of i.keyframes)if(a.channel==="timeline")for(let r of a.data_points)r.script&&(r.commands=r.script,delete r.script,a.channel="commands")}}console.log("Upgrading effects complete",e.animations)}return e.meta.format_version=Ke.version,delete e.meta.variants,delete e.meta.settings,delete e.meta.uuid,e}s(cxe,"updateModelToOld1_0");function uxe(t){console.log("Processing model format 1.1",t);let e=JSON.parse(JSON.stringify(t));e.animated_java.settings.resource_pack_mcmeta=e.animated_java.settings.resource_pack_folder,delete e.animated_java.settings.resource_pack_folder;let n=e.animated_java.exporter_settings["animated_java:animation_exporter"];return n&&(n.datapack_mcmeta=n.datapack_folder,delete n.datapack_folder),e}s(uxe,"updateModelToOld1_1");function dxe(t){console.log("Processing model format 1.2",t);let e=JSON.parse(JSON.stringify(t));for(let n of e.animated_java.variants)for(let[i,a]of Object.entries(n.textureMap)){let r=i.split("::")[0],o=a.split("::")[0];n.textureMap[r]=o,delete n.textureMap[i]}return e}s(dxe,"updateModelToOld1_2");function pxe(t){console.log("Processing model format 1.3",t);let e=JSON.parse(JSON.stringify(t));return e.animated_java.settings.exporter==="animated_java:animation_exporter"&&(e.animated_java.settings.exporter="animated_java:datapack_exporter"),e.animated_java.exporter_settings["animated_java:animation_exporter"]&&(e.animated_java.exporter_settings["animated_java:datapack_exporter"]=e.animated_java.exporter_settings["animated_java:animation_exporter"],delete e.animated_java.exporter_settings["animated_java:animation_exporter"]),e}s(pxe,"updateModelToOld1_3");function mxe(t){console.log("Processing model format 1.4",t);let e=JSON.parse(JSON.stringify(t)),n=e.animated_java.exporter_settings["animated_java:datapack_exporter"];return n&&n.outdated_rig_warning!==void 0&&(e.animated_java.exporter_settings["animated_java:datapack_exporter"].enable_outdated_rig_warning=e.animated_java.exporter_settings["animated_java:datapack_exporter"].outdated_rig_warning,delete e.animated_java.exporter_settings["animated_java:datapack_exporter"].outdated_rig_warning),e}s(mxe,"updateModelToOld1_4");function fxe(t){console.log("Processing model for AJ 0.3.10",t);let e=JSON.parse(JSON.stringify(t));return e.meta??={},e.meta.model_format="animated_java/blueprint",e}s(fxe,"updateModelTo0_3_10");function hxe(t){console.log("Processing model format 1.0.0-pre1",t);let e=Qs(),n=t.animated_java.exporter_settings["animated_java:datapack_exporter"],i=t.animated_java.variants.find(c=>!!c.default),a={meta:{format:"animated_java_blueprint",format_version:"0.5.0",uuid:t.meta.uuid??guid(),last_used_export_namespace:t.animated_java.settings.project_namespace},project_settings:{show_bounding_box:e.show_render_box,auto_bounding_box:e.auto_render_box,bounding_box:e.render_box,export_namespace:t.animated_java.settings.project_namespace,enable_plugin_mode:e.enable_plugin_mode,resource_pack_export_mode:e.resource_pack_export_mode,data_pack_export_mode:e.data_pack_export_mode,display_item:t.animated_java.settings.rig_item,custom_model_data_offset:0,enable_advanced_resource_pack_settings:t.animated_java.settings.enable_advanced_resource_pack_settings,resource_pack:t.animated_java.settings.resource_pack_mcmeta?t.animated_java.settings.resource_pack_mcmeta.replace(/pack\.mcmeta$/,""):"",display_item_path:t.animated_java.settings.rig_item_model,model_folder:t.animated_java.settings.rig_export_folder,texture_folder:t.animated_java.settings.texture_export_folder,enable_advanced_data_pack_settings:e.enable_advanced_data_pack_settings,data_pack:n?.datapack_mcmeta?n.datapack_mcmeta.replace(/pack\.mcmeta$/,""):"",summon_commands:e.on_summon_function,interpolation_duration:e.interpolation_duration,teleportation_duration:e.teleportation_duration,use_storage_for_animation:e.use_storage_for_animation,baked_animations:e.baked_animations,json_file:e.json_file},variants:{default:{name:"default",display_name:i.name??"Default",uuid:i.uuid??guid(),texture_map:i.textureMap??{},excluded_bones:[]},list:[]},resolution:t.resolution,outliner:[],elements:t.elements,animations:t.animations,textures:t.textures,animation_variable_placeholders:t.animation_variable_placeholders},r=[],o=s(c=>{typeof c!="string"&&(r.push(c.uuid),c.configs={default:new wt().toJSON(),variants:{}},c.children.forEach(d=>{typeof d!="string"&&o(d)}),c.nbt&&c.nbt!=="{}"&&(c.configs.default.use_nbt=!0,c.configs.default.nbt=c.nbt,delete c.nbt))},"recurseOutliner");t.outliner.forEach(o),a.outliner=t.outliner;for(let c of a.elements??[])if(c.type==="locator"&&(c.config={use_entity:!0},c.entity_type&&(c.config.entity_type=c.entity_type),c.nbt)){let d=[],u=st.fromString(c.nbt);u.delete("Passengers");let p=u.get("Tags")?.map(f=>f.getAsString());u.delete("Tags"),d.push("data merge entity @s "+u.toString()),p&&d.push(...p.map(f=>`tag @s add ${f}`));let m=s(f=>{let g=st.fromString(f);if(!(g instanceof ot))throw new Error("NBT is not a compound");let x=g.get("Passengers");if(x){console.log("Found passengers");let _=x.map(h=>{let v=h.get("id").getAsString();h.delete("id");let b=h.get("Tags").map(w=>w.getAsString());h.delete("Tags");let y=h.toString();return`execute summon ${v} run { ${[`data merge entity @s ${y}`,...b.map(w=>`tag @s add ${w}`),"tag @s add to_mount",...m(y)].join(` `)} }`});return _.push("tag @s add vehicle","execute as @e[tag=to_mount,distance=..0.01] run {"," ride @s mount @e[tag=vehicle,limit=1]"," tag @s remove to_mount","}","tag @s remove vehicle","execute on passengers run tag @s remove to_mount"),_}return[]},"recursePassengers");try{d.push(...m(c.nbt))}catch(f){console.error("Failed to parse NBT",c.nbt),console.error(f)}d.length===0&&d.push(`data merge entity @s ${c.nbt}`),c.config.summon_commands=d.join(` `)}let l=t.animated_java?.variants?.filter(c=>!c.default)??[];for(let c of l){let d=c.affectedBones.map(p=>p.value),u;c.affectedBonesIsAWhitelist?u=r.filter(p=>!d.includes(p)):u=d,a.variants.list.push({name:c.name,display_name:c.name,uuid:c.uuid,texture_map:c.textureMap,excluded_nodes:u})}if(n?.root_entity_nbt&&n.root_entity_nbt!=="{}"){let c=[],d=st.fromString(n.root_entity_nbt),u=d.get("Tags")?.map(p=>p.getAsString());d.delete("Tags"),[...d.keys()].length!==0&&c.push("data merge entity @s "+d.toString()),u&&c.push(...u.map(p=>`tag @s add ${p}`)),a.project_settings.summon_commands=c.join(` `)}return a}s(hxe,"updateModelTo1_0pre1");function gxe(t){console.log("Processing model format 1.0.0-pre6",t);let e=JSON.parse(JSON.stringify(t)),n=e.variants.default;n?.excluded_bones&&(n.excluded_nodes=n.excluded_bones,delete n.excluded_bones);for(let i of e.variants?.list??[])i?.excluded_bones&&(i.excluded_nodes=i.excluded_bones,delete i.excluded_bones);for(let i of e.animations??[])i?.excluded_bones&&(i.excluded_nodes=i.excluded_bones,delete i.excluded_bones);return e}s(gxe,"updateModelTo1_0pre6");function _xe(t){console.log("Processing model format 1.0.0-pre7",t);let e=JSON.parse(JSON.stringify(t));return e.project_settings.enable_resource_pack!==void 0&&(e.project_settings.resource_pack_export_mode=e.project_settings.enable_resource_pack?"raw":"none",delete e.project_settings.enable_resource_pack),e.project_settings.enable_data_pack!==void 0&&(e.project_settings.data_pack_export_mode=e.project_settings.enable_data_pack?"raw":"none",delete e.project_settings.enable_data_pack),e}s(_xe,"updateModelTo1_0pre7");function xxe(t){console.log("Processing model format 1.0.0-pre8",t);let e=JSON.parse(JSON.stringify(t));return e.project_settings&&(e.blueprint_settings=e.project_settings,delete e.project_settings),e}s(xxe,"updateModelTo1_0pre8");function vxe(t){console.log("Processing model format 1.4.0",t);let e=JSON.parse(JSON.stringify(t));return e.blueprint_settings.enable_advanced_resource_pack_settings&&(e.blueprint_settings.enable_advanced_resource_pack_folders=!0),e.blueprint_settings.custom_model_data_offset!==void 0&&e.blueprint_settings.custom_model_data_offset!==0&&(e.blueprint_settings.enable_advanced_resource_pack_settings=!0),e}s(vxe,"updateModelTo1_4_0");function bxe(t){console.log("Processing model format 1.6.3",t);let e=JSON.parse(JSON.stringify(t));for(let n of e.variants.list)if(Object.values(n.texture_map).includes("797174ae-5c58-4a83-a630-eefd51007c80")){let i=new Texture({name:"transparent"},"797174ae-5c58-4a83-a630-eefd51007c80").fromDataURL(DT);e.textures.push(i.getSaveCopy());break}return e}s(bxe,"updateModelTo1_6_3");function yxe(t){console.log("Processing model format 1.6.5",t);let e=JSON.parse(JSON.stringify(t));return typeof e.blueprint_settings?.target_minecraft_version=="string"&&(e.blueprint_settings.target_minecraft_versions=[e.blueprint_settings.target_minecraft_version],delete e.blueprint_settings.target_minecraft_version),e}s(yxe,"updateModelTo1_6_5");function wxe(t){console.log("Processing model format 1.8.0",JSON.parse(JSON.stringify(t)));let e=JSON.parse(JSON.stringify(t));if(e.blueprint_settings??={},t.blueprint_settings?.resource_pack_export_mode==="raw"&&(e.blueprint_settings.resource_pack_export_mode="folder"),t.blueprint_settings?.data_pack_export_mode==="raw"&&(e.blueprint_settings.data_pack_export_mode="folder"),t.blueprint_settings?.show_bounding_box!=null&&(e.blueprint_settings.show_render_box=t.blueprint_settings.show_bounding_box,delete e.blueprint_settings.show_bounding_box),t.blueprint_settings?.auto_bounding_box!=null&&(e.blueprint_settings.auto_render_box=t.blueprint_settings.auto_bounding_box,delete e.blueprint_settings.auto_bounding_box),t.blueprint_settings?.bounding_box!=null&&(e.blueprint_settings.render_box=t.blueprint_settings.bounding_box,delete e.blueprint_settings.bounding_box),t.blueprint_settings?.summon_commands!=null&&(e.blueprint_settings.on_summon_function=t.blueprint_settings.summon_commands,delete e.blueprint_settings.summon_commands),t.blueprint_settings?.remove_commands!=null&&(e.blueprint_settings.on_remove_function=t.blueprint_settings.remove_commands,delete e.blueprint_settings.remove_commands),t.blueprint_settings?.ticking_commands!=null&&(e.blueprint_settings.on_post_tick_function=t.blueprint_settings.ticking_commands,delete e.blueprint_settings.ticking_commands),Array.isArray(t.blueprint_settings?.target_minecraft_versions)&&(e.blueprint_settings.target_minecraft_version=t.blueprint_settings.target_minecraft_versions.at(0)??Qs().target_minecraft_version,delete e.blueprint_settings.target_minecraft_versions),Array.isArray(e.elements)){let n=e.elements.filter(r=>r.type===ve.type);for(let r of n)r.backgroundAlpha!==void 0&&(r.backgroundColor??=ve.properties.backgroundColor.default,r.backgroundColor=tinycolor(r.backgroundColor).setAlpha(r.backgroundAlpha).toHex8String(),delete r.backgroundAlpha);let i=e.elements.filter(r=>r.type===AnimatedJava.TextDisplay.type||r.type===AnimatedJava.VanillaItemDisplay.type||r.type===AnimatedJava.VanillaBlockDisplay.type);for(let r of i)r.config&&(r.config.custom_name!==void 0&&(r.config.on_apply_function??="",r.config.on_apply_function+=` # Auto-upgraded custom name setting (May need fixing): data modify entity @s CustomName set value '${r.config.custom_name}' `,delete r.config.custom_name),r.config.custom_name_visible&&(r.config.on_apply_function??="",r.config.on_apply_function+=` # Auto-upgraded custom name visibility setting: data modify entity @s CustomNameVisible set value ${r.config.custom_name_visible} `,delete r.config.custom_name_visible),r.configs={default:r.config,variants:{}},delete r.config);let a=e.elements.filter(r=>r.type===Locator.prototype.type);for(let r of a)r.config?.summon_commands&&(r.config.on_summon_function=r.config.summon_commands,delete r.config.summon_commands),r.config?.ticking_commands&&(r.config.on_tick_function=r.config.ticking_commands,delete r.config.ticking_commands)}if(Array.isArray(e.animations)){for(let n of e.animations)for(let i of Object.values(n.animators??{}))if(Array.isArray(i.keyframes)){for(let a of i.keyframes)if(a.channel==="commands"&&(a.channel="function",Array.isArray(a.data_points)))for(let r of a.data_points)r.commands&&(r.function=r.commands,delete r.commands)}}return e}s(wxe,"updateModelTo1_8_0");function wf(t){return t.replace(/\\/g,"/")}s(wf,"normalizePath");function Ec(t){return t.endsWith(".json")&&(t.includes("tags\\function")||t.includes("tags/function")||t.includes("tags\\functions")||t.includes("tags/functions"))}s(Ec,"isFunctionTagPath");function Exe(t){return t.replace(/%([^%]+)%/g,function(e,n){if(!process.env[n])throw new Error("Environment variable "+n+" does not exist.");return process.env[n]})}s(Exe,"resolveEnvVariables");function kxe(t){return t.startsWith("./")||t.startsWith("../")||t.startsWith(".\\")||t.startsWith("..\\")}s(kxe,"isRelativePath");function jxe(t){if(!Project?.save_path)return;let e=PathModule.dirname(Project.save_path);return PathModule.resolve(e,t)}s(jxe,"resolveRelativePath");function $o(t){if(kxe(t)){let e=jxe(t);if(!e)throw new Error(`Failed to resolve relative path '${t}'`);t=e}return wf(Exe(t))}s($o,"resolvePath");function Ef(t){try{return fs.readFileSync(t)}catch{return}}s(Ef,"safeReadSync");var NT="data:image/webp;base64,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";var RT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+malUqDnYQcchQnSyIiugmVSyChdJWaNXB5NI/aNKQpLg4Cq4FB38Wqw4uzro6uAqC4A+Iq4uToouU+F1SaBHjHcc9vPe9L3ffAUK9zFSzYxxQNctIxqJiJrsqBl7RRbMHs5iRmKnHU4tpeI6ve/j4fhfhWd51f44+JWcywCcSzzHdsIg3iKc3LZ3zPnGIFSWF+Jx4zKALEj9yXXb5jXPBYYFnhox0cp44RCwW2lhuY1Y0VOIp4rCiapQvZFxWOG9xVstV1rwnf2Ewp62kuE5rGDEsIY4ERMioooQyLERo10gxkaTzqId/yPEnyCWTqwRGjgVUoEJy/OB/8Lu3Zn5ywk0KRoHOF9v+GAECu0CjZtvfx7bdOAH8z8CV1vJX6sDMJ+m1lhY+Avq3gYvrlibvAZc7wOCTLhmSI/lpCfk88H5G35QFBm6B3jW3b81znD4AaerV8g1wcAiMFih73ePd3e19+7em2b8f4B1y0yv9YvYAAAAGYktHRADZAKIAhTqIWPYAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfnBgYJOi0CGZJlAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAD9JREFUCNd1jcEJADAIA1NXyP5j+LK7pR8tIhgQNBciAECkRGruJlJwRwGkROp0Y8ruAr4f+acmZltsoAf6/QADBCX4xA+nZQAAAABJRU5ErkJggg==";function MT(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x;return{c(){e=L("div"),n=L("div"),i=L("div"),a=L("img"),o=J(),l=L("span"),l.textContent="Animated Java?",c=J(),d=L("i"),d.textContent="close",u=J(),p=L("a"),m=L("img"),E(a,"class","heart svelte-1loc3ll"),Ht(a.src,r=RT)||E(a,"src",r),E(a,"alt","\u2764\uFE0F"),E(l,"class","svelte-1loc3ll"),E(d,"class","material-icons icon svelte-1loc3ll"),E(i,"class","title svelte-1loc3ll"),Ht(m.src,f=NT)||E(m,"src",f),E(m,"alt",""),E(m,"class","svelte-1loc3ll"),E(p,"href","https://ko-fi.com/snavesutit"),E(p,"class","ko-fi-button svelte-1loc3ll"),E(n,"class","ko-fi-popup svelte-1loc3ll"),E(e,"class","ko-fi-popup-container svelte-1loc3ll")},m(_,h){U(_,e,h),I(e,n),I(n,i),I(i,a),I(i,o),I(i,l),I(i,c),I(i,d),I(n,u),I(n,p),I(p,m),g||(x=[Ue(d,"click",t[1]),Ue(d,"mouseenter",t[2]),Ue(d,"mouseleave",t[3])],g=!0)},p:ie,d(_){_&&z(e),g=!1,Rt(x)}}}s(MT,"create_if_block");function Cxe(t){let e,n=t[0]&&MT(t);return{c(){n&&n.c(),e=_t()},m(i,a){n&&n.m(i,a),U(i,e,a)},p(i,[a]){i[0]?n?n.p(i,a):(n=MT(i),n.c(),n.m(e.parentNode,e)):n&&(n.d(1),n=null)},i:ie,o:ie,d(i){n&&n.d(i),i&&z(e)}}}s(Cxe,"create_fragment");localStorage.setItem("animated_java_settings_support_me_popup","true");function Sxe(t,e,n){let i=localStorage.getItem("animated_java_settings_support_me_popup")==="true";return[i,s(()=>{localStorage.setItem("animated_java_settings_support_me_popup","false"),n(0,i=!1)},"clickSupportMeXButton"),s(l=>{l.target instanceof HTMLElement&&(l.target.textContent="sentiment_sad")},"hoverCloseButton"),s(l=>{l.target instanceof HTMLElement&&(l.target.textContent="close")},"leaveCloseButton")]}s(Sxe,"instance");var kf=class extends Pe{constructor(e){super(),Ve(this,e,Sxe,Cxe,De,{})}};s(kf,"KofiPopup");var BT=kf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`i.svelte-1loc3ll.svelte-1loc3ll{cursor:pointer;height:fit-content;transition:transform 0.2s ease 0s,\r color 0.2s ease 0s;text-shadow:1.5px 1.5px 0px rgba(0, 0, 0, 0.25);align-self:flex-start}i.svelte-1loc3ll.svelte-1loc3ll:hover{transform:scale(1.25)}.ko-fi-popup-container.svelte-1loc3ll.svelte-1loc3ll{position:absolute;top:30px;left:100%;font-family:'MinecraftFull';font-size:24px;color:white;overflow:hidden}.ko-fi-popup.svelte-1loc3ll.svelte-1loc3ll{position:relative;padding:10px 12px;background-color:#00aced;border-radius:0 8px 8px 0;animation:svelte-1loc3ll-slideIn 1.5s;line-height:1}.heart.svelte-1loc3ll.svelte-1loc3ll{width:28px;height:28px;animation:svelte-1loc3ll-heartbeat 2s ease infinite}@keyframes svelte-1loc3ll-heartbeat{0%{transform:scale(1)}10%{transform:scale(1.2)}20%{transform:scale(1)}}.ko-fi-popup.svelte-1loc3ll span.svelte-1loc3ll{text-shadow:0.2rem 0.2rem 0px rgba(0, 0, 0, 0.25)}.ko-fi-button.svelte-1loc3ll img.svelte-1loc3ll{width:100%;image-rendering:auto;transition:transform 0.2s ease}.ko-fi-button.svelte-1loc3ll img.svelte-1loc3ll:hover{transform:scale(1.05)}.ko-fi-popup.svelte-1loc3ll .title.svelte-1loc3ll{display:flex;align-items:center;gap:1rem;white-space:nowrap;margin-bottom:8px}@keyframes svelte-1loc3ll-slideIn{0%{right:100%}50%{right:100%}100%{right:0}}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var PT=Canvas.outlineMaterial.clone();PT.color.set("#ff0000");function Yx(){for(let t of Cube.all)Cube.preview_controller.updateTransform(t)}s(Yx,"updateAllCubeOutlines");function Kx(t,e){t.isRotationValid!==e&&(t.mesh.outline.material=e?Canvas.outlineMaterial:PT,t.isRotationValid=e)}s(Kx,"updateCubeValidity");var jf=null;function Oxe(){if(!jf){jf=Blockbench.showToastNotification({text:A(Rr("1.21.6")?"toast.invalid_rotations_post_1_21_6":"toast.invalid_rotations"),color:"var(--color-error)",click:()=>!1});let t=setInterval(()=>{Cube.all.some(e=>Ad(e)==="invalid")&&document.querySelector("li.toast_notification")||(clearInterval(t),jf?.delete(),jf=null,requestAnimationFrame(Yx))},1e3)}}s(Oxe,"showToastNotification");St({id:"animated-java:cube-outline-mod",apply:()=>{let t=Cube.preview_controller.updateTransform;Cube.preview_controller.updateTransform=function(n){if(Fe())switch(Ad(n)){case"valid":{Kx(n,!0);break}case"1.21.6+":if(Rr("1.21.6")){Kx(n,!0);break}case"invalid":{Kx(n,!1),Oxe();break}}t.call(this,n)};let e=Cube.prototype.init;return Cube.prototype.init=function(){let n=e.call(this);n.isRotationValid=!0;let[,i]=Py(n.mesh.outline,"visible");return i.subscribe(({storage:a})=>{Fe()&&(a.value=!n.isRotationValid||a.value)}),n},{originalUpdateTransform:t,originalInit:e}},revert:({originalUpdateTransform:t,originalInit:e})=>{Cube.preview_controller.updateTransform=t,Cube.prototype.init=e}});var Ixe={};vn(Ixe,{default:()=>Xx});var Xx=kI("AAEAAAANAIAAAwBQRkZUTTylB+MAAaIMAAAAHEdERUYAJQAAAAGh9AAAABhPUy8y/fxN0gAAAVgAAABgY21hcHhH6IYAABRAAAAKrmdhc3D//wADAAGh7AAAAAhnbHlmcJz5JAAAKDgAAU3kaGVhZL/tgK4AAADcAAAANmhoZWEHggijAAABFAAAACRobXR4GdUXAAAAAbgAABKIbG9jYfA4nFgAAB7wAAAJRm1heHAEwwCCAAABOAAAACBuYW1lrGdvGwABdhwAAAJMcG9zdEMAzNIAAXhoAAAphAABAAAAAQAA3fpnrl8PPPUACwQAAAAAAHw3nBsAAAAA4JaglgAA/4AEAAOAAAAACAACAAAAAAAAAAEAAAOA/4AAAASAAAAAAAQAAAEAAAAAAAAAAAAAAAAAAASiAAEAAASiAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgKSAZAABQAEAgACAAAA/8ACAAIAAAACAAAzAMwAAAAABAAAAAAAAACkAA6/QAnw+wAAoDAAAAAAWUFMLgBAACD//QOA/4AAAAOAAIAAAAH/AAAAAAKAA4AAAAAgAAEAgAAAAIAAAAFVAAACAAAAAQAAAAIAAAADAAAAAwAAAAMAAAADAAAAAQAAAAIAAAACAAAAAgAAAAMAAAABAAAAAwAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAEAAAABAAAAAoAAAAMAAAACgAAAAwAAAAOAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAgAAAAMAAAADAAAAAYAAAAMAAAADAAAAAwAAAAMAAAADAAAAAoAAAAMAAAADAAAAAQAAAAMAAAACgAAAAYAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAgAAAAEAAAACAAAAA4AAAAEAAAADAAAAAwAAAAQAAAADAAAAAQAAAAMAAAACAAAABAAAAAKAAAADgAAAAwAAAAIAAAAEAAAAAwAAAAKAAAADAAAAAoAAAAKAAAABgAAAAwAAAAOAAAAAgAAAAgAAAAKAAAADgAAABAAAAAQAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAKAAAACgAAAAgAAAAQAAAADgAAAA4AAAAMAAAADgAAAAwAAAAMAAAADAAAAA4AAAAMAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAEAAAACAAAAAwAAAAEAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAAAwAAAAMAAAACAAAABAAAAAKAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAADAAAAA4AAAAQAAAADAAAAAwAAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAAEAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADgAAAAwAAAAMAAAAEAAAAAwAAAAMAAAAEAAAAAwAAAAKAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAgAAAAIAAAADAAAAAoAAAAGAAAADAAAAAwAAAAMAAAADAAAAA4AAAAOAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAAAwAAAAOAAAACAAAAAgAAAAQAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAA4AAAAMAAAADAAAAAoAAAAMAAAADgAAAAwAAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAGAAAACgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAAAwAAAAQAAAADAAAAAwAAAAIAAAADAAAABAAAAAOAAAADgAAAAwAAAAMAAAADAAAAAwAAAAOAAAADAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAQAAAADAAAAA4AAAAMAAAAEAAAABIAAAAOAAAAEAAAAAwAAAAMAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAKAAAADgAAAAwAAAAMAAAADAAAAAwAAAAKAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADgAAAA4AAAAMAAAADAAAABAAAAAMAAAADAAAAAwAAAAEAAAADAAAABAAAAAOAAAADgAAAA4AAAAMAAAADAAAAA4AAAAOAAAADgAAAAwAAAASAAAADgAAAA4AAAAMAAAADgAAAA4AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAA4AAAAOAAAADAAAAAwAAAAMAAAADAAAAA4AAAAOAAAADAAAAAoAAAAOAAAADAAAAAwAAAAMAAAADAAAAA4AAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADAAAAAwAAAAMAAAADAAAAAwAAAAKAAAADAAAAAwAAAAMAAAADAAAAAYAAAAGAAAABgAAAAgAAAAGAAAACAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADgAAAAwAAAAOAAAACgAAAAwAAAAMAAAADgAAAAwAAAAGAAAADgAAAAwAAAAMAAAADAAAAAwAAAAOAAAADAAAAA4AAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAAEAAAAAwAAAAMAAAACgAAABAAAAAOAAAADAAAAAwAAAAOAAAADgAAAAwAAAAMAAAADAAAAAQAAAAIAAAADAAAAAwAAAAKAAAADAAAAAwAAAAEAAAACAAAAAwAAAAMAAAABAAAAAwAAAAMAAAADAAAAAwAAAAMAAAABAAAAAgAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAAAgAAAAIAAAABgAAAAoAAAAMAAAADAAAABAAAAAQAAAADAAAAAwAAAAQAAAAEAAAABAAAAAMAAAADAAAABAAAAAOAAAADAAAABAAAAAQAAAADgAAABAAAAAMAAAADAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAKAAAADAAAAA4AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAoAAAAMAAAADAAAAAwAAAAMAAAACgAAAAoAAAAIAAAACgAAAAoAAAAKAAAADAAAAAgAAAAIAAAADAAAAAwAAAAKAAAACAAAAAoAAAAKAAAADAAAAAwAAAAMAAAACgAAAAwAAAAMAAAADAAAAAgAAAAMAAAACAAAAAwAAAAEAAAACAAAAA4AAAAMAAAADAAAAAgAAAAMAAAACgAAAAwAAAAIAAAADAAAAAQAAAAIAAAADAAAAAwAAAAIAAAACgAAAAoAAAAIAAAACgAAAAoAAAAMAAAADAAAAAwAAAAIAAAACAAAAAoAAAAMAAAADAAAAAwAAAAOAAIAEAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAAAQAAAAMAAAACgAAABAAAAAGAAAABAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAABAAAAAKAAAABgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAAAoAAAAKAAAADAAAAAwAAAAMAAAACgAAAAwAAAAOAAAACAAAAAgAAAAOAAAAEgAAAAYAAAAGAAAABgAAAAoAAAAKAAAACgAAAAwAAAAMAAAABgAAABAAAAAQAAAAEgAAAAYAAAAKAAAADgAAAAYAAAAKAAAADgAAAAgAAAAIAAAAEAAAAAgAAAAMAAAAEAAAABAAAAAQAAAACgAAAA4AAAAIAAAABAAAAAgAAAAIAAAAEgAAAAoAAAAEAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACAAAAAgAAAAIAAAABgAAAAYAAAAKAAAACgAAAAgAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAgAAAAIAAAACAAAAAYAAAAGAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAAEAAAABAAAAAQAAAADgAAAA4AAAAOAAAADAAAAAwAAAAQAAAADAAAABAAAAAQAAAADAAAAAwAAAAQAAAADAAAAAwAAAAOAAAAEAAAAAwAAAAOAAAADgAAAAwAAAAQAAAAEgAAAAwAAAAMAAAADAAAAAwAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEAAAABAAAAASAAAAEgAAABIAAAASAAAADgAAABIAAAAQAAAADAAAABAAAAAMAAAAEgAAABAAAAASAAAAEgAAABIAAAAOAAAAEAAAAAoAAAAMAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwABgAOAAAAEAAAABAAAAAOAAAAEAAAAAgAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAABAAAAAMAAAADgAAAA4AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAGAAoAAAAMAAAADgAAAA4AAAAQAAAAEAAAAA4AAAAIAAAACAAAAAwAAAAMAAAACAAAAAwAAAAMAAAAEAAAABAAAAAEAAAAEgAAAAwABgASAAYADAAAABIABgAMAAAAEgAGAAwAAAASAAAAEgAAABIAAAASAAAAEAAEABIABgASAAQAEgAEAAwAAAAQAAAAEAAAABIABgASAAQAEgAEAAwAAAAQAAAAEAAAABIABgASAAQAEgAEAAwAAAAQAAAAEAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAAAoAAAASAAgAEAAAABIAAAASAAAADAAAAAwAAAAMAAAADAAAA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CrIKzgsICygLSgtsC3gLmgu6C8wL+gwkDFwMkgykDNoM7A0wDVANkg2iDbAOAg4QDjAOUA54DqgOug7SDu4O7g8EDywPbA+qD+oQNBBeEJgQwBDeEQoRQBFaEYIRoBHAEeYSDBIgEkwSbhKUEroS3BL0Ex4TUBNqE5gTtBPoE/4UIhROFHIUmBS8FNwVBBUsFVQVhhWuFdAV+BYgFiwWQBZiFnQWoBbCFu4XIBdQF2YXlhfAF+QYABgmGEwYcBikGM4Y6BkKGSwZThl8GaQZyhnsGhIaNhpeGoQarhrUGvobIBtKG2wbjhuwG9gb/hwqHFIceByYHLoc5B0IHS4dWh2GHaQdzh3wHhQePh5eHoQesB7MHuIfCh8wH0Ifah+MH7Af2B/0IBAgMiBUIIIgriDMIOohDCEqIUQhXiF+IZ4hxCHeIgYiICI8Il4iiiKqItAi7CMMIzAjZCOMI74j4CQEJCYkTCR0JJYkwiTuJQYlLiVWJWYljiW6JeYmFCYgJiwmOCZKJlYmdCaYJqgmzibmJw4nJidOJ2QnjCe0J9Yn+CgUKDQoRihiKIgomii+KOopJClIKXQpoinQKgQqOipeKpAqpirKKtwrAisuK0YrbCueK74r1Cv0LCAsPixYLHgsoizcLQAtNC1aLYQtsC3aLfAuCi4yLlgugC6eLrwu4C7wLxIvKi9wL6IvxC/sMAQwJjA+MF4wcDCMMLIwxDDkMRQxTjFmMYAxmDG0MdQx+DIUMkAyajKKMqwy0jL0MwQzJjNGM3gzqjPMM/I0CjQsNEQ0ZDR2NJo0wDTSNPI1GDVSNWo1hDWcNbg11jX4NhQ2PjZoNog2sjbWNug3CDcuN1Q3eDecN8A34jgMODY4TjhmOLI46DkUOT45Wjl2OZo5vjnqOhY6MDpOOmQ6jjqwOtQ69jsSOzg7WDt8O5o7uDveO/Q8EDw8PGA8ejyKPKw84Dz6PRo9UD1sPYo9pj3YPfQ+Hj44PmY+hD6yPtA+6j8EPzY/UD+CP5Q/wD/kQARAMkBEQFZAaEB8QI5ApkC2QNhA+kEcQURBXkGCQahBwEHiQhBCMkJQQmBCiEK+Qt5C/EMuQ0hDckOMQ6ZDwEPoRAZEKERMRHREkkSoRMRE5ET6RRxFLEVSRXxFnEXORe5GEkYkRlBGXkZwRoZGsEbIRuxG/kcURyBHMkdIR2hHdEeER55HvEfSR/pIBkgcSDxIYkh6SJpIvkjmSQhJHEk+SVhJbEmASZRJpknGSehKDEouSkRKbkqASppKwkriSvJLEEs6S2BLfEuuS8xL6EwKTCRMQkxqTJJMrkzITOJNCE0iTUZNak2MTbZN0k4MTixORE5mToZOpE7UTwBPKE9KT3JPnE/WT/xQLlBcUIhQrlDWUSBRSlFyUaRR1FH+UjhSWFKKUrpS/FMgU1ZTfFOyU9xUDFQwVHJUrlTOVPhVMFV2VaxV1FYKVkJWelamVsxW+FciVzpXVleAV7hX2FfyWBZYRlhwWJJYuljiWRBZLllQWW5Zllm6WeJaFlo2WlZailq2WuRbBlsiWz5bYFucW+ZcClwoXE5chlyeXMJc2lz+XQpdIl1gXYpdrl3GXeZeDl4wXlxeel6GXpheul7cXvRfFl9CX2JfiF+0X9ZgAGAkYDZgTmBuYKJg7GEYYWJhjGHEYe5iEmJWYoxisGK8YvJjFmNEY1JjZGN8Y55j2GQEZCZkRmSEZJpkxGTwZQ5lMmVQZXZlkGWoZbpl1GX8Zh5mPmZaZnxmjmaoZsxm7mcQZzJnXmeEZ6Zn0GgGaDBoVGiGaLZoxGjSaOBo7mkAaRJpJGlEaWRphGmcab5pzGnkahpqWGpqaohqsmrEauJrDGsua05ruGvYbABsXmyUbMps5m0AbSJtNG1ybZZtzG3sbf5uHG46bl5uem6qbtBu5G7ybwZvHm80b0pvam+Ab6hv2G/2cBRwOHBUcIRwqnC+cMxw4HD4cQ5xNnFkcZRxsnHgcgByMHJocpBywHL4cyRzRnOEc6xz2HQMdDp0anSQdM505nUQdT51hHWodc51/nYudnh2ona4dtx3AHc+d3x3ungAeEx4kHjceSx5anm0efp6THqceuZ7Entoe4R7oHu6e9R7/HwifFB8cnyifMZ89n0cfU59Zn2OfeR+DH5Efm5+qH7Oftx++n8IfyZ/Vn9+f65/5H/4gB6ARIBegHiAsIDKgOKBHIE8gV6BeIGigcqB8oIWgjqCcoKogsiC6IL6gwyDIIM2g2CDioOyg8yD7oREhHSEzoT2hSqFRIVehXyFnoXAheaGDIYshkKGVoZshoCGlIaihriG8ocyhz6HTIdah2yHfIeOh6CHtIfIh9yH8IgKiB6INIhKiGCIfIiSiKiIwojYiO6JCokgiTaJUolsiYiJqonEieCKBIoeijaKVopyioqKrIrQivSLJIsyi0CLTotci2qLzoySjOqM+I0OjSaNTI1kjYqNoo3Gjd6OBI4ijlaOdo68jtKO5o8Cj16Pko/GkA6QWJB6kLyQ7JE0kWaRgJGikcSR7pIOkjaSXpKOkrSS2pMQkziTWJN4k5iTzpQElCCUVJRylJCUvpTQlOiVCJUqlUKVXpWKlZ6VuJXYlf6WKpZcloqWpJbol1CXhpeyl96YEJhSmISYwpjymSqZdpmamcKaKJpWmnqanJqwmsaa6JsQm0ibdJugm8ab8pwUnDCcXpx4nJqcvJzmnPydHp0+nWKdeJ2Wnbqd4J4AniKePJ5annyekp68nuCfDp8mnzyfVJ90n46frJ/Sn/SgGqA6oG6gjqCmoMag4KD+oSihUKF6oYyhpKGwodyh9KISojCiVqKEorKixqLqoxyjSqN0o5ajwqPSo+SkHKREpHCkmqTIpOilDqVApWSldqWQpbal1KXopgimLKZKplymeqagprim8gAAAAIAAAAAAIADgAADAAcAABEzESMVMxUjgICAgAOA/YCAgAAAAAIAAAKAAYADgAADAAcAABEzESMBMxEjgIABAICAA4D/AAEA/wAAAAACAAAAAAKAA4AAGwAfAAATMxEzETMRMxUjFTMVIxEjESMRIxEjNTM1IzUzFxUzNYCAgICAgICAgICAgICAgICAA4D/AAEA/wCAgID/AAEA/wABAICAgICAgAAAAAUAAAAAAoADgAAHAAsADwATABsAAAEzFSEVITUzBTMVIzMhFSkBMxUjKQEVIxUjNSEBAIABAP4AgP8AgICAAYD+gAGAgID+AAIAgID/AAOAgICAgICAgICAgAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABEzESMBMxUrATMRKwEzFSsBMxEjJTMRIyUzFSOAgAIAgICAgICAgICAgIABgICA/gCAgAOA/wABAID/AID/AID/AICAAAAACAAAAAACgAOAAAMABwALABcAGwAfACMAJwAAATMVKwEzFSMlMxUrATMRMxEjNSM1IzUzITMVIyEzESMzIRUhJTMVIwEAgICAgIABAICAgICAgICAgAEAgID+AICAgAEA/wABgICAA4CAgICA/wD/AICAgID/AICAgAAAAAEAAAKAAIADgAADAAARMxEjgIADgP8AAAUAAAAAAYADgAADAAcACwAPABMAAAEzFSsBMxUrATMRIzsBFSM7ARUjAQCAgICAgICAgICAgICAgAOAgID+gICAAAAABQAAAAABgAOAAAMABwALAA8AEwAAETMVIzsBFSM7ARErATMVKwEzFSOAgICAgICAgICAgICAgAOAgID+gICAAAUAAAIAAYADgAADAAcACwAPABMAABEzFSMlMxUrATMVKwEzFSMlMxUjgIABAICAgICAgICAAQCAgAOAgICAgICAgAAAAQAAAIACgAMAAAsAAAEzESEVIREjESE1IQEAgAEA/wCA/wABAAMA/wCA/wABAIAAAQAA/4AAgACAAAMAADUzESOAgID/AAAAAQAAAYACgAIAAAMAABEhFSECgP2AAgCAAAAAAAEAAAAAAIAAgAADAAA1MxUjgICAgAAAAAUAAAAAAoADgAADAAcACwAPABMAAAEzFSsBMxErATMVKwEzESsBMxUjAgCAgICAgICAgICAgICAgAOAgP8AgP8AgAAABQAAAAACgAOAAAMACwATABcAGwAAEyEVISMzETMVIxUjATMRIxEjNTMFMxUjAyEVIYABgP6AgICAgIACAICAgID/AICAgAGA/oADgID+gICAAoD9gAGAgICA/wCAAAAAAQAAAAACgAOAAAsAAAEzESEVITUhESM1MwEAgAEA/YABAICAA4D9AICAAgCAAAAABgAAAAACgAOAAAMABwALAA8AEwAbAAATIRUhIzMVIyUzESMpARUhIzMVKwEzFSE1MxEhgAGA/oCAgIACAICA/wABAP8AgICAgIABgID9gAOAgICA/wCAgICA/wAAAAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMRIykBFSkBMxEjJTMVIzMhFSGAAYD+gICAgAIAgID/AAEA/wABAICA/gCAgIABgP6AA4CAgID/AID/AICAgAAAAAMAAAAAAoADgAALAA8AEwAAASERIxEhETMVIRErATMVKwEzFSMBgAEAgP4AgAGAgICAgICAgAOA/IABAAEAgAGAgIAABAAAAAACgAOAAAcACwAPABMAABEhFSEVIRUpATMRIyUzFSMzIRUhAoD+AAGA/gACAICA/gCAgIABgP6AA4CAgID+gICAgAAABQAAAAACgAOAAAMABwAPABMAFwAAASEVISMzFSsBMxUhFSERIwEzESMpARUhAQABAP8AgICAgIABgP6AgAIAgID+gAGA/oADgICAgID/AAEA/wCAAAAAAAMAAAAAAoADgAAHAAsADwAAESERIxEhFSMFMxUrATMRIwKAgP6AgAGAgICAgIADgP6AAQCAgID+gAAAAAcAAAAAAoADgAADAAcACwAPABMAFwAbAAATIRUhIzMRIwEzESMpARUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AgICAAgCAgP6AAYD+gAOAgP8AAQD/AID/AAEA/wCAAAAABQAAAAACgAOAAAMABwAPABMAFwAAEyEVISMzESMBMxEjNSE1IQMzFSMpARUhgAGA/oCAgIACAICA/oABgICAgP8AAQD/AAOAgP8AAQD+AICA/wCAgAAAAAIAAAAAAIACgAADAAcAABEzFSMRMxUjgICAgAKAgP6AgAAAAAIAAP+AAIACgAADAAcAABEzFSMRMxEjgICAgAKAgP6A/wAAAAcAAAAAAgADgAADAAcACwAPABMAFwAbAAABMxUrATMVKwEzFSsBMxUjOwEVIzsBFSM7ARUjAYCAgICAgICAgICAgICAgICAgICAgAOAgICAgICAgAAAAAACAAAAgAKAAoAAAwAHAAARIRUhESEVIQKA/YACgP2AAoCA/wCAAAAABwAAAAACAAOAAAMABwALAA8AEwAXABsAABEzFSM7ARUjOwEVIzsBFSsBMxUrATMVKwEzFSOAgICAgICAgICAgICAgICAgICAgAOAgICAgICAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMVIyUzESsBMxUrATMVIxUzFSOAAYD+gICAgAIAgICAgICAgICAgAOAgICA/wCAgICAAAAEAAD/gAMAAwAAAwAHABEAFQAAEyEVISMzESMBMxEhESEVIxUhASEVIYACAP4AgICAAoCA/gABAIABAP4AAgD+AAMAgP2AAoD+AAGAgID/AIAAAAACAAAAAAKAA4AAAwAPAAATIRUhIzMVITUzESMRIREjgAGA/oCAgAGAgID+gIADgICAgP0AAgD+AAAAAAADAAAAAAKAA4AACwAPABMAABEhFSEVIRUhESEVIQEzFSMVMxEjAgD+gAGA/oABgP4AAgCAgICAA4CAgID+gIADAICA/oAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAATIRUhIzMRIwEzFSMRMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AA4CA/YACgID+gICAAAAAAgAAAAACgAOAAAcACwAAESEVIREhFSEBMxEjAgD+gAGA/gACAICAA4CA/YCAAwD9gAAAAAEAAAAAAoADgAALAAARIRUhFSEVIREhFSECgP4AAQD/AAIA/YADgICAgP6AgAAAAAEAAAAAAoADgAAJAAARIRUhFSEVIREjAoD+AAEA/wCAA4CAgID+AAAEAAAAAAKAA4AAAwAHAA0AEQAAEyEVISMzESMBIREjESMBIRUhgAIA/gCAgIABgAEAgID/AAGA/oADgID9gAIA/gABgP6AgAABAAAAAAKAA4AACwAAETMRIREzESMRIREjgAGAgID+gIADgP8AAQD8gAIA/gAAAAABAAAAAAGAA4AACwAAESEVIxEzFSE1MxEjAYCAgP6AgIADgID9gICAAoAAAAMAAAAAAoADgAADAAcACwAAATMRIyUzFSMzIRUhAgCAgP4AgICAAYD+gAOA/QCAgIAAAAAFAAAAAAKAA4AABwALAA8AEwAXAAARMxEhFSERIwEzFSsBMxUjFTMVIzsBESOAAQD/AIACAICAgICAgICAgIADgP8AgP4AA4CAgICA/oAAAAEAAAAAAoADgAAFAAARMxEhFSGAAgD9gAOA/QCAAAAAAwAAAAACgAOAAAcADwATAAARMxUzFSMRIwEzESMRIzUzBTMVI4CAgIACAICAgID/AICAA4CAgP2AA4D8gAKAgICAAAADAAAAAAKAA4AABwAPABMAABEzFTMVIxEjATMRIxEjNTMlMxUjgICAgAIAgICAgP8AgIADgICA/YADgPyAAYCAgIAAAAQAAAAAAoADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AA4CA/YACgP2AgAACAAAAAAKAA4AACQANAAARIRUhFSEVIREjATMVIwIA/oABgP6AgAIAgIADgICAgP4AAwCAAAAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAEyEVISMzESMBMxErATMVIykBFSElMxUjgAGA/oCAgIACAICAgICA/wABAP8AAYCAgAOAgP2AAoD+AICAgIAAAAADAAAAAAKAA4AACQANABEAABEhFSEVIRUhESMBMxUjFTMRIwIA/oABgP6AgAIAgICAgAOAgICA/gADAICA/gAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMVIzMhFSkBMxEjJTMVIzMhFSGAAgD+AICAgIABgP6AAYCAgP4AgICAAYD+gAOAgICA/oCAgIAAAQAAAAACgAOAAAcAABEhFSERIxEhAoD/AID/AAOAgP0AAwAAAwAAAAACgAOAAAMABwALAAARMxEjATMRIykBFSGAgAIAgID+gAGA/oADgP0AAwD9AIAAAAUAAAAAAoADgAADAAcACwAPABMAABEzESMBMxEjITMRIwEzESsBMxUjgIACAICA/oCAgAEAgICAgIADgP4AAgD+AP8AAQD/AIAAAAADAAAAAAKAA4AABwAPABMAABEzETMVIxUjATMRIzUjNTMlMxUjgICAgAIAgICAgP8AgIADgP2AgIADgPyAgICAgAAAAAkAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAAETMVIyUzFSMhMxUjJTMVKwEzFSsBMxUjJTMVIyEzESMBMxEjgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIADgICAgICAgICAgID+gAGA/oAABQAAAAACgAOAAAMABwALAA8AEwAAETMVIyUzFSMhMxUjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAOAgICAgICA/YAAAAAABQAAAAACgAOAAAUACQANABEAFwAAESERIzUhBTMVKwEzFSsBMxUrATMVIRUhAoCA/gABgICAgICAgICAgIACAP2AA4D/AICAgICAgIAAAAABAAAAAAGAA4AABwAAESEVIREhFSEBgP8AAQD+gAOAgP2AgAAFAAAAAAKAA4AAAwAHAAsADwATAAARMxUjOwERIzsBFSM7AREjOwEVI4CAgICAgICAgICAgICAA4CA/wCA/wCAAAAAAAEAAAAAAYADgAAHAAARIREhNSERIQGA/oABAP8AA4D8gIACgAAAAAAFAAACAAKAA4AAAwAHAAsADwATAAABMxUrATMVIyUzFSMhMxUjJTMVIwEAgICAgIABAICA/oCAgAIAgIADgICAgICAgIAAAAABAAD/gAKAAAAAAwAAMSEVIQKA/YCAAAACAAACgAEAA4AAAwAHAAARMxUjOwEVI4CAgICAA4CAgAAAAAADAAAAAAKAAoAAAwANABEAABMhFSkBMxEhNSE1ITUhBTMVI4ABgP6AAYCA/gABgP6AAYD+AICAAoCA/gCAgICAgAAAAAMAAAAAAoADgAAJAA0AEQAAETMRMxUjESEVIQEhFSkBMxEjgICAAYD+AAEAAQD/AAEAgIADgP6AgP8AgAKAgP6AAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzESMBMxUjFTMVIykBFSGAAYD+gICAgAIAgICAgP6AAYD+gAKAgP6AAYCAgICAAAAAAAMAAAAAAoADgAAJAA0AEQAAATMRITUhESM1MyUhFSEjMxEjAgCA/gABgICA/oABAP8AgICAA4D8gIABAICAgP6AAAAAAwAAAAACgAKAAAMADQARAAATIRUhIzMVITUzESEVIzMhFSGAAYD+gICAAYCA/gCAgAIA/gACgICAgP8AgIAAAAIAAAAAAgADgAADAA8AAAEhFSEjMxUhFSERIxEjNTMBAAEA/wCAgAEA/wCAgIADgICAgP4AAgCAAAAAAAMAAP+AAoACgAAJAA0AEQAAEyERIzUhNSERISMzESMRIRUhgAIAgP6AAYD+gICAgAIA/gACgP2AgIABAP8A/wCAAAAAAwAAAAACgAOAAAcACwAPAAARMxEzFSMRIwEhFSkBMxEjgICAgAEAAQD/AAEAgIADgP6AgP6AAoCA/gAAAgAAAAAAgAOAAAMABwAAETMVIxUzESOAgICAA4CAgP2AAAAABAAA/4ACgAOAAAMABwALAA8AAAEzFSMVMxEjATMRIzMhFSECAICAgID+AICAgAGA/oADgICA/YABAP8AgAAAAAUAAAAAAgADgAAHAAsADwATABcAABEzETMVIxEjATMVKwEzFSMVMxUjOwEVI4CAgIABgICAgICAgICAgIADgP4AgP8AAoCAgICAgAACAAAAAAEAA4AAAwAHAAARMxEjOwEVI4CAgICAA4D9AIAAAAAEAAAAAAKAAoAABQAJAA0AEQAAESEVIxEjATMVKwEzESMBMxEjAQCAgAGAgICAgIABAICAAoCA/gACgID/AAEA/gAAAAIAAAAAAoACgAAFAAkAABEhFSERIwEzESMCAP6AgAIAgIACgID+AAIA/gAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAMAAP+AAoACgAALAA8AEwAAETMVMxUjFSEVIREjASEVKQEzESOAgIABgP6AgAEAAQD/AAEAgIACgICAgID/AAMAgP8AAAAAAAMAAP+AAoACgAADAA8AEwAAEyEVISUzESMRITUhNSM1MyEzESOAAQD/AAGAgID+gAGAgID+AICAAoCAgP0AAQCAgID/AAAAAAMAAAAAAoACgAAHAAsADwAAETMVMxUjESMBIRUpATMVI4CAgIABAAEA/wABAICAAoCAgP6AAoCAgAAAAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxUjMyEVKQEzFSMpARUhgAIA/gCAgICAAYD+gAGAgID+AAIA/gACgICAgICAAAIAAAAAAYADgAALAA8AABMzETMVIxEjESM1MxMzFSOAgICAgICAgICAA4D/AID+gAGAgP4AgAAAAgAAAAACgAKAAAMACQAAETMRIwEzESE1IYCAAgCA/gABgAKA/gACAP2AgAAFAAAAAAKAAoAAAwAHAAsADwATAAARMxEjATMRIyEzFSMlMxUrATMVI4CAAgCAgP6AgIABAICAgICAAoD+gAGA/oCAgICAAAACAAAAAAKAAoAAAwANAAARMxEjATMRITUzETMRM4CAAgCA/gCAgIACgP4AAgD9gIABAP8AAAAAAAkAAAAAAoACgAADAAcACwAPABMAFwAbAB8AIwAAETMVIyUzFSMhMxUjJTMVKwEzFSsBMxUjJTMVIyEzFSMlMxUjgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIACgICAgICAgICAgICAgIAAAAAAAwAA/4ACgAKAAAMACwAPAAARMxEjATMRIzUhNSEBIRUhgIACAICA/oABgP4AAgD+AAKA/oABgP2AgID/AIAAAAMAAAAAAoACgAAHAAsAEwAAESEVIxUjNSEFMxUrATMVIRUhNTMCgICA/oABAICAgIABgP2AgAKAgICAgICAgIAAAAAABQAAAAABgAOAAAMABwALAA8AEwAAATMVKwEzESsBMxUjOwERIzsBFSMBAICAgICAgICAgICAgICAA4CA/wCA/wCAAAABAAAAAACAA4AAAwAAETMRI4CAA4D8gAAFAAAAAAGAA4AAAwAHAAsADwATAAARMxUjOwERIzsBFSsBMxErATMVI4CAgICAgICAgICAgICAA4CA/wCA/wCAAAAAAAQAAAKAAwADgAADAAcACwAPAAATIRUhJTMVIyEzFSMlIRUhgAEA/wACAICA/YCAgAGAAQD/AAOAgICAgICAAAACAAD/gACAAwAAAwAHAAARMxUjFTMRI4CAgIADAICA/YAAAAAFAAD/gAKAAwAABwALAA8AEwAbAAABMxUzFSE1MwUzESMBMxUjFTMVIykBFSMVIzUjAQCAgP6AgP8AgIACAICAgID+gAGAgICAAwCAgICA/oABgICAgICAgAAAAAMAAAAAAoADgAADABMAFwAAASEVISMzESEVIREhFSE1MxEjNTMBMxUjAQABAP8AgIABAP8AAYD9gICAgAGAgIADgID/AID/AICAAQCAAQCAAAAAAAgAAAAAA4ACgAADAAcACwAPABMAFwAbAB8AABEzFSMlIRUhJTMVIyEzESMBMxEjITMVIyUhFSElMxUjgIABAAGA/oACAICA/YCAgAIAgID9gICAAQABgP6AAgCAgAKAgICAgID+gAGA/oCAgICAgAAFAAAAAAKAA4AAAwAHAAsADwAjAAARMxUjJTMVIyEzFSMlMxUrATMVIRUhFSEVIRUjNSE1ITUhNSGAgAIAgID+gICAAQCAgICAAQD/AAEA/wCA/wABAP8AAQADgICAgICAgICAgICAgICAgAACAAAAAACAA4AAAwAHAAARMxEjFTMRI4CAgIADgP6AgP6AAAAIAAAAAAKAA4AAAwAHAAsADwATABcAGwAfAAATIRUhIzMVIzMhFSEjMxUjJTMVIykBFSkBMxUjKQEVIYACAP4AgICAgAGA/oCAgIACAICA/oABgP6AAYCAgP4AAgD+AAOAgICAgICAgICAAAACAAADAAGAA4AAAwAHAAARMxUjJTMVI4CAAQCAgAOAgICAAAAJAAAAAAOAA4AAAwAHAAsADwAXABsAHwAjACcAAAEhFSEjMxUjJTMVIyEzESMBIRUhFSEVIQEzESMhMxUjJTMVIykBFSEBAAGA/oCAgIACAICA/YCAgAEAAYD/AAEA/oACAICA/YCAgAIAgID+gAGA/oADgICAgID+gAGAgICAAYD+gICAgIAAAwAAAIACAAOAAAMACwAPAAATIRUpATMRITUjNSEBIRUhgAEA/wABAID+gIABgP6AAgD+AAOAgP6AgID+gIAAAAoAAACAAwADAAADAAcACwAPABMAFwAbAB8AIwAnAAABMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjAQCAgAGAgID+AICAAYCAgP4AgIABgICA/wCAgAGAgID/AICAAYCAgAMAgICAgICAgICAgICAgICAAAAAAAEAAACAAoACAAAFAAARIREjESECgID+AAIA/oABAAAAAQAAAQABgAGAAAMAABEhFSEBgP6AAYCAAAAAAAsAAAAAA4ADgAAHAAsADwATABsAHwAjACcAKwAvADMAAAEhFSMVIzUrATMVIyUzFSMhMxEjATMVMxUjFSMBMxUjJTMRIyUzFSMhMxUjJTMVIykBFSEBAAGAgICAgICAAgCAgP2AgIABAICAgIABAICAAQCAgP8AgID+gICAAgCAgP6AAYD+gAOAgICAgICA/oABgICAgAGAgID+gICAgICAgAAAAQAAAwACgAOAAAMAABEhFSECgP2AA4CAAAAAAAQAAAGAAgADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAEA/wCAgIABgICA/wABAP8AA4CA/wABAP8AgAACAAAAAAKAA4AACwAPAAABMxEhFSERIxEhNSEBIRUhAQCAAQD/AID/AAEA/wACgP2AA4D/AID/AAEAgP4AgAAABQAAAQACAAOAAAMABwALAA8AFwAAEyEVISMzFSMlMxUrATMVKwEzFSEVITUzgAEA/wCAgIABgICAgICAgIABAP4AgAOAgICAgICAgIAAAAAHAAABAAIAA4AAAwAHAAsADwATABcAGwAAEyEVISMzFSMlMxUrATMVIyEzFSMlMxUjKQEVIYABAP8AgICAAYCAgICAgP8AgIABgICA/wABAP8AA4CAgICAgICAgIAAAAACAAACgAEAA4AAAwAHAAATMxUrATMVI4CAgICAgAOAgIAAAAACAAD/gAKAAoAABwALAAARMxEhFSEVIwEzESOAAYD+gIACAICAAoD+AICAAwD+AAABAAAAAAMAA4AADwAAEyEVIxEjESMRIxEjNSM1M4ACgICAgICAgIADgID9AAMA/QACAICAAAAAAAEAAAEAAYADgAALAAATMxEzFSE1MxEjNTOAgID+gICAgAOA/gCAgAEAgAAABQAAAIACAAOAAAMABwALAA8AEwAAEyEVISMzESMBMxEjKQEVIQchFSGAAQD/AICAgAGAgID/AAEA/wCAAgD+AAOAgP8AAQD/AICAgAAAAAAKAAAAgAMAAwAAAwAHAAsADwATABcAGwAfACMAJwAAETMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVI4CAAYCAgP8AgIABgICA/wCAgAGAgID+AICAAYCAgP4AgIABgICAAwCAgICAgICAgICAgICAgIAAAAcAAAAAA4ADgAAHAAsADwATAB8AIwAnAAATMxEjESM1MyUzFSsBMxErATMVIyUhESM1IREzFTM1IyEzESsBMxUjgICAgIACAICAgICAgICAAQABAID/AICAgP6AgICAgIADgP4AAQCAgID/AICA/gCAAQCAgP8AgAAAAAAIAAAAAAOAA4AABwALAA8AEwAZAB0AIwAnAAATMxEjESM1MyUzFSsBMxErATMVIyUhESM1IyEzESMlMxUzFSElMxUjgICAgIACAICAgICAgICAAQABAICA/oCAgAGAgID/AP4AgIADgP4AAQCAgID/AICA/wCA/wCAgICAgAAAAAkAAAAAA4ADgAAHAAsADwATABcAGwAnACsALwAAESEVIxUjNSMlMxUrATMRIyUzFSMpARUhJTMVIyUhESM1IREzFTM1IyEzESsBMxUjAYCAgIACgICAgICA/wCAgP8AAQD/AAGAgIABAAEAgP8AgICA/oCAgICAgAOAgICAgID/AICAgICAgP4AgAEAgID/AIAAAAAGAAD/gAKAAwAAAwAHAAsADwATABcAAAEzFSMVMxUrATMVKwEzESMlMxUjKQEVIQEAgICAgICAgICAgAIAgID+gAGA/oADAICAgID/AICAgAAAAAAJAAAAgAKAAwAAAwAHAAsADwATABcAGwAfACMAABEzFSMlMxUjITMVIyUzFSsBMxUrATMVIyUzFSMhMxUjJTMVI4CAAgCAgP6AgIABAICAgICAgICAAQCAgP6AgIACAICAAwCAgICAgICAgICAgICAAAAAAAMAAAAAAoADgAAJABMAFwAAEyEVMxEjESMRISMzETMRIRUhNSMBMxUjgAGAgICA/wCAgIABAP6AgAEAgIADgID9gAGAAQD+gP8AgIABgIAAAgAAAAACgAOAAAsADwAAETMRIRUhFSEVIREjATMVI4ABgP6AAYD+gIACAICAA4D/AICAgP8AAgCAAAAABgAA/4ACgAOAAAMABwALAA8AEwAXAAATIRUhIzMRIwEzFSMpARUpATMRIykBFSGAAYD+gICAgAIAgID/AAEA/wABAICA/wABAP8AA4CA/IADgICA/oCAAAcAAAAAAoADgAADAAcACwAPABcAGwAfAAATIRUhJTMVKwEzFSsBMxUjJTMRIzUhNSEFMxUjMyEVIYABAP8AAYCAgICAgICAgAEAgID+gAGA/gCAgIABgP6AA4CAgICAgID+AICAgICAAAAAAAMAAACAAoADAAADAAcACwAAATMVIwUhFSEFMxUjAQCAgP8AAoD9gAEAgIADAICAgICAAAADAAAAAAKAAoAACQATABcAABMhFTMRIxEjNSEjMxEzFSEVITUjATMVI4ABgICAgP8AgICAAQD+gIABAICAAoCA/oABAID/AICAgAEAgAAAAAIAAP+AAoADgAALAA8AABEzESEVIREhFSERIwEzESOAAYD+gAGA/oCAAgCAgAOA/wCA/wCA/wACgP8AAAQAAAAAAoADgAADAAcACwAPAAARMxEjATMRIyUzFSMzIRUhgIACAICA/gCAgIABgP6AA4D+AAIA/QCAgIAAAAAFAAD/gAIAA4AAAwAHAAsADwATAAARMxUjJTMVIwUzESMBMxEjKQEVIYCAAYCAgP6AgIABgICA/oABgP6AA4CAgICA/gACAP2AgAAABQAAAAACAAKAAAcACwAPABMAFwAAETMRMxUjESMBMxUrATMVIxUzFSM7ARUjgICAgAGAgICAgICAgICAgAKA/wCA/wACgICAgICAAAIAAAAAAYADgAADAAcAABMhFSEjMxEjgAEA/wCAgIADgID9AAAAAAAEAAAAAAOAA4AADQARABUAGQAAEyEVIRUhFSERIRUhESsBMxUjJTMVIxUzESOAAoD+gAGA/oABgP4AgICAgAMAgICAgAOAgICA/oCAAwCAgICA/oAAAAAAAgAAAAADAAOAAA0AEQAAEzMRIRUhESEVIREjNTMBMxEjgIABgP6AAYD+AICAAgCAgAOA/oCA/wCAAoCA/oD/AAAAAAADAAAAAAMAA4AADQARABUAABMzETMVIxEhFSERIzUzBSEVKQEzESOAgICAAYD+AICAAQABAP8AAQCAgAOA/oCA/wCAAoCAgID+gAAABQAAAAACgAOAAAMABwALAA8AEwAAEyEVISMzFSMlMxEjJTMVIzMhFSGAAYD+gICAgAIAgID+AICAgAGA/oADgICAgP2AgICAAAAAAAIAAAAAAwADgAAPABMAABMhFSEVMxUjESEVIREjNTMlMxEjgAIA/oCAgAGA/gCAgAIAgIADgICAgP6AgAIAgID9gAAAAQAAAAACgAOAAAsAABEhESE1ITUhNSERIQKA/YACAP8AAQD+AAOA/ICAgIABgAAABAAAAAACgAOAAAMABwARABUAABMhFSEjMxUjJTMRIxEhESMRIQEhFSGAAYD+gICAgAIAgID+gIACAP6AAYD+gAOAgICA/YABAP8AAYD+gIAAAAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxEjATMVIwUhFSEjMxEjJTMVIykBFSGAAYD+gICAgAIAgID+gAEA/wCAgIACAICA/oABgP6AA4CA/wABAICAgP8AgICAAAIAAP+AAwADgAAJAA0AABMhFSEVIRUhESsBMxUjgAKA/gABAP8AgICAgAOAgICA/gCAAAAFAAD/gAKAA4AAAwAPABMAFwAbAAABMxUrATMRMxUjESMRIzUzATMVIwEzFSM7ARUjAYCAgICAgICAgIABAICA/gCAgICAgAOAgP8AgP6AAYCAAQCA/gCAgAAAAAIAAAAAAYADgAALAA8AABMzETMVIxEjESM1MxMzFSOAgICAgICAgICAA4D+gID/AAEAgP6AgAAABgAAAAACgAOAAAMADwATABcAGwAfAAARIRUpATMVMxUjFSM1IzUzAzMVIyUzFSMhMxEjATMRIwEA/wABAICAgICAgICAgAEAgID+gICAAgCAgAOAgICAgICA/wCAgID/AAEA/wAAAAACAAD/gAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/gACAP2AAAMAAAAAAoADgAADAA8AEwAAEyEVISMzESERMxEjESERIzMhFSGAAYD+gICAAYCAgP6AgIABgP6AA4CA/wABAP2AAQD/AIAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAESEVKQEzFSMpARUhIzMRIyUzFSMpARUhAgD+AAIAgID+gAGA/oCAgIACAICA/oABgP6AA4CAgID+gICAgAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAARIRUpATMVIykBFSEjMxUjMyEVIQIA/gACAICA/oABgP6AgICAgAIA/gACgICAgICAAAAFAAAAAAKAA4AABQAJAA0AEQAXAAARIRUhFSM7ARUjOwEVKwEzFSsBMxUhFSECgP4AgICAgICAgICAgICAAgD9gAOAgICAgICAgAAABAAA/4ACgAOAAAMABwAPABMAABMzFSsBMxUjJTMRIxEjNTMTIRUhgICAgICAAQCAgICAgAEA/wADgICAgP0AAgCA/YCAAAAABAAAAAACgAOAAAUACQANABEAABEzESEVIQEzFSM7ARErATMVI4ABAP6AAYCAgICAgICAgAOA/QCAA4CA/gCAAAUAAP+AAoADgAAFAAkADQARABUAABEhESM1IQUhFSkBMxEjJTMVIzMhFSECgID+AAEAAQD/AAEAgID+AICAgAGA/oADgP8AgICA/gCAgIAABQAA/4ACgAOAAAUACQANABEAFQAAESEVIRUjMyEVISMzESMlMxUjKQEVIQKA/gCAgAEA/wCAgIACAICA/oABgP6AA4CAgID+AICAgAAAAAAFAAD/gAKAAoAABQAJAA0AEQAVAAARIRUhFSMzIRUhIzMRIyUzFSMpARUhAoD+AICAAQD/AICAgAIAgID+gAGA/oACgICAgP8AgICAAAAAAAUAAAAAAoADgAADAAcACwAXAB8AABMhFSEjMxUjJTMVKwEzFTMVIRUjNSM1IQEzFSE1MxEhgAGA/oCAgIACAICAgICA/oCAgAGA/oCAAYCA/YADgICAgICAgICAgP8AgID/AAAEAAAAAAKAA4AACQANABEAFQAAESEVIRUhFSERIwEzESMlMxUjMyEVIQKA/oABAP6AgAIAgID+AICAgAGA/oADgICAgAEA/wD+gICAgAAAAAMAAAAAAoACgAAJAA0AEQAAESEVIRUhFSERIwEzFSMpARUhAoD+gAEA/oCAAgCAgP4AAgD+AAKAgICAAQD/AICAAAAABAAAAAACgAOAAAsADwATABcAABMzETMVIxUjNSM1MxMhFSkBMxUjKQEVIYCAgICAgICAAQD/AAEAgID+AAIA/gADgP8AgICAgP8AgICAAAAEAAD/gAKAAoAACwAPABMAFwAAETMVMxUjESEVIRUjASEVKQEzESsBMxUjgICAAQD/AIABAAEA/wABAICAgICAAoCAgP8AgIADAID/AIAAAAEAAAAAAIADgAADAAARMxEjgIADgPyAAAIAAAAAAYADgAADAAcAABEzESMBMxEjgIABAICAA4D8gAOA/IAAAAABAAAAAAKAA4AAEwAAATMRIRUhFSEVIREjESE1ITUhNSEBAIABAP8AAQD/AID/AAEA/wABAAOA/wCAgID/AAEAgICAAAIAAAAAAIADgAADAAcAABEzESMVMxUjgICAgAOA/YCAgAAAAAYAAP+AA4ADgAADAAcACwAPABMAFwAAETMRIwEzFSMVMxEjATMRIyUzFSMpARUhgIADAICAgID+gICA/wCAgAGAAQD/AAOA/QADAICA/YABAP8AgICAAAADAAAAAAKAAoAAAwANABEAABEhFSkBMxEjNSEVIxEhASEVIQIA/gACAICA/oCAAgD+gAGA/oACgID+gICAAQD/AIAAAAUAAP+AAoADgAALAA8AEwAXABsAABEzFTMVIxEzFSMRIwEhFSkBMxErATMVKwEzFSOAgICAgIABAAEA/wABAICAgICAgICAA4CAgP6AgP8ABACA/wCAgAAHAAD/gAKAA4AAAwAHAAsAEQAVABkAHQAAEyEVISMzFSMlMxUrATMRITUzFzMRKwEzFSMpARUhgAGA/oCAgIACAICAgID/AICAgICAgID+gAGA/oADgICAgID/AICA/wCAgAAABwAA/4ACgAKAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSkBMxUrATMVIykBFSGAAYD+gICAgAIAgID/AAEA/wABAICAgICA/oABgP6AAoCAgICAgICAgAAAAgAA/4ACgAOAAAUACQAAESEVIREjATMRIwIA/oCAAgCAgAOAgP0AAwD8gAAFAAD/gAOAA4AADQARABUAGQAdAAABMxEzFSMVITUhESM1MyUhFSEjMxEjITMVKwEzFSMCAICAgP4AAYCAgP6AAQD/AICAgAMAgICAgIADgP2AgICAAQCAgID+gICAAAAFAAD/gAKAA4AABQAJAA0AEQAZAAARIREjNSEFMxUrATMVKwEzFSsBMxUhESM1IQKAgP4AAYCAgICAgICAgICAAgCA/gADgP8AgICAgICA/wCAAAADAAD/gAKAAoAABwALABUAABEhFSMVIzUhBTMVKwEzFSERIzUhNTMCgICA/oABAICAgIABgID+AIACgICAgICAgP8AgIAAAAADAAD/gAGAA4AABwALAA8AABEzETMVIxUjJTMVKwEzFSOAgICAAQCAgICAgAOA/YCAgICAgAAAAAQAAP+AA4ACgAAFAA0AEQAVAAARIRUhESMBMxEzFSMVIyUzFSsBMxUjAgD+gIACAICAgIABAICAgICAAoCA/gACAP8AgICAgIAAAAADAAAAAAIAA4AADwATABcAABMzETMVIxUzFSMVIxEjNTMBMxUrATMVI4CAgICAgICAgAEAgICAgIADgP8AgICAgAGAgP6AgIAAAAAAAQAAAAACgAOAABcAABMhFTMRIxEjFSM1IxUzESMVIxEzFSE1IYABgICAgICAgICAgAEA/wADgID9AAIAgICA/wCAAwCAgAAABwAAAAACgAOAAAMACwAPABMAFwAbAB8AABMhFSEjMxEzFSMVIwEzFSsBMxUrATMVIwUzFSMpARUhgAGA/oCAgICAgAIAgICAgICAgIABAICA/oABgP6AA4CA/oCAgAKAgICAgICAAAAEAAAAAAKAAoAABwARABUAGQAAEyEVMxUhNSEjMxEzFSEVITUjATMVIyEzFSOAAYCA/wD/AICAgAEA/oCAAQCAgAEAgIACgICAgP8AgICAAQCAgAABAAAAAAMAA4AADQAAEzMRMxUjESEVIREjNTOAgICAAgD9gICAA4D+gID/AIABgIAAAAAAAgAAAAACgAOAABEAFQAAESERIzUjFTMVIxEjESM1MxEhETMVIwKAgICAgICAgP8AgIADgP8AgICA/gABAIABgP4AgAAEAAAAAAKAA4AAAwAHAAsAEQAAEyEVISMzFSMlMxEjKQEVIxEjgAGA/oCAgIACAICA/wABAICAA4CAgID+gID/AAAAAAQAAAAAAoACgAADAAcACwARAAATIRUhIzMVIyUzESMpARUjFSOAAYD+gICAgAIAgID/AAEAgIACgICAgP8AgIAAAAAAAwAAAAADAAOAABMAFwAbAAATIRUhFSEVIRUhFSEVIRUhESM1MwEzFSMVMxEjgAIA/oABgP6AAQD/AAGA/gCAgAIAgICAgAOAgICAgICAgAEAgAGAgID+gAAAAAACAAAAAAOAA4AAEwAXAAATMxEhETMRMxUjESMRIREjESM1MxMhFSGAgAGAgICAgP6AgICAgAGA/oADgP8AAQD/AID+gAGA/oABgID+AIAAAAUAAAAAAoADgAADAAcACwAPABMAAAEzFSsBMxEjATMRIyEzESMBMxEjAQCAgICAgAEAgID+gICAAgCAgAOAgP8AAQD/AP4AAgD+AAABAAAAAAKAA4AAFQAAESERIzUhFSEVIxUjNSMVMxUjFSEVIQKAgP6AAYCAgICAgAIA/YADgP8AgICAgICAgICAAAAAAAIAAAAAAwACgAARABUAAAEhFTMRIRUhFSE1IxEzFSE1IQEzFSMBAAGAgP6AAYD+AICAAQD/AP8AgIACgID/AICAgAGAgID+gIAAAAADAAAAAAMAA4AACwAPABMAAAEzETMVIxEjESM1MwEzFSMzIRUhAgCAgICAgID+AICAgAGA/oADgP8AgP6AAYCA/oCAgAAAAAAEAAD/gAMAA4AAAwAPABMAFwAAATMVIxUzFTMVIxEjESM1MwEzESMzIRUhAgCAgICAgICAgP4AgICAAYD+gAOAgICAgP6AAYCA/wD/AIAAAAQAAP+AAwADgAAJAA0AEQAVAAATIREjNSM1MxEhIzMRIzMhFSkBMxUjgAIAgICA/oCAgICAAQD/AAIAgIADgPyAgIACAP2AgIAAAAAEAAD/gAMAAoAAAwAPABMAFwAAEyEVISUzESM1ITUhNSM1MyEzESMBMxUjgAEA/wABgICA/oABgICA/gCAgAKAgIACgICA/YCAgICA/wD/AIAAAAADAAAAAAMAA4AADQARABUAABMhFSEVIRUhESMRIzUzJTMVIxUzESOAAgD+gAGA/oCAgIACAICAgIADgICAgP4AAgCAgICA/gAAAAAAAwAAAAADAAKAAA8AEwAXAAATMxUzFSMVMxUjFSM1IzUzASEVKQEzFSOAgICAgICAgIABAAEA/wABAICAAoCAgICAgICAAYCAgAAAAAIAAAAAA4ADgAATABcAABMzFSE1MxUzFSEVIzUjFSM1ITUzATMRI4CAAYCAgP8AgICA/wCAAQCAgAOAgICAgICAgICA/wD+AAAAAAACAAD/gAOAAoAAFwAbAAATMxUhNTMVMxUjESM1ITUhNSEVIzUjNTMRIRUhgIABgICAgID+gAGA/oCAgIACAP4AAoCAgICA/oCAgICAgID+AIAAAAADAAAAAAKAAoAACQANABEAABEhFSEVIRUhFSMBMxUjASEVIQIA/oABgP6AgAIAgID+gAGA/oACgICAgIABgID/AIAAAAMAAAAAAoACgAADAA0AEQAAEyEVISUzESE1IREjNTMhMxEjgAEA/wABgID+AAGAgID+AICAAoCAgP2AgAEAgP6AAAAAAwAAAAACgAKAAAkADQARAAARIRUhETMVIxUjATMRIykBFSECAP6AgICAAgCAgP8AAQD/AAKAgP8AgIACAP6AgAAAAAAEAAAAAAKAA4AAAwANABEAFQAAEyEVISMzETMVIxEhFSEBIRUpATMRI4ABgP6AgICAgAGA/gABAAEA/wABAICAA4CA/wCA/wCAAoCA/oAAAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxUjJTMRIyUzFSMzIRUhgAGA/oCAgIACAICA/gCAgIABgP6AAoCAgID+gICAgAAAAAAFAAD/gAKAAoAAAwAHAAsAFwAbAAATIRUhIzMRIwEzFSsBMxUzFSMVIzUjNTMlMxUjgAGA/oCAgIABgICAgICAgICAgAEAgIACgID+gAEAgICAgICAgIAABAAA/4ADAAOAAAkADQARABUAAAEzESE1IREjNTMlIRUhIzMRIwUzFSMCAID+AAGAgID+gAEA/wCAgIACgICAA4D8gIABAICAgP6AgIAAAAAEAAAAAAMAA4AAAwANABEAFQAAATMVKwEzESE1IREjNTMlIRUhIzMRIwKAgICAgP4AAYCAgP6AAQD/AICAgAOAgP0AgAEAgICA/oAAAwAAAAACgAKAAAMADQARAAATIRUhIzMVITUzESM1IRUhFSGAAYD+gICAAYCAgP4AAgD+AAKAgICA/oCAgIAAAAMAAAAAAoACgAADAA0AEQAAESEVKQEzESM1IRUjESEBIRUhAgD+AAIAgID+gIACAP6AAYD+gAKAgP6AgIABAP8AgAAABAAAAAADgAKAAAMADwATABcAABEhFSkCFSMRIzUhFSMRKQEzFSMFIRUhAgD+AAIAAQCAgP6AgAIAAQCAgP2AAYD+gAKAgID/AICAAQCAgIAAAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzFSMzIRUhIzMVIzMhFSGAAgD+AICAgIABAP8AgICAgAIA/gACgICAgICAAAAABQAAAAACgAKAAAMABwALAA8AEwAAESEVKQEzFSMpARUpATMVIykBFSECAP4AAgCAgP8AAQD/AAEAgID+AAIA/gACgICAgICAAAAAAAYAAAAAA4ACgAADAAcACwAPABMAFwAAESEVKQIVKQIVISUzFSMhMxUjKQEVIQIA/gACAAEA/wD/AAEA/wACAICA/wCAgP4AAgD+AAKAgICAgICAgAAAAAAGAAAAAAKAAoAAAwAHAAsADwATABcAABMhFSEjMxEjATMVIykBFSkBMxUjKQEVIYABgP6AgICAAgCAgP8AAQD/AAEAgID+gAGA/oACgID+gAGAgICAgAAAAgAA/4ACAAMAAAsADwAAATMRMxUjFSM1ITUhASEVIQEAgICAgP8AAQD/AAEA/wADAP4AgICAgP8AgAAABAAA/4ADAAOAAAMADwATABcAAAEzFSsBMxEjNSE1IREhNSEFMxEjESEVIQKAgICAgID+gAGA/oABgP4AgIACAP4AA4CA/QCAgAEAgID/AP8AgAAAAwAA/4ACgAKAAAkADQARAAATIREjNSE1IREhIzMRIxEhFSGAAgCA/oABgP6AgICAAgD+AAKA/YCAgAEA/wD/AIAAAAAEAAAAAAKAAoAAAwAHAA0AEQAAEyEVISMzESMBIREjNSMFIRUhgAIA/gCAgIABgAEAgID/AAGA/oACgID+gAEA/wCAgIAAAAAGAAAAAAKAAoAAAwAHAAsADwATABcAABEhFSElIRUhIzMVKwEzESMBMxErATMVIwEA/wABgAEA/wCAgICAgIABAICAgICAAoCAgICA/wABAP8AgAADAAD/gAKAAwAAAwALAA8AABEzESMBMxEjESM1MwUhFSGAgAIAgICAgP6AAQD/AAMA/gACAPyAAYCAgIAAAAAABAAAAAACgAOAAAMACwAPABMAABMhFSEjMxEzFSMRIwEhFSkBMxEjgAIA/gCAgICAgAEAAQD/AAEAgIADgID/AID+gAKAgP4AAAAAAAUAAP+AAoADgAADAAsADwATABcAABMhFSEjMxEzFSMRIwEhFSkBMxEjKQEVIYACAP4AgICAgIABAAEA/wABAICA/wABAP8AA4CA/wCA/oACgID+AIAAAAACAAAAAAGAA4AAAwAPAAATMxUjFTMRMxUjESMRIzUzgICAgICAgICAA4CAgP8AgP8AAQCAAAAAAAEAAAAAAYACgAALAAARIRUjETMVITUzESMBgICA/oCAgAKAgP6AgIABgAAABAAAAAACgAOAAAsADwATABcAAAEzETMVIxEjESM1MyEzFSMhMxUjATMVIwEAgICAgICAAQCAgP4AgIABgICAA4D+gID/AAGAgICA/wCAAAADAAAAAAIAA4AADwATABcAAAEzETMVIxUjNSM1MzUjNTMFMxUjATMVIwEAgICAgICAgID/AICAAYCAgAOA/gCAgICAgICAgP8AgAAAAgAA/4ABAAOAAAMABwAAETMRIzsBFSOAgICAgAOA/ICAAAAABAAA/4ACgAOAAAkADQARABUAABEzESERIzUhESMBIRUpATMRIykBFSGAAgCA/oCAAQABAP8AAQCAgP8AAQD/AAOA/wD/AID+AAGAgP8AgAAEAAAAAAKAAoAAAwAJAA0AEQAAETMRIwEzESE1MwEzESsBMxUjgIACAID/AID/AICAgICAAoD+AAIA/YCAAQD/AIAAAAQAAP+AAoACgAADAAsADwATAAARMxEjATMRIzUjNTMBMxErATMVI4CAAgCAgICA/wCAgICAgAKA/gACAP0AgIABAP8AgAAAAAUAAP+AAoACgAAFAAkADQARABUAABEhFSMRIwEzFSsBMxEjATMRKwEzFSMBAICAAYCAgICAgAEAgICAgIACgID+AAKAgP8AAQD+AIAAAAAAAwAA/4ADAAKAAAUACQANAAATIRUhESMBMxEjITMVI4ACAP6AgAIAgID9gICAAoCA/gACAP4AgAADAAD/gAMAAoAABQAJAA0AABEhFSERIwEzESM7ARUjAgD+gIACAICAgICAAoCA/gACAP4AgAAAAAMAAAAAAoACgAAHAA8AEwAAETMVMxUjESMBMxEjNSM1MyUzFSOAgICAAgCAgICA/wCAgAKAgID+gAKA/YCAgICAAAAAAwAAAAACgAKAAAMADwATAAATIRUhIzMVITUzESM1IRUjMyEVIYABgP6AgIABgICA/oCAgAGA/oACgICAgP6AgICAAAAGAAAAAAOAAoAAAwAHAAsADwATABcAABMhFSEjMxEjATMRIwEzESMpARUhJSEVIYACgP2AgICAAwCAgP6AgID/AAEA/wABgAEA/wACgID+gAGA/oABAP8AgICAAAMAAP+AAoADAAATABcAGwAAATMVMxUjETMVIxUjNSM1MxEjNTMFMxEjATMRIwEAgICAgICAgICAgP8AgIACAICAAwCAgP6AgICAgAGAgID+gAGA/oAAAAADAAAAAAKAAoAABwALAA8AAAEzESM1IzUzITMVIzMhFSECAICAgID+AICAgAEA/wACgP2AgICAgAAAAAADAAAAAAKAA4AABwALAA8AAAEzESM1IzUzITMVIzMhFSECAICAgID+AICAgAEA/wADgPyAgICAgAAAAAAEAAD/gAMAAoAABwALAA8AEwAAATMRIzUjNTMhMxUjMyEVKQEzFSMCAICAgID+AICAgAEA/wACAICAAoD9gICAgICAAAMAAP+AAoACgAAHAAsADwAAETMVMxUjESMBIRUpATMVI4CAgIABAAEA/wABAICAAoCAgP4AAwCAgAAAAAMAAAAAAoACgAADAAcACwAAEyEVISMzESMBMxUjgAGA/oCAgIACAICAAoCA/gACAIAAAAADAAD/gAKAAoAAAwAHAAsAABMhFSEjMxUjJTMRI4ABgP6AgICAAgCAgAKAgICA/YAAAAAAAwAAAAACgAKAAAkADQARAAARIRUhFSEVIREjATMVIxUzESMCAP6AAYD+gIACAICAgIACgICAgP8AAgCAgP8AAAMAAAAAAoACgAAJAA0AEQAAETMRIRUhFSEVIQEzESMVMxUjgAGA/oABgP4AAgCAgICAAoD/AICAgAKA/wCAgAAEAAD/gAMAA4AAAwAPABMAFwAAATMVKwEzETMVIxUjNSM1MyEzESMzIRUhAoCAgICAgICAgID+AICAgAGA/oADgID+AICAgID/AIAAAwAA/4ACgAKAAAMABwALAAARIRUpATMRIzMhFSEBAP8AAQCAgIABAP8AAoCA/gCAAAAAAAQAAP+AAwADgAADAA8AEwAXAAABIRUhIzMRMxUjFSM1ITUhBTMVIzMhFSECAAEA/wCAgICAgP8AAQD+gICAgAEA/wADgID+AICAgICAgIAAAgAA/4ABgAMAAAMADwAAETMVIzsBETMVIxEjESM1M4CAgICAgICAgAMAgP6AgP8AAQCAAAIAAP+AAYADgAALAA8AABMzETMVIxEjESM1MxMzFSOAgICAgICAgICAA4D/AID+AAIAgP2AgAAAAQAAAAADgAKAABUAABMzESERMxEzFSMRITUhNSEVIzUjNTOAgAGAgICA/gABgP6AgICAAoD/AAEA/wCA/wCAgICAgAAFAAAAAAKAAoAABQALAA8AEwAXAAARIREjNSMlIRUjFSMhMxEjATMRIykBFSEBAICAAYABAICA/oCAgAIAgID+gAGA/oACgP8AgICAgP8AAQD/AIAAAAAABAAAAAACgAKAAAMABwALAA8AABEzESMBMxUjOwERIykBFSGAgAGAgICAgID+gAGA/oACgP4AAgCA/oCAAAAAAAUAAAAAAoACgAADAAcACwAPABMAAAEzFSsBMxUjJTMVIyEzESMBMxEjAQCAgICAgAEAgID+gICAAgCAgAKAgICAgP6AAYD+gAAAAAACAAAAAAKAAoAACQANAAARIRUjESMRIxEjATMRIwIAgICAgAIAgIACgID/AAEA/gACAP4AAAAAAAMAAAAAAoADAAADAAsADwAAEyEVISMzFSEVIREjATMRI4ACAP4AgIABgP6AgAIAgIADAICAgP6AAYD+gAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAARMxUjJTMVIyEzFSMlMxUrATMRI4CAAgCAgP6AgIABAICAgICAAoCAgICAgID+gAAAAAAFAAD/gAKAAoAABwALAA8AHQAhAAARIRUjFSM1IRczFSMlMxUjITMVMzUzFTMVIxUjNSEBMxUjAgCAgP8AgICAAQCAgP6AgICAgICA/wACAICAAoCAgICAgICAgICAgICAAQCAAAAAAAUAAP+AAoACgAAFAAkADQARABUAABEhESM1IQUhFSkBMxEjJTMVIzMhFSECgID+AAEAAQD/AAEAgID+AICAgAGA/oACgP8AgICA/wCAgIAABgAA/4ACgAKAAAUACQANABEAFQAdAAARIREjNSEFIRUhIzMVIyUzESMlMxUjJTMVMxUhNTMCgID+AAEAAQD/AICAgAGAgID+AICAAQCAgP6AgAKA/wCAgICAgP8AgICAgICAAAQAAAAAAoADgAADAAcACwARAAATIRUhIzMVIyUzESMpARUjESOAAYD+gICAgAIAgID/AAEAgIADgICAgP6AgP8AAAAABAAAAAACgAOAAAMABwALABEAABMhFSEjMxEjATMVIwEhESMRI4ABgP6AgICAAgCAgP6AAQCAgAOAgP6AAYCA/wD+gAEAAAAABAAAAAACgAOAAAUACQANABEAAAEzETMVKQEzESMlMxUjMyEVIQEAgID/AAEAgID+AICAgAGA/oADgP8AgP6AgICAAAAFAAD/gAKAAoAAAwAHAAsADwATAAATIRUhIzMRIwEzFSMRMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AAoCA/gACAID/AICAAAAABQAAAAACgAOAAAMABwALAA8AEwAAEyEVISMzESMBMxEjATMVIwMhFSGAAYD+gICAgAIAgID/AICAgAGA/oADgID9gAKA/YABgID/AIAAAAADAAAAAAKAAoAACwAPABMAABEhFSEVIRUhFSEVIQEzFSMVMxUjAgD+gAGA/oABgP4AAgCAgICAAoCAgICAgAIAgICAAAYAAAAAAoACgAADAAcACwAPABMAFwAAEyEVISMzFSMlMxEjASEVISMzFSMzIRUhgAGA/oCAgIACAICA/oABAP8AgICAgAGA/oACgICAgP6AAQCAgIAAAAAFAAAAAAMAA4AAAwAJAA0AEwAXAAABMxUrATMRITUhBTMRIwEhESM1IwUhFSECgICAgID+AAGA/gCAgAGAAQCAgP8AAYD+gAOAgP8AgID+gAEA/wCAgIAAAQAAAAACgAKAAAsAABEzESERMxEjESERI4ABgICA/oCAAoD/AAEA/YABAP8AAAAABAAA/4ACgAOAAAMADwATABcAAAEzFSMVMxEzFSMVIzUhNSEFMxUjMyEVIQGAgICAgICA/wABAP6AgICAAQD/AAOAgID+gICAgICAgIAAAAAFAAD/gAIAAwAAAwALAA8AEwAXAAARMxUjJTMRIxEjNTMlMxUjFTMVKwEzFSOAgAGAgICAgP8AgICAgICAgAMAgID8gAIAgICAgICAAAAAAAEAAAAAAoACgAAFAAARMxEhFSGAAgD9gAKA/gCAAAAABAAA/4ADAAOAAAMADwATABcAAAEzFSsBMxEjESE1ITUjNTMlIRUhIzMRIwKAgICAgID+gAGAgID+gAEA/wCAgIADgID8gAEAgICAgID/AAAEAAAAAAKAA4AAAwAHAAsAGQAAEyEVISMzFSMlMxEjKQEVIxUhFSEVIzUhNSGAAYD+gICAgAIAgID/AAEAgAEA/wCA/wABAAOAgICA/wCAgICAgIAAAAAABAAAAAACgAOAAAMABwALABkAABMhFSEjMxEjATMVIwUhESEVIRUjNSE1ITUjgAGA/oCAgIACAICA/oABAAEA/wCA/wABAIADgID/AAEAgID/AICAgICAAAQAAAAAAoADgAAJAA0AFwAbAAARMxEzNTMVMxUhATMRIwEzETM1MxUzFSEBMxEjgICAgP4AAgCAgP4AgICAgP4AAgCAgAOA/wCAgIABgP8A/wD/AICAgAGA/wAAAQAAAoAAgAOAAAMAABEzESOAgAOA/wAAAQAA/4AAgACAAAMAADUzESOAgID/AAAAAQAAAoAAgAMAAAMAABEzFSOAgAMAgAAAAgAA/4AAgAIAAAMABwAAETMVIxEzESOAgICAAgCA/wD/AAAAAQAAAgAAgAKAAAMAABEzFSOAgAKAgAAAAgAAAAACgAOAAAMADwAAEyEVISMzFSE1MxEjESERI4ABgP6AgIABgICA/oCAA4CAgID9AAIA/gAAAAAAAwAAAAACgAOAAAsADwATAAARIRUhFSEVIREhFSEBMxUjFTMRIwIA/oABgP6AAYD+AAIAgICAgAOAgICA/oCAAwCAgP6AAAAAAQAAAAACgAOAAAUAABEhFSERIwKA/gCAA4CA/QAAAAAEAAAAAAKAA4AAAwAHAAsAEwAAATMRKwEzESMBMxEjITMVITUzESEBAICAgICAAQCAgP6AgAGAgP2AA4D/AP6AAYD+gICA/wAAAAAAAQAAAAACgAOAAAsAABEhFSEVIRUhESEVIQKA/gABAP8AAgD9gAOAgICA/oCAAAAABQAAAAACgAOAAAUACQANABEAFwAAESERIzUhBTMVKwEzFSsBMxUrATMVIRUhAoCA/gABgICAgICAgICAgIACAP2AA4D/AICAgICAgIAAAAABAAAAAAKAA4AACwAAETMRIREzESMRIREjgAGAgID+gIADgP8AAQD8gAIA/gAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAATIRUhIzMRIwEzESMBMxUjAyEVIYABgP6AgICAAgCAgP8AgICAAYD+gAOAgP2AAoD9gAGAgP8AgAAAAAEAAAAAAYADgAALAAARIRUjETMVITUzESMBgICA/oCAgAOAgP2AgIACgAAABQAAAAACgAOAAAcACwAPABMAFwAAETMRIRUhESMBMxUrATMVIxUzFSM7AREjgAEA/wCAAgCAgICAgICAgICAA4D/AID+AAOAgICAgP6AAAAFAAAAAAKAA4AAAwAHAAsADwATAAABMxErATMRIwEzESMhMxEjATMRIwEAgICAgIABAICA/oCAgAIAgIADgP8A/oABgP6A/wABAP8AAAAAAAMAAAAAAoADgAAHAA8AEwAAETMVMxUjESMBMxEjESM1MwUzFSOAgICAAgCAgICA/wCAgAOAgID9gAOA/IACgICAgAAAAwAAAAACgAOAAAcADwATAAARMxUzFSMRIwEzESMRIzUzJTMVI4CAgIACAICAgID/AICAA4CAgP2AA4D8gAGAgICAAAADAAAAAAKAA4AAAwAHAAsAABEhFSETIRUhAyEVIQKA/YCAAYD+gIACgP2AA4CA/wCA/wCAAAAAAAQAAAAAAoADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AA4CA/YACgP2AgAABAAAAAAKAA4AABwAAESERIxEhESMCgID+gIADgPyAAwD9AAACAAAAAAKAA4AACQANAAARIRUhFSEVIREjATMVIwIA/oABgP6AgAIAgIADgICAgP4AAwCAAAAAAAUAAAAAAoADgAAFAAkADQARABcAABEhFSEVIzsBFSM7ARUrATMVKwEzFSEVIQKA/gCAgICAgICAgICAgIACAP2AA4CAgICAgICAAAABAAAAAAKAA4AABwAAESEVIREjESECgP8AgP8AA4CA/QADAAAFAAAAAAKAA4AAAwAHAAsADwATAAARMxUjJTMVIyEzFSMlMxUrATMRI4CAAgCAgP6AgIABAICAgICAA4CAgICAgID9gAAAAAADAAAAAAKAA4AAEwAXABsAAAEzFTMVIxEzFSMVIzUjNTMRIzUzBTMRIwEzESMBAICAgICAgICAgID/AICAAgCAgAOAgID+gICAgIABgICA/oABgP6AAAAACQAAAAACgAOAAAMABwALAA8AEwAXABsAHwAjAAARMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMlMxUjITMRIwEzESOAgAIAgID+gICAAQCAgICAgICAgAEAgID+gICAAgCAgAOAgICAgICAgICAgP6AAYD+gAADAAAAAAKAA4AAAwAPABMAABEzESMBMxEzFSMRIxEjNTMBMxEjgIABAICAgICAgAEAgIADgP8AAQD/AID+AAIAgAEA/wAAAAAFAAAAAAKAA4AAAwAHAAsAEQAXAAATIRUhIzMRIwEzESMhMxEhNTMlMxUzFSGAAYD+gICAgAIAgID+gID/AIABAICA/wADgID+AAIA/gD/AICAgIAAAAAABgAAAAACgAKAAAMABwALAA8AEwAXAAATIRUhJTMVIyEzESMBMxEjKQEVISUzFSOAAQD/AAGAgID+AICAAYCAgP8AAQD/AAGAgIACgICAgP6AAYD+gICAgAAAAAAGAAD/gAKAA4AAAwALAA8AEwAXABsAABMhFSEjMxEhFSEVIwEzFSsBMxUjOwEVIzsBESOAAQD/AICAAYD+gIABgICAgICAgICAgICAA4CA/YCAgAOAgICA/wAAAAgAAP+AAoACgAADAAcACwAPABMAFwAbAB8AABEzFSMlMxUjITMVIyUzFSsBMxUrATMRIwEzESsBMxUjgIACAICA/oCAgAEAgICAgICAgIABAICAgICAAoCAgICAgICA/wABAP8AgAAACAAAAAACgAOAAAMABwALAA8AEwAXABsAHwAAASEVISMzFSM7ARUrATMVIyUzFSMhMxEjATMRIykBFSEBAAEA/wCAgICAgICAgIABAICA/oCAgAIAgID+gAGA/oADgICAgICAgP8AAQD/AIAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzFSMzIRUhIzMVIzMhFSGAAgD+AICAgIABAP8AgICAgAIA/gACgICAgICAAAAACAAA/4ACgAOAAAMABwALAA8AEwAXABsAHwAAESEVKQEzFSsBMxUrATMVKwEzFSMzIRUpATMVKwEzFSMCAP4AAgCAgICAgICAgICAgIABAP8AAQCAgICAgAOAgICAgICAgIAAAAIAAP+AAoACgAAFAAkAABEhFSERIwEzESMCAP6AgAIAgIACgID+AAIA/YAAAwAAAAACgAOAAAMADwATAAATIRUhIzMRIREzESMRIREjMyEVIYABgP6AgIABgICA/oCAgAGA/oADgID/AAEA/YABAP8AgAAAAgAAAAABAAKAAAMABwAAETMRIzsBFSOAgICAgAKA/gCAAAAABQAAAAACAAKAAAcACwAPABMAFwAAETMRMxUjESMBMxUrATMVIxUzFSM7ARUjgICAgAGAgICAgICAgICAgAKA/wCA/wACgICAgICAAAYAAAAAAoADgAADAAcACwAPABMAFwAAESEVKQEzESsBMxEjATMRIyEzESMBMxEjAQD/AAEAgICAgIABAICA/oCAgAIAgIADgID/AP8AAQD/AP8AAQD/AAACAAD/gAKAAoAABwALAAARMxEhFSEVIwEzESOAAYD+gIACAICAAoD+AICAAwD+AAAFAAAAAAKAAoAAAwAHAAsADwATAAARMxEjATMRIyEzESMBMxErATMVI4CAAgCAgP6AgIABAICAgICAAoD/AAEA/wD/AAEA/wCAAAAACAAA/4ACgAOAAAMABwALAA8AEwAXABsAHwAAETMVIzMhFSEjMxUjMyEVISMzFSMzIRUpATMVKwEzFSOAgIABgP6AgICAgAGA/oCAgICAAYD+gAGAgICAgIADgICAgICAgICAAAQAAAAAAoACgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAoCA/oABgP6AgAABAAAAAAKAAoAACwAAESEVIxEjESMRIxEjAoCAgICAgAKAgP4AAgD+AAIAAAMAAP+AAoACgAADAAsADwAAEyEVISMzESEVIREjATMRI4ABgP6AgIABgP6AgAIAgIACgID/AID/AAKA/wAAAAAGAAD/gAKAAoAAAwAHAAsADwATABcAABMhFSEjMxEjATMVIwUhFSkBMxUrATMVI4ABgP6AgICAAgCAgP6AAYD+gAGAgICAgIACgID/AAEAgICAgIAAAAAAAwAAAAADAAKAAAcACwAPAAATIRUjESMRISMzESMzIRUhgAKAgID+gICAgIABgP6AAoCA/oABgP6AgAAAAgAAAAACgAKAAAcACwAAESEVIREjESEBMxUjAoD/AID/AAGAgIACgID+gAGA/oCAAAAAAAQAAAAAAoACgAADAAcACwAPAAARMxEjATMVIzsBESMpARUhgIABgICAgICA/oABgP6AAoD+AAIAgP6AgAAAAAAEAAD/gAKAAoAAAwAHABMAFwAAATMVIyEzESMBMxEzFSMVIzUjNTMBMxEjAYCAgP6AgIABAICAgICAgAEAgIACgID+gAGA/oCAgICAAYD+gAAAAAAJAAD/gAKAAoAAAwAHAAsADwATABcAGwAfACMAABEzFSMlMxUjITMVIyUzFSsBMxUrATMVIyUzFSMhMxEjATMRI4CAAgCAgP6AgIABAICAgICAgICAAQCAgP6AgIACAICAAoCAgICAgICAgICA/wABAP8AAAMAAP+AAoACgAADAA8AEwAAETMRIwEzETMVIxEjESM1MwEzESOAgAEAgICAgICAAQCAgAKA/oABgP6AgP8AAQCAAYD+gAAAAAcAAAAAA4ACgAADAAcACwAPABMAFwAbAAATMxUjJTMVIyEzESMBMxEjATMRIykBFSElIRUhgICAAgCAgP2AgIADAICA/oCAgP8AAQD/AAGAAQD/AAKAgICA/oABgP6AAQD/AICAgAAABAAAAAACgAOAAAMABwALABMAABMhFSEjMxEjATMVIwEhESE1ITUhgAGA/oCAgIACAICA/oACAP2AAgD+gAOAgP6AAYCA/wD+gICAAAQAAAAAA4ADgAALAA8AEwAXAAARIRUhETMVIxEjESEFIRUpATMRKwEzFSMCgP8AgICA/wACAAEA/wABAICAgICAA4CA/wCA/oADAICA/oCAAAAAAAUAAAAAAoADgAADAAsADwATABcAABMhFSEjMxEhFSERIwEzFSMRMxUjKQEVIYABgP6AgIABAP8AgAIAgICAgP6AAYD+gAOAgP8AgP8AAoCA/oCAgAAAAAAGAAAAAAKAA4AAAwAHAAsADwATABcAABMhFSEjMxUjMyEVKQEzESMlMxUjMyEVIYACAP4AgICAgAGA/oABgICA/gCAgIABgP6AA4CAgID+gICAgAABAAAAAAGAA4AACwAAESEVIxEzFSE1MxEjAYCAgP6AgIADgID9gICAAoAAAAMAAAAAAoADgAADAAcACwAAATMRIyUzFSMzIRUhAgCAgP4AgICAAYD+gAOA/QCAgIAAAAADAAAAAAOAA4AADQARABUAABMhESEVIREhFSERIxEjATMRIyEzFSOAAYABAP8AAQD+gICAAoCAgP0AgIADgP8AgP6AgAMA/YABgP6AgAAAAAIAAAAAAwADgAARABUAABEzETMRMxEhFSERIRUhESMRIwEzESOAgIABAP8AAQD+gICAAoCAgAOA/wABAP8AgP6AgAIA/gACAP6AAAADAAAAAAMAA4AADwATABcAABMzFSEVIREzFSMRIxEjNTMBIRUpATMRI4CAAYD+gICAgICAAQABAP8AAQCAgAOAgID/AID/AAKAgP8AgP6AAAIAAAAAAoADgAADAA8AABMhFSEjMxUhNTMRIxEhESOAAYD+gICAAYCAgP6AgAOAgICA/QACAP4AAAAAAAIAAAAAAoADgAALAA8AABEhFSEVIRUhESEVIQEzESMCgP4AAYD+gAGA/gACAICAA4CAgID+gIACAP6AAAMAAAAAAoADgAALAA8AEwAAESEVIRUhFSERIRUhATMVIxUzESMCAP6AAYD+gAGA/gACAICAgIADgICAgP6AgAMAgID+gAAAAAEAAAAAAoADgAAFAAARIRUhESMCgP4AgAOAgP0AAAAAAQAA/4ADAAOAABMAAAEhETMRIzUhFSMRMxEzESERIxEjAQABgICA/gCAgIABAICAA4D9AP8AgIABAAGA/oACgP8AAAABAAAAAAKAA4AACwAAESEVIRUhFSERIRUhAoD+AAEA/wACAP2AA4CAgID+gIAAAAAJAAAAAAOAA4AAAwAPABMAFwAbAB8AIwAnACsAABEzFSMlMxEzFSMRIxEjNTMBMxUjITMVIyUzFSMFMxUjJTMVIyEzESMBMxEjgIABgICAgICAgAGAgID9gICAAgCAgP4AgIACAICA/YCAgAMAgIADgICA/wCA/gACAIABAICAgICAgICA/oABgP6AAAcAAAAAAoADgAADAAcACwAPABMAFwAbAAATIRUhIzMVIyUzFSMpARUpATMRIyUzFSMzIRUhgAGA/oCAgIACAICA/wABAP8AAQCAgP4AgICAAYD+gAOAgICAgID+gICAgAAAAAADAAAAAAKAA4AABwAPABMAABEzETMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIADgP6AgP6AA4D8gAKAgICAAAUAAAAAAoADgAAHAAsADwATABcAABEzESEVIREjATMVKwEzFSMVMxUjOwERI4ABAP8AgAIAgICAgICAgICAgAOA/wCA/gADgICAgID+gAAAAgAAAAACgAOAAAcACwAAEyERIxEhESsBMxUjgAIAgP8AgICAgAOA/IADAP2AgAAAAwAAAAACgAOAAAcADwATAAARMxUzFSMRIwEzESMRIzUzBTMVI4CAgIACAICAgID/AICAA4CAgP2AA4D8gAKAgICAAAABAAAAAAKAA4AACwAAETMRIREzESMRIREjgAGAgID+gIADgP8AAQD8gAIA/gAAAAAEAAAAAAKAA4AAAwAHAAsADwAAEyEVISMzESMBMxEjKQEVIYABgP6AgICAAgCAgP6AAYD+gAOAgP2AAoD9gIAAAQAAAAACgAOAAAcAABEhESMRIREjAoCA/oCAA4D8gAMA/QAAAgAAAAACgAOAAAkADQAAESEVIRUhFSERIwEzFSMCAP6AAYD+gIACAICAA4CAgID+AAMAgAAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAATIRUhIzMRIwEzFSMRMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AA4CA/YACgID+gICAAAAAAQAAAAACgAOAAAcAABEhFSERIxEhAoD/AID/AAOAgP0AAwAAAwAAAAACgAOAAAMACwAPAAARMxEjATMRIxEhNSEBIRUhgIACAICA/oABgP4AAgD+AAOA/oABgP0AAQCA/oCAAAMAAP+AA4ADgAATABcAGwAAATMVIRUhESEVIRUjNSE1IREhNSEFMxEjATMRIwGAgAEA/wABAP8AgP8AAQD/AAEA/oCAgAMAgIADgICA/gCAgICAAgCAgP4AAgD+AAAAAAkAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAAETMVIyUzFSMhMxUjJTMVKwEzFSsBMxUjJTMVIyEzESMBMxEjgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIADgICAgICAgICAgID+gAGA/oAAAQAA/4ADAAOAAAsAABEzESERMxEzESM1IYABgICAgP2AA4D9AAMA/QD/AIAAAAAAAgAAAAACgAOAAAMACwAAETMRIwEzESMRITUhgIACAICA/oABgAOA/oABgPyAAYCAAAAAAAEAAAAAA4ADgAALAAARMxEhETMRIREzESGAAQCAAQCA/IADgP0AAwD9AAMA/IAAAAEAAP+ABAADgAAPAAARMxEhETMRIREzETMRIzUhgAEAgAEAgICA/IADgP0AAwD9AAMA/QD/AIAAAgAAAAADAAOAAAsADwAAESERIRUhESEVIREjATMRIwEAAYD+gAGA/gCAAoCAgAOA/oCA/wCAAwD+gP8AAAAAAAMAAAAAA4ADgAAJAA0AEQAAETMRIRUhESEVIQEzESMBMxEjgAGA/oABgP4AAwCAgP8AgIADgP6AgP8AgAOA/IABgP8AAAAAAAIAAAAAAoADgAAJAA0AABEzESEVIREhFSEBMxEjgAGA/oABgP4AAgCAgAOA/oCA/wCAAYD/AAAABQAAAAACgAOAAAMABwAPABMAFwAAEyEVISMzFSMlMxEjESE1IQEzFSMzIRUhgAGA/oCAgIACAICA/wABAP4AgICAAYD+gAOAgICA/YABAID/AICAAAAAAAQAAAAAA4ADgAALAA8AEwAXAAARMxEzETMRIxEjESMBIRUpATMRIykBFSGAgICAgIABgAGA/oABgICA/oABgP6AA4D+gAEA/YABAP6AA4CA/YCAAAMAAAAAAoADgAAJAA0AEQAAEyERIxEhNSE1ISMzFSMVMxEjgAIAgP6AAYD+gICAgICAA4D8gAIAgICAgP4AAAADAAAAAAKAAoAAAwANABEAABMhFSkBMxEhNSE1ITUhBTMVI4ABgP6AAYCA/gABgP6AAYD+AICAAoCA/gCAgICAgAAAAAQAAAAAAoADgAADAAsADwATAAATIRUhIzMVIRUhESMBMxEjKQEVIYACAP4AgIABgP6AgAIAgID+gAGA/oADgICAgP6AAYD+gIAAAAADAAAAAAKAAoAACwAPABMAABEhFSEVIRUhFSEVIQEzFSMVMxUjAgD+gAGA/oABgP4AAgCAgICAAoCAgICAgAIAgICAAAEAAAAAAgACgAAFAAARIRUhESMCAP6AgAKAgP4AAAAAAQAA/4ADAAKAABMAAAEhETMRIzUhFSMRMxEzESERIxUjAQABgICA/gCAgIABAICAAoD+AP8AgIABAAEA/wABgIAAAAADAAAAAAKAAoAAAwANABEAABMhFSEjMxUhNTMRIRUjMyEVIYABgP6AgIABgID+AICAAgD+AAKAgICA/wCAgAAABQAAAAACgAKAAAMADwATABcAGwAAETMRIwEzETMVIxEjESM1MwEzESMFMxEjATMRI4CAAQCAgICAgIABAICA/gCAgAIAgIACgP8AAQD/AID/AAEAgAEA/wCA/wABAP8AAAAAAAcAAAAAAoACgAADAAcACwAPABMAFwAbAAATIRUhIzMVIyUzFSMpARUpATMVIyUzFSMpARUhgAGA/oCAgIACAICA/wABAP8A/wCAgAIAgID+gAGA/oACgICAgICAgICAgAAAAAADAAAAAAKAAoAABwAPABMAABEzETMVIxUjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIACgP6AgIACgP2AAYCAgIAAAAUAAAAAAgACgAAHAAsADwATABcAABEzETMVIxEjATMVKwEzFSMVMxUjOwEVI4CAgIABgICAgICAgICAgIACgP8AgP8AAoCAgICAgAACAAAAAAKAAoAABwALAAATIREjESERKwEzFSOAAgCA/wCAgICAAoD9gAIA/oCAAAADAAAAAAKAAoAABwAPABMAABEzFTMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIACgICA/oACgP2AAYCAgIAAAAEAAAAAAoACgAALAAARMxEhETMRIxEhESOAAYCAgP6AgAKA/wABAP2AAQD/AAAAAAQAAAAAAoACgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAoCA/oABgP6AgAABAAAAAAKAAoAABwAAESERIxEhESMCgID+gIACgP2AAgD+AAADAAD/gAKAAoAACwAPABMAABEzFTMVIxUhFSERIwEhFSkBMxEjgICAAYD+gIABAAEA/wABAICAAoCAgICA/wADAID/AAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAATIRUhIzMRIwEzFSMVMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AAoCA/oABgICAgIAAAAAAAQAAAAACgAKAAAcAABEhFSERIxEhAoD/AID/AAKAgP4AAgAAAwAA/4ACgAKAAAMACwAPAAARMxEjATMRIzUhNSEBIRUhgIACAICA/oABgP4AAgD+AAKA/oABgP2AgID/AIAAAAMAAP+AAoACgAAPABMAFwAAEyEVIxEzFSMVIzUjNTMRKwEzESMBMxEjgAGAgICAgICAgICAgAIAgIACgID+gICAgIABgP6AAYD+gAAJAAAAAAKAAoAAAwAHAAsADwATABcAGwAfACMAABEzFSMlMxUjITMVIyUzFSsBMxUrATMVIyUzFSMhMxUjJTMVI4CAAgCAgP6AgIABAICAgICAgICAAQCAgP6AgIACAICAAoCAgICAgICAgICAgICAAAAAAAEAAP+AAoACgAALAAARMxEhETMRMxEjNSGAAQCAgID+AAKA/gACAP4A/wCAAAAAAAIAAAAAAoACgAADAAsAABEzESMBMxEjESE1IYCAAgCAgP6AAYACgP8AAQD9gAEAgAAAAAABAAAAAAKAAoAACwAAETMRMxEzETMRMxEhgICAgID9gAKA/gACAP4AAgD9gAAAAAABAAD/gAMAAoAADwAAETMRMxEzETMRMxEzESM1IYCAgICAgID9gAKA/gACAP4AAgD+AP8AgAAAAAIAAAAAAwACgAALAA8AABEhESEVIRUhFSERIwEzFSMBAAGA/oABgP4AgAKAgIACgP8AgICAAgD/AIAAAAMAAAAAAwACgAAJAA0AEQAAETMRIRUhFSEVIQEzESMBMxUjgAEA/wABAP6AAoCAgP8AgIACgP8AgICAAoD9gAEAgAAAAgAAAAACgAKAAAkADQAAETMRIRUhFSEVIQEzFSOAAYD+gAGA/gACAICAAoD/AICAgAEAgAAAAAAFAAAAAAKAAoAAAwAHAA8AEwAXAAATIRUhIzMVIyUzESM1ITUhBTMVIzMhFSGAAYD+gICAgAIAgID/AAEA/gCAgIABgP6AAoCAgID+gICAgICAAAAEAAAAAAOAAoAACwAPABMAFwAAETMRMzUzESM1IxEjASEVKQEzESMpARUhgICAgICAAYABgP6AAYCAgP6AAYD+gAKA/wCA/oCA/wACgID+gIAAAAADAAAAAAKAAoAACQANABEAABMhESMRITUhNSEjMxUjFTMRI4ACAID+gAGA/oCAgICAgAKA/YABAICAgID/AAAABQAAAAACgAKAAAMACwAPABMAFwAAEyEVISMzFSEVIRUjATMVIxUzFSMpARUhgAGA/oCAgAEA/wCAAgCAgICA/oABgP6AAoCAgICAAYCAgICAAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzFSMzIRUpATMVIykBFSGAAgD+AICAgIABgP6AAYCAgP4AAgD+AAKAgICAgIAAAgAAAAAAgAOAAAMABwAAETMVIxUzESOAgICAA4CAgP2AAAAABAAA/4ACgAOAAAMABwALAA8AAAEzFSMVMxEjATMRIzMhFSECAICAgID+AICAgAGA/oADgICA/YABAP8AgAAAAAMAAAAAA4ACgAANABEAFQAAEyERIRUhFSEVIREjESMlMxUjITMVI4ABgAEA/wABAP6AgIACgICA/QCAgAKA/wCAgIACAP6AgICAAAACAAAAAAMAAoAAEQAVAAARMxEzETMRIRUhFSEVIREjESMBMxUjgICAAQD/AAEA/oCAgAKAgIACgP8AAQD/AICAgAEA/wABAIAAAAAAAgAAAAADAAOAABEAFQAAEzMVMxUjFSEVIREhFSERIzUzATMRI4CAgIABgP6AAYD+AICAAgCAgAOAgICAgP8AgAKAgP6A/wAAAgAAAAADAAMAABEAFQAAEzMVMxUjFSEVIRUhFSERIzUzATMVI4CAgIABgP6AAYD+AICAAgCAgAMAgICAgICAAgCA/oCAAAAAAwAAAAACgAOAAAMADwATAAATIRUhIzMRIREzESMRIREjMyEVIYABgP6AgIABgICA/oCAgAGA/oADgID/AAEA/YABAP8AgAAAAwAAAAACgAKAAAMADwATAAATIRUhIzMVITUzESM1IRUjMyEVIYABgP6AgIABgICA/oCAgAGA/oACgICAgP6AgICAAAAGAAAAAAMAA4AAAwAHAAsADwATABcAABEzESMBMxUrATMRIyEzESMBMxErATMVI4CAAoCAgICAgP6AgIABAICAgICAA4D+AAIAgP6A/wABAP8AgAAGAAAAAAMAAoAAAwAHAAsADwATABcAABEzESMBMxUrATMRIyEzFSMlMxUrATMVI4CAAoCAgICAgP6AgIABAICAgICAAoD+gAGAgP8AgICAgAAAAAABAAAAAAMAA4AADQAAEyEVIRUzFSMRIxEjNTOAAoD+AICAgICAA4CAgID+AAIAgAABAAAAAAKAAoAADQAAEyEVIRUzFSMRIxEjNTOAAgD+gICAgICAAoCAgID/AAEAgAAJAAD/gAQAA4AAAwAPABMAFwAbAB8AIwAnAC8AABEzFSMlMxEzFSMRIxEjNTMBMxUjITMVIyUzFSMFMxUjJTMVIyEzESMBMxEzESM1I4CAAYCAgICAgIABgICA/YCAgAIAgID+AICAAgCAgP2AgIADAICAgIADgICA/wCA/gACAIABAICAgICAgICA/oABgP8A/wCAAAAAAAUAAP+AAwACgAADAA8AEwAXAB8AABEzESMBMxEzFSMRIxEjNTMBMxEjBTMRIwEzFTMRIzUjgIABAICAgICAgAEAgID+AICAAgCAgICAAoD/AAEA/wCA/wABAIABAP8AgP8AAQCA/wCAAAAAAAUAAP+AAwADgAAHAAsADwATABsAABEzESEVIREjATMVKwEzFSMVMxUjOwERMxEjNSOAAQD/AIACAICAgICAgICAgICAgAOA/wCA/gADgICAgID/AP8AgAAFAAD/gAKAAoAABwALAA8AEwAZAAARMxEzFSMRIwEzFSsBMxUjFTMVIzMhESM1I4CAgIABgICAgICAgICAAQCAgAKA/wCA/wACgICAgID/AIAAAAABAAD/gAMAA4AADwAAETMRIREzETMRIzUjESERI4ABgICAgID+gIADgP8AAQD9AP8AgAIA/gAAAAEAAP+AAwACgAAPAAARMxEhETMRMxEjNSMRIREjgAGAgICAgP6AgAKA/wABAP4A/wCAAQD/AAAABQAAAAACgAOAAAMABwALAA8AEwAAETMVIyUzFSMhMxUjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAOAgICAgICA/YAAAAAABQAA/4ACgAKAAAMABwALAA8AEwAAETMRIwEzESMhMxUjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAKA/wABAP8AgICA/oAABQAAAAACgAOAAAMABwALAA8AGwAAETMVIyUzFSMhMxUjJTMVKwEzFTMVIxEjESM1M4CAAgCAgP6AgIABAICAgICAgICAgAOAgICAgICAgID+gAGAgAAAAAUAAP+AAoACgAADAAcACwAPABsAABEzESMBMxEjITMVIyUzFSsBMxUzFSMVIzUjNTOAgAIAgID+gICAAQCAgICAgICAgIACgP8AAQD/AICAgICAgICAAAACAAAAAAKAA4AABwALAAARMxEhFSERIwEzESOAAYD+gIACAICAA4D/AID+AAIA/gAAAAAAAwAAAAACgAOAAAcACwAPAAARMxEzFSMRIwEhFSkBMxEjgICAgAEAAQD/AAEAgIADgP6AgP6AAoCA/gAAAQAAAAABgAOAAAsAABEhFSMRMxUhNTMRIwGAgID+gICAA4CA/YCAgAKAAAAEAAAAAAKAA4AAAwAHABEAFQAAEyEVISMzFSMlMxEjESERIxEhASEVIYABgP6AgICAAgCAgP6AgAIA/oABgP6AA4CAgID9gAEA/wABgP6AgAAAAAADAAAAAAKAAoAAAwANABEAABEhFSkBMxEjNSEVIxEhASEVIQIA/gACAICA/oCAAgD+gAGA/oACgID+gICAAQD/AIAAAAMAAAAAAoADgAADAA8AEwAAEyEVISMzESERMxEjESERIzMhFSGAAYD+gICAAYCAgP6AgIABgP6AA4CA/wABAP2AAQD/AIAAAAMAAAAAAoACgAADAA8AEwAAEyEVISMzFSE1MxEjNSEVIzMhFSGAAYD+gICAAYCAgP6AgIABgP6AAoCAgID+gICAgAAAAgAAAAACgAOAAAkADQAAATMRITUhNSE1IQUzFSMCAID+AAGA/oABgP4AgIADgPyAgICAgIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAARMxEjATMRKwEzFSMpARUhJTMVI4CAAgCAgICAgP8AAQD/AAGAgIADgP0AAwD9gICAgIAAAAAAAwAAAAACgAOAAAMACwAPAAATIRUhIzMRIRUhESMBMxEjgAGA/oCAgAIA/gCAAgCAgAOAgP6AgP8AAwD/AAAAAAMAAAAAAwADgAADAAcAEwAAEyEVISMzESMBMxEzFSMRIxEhNSGAAYD+gICAgAIAgICAgP6AAYADgID+gAGA/oCA/wABAIAAAAMAAAAAAwADgAADAAcADwAAEyEVISMzESMBMxEzFSMRI4ABgP6AgICAAgCAgICAA4CA/oABgP6AgP8AAAMAAAAAAoADgAAHAAsADwAAETMRIRUhESMlMxUjKQEVIYACAP4AgAIAgID+gAGA/oADgP8AgP6AgICAAAQAAAAAAoADgAADAAcACwAVAAATIRUhIzMVIyUzESMhMxUhNTMVMxUhgAGA/oCAgIACAICA/gCAAQCAgP2AA4CAgID+AICAgIAAAAABAAAAAAKAA4AACQAAETMRIRUhESEVIYACAP4AAgD9gAOA/wCA/oCAAAAAAAMAAAAAAoADgAADAAkADQAAEyEVISMzESEVIQEzFSOAAYD+gICAAgD9gAIAgIADgID9gIADAIAABQAAAAADAAOAAAMABwAPABMAFwAAEyEVISMzESMBMxEjESE1IQUzESMzIRUhgAIA/gCAgIACgICA/wABAP6AgICAAQD/AAOAgP0AAwD9gAEAgID/AIAAAAMAAAAAAwADgAALAA8AEwAAATMRMxUjESMRITUhBTMRIzMhFSECAICAgID+gAGA/gCAgIABgP6AA4D/AID+gAGAgID+gIAAAAIAAAAAAoADgAAHAAsAABEzESEVIREjATMRI4ABgP6AgAIAgIADgP8AgP4AAgD+gAAAAAABAAAAAAIAA4AABQAAETMRIRUhgAGA/gADgP0AgAAAAAMAAAAAAwADgAAJAA0AEQAAETMRIREjESMRIwEzESMpARUhgAEAgICAAoCAgP8AAQD/AAOA/wD+AAGA/gACgP4AgAAABwAAAAACgAOAAAMABwANABEAFQAZAB0AABEzFSMlIRUpAhUjFSMlMxUjITMRIwEzESMpARUhgIABgAEA/wD/AAEAgIABAICA/oCAgAIAgID+gAGA/oADgICAgICAgID+gAGA/oCAAAACAAAAAAKAA4AAAwALAAARMxEjATMRIxEhNSGAgAIAgID+gAGAA4D+gAEA/QABgIAAAAAABAAAAAACgAOAAAMABwALAA8AABEhFSkBMxUjKQEVKQEzESMCAP4AAgCAgP4AAgD+AAIAgIADgICAgP4AAAAAAAcAAAAAAoADgAADAAcACwAPABMAFwAfAAATIRUhIzMRIwEzESMhMxUjJTMVIyEzFSMlMxUhFSE1M4ABgP6AgICAAgCAgP6AgIABAICA/oCAgAEAgAEA/gCAA4CA/wABAP6AgICAgICAgIAAAAMAAAAAAwADgAADAAcADQAAEyEVISMzESMBMxEzFSGAAYD+gICAgAIAgID/AAOAgP8AAQD9gIAAAgAAAAACgAOAAAMADwAAEyEVISMzFSEVIREhETMRIYABgP6AgIABgP6AAYCA/YADgICAgP6AAYD+AAAAAwAAAAADAAOAAAMACQANAAARMxEjASEVIxEjKQEVIYCAAgABAICA/oABgP6AA4D9AAMAgP2AgAAHAAAAAAKAA4AAAwAHAAsADwATABcAGwAAEyEVISMzFSMlMxEjKQEVKQEzESMlMxUjMyEVIYABgP6AgICAAgCAgP4AAgD+AAIAgID+AICAgAGA/oADgICAgP8AgP8AgICAAAAAAwAAAAACgAOAAAUACQANAAARIREjESMBMxUjKQEVIQEAgIACAICA/wABAP8AA4D9AAKA/gCAgAAFAAAAAAKAA4AABwALAA8AEwAXAAARIRUhFSM1IRczFSsBMxEjJTMVIykBFSECgP8AgP8AgICAgICAAgCAgP6AAYD+gAOAgICAgID+gICAgAAAAAADAAAAAAKAA4AAAwAHAAsAABMhFSEjMxEjATMRI4ABgP6AgICAAgCAgAOAgP0AAwD9AAAABgAAAAACgAOAAAMABwALAA8AFQAZAAATIRUhIzMVIyUzESsBMxUrATMRITUhFyEVIYABgP6AgICAAgCAgICAgICA/oABAIABAP8AA4CAgID/AID/AICAgAAAAAADAAAAAAKAA4AABwALAA8AABMhFSMRIxErATMRIwEzESOAAYCAgICAgIACAICAA4CA/oABgP8AAQD9AAAFAAAAAAKAA4AAAwAJAA0AEQAZAAATIRUhIzMVMxUhATMRIwEzESM7ARUzFSE1IYABgP6AgICA/wACAICA/wCAgICAgP2AAYADgICAgAEA/gABAP8AgICAAAAAAAMAAAAAAwADgAADAAcADwAAEyEVISMzESMBMxEzFSMVI4ABgP6AgICAAgCAgICAA4CA/QADAP4AgIAAAAMAAAAAAoADgAADAAcACwAAETMRIwEzESMpARUhgIACAICA/oABgP6AA4D9AAMA/QCAAAACAAAAAAKAA4AABwALAAABMxEjESE1IQEzESMCAICA/oABgP4AgIADgPyAAQCAAQD/AAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxEjATMVIwUhFSkBMxEjJTMVIzMhFSGAAYD+gICAgAIAgID+gAGA/oABgICA/gCAgIABgP6AA4CA/wABAICAgP8AgICAAAMAAAAAAoADgAADAAcACwAAEyEVISMzESMBMxUjgAGA/oCAgIACAICAA4CA/QADAIAAAAAHAAAAAAKAA4AAAwAHAAsADwATABcAGwAAEyEVISMzESMBMxEjKQEVISMzFSMlMxEjKQEVIYABgP6AgICAAgCAgP6AAYD+gICAgAIAgID+gAGA/oADgID/AAEA/wCAgID/AIAAAQAAAAACAAOAAAcAABEzESEVIREjgAGA/oCAA4D/AID+AAAAAwAAAAACgAOAABMAFwAbAAABMxUzFSMRMxUjFSM1IzUzESM1MwUzESMBMxEjAQCAgICAgICAgICA/wCAgAIAgIADgICA/oCAgICAAYCAgP6AAYD+gAAAAAMAAAAAAoADgAADAA8AEwAAEyEVISMzESEVIRUhFSEVIwEzESOAAYD+gICAAYD+gAIA/gCAAgCAgAOAgP8AgICAgAMA/wAAAAQAAAAAAoADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AA4CA/YACgP2AgAAEAAAAAAKAA4AAEQAVABkAHQAAEyERMxUjETMVITUzESM1MzUrATMVIwUzESMlMxUjgAEAgICA/oCAgICAgICAAgCAgP4AgIADgP8AgP6AgIABgICAgID+gICAAAIAAAIAAQADgAADAAcAABEzESM7ARUjgICAgIADgP8AgAAAAAIAAAIAAQADgAADAAcAABMzESsBMxUjgICAgICAA4D/AIAAAAIAAAKAAQADgAADAAcAABMzFSsBMxUjgICAgICAA4CAgAAAAAEAAAIAAYADgAAHAAABMxEhFSMRIQEAgP8AgAEAA4D/AIABAAAAAAACAAACgAEAA4AAAwAHAAARMxUjOwEVI4CAgICAA4CAgAAAAAADAAACAAGAA4AAAwAHAAsAABMzFSsBMxEjATMVI4CAgICAgAEAgIADgID/AAEAgAABAAACgAKAA4AABQAAETMVIRUhgAIA/YADgICAAAAAAAQAAAAAAoACgAAFAAkADQARAAARIRUjESMBMxUrATMRIwEzESMBAICAAYCAgICAgAEAgIACgID+AAKAgP8AAQD+AAAABAAAAAACgAKAAAMACQANABEAABEzESMBMxEhNTMBMxErATMVI4CAAgCA/wCA/wCAgICAgAKA/gACAP2AgAEA/wCAAAADAAD/gAKAAoAACwAPABMAABEzFTMVIxUhFSERIwEhFSkBMxUjgICAAgD+AIABAAEA/wABAICAAoCAgICA/wADAICAAAMAAP+AAwACgAADABMAFwAAEyEVISUzETMVIxEjESE1ITUjNTMhMxEjgAEA/wABgICAgID+gAGAgID+AICAAoCAgP6AgP8AAQCAgID/AAAAAgAA/4ADAAKAAAUADQAAESEVIREjATMRMxUjFSMCAP6AgAIAgICAgAKAgP4AAgD+gICAAAMAAAAAAoADgAAHAA8AEwAAETMRIRUhESMBMxEjNSM1MwUhFSGAAQD/AIACAICAgID+gAEA/wADgP8AgP6AAQD+gICAgIAAAAMAAP+AAwACgAADABEAFQAAEyEVISUzETMVIREhNSE1IzUzITMRI4ABAP8AAYCAgP8A/oABgICA/gCAgAKAgID9gIABAICAgP8AAAABAAD/gAIAA4AACwAAETMRIRUhESERIzUhgAGA/oABgID+gAOA/wCA/oD/AIAAAAADAAD/gAKAAoAACQANABEAABEzFTMVIxEhFSEBIRUpATMRI4CAgAIA/YABAAEA/wABAICAAoCAgP6AgAMAgP6AAAAAAAUAAP+AAoACgAAHAAsAEwAXABsAABEzFTMVIxEjASEVKQEzESM1IzUzBTMVIzsBFSOAgICAAQABAP8AAQCAgICA/wCAgICAgAKAgID+AAMAgP6AgICAgIAAAAAAAgAAAAADAAOAAA0AEQAAATMRMxUjESE1IREhNSEFMxEjAgCAgID+AAGA/oABgP4AgIADgP8AgP4AgAGAgID+gAAAAAADAAD/gAKAA4AABwALAA8AABEzETMVIxEjASEVKQEzESOAgICAAQABAP8AAQCAgAOA/oCA/gADAID+AAABAAD/gAEAAoAABQAAETMRMxUhgID/AAKA/YCAAAAAAAQAAP+AAwADgAAHAAsAEQAVAAARMxEzFSMRIwEzFSMlMxEhNTMBMxEjgICAgAEAgIABgID/AID/AICAA4D+gID+AAMAgID9gIABgP6AAAAACAAAAAACgAOAAAMABwALAA8AEwAXABsAHwAAEzMVKwEzFSMlIRUpAhUhIzMRIwEzFSM7AREjKQEVIYCAgICAgAGAAQD/AP8AAQD/AICAgAGAgICAgID+gAGA/oADgICAgICA/oABgID/AIAAAwAA/4ACgAOAAAMACwAPAAARMxEjATMRIxEjNTMFIRUhgIACAICAgID+gAEA/wADgP2AAgD8gAGAgICAAAAAAAMAAAAAAoADgAAHAAsADwAAETMRMxUjESMBIRUpATMRI4CAgIABAAEA/wABAICAA4D+gID+gAKAgP4AAAYAAAAAAoADgAADAAkADQARABkAHQAAETMVIzMhESM1IRUhFSEjMxEjATMRIzUjNTMFIRUhgICAAgCA/oABgP6AgICAAgCAgICA/oABAP8AA4CA/wCAgID/AAEA/oCAgICAAAACAAD/gAMAAoAABQALAAARIRUhESMBMxEzFSECAP6AgAIAgID/AAKAgP4AAgD+AIAAAAAABAAAAAACgAOAAAMACwATABcAABMhFSEjMxUhFSERIwEzESM1IzUzBSEVIYACAP4AgIABgP6AgAIAgICAgP6AAQD/AAOAgICA/oABgP4AgICAgAAAAgAAAAADAAOAAAcACwAAASEVIxEhNSEBMxEjAgABAID+AAGA/gCAgAOAgP0AgAIA/gAAAAMAAP+AAoACgAADAAcACwAAATMRIyUzFSMzIRUhAgCAgP4AgICAAYD+gAKA/YCAgIAAAAACAAAAAAMAA4AABQALAAARIREjESMFMxEhNSEBAICAAoCA/gABgAOA/QACgID9gIAAAAAABQAA/4ACgAKAAAMABwALAA8AFQAAEyEVISMzFSMlMxEjKQEVISMzFSEVIYABgP6AgICAAgCAgP6AAYD+gICAAgD9gAKAgICA/wCAgIAAAAADAAAAAAKAAoAABwALAA8AABEzFTMVIxEjASEVKQEzESOAgICAAQABAP8AAQCAgAKAgID+gAKAgP4AAAAEAAD/gAKAAoAAAwAJAA0AEwAAETMVIzMhESM1IRUhFSEjMxUhFSGAgIACAID+gAGA/oCAgAIA/YACgID/AICAgICAAAQAAP+AAoACgAADAAsADwATAAARMxEjATMRIzUjNTMBMxErATMVI4CAAgCAgICA/wCAgICAgAKA/gACAP0AgIABAP8AgAAAAAUAAP+AAoACgAADAAcACwAPABUAABMhFSEjMxEjATMRIykBFSEjMxUhFSGAAYD+gICAgAIAgID+gAGA/oCAgAIA/YACgID/AAEA/wCAgIAAAwAAAAACgAKAAAUACQAPAAARIRUhESMBMxErATMVMxUhAgD+gIACAICAgICA/wACgID+AAIA/wCAgAAAAgAAAAACgAKAAAMACQAAETMRIwEzESE1IYCAAgCA/gABgAKA/gACAP2AgAACAAD/gAMAA4AACQANAAABMxEzFSE1ITUhATMRIwIAgID/AP6AAYD+AICAA4D8gICAgAIA/gAAAAMAAAAAA4ACgAADAAsADwAAETMRIwEhFSERITUhATMRI4CAAYABgP8A/oABAAGAgIACgP4AAgCA/gCAAYD+AAACAAD/gAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/YACgP4AAAMAAP+AAoACgAAJAA0AEQAAEyERIzUhNSERISMzESMRIRUhgAIAgP6AAYD+gICAgAIA/gACgP2AgIABAP8A/wCAAAAAAQAAAAACAAKAAAUAABEzESEVIYABgP4AAoD+AIAAAAADAAD/gAOAA4AACwAPABMAAAEzESEVIREjNSE1IQEzESMBMxEjAYCAAQD/AID/AAEA/oCAgAMAgIADgP8AgP2AgIACAP4AAYD+AAAAAwAA/4ADAAKAABEAFQAZAAATMxUzFSEVIRUhFSEVIzUjNTMBIRUpATMVI4CAgAEA/oACAP4AgICAAQABAP8AAQCAgAKAgICAgICAgIACAICAAAAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAQAAP+AAoADgAAVABkAHQAhAAATIREzFSMRMxUjFSM1IzUzESM1MzUrATMVIwUzESMlMxUjgAEAgICAgICAgICAgICAgAIAgID+AICAA4D/AID+gICAgIABgICAgID+gICAAAADAAAAAAMAA4AAAwANABEAABEzESMBMxEhFSE1IzUzBTMVI4CAAYCAAQD+gICA/wCAgAOA/QABgP6AgICAgIAAAwAA/4ADAAKAAAsADwATAAABMxEzFSMRIxEhNSEBMxUjMyEVIQIAgICAgP8AAQD+AICAgAGA/oACgP8AgP8AAQCA/wCAgAAAAgAAAYACgAKAAAMABwAAETMVIzMhFSGAgIACAP4AAoCAgAAAAwAAAAACgAOAAAMABwAbAAATIRUhIzMVIyUzETMVIxUzFSMVIzUhNSE1ITUhgAEA/wCAgIABgICAgICAgP8AAQD/AAEAA4CAgID/AICAgICAgICAAAAAAAEAAAIAAoACgAADAAARIRUhAoD9gAKAgAAAAAACAAAAAACAAoAAAwAHAAARMxUjETMVI4CAgIACgID+gIAAAAACAAAAAAGAAoAAAwAJAAATIRUhIzMRIRUhgAEA/wCAgAEA/oACgID+gIAAAAUAAAAAAoACgAADAAcADwATABcAABEzFSMlMxEjJTMVIREjNSEjMxEjJTMVI4CAAgCAgP6AgAEAgP8AgICAAgCAgAKAgID/AICA/wCA/wCAgAAAAAIAAAAAAoACgAADAAsAABEhFSkBMxEzFSE1IQGA/oABgICA/YABgAKAgP6AgIAAAAUAAAAAAgACgAADAAcACwAPABMAABEhFSkBMxErATMVIyUzESMlMxUjAQD/AAEAgICAgIABAICA/oCAgAKAgP8AgID/AICAAAEAAAAAAoACgAAHAAARIRUjESMRIQKAgID+gAKAgP4AAgAAAAIAAAAAAoACgAAFAAkAABEhESMRIRUzESMCgID+AICAAoD9gAIAgP6AAAAAAQAAAAAAgAKAAAMAABEzESOAgAKA/YAAAQAAAAABgAKAAAcAABEhFSMRIxEjAYCAgIACgID+AAIAAAAAAgAAAAACgAKAAAUACQAAESEVIREjATMRIwIA/oCAAgCAgAKAgP4AAgD+AAAEAAAAAAKAAoAAAwAHAAsADwAAETMRIwEhFSkBMxEjKQEVIYCAAQABAP8AAQCAgP6AAYD+gAKA/gACAID+gIAAAQAAAYAAgAKAAAMAABEzESOAgAKA/wAAAQAA/4ACgAKAAAUAABEhESMRIQKAgP4AAoD9AAKAAAADAAAAAAKAAoAAAwAHAAsAABEhFSkBMxEjKQEVIQIA/gACAICA/gACAP4AAoCA/oCAAAAAAwAAAAACgAMAAAcACwAPAAARMxUhESMRIQEzFSsBMxUjgAIAgP4AAYCAgICAgAMAgP6AAQD/AICAAAAAAQAAAAACgAKAAAkAABEhFSERIREzESECAP6AAYCA/YACgID+gAGA/gAAAAAFAAAAAAKAAoAAAwAHAAsAEQAVAAARMxUjJSEVISMzFSMlMxEhNTMBMxEjgIABAAEA/wCAgIABgID/AID+AICAAoCAgICAgP4AgAEA/oAAAAEAAP+AAIACgAADAAARMxEjgIACgP0AAAIAAAAAAYACgAADAAkAABEhFSkBMxEhNSEBAP8AAQCA/oABAAKAgP4AgAAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAUAAP+AAoACgAADAAcACwAPABMAABMzESMBMxEjJTMVIzsBFSMpARUhgICAAYCAgP8AgICAgID+gAGA/oACgP6AAYD+AICAgIAAAAACAAD/gAKAAoAABwALAAARIRUhFTMVIQEzESMCAP6AgP8AAgCAgAKAgICAAQD9gAADAAAAAAKAAoAABwALAA8AABEhFSEVIRUhATMRIykBFSECAP6AAQD+gAIAgID+AAIA/gACgICAgAEA/oCAAAAABQAA/4ACgAKAAAMABwALAA8AEwAAETMVIyUzESMlMxEjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAKAgID/AID/AICA/oAABQAAAAACgAKAAAMABwALAA8AFQAAETMVIyUzESMlMxUjMyEVKQEzESE1IYCAAgCAgP6AgICAAQD/AAEAgP2AAgACgICA/wCAgID/AIAAAAAEAAD/gAKAAoAABQAJAA0AEQAAESERIzUhFTMRIwEzFSsBMxEjAoCA/gCAgAGAgICAgIACgP8AgID+AAIAgP8AAAAAAAIAAAAAAoACgAADAAcAABEhFSkBMxEjAgD+AAIAgIACgID+AAAAAAADAAAAAAKAAoAABwALABEAABEzETMVIxUjATMRIwEzESE1IYCAgIABAICAAQCA/gABgAKA/wCAgAIA/wABAP2AgAAAAAIAAAAAAoACgAAJAA0AABEhFSERITUzESMhMxEjAgD/AP8AgIACAICAAoCA/gCAAYD+AAACAAAAAAGAAoAAAwAHAAARMxEjATMRI4CAAQCAgAKA/YACgP2AAAAAAgAAAAABgAKAAAMABwAAETMRIwEzESOAgAEAgIACgP8AAQD9gAAAAAIAAAGAAYACgAADAAcAABEzESMBMxEjgIABAICAAoD/AAEA/wAAAAACAAABAAEAAoAAAwAHAAATMxErATMVI4CAgICAgAKA/wCAAAAEAAABAAIAAoAAAwAHAAsADwAAEzMRIwEzESMhMxUjJTMVI4CAgAEAgID+gICAAQCAgAKA/wABAP8AgICAAAAAAwAAAAACgAOAAAsADwATAAARMxEhESM1IREzFSEBMxUrATMVI4ACAID+gID/AAGAgICAgIADgP8A/wCA/oCAAYCAgAAEAAAAAAKAA4AABwALAA8AEwAAESEVIRUjNSMVMxEjJTMVIykBFSECgP6AgICAgAIAgID+gAGA/oADgICAgID+AICAgAAAAAADAAAAAAOAA4AAAwANABEAABMzFSMlMxEhFSERITUhATMRI4CAgAGAgAEA/oD+gAGA/gCAgAOAgID9AIABgIABAP8AAAEAAAAAA4ADgAAJAAARIREhFSERIRUjAoABAP6A/oCAA4D9AIADAIAAAAAABAAAAAACgAOAAAsADwATABcAABEhFSEVMxUhNTM1IREzESMBMxEjKQEVIQKA/wCA/oCA/wCAgAIAgID+gAGA/oADgICAgICA/wD+gAGA/oCAAAAAAQAAAAACgAOAAAcAABEhESMRIRUjAoCA/oCAA4D8gAMAgAAAAQAAAAADgAOAAA0AABEhESERIzUjESMRIRUjAoABAICAgP6AgAOA/wD/AID+AAMAgAAAAAQAAAAAA4ADgAAJAA0AEQAVAAARIREzFSMRIxEhBSEVKQEzESMpARUhAYCAgID/AAIAAQD/AAEAgID+gAGA/oADgP6AgP8AAoCAgP6AgAAAAgAAAAADgAOAAA0AEQAAEyERIREjNSMRITUhESEjMxEjgAIAAQCAgP4AAYD+gICAgAOA/wD/AID+AIACgP2AAAEAAAAAAoADgAAFAAARIREjESECgID+AAOA/IADAAAAAgAAAAACgAOAAAcADwAAETMVIRUhESMBMxEjNSE1IYABgP6AgAIAgID+gAGAA4CAgP6AAYD9gICAAAAABAAAAAADgAOAAAsADwATABcAABEhETMVIxEjESMVIykBFSkBMxEjKQEVIQGAgICAgIACAAEA/wABAICA/oABgP6AA4D+gID/AAKAgID+gIAAAAAAAwAAAAADAAOAAA0AEQAVAAARIREzFSMRIxEhNSE1IREzESMzIRUhAoCAgID+gAGA/gCAgIABgP6AA4D/AID+gAGAgID/AP6AgAAAAAIAAAAAAoADgAAJAA0AABEhFSEVIRUhESMBMxEjAoD+AAGA/oCAAgCAgAOAgICA/gACAP4AAAAABwAAAAADgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxEjATMRKwEzFSMlMxUjKQEVISUhFSGAAYD+gICAgAIAgICAgIABgICA/YABAP8AAYABAP8AA4CA/YACgP4AgICAgICAAAMAAAAAA4ADgAAFAAkADQAAESERIxEhJTMRIykBFSEBgID/AAMAgID+gAGA/oADgP0AAoCA/QCAAAAAAAIAAAAAAwADgAAFAA0AABEhESMRIyUzESMRITUhAQCAgAKAgID+gAGAA4D+gAEAgPyAAYCAAAAAAwAAAAADgAOAAAkADQARAAABMxEhESM1IxEjATMRIzMhFSECAIABAICAgP4AgICAAYD+gAOA/wD/AID+gAEA/wCAAAADAAAAAAKAA4AAAwAHAAsAABEzESMBMxEjKQEVIYCAAgCAgP6AAYD+gAOA/QABAP8AgAAAAgAAAAACgAOAAAsADwAAESEVIRUhFSERIRUhATMVIwIA/oABgP6AAgD9gAIAgIADgICAgP6AgAMAgAAABQAAAAADgAOAAAMABwANABEAFQAAEyEVISMzESMBMxEzFSkCFSElMxUjgAGA/oCAgIACAICA/wD+gAGA/oACgICAA4CA/YACgP4AgICAgAADAAAAAAKAA4AADwATABcAABMhFSMRMxUjESMRIzUzESsBMxEjATMRI4ABgICAgICAgICAgIACAICAA4CA/oCA/wABAIABgP6AAYD+gAAAAAEAAAAAAoADgAAPAAABMxEhESM1IxEjESERMxUzAQCAAQCAgID/AICAA4D/AP8AgP4AAgABAIAAAwAAAAACgAOAAAMABwALAAATIRUhIzMRIwEzESOAAYD+gICAgAIAgIADgID9AAMA/QAAAAIAAAAAAoADgAADAAsAABEzESMBMxEjESE1IYCAAgCAgP6AAYADgP6AAYD8gAGAgAAAAAAEAAAAAAKAA4AAAwALAA8AEwAAETMRIwEzESMRITUhATMVIzMhFSGAgAIAgID+gAGA/gCAgIABgP6AA4D+gAGA/QABAID/AICAAAAAAgAAAAACgAOAAAcACwAAETMRIRUhESMBMxEjgAGA/oCAAgCAgAOA/wCA/gACAP4AAAAAAAQAAP+AAoADgAADAAcACwATAAATIRUhIzMRIwEzFSMRMxEjNSE1IYABgP6AgICAAgCAgICA/oABgAOAgP2AAoCA/oD+gICAAAIAAAAAA4ADgAAPABMAAAEzESERIzUjESE1IREhNSEFMxEjAgCAAQCAgP4AAYD+gAGA/gCAgAOA/wD/AID+AIABgICA/oAAAAIAAAAAAoADgAAPABMAABEhFSEVIRUhFSERIzUjESMBMxUjAgD+gAGA/oABAICAgAIAgIADgICAgID/AID/AAMAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMVIzMhFSkBMxEjJTMVIzMhFSGAAgD+AICAgIABgP6AAYCAgP4AgICAAYD+gAOAgICA/oCAgIAAAgAAAAACgAOAAAkADQAAETMRIRUhESEVIQEzESOAAYD+gAIA/YACAICAA4D+gID/AIADgP6AAAAIAAD/gAKAA4AABwALAA8AEwAXABsAHwAjAAARIREjNSEVIzsBESMBMxErATMVKwEzESMBMxUjOwEVIyEzFSMCgID+gICAgIABAICAgICAgICAAQCAgICAgP4AgIADgP8AgID/AAEA/wCA/wABAICAgAAAAAMAAAAAA4ADgAAHAAsADwAAESERIxEjFSMBMxEjKQEVIQGAgICAAwCAgP6AAYD+gAOA/QACgID/AP8AgAAAAAACAAAAAAKAA4AABwALAAARMxEhFSERIwEzFSOAAYD+gIACAICAA4D/AID+AAIAgAAEAAAAAAKAA4AABQAJAA0AEQAAETMVIRUpATMRIyUzFSMzIRUhgAGA/gACAICA/gCAgIABgP6AA4CAgP4AgICAAAAAAAMAAAAAAoADgAADAAsADwAAEzMVIyUzESMRITUhATMRI4CAgAGAgID+gAGA/gCAgAOAgID8gAGAgAEA/wAAAAADAAAAAAKAA4AAAwAHAA8AABEzESMBMxEjKQEVIxEjESOAgAIAgID+gAGAgICAA4D+gAGA/oCA/oABgAADAAAAAAOAA4AAEwAXABsAAAEhFSEVIRUhFSEVIREhNSE1ITUhATMVIwEzFSMBgAGA/wABAP8AAQD/AP6AAQD/AAEAAYCAgP0AgIADgICAgICA/wCAgIABgID+gIAAAAAGAAAAAAKAA4AAAwAHAAsADwATABcAABEhFSkBMxUjKQEVISMzESMlMxUjKQEVIQIA/gACAICA/oABgP6AgICAAgCAgP6AAYD+gAOAgICA/oCAgIAAAAAABQAAAAACgAOAAAUACQANABEAFwAAESERIzUhBTMVKwEzFSsBMxUrATMVIRUhAoCA/gABgICAgICAgICAgIACAP2AA4D/AICAgICAgIAAAAAEAAAAAAKAAoAABQAJAA0AEQAAATMVMxUpATMRIyUzFSMzIRUhAQCAgP8AAQCAgP4AgICAAYD+gAKAgID/AICAgAAAAAQAAAAAAoADgAAJAA0AEQAVAAARIREzFSE1MxEhETMRIwEzESMpARUhAYCA/oCA/wCAgAIAgID+gAGA/oADgP6AgIABAP6A/wABAP8AgAAABQAA/4ACgAKAAAMACQANABEAFQAAESEVKQEzESE1IQUzESMBMxEjKQEVIQGA/oABgID+gAEA/oCAgAIAgID+gAGA/oACgID/AICA/wABAP8AgAAACAAA/4ACgAKAAAMABwALAA8AEwAXAB8AIwAAEzMVIyUzFSMhMxEjATMVIyUzFSsBMxUjITMVMxUhNTMFMxUjgICAAQCAgP6AgIABAICAAQCAgICAgP8AgID+gIABAICAAoCAgID/AAEAgICAgICAgICAAAAFAAD/gAKAAoAAAwAHAAsADwATAAATIRUhIzMVIyUzESMlMxUjMyEVIYABgP6AgICAAgCAgP4AgICAAYD+gAKAgICA/gCAgIAAAAAABwAA/4ACgAKAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSkBMxEjJTMVIzMhFSGAAYD+gICAgAIAgID/AAEA/wABAICA/gCAgIABgP6AAoCAgICAgP8AgICAAAAAAAUAAAAAAoADgAADAAcAEwAXABsAABMzFSsBMxEjATMRMxUjESMRIzUzBTMRKwEzFSOAgICAgIABAICAgICAgAEAgICAgIADgID/AAEA/wCA/wABAICA/wCAAAAABgAAAAACgAKAAAMABwALAA8AEwAXAAATMxUjJTMVIyEzESMBMxEjATMRIyUzFSOAgIABAICA/oCAgAEAgIABAICA/oCAgAKAgICA/oABgP6AAYD+AICAAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxEjATMRIyEzFSMlMxUjgAGA/oCAgIACAICA/oCAgAEAgIACgID+gAGA/oCAgIAAAAAGAAD/gAKAAoAAAwAHAAsADwATABcAAAEzFSM7ARUrATMVIzsBESMlMxUjMyEVIQGAgICAgICAgICAgID+AICAgAGA/oACgICAgP8AgICAAAsAAP+AA4ACgAADAAcACwAPABMAFwAbAB8AIwAnACsAABMzFSMlMxUjJTMVIyEzESMBMxUjJTMVIyUzESMpARUhIzMVIyUhFSkBMxUjgICAAQCAgAEAgID9gICAAQCAgAEAgIABAICA/YABAP8AgICAAYABAP8AAQCAgAKAgICAgID/AAEAgICAgP8AgICAgIAAAAAFAAAAAAKAA4AAAwALAA8AEwAXAAATIRUpATMRIxEjNTMlIRUhIzMRIzMhFSGAAYD+gAGAgICAgP6AAQD/AICAgIABgP6AA4CA/YABAICAgP6AgAAEAAAAAAKAA4AACQANABEAFQAAESEVIREzFSMRIwEhFSkBMxEjKQEVIQKA/gCAgIABAAEA/wABAICA/oABgP6AA4CA/wCA/wACAID+gIAAAAcAAAAAAoACgAADAAcACwAPABMAFwAbAAATMxUjJTMVIyEzESMBMxEjATMRIyEzFSMlMxUjgICAAQCAgP6AgIABAICAAQCAgP6AgIABAICAAoCAgID+gAGA/wABAP6AgICAAAAHAAD/gAKAA4AAAwAHAAsADwATABcAGwAAETMVIzMhFSkBMxEjKQEVKQEzESMlMxUjMyEVIYCAgAGA/oABgICA/wABAP8AAQCAgP4AgICAAYD+gAOAgID/AID/AICAgAAFAAD/gAKAAoAABwALAA8AEwAXAAABIREjESMVIyUzFSM7ARUjBzMVIzMhFSEBAAGAgICA/wCAgICAgICAgIABgP6AAoD9gAIAgICAgICAgAAAAAAIAAAAAAKAA4AAAwAHAA8AEwAXABsAHwAjAAABMxUjKQEVISMzFTMVIxEjATMVKwEzFSMlMxEjITMVIyUzFSMCAICA/oABgP6AgICAgIABgICAgICAAQCAgP6AgIABAICAA4CAgICA/wABgICAgP8AgICAAAQAAAAAAoADgAADAAcACwAPAAARMxEjATMVIzsBESMpARUhgIABgICAgICA/oABgP6AA4D9AAIAgP6AgAAAAAAGAAD/gAKAAwAAAwAHAA8AEwAXABsAAAEzFSsBMxUjJTMRIxUjETMFMxEjATMRIykBFSEBAICAgICAAQCAgICA/oCAgAIAgID+gAGA/oADAICAgP8AgAEAgP6AAYD+gIAAAAAABwAA/4ACgAKAAAMABwALAA8AEwAXABsAABMzFSMlMxUjITMVIyUzFSMlMxEjJTMVIzMhFSGAgIABAICA/oCAgAEAgIABAICA/gCAgIABgP6AAoCAgICAgICA/gCAgIAACgAA/4ACgAKAAAMABwALAA8AEwAXABsAHwAjACcAABMzFSMlMxUjITMVIyUzFSMlMxEjJTMVIyEzFSMhMxUjJTMVIykBFSGAgIABAICA/oCAgAEAgIABAICA/oCAgAEAgID/AICAAYCAgP8AAQD/AAKAgICAgICAgP8AgICAgICAgAAABAAA/4ACgAOAAAcACwAPABMAAAEzESMRITUhBTMVIwczFSMzIRUhAgCAgP8AAQD+gICAgICAgAGA/oADgPyAAYCAgICAgIAABwAA/4ACgAKAAAMABwALAA8AEwAbAB8AABMzFSMlMxUjITMRIwEzFSMlMxEjITMVMxUhNTMFMxUjgICAAQCAgP6AgIABAICAAQCAgP6AgID+gIABAICAAoCAgID/AAEAgID/AICAgICAAAAABAAA/4ACgAKAAAMACwAPABMAABMzFSMlMxEjNSE1IQEzESMRIRUhgICAAYCAgP6AAYD+AICAAgD+AAKAgID9gICAAQD/AP8AgAAAAAcAAAAAAoADgAADAAcACwAPABcAGwAfAAATMxUjJTMVIyEzFSMlMxUjJTMRIxEhNSEFMxEjMyEVIYCAgAEAgID+gICAAQCAgAEAgID/AAEA/oCAgIABAP8AA4CAgICAgICA/YABAICA/wCAAAQAAAAAAoADgAADAA8AEwAXAAATIRUhIzMVIRUhFSEVIREjATMVIxMzESOAAQD/AICAAQD/AAGA/oCAAYCAgICAgAOAgICAgID/AAMAgP6A/wAAAAcAAP+AAoACgAADAAcACwAPABMAFwAbAAATMxUjJTMVIyEzESMBMxUrATMVIzsBESMpARUhgICAAQCAgP6AgIACAICAgICAgICA/oABgP6AAoCAgID+AAIAgID/AIAAAAQAAAAAAoADgAAHAAsADwATAAABMxEjESM1MyUhFSEjMxEjMyEVIQIAgICAgP6AAQD/AICAgIABgP6AA4D9AAEAgICA/oCAAAkAAP+AAoADgAADAAcADwATABcAGwAfACMAJwAAEzMVIyUzFSMhMxEhFSEVIwEzFSMlMxUjETMVIyEzESMBMxErATMVI4CAgAEAgID+gIABgP6AgAEAgIABAICAgID+gICAAQCAgICAgAOAgICA/wCAgAIAgICA/wCA/wABAP8AgAAAAAYAAP+AAoADgAADABcAGwAfACMAJwAAESEVKQEzFTMVIxUzFSMVIzUjNTM1IzUzBTMVIwMzFSMlMxUjKQEVIQGA/oABgICAgICAgICAgID/AICAgICAAgCAgP6AAYD+gAOAgICAgICAgICAgICA/wCAgICAAAAAAAMAAAAAAoADgAAHAAsADwAAETMRIRUhESMBMxEjKQEVIYABgP6AgAIAgID+gAGA/oADgP6AgP8AAQD/AIAAAAAEAAD/gAIAA4AACwAPABMAFwAAATMRMxUjESMRIzUzEzMRIyUzFSMzIRUhAQCAgICAgICAgID+gICAgAEA/wADgP8AgP8AAQCA/oD/AICAgAAAAAAIAAAAAAKAA4AAAwAHAAsADwATABcAGwAfAAABIRUpATMVIykBFSkBMxUjKQEVKQEzFSMlMxUjKQEVIQEAAQD/AAEAgID/AAEA/wABAICA/wABAP8A/wCAgAIAgID+gAGA/oADgICAgICAgICAgAAACgAAAAADAAOAAAMABwAPABMAFwAbAB8AIwAnACsAABMzFSMlMxUjITMRMxUjESMBMxEjATMVKwEzFSM7ARUrATMVIzsBFSMpARUhgICAAYCAgP4AgICAgAEAgIABgICAgICAgICAgICAgICA/gACAP4AA4CAgID/AID/AAKA/wABAICAgICAgAAAAAAIAAD/gAKAAoAAAwAHAAsADwATABcAGwAfAAATIRUhIzMRIwEzESMhMxUjJTMVKwEzFSsBMxUjJTMVI4ABgP6AgICAAgCAgP6AgIABAICAgICAgICAAQCAgAKAgP8AAQD/AICAgICAgIAAAAAEAAD/gAKAAoAACQANABEAFQAAESEVIxEhNTM1IQEzESMlMxUjMyEVIQKAgP8AgP6AAgCAgP4AgICAAYD+gAKAgP8AgID/AP8AgICAAAAAAAgAAP+AAoADgAADAAcACwAPABMAFwAbAB8AABMhFSEjMxUjMyEVKQEzFSMpARUpATMRIyUzFSMzIRUhgAEA/wCAgICAAYD+gAGAgID/AAEA/wABAICA/gCAgIABgP6AA4CAgICAgP8AgICAAAUAAP+AAoADgAADAAcAGwAfACMAABMhFSEjMxUjJTMVMxUjFTMVIxEjESE1ITUhNSEBMxEjMyEVIYABAP8AgICAAYCAgICAgID/AAEA/wABAP6AgICAAQD/AAOAgICAgICAgP8AAQCAgID+gP8AgAAFAAD/gAKAA4AAAwAXABsAHwAjAAARIRUpATMVMxUjETMVIxUjNSM1MxEjNTMFMxEjATMRIwMhFSEBAP8AAQCAgICAgICAgICA/wCAgAIAgICAAQD/AAOAgICA/wCAgICAAQCAgP8AAQD/AP8AgAAABgAA/4ACgAKAAAMABwALAA8AEwAXAAARIRUpATMVIykBFSEjMxEjJTMVIykBFSECAP4AAgCAgP6AAYD+gICAgAIAgID+gAGA/oACgICAgP8AgICAAAAAAAQAAP+AAoACgAAHAAsADwATAAARMxEhFSEVIwEzFSM7AREjASEVIYABgP6AgAGAgICAgID+gAIA/gACgP6AgIACgID/AP8AgAAAAAAFAAD/gAKAAoAAAwAHAAsAEwAXAAATIRUhIzMRIwEzESMpARUjFSM1IwUhFSGAAYD+gICAgAIAgID+gAGAgICAAQABAP8AAoCA/wABAP8AgICAgIAAAAAABQAA/4ACgAKAAAMABwALABMAFwAAEyEVISMzESMBMxUjBTMVIRUhNTMFMxUjgAGA/oCAgIACAICA/oCAAQD+AIABgICAAoCA/wABAICAgICAgIAAAwAAAIABgAIAAAMABwALAAARMxUjITMVIyEzFSOAgAEAgID/AICAAgCAgIAAAAAAAgAAAQABgAOAAAsADwAAESEVIRUzFSMVMxUhATMVIwGA/wCAgID/AAEAgIADgICAgICAAQCAAAAGAAD/gAKAAoAAAwAHAAsADwATABcAABMhFSEjMxUjMyEVKQEzESMlMxUjMyEVIYACAP4AgICAgAGA/oABgICA/gCAgIABgP6AAoCAgID/AICAgAAIAAD/gAKAAoAAAwAHAAsADwATABcAGwAfAAARIRUhJSEVISMzFSsBMxUjJTMVIyEzESMBMxEjKQEVIQEA/wABgAEA/wCAgICAgIABAICA/oCAgAIAgID+gAGA/oACgICAgICAgID/AAEA/wCAAAAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAIAAAAAAoADgAAHAAsAABMhESE1IREhIzMRI4ACAP4AAYD+gICAgAOA/ICAAoD9gAAAAAADAAAAAAKAA4AACwAPABMAABMhESE1ITUhNSERISMzESMVMxUjgAIA/gABgP6AAYD+gICAgICAA4D8gICAgAGA/oCAgAAAAAAGAAAAAAKAA4AABwALAA8AEwAXABsAABEhESM1IRUjITMVIykBFSEjMxEjJTMVIykBFSECgID+gIABgICA/wABAP8AgICAAgCAgP6AAYD+gAOA/wCAgICA/wCAgIAAAAAFAAAAAAIAA4AACwAPABMAFwAbAAARMxEzFSMVMxUjESMBMxUrATMVIzsBFSsBMxUjgICAgICAAYCAgICAgICAgICAgAOA/wCAgID/AAOAgICAgAAEAAAAAAKAA4AABQAJAA0AEQAAESEVIxEjATMRIzsBESM7AREjAQCAgAEAgICAgICAgIADgID9AAMA/wD/AP8AAAAAAAUAAAAAAoADgAAFAAkADQARABUAABEhFSMRIwEzESM7ARErATMRIwEzESMBAICAAQCAgICAgICAgAEAgIADgID9AAMA/wD/AP8AAQD/AAAABQAAAAACgAOAAAUACQANABEAFQAAESEVIxEjATMRIzsBESsBMxUjJTMRIwEAgIABAICAgICAgICAAQCAgAOAgP0AAwD/AP8AgID/AAAAAAAFAAAAAAKAA4AACQANABEAFQAZAAARIRUjETMRIxEjATMRIzsBESsBMxEjATMRIwEAgICAgAEAgICAgICAgIABAICAA4CA/wD/AP8AAwD/AP8A/wABAP8AAAAAAAIAAAAAAgADgAALAA8AABEzESEVIRUhFSERIwEzFSOAAQD/AAEA/wCAAYCAgAOA/wCAgID/AAIAgAAAAAIAAAAAAgADgAAPABMAABEzFSEVIRUzFSMVIRUhFSMBMxEjgAEA/wCAgAEA/wCAAYCAgAOAgICAgICAgAKA/oAAAAAAAwAAAAABgAOAAAkADQARAAARIRUjFTMVIxEjATMVIxUzFSMBAICAgIABAICAgIADgICAgP4AAwCAgIAABQAAAAACAAOAAAkADQARABUAGQAAESEVIxUzFSMRIwEzFSsBMxUjOwEVKwEzFSMBAICAgIABgICAgICAgICAgICAA4CAgID+AAOAgICAgAAEAAAAAAIAA4AACQANABEAFQAAESEVIxUzFSMRIwEzFSsBMxUjFTMVIwEAgICAgAGAgICAgICAgAOAgICA/gADgICAgIAAAAAFAAAAAAIAA4AACQANABEAFQAZAAARIRUjFTMVIxEjATMVIzsBFSsBMxUjOwEVIwEAgICAgAEAgICAgICAgICAgIADgICAgP4AAwCAgICAAAUAAAAAAoADgAATABcAGwAfACMAAAEzETMVIxUzFSMVIxEjNTM1IzUzJTMVIxUzFSMhMxUjFTMVIwEAgICAgICAgICAgP8AgICAgAIAgICAgAOA/oCAgICAAQCAgICAgICAgICAAAAAAwAAAAABgAOAAAsADwATAAARMxEzFSMVMxUjFSMBMxUjFTMVI4CAgICAgAEAgICAgAOA/oCAgICAAYCAgIAAAAMAAAAAAYADgAALAA8AEwAAATMRIzUjNTM1IzUzBTMVIxUzFSMBAICAgICAgP8AgICAgAOA/ICAgICAgICAgAAFAAAAAAKAA4AAEwAXABsAHwAjAAABMxEzFSMVMxUjESM1IzUzNSM1MwEzFSMVMxUjITMVIxUzFSMBAICAgICAgICAgIABAICAgID+AICAgIADgP8AgICA/wCAgICAAQCAgICAgIAAAAQAAAAAAoADgAAPABMAFwAbAAABMxEzFSMRIzUjNTM1IzUzATMVIwEzFSMVMxUjAQCAgICAgICAgAEAgID+AICAgIADgP8AgP4AgICAgAEAgP8AgICAAAAGAAAAAAIAA4AACQANABEAFQAZAB0AABEhFSMRMxUjESMBMxUjOwEVKwEzFSMVMxUjOwEVIwEAgICAgAEAgICAgICAgICAgICAgAOAgP6AgP8AAwCAgICAgIAAAAUAAACAAYADAAADAAcACwAPABMAAAEzFSsBMxUrATMVIzsBFSM7ARUjAQCAgICAgICAgICAgICAgAMAgICAgIAAAAAAAwAAAAACAAOAAAcACwAPAAARMxEzFSMRIwEzFSM7ARUjgICAgAEAgICAgIADgP4AgP8AAQCAgAADAAAAAAIAA4AABwALAA8AABEzETMVIxEjATMVKwEzFSOAgICAAYCAgICAgAOA/wCA/gADgICAAAMAAAAAAoADgAALAA8AEwAAEzMRMxEjESMRIxEzATMVKwEzFSOAgICAgICAAYCAgICAgAOA/wD/AP6AAYABAAEAgIAACQAAAAACgAOAAAMABwALAA8AEwAXABsAHwAjAAARMxUjJTMVIyEzESMBMxErATMVKwEzESMBMxEjITMVIyUzFSOAgAIAgID+gICAAQCAgICAgICAgAEAgID+gICAAgCAgAOAgICA/wABAP8AgP8AAQD/AICAgAAACwAAAAACgAOAAAMABwALAA8AEwAXABsAHwAjACcAKwAAETMVIyUzFSMhMxEjATMRIyEzFSMlMxUjJTMVIyEzESMBMxEjITMVIyUzFSOAgAIAgID+gICAAQCAgP6AgIABAICAAQCAgP6AgIABAICA/oCAgAIAgIADgICAgP8AAQD/AICAgICA/wABAP8AgICAAAAAAAQAAAAAAgADgAAJAA0AEQAVAAARIRUjETMVIxEjATMVIzsBFSsBMxUjAQCAgICAAQCAgICAgICAgAOAgP6AgP8AAwCAgIAAAAIAAAAAAoADgAAHAA8AABEzESEVIREjATMRIxEjNTOAAQD/AIACAICAgIADgP6AgP6AA4D8gAEAgAAAAAIAAAAAAoADgAALABcAABEzESEVIRUhFSERIwEzESM1IzUzNSM1M4ABAP8AAQD/AIACAICAgICAgAOA/wCAgID/AAOA/ICAgICAAAAFAAAAAAKAA4AAEwAXABsAHwAjAAABMxEzFSMVMxUjESMRIzUzNSM1MyUzFSMlMxUjATMVIyUzFSMBAICAgICAgICAgID/AICAAgCAgP4AgIACAICAA4D/AICAgP8AAQCAgICAgICA/oCAgIAAAAAAAQAAAAABgAOAAAsAABMzETMRIxEjESMRM4CAgICAgIADgP8A/wD+gAGAAQAAAAAAAwAAAAACgAOAAAsADwATAAABMxEzFSMRIxEjNTMlMxUjATMVIwEAgICAgICA/wCAgAIAgIADgP6AgP6AAgCAgID/AIAAAAAAAgAAAAABgAOAAAcACwAAETMRMxUjESMBMxUjgICAgAEAgIADgP6AgP6AAYCAAAAAAwAAAAACgAOAAAsADwATAAABMxEzESMRIxEjETMlMxUjATMVIwEAgICAgICA/wCAgAIAgIADgP8A/wD+gAGAAQCAgP8AgAAAAQAAAAAAgAOAAAMAABEzESOAgAOA/IAAAQAAAAABgAOAAAsAABMzETMRIxEjESMRM4CAgICAgIADgP8A/wD+gAGAAQAAAAAACgAAAAADAAOAAAMABwALAA8AEwAXABsAHwAjACcAAAEzFSsBMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMBAICAgICAgICAAYCAgP8AgIABgICA/wCAgAGAgICAgICAgIADgICAgICAgICAgICAgIAAAAMAAAAAAoADgAATABcAGwAAATMRMxUjFTMVIxEjESM1MzUjNTMFMxUjJTMVIwEAgICAgICAgICAgP8AgIACAICAA4D/AICAgP8AAQCAgICAgICAAAMAAAAAAoADgAALAA8AEwAAATMRMxUjESMRIzUzATMVIwEzFSMBAICAgICAgAEAgID+AICAA4D/AID+AAGAgAEAgP8AgAAAAAIAAAAAAYADgAAHAAsAAAEzESMRIzUzBTMVIwEAgICAgP8AgIADgPyAAYCAgIAAAAMAAAAAAoADgAAHAAsADwAAASEVIxEhNTMBMxUjATMVIwEAAQCA/wCAAQCAgP4AgIADgID9AIACgID+gIAAAAAFAAAAAAIAA4AABwALAA8AEwAXAAARIRUjETMVIQEzFSsBMxUjETMVIzsBFSMBAICA/wABgICAgICAgICAgIADgID9gIADgICA/oCAgAAAAAMAAAAAAoADgAADAA8AEwAAETMVIyUzFTMRIxEjESMRMyUzFSOAgAEAgICAgICAAQCAgAOAgICA/wD+AAIAAQCAgAAABwAAAAABgAOAAAMABwALAA8AEwAXABsAAAEzFSsBMxUrATMVIzMhFSEjMxUjOwEVIzsBFSMBAICAgICAgICAgAEA/wCAgICAgICAgIADgICAgICAgIAAAAMAAAAAAoADgAAFAAsADwAAETMRMxUhASERIxErATMVI4CA/wABgAEAgICAgIADgP4AgAGA/YACAIAAAAEAAAIAAIADgAADAAARMxEjgIADgP6AAAEAAAGAAYADgAAHAAATMxEzESERM4CAgP6AgAOA/wD/AAEAAAMAAAEAAoADgAALAA8AEwAAATMRMxUjFSM1IzUzJTMVIyUzFSMBAICAgICAgP8AgIACAICAA4D+gICAgICAgICAAAAAAwAAAAACgAOAAAsADwATAAABMxUzFSMRIxEjNTMFMxUjJTMVIwEAgICAgICA/wCAgAIAgIADgICA/YACgICAgICAAAACAAAAAAGAA4AABwALAAABMxEjESM1MwUzFSMBAICAgID/AICAA4D8gAKAgICAAAACAAAAAAIAA4AADwATAAABMxEzESMRIxEjETM1IzUzBTMVIwEAgICAgICAgID/AICAA4D+gP8A/wABAAEAgICAgAAAAAUAAAAAAgADgAALAA8AEwAXABsAABEhFSERMxUjESEVIQEzFSsBMxUjFTMVIzsBFSMBgP8AgIABAP6AAYCAgICAgICAgICAA4CA/wCA/wCAAwCAgICAgAADAAAAAAGAA4AACwAPABMAABEzETMVIxUzFSMRIwEzFSMVMxUjgICAgICAAQCAgICAA4D/AICAgP8AAwCAgIAAAwAAAAACAAOAAA8AEwAXAAARIRUhFTMVMxUhFTMVMxUhATMRIxUzESMBgP8AgID/AICA/oABgICAgIADgICAgICAgIADAP8AgP8AAAUAAAAAAgADgAALAA8AEwAXABsAABEzETMVIxUzFSMRIwEzFSsBMxUjETMVIzsBFSOAgICAgIABgICAgICAgICAgIADgP8AgICA/wADgICA/oCAgAAAAAADAAAAAAKAA4AABwAPABMAABEzFTMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIADgICA/YADgPyAAoCAgIAAAAMAAAAAAoADgAALABcAGwAAETMVMxUjFTMVIxEjATMRIxEjNTM1IzUzBTMVI4CAgICAgAIAgICAgICA/wCAgAOAgICAgP6AA4D8gAGAgICAgIAAAAMAAAAAAoADgAADAA8AEwAAETMRIwEzETMVIxEjESM1MwEzESOAgAEAgICAgICAAQCAgAOA/wABAP8AgP4AAgCAAQD/AAAAAAEAAAAAAYADgAAHAAARIREjESMRIwGAgICAA4D/AP2AAoAAAAIAAAAAAYADgAAHAAsAABEzFTMVIxEjATMVI4CAgIABAICAA4CAgP2AAoCAAAAAAAIAAAAAAgADgAAPABMAABMzFTMVIxUzESMRIxEjETMlMxUjgICAgICAgICAAQCAgAOAgICA/wD/AAEAAQCAgAAIAAAAgAKAAwAAAwAHAAsADwATABcAGwAfAAABMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVIwEAgICAgIABAICA/oCAgAIAgID+gICAAQCAgICAgAMAgICAgICAgICAgIAAAAwAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAAEzMVIyUzFSsBMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMlMxUjgICAAQCAgICAgICAgAEAgID+gICAAgCAgP6AgIABAICAgICAgICAAQCAgAOAgICAgICAgICAgICAgICAgIAAAAADAAAAAAKAA4AACwAXABsAABEzFTMRIxUzESMVIwEzESM1IxEzNSMRMwEzFSOAgICAgIACAICAgICAgP8AgIADgID/AID/AIADgPyAgAEAgAEA/wCAAAAADACAAAADAAOAAAMABwALAA8AEwAXABsAHwAjACcAKwAvAAABMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMlMxUjITMVIyUzFSMBgICAgICAAQCAgP6AgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIADgICAgICAgICAgICAgICAgICAAAUAAAAAA4ADgAADAAsADwATABcAABEzFSMlIRUjESMRIyUzFSMhMxUjJTMVI4CAAQABgICAgAIAgID9gICAAgCAgAOAgICA/QADAICAgICAAAAAAAUAAAAAAoADgAATABcAGwAfACMAAAEzETMVIxUzFSMRIxEjNTM1IzUzJTMVIyUzFSMBMxUjJTMVIwEAgICAgICAgICAgP8AgIACAICA/gCAgAIAgIADgP8AgICA/wABAICAgICAgID+gICAgAAAAAAFAAAAAAOAA4AABwALAA8AEwAXAAABIRUjESE1MwEzFSsBMxUjATMVKwEzFSMBgAEAgP8AgAGAgICAgID+AICAgICAA4CA/QCAAwCAgP6AgIAAAAADAAAAAAKAA4AACwAPABMAAAEzETMRIxUjNSMRMwEzFSMlMxUjAQCAgICAgID/AICAAgCAgAOA/gD/AICAAQD/AICAgAAAAAAHAAAAAAKAA4AAAwAXABsAHwAjACcAKwAAETMVIyUzFTMRIxUzESMVIzUjETM1IxEzJTMVIwEzFSMlMxUjATMVIyUzFSOAgAEAgICAgICAgICAgAEAgID+AICAAgCAgP4AgIACAICAA4CAgID/AID/AICAAQCAAQCAgP8AgICA/wCAgIAAAAAABAAAAAACgAOAAA8AHwAjACcAABEzFTMVIxUzFSMVMxUjFSMBMxEjNSM1MzUjNTM1IzUzBTMVIxUzFSOAgICAgICAgAIAgICAgICAgID/AICAgIADgICAgICAgIADgPyAgICAgICAgICAgAAAAwAAAAACgAOAAAsADwATAAABMxEzFSMRIxEjNTMFMxEjATMRIwEAgICAgICA/wCAgAIAgIADgP4AgP8AAQCAgP8AAQD/AAAAAQAAAAAAgAGAAAMAABEzESOAgAGA/oAABQAAAAACgAOAABMAFwAbAB8AIwAAATMVMxUjETMVIxUjNSM1MxEjNTMFMxUjJTMVIwUzFSMlMxUjAQCAgICAgICAgICA/wCAgAIAgID+AICAAgCAgAOAgID+gICAgIABgICAgICAgICAgAAABAAAAAACAAOAAAkADQARABUAAAEhESMRIzUzESsBMxUrATMVIzsBFSMBAAEAgICAgICAgICAgICAgAOA/IABAIABgICAgAAAAwAAAAADgAOAAA0AGwAfAAATMxUzFSMRMxUhESM1MykBETMVIxEjNSM1MxErATMVI4CAgICA/wCAgAGAAQCAgICAgICAgIADgICA/wCAAQCA/wCA/wCAgAEAgAABAAABAAEAAgAAAwAAESERIQEA/wACAP8AAAAAAgAAAIAAgAKAAAMABwAAETMVIxEzFSOAgICAAoCA/wCAAAAAAQAAAIACgAMAAAsAAAEzESEVIREjESE1IQEAgAEA/wCA/wABAAMA/wCA/wABAIAAAwAAAAACgAOAAAkADQARAAABIRUjESMRIzUzATMVIwEzFSMBAAEAgICAgAEAgID+AICAA4CA/QABgIABAID/AIAAAAAFAAAAAAKAA4AAAwAXABsAHwAjAAARMxEjATMRMxUjFTMVIxEjESM1MzUjNTMBMxEjATMRIwEzESOAgAEAgICAgICAgICAgAEAgID+AICAAgCAgAOA/wABAP8AgICA/wABAICAgAEA/wD+gP8AAQD/AAAAAAMAAAAAAoADgAATABcAGwAAATMVMxUjETMVIxUjNSM1MxEjNTMFMxEjATMRIwEAgICAgICAgICAgP8AgIACAICAA4CAgP6AgICAgAGAgID+gAGA/oAAAAAEAAAAAAKAA4AABwALAA8AEwAAETMRMxUjESMBMxUjOwERIzsBESOAgICAAQCAgICAgICAgAOA/oCA/oACgID/AP8AAAMAAAAAAoADgAAFAAsADwAAATMRITUzASEVIxEjATMVIwIAgP8AgP4AAQCAgAEAgIADgP2AgAEAgP4AAgCAAAAHAAAAAAOAA4AADwATABcAGwAfACMAJwAAASEVIxEzFSMRIxEjNTMRKwEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIwEAAYCAgICAgICAgICAAgCAgP2AgIADAICA/YCAgAIAgIADgID+gID/AAEAgAGAgICAgICAgICAAAAAAQAAAAACAAOAAAsAABEzESE1MxEjESEVI4ABAICA/wCAA4D+gID9gAGAgAAHAAAAAAEAA4AAAwAHAAsADwATABcAGwAAEzMVKwEzFSM7ARUrATMVIzsBFSsBMxUjOwEVI4CAgICAgICAgICAgICAgICAgICAgAOAgICAgICAgAAFAAAAAAKAA4AAAwAPABMAFwAbAAATMxEjOwEVMxUjFSM1IzUzJTMVIwUzFSMhMxEjgICAgICAgICAgAEAgID+AICAAYCAgAOA/wCAgICAgICAgID/AAAAAwAAAAACgAOAAAcACwAPAAARMxEhFSERIwEzESM7AREjgAEA/wCAAYCAgICAgAOA/wCA/gACAP8A/wAAAwAAAAACgAOAAAsADwATAAABMxEzESM1IxUjETMBMxUjJTMVIwEAgICAgICA/wCAgAIAgIADgP4A/wCAgAEA/wCAgIAAAAAAAgAAAAACgAKAAAMADwAAEyEVISMzFSE1MxEjESERI4ABgP6AgIABgICA/oCAAoCAgID+AAEA/wAAAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzESMBMxUjFTMVIykBFSGAAYD+gICAgAIAgICAgP6AAYD+gAKAgP6AAYCAgICAAAAAAAIAAAAAAoACgAAHAAsAABEhFSERIRUhATMRIwIA/oABgP4AAgCAgAKAgP6AgAIA/oAAAAABAAAAAAKAAoAACwAAESEVIRUhFSEVIRUhAoD+AAEA/wACAP2AAoCAgICAgAAAAAACAAD/gACAAwAAAwAHAAARMxEjFTMVI4CAgIADAP2AgIAAAAADAAAAAAKAAoAAAwAHAAsAAAEzESMlMxUjMyEVIQIAgID+AICAgAGA/oACgP4AgICAAAAABQAAAAACgAKAAAcACwAPABMAFwAAETMRIRUhESMBMxUrATMVIxUzFSM7ARUjgAEA/wCAAgCAgICAgICAgICAAoD/AID/AAKAgICAgIAAAAADAAAAAAKAAoAABwAPABMAABEzFTMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIACgICA/oACgP2AAYCAgIAAAAQAAAAAAoACgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAoCA/oABgP6AgAACAAAAAAKAAoAACQANAAARIRUhFSEVIREjATMVIwIA/oABgP6AgAIAgIACgICAgP8AAgCAAAAAAAMAAAAAAoADgAADAA0AEQAAETMRIwEzESE1ITUhNSEFMxUjgIACAID+AAGA/oABgP4AgIADgP4AAgD8gICAgICAAAAAAQAAAAACgAKAAAcAABEhFSERIxEhAoD/AID/AAKAgP4AAgAAAwAAAAACgAKAAAMABwALAAARMxEjATMRIykBFSGAgAIAgID+gAGA/oACgP4AAgD+AIAAAAUAAAAAAoACgAADAAcACwAPABMAABEzESMBMxEjITMVIyUzFSsBMxUjgIACAICA/oCAgAEAgICAgIACgP6AAYD+gICAgIAAAAMAAAAAAoACgAAHAA8AEwAAETMRMxUjFSMBMxEjNSM1MyUzFSOAgICAAgCAgICA/wCAgAKA/oCAgAKA/YCAgICAAAAAAwAAAAACgAKAAAcACwATAAARIRUjFSM1IQUzFSsBMxUhFSE1MwKAgID+gAEAgICAgAGA/YCAAoCAgICAgICAgAAAAAADAAAAAAKAAwAAAwANABEAABMhFSEjMxUhFSERIRUhATMRI4ACAP4AgIABgP6AAYD+AAIAgIADAICAgP8AgAGA/wAAAAUAAP+AAwADgAADAA0AEQAVABkAAAEzFSsBMxEhNSERIzUzJSEVISMzESMFMxUjAoCAgICA/gABgICA/oABAP8AgICAAoCAgAOAgP0AgAEAgICA/oCAgAADAAAAAAIAA4AAAwATABcAAAEhFSEjMxEzFSMRIzUjNTMRIzUzBTMVIwEAAQD/AICAgICAgICAgAEAgIADgID+gID/AICAAQCAgIAAAgAAAAACAAOAAAMAEwAAASEVISMzFSEVIREjESM1MzUjNTMBAAEA/wCAgAEA/wCAgICAgAOAgICA/gABAICAgAAAAAAFAAAAAAKAA4AABQAJAA0AEQAVAAATIREjNSEjMxEjASEVKQEzESMpARUhgAIAgP6AgICAAQABAP8AAQCAgP8AAQD/AAOA/wCA/QACgID+gIAAAAAIAAAAAAKAA4AAAwAHAAsADwATABcAGwAfAAABIRUhIzMVIzsBFSsBMxUjJTMVIyEzESMBMxEjKQEVIQEAAQD/AICAgICAgICAgAEAgID+gICAAgCAgP6AAYD+gAOAgICAgICA/wABAP8AgAAGAAAAAAKAA4AAAwAHAAsADwATABcAAAEzFSsBMxUrATMRIwEzFSM7AREjKQEVIQEAgICAgICAgIABgICAgICA/oABgP6AA4CAgP4AAgCA/oCAAAAFAAAAAAIAA4AAAwAHAAsADwATAAATMxUrATMRIwEzFSM7AREjKQEVIYCAgICAgAEAgICAgID/AAEA/wADgID9gAIAgP6AgAAHAAAAAAKAA4AAAwAHAAsADwAXABsAHwAAETMVIyUzFSMhMxUjJTMVKwEzESM1IzUzBTMVIzsBFSOAgAIAgID+gICAAQCAgICAgICA/wCAgICAgAOAgICAgICA/gCAgICAgAAABQAA/4ADAAKAAAMACwAPABMAGwAAEzMRIwEzESMRITUhBTMVKwEzFSMlMxUhFSE1M4CAgAIAgID+gAGA/gCAgICAgAEAgAEA/gCAAoD/AAEA/YABAICAgICAgICAAAAAAQAAAYABgAIAAAMAABEhFSEBgP6AAgCAAAAAAAEAAAGAAYACAAADAAARIRUhAYD+gAIAgAAAAAABAAABgAMAAgAAAwAAESEVIQMA/QACAIAAAAAAAQAAAYAEAAIAAAMAABEhFSEEAPwAAgCAAAAAAAIAAAIAAQADgAADAAcAABMzFSsBMxEjgICAgICAA4CA/wAAAAIAAAIAAQADgAADAAcAABMzESsBMxUjgICAgICAA4D/AIAAAAIAAP+AAQABAAADAAcAABMzESsBMxUjgICAgICAAQD/AIAAAAQAAAIAAgADgAADAAcACwAPAAATMxUjJTMVIyEzESMBMxEjgICAAQCAgP6AgIABAICAA4CAgID/AAEA/wAAAAAEAAACAAIAA4AAAwAHAAsADwAAEzMRIwEzESMhMxUjJTMVI4CAgAEAgID+gICAAQCAgAOA/wABAP8AgICAAAAABAAA/4ACAAEAAAMABwALAA8AABMzESMBMxEjITMVIyUzFSOAgIABAICA/oCAgAEAgIABAP8AAQD/AICAgAAAAAEAAAAAAoADgAALAAABMxEhFSERIxEhNSEBAIABAP8AgP8AAQADgP8AgP4AAgCAAAEAAAAAAoADgAATAAABMxEhFSEVIRUhESMRITUhNSE1IQEAgAEA/wABAP8AgP8AAQD/AAEAA4D/AICAgP8AAQCAgIAAAQAAAQABAAIAAAMAABEhESEBAP8AAgD/AAAAAAMAAAAAA4AAgAADAAcACwAANTMVIyUzFSMlMxUjgIABgICAAYCAgICAgICAgAAAAAgAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AABEzESMBMxUrATMRKwEzFSsBMxEjJTMRIwEzESMlMxUjgIACAICAgICAgICAgICAAYCAgAEAgID9AICAA4D/AAEAgP8AgP8AgP8AAQD/AICAAAkAAAAABAADgAADAAcACwAPABMAFwAbAB8AIwAAETMRIwEzFSsBMxErATMVKwEzESMlMxEjATMRIwEzESMlMxUjgIACAICAgICAgICAgICAAQCAgAEAgIABAICA/ICAgAOA/wABAID/AID/AID/AAEA/wABAP8AgIAAAAACAAACgAEAA4AAAwAHAAATMxUrATMVI4CAgICAgAOAgIAAAAAEAAACgAIAA4AAAwAHAAsADwAAEzMVIyUzFSMhMxUjJTMVI4CAgAEAgID+gICAAQCAgAOAgICAgICAAAAGAAACgAMAA4AAAwAHAAsADwATABcAABMzFSMlMxUjJTMVIyEzFSMlMxUjJTMVI4CAgAEAgIABAICA/YCAgAEAgIABAICAA4CAgICAgICAgICAAAACAAACgAEAA4AAAwAHAAARMxUjOwEVI4CAgICAA4CAgAAAAAAEAAACgAIAA4AAAwAHAAsADwAAETMVIyUzFSsBMxUjJTMVI4CAAQCAgICAgAEAgIADgICAgICAgAAAAAAGAAACgAMAA4AAAwAHAAsADwATABcAABEzFSMlMxUjJTMVIyEzFSMlMxUjJTMVI4CAAQCAgAEAgID+gICAAQCAgAEAgIADgICAgICAgICAgIAAAAAFAAAAgAGAAwAAAwAHAAsADwATAAABMxUrATMVKwEzFSM7ARUjOwEVIwEAgICAgICAgICAgICAgIADAICAgICAAAAAAAUAAACAAYADAAADAAcACwAPABMAABEzFSM7ARUjOwEVKwEzFSsBMxUjgICAgICAgICAgICAgIADAICAgICAAAARAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwBDAAARMxUjJTMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjJTMVI4CAAYCAgAGAgID9gICAAgCAgP6AgIABAICA/gCAgAGAgIABgICA/gCAgAEAgID+gICAAgCAgP2AgIABgICAAYCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAQAAAAAAYADgAADAAcACwAPAAARMxEjATMRIwUzFSMlMxUjgIABAICA/wCAgAEAgIADgP2AAoD9gICAgIAAAAAEAAAAAAKAA4AACwAPABMAFwAAEyEVIxEzFSMVIxErATMVIyUzESMBMxUjgAGAgICAgICAgIACAICA/wCAgAOAgP8AgIACAICA/wD+gIAAAA8AAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwAAATMVIyUzFSsBMxUrATMVIyUzFSMFMxUjJTMVIyUzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjAQCAgAEAgICAgICAgIABAICA/gCAgAEAgIABAICAAQCAgP2AgIACAICA/YCAgAEAgIABAICAAQCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgAAACAAAAAADgAOAAAMABwALAA8AEwAXABsAHwAAEyEVISUzESMBMxUjJTMRKwEzFSsBMxUjFTMVIyUzFSOAAYD+gAKAgID9AICAAgCAgICAgICAgICAAgCAgAOAgID9gAIAgID/AICAgICAgAAACAAAAAADgAOAAAMABwALAA8AEwAXABsAHwAAETMRIwEhFSEjMxUjJTMRKwEzFSsBMxUjBTMVIyUzFSOAgAGAAYD+gICAgAIAgICAgICAgID+AICAAgCAgAOA/YACgICAgP8AgICAgICAAAAAAwAAAAACAAKAAAUACQANAAARIREjNSEFMxErATMVIwIAgP6AAQCAgICAgAKA/wCAgP8AgAAAAAABAAAAAAMAA4AADwAAESEVMxUjFSMRIxEjESMRIwKAgICAgICAgAOAgICA/gADAP0AAwAABQAAAQABgAKAAAMABwALAA8AEwAAETMVIyUzFSsBMxUrATMVIyUzFSOAgAEAgICAgICAgIABAICAAoCAgICAgICAAAACAAD/gACAAoAAAwAHAAARMxUjETMRI4CAgIACgID+gP8AAAAKAAAAAAGAA4AAAwAHAAsADwATABcAGwAfACMAJwAAETMVIyUzFSsBMxUrATMVIyUzFSMFMxUjJTMVKwEzFSsBMxUjJTMVI4CAAQCAgICAgICAgAEAgID/AICAAQCAgICAgICAgAEAgIADgICAgICAgICAgICAgICAgAAABQAAAAABgAOAAAMABwALAA8AEwAAETMVIyUzESsBMxErATMRIyUzFSOAgAEAgICAgICAgIABAICAA4CAgP8A/oD/AICAAAAACAAAAoAEAAOAAAMABwALAA8AEwAXABsAHwAAEzMVIyUzFSMlMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSOAgIABAICAAQCAgAEAgID8gICAAQCAgAEAgIABAICAA4CAgICAgICAgICAgICAgAAABAAAAQACAAOAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAQD/AICAgAGAgID/AAEA/wADgID+gAGA/oCAAAIAAAEAAIADgAADAAcAABEzFSMVMxEjgICAgAOAgID+gAAAAAIAAAEAAgADgAALAA8AAAEhESM1IREzFSERKwEzFSMBAAEAgP6AgAEAgICAgAOA/YCAAQCAAQCAAAAAAAMAAAEAAgADgAAHAAsADwAAESEVIRUhFSkBMxUjKQEVIQIA/oABAP6AAYCAgP6AAYD+gAOAgICAgIAAAAQAAAEAAgADgAADAAsADwATAAATIRUhIzMVIRUhFSMlMxUjKQEVIYABAP8AgIABAP8AgAGAgID/AAEA/wADgICAgICAgIAAAAMAAAEAAgADgAAHAAsADwAAESERIzUhFSMhMxUrATMRIwIAgP8AgAEAgICAgIADgP8AgICA/wAABwAAAQACAAOAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSEjMxUjJTMVIykBFSGAAQD/AICAgAGAgID/AAEA/wCAgIABgICA/wABAP8AA4CAgICAgICAgIAABAAAAQACAAOAAAMABwAPABMAABMhFSEjMxUjJTMRIzUhNSEBIRUhgAEA/wCAgIABgICA/wABAP8AAQD/AAOAgICA/oCAgP8AgAAAAAEAAAGAAYADAAALAAATMxUzFSMVIzUjNTOAgICAgICAAwCAgICAgAABAAACAAGAAoAAAwAAESEVIQGA/oACgIAAAAAAAgAAAYABgAMAAAMABwAAESEVIRUhFSEBgP6AAYD+gAMAgICAAAAAAAMAAAEAAQADgAADAAcACwAAEzMVKwEzESM7ARUjgICAgICAgICAA4CA/oCAAAAAAAMAAAEAAQADgAADAAcACwAAETMVIzsBESsBMxUjgICAgICAgIADgID+gIAAAgAAAQACAAMAAAUACQAAESEVIREjATMRIwGA/wCAAYCAgAMAgP6AAYD+gAAEAAD/gAIAAgAAAwAHAAsADwAAEyEVISMzESMBMxEjKQEVIYABAP8AgICAAYCAgP8AAQD/AAIAgP6AAYD+gIAAAQAA/4ABgAIAAAsAABMzETMVITUzESM1M4CAgP6AgICAAgD+AICAAQCAAAAFAAD/gAIAAgAAAwAHAAsADwAXAAATIRUhIzMVIyUzFSsBMxUrATMVIRUhNTOAAQD/AICAgAGAgICAgICAgAEA/gCAAgCAgICAgICAgAAAAAcAAP+AAgACAAADAAcACwAPABMAFwAbAAATIRUhIzMVIyUzFSsBMxUjITMVIyUzFSMpARUhgAEA/wCAgIABgICAgICA/wCAgAGAgID/AAEA/wACAICAgICAgICAgAAAAAIAAP+AAgACAAALAA8AAAEhESM1IREzFSERKwEzFSMBAAEAgP6AgAEAgICAgAIA/YCAAQCAAQCAAAAAAAMAAP+AAgACAAAHAAsADwAAESEVIRUhFSkBMxUjKQEVIQIA/oABAP6AAYCAgP6AAYD+gAIAgICAgIAAAAQAAP+AAgACAAADAAsADwATAAATIRUhIzMVIRUhFSMlMxUjKQEVIYABAP8AgIABAP8AgAGAgID/AAEA/wACAICAgICAgIAAAAMAAP+AAgACAAAHAAsADwAAESERIzUhFSMhMxUrATMRIwIAgP8AgAEAgICAgIACAP8AgICA/wAABwAA/4ACAAIAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSEjMxUjJTMVIykBFSGAAQD/AICAgAGAgID/AAEA/wCAgIABgICA/wABAP8AAgCAgICAgICAgIAABAAA/4ACAAIAAAMABwAPABMAABMhFSEjMxUjJTMRIzUhNSEBIRUhgAEA/wCAgIABgICA/wABAP8AAQD/AAIAgICA/oCAgP8AgAAAAAEAAAAAAYABgAALAAATMxUzFSMVIzUjNTOAgICAgICAAYCAgICAgAABAAAAgAGAAQAAAwAAESEVIQGA/oABAIAAAAAAAgAAAAABgAGAAAMABwAAESEVIRUhFSEBgP6AAYD+gAGAgICAAAAAAAMAAP+AAQACAAADAAcACwAAEzMVKwEzESM7ARUjgICAgICAgICAAgCA/oCAAAAAAAMAAP+AAQACAAADAAcACwAAETMVIzsBESsBMxUjgICAgICAgIACAID+gIAAAwAAAAACgAOAAAMABwAXAAATIRUhIzMRIwEhFSEVMxUjFSEVIREjNTOAAYD+gICAgAEAAYD/AICAAQD+gICAA4CA/oABAICAgICAAQCAAAAFAAAAAAKAA4AABwALAA8AEwAbAAATMxUzNTMRISMzESMBMxUjFTMVIykBESM1IxUjgICAgP6AgICAAgCAgICA/oABgICAgAOAgID/AP6AAYCAgID/AICAAAAAAAYAAAAAAoADgAADAAcACwAPABcAGwAAEyEVISMzESMBMxUjByEVISMzETMVITUzJTMVI4ABgP6AgICAAgCAgIABAP8AgICA/oCAAQCAgAOAgP2AAoCAgID/AICAgIAAAAEAAAAAAwADgAARAAATIRUhFSEVIRUzFSMRIxEjNTOAAoD+AAEA/wCAgICAgAOAgICAgID/AAEAgAAAAAMAAAAAAoADgAADABsAHwAAASEVISMzFTMVIxUzFSMVIRUhNTM1IzUzNSM1MyUzFSMBAAEA/wCAgICAgIABgP2AgICAgIABgICAA4CAgICAgICAgICAgICAgAAAAgAA/4ACgAKAAA0AEQAAATMVMxUjESMRIxEjESEFMxEjAQCAgICAgIABAAEAgIACgICA/gACAP6AAgCA/oAAAAIAAAAAA4ADgAAdACEAABMzFTMVIREzETMVIxUzFSMRIxEhESMRIzUzNSM1MxcVITWAgIABAICAgICAgP6AgICAgICAAQADgICAAQD/AICAgP8AAQD/AAEAgICAgICAAAIAAAAAA4ADgAAnACsAABMzFSE1MxUzFSMVMxUjESM1IzUzNSMVIzUjFTMVIxUjESM1MzUjNTMXFSE1gIABgICAgICAgICAgICAgICAgICAgIABgAOAgICAgICA/oCAgICAgICAgAGAgICAgICAAAAEAAAAAAOAAoAABQALAA8AEwAAESEVIREjATMRITUhATMRIyUzESMCAP6AgAMAgP4AAYD/AICA/wCAgAKAgP4AAoD9gIABgP8AgP8AAAAAAAQAAP+AAwADgAARABUAGQAdAAABMxUzFSMRITUhNSM1MzUjNTMFIRUhIzMRIxEhFSECAICAgP4AAYCAgICA/oABAP8AgICAAoD9gAOAgID+AICAgICAgID/AP8AgAAAAAUAAAAAAwADgAADABcAGwAfACMAAAEhFSEjMxUhFSEVIRUhFSM1IzUzNSM1MyUzFSMRMxUjKQEVIQEAAYD+gICAAQD/AAEA/wCAgICAgAIAgICAgP6AAYD+gAOAgICAgICAgICAgICA/oCAgAAAAAADAAAAAAMAA4AAEwAXABsAABMzESE1MxUzFSMVIzUhESMRIzUzATMVIxEzESOAgAEAgICAgP8AgICAAgCAgICAA4D/AICAgICA/gACAIABAID+gP6AAAAAAQAAAAACgAOAABcAABEhFSEVMxUjFTMVIxEjNSM1MzUjNTMRIQKA/wCAgICAgICAgID/AAOAgICAgID/AICAgIABAAAJAAD/gAKAA4AAAwAHAAsADwATABcAGwAfACMAAAEzFSsBMxEjATMRKwEzESMlMxUrATMVIyUzFSMlMxEjKQEVIQGAgICAgIABAICAgICA/wCAgICAgAEAgIABAICA/wABAP8AA4CA/wABAP8A/wCAgICAgID/AIAAAAAAAgAAAAADgAOAABUAGQAAEyEVIRUjFTMVIRUhESMRIzUzNSM1MxcVITWAAgABAICA/wD+gICAgICAgAGAA4CAgICAgP8AAYCAgICAgIAAAAACAAAAAAKAA4AAGQAdAAABMxUhFSEVIREjNSMVMxUjFSM1IzUzESM1MwUzESMBAIABAP8AAQCAgICAgICAgID/AICAA4CAgID/AICAgICAgAGAgID+gAAAAwAAAAADgAOAAAMAHwAjAAABIRUhIzMVITUzFTMVIxUzFSMRIxEhESMRIzUzNSM1MxcVITUBAAGA/oCAgAGAgICAgICA/oCAgICAgIABgAOAgICAgICAgP8AAQD/AAEAgICAgICAAAADAAAAAAOAA4AAAwAXABsAABMhFSkBMxUzFSEVIRUhFSM1IzUhNSE1IQEhFSGAAgD+AAIAgID+gAGA/YCAgAGA/oACgP6AAgD+AAOAgICAgICAgICAgP4AgAAAAAQAAAAAAoADgAATABcAGwAfAAABMxUzFSMRMxUjFSM1IzUzESM1MwUzESMBMxUjFTMVIwEAgICAgICAgICAgP8AgIACAICAgIADgICA/oCAgICAAYCAgP6AAYCAgIAAAAIAAAAAAoADgAATABcAABMzETMRMxEzFSMRIxEjESMRIzUzATMVI4CAgICAgICAgICAAYCAgAOA/wABAP8AgP6AAYD+AAIAgP4AgAAIAAAAAAOAA4AAAwAHAAsADwAVABkAHQAjAAABIRUhIzMVIzMhFSkBMxEjJSEVIxEjATMVKwEzESMBIRUjFSMBgAIA/gCAgICAAYD+gAGAgID9AAEAgIABgICAgICAAQABAICAA4CAgID/AICA/wABgID/AAEAgIAAAAAAAgAAAAACgAOAAAMACwAAESEVIRUhFSERIxEhAoD9gAKA/wCA/wADgICAgP4AAgAABAAAAAACgAOAAA8AEwAXABsAABEhFSMVMxUhFSM1ITUhNSETMxUjOwEVIzsBFSMCgICA/wCA/wABgP6AgICAgICAgICAA4CAgICAgICA/oCAgIAAAwAAAAADAAOAABUAGQAdAAATMxUhFSEVIRUhESEVIREjNTM1IzUzATMVKwEzFSOAgAEA/wABAP8AAQD+gICAgIACAICAgICAA4CAgICA/wCAAQCAgID/AICAAAAJAAAAAAOAA4AAAwAHAAsAFwAbAB8AIwAnACsAABMzFSsBMxUjJSEVISMzFTMVIxEjNSM1MwEzESMlMxUrATMVIyUzFSMFIRUhgICAgICAAQACAP4AgICAgICAgAKAgID/AICAgICAAQCAgP6AAYD+gAOAgICAgICA/wCAgAEA/wCAgICAgICAAAAAAAMAAAAAAoACgAALAA8AEwAAATMVMxUjESMRIzUzBTMRIwEzESMBAICAgICAgP8AgIACAICAAoCAgP6AAYCAgP6AAYD+gAAAAAIAAAAAAwADgAARABUAABMhFSEVIRUhFSEVIREjESM1MwEzFSOAAgD+gAGA/oABAP8AgICAAgCAgAOAgICAgID/AAEAgAGAgAAAAAADAAAAAAMAA4AAEwAXAB8AAAEzFTM1MxUzFSMRIxEjESMRIzUzBTMRIzsBFSEVITUzAQCAgICAgICAgICA/wCAgICAAgD9AIADgICAgID/AAEA/wABAICA/oCAgIAAAAADAAAAAAKAA4AAFwAbAB8AABMzFTM1MxEhFSEVIRUhESM1IxUjNSMRMwUzFSMVMxUjgICAgP6AAYD+gAGAgICAgIABgICAgIADgICA/wCAgID/AICAgAKAgICAgAAAAAAJAAAAAAOAA4AABwALAA8AEwAdACEAJQApAC0AAAEhFSMVIzUrATMVIyUzFSMhMxEjATMVMzUzESEVIwEzESMhMxUjJTMVIykBFSEBAAGAgICAgICAAgCAgP2AgIABAICAgP8AgAIAgID9gICAAgCAgP6AAYD+gAOAgICAgICA/oABgICA/wCAAYD+gICAgIAAAAAAAwAAAYAEAAOAAA0AFQAZAAARIRUzFSMRIxEjESMRIyUzESMRIzUzBTMVIwIAgICAgICAA4CAgICA/wCAgAOAgID/AAGA/oABgID+AAEAgICAAAAAAQAAAAACgAOAAAkAAAEzESE1ITUhNSECAID9gAIA/wABAAOA/ICAgIAAAAAEAAAAAAKAA4AAAwAJAA0AEQAAEyEVISMzETMVIQEzESMpARUhgAGA/oCAgID/AAIAgID+AAIA/gADgID+gIACAP2AgAAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAABMxErATMVIyUzFSMhMxUjJTMVIwEAgICAgIABAICA/oCAgAIAgIADgP2AgICAgICAAAAIAAAAAAKAA4AAAwAHABMAFwAbAB8AIwAnAAARMxUjJSEVISMzFTMVMxUjFSMRIwEzESMhMxUjFzMVIyUzFSsBMxUjgIABAAEA/wCAgICAgICAAYCAgP4AgICAgIABAICAgICAA4CAgICAgICAAQABAP8AgICAgICAAAAACAAAAAAEAAOAAAcACwAPABMAGQAdACEAJQAAEzMRIxEjNTMlMxUrATMRKwEzFSMlIREjNSkBMxEjJTMRIyUzFSOAgICAgAIAgICAgICAgIABAAGAgP8A/oCAgAIAgID9gICAA4D+AAEAgICA/wCAgP8AgP8AgP8AgIAAAAgAAAAABAADgAAHAAsADwATABkAHQAhACUAABMzESMRIzUzJTMVKwEzESsBMxUjJSERIzUhJTMRKwEzFSMlMxUjgICAgIACAICAgICAgICAAQABgID/AP6AgICAgIACgICAA4D+AAEAgICA/wCAgP6AgID/AICAgAAAAAAJAAAAAAQAA4AABwALAA8AEwAbAB8AIwAnACsAABMzESMRIzUzJTMVKwEzESsBMxUjJSEVIxUjNSMhMxEjJTMVIyEzFSMlIRUhgICAgIACAICAgICAgICAAQABgICAgP6AgIACgICA/QCAgAIAAQD/AAOA/gABAICAgP8AgICAgID/AICAgICAAAAAAAoAAAAABAADgAAFAAkADQATABcAHwAjACcAKwAvAAARIREjNSMlMxUrATMRIyUzFTMVISUzFSMlIRUjFSM1IyEzESMlMxUjITMVIyUhFSEBAICAAoCAgICAgP4AgID/AAGAgIABAAGAgICA/oCAgAKAgID9AICAAgABAP8AA4D/AICAgP8AgICAgICAgICA/wCAgICAgAAACQAAAAAEAAOAAAcACwAPABMAGQAdACEAJQApAAATMxEjESM1MyUzFSsBMxErATMVIyUhFSMVISUzESMlMxUjITMVIyUhFSGAgICAgAIAgICAgICAgIABAAGAgP8A/oCAgAKAgID9AICAAgABAP8AA4D+AAEAgICA/wCAgICAgP8AgICAgIAAAAoAAAAABAADgAAFAAkADQATABcAHQAhACUAKQAtAAARIREjNSMlMxUrATMRIyUzFTMVISUzFSMlIRUjFSElMxEjJTMVIyEzFSMlIRUhAQCAgAKAgICAgID+AICA/wABgICAAQABgID/AP6AgIACgICA/QCAgAIAAQD/AAOA/wCAgID/AICAgICAgICAgP8AgICAgIAAAAAACwAAAAAEAAOAAAcACwAPABMAFwAbACEAJQApAC0AMQAAESEVIxUjNSMlMxUrATMRIyUzFSMpARUhJTMVIyUhFSMVISUzESMlMxUjITMVIyUhFSEBgICAgAKAgICAgID/AICA/wABAP8AAYCAgAEAAYCA/wD+gICAAoCAgP0AgIACAAEA/wADgICAgICA/wCAgICAgICAgID/AICAgICAAAgAAAAAA4ADgAAHAAsADwATABcAGwAhACUAABMzESMRIzUzJTMVKwEzESsBMxUjJTMVIyEzESMBMxUhESElMxUjgICAgIACAICAgICAgICAAQCAgP6AgIABAIABAP6A/oCAgAOA/gABAICAgP8AgICA/wABAID/AICAAAAKAAAAAAOAA4AABQAJAA0AEQAVABkAHQAhACcAKwAAESEVIxUhATMVKwEzESMlMxUjKQEVISUzFSMlMxUjITMRIwEzFSERISUzFSMBgID/AAKAgICAgID/AICA/wABAP8AAYCAgAEAgID+gICAAQCAAQD+gP6AgIADgICAAQCA/wCAgICAgICA/wABAID/AICAAAAACAAAAAAEAAOAAAcACwAPABMAGQAdACcAKwAAEzMRIxEjNTMlMxUrATMRKwEzFSMlIREjNSMhMxEjASEVIxUzNTMRISUzFSOAgICAgAIAgICAgICAgIABgAEAgID+AICAAQABAICAgP6A/oCAgAOA/gABAICAgP8AgID/AID/AAEAgICA/wCAgAAAAAAKAAAAAAQAA4AABwALAA8AEwAXABsAIQAlAC8AMwAAESEVIxUjNSMlMxUrATMRIyUzFSMpARUhJTMVIyUhESM1IyEzESMBIRUjFTM1MxEhJTMVIwGAgICAAoCAgICAgP8AgID/AAEA/wABgICAAYABAICA/gCAgAEAAQCAgID+gP6AgIADgICAgICA/wCAgICAgID/AID/AAEAgICA/wCAgAAAAAoAAAAABAADgAAFAAkADQARABUAGQAfACMALQAxAAARIRUjFSEBMxUrATMRIyUzFSMpARUhJTMVIyUhESM1IyEzESMBIRUjFTM1MxEhJTMVIwGAgP8AAoCAgICAgP8AgID/AAEA/wABgICAAYABAICA/gCAgAEAAQCAgID+gP6AgIADgICAAQCA/wCAgICAgID/AID/AAEAgICA/wCAgAAJAAAAAAQAA4AABQAJAA0AEQAVABsAHwApAC0AABEhESM1ISUzFSsBMxEjJTMRIyUzFSMlIREjNSMhMxEjASEVIxUzNTMRISUzFSMBgID/AAKAgICAgID+gICAAQCAgAGAAQCAgP4AgIABAAEAgICA/oD+gICAA4D/AICAgP8AgP8AgICA/wCA/wABAICAgP8AgIAABgAAAAADAAOAAAcACwAPABMAFwAbAAATMxEjESM1MyUzFSsBMxErATMVKwEzESsBMxUjgICAgIACAICAgICAgICAgICAgICAA4D+AAEAgICA/wCA/wCAAAwAAAAABAADgAADAAcACwAPABMAFwAbACMAJwArAC8AMwAAEzMVIyUzFSMhMxEjATMRIwEzESMhMxUjJTMVIyUhFSMVIzUjITMRIyUzFSMhMxUjJSEVIYCAgAIAgID9gICAAQCAgAEAgID+gICAAQCAgAEAAYCAgID+gICAAoCAgP0AgIACAAEA/wADgICAgP8AAQD/AAEA/wCAgICAgICA/wCAgICAgAAAAAABAAAAgAOAAwAADwAAATMRIRUhESM1IzUjNTM1MwEAgAIA/gCAgICAgAMA/wCA/wCAgICAAAAAAAEAAAAAAoADgAAPAAABMxUzFTMVIREjESE1MzUzAQCAgID/AID/AICAA4CAgID+AAIAgIAAAAAAAQAAAIADgAMAAA8AAAEzFTMVMxUjFSMVIxEhNSECAICAgICAgP4AAgADAICAgICAAQCAAAEAAAAAAoADgAAPAAABMxEhFSMVIxUjNSM1IzUhAQCAAQCAgICAgAEAA4D+AICAgICAgAABAAAAgAQAAwAAGwAAATMRIREzFTMVMxUjFSMVIxEhESM1IzUjNTM1MwEAgAEAgICAgICA/wCAgICAgAMA/wABAICAgICAAQD/AICAgIAAAAIAAACAA4ADgAALABcAAAEzFTMVIxUjNSE1IQEzFSEVIRUjNSM1MwKAgICAgP2AAoD+AIACgP2AgICAA4CAgICAgP8AgICAgIAAAAACAAAAgAQAAwAAGwAfAAABMxUzNTMVMxUhFSEVIxUjNSEVIzUjNSE1ITUhBTMVIwGAgICAgP4AAgCAgP6AgIABAP8AAYACAICAAwCAgICAgICAgICAgICAgIAAAAMAAACABAADAAAHAAsAEwAAATMVMxUhNSEFMxUjKQEVIxUjNSECgICA/IACgAEAgID8gAOAgID9gAMAgICAgICAgIAABAAAAIAEAAMAAAsADwATAB8AAAEzFSE1MxUzFSE1MwUzFSMlMxUjKQEVIxUjNSEVIzUjAQCAAQCAgP0AgP8AgIADgICA/QADAICA/wCAgAMAgICAgICAgICAgICAgIAAAgAAAAADAAOAAAsAFwAAEzMRMxUjFSM1IzUzATMVMxUjESMRIzUzgICAgICAgAGAgICAgICAA4D9gICAgIACgICA/YACgIAABgAAAAADgAOAAAMABwAPABMAFwAbAAARMxEjATMRIykBESM1IRUjOwERIwEzESsBMxUjgIADAICA/YACgID+gICAgIABAICAgICAA4D/AAEA/wD/AICA/wABAP8AgAAABQAAAAACAAOAAAMABwALAA8AEwAAEyEVISMzESMBMxUjETMVIykBFSGAAQD/AICAgAGAgICAgP8AAQD/AAOAgP2AAoCA/oCAgAAAAAYAAAAAAoADgAADAAcADwATABcAGwAAASEVISMzFSMlMxEjNSE1IQUzESMlMxUjKQEVIQEAAQD/AICAgAGAgID+gAGA/gCAgAGAgID/AAEA/wADgICAgP4AgICA/wCAgIAAAAABAAAAAAKAA4AACwAAESERITUhESE1IREhAoD9gAIA/gACAP4AA4D8gIABAIABAAADAAD/gAKAA4AADQARABUAABEhESEVIxEzESM1IREpAREzEQERIRECgP4AgICAAQD/AAGAgP8AAQADgPyAgAEAAQCAAQD/AAEA/oD/AAEAAA0AAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzAAABIRUhJTMVIyEzFSMlMxUjITMRIwEzFSMlMxEjATMVKwEzFSsBMxUjJTMVIyEzFSMlIRUhAQABgP6AAgCAgP2AgIACAICA/YCAgAIAgIABAICA/oCAgICAgICAgAIAgID9gICAAQABgP6AA4CAgICAgID+gAGAgID+gAEAgICAgICAgIAAAAAFAAAAAAKAA4AAAwAHAA8AEwAXAAABIRUhIzMVKwEzFSEVIRUjOwEVIzMhFSEBAAGA/oCAgICAgAIA/gCAgICAgAGA/oADgICAgICAgIAAAAYAAAAAAoADgAAFAAkAGQAdACEAJQAAASERIzUhIzMVKwEzFSE1MxUzFSEVIzUjFSM7ARUrATMVIyUhFSEBAAGAgP8AgICAgIABAICA/wCAgICAgICAgIABAAGA/oADgP8AgICAgICAgICAgICAgAAFAAAAAAKAA4AAAwAHAA8AEwAXAAARIRUpATMVIzsBESM1ITUhAzMVIykBFSEBgP6AAYCAgICAgP4AAgCAgID+gAGA/oADgICA/oCAgP8AgIAAAAAGAAAAAAKAA4AAAwAHAAsAGwAhACUAABEhFSElMxUrATMVKwEzFTM1MxEjNSEVIzUjNSEBMxUhFSEBMxUjAYD+gAIAgICAgICAgICAgP8AgIABAP8AgAEA/oABgICAA4CAgICAgID+gICAgID/AICAAQCAAAUAAAAAAoADgAAFAAkADQARABcAABEhFSEVIzsBFSM7ARUrATMVKwEzFSEVIQKA/gCAgICAgICAgICAgIACAP2AA4CAgICAgICAAAABAAABgAKAAgAAAwAAESEVIQKA/YACAIAAAAAAAgAAAAACgAOAAAMADwAAESEVIQUzESEVIREjESE1IQKA/YABAIABAP8AgP8AAQADgICA/wCA/wABAIAAAQGAAQACgAIAAAMAAAEhESEBgAEA/wACAP8AAAMAAAAAAwADgAAHAAsADwAAASEVIREhNTMBMxUjOwEVIwGAAYD/AP8AgP6AgICAgIADgID9AIABAICAAAUAAAAAA4ADgAAHAA8AEwAXABsAABEhFSMVIzUjJSEVIREhNTMBMxUjKQEVIQUzFSMBgICAgAIAAYD/AP8AgP8AgID/AAEA/wABAICAA4CAgICAgP0AgAIAgICAgAAAAAMAAAAAA4ADgAALABMAFwAAEyERIzUhETMVMzUjJSEVIREhNTMlMxUjgAEAgP8AgICAAYABgP8A/wCA/wCAgAOA/gCAAQCAgICA/QCAgIAABgAAAIADAAKAAAMABwALAA8AEwAXAAATIRUhJSEVKQEzESMBMxEjKQEVISUhFSGAAQD/AAGAAQD/AP4AgIABgICA/wABAP8AAYABAP8AAoCAgID/AAEA/wCAgIAAAAAABwAAAIADgAKAAAMABwALAA8AEwAXABsAABMhFSElIRUpATMRIwEzESMBMxEjKQEVISUhFSGAAQD/AAGAAQD/AP4AgIABgICAAYCAgP2AAQD/AAGAAQD/AAKAgICA/wABAP8AAQD/AICAgAAAAgAAAAABgAOAAAMABwAAETMRIwEzESOAgAEAgIADgPyAA4D8gAAAAAUAAACAAoADAAADAAcACwAPABMAAAEzFSsBMxEjATMRIyEzESMBMxEjAQCAgICAgAEAgID+gICAAgCAgAMAgP8AAQD/AP8AAQD/AAAFAAAAgAKAAwAAAwAHAAsADwATAAARMxEjATMRIyEzESMBMxErATMVI4CAAgCAgP6AgIABAICAgICAAwD/AAEA/wD/AAEA/wCAAAAAAwAAAAACgAOAAAMABwALAAATIRUhIzMRIwEzESOAAYD+gICAgAIAgIADgID9AAMA/QAAAAMAAP+AAoADgAADAAcACwAAASEVISMzESMpARUhAYABAP8AgICA/wABAP8AA4CA/QCAAAAFAAD/gAKAA4AAAwAXABsAHwAjAAABIRUhIzMVMxUjFTMVIxEjESM1MzUjNTMFMxUjJTMVIwEhFSEBgAEA/wCAgICAgICAgICAgP8AgIACAICA/gABAP8AA4CAgICAgP8AAQCAgICAgICA/oCAAAAAAwAAAIACgAMAAAMABwALAAABMxUjATMVIyUzFSMBAICA/wCAgAIAgIADAID+gICAgAAAAAMAAACAAoADAAADAAcACwAAETMVIyUzFSMBMxUjgIACAICA/wCAgAMAgICA/oCAAAgAAACAAwADAAADAAcACwAPABMAFwAbAB8AABMhFSElMxUjITMVIyUhFSEFIRUhJTMVIyEzFSMlIRUhgAEA/wACAICA/YCAgAGAAQD/AP8AAQD/AAIAgID9gICAAYABAP8AAwCAgICAgICAgICAgICAAAAABAAAAQADgAKAAAMABwALAA8AABEzFSMlIRUhBTMVIyUhFSGAgAEAAoD9gP8AgIABAAKA/YACgICAgICAgIAAAAEAAAAAAoADAAATAAABMxUzFSERIRUhFSM1IzUhESE1IQGAgID/AAEA/oCAgAEA/wABgAMAgID/AICAgIABAIAAAAAAAwAAAIADAAMAAAMABwALAAARIRUhFSEVIRUhFSEDAP0AAwD9AAMA/QADAICAgICAAAAAAAEAAAAAAwADgAAbAAABMxUzFSEVIRUhFSEVIRUjNSM1ITUhNSE1ITUhAgCAgP8AAQD+gAGA/gCAgAEA/wABgP6AAgADgICAgICAgICAgICAgIAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAATMVKwEzFSsBMxUjOwEVIzsBFSMFIRUhAYCAgICAgICAgICAgICAgP6AAoD9gAOAgICAgICAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATMxUjOwEVIzsBFSsBMxUrATMVIwchFSGAgICAgICAgICAgICAgICAAoD9gAOAgICAgICAgAAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAABIRUhIzMVKwEzESM7ARUjMyEVIQEAAYD+gICAgICAgICAgIABgP6AA4CAgP6AgIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAARIRUpATMVIzsBESsBMxUjKQEVIQGA/oABgICAgICAgICA/oABgP6AA4CAgP6AgIAAAAAHAAAAAAKAA4AABQAJABEAFQAZAB0AIQAAASERIzUhIzMVKwEzETMRIzUjATMVKwEzFSMBMxUjJSEVIQEAAYCA/wCAgICAgICAgAGAgICAgID/AICAAQABgP6AA4D/AICA/wD/AIABgICA/wCAgIAABwAAAAACgAOAAAMABwAPABMAFwAdACEAABEhFSElMxUrATMVMxEjESsBMxUrATMVKwEzFSEVIQEzFSMBgP6AAgCAgICAgICAgICAgICAgIABAP6AAYCAgAOAgICAgP6AAQCAgICAAQCAAAAABAAAAAACgAOAAAMABwALAA8AABMhFSEjMxEjMyEVIQchFSGAAgD+AICAgIACAP4AgAKA/YADgID+gICAgAAAAAQAAAAAAoADgAADAAcACwAPAAARIRUpATMRIykBFSEVIRUhAgD+AAIAgID+AAIA/gACgP2AA4CA/oCAgIAAAAABAAAAgAKAAwAABwAAETMRIRUhESOAAgD+AIADAP8AgP8AAAABAAAAgAKAAwAABwAAESEVIREjESECgP8AgP8AAwCA/gACAAABAAAAgAKAAwAABwAAATMRIRUhNSEBAIABAP2AAQADAP4AgIAAAAAAAQAAAIACgAMAAAsAABEzFSEVIRUhFSEVI4ACAP4AAgD+AIADAICAgICAAAAGAAAAgAKAAwAAAwAHAAsADwATABcAABEzFSMlMxUjITMVIyUzFSsBMxUjBSEVIYCAAgCAgP6AgIABAICAgICA/wACgP2AAwCAgICAgICAgIAAAAAGAAAAgAKAAwAAAwAHAAsADwATABcAABEhFSEFMxUrATMVIyUzFSMhMxUjJTMVIwKA/YABAICAgICAAQCAgP6AgIACAICAAwCAgICAgICAgIAAAAAGAAAAgAKAAwAAAwAHAAsADwATABcAABEhFSEVMxUjJTMVIyEzFSMlMxUrATMVIwKA/YCAgAIAgID+gICAAQCAgICAgAMAgICAgICAgICAAAMAAAAAAoADgAADAAcACwAAETMRIwEzESMpARUhgIACAICA/oABgP6AA4D9AAMA/QCAAAAFAAABAAGAAoAAAwAHAAsADwATAAARMxUjJTMVKwEzFSsBMxUjJTMVI4CAAQCAgICAgICAgAEAgIACgICAgICAgIAAAA0AAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzAAABIRUhJTMVIyEzFSMlMxUjITMRIwEzFSMlMxEjATMVKwEzFSsBMxUjJTMVIyEzFSMlIRUhAQABgP6AAgCAgP2AgIACAICA/YCAgAIAgIABAICA/oCAgICAgICAgAIAgID9gICAAQABgP6AA4CAgICAgID+gAGAgID+gAEAgICAgICAgIAAAAAGAAAAAAOAA4AAAwAHAAsADwATABsAAAEzFSsBMxUjJTMVIyEzFSMlMxUjITMRIREzESEBgICAgICAAQCAgP6AgIACAICA/YCAAoCA/IADgICAgICAgID+gAGA/gAAAAAKAAAAAAOAA4AAAwAHAAsAJwArAC8AMwA3ADsAPwAAEzMVIyUzFSMhMxUjJTMVMzUzFTMVIxUzFSMVIzUjFSM1IzUzNSM1MxcVMzUBMxUjATMVIyUzFSMhMxUjJTMVI4CAgAIAgID9gICAAQCAgICAgICAgICAgICAgICAAQCAgP0AgIADAICA/YCAgAIAgIADgICAgICAgICAgICAgICAgICAgICAgAEAgP6AgICAgICAAAAEAAAAAAOAA4AACQANABEAFQAAEyEVIREzFSERISMzESMBMxEjKQEVIYACgP8AgP8A/wCAgIADAICA/YACgP2AA4CA/wCAAYD9gAKA/YCAAAQAAAAAA4ADgAALAA8AEwAfAAARIRUjESMRIREjESMBMxUjJTMVIyEzESERMxEzFSE1MwOAgID+gICAAQCAgAEAgID+gIABgICA/ICAA4CA/wABAP8AAQD/AICAgP8AAQD/AICAAAAAAwGA/4ADgAOAAAMABwALAAABIRUhIzMRIwEzESMCAAEA/wCAgIABgICAA4CA/IADgP8AAAMAAP+AAgADgAADAAcACwAAATMRIwEzESMzIRUhAYCAgP6AgICAAQD/AAOA/IABAP8AgAACAAAAgAKAAwAACwAPAAABMxUzFTMVITUzNTMBIRUhAQCAgID9gICA/wACgP2AAwCAgICAgP6AgAAAAAABAAAAgAMAAwAAFwAAETMVMxUzETMVMxUzFSMVIxUjESMVIxUjgICAgICAgICAgICAAwCAgAEAgICAgIABAICAAAAAAAEAAACAAwADAAAXAAABMxEzNTM1MxEjNSM1IxEjNSM1IzUzNTMBAICAgICAgICAgICAgAMA/wCAgP2AgID/AICAgIAAAQAAAIADgAMAABsAABEzFTMVMxEzFTMVMxEzESMRIxUjFSMRIxUjFSOAgICAgICAgICAgICAgAMAgIABAICAAQD9gAEAgIABAICAAAEAAACAA4ADAAAbAAARMxEzNTM1MxEzNTM1MxEjNSM1IxEjNSM1IxEjgICAgICAgICAgICAgIADAP8AgID/AICA/YCAgP8AgID/AAACAAAAgAMAAwAADwATAAARMxUzFTMRMxEjESMVIxUjATMRI4CAgICAgICAAoCAgAMAgIABAP2AAQCAgAKA/YAAAQAAAIABgAMAAAsAAAEzESM1IzUjNTM1MwEAgICAgICAAwD9gICAgIAAAAABAAAAgAGAAwAACwAAETMVMxUzFSMVIxUjgICAgICAAwCAgICAgAAAAQAAAQACgAKAAAsAAAEzFTMVMxUhNTM1MwEAgICA/YCAgAKAgICAgIAAAAABAAABAAKAAoAACwAAESEVIxUjFSM1IzUjAoCAgICAgAKAgICAgIAAAgAAAIABgAMAAAMABwAAETMRIwEzESOAgAEAgIADAP2AAoD9gAAAAAEAAACAAoADAAADAAARIREhAoD9gAMA/YAAAAABAAAAgAKAAwAACwAAEyEVMxEjFSE1IxEzgAGAgID+gICAAwCA/oCAgAGAAAgAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AAAEzESMBMxUjJTMVIyEzESMBMxEjITMVIyUzFSMpARUhAYCAgP8AgIACAICA/YCAgAMAgID9gICAAgCAgP6AAYD+gAOA/oABAICAgP6AAYD+gICAgIAAAAAACQAAAAADgAOAAAMABwALAA8AEwAXABsAHwAjAAABIRUhIzMVIyUzFSMhMxEjATMRIwEzESMhMxUjJTMVIykBFSEBAAGA/oCAgIACAICA/YCAgAGAgIABgICA/YCAgAIAgID+gAGA/oADgICAgID+gAGA/oABgP6AgICAgAAAAAABAAAAAACAA4AAAwAAETMRI4CAA4D8gAABAAABAAQAAYAAAwAAESEVIQQA/AABgIAAAAAAAQGA/4ACgAOAAAMAAAEhESEBgAEA/wADgPwAAAEBgP+ABAABgAAFAAABIRUhESEBgAKA/oD/AAGAgP6AAAAAAAEAAP+AAoABgAAFAAARIREhESECgP8A/oABgP4AAYAAAQGAAQAEAAOAAAUAAAEhESEVIQGAAQABgP2AA4D+AIAAAAAAAQAAAQACgAOAAAUAAAEhESE1IQGAAQD9gAGAA4D9gIAAAAAAAQGA/4AEAAOAAAcAAAEhESEVIREhAYABAAGA/oD/AAOA/gCA/oAAAAEAAP+AAoADgAAHAAABIREhESE1IQGAAQD/AP6AAYADgPwAAYCAAAABAAD/gAQAAYAABwAAESEVIREhESEEAP6A/wD+gAGAgP6AAYAAAAAAAQAAAQAEAAOAAAcAAAEhESEVITUhAYABAAGA/AABgAOA/gCAgAAAAAEAAP+ABAADgAALAAABIREhFSERIREhNSEBgAEAAYD+gP8A/oABgAOA/gCA/oABgIAAAAACAAABAAQAAoAAAwAHAAARIRUhFSEVIQQA/AAEAPwAAoCAgIAAAAAAAgEA/4ADgAOAAAMABwAAASERIQEhESEBAAEA/wABgAEA/wADgPwABAD8AAABAYD/gAQAAoAACQAAASEVIRUhFSERIQGAAoD+gAGA/oD/AAKAgICA/oAAAAEBAP+ABAABgAAJAAABIRUjESERIxEhAQADAID/AID/AAGAgP6AAYD+gAAAAgEA/4AEAAKAAAUACwAAASEVIREhASEVIxEhAQADAP4A/wABgAGAgP8AAoCA/YACAID+gAAAAAABAAD/gAKAAoAACQAAESERIREhNSE1IQKA/wD+gAGA/oACgP0AAYCAgAAAAAEAAP+AA4ABgAAJAAARIREhESMRIREhA4D/AID/AP8AAYD+AAGA/oABgAAAAgAA/4ADgAKAAAUACwAAESERIREhFSERIREhA4D/AP2AAgD/AP8AAoD9AAKAgP4AAYAAAAEBgAEABAADgAAJAAABIREhFSEVIRUhAYABAAGA/oABgP2AA4D/AICAgAAAAQEAAQAEAAOAAAkAAAEhETMRIREzFSEBAAEAgAEAgP0AA4D+AAIA/gCAAAACAQABAAQAA4AABQALAAABIREhFSEBIREzFSEBAAEAAgD9AAGAAQCA/oADgP4AgAKA/wCAAAAAAAEAAAEAAoADgAAJAAABIREhNSE1ITUhAYABAP2AAYD+gAGAA4D9gICAgAAAAQAAAQADgAOAAAkAAAEhETMRIREhNSEBAAEAgAEA/IABAAOA/gACAP2AgAACAAABAAOAA4AABQALAAABIREhNSEBIREhNSEBAAEA/gABAAGAAQD8gAKAA4D+gIABAP2AgAAAAAEBgP+ABAADgAALAAABIREhFSEVIRUhESEBgAEAAYD+gAGA/oD/AAOA/wCAgID+gAAAAAACAQD/gAQAA4AAAwALAAABIREhASERMxUjESEBAAEA/wABgAEAgID/AAOA/AAEAP4AgP6AAAAAAAMBAP+ABAADgAADAAkADwAAASERIQEhETMVIRUhFSMRIQEAAQD/AAGAAQCA/oABgID/AAOA/AAEAP8AgICA/oAAAAAAAQAA/4ACgAOAAAsAAAEhESERITUhNSE1IQGAAQD/AP6AAYD+gAGAA4D8AAGAgICAAAAAAAIAAP+AA4ADgAAHAAsAAAEhESERITUhASERIQEAAQD/AP8AAQABgAEA/wADgPwAAYCAAgD8AAAAAwAA/4ADgAOAAAUACQAPAAABIREhNSEBIREhASERIREhAQABAP4AAQABgAEA/wD9gAIA/wD/AAOA/oCAAQD8AAIA/gABgAAAAgAA/4AEAAKAAAMACwAAESEVIRUhFSERIREhBAD8AAQA/oD/AP6AAoCAgID+gAGAAAAAAAEAAP+ABAABgAALAAARIRUjESERIxEhESEEAID/AID/AP8AAYCA/oABgP6AAYAAAAMAAP+ABAACgAADAAkADwAAESEVIRUhESERISUhFSMRIQQA/AACAP8A/wACgAGAgP8AAoCAgP4AAYCAgP6AAAACAAABAAQAA4AABwALAAABIREhFSE1IQEhFSEBgAEAAYD8AAGA/oAEAPwAA4D/AICA/wCAAAAAAAEAAAEABAADgAALAAABIREzESERMxUhNSEBAAEAgAEAgPwAAQADgP4AAgD+AICAAAMAAAEABAADgAAFAAsADwAAASERITUhASERMxUhBSEVIQEAAQD+AAEAAYABAID+gP2ABAD8AAOA/oCAAQD/AICAgAAAAQAA/4AEAAOAABMAAAEhESEVIRUhFSERIREhNSE1ITUhAYABAAGA/oABgP6A/wD+gAGA/oABgAOA/wCAgID+gAGAgICAAAAAAQAA/4AEAAOAABMAAAEhETMRIREzFSMRIREjESERITUhAQABAIABAICA/wCA/wD/AAEAA4D+AAIA/gCA/oABgP6AAYCAAAAABAAA/4AEAAOAAAUACwARABcAAAEhESE1IQEhETMVIQUhESERISUhFSMRIQEAAQD+AAEAAYABAID+gP2AAgD/AP8AAoABgID/AAOA/oCAAQD/AICA/gABgICA/oAAAAAAAQAAAYAEAAOAAAMAABEhESEEAPwAA4D+AAAAAAEAAP+ABAABgAADAAARIREhBAD8AAGA/gAAAAABAAD/gAQAA4AAAwAAESERIQQA/AADgPwAAAAAAQAA/4ACAAOAAAMAABEhESECAP4AA4D8AAAAAAECAP+ABAADgAADAAABIREhAgACAP4AA4D8AAAQAAD/gAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIwEAgIACAICA/QCAgAIAgID/AICAAgCAgP0AgIACAICA/wCAgAIAgID9AICAAgCAgP8AgIACAICA/QCAgAIAgIADgICAgICAgICAgICAgICAgICAgICAgICAgAAAACAAAP+ABAADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AABMzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjITMVIyUzFSMlMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjITMVIyUzFSMlMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjgICAAQCAgAEAgIABAICA/ICAgAEAgIABAICAAQCAgP2AgIABAICAAQCAgAEAgID8gICAAQCAgAEAgIABAICA/YCAgAEAgIABAICAAQCAgPyAgIABAICAAQCAgAEAgID9gICAAQCAgAEAgIABAICA/ICAgAEAgIABAICAAQCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAABwAA/4AEAAOAACkALQAxADUAOQA9AEEAABEhFTM1IRUjFTMVMzUjNTM1IREjFTMRIxUhNSM1IxUzFSERMzUjETM1IwUVMzUdATM1BRUzNSEVMzUFFTM1HQEzNQEAgAEAgICAgIABAICAgP6AgICA/oCAgICAAQCAgP8AgAEAgP8AgIADgICAgICAgICA/oCA/oCAgICAgAEAgAGAgICAgICAgICAgICAgICAgICAAAABAAAAgAKAAwAAAwAAESERIQKA/YADAP2AAAAAAgAAAIACgAMAAAMABwAAESERIRMRIRECgP2AgAGAAwD9gAIA/oABgAAAAAABAAAAgAKAA4AACwAAATMRMxEzESERMxEzAQCAgID9gICAA4D/AP8A/wABAAEAAAAEAAAAgAKAA4AAAwAHAAsAEwAAATMRKwEzESMBMxEjITMVITUzESEBAICAgICAAQCAgP6AgAGAgP2AA4D/AP8AAQD/AICA/wAAAAAAAQAAAIADAAMAAAsAABEhFSEVIRUhFSEVIQEAAQABAP8A/wD/AAMAgICAgIAAAAAABAAAAIADAAMAAAcACwAPABMAABEhFSMRMxUhASEVKQIVKQIVIQEAgID/AAEAAQD/AAEAAQD/AP8AAQD/AAMAgP6AgAIAgICAAAAAAAEAAACAAoADgAALAAARIREjESMRIxEjESMCgICAgICAA4D/AP8A/wABAAEAAAAAAAQAAACAAoADgAAHAAsADwATAAARIREjNSEVIzsBESMBMxErATMRIwKAgP6AgICAgAEAgICAgIADgP8AgID/AAEA/wD/AAAAAAEAAACAAwADAAALAAABIREhNSE1ITUhNSECAAEA/wD/AP8AAQABAAMA/YCAgICAAAQAAACAAwADAAAHAAsADwATAAABIREhNTMRIykBFSkCFSkCFSECAAEA/wCAgP8AAQD/AP8AAQD/AAEAAQD/AAMA/YCAAYCAgIAAAAABAAAAgAKAAwAAEwAAATMVMxUzFSMVIxUjNSM1IzUzNTMBAICAgICAgICAgIADAICAgICAgICAgAAAAAAIAAAAgAKAAwAAAwAHAAsADwATABcAGwAfAAABMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVIwEAgICAgIABAICA/oCAgAIAgID+gICAAQCAgICAgAMAgICAgICAgICAgIAAAAQAAACAAoADAAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAwCA/oABgP6AgAAKAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwAAASEVISMzFSMlMxUjITMRIwEhESETFTM1JTMRIyEzFSMlMxUjKQEVIQEAAYD+gICAgAIAgID9gICAAQABgP6AgIABAICA/YCAgAIAgID+gAGA/oADgICAgID+gAGA/oABAICAgP6AgICAgAAAAAEAAACAAgACgAALAAATIRUzESMVITUjETOAAQCAgP8AgIACgID/AICAAQAAAgAAAQABgAKAAAMABwAAESERIRMVMzUBgP6AgIACgP6AAQCAgAAAAAQAAAEAAYACgAADAAcACwAPAAATMxUrATMVIyUzFSsBMxUjgICAgICAAQCAgICAgAKAgICAgIAADQAA/4AEAAOAAAMABwALAA8AEwAfACMAJwArAC8AMwA3ADsAABEzFSMlMxUjJTMVIyEzFSMlMxUjKQEVMxEjFSE1IxEzITMVIyEzFSMXMxUjJTMVIyEzFSMlMxUjJTMVI4CAAYCAgAIAgID9AICAAoCAgP6AAQCAgP8AgIACAICA/ICAgICAgAKAgID9AICAAgCAgAGAgIADgICAgICAgICAgP8AgIABAICAgICAgICAgICAAAAAAAcAAACABAADgAADAAcACwAPABMAFwAbAAABIRUhIzMVIyUzESMlIRUhIzMRIwEzESMpARUhAgABAP8AgICAAYCAgP2AAQD/AICAgAOAgID9AAMA/QADgICAgP8AgID/AAEA/wCAAAAABgAA/4ADgAOAAAMABwALABcAGwAfAAABIRUhIzMVIyUzFSMhMxUhNTMRIREjESETMxUjOwEVIwEAAYD+gICAgAIAgID9gIACgID+gID+gICAgICAgAOAgICAgICA/wD+gAGA/wCAgAAIAAD/gAOAA4AAAwAHAAsAGwAfACMAJwArAAATMxUjJSEVISUzFSMhMxEhETMVMxUjFSERIxEjJTMVIzsBESMBMxEjKQEVIYCAgAEAAQD/AAGAgID+AIABAICAgP8AgID/AICAgICAAoCAgP4AAgD+AAOAgICAgID/AAEAgICA/wABAICA/oABgP6AgAAAAAALAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAAABMxUjJTMVIyEzFSMlMxUrATMVIykBFSElMxUjITMRIwEzESMBMxUjBSEVIQGAgIABgICA/gCAgAGAgICAgID+gAEA/wACgICA/QCAgAGAgIABAICA/gABAP8AA4CAgICAgICAgICA/wABAP8AAQCAgIAAAQAAAAADgAOAABMAAAEzFTMVIREjESE1IxUhESMRITUzAYCAgAEAgP8AgP8AgAEAgAOAgID/AP6AgIABgAEAgAAAAAAIAAAAAAOAA4AAAwAHAAsAEQAXAB0AIwAnAAABMxUrATMVIyUzFSMpARUjFSMBIREjNSMFMxEzFSEBMxEhNTMlMxUjAYCAgICAgAEAgID+AAEAgIACgAEAgID+AICA/wACAID/AID/AICAA4CAgICAgIABAP8AgID/AIABgP6AgICAAAAFAAAAAAOAA4AACQANABEAFQAdAAARIRUjFSM1IREjATMVKwEzFSM7ARUjJTMRITUzNTMDgICA/gCAAgCAgICAgICAgAEAgP6AgIADgICAgP0AAoCAgICA/oCAgAAAAAAJAAD/gAOAA4AABQAJAA0AEQAVABkAJQApAC0AAAEzFSEVIQEzFSMhMxUjJTMVIyEzFSMlMxUjITMVITUzESERIxEhFzMVIzsBFSMBAIABAP6AAYCAgP2AgIADAICA/YCAgAIAgID9gIACgID+gID+gICAgICAgAOAgIABAICAgICAgICAgP8A/wABAICAgAACAAAAAAOAA4AAGwAfAAATIRUzESMRIzUjESERIREjESERIREjFSMRIxEzATMVI4ACgICAgIABAP8AgP8AAQCAgICAAQCAgAOAgP4A/wCAAQABAP8AAQD/AP8AgAEAAgD9gIAAAwAAAIACgAMAAAMABwALAAARIRUhFSEVIRUhFSECgP2AAoD9gAKA/YADAICAgICAAAAAAAQAAACAAoADAAADAAcACwAPAAARIRUhJSEVIQUhFSEVIRUhAQD/AAGAAQD/AP6AAoD9gAKA/YADAICAgICAgIAAAAAABAAAAIACgAMAAAMABwALAA8AABEhFSEVIRUhJSEVIQUhFSECgP2AAQD/AAGAAQD/AP6AAoD9gAMAgICAgICAgAAAAAAFAAAAgAKAAwAAAwAHAAsADwATAAARIRUhJSEVIQUhFSElIRUhBSEVIQEA/wABgAEA/wD+gAEA/wABgAEA/wD+gAKA/YADAICAgICAgICAgAAAAAAEAAAAgAKAAwAAAwAHAAsADwAAESEVIRUhFSEVIRUhJSEVIQKA/YACgP2AAQD/AAGAAQD/AAMAgICAgICAgAAABQAAAIACgAMAAAMABwALAA8AEwAAESEVISUhFSEFIRUhFSEVISUhFSEBAP8AAYABAP8A/oACgP2AAQD/AAGAAQD/AAMAgICAgICAgICAAAAFAAAAgAKAAwAAAwAHAAsADwATAAARIRUhFSEVISUhFSEFIRUhJSEVIQKA/YABAP8AAYABAP8A/oABAP8AAYABAP8AAwCAgICAgICAgIAAAAYAAACAAoADAAADAAcACwAPABMAFwAAESEVISUhFSEFIRUhJSEVIQUhFSElIRUhAQD/AAGAAQD/AP6AAQD/AAGAAQD/AP6AAQD/AAGAAQD/AAMAgICAgICAgICAgIAAAAUAAACAAoADAAADAAcACwAPABMAABMzESMBMxEjBSEVISMzFSMlMxUjgICAAQCAgP8AAYD+gICAgAIAgIADAP8AAQD/AICAgICAAAAFAAAAgAKAAwAAAwAHAAsADwATAAATMxEjATMRIwUzFSMlMxUjKQEVIYCAgAEAgID+gICAAgCAgP6AAYD+gAMA/wABAP8AgICAgIAABgAAAAADgAOAAAsADwATABcAGwAfAAATIRUzESMVITUjETsBETMRMxEzEQEVMzUhFTM1BRUhNYACgICA/YCAgICAgID+AIABgID+AAGAA4CA/YCAgAKA/wABAP8AAQD+gICAgICAgIAAAAAAAQAA/4AEAAOAABsAAAEhFTMVMxEjFSMVITUjNSMRMxUzFSE1MxEjNSMCAAEAgICAgP4AgICAgAGAgICAA4CAgP4AgICAgAEAgICAAYCAAAACAAAAAAGAAwAADwATAAARIREjFTMVIxUjNSM1MzUjExUzNQGAgICAgICAgICAAwD+gICAgICAgAEAgIAAAAAAAwAAAIACgAMAAAcACwAPAAABIREjNSM1IwUhESETFTM1AQABgICAgP8AAYD+gICAAwD+gICAgP6AAQCAgAAAAAEAAAAAAoADAAATAAABMxUzFTMRIRUzFSE1MzUhETM1MwEAgICA/wCA/oCA/wCAgAMAgID/AICAgIABAIAAAAAIAAAAAAKAAwAAAwAHAAsADwATABcAGwAfAAATMxUjJTMVIyEzESMBMxUjJTMRIyEzFSMlMxUrATMVI4CAgAEAgID+gICAAQCAgAEAgID+gICAAQCAgICAgAMAgICA/oABgICA/oCAgICAAAAIAAAAAAKAAwAAAwAHAAsADwATABcAGwAfAAABMxUrATMVIyUzFSMhMxEjATMRIyEzFSMlMxUrATMVIwEAgICAgIABAICA/oCAgAIAgID+gICAAQCAgICAgAMAgICAgP8AAQD/AICAgIAAAAABAAAAAAKAAwAADwAAEyERMxEhFTMVITUzNSERM4ABgID/AID+gID/AIADAP8A/wCAgICAAQAAAAYAAAAAAoADAAADAAcACwARABcAHwAAATMVKwEzFSMlMxUjITMVMxUhATMRITUzBTMVMxUhNTMBAICAgICAAQCAgP6AgID/AAIAgP8AgP8AgID+gIADAICAgICAgAEA/wCAgICAgAAAAQAAAAACgAMAABMAABMzFTM1MxUzESMVIxUjNSM1IxEzgICAgICAgICAgIADAICAgP6AgICAgAGAAAAAAQAAAAACgAMAABMAAAEzFTMVMxEjFSMVIzUjNSMRMzUzAQCAgICAgICAgICAAwCAgP8AgICAgAEAgAAABAAAAAACgAMAAAcADQATABsAABMhESM1IxUrATMVMxUhATMRITUzBTMVMxUhNTOAAYCAgICAgID/AAIAgP8AgP8AgID+gIADAP8AgICAgAEA/wCAgICAgAAAAAABAAAAAAGAA4AABQAAATMRIREhAQCA/oABAAOA/IABAAAAAAABAAAAAAKAA4AACwAAASEVMxEjNSMRIREhAQABAICAgP6AAQADgID/AID9gAEAAAACAAAAAAOAA4AABwAPAAABIREhESERKQIVIxEhESECAAGA/oABAP8A/wABAID+gAEAA4D9AAEAAYCA/YABAAAAAgAAAAADgAOAAAsADwAAASERIREhESERIREhExUhNQEAAoD+gAEA/oD+gAEAgAGAA4D8gAEAAQD+AAEAAgCAgAAAAAABAAAAAAGAA4AACwAAETMRIREjESMRMxUhgAEAgICA/wADgP6A/oABAP8AgAAAAAACAAAAAAGAA4AACwAPAAARMxEzNTMRIxEjFSMTFTM1gICAgICAgIADgP8AgP0AAQCAAYCAgAAAAAIAAAAAAoADgAAbAB8AAAEzFTMVIxUzFSMRIzUjESM1IzUzNSM1MxEzFTMHFTM1AYCAgICAgICAgICAgICAgICAA4CAgICA/wCA/wCAgICAAQCAgICAAAACAAAAAAOAA4AAAwAHAAARIREhARUzNQOA/IABgIADgPyAAgCAgAAAAwAAAAADgAOAAAMABwALAAARIREhExUzNQEVMzUDgPyAgIABgIADgPyAAwCAgP4AgIAAAAQAAAAAA4ADgAADAAcACwAPAAARIREhExUzNRMVMzUTFTM1A4D8gICAgICAgAOA/IADAICA/wCAgP8AgIAAAAAFAAAAAAOAA4AAAwAHAAsADwATAAARIREhExUzNSEVMzUBFTM1IRUzNQOA/ICAgAGAgP2AgAGAgAOA/IADAICAgID+AICAgIAAAAAABgAAAAADgAOAAAMABwALAA8AEwAXAAARIREhExUzNSEVMzUBFTM1ARUzNSEVMzUDgPyAgIABgID+gID+gIABgIADgPyAAwCAgICA/wCAgP8AgICAgAAAAAcAAAAAA4ADgAADAAcACwAPABMAFwAbAAARIREhExUzNSEVMzUBFTM1IRUzNQEVMzUhFTM1A4D8gICAAYCA/YCAAYCA/YCAAYCAA4D8gAMAgICAgP8AgICAgP8AgICAgAAAAAAEAAD/gAOAA4AACQARABUAGQAAESEVIREhFSERIwEhESE1MxEjKQEVIREhFSEBgP8AAQD/AIACgAEA/wCAgP8AAQD/AAEA/wADgID+gID+gAQA/YCAAYCA/oCAAAEAAP+AA4ADgAANAAARIRUhNSERIRUhNSERIwGAAQABAP8A/wD/AIADgICA/YCAgP6AAAAIAAD/gAOAA4AAAwAHAAsAGwAfACMAJwArAAABMxUrATMVIyUzFSsBMxUzFSMRMxUhNTMRIzUzBTMRIwEzESMhMxUjJTMVIwGAgICAgIABAICAgICAgID+gICAgP6AgIADAICA/YCAgAIAgIADgICAgICAgP6AgIABgICA/wABAP8AgICAAAAAEQAAAAADgAOAAAMABwALAA8AEwAXABsAHwAjACcAKwAvADMANwA7AD8AQwAAETMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVIyEzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSOAgAMAgID9gICAAgCAgP6AgIABAICAgICA/oCAgAEAgIABAICAAQCAgP2AgIACAICA/YCAgAEAgIABAICAAQCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAUAAP+AA4ADgAAJAA0AEQAVACUAAAEhESMVIxEzNSEjMxUrATMVKwEzFSsBMxUhNTMRIxUjFSE1IzUjAgABgICAgP8AgICAgICAgICAgIACgICAgP6AgIADgP6AgAEAgICAgICA/wCAgICAAAUAAAAAAoADgAADAAcAEwAXABsAAAEzFSsBMxUrATMVIRUjFSM1ITUzEzMVKwEzFSMBgICAgICAgIABgICA/oCAgICAgICAA4CAgICAgICA/wCAgAAAAAADAAD/gAKAA4AABwAXABsAAAEhESM1IzUjBSERIxUzFSMVIzUjNTM1IxMVMzUBAAGAgICA/wABgICAgICAgICAgAOA/oCAgID+gICAgICAgAEAgIAAAAAABQAA/4ADAAOAAAMADwATABcAGwAAASEVISMzESERMxEhESMRKwEzESMBMxEjKQEVIQEAAQD/AICAAQCA/wCAgICAgAKAgID+AAIA/gADgID/AAEA/oD/AAEA/oABgP6AgAAAAAgAAP+ABAADgAADAAcACwAPABMAFwAjACcAAAEhFSEjMxUjJTMRIyUhFSEjMxEjATMRIyUzFSEVIxUjNSE1IREzFSMCAAEA/wCAgIABgICA/YABAP8AgICAA4CAgP6AgAEAgID+AAGAgIADgICAgP8AgID/AAEA/wCAgICAgID/AIAAAAYAAP+ABAADgAALAA8AEwAXABsAHwAAASEVMxUzESMRIREhATMVKwEzFSsBMxUrATMVKwEzFSMBAAIAgICA/wD+gAEAgICAgICAgICAgICAgIADgICA/gABgAEA/wCAgICAgAAHAAD/gAOAA4AABwATABcAGwAfACMAJwAAESERIxEhESMBMxUzFSMVIzUjNTMBMxUjJTMVIyEzFSMlMxUrATMVIwOAgP2AgAGAgICAgICA/wCAgAIAgID+gICAAQCAgICAgAOA/YACAP4AAYCAgICAgP8AgICAgICAgAAAAQAAAAADgAOAACEAAAEhFSMVIxUhESMVMzUhETM1MzUzESMVIxUhFSERMxEzNTMBgAGAgID/AICAAQCAgICAgP8A/oCAgIADgICAgP8AgIABAICA/oCAgIABgAEAgAAABgAAAAADgAMAAAMACwAXABsAHwAjAAARIREhARUzFTM1MzUFESERIxUjFSM1IzUxMxUjJTMVKwEzFSMDgPyAAQCAgID+AAKAgICAgICAAQCAgICAgAMA/QACgICAgICA/oABgICAgICAgICAAAAAAAsAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwArAC8AAAEzFSsBMxUjJTMVIyEzFSMlMxUjJTMVIyEzFSMlMxUjITMVIyUzESE1MzUzITMVIwEAgICAgIABAICA/oCAgAEAgIABAICA/oCAgAIAgID+gICAAgCA/oCAgP6AgIADgICAgICAgICAgICAgICA/oCAgIAAAAAAAQAAAAADAAOAABcAAAEzESMRIxEjFSM1IzUjETMVMxUzETMRMwKAgICAgICAgICAgICAA4D/AP8A/wCAgIABAICAAQABAAAAAQAAAAADAAOAABsAAAEzESMVIxUzESM1IRUjFSMRMzUzNSMRMxUhNTMCgICAgICA/wCAgICAgIABAIADgP8AgID/AICAgAEAgIABAICAAAAQAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAATMVIyUzFSMhMxUjJTMRIwEzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzESMBMxUjITMVIyUzFSMhMxUjJTMVIwEAgIABAICA/gCAgAGAgIABgICA/YCAgAIAgID+gICAAQCAgP6AgIABAICAAQCAgP2AgIADAICA/gCAgAEAgIADgICAgICA/wABAICAgICAgICAgP8AAQCAgICAgICAAAABAAAAAAMAA4AAIwAAETMVMxUhNTM1MxEjFSMVMxUzESM1IzUhFSMVIxEzNTM1IzUjgIABAICAgICAgICA/wCAgICAgIADgICAgID/AICAgP8AgICAgAEAgICAAAIAAAAAAoADgAATABcAABMzFTM1MxUzESMVIxUjNSM1IxEzEzMVI4CAgICAgICAgICAgICAA4CAgID/AICAgIABAP2AgAAAAAEAAAAAA4ADgAAXAAATIRUzNSEVMxEjFSMVIxUjNSM1IzUjETOAAQCAAQCAgICAgICAgIADgICAgP6AgICAgICAAYAAAQAAAAACgAOAAAcAAAEzESEVITUhAQCAAQD9gAEAA4D9AICAAAAAAAEAAAAAAoADgAALAAARIRUhETMVIxUjESECgP8AgICA/wADgID+AICAAwAABAAAAAADgAOAAAMABwALAA8AABEhESETESERBSERIRMVMzUDgPyAgAKA/gABgP6AgIADgPyAAwD9gAKAgP6AAQCAgAABAAAAAAOAA4AAGwAAATMRIRUjFSMVMxEjNSM1IxUjFSMRMzUjNSM1IQGAgAGAgICAgICAgICAgIABgAOA/wCAgID/AICAgIABAICAgAAAAAgAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AAAEhFSEjMxUjJTMVIyEzESMBMxEjITMVIyUzFSMpARUhAQABgP6AgICAAgCAgP2AgIADAICA/YCAgAIAgID+gAGA/oADgICAgID+gAGA/oCAgICAAAADAAAAAAOAA4AADwAVABsAAAEzFTMVIxEjFSERIxEhNTMFIREjNSMVMxEhNTMBgICAgID/AIABAIABAAEAgICA/wCAA4CAgP4AgAGAAQCAgP8AgID+gIAAAwAAAAADgAOAAA8AFQAbAAABMxUzFSERIxEhNSMRIzUzBSEVIxUjOwERMxUhAYCAgAEAgP8AgICA/oABAICAgICA/wADgICA/wD+gIACAICAgID/AIAAAAMAAAAAAwACgAANABEAFQAAEyEVMxEhNSM1MzUhNSETFSE1EzMVI4ABgID+AICAAQD/AIABAICAgAKAgP4AgICAgP8AgIABgIAAAAAEAAAAAAKAA4AADQARABUAGQAAATMRMxUjESE1MxEjNTMlMxUjATMVIyUzFSMBAICAgP8AgICAAQCAgP4AgIABgICAA4D/AID+gIABAICAgP4AgICAAAAAAwAAAAACgAOAAAMADQARAAATIRUhJTMRITUhESM1MyEzESOAAQD/AAGAgP4AAYCAgP4AgIADgICA/ICAAgCA/YAAAAACAAAAAAKAA4AACwAPAAARMxEhETMRIzUhFSMzIRUhgAGAgID+gICAAYD+gAOA/gACAP0AgICAAAYAAAAAA4ACgAADAAkADQARABUAGQAAETMRIwEhFSMRIwEzFSMFMxUjJTMVKwEzFSOAgAIAAQCAgAEAgID9gICAAQCAgICAgAKA/oABgID/AAEAgICAgICAAAAAAgAAAAACgAKAAAcACwAAESEVIREhFSEBMxUjAgD+gAIA/YACAICAAoCA/oCAAgCAAAAAAAQAAP+AAwACgAADAAkADQARAAARMxEjATMRITUhFzMVIykBFSGAgAIAgP4AAYCAgID+AAIA/gACgP6AAYD+AICAgIAABAAA/4ADAAKAAAUACQANABEAABEhFSERIwEzESM7ARUjKQEVIQIA/oCAAgCAgICAgP4AAgD+AAKAgP6AAYD+gICAAAAEAAAAAAKAA4AACwAPABMAFwAAEyEVIxUzFSE1MzUjAzMRIwEzESMpARUhgAGAgID+gICAgICAAgCAgP6AAYD+gAOAgICAgID/AP6AAYD+gIAAAAACAAD/gAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/gACAP2AAAQAAP+AAoACgAAFAAkADQARAAARIRUjESMBMxUrATMRIwEzESMBAICAAYCAgICAgAEAgIACgID+AAKAgP2AAoD+AAAAAgAAAAADAAOAAAsADwAAESERIRUhESEVIREjATMRIwEAAYD+gAGA/gCAAoCAgAOA/wCA/oCAAwD/AP6AAAAAAAQAAAAAAoACgAAHAAsADwATAAARIRUjETMVIQEzFSsBMxEjATMRIwEAgID/AAGAgICAgIABAICAAoCA/oCAAoCA/oABgP4AAAIAAAAAAoACgAAFAAkAABEhFSERIwEzESMCAP6AgAIAgIACgID/AAEA/gAAAgAA/4ACgAOAAAcADwAAETMVIRUhESMBMxEjESE1IYABgP6AgAIAgID+gAGAA4CAgP6AAYD9AAEAgAAABAAAAAACgAKAAAUACQANABMAABEhFSMRIwEzFSsBMxEjATMRITUzAQCAgAGAgICAgIABAID/AIACgID+AAKAgP6AAYD+AIAABAAAAAACgAOAAAMACwAPABMAABEhFSkBMxEjESE1IQUzESMzIRUhAgD+AAIAgID+gAGA/gCAgIABgP6AA4CA/YABgICA/oCAAAAAAAMAAAAAAoADgAADAAsADwAAEyEVISMzFSEVIREjATMRI4ACAP4AgIABgP6AgAIAgIADgICAgP4AAgD+AAAAAAAEAAAAAAKAAoAAAwAHAA0AEQAAETMRIwEzESMBMxEhNTMhMxUjgIABAICAAQCA/wCA/oCAgAKA/gACAP4AAgD9gICAAAIAAAAAAwACgAAFAAsAABEhESMRIyUzESE1IQEAgIACgID+AAGAAoD+AAGAgP2AgAAAAAACAAD/gAMAA4AABwANAAABMxEjESE1IQEhESMRIwKAgID+gAGA/YABAICAA4D8AAEAgAGA/oABAAAAAAADAAAAAAKAA4AACQANABEAAAEzETMVIxEhNTMBMxEjATMRIwEAgICA/wCA/wCAgAIAgIADgP8AgP4AgAIA/gABgP4AAAIAAAAAAoADgAADAAkAABEzESMBMxEhNSGAgAIAgP4AAYADgP0AAgD9gIAABAAA/4ACgAKAAAsADwATABcAABEzFTMVIxUhFSEVIwEhFSkBMxEjASEVIYCAgAGA/oCAAQABAP8AAQCAgP6AAgD+AAKAgICAgIACgID/AP8AgAAABAAA/4ACgAOAAAcACwAPABMAAAEzESM1IzUzATMRIwEzESsBMxUjAgCAgICA/gCAgAEAgICAgIADgPwAgIACAP4AAgD+AIAABQAA/4ACgAKAAAMABwALABcAGwAAEzMVIyUzFSMhMxEjATMRMxUjFSM1IzUzATMRI4CAgAEAgID+gICAAQCAgICAgIABAICAAoCAgID+gAGA/oCAgICAAYD+gAABAAD/gAKAA4AACwAAATMRIRUhESMRITUhAQCAAQD/AID/AAEAA4D/AID9gAKAgAACAAAAAAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/gACAP4AAAIAAP+AAoACgAADAAsAABEzESMBMxEjNSE1IYCAAgCAgP6AAYACgP4AAgD9AICAAAMAAP+AAoACgAADAAsADwAAETMRIwEzESM1ITUhASEVIYCAAgCAgP6AAYD+AAIA/gACgP6AAYD9gICA/wCAAAACAAD/gAKAA4AABwALAAARMxEhFSERIwEzESOAAYD+gIACAICAA4D/AID9gAKA/gAAAAAAAwAA/4ACgAKAAAUACQANAAARIRUhESMBMxEjBSEVIQIA/oCAAgCAgP6AAgD+AAKAgP4AAgD+gICAAAAAAwAAAAACgAOAAA0AEQAVAAABMxEzFSMRITUzESM1MwUzESMBMxEjAQCAgID/AICAgP8AgIACAICAA4D/AID+AIABgICA/oABgP4AAAQAAP+AAoACgAAFAAkADQARAAARIRUjESMBMxUrATMRIwEzESMBAICAAYCAgICAgAEAgIACgID9gAMAgP4AAgD+AAAABAAA/4ADAAKAAAcACwAPABMAABEhFSERIRUhATMVIxMzFSMpARUhAgD+gAIA/YACAICAgICA/gACAP4AAoCA/wCAAYCA/wCAgAAAAAMAAP+AAoACgAAHAAsADwAAETMRIRUhFSMBMxEjASEVIYABgP6AgAIAgID+gAIA/gACgP6AgIACgP6A/wCAAAAHAAD/gAKAAoAABwALAA8AEwAXABsAHwAAESERIzUhFSM7ARUjJTMVKwEzFSsBMxUjJSEVKQEzFSMCgID+gICAgIABAICAgICAgICAAQABAP8A/oCAgAKA/wCAgICAgICAgICAAAAAAAMAAAAAAoACgAAFAAsADwAAESEVIxEjATMRITUzATMRIwEAgIACAID/AID/AICAAoCA/gACgP2AgAGA/oAAAAACAAD/gAKAA4AABwALAAARMxEhFSERIwEzFSOAAYD+gIACAICAA4D/AID9gAKAgAAEAAAAAAKAAoAAAwAHAAsADwAAESEVKQEzESMBMxEjMyEVIQIA/gACAICA/gCAgIABgP6AAoCA/oABAP8AgAAAAgAA/4ACgAOAAAcACwAAATMRIzUhNSEBMxEjAgCAgP6AAYD+AICAA4D8AICAAgD+AAAAAAMAAP+AAoACgAADAAcADwAAETMRIwEzESMpARUjESMRI4CAAgCAgP6AAYCAgIACgP6AAYD+gID/AAEAAAMAAAAAAoADgAAPABMAFwAAASEVIREzFSMRITUzESM1MwUzESMBMxEjAQABgP8AgID/AICAgP8AgIACAICAA4CA/wCA/oCAAYCAgP6AAQD+gAAAAAQAAP+AAoADAAADAA8AEwAXAAABMxUjFTMRMxUhNTMRIzUzBTMRIyUzFSMBAICAgID+gICAgP8AgIACAICAAwCAgP4AgIABAICA/wCAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMRIwEzFSMFMxUjOwEVIxUzFSOAAYD+gICAgAIAgID+gICAgICAgIADgID/AAEAgICAgICAAAAAAgAAAIAAgAOAAAMABwAAETMRIxEzFSOAgICAA4D/AP6AgAAAAQAAAAACgAOAAAsAAAEzESEVIREjESE1IQEAgAEA/wCA/wABAAOA/gCA/wABAIAAAQAA/4AAgACAAAMAADUzESOAgID/AAAAAQAAAAACgAOAABsAAAEzFSEVIRUhFSEVIRUhFSM1ITUhNSE1ITUhNSEBAIABAP8AAQD/AAEA/wCA/wABAP8AAQD/AAEAA4CAgICAgICAgICAgICAAAAAAAIAAAAAAoADAAADAAsAABEhFSEVIRUhESMRIQKA/YACgP8AgP8AAwCAgID+gAGAAAMAAAAAAoADgAADAAcADwAAATMRKwEzFSsBMxEhNTMRIQEAgICAgICAgAGAgP2AA4D+gID/AID/AAAAAAIAAP+AAoADgAALAA8AABEzESERMxEjESERIykBFSGAAYCAgP6AgAEAAQD/AAOA/wABAPyAAgD+AIAAAAQAAP+AAoADgAAHAAsADwATAAARMxEzFSMRIwEhFSkBMxEjKQEVIYCAgIABAAEA/wABAICA/wABAP8AA4D+gID+gAKAgP4AgAAAAAAEAAD/gAOAA4AADQARABUAGQAAESEVIRUhESM1IREjESEBIRUpATMRIykBFSECgP8AAgCA/oCA/wACAAEA/wABAICA/wABAP8AA4CAgP8AgP4AAwD+gID/AIAAAAQAAP+AAwADgAANABEAFQAZAAATMxEhESM1IREjESM1MwEhFSkBMxEjKQEVIYCAAgCA/oCAgIABAAEA/wABAICA/wABAP8AA4D/AP8AgP4AAgCA/wCA/wCAAAAAAQAAAAACgAKAAAkAABEhFSEVIRUhESMCgP4AAQD/AIACgICAgP8AAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxUjMyEVKQEzFSMpARUhgAIA/gCAgICAAYD+gAGAgID+AAIA/gACgICAgICAAAUAAAAABAACgAADAAcAEwAXABsAABMhFSElMxEjATMRMxUhNSE1ITUhBTMVIyUzFSOAAYD+gAMAgID+gICA/YABgP6AAYD+AICAAwCAgAKAgID+gAEA/oCAgICAgICAgAAAAAADAAAAAAQAAoAAAwAZAB0AABMhFSElMxEjFSM1IxUzFSE1ITUhNSE1MxUhBTMVI4ABgP6AAwCAgICAgP2AAYD+gAGAgAEA/ICAgAKAgID+gICAgICAgICAgICAAAYAAAAAAoADgAADAAcADQARABUAGQAAESEVKQEzFSMpARUhFSM7ARUjOwEVIzsBFSMCAP4AAgCAgP6AAYD/AICAgICAgICAgIADgICAgICAgIAAAAQAAAAAAgACgAADAAcADQARAAARIRUpATMVIykBESM1IwUzFSMBgP6AAYCAgP8AAQCAgAEAgIACgICA/wCAgIAAAAAABgAAAAACgAOAAAMABwALAA8AEwAXAAARMxUjJSEVISMzFSMlMxEjATMRIzMhFSGAgAEAAQD/AICAgAGAgID+AICAgAGA/oADgICAgICA/YACAP4AgAAAAAEAAAAAAoADgAAFAAARIREjESECgID+AAOA/IADAAAAAgAA/4ABAAMAAAMABwAAETMVIzsBESOAgICAgAMAgP0AAAAABwAAAAADAAOAAAMABwARABUAGQAdACEAABMhFSEjMxUjMyEVMxEjESM1ISUzFSMFMxUjITMVIzMhFSGAAgD+AICAgIABgICAgP8AAgCAgP6AgID/AICAgAGA/oADgICAgP6AAQCAgICAgICAAAAAAAMAAAAAAoACgAARABUAGQAAEyEVIxEjFTMVITUhNSM1ITUhIzMVIwUzFSOAAgCAgID+AAEAgAEA/wCAgIACAICAAoCA/wCAgICAgICAgIAABgAAAAACgAKAAAMABwALAA8AEwAXAAATIRUhIzMRIwEzESsBMxUjKQEVISUzFSOAAYD+gICAgAIAgICAgID/AAEA/wABgICAAoCA/oABgP8AgICAgAAAAAUAAAAAAoADgAADAAsADwATABcAABEzESMBMxEjESE1ISUzFSMVMxUrATMVI4CAAgCAgP8AAQD+gICAgICAgIADgP6AAYD8gAEAgICAgICAAAAAAAMAAAAAA4ADgAADAAcAGwAAASEVISUhFSkBMxUhNTMVIRUhESMRIREjESM1MwEAAQD/AAGAAQD/AP4AgAEAgAEA/wCA/wCAgIADgICAgICAgID+AAIA/gACAIAAAgAAAAACgAOAAAMAEQAAASEVISMzFSERIxEhESMRIzUzAQABgP6AgIABgID/AICAgAOAgID9gAIA/gACAIAAAAIAAAAAAwADgAARABUAAAEhESMRIREjESM1MzUzFSE1IQEzFSMBAAGAgP8AgICAgAEA/wABgICAA4D9AAGA/gACAICAgID9gIAAAAADAAAAAAQAA4AAAwAHAB0AAAEhFSElIRUpATMVITUzFSERIxEhESMRIREjESM1MwEAAQD/AAGAAYD+gP4AgAEAgAGAgP8AgP8AgICAA4CAgICAgID9gAIA/gACAP4AAgCAAAAAAwAAAAACgAOAAA0AEQAVAAATIREzFSMRIxEjNTM1ISMzESMlMxUjgAGAgICAgID/AICAgAIAgIADgP8AgP6AAYCAgP0AgIAAAgAAAIAAgAKAAAMABwAAETMRIxUzFSOAgICAAoD/AICAAAAAAwAAAIABgAKAAAMABwALAAARMxEjATMRIwUhFSGAgAEAgID/AAGA/oACgP8AAQD/AICAAAQAAAAAAoADgAADAAsADwAVAAARMxUjFTMRMxUjFSMBMxEjATMRITUhgICAgICAAQCAgAEAgP4AAYADgICA/wCAgAIA/wABAP2AgAADAAAAAAKAAoAAAwALAA8AABEhFSkBMxEzFSE1IQEzFSMBgP6AAYCAgP2AAYD/AICAAoCA/oCAgAEAgAACAAAAAAGAAoAAAwAHAAABMxEjATMVIwEAgID/AICAAoD9gAGAgAAABAAAAAACAAKAAAMABwALAA8AABEhFSkBMxEjATMVIwchFSEBgP6AAYCAgP8AgICAAYD+gAKAgP6AAQCAgIAAAAQAAAAAAoACgAAFAAkADQARAAARIRUhESMBMxEjATMVIwUhFSECAP6AgAIAgID/AICA/wACAP4AAoCA/wABAP6AAQCAgIAAAAIAAAAAAoACgAANABEAABEhFSEVMxUjESE1MxEjITMRIwIA/wCAgP8AgIACAICAAoCAgID/AIABgP4AAAIAAAAAAQADgAADAAcAABMzFSMHMxEjgICAgICAA4CAgP2AAAMAAAAAAoADgAADAAcADwAAESEVIRUhFSkBMxEzFSE1IQGA/oABgP6AAYCAgP2AAYADgICAgP6AgIAAAAQAAAAAAoADgAADAAsADwATAAATIRUhByEVIRUhFSEBMxEjKQEVIYABgP6AgAIA/oABAP6AAgCAgP4AAgD+AAOAgICAgIABAP6AgAABAAAAAAKAAoAACwAAATMRIRUhESMRITUhAQCAAQD/AID/AAEAAoD/AID/AAEAgAADAAD/gAOAA4AABwAlACkAAAEzFTMVITUzBTMVIRUjFTM1MxEzFTMRIxUjFSM1IxUjNSM1IxEzATMVIwGAgID+gID/AIABAICAgICAgICAgICAgIABAICAA4CAgICAgICAgAEAgP8AgICAgICAAQD+AIAAAAAAFAD2AAEAAAAAAAAAAwAIAAEAAAAAAAEACQAgAAEAAAAAAAIABwA6AAEAAAAAAAMACQBWAAEAAAAAAAQAEQCEAAEAAAAAAAUACwCuAAEAAAAAAAYACQDOAAEAAAAAAAkADgD2AAEAAAAAAA0AEwEtAAEAAAAAABMABgFPAAMAAQQJAAAABgAAAAMAAQQJAAEAEgAMAAMAAQQJAAIADgAqAAMAAQQJAAMAEgBCAAMAAQQJAAQAIgBgAAMAAQQJAAUAFgCWAAMAAQQJAAYAEgC6AAMAAQQJAAkAHADYAAMAAQQJAA0AJgEFAAMAAQQJABMADAFBACgAYwApAAAoYykAAE0AaQBuAGUAYwByAGEAZgB0AABNaW5lY3JhZnQAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAE0AaQBuAGUAYwByAGEAZgB0AABNaW5lY3JhZnQAAE0AaQBuAGUAYwByAGEAZgB0ACAAUgBlAGcAdQBsAGEAcgAATWluZWNyYWZ0IFJlZ3VsYXIAAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAAVmVyc2lvbiAxLjAAAE0AaQBuAGUAYwByAGEAZgB0AABNaW5lY3JhZnQAAE0AbwBqAGEAbgBnACAAUwB0AHUAZABpAG8AcwAATW9qYW5nIFN0dWRpb3MAAEEAbABsACAAcgBpAGcAaAB0AHMAIAByAGUAcwBlAHIAdgBlAGQAAEFsbCByaWdodHMgcmVzZXJ2ZWQAAEgAZQBsAGwAbwAhAABIZWxsbyEAAAIAAAAAAAAAZgAzAAAAAAAAAAAAAAAAAAAAAAAAAAAEogAAAQIAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAowCEAIUAvQCWAOgAhgCOAIsAnQCpAKQBAwCKANoAgwCTAQQBBQCNAJcAiADDAQYAngCqAPUA9AD2AKIA8ACRAO0AiQDqALgAoQDuAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMApgEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwDcAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwACbAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oAsgCzALYAtwDEALQAtQDFAIIAwgCHAKsAxgN7A3wDfQN+A38DgAOBAL4AvwOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgD3A68DsAOxA7IDswO0A7UDtgO3A7gDuQO6A7sDvAO9A74DvwPAA8EDwgPDA8QDxQPGA8cDyACMA8kDygPLA8wDzQPOA88D0APRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wPgA+ED4gPjA+QD5QPmA+cAmAPoA+kD6gPrA+wD7QPuAJkA7wPvA/AApQPxA/ID8wCSA/QD9QP2A/cAnAP4A/kD+gCnA/sAjwP8A/0AlACVA/4D/wQABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKQQqBCsELAQtBC4ELwQwBDEEMgQzBDQENQQ2BDcEOAQ5BDoEOwQ8BD0EPgQ/BEAEQQRCBEMERARFBEYERwRIBEkESgRLBEwETQROBE8EUARRBFIEUwRUBFUEVgRXBFgEWQRaBFsEXARdBF4EXwRgBGEEYgRjBGQEZQRmBGcEaARpBGoEawRsBG0EbgRvBHAEcQRyBHMEdAR1BHYEdwR4BHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBJQElQSWBJcEmASZBJoEmwScBJ0EngSfBKAEoQSiBKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBNwE3QTeBN8E4AThBOIE4wTkBOUE5gTnBOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BQAFAQUCBmdseXBoMQd1bmkwMEFEB3VuaTAwQjIHdW5pMDBCMwd1bmkwMEI5AklKAmlqDGtncmVlbmxhbmRpYwVsb25ncwd1bmkwMTgxB3VuaTAxODQHdW5pMDE4NQd1bmkwMTg2B3VuaTAxODkHdW5pMDE4RQd1bmkwMThGB3VuaTAxOTAHdW5pMDE5MQd1bmkwMTlBB3VuaTAxOUIHdW5pMDE5RQd1bmkwMTlGB3VuaTAxQTcHdW5pMDFBOAd1bmkwMUE5B3VuaTAxQUEHdW5pMDFCMgd1bmkwMUI3B3VuaTAxQjgHdW5pMDFCOQd1bmkwMUJCB3VuaTAxQkMHdW5pMDFCRAd1bmkwMUJFB3VuaTAxQkYHdW5pMDFDMAd1bmkwMUMxB3VuaTAxQzIHdW5pMDFDMwd1bmkwMUM5B3VuaTAxREQHdW5pMDFGNwd1bmkwMjFDB3VuaTAyMUQHdW5pMDIyMAd1bmkwMjIxB3VuaTAyMjQHdW5pMDIyNQd1bmkwMjM0B3VuaTAyMzUHdW5pMDIzNgd1bmkwMjNBB3VuaTAyM0IHdW5pMDIzQwd1bmkwMjNEB3VuaTAyM0UHdW5pMDI0MQd1bmkwMjQyB3VuaTAyNDMHdW5pMDI0NAd1bmkwMjQ1B3VuaTAyNDYHdW5pMDI0Nwd1bmkwMjQ4B3VuaTAyNDkHdW5pMDI0QQd1bmkwMjRCB3VuaTAyNEMHdW5pMDI0RAd1bmkwMjRFB3VuaTAyNEYHdW5pMDI1MAd1bmkwMjUxB3VuaTAyNTIHdW5pMDI1Mwd1bmkwMjU0B3VuaTAyNTUHdW5pMDI1Ngd1bmkwMjU3B3VuaTAyNTgHdW5pMDI1OQd1bmkwMjVBB3VuaTAyNUIHdW5pMDI1Qwd1bmkwMjVEB3VuaTAyNUUHdW5pMDI1Rgd1bmkwMjYwB3VuaTAyNjEHdW5pMDI2Mgd1bmkwMjY0B3VuaTAyNjUHdW5pMDI2Ngd1bmkwMjY3B3VuaTAyNjgHdW5pMDI2QQd1bmkwMjZCB3VuaTAyNkMHdW5pMDI2RAd1bmkwMjZFB3VuaTAyNkYHdW5pMDI3MAd1bmkwMjcxB3VuaTAyNzIHdW5pMDI3Mwd1bmkwMjc0B3VuaTAyNzUHdW5pMDI3Nwd1bmkwMjc4B3VuaTAyNzkHdW5pMDI3QQd1bmkwMjdCB3VuaTAyN0MHdW5pMDI3RQd1bmkwMjdGB3VuaTAyODAHdW5pMDI4MQd1bmkwMjg0B3VuaTAyODUHdW5pMDI4Ngd1bmkwMjg3B3VuaTAyODgHdW5pMDI4OQd1bmkwMjhBB3VuaTAyOEIHdW5pMDI4Qwd1bmkwMjhEB3VuaTAyOEUHdW5pMDI4Rgd1bmkwMjkxB3VuaTAyOTIHdW5pMDI5Mwd1bmkwMjk0B3VuaTAyOTUHdW5pMDI5Ngd1bmkwMjk3B3VuaTAyOTgHdW5pMDI5OQd1bmkwMjlBB3VuaTAyOUIHdW5pMDI5Qwd1bmkwMjlEB3VuaTAyOUUHdW5pMDI5Rgd1bmkwMkEwB3VuaTAyQTEHdW5pMDJBMgd1bmkwMkFDB3VuaTAyQkIHdW5pMDJDQwd1bmkwMzdFCWFub3RlbGVpYQVBbHBoYQRCZXRhBUdhbW1hB3VuaTAzOTQHRXBzaWxvbgRaZXRhA0V0YQVUaGV0YQRJb3RhBUthcHBhBkxhbWJkYQJNdQJOdQJYaQdPbWljcm9uAlBpA1JobwVTaWdtYQNUYXUHVXBzaWxvbgNQaGkDQ2hpA1BzaQd1bmkwM0E5BWFscGhhBGJldGEFZ2FtbWEFZGVsdGEHZXBzaWxvbgR6ZXRhA2V0YQV0aGV0YQRpb3RhBWthcHBhBmxhbWJkYQd1bmkwM0JDAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQd1bmkwM0RCB3VuaTA0MDIHdW5pMDQwNAd1bmkwNDA1B3VuaTA0MDYHdW5pMDQwOAd1bmkwNDA5B3VuaTA0MEEHdW5pMDQwQgd1bmkwNDEwB3VuaTA0MTEHdW5pMDQxMgd1bmkwNDEzB3VuaTA0MTQHdW5pMDQxNQd1bmkwNDE2B3VuaTA0MTcHdW5pMDQxOAd1bmkwNDFBB3VuaTA0MUIHdW5pMDQxQwd1bmkwNDFEB3VuaTA0MUUHdW5pMDQxRgd1bmkwNDIwB3VuaTA0MjEHdW5pMDQyMgd1bmkwNDIzB3VuaTA0MjQHdW5pMDQyNQd1bmkwNDI2B3VuaTA0MjcHdW5pMDQyOAd1bmkwNDI5B3VuaTA0MkEHdW5pMDQyQgd1bmkwNDJDB3VuaTA0MkQHdW5pMDQyRQd1bmkwNDJGB3VuaTA0MzAHdW5pMDQzMQd1bmkwNDMyB3VuaTA0MzMHdW5pMDQzNAd1bmkwNDM1B3VuaTA0MzYHdW5pMDQzNwd1bmkwNDM4B3VuaTA0M0EHdW5pMDQzQgd1bmkwNDNDB3VuaTA0M0QHdW5pMDQzRQd1bmkwNDNGB3VuaTA0NDAHdW5pMDQ0MQd1bmkwNDQyB3VuaTA0NDMHdW5pMDQ0NAd1bmkwNDQ1B3VuaTA0NDYHdW5pMDQ0Nwd1bmkwNDQ4B3VuaTA0NDkHdW5pMDQ0QQd1bmkwNDRCB3VuaTA0NEMHdW5pMDQ0RAd1bmkwNDRFB3VuaTA0NEYHdW5pMDQ1NAd1bmkwNDU1B3VuaTA0NTYHdW5pMDQ1OAd1bmkwNDU5B3VuaTA0NUEHdW5pMDQ2Mgd1bmkwNDYzB3VuaTA0NzIHdW5pMDQ3Mwd1bmkwNDc0B3VuaTA0NzUHdW5pMDQ5Mgd1bmkwNDkzB3VuaTA0OTYHdW5pMDQ5Nwd1bmkwNDlBB3VuaTA0OUIHdW5pMDRBMgd1bmkwNEEzB3VuaTA0QUUHdW5pMDRBRgd1bmkwNEIwB3VuaTA0QjEHdW5pMDRCQQd1bmkwNEJCB3VuaTA0QzAHdW5pMDREOAd1bmkwNEQ5B3VuaTA0RTgHdW5pMDRFOQd1bmkwNTAwB3VuaTA1MzEHdW5pMDUzMgd1bmkwNTMzB3VuaTA1MzQHdW5pMDUzNQd1bmkwNTM2B3VuaTA1MzcHdW5pMDUzOAd1bmkwNTM5B3VuaTA1M0EHdW5pMDUzQgd1bmkwNTNDB3VuaTA1M0QHdW5pMDUzRQd1bmkwNTNGB3VuaTA1NDAHdW5pMDU0MQd1bmkwNTQyB3VuaTA1NDMHdW5pMDU0NAd1bmkwNTQ1B3VuaTA1NDYHdW5pMDU0Nwd1bmkwNTQ4B3VuaTA1NDkHdW5pMDU0QQd1bmkwNTRCB3VuaTA1NEMHdW5pMDU0RAd1bmkwNTRFB3VuaTA1NEYHdW5pMDU1MAd1bmkwNTUxB3VuaTA1NTIHdW5pMDU1Mwd1bmkwNTU0B3VuaTA1NTUHdW5pMDU1Ngd1bmkwNTU5B3VuaTA1NUEHdW5pMDU1Qgd1bmkwNTVDB3VuaTA1NUQHdW5pMDU1RQd1bmkwNTVGB3VuaTA1NjAHdW5pMDU2MQd1bmkwNTYyB3VuaTA1NjMHdW5pMDU2NAd1bmkwNTY1B3VuaTA1NjYHdW5pMDU2Nwd1bmkwNTY4B3VuaTA1NjkHdW5pMDU2QQd1bmkwNTZCB3VuaTA1NkMHdW5pMDU2RAd1bmkwNTZFB3VuaTA1NkYHdW5pMDU3MAd1bmkwNTcxB3VuaTA1NzIHdW5pMDU3Mwd1bmkwNTc0B3VuaTA1NzUHdW5pMDU3Ngd1bmkwNTc3B3VuaTA1NzgHdW5pMDU3OQd1bmkwNTdBB3VuaTA1N0IHdW5pMDU3Qwd1bmkwNTdEB3VuaTA1N0UHdW5pMDU3Rgd1bmkwNTgwB3VuaTA1ODEHdW5pMDU4Mgd1bmkwNTgzB3VuaTA1ODQHdW5pMDU4NQd1bmkwNTg2B3VuaTA1ODcHdW5pMDU4OAd1bmkwNThBB3VuaTA1OEYHdW5pMDVCRQd1bmkwNUMzB3VuaTA1QzYHdW5pMDVEMAd1bmkwNUQxB3VuaTA1RDIHdW5pMDVEMwd1bmkwNUQ0B3VuaTA1RDUHdW5pMDVENgd1bmkwNUQ3B3VuaTA1RDgHdW5pMDVEOQd1bmkwNURBB3VuaTA1REIHdW5pMDVEQwd1bmkwNUREB3VuaTA1REUHdW5pMDVERgd1bmkwNUUwB3VuaTA1RTEHdW5pMDVFMgd1bmkwNUUzB3VuaTA1RTQHdW5pMDVFNQd1bmkwNUU2B3VuaTA1RTcHdW5pMDVFOAd1bmkwNUU5B3VuaTA1RUEHdW5pMDVGMAd1bmkwNUYxB3VuaTA1RjIHdW5pMDVGMwd1bmkwNUY0B3VuaTA3QzgHdW5pMTBBMAd1bmkxMEExB3VuaTEwQTIHdW5pMTBBMwd1bmkxMEE0B3VuaTEwQTUHdW5pMTBBNgd1bmkxMEE3B3VuaTEwQTgHdW5pMTBBOQd1bmkxMEFBB3VuaTEwQUIHdW5pMTBBQwd1bmkxMEFEB3VuaTEwQUUHdW5pMTBBRgd1bmkxMEIwB3VuaTEwQjEHdW5pMTBCMgd1bmkxMEIzB3VuaTEwQjQHdW5pMTBCNQd1bmkxMEI2B3VuaTEwQjcHdW5pMTBCOAd1bmkxMEI5B3VuaTEwQkEHdW5pMTBCQgd1bmkxMEJDB3VuaTEwQkQHdW5pMTBCRQd1bmkxMEJGB3VuaTEwQzAHdW5pMTBDMQd1bmkxMEMyB3VuaTEwQzMHdW5pMTBDNAd1bmkxMEM1B3VuaTEwQzcHdW5pMTBDRAd1bmkxMEQwB3VuaTEwRDEHdW5pMTBEMgd1bmkxMEQzB3VuaTEwRDQHdW5pMTBENQd1bmkxMEQ2B3VuaTEwRDcHdW5pMTBEOAd1bmkxMEQ5B3VuaTEwREEHdW5pMTBEQgd1bmkxMERDB3VuaTEwREQHdW5pMTBERQd1bmkxMERGB3VuaTEwRTAHdW5pMTBFMQd1bmkxMEUyB3VuaTEwRTMHdW5pMTBFNAd1bmkxMEU1B3VuaTEwRTYHdW5pMTBFNwd1bmkxMEU4B3VuaTEwRTkHdW5pMTBFQQd1bmkxMEVCB3VuaTEwRUMHdW5pMTBFRAd1bmkxMEVFB3VuaTEwRUYHdW5pMTBGMAd1bmkxMEYxB3VuaTEwRjIHdW5pMTBGMwd1bmkxMEY0B3VuaTEwRjUHdW5pMTBGNgd1bmkxMEY3B3VuaTEwRjgHdW5pMTBGOQd1bmkxMEZBB3VuaTEwRkIHdW5pMTBGQwd1bmkxMEZEB3VuaTEwRkUHdW5pMTBGRgd1bmkxNUUxB3VuaTE1RkEHdW5pMTYxNAd1bmkxNkEwB3VuaTE2QTIHdW5pMTZBMwd1bmkxNkE0B3VuaTE2QTUHdW5pMTZBNgd1bmkxNkE3B3VuaTE2QTgHdW5pMTZBOQd1bmkxNkFBB3VuaTE2QUIHdW5pMTZBQwd1bmkxNkFEB3VuaTE2QUUHdW5pMTZBRgd1bmkxNkIwB3VuaTE2QjEHdW5pMTZCMgd1bmkxNkIzB3VuaTE2QjQHdW5pMTZCNgd1bmkxNkI3B3VuaTE2QjgHdW5pMTZCOQd1bmkxNkJBB3VuaTE2QkIHdW5pMTZCQwd1bmkxNkJEB3VuaTE2QkUHdW5pMTZCRgd1bmkxNkMwB3VuaTE2QzEHdW5pMTZDMgd1bmkxNkMzB3VuaTE2QzQHdW5pMTZDNQd1bmkxNkM2B3VuaTE2QzcHdW5pMTZDOAd1bmkxNkM5B3VuaTE2Q0EHdW5pMTZDQgd1bmkxNkNDB3VuaTE2Q0QHdW5pMTZDRQd1bmkxNkNGB3VuaTE2RDAHdW5pMTZEMQd1bmkxNkQyB3VuaTE2RDMHdW5pMTZENAd1bmkxNkQ1B3VuaTE2RDYHdW5pMTZENwd1bmkxNkQ4B3VuaTE2RDkHdW5pMTZEQQd1bmkxNkRCB3VuaTE2REMHdW5pMTZERAd1bmkxNkRFB3VuaTE2REYHdW5pMTZFMAd1bmkxNkUxB3VuaTE2RTIHdW5pMTZFMwd1bmkxNkU0B3VuaTE2RTUHdW5pMTZFNgd1bmkxNkU3B3VuaTE2RTgHdW5pMTZFOQd1bmkxNkVBB3VuaTE2RUIHdW5pMTZFQwd1bmkxNkVEB3VuaTE2RUUHdW5pMTZFRgd1bmkxNkYwB3VuaTE2RjEHdW5pMTZGMgd1bmkxNkYzB3VuaTE2RjQHdW5pMTZGNQd1bmkxNkY2B3VuaTE2RjcHdW5pMTZGOAd1bmkxRDAwB3VuaTFEMDQHdW5pMUQwNQd1bmkxRDA3B3VuaTFEMDkHdW5pMUQwQQd1bmkxRDBCB3VuaTFEMEQHdW5pMUQwRgd1bmkxRDE4B3VuaTFEMUEHdW5pMUQxQgd1bmkxRDFDB3VuaTFEMjAHdW5pMUQyMQd1bmkxRDIyB3VuaTFENzcHdW5pMUQ5MQd1bmkxRTlDB3VuaTFFOUQHdW5pMUU5RQd1bmkxRTlGB3VuaTFFRkMHdW5pMUVGRAd1bmkxRUZFB3VuaTFFRkYHdW5pMjAxMAd1bmkyMDExB3VuaTIwMzEGbWludXRlBnNlY29uZAd1bmkyMDM0B3VuaTIwMzUHdW5pMjAzNgd1bmkyMDM3B3VuaTIwM0IJZXhjbGFtZGJsB3VuaTIwM0QHdW5pMjA0Mgd1bmkyMDQ4B3VuaTIwNDkHdW5pMjA0QQd1bmkyMDRCB3VuaTIwNEUHdW5pMjA0Rgd1bmkyMDUxB3VuaTIwNTIHdW5pMjA1Nwd1bmkyMDcwB3VuaTIwNzEHdW5pMjA3NAd1bmkyMDc1B3VuaTIwNzYHdW5pMjA3Nwd1bmkyMDc4B3VuaTIwNzkHdW5pMjA3QQd1bmkyMDdCB3VuaTIwN0MHdW5pMjA3RAd1bmkyMDdFB3VuaTIwN0YHdW5pMjA4MAd1bmkyMDgxB3VuaTIwODIHdW5pMjA4Mwd1bmkyMDg0B3VuaTIwODUHdW5pMjA4Ngd1bmkyMDg3B3VuaTIwODgHdW5pMjA4OQd1bmkyMDhBB3VuaTIwOEIHdW5pMjA4Qwd1bmkyMDhEB3VuaTIwOEUHdW5pMjBBMA1jb2xvbm1vbmV0YXJ5B3VuaTIwQTIEbGlyYQd1bmkyMEE1B3VuaTIwQTYHdW5pMjBBOQd1bmkyMEFBBGRvbmcERXVybwd1bmkyMEFEB3VuaTIwQUUHdW5pMjBCMAd1bmkyMEIxB3VuaTIwQjIHdW5pMjBCMwd1bmkyMEI0B3VuaTIwQjUHdW5pMjBCNgd1bmkyMEI3B3VuaTIwQjgHdW5pMjBCOQd1bmkyMEJBB3VuaTIwQkIHdW5pMjBCQwd1bmkyMEJEB3VuaTIwQkUHdW5pMjBCRgd1bmkyMTE3B3VuaTIxMzIHdW5pMjE0MQd1bmkyMTQ0B3VuaTIxNEIHdW5pMjE1MAd1bmkyMTUxCG9uZXRoaXJkCXR3b3RoaXJkcwd1bmkyMTU1B3VuaTIxNTYHdW5pMjE1Nwd1bmkyMTU5B3VuaTIxNUEJb25lZWlnaHRoDHRocmVlZWlnaHRocwtmaXZlZWlnaHRocwxzZXZlbmVpZ2h0aHMHdW5pMjE1Rgd1bmkyMTg5CWFycm93bGVmdAdhcnJvd3VwCmFycm93cmlnaHQJYXJyb3dkb3duCWFycm93Ym90aAd1bmkyMUM0B3VuaTIxQ0YNYXJyb3dkYmxyaWdodAxhcnJvd2RibGJvdGgHdW5pMjFGNQl1bml2ZXJzYWwHdW5pMjIwMQtleGlzdGVudGlhbAd1bmkyMjA0CGVtcHR5c2V0B2VsZW1lbnQKbm90ZWxlbWVudAhzdWNodGhhdAd1bmkyMjBDB3VuaTIyMTMHdW5pMjIxOQd1bmkyMjFCB3VuaTIyMUMMcHJvcG9ydGlvbmFsB3VuaTIyMjUKbG9naWNhbGFuZAlsb2dpY2Fsb3IMaW50ZXJzZWN0aW9uB3VuaTIyMkUJdGhlcmVmb3JlB3VuaTIyMzUHdW5pMjI1NAtlcXVpdmFsZW5jZQd1bmkyMjYyDHByb3BlcnN1YnNldA5wcm9wZXJzdXBlcnNldAlub3RzdWJzZXQHdW5pMjI4NQxyZWZsZXhzdWJzZXQOcmVmbGV4c3VwZXJzZXQHdW5pMjJBMgd1bmkyMkE0DXBlcnBlbmRpY3VsYXIHdW5pMjJBOAd1bmkyMkJCB3VuaTIyQkMHdW5pMjJCRAd1bmkyMkMzB3VuaTIyQzYHdW5pMjMwMAVob3VzZQd1bmkyMzE4B3VuaTIzMUEHdW5pMjMxQgppbnRlZ3JhbHRwCmludGVncmFsYnQHdW5pMjNDRgd1bmkyM0U5B3VuaTIzRUEHdW5pMjNFRAd1bmkyM0VFB3VuaTIzRUYHdW5pMjNGNAd1bmkyM0Y1B3VuaTIzRjYHdW5pMjNGNwd1bmkyM0Y4B3VuaTIzRjkHdW5pMjNGQQd1bmkyM0ZCB3VuaTIzRkMHdW5pMjNGRAhTRjEwMDAwMAhTRjExMDAwMAhTRjAxMDAwMAhTRjAzMDAwMAhTRjAyMDAwMAhTRjA0MDAwMAhTRjA4MDAwMAhTRjA5MDAwMAhTRjA2MDAwMAhTRjA3MDAwMAhTRjA1MDAwMAhTRjQzMDAwMAhTRjI0MDAwMAhTRjUxMDAwMAhTRjUyMDAwMAhTRjM5MDAwMAhTRjIyMDAwMAhTRjIxMDAwMAhTRjI1MDAwMAhTRjUwMDAwMAhTRjQ5MDAwMAhTRjM4MDAwMAhTRjI4MDAwMAhTRjI3MDAwMAhTRjI2MDAwMAhTRjM2MDAwMAhTRjM3MDAwMAhTRjQyMDAwMAhTRjE5MDAwMAhTRjIwMDAwMAhTRjIzMDAwMAhTRjQ3MDAwMAhTRjQ4MDAwMAhTRjQxMDAwMAhTRjQ1MDAwMAhTRjQ2MDAwMAhTRjQwMDAwMAhTRjU0MDAwMAhTRjUzMDAwMAhTRjQ0MDAwMAd1cGJsb2NrB2RuYmxvY2sFYmxvY2sHbGZibG9jawdydGJsb2NrB2x0c2hhZGUFc2hhZGUHZGtzaGFkZQlmaWxsZWRib3gGSDIyMDczB3RyaWFndXAHdW5pMjVCMwd1bmkyNUI2B3VuaTI1QjcHdHJpYWdkbgd1bmkyNUJEB3VuaTI1QzAHdW5pMjVDMQd1bmkyNUM2B3VuaTI1QzcGY2lyY2xlB3VuaTI1Q0UGSDE4NTMzCWludmJ1bGxldApvcGVuYnVsbGV0B3VuaTI2MDAHdW5pMjYwMQd1bmkyNjAyB3VuaTI2MDMHdW5pMjYwNAd1bmkyNjA1B3VuaTI2MDYHdW5pMjYwOAd1bmkyNjE0B3VuaTI2MjAHdW5pMjYzMAd1bmkyNjMxB3VuaTI2MzIHdW5pMjYzMwd1bmkyNjM0B3VuaTI2MzUHdW5pMjYzNgd1bmkyNjM3B3VuaTI2MzkJc21pbGVmYWNlDGludnNtaWxlZmFjZQd1bmkyNjNEBmZlbWFsZQRtYWxlBXNwYWRlB3VuaTI2NjEHdW5pMjY2MgRjbHViB3VuaTI2NjQFaGVhcnQHZGlhbW9uZAd1bmkyNjY3B3VuaTI2NjkLbXVzaWNhbG5vdGUObXVzaWNhbG5vdGVkYmwHdW5pMjY2Qwd1bmkyNjZEB3VuaTI2NkUHdW5pMjY2Rgd1bmkyNjgwB3VuaTI2ODEHdW5pMjY4Mgd1bmkyNjgzB3VuaTI2ODQHdW5pMjY4NQd1bmkyNjkwB3VuaTI2OTEHdW5pMjY5Mwd1bmkyNjk0B3VuaTI2OTcHdW5pMjZBMQd1bmkyNkE1B3VuaTI2QzQHdW5pMjZDOAd1bmkyNkNGB3VuaTI2RTgHdW5pMjcwMgd1bmkyNzA5B3VuaTI3MEUHdW5pMjcxNAd1bmkyNzE4B3VuaTI3NDQHdW5pMjc0Qwd1bmkyNzYzB3VuaTI3NjQHdW5pMjdEOAd1bmkyOTVEB3VuaTI5QzgHdW5pMkI1MAd1bmkyQjU4B3VuaTJCRUEHdW5pMkJFQgd1bmkyQzY1B3VuaTJDNjYHdW5pMkM2RAd1bmkyQzZGB3VuaTJDNzEHdW5pMkQwMAd1bmkyRDAxB3VuaTJEMDIHdW5pMkQwMwd1bmkyRDA0B3VuaTJEMDUHdW5pMkQwNgd1bmkyRDA3B3VuaTJEMDgHdW5pMkQwOQd1bmkyRDBBB3VuaTJEMEIHdW5pMkQwQwd1bmkyRDBEB3VuaTJEMEUHdW5pMkQwRgd1bmkyRDEwB3VuaTJEMTEHdW5pMkQxMgd1bmkyRDEzB3VuaTJEMTQHdW5pMkQxNQd1bmkyRDE2B3VuaTJEMTcHdW5pMkQxOAd1bmkyRDE5B3VuaTJEMUEHdW5pMkQxQgd1bmkyRDFDB3VuaTJEMUQHdW5pMkQxRQd1bmkyRDFGB3VuaTJEMjAHdW5pMkQyMQd1bmkyRDIyB3VuaTJEMjMHdW5pMkQyNAd1bmkyRDI1B3VuaTJFMTgHdW5pMkUyRQd1bmkyRTM1B3VuaTJFMzgHdW5pMkU0MQd1bmkyRTRCB3VuaTMwMTIHdW5pMzEyNQd1bmlBNzI2B3VuaUE3MjcHdW5pQTcyOAd1bmlBNzI5B3VuaUE3MzAHdW5pQTczMQd1bmlBNzM5B3VuaUE3M0IHdW5pQTc1QQd1bmlBNzVCB3VuaUE3NzkHdW5pQTc4MAd1bmlBNzgxB3VuaUE3QTgHdW5pQTdBOQd1bmlBN0FGB3VuaUE3QjAHdW5pRkIwMAd1bmlGQjAxB3VuaUZCMDIHdW5pRkIwMwd1bmlGQjA1B3VuaUZCMUQHdW5pRkIxRgd1bmlGQjJCB3VuaUZCMzEHdW5pRkIzNQd1bmlGQjNCB3VuaUZCNDQHdW5pRkI0QQd1bmlGQjRCB3VuaUZCNEMHdW5pRkI0RQd1bmlGRjBCB3VuaUZGRkQAAAAB//8AAgABAAAADAAAABAAAAACAAAABAAAAAIAAAAAAAEAAAAA39bLMQAAAAB8N5wbAAAAAOCWoJY=");var Fxe=s(t=>({}),"get_default_slot_changes"),LT=s(t=>({id:t[4]}),"get_default_slot_context");function Nxe(t){let e,n,i,a,r=pureMarked(t[1])+"";return{c(){e=L("div"),n=L("i"),i=J(),a=new Yi(!1),E(n,"class","fa fa-exclamation-triangle dialog_form_warning text_icon svelte-1g4tfme"),a.a=null,E(e,"class","warning_text svelte-1g4tfme")},m(o,l){U(o,e,l),I(e,n),I(e,i),a.m(r,e)},p(o,l){l&2&&r!==(r=pureMarked(o[1])+"")&&a.p(r)},d(o){o&&z(e)}}}s(Nxe,"create_if_block_2");function Rxe(t){let e,n,i,a,r=pureMarked(t[2])+"";return{c(){e=L("div"),n=L("i"),i=J(),a=L("div"),E(n,"class","fa fa-exclamation-circle dialog_form_error text_icon svelte-1g4tfme"),E(a,"class","error_lines svelte-1g4tfme"),E(e,"class","error_text svelte-1g4tfme")},m(o,l){U(o,e,l),I(e,n),I(e,i),I(e,a),a.innerHTML=r},p(o,l){l&4&&r!==(r=pureMarked(o[2])+"")&&(a.innerHTML=r)},d(o){o&&z(e)}}}s(Rxe,"create_if_block_1");function VT(t){let e,n=pureMarked(t[0])+"",i;return{c(){e=new Yi(!1),i=_t(),e.a=i},m(a,r){e.m(n,a,r),U(a,i,r)},p(a,r){r&1&&n!==(n=pureMarked(a[0])+"")&&e.p(n)},d(a){a&&z(i),a&&e.d()}}}s(VT,"create_if_block");function Mxe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f=t[7].default,g=qy(f,t,t[6],LT);function x(b,y){if(b[2])return Rxe;if(b[1])return Nxe}s(x,"select_block_type");let _=x(t,-1),h=_&&_(t),v=t[0]&&VT(t);return{c(){e=L("div"),n=L("div"),i=L("div"),g&&g.c(),a=J(),r=L("div"),h&&h.c(),o=J(),v&&v.c(),l=J(),c=L("i"),E(r,"class","description svelte-1g4tfme"),E(i,"class","slot_container svelte-1g4tfme"),E(c,"class","fa fa-rotate-left dialog_form_description dialog-form-description reset-button svelte-1g4tfme"),E(c,"title",d=A("dialog.reset")),E(n,"class","base_dialog_item svelte-1g4tfme"),E(e,"class","dialog_item_container svelte-1g4tfme")},m(b,y){U(b,e,y),I(e,n),I(n,i),g&&g.m(i,null),I(i,a),I(i,r),h&&h.m(r,null),I(r,o),v&&v.m(r,null),I(n,l),I(n,c),u=!0,p||(m=Ue(c,"click",function(){qn(t[3])&&t[3].apply(this,arguments)}),p=!0)},p(b,[y]){t=b,g&&g.p&&(!u||y&64)&&Gy(g,f,t,t[6],u?Jy(f,t[6],y,Fxe):Wy(t[6]),LT),_===(_=x(t,y))&&h?h.p(t,y):(h&&h.d(1),h=_&&_(t),h&&(h.c(),h.m(r,o))),t[0]?v?v.p(t,y):(v=VT(t),v.c(),v.m(r,null)):v&&(v.d(1),v=null)},i(b){u||(ae(g,b),u=!0)},o(b){de(g,b),u=!1},d(b){b&&z(e),g&&g.d(b),h&&h.d(),v&&v.d(),p=!1,m()}}}s(Mxe,"create_fragment");function Bxe(t,e,n){let{$$slots:i={},$$scope:a}=e,{label:r}=e,{tooltip:o=""}=e,{warningText:l=""}=e,{errorText:c=""}=e,{onReset:d}=e,u=guid();return t.$$set=p=>{"label"in p&&n(5,r=p.label),"tooltip"in p&&n(0,o=p.tooltip),"warningText"in p&&n(1,l=p.warningText),"errorText"in p&&n(2,c=p.errorText),"onReset"in p&&n(3,d=p.onReset),"$$scope"in p&&n(6,a=p.$$scope)},t.$$.update=()=>{if(t.$$.dirty&36)e:c&&(bo.get()[r]=c)},[o,l,c,d,u,r,a,i]}s(Bxe,"instance");var Af=class extends Pe{constructor(e){super(),Ve(this,e,Bxe,Mxe,De,{label:5,tooltip:0,warningText:1,errorText:2,onReset:3})}};s(Af,"BaseDialogItem");var Ln=Af;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".dialog_item_container.svelte-1g4tfme.svelte-1g4tfme{margin:0px 16px 8px}.base_dialog_item.svelte-1g4tfme.svelte-1g4tfme{display:flex;flex-direction:row}.base_dialog_item.svelte-1g4tfme label{--max_label_width:200px !important}.slot_container.svelte-1g4tfme.svelte-1g4tfme{flex-grow:1;margin-right:4px;max-width:96%}.warning_text.svelte-1g4tfme i.svelte-1g4tfme{font-size:1.2em}.warning_text.svelte-1g4tfme.svelte-1g4tfme{display:flex;align-items:center;color:var(--color-warning);font-family:var(--font-code);margin:0.75rem;margin-top:0}.description.svelte-1g4tfme.svelte-1g4tfme{font-size:0.9rem;color:var(--color-subtle_text);margin:0 0.75rem;display:flex;flex-direction:column;gap:2px}.description.svelte-1g4tfme li{list-style:circle;margin-left:1.5rem}.error_text.svelte-1g4tfme i.svelte-1g4tfme{font-size:1.2em}.error_text.svelte-1g4tfme.svelte-1g4tfme{display:flex;align-items:center;color:var(--color-error);font-family:var(--font-code);margin:0.75rem;margin-top:0}.error_lines.svelte-1g4tfme.svelte-1g4tfme{display:flex;flex-direction:column}.text_icon.svelte-1g4tfme.svelte-1g4tfme{margin-right:8px}.dialog-form-description.svelte-1g4tfme.svelte-1g4tfme{padding-top:12px}.reset-button.svelte-1g4tfme.svelte-1g4tfme{padding-top:12px;margin-left:4px}.reset-button.svelte-1g4tfme.svelte-1g4tfme:hover{color:var(--color-error);transition:unset}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Pxe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("div"),l=L("div"),c=L("input"),u=J(),p=L("div"),p.innerHTML='code',m=J(),f=L("div"),g=L("input"),_=J(),h=L("div"),h.innerHTML='code',E(n,"class","name_space_left"),E(n,"for",a=t[32]),E(c,"id",d=t[32]),E(c,"class","dark_bordered focusable_input"),E(c,"inputmode","decimal"),E(p,"class","tool numaric_input_slider"),E(l,"class","numeric_input"),E(g,"id",x=t[32]),E(g,"class","dark_bordered focusable_input"),E(g,"inputmode","decimal"),E(h,"class","tool numaric_input_slider"),E(f,"class","numeric_input"),E(o,"class","dialog_vector_group half"),Xe(o,"max-width","256px"),E(e,"class","dialog_bar form_bar")},m(y,w){U(y,e,w),I(e,n),I(n,i),I(e,r),I(e,o),I(o,l),I(l,c),t[21](c),Bt(c,t[10]),I(l,u),I(l,p),t[23](p),I(o,m),I(o,f),I(f,g),t[24](g),Bt(g,t[11]),I(f,_),I(f,h),t[26](h),v||(b=[Ue(c,"input",t[22]),Ue(g,"input",t[25])],v=!0)},p(y,w){w[0]&1&&ct(i,y[0]),w[1]&2&&a!==(a=y[32])&&E(n,"for",a),w[1]&2&&d!==(d=y[32])&&E(c,"id",d),w[0]&1024&&c.value!==y[10]&&Bt(c,y[10]),w[1]&2&&x!==(x=y[32])&&E(g,"id",x),w[0]&2048&&g.value!==y[11]&&Bt(g,y[11])},d(y){y&&z(e),t[21](null),t[23](null),t[24](null),t[26](null),v=!1,Rt(b)}}}s(Pxe,"create_default_slot");function Lxe(t){let e,n,i,a;function r(c){t[27](c)}s(r,"basedialogitem_warningText_binding");function o(c){t[28](c)}s(o,"basedialogitem_errorText_binding");let l={label:t[0],tooltip:t[1],onReset:t[12],$$slots:{default:[Pxe,({id:c})=>({32:c}),({id:c})=>[0,c?2:0]]},$$scope:{ctx:t}};return t[4]!==void 0&&(l.warningText=t[4]),t[5]!==void 0&&(l.errorText=t[5]),e=new Ln({props:l}),Te.push(()=>Be(e,"warningText",r)),Te.push(()=>Be(e,"errorText",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,d){let u={};d[0]&1&&(u.label=c[0]),d[0]&2&&(u.tooltip=c[1]),d[0]&4033|d[1]&6&&(u.$$scope={dirty:d,ctx:c}),!n&&d[0]&16&&(n=!0,u.warningText=c[4],Me(()=>n=!1)),!i&&d[0]&32&&(i=!0,u.errorText=c[5],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s(Lxe,"create_fragment");function Vxe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(m,le=>n(10,i=le)),m),"$$subscribe_valueX"),o,l=ie,c=s(()=>(l(),l=rt(_,le=>n(11,o=le)),_),"$$subscribe_valueY");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l());let{label:d}=e,{tooltip:u=""}=e,{step:p=void 0}=e,{valueX:m}=e;r();let{defaultValueX:f}=e,{minX:g=void 0}=e,{maxX:x=void 0}=e,{valueY:_}=e;c();let{defaultValueY:h}=e,{minY:v=void 0}=e,{maxY:b=void 0}=e,{valueChecker:y=void 0}=e,w="",S="";function F(){if(!y)return;let le=y({x:m.get(),y:_.get()});le.type==="error"?n(5,S=le.message):n(5,S=""),le.type==="warning"?n(4,w=le.message):n(4,w="")}s(F,"checkValue"),m.subscribe(()=>F()),_.subscribe(()=>F());let N=new Molang,k,R,D,B;function q(le,ge,V,H){addEventListeners(le,"mousedown touchstart",re=>{convertTouchEvent(re);let xe=0;function fe(Y){convertTouchEvent(Y);let we=Math.trunc((Y.clientX-re.clientX)/10)*(p??1);we!=xe&&(ge.set(Math.clamp(ge.get()+(we-xe),V??-1/0,H??1/0)),xe=we)}s(fe,"move");function te(){removeEventListeners(document,"mousemove touchmove",fe),removeEventListeners(document,"mouseup touchend",te)}s(te,"stop"),addEventListeners(document,"mousemove touchmove",fe),addEventListeners(document,"mouseup touchend",te)}),addEventListeners(k,"focusout dblclick",()=>{ge.set(Math.clamp(N.parse(ge.get()),V??-1/0,H??1/0))})}s(q,"eventListenerFactory");function G(){m.set(f),_.set(h)}s(G,"onReset"),requestAnimationFrame(()=>{q(R,m,g,x),q(B,_,v,b)});function W(le){Te[le?"unshift":"push"](()=>{k=le,n(6,k)})}s(W,"input0_binding");function ee(){i=this.value,m.set(i)}s(ee,"input0_input_handler");function Z(le){Te[le?"unshift":"push"](()=>{R=le,n(7,R)})}s(Z,"div0_binding");function me(le){Te[le?"unshift":"push"](()=>{D=le,n(8,D)})}s(me,"input1_binding");function X(){o=this.value,_.set(o)}s(X,"input1_input_handler");function Q(le){Te[le?"unshift":"push"](()=>{B=le,n(9,B)})}s(Q,"div2_binding");function he(le){w=le,n(4,w)}s(he,"basedialogitem_warningText_binding");function Ie(le){S=le,n(5,S)}return s(Ie,"basedialogitem_errorText_binding"),t.$$set=le=>{"label"in le&&n(0,d=le.label),"tooltip"in le&&n(1,u=le.tooltip),"step"in le&&n(13,p=le.step),"valueX"in le&&r(n(2,m=le.valueX)),"defaultValueX"in le&&n(14,f=le.defaultValueX),"minX"in le&&n(15,g=le.minX),"maxX"in le&&n(16,x=le.maxX),"valueY"in le&&c(n(3,_=le.valueY)),"defaultValueY"in le&&n(17,h=le.defaultValueY),"minY"in le&&n(18,v=le.minY),"maxY"in le&&n(19,b=le.maxY),"valueChecker"in le&&n(20,y=le.valueChecker)},[d,u,m,_,w,S,k,R,D,B,i,o,G,p,f,g,x,h,v,b,y,W,ee,Z,me,X,Q,he,Ie]}s(Vxe,"instance");var Tf=class extends Pe{constructor(e){super(),Ve(this,e,Vxe,Lxe,De,{label:0,tooltip:1,step:13,valueX:2,defaultValueX:14,minX:15,maxX:16,valueY:3,defaultValueY:17,minY:18,maxY:19,valueChecker:20},null,[-1,-1])}};s(Tf,"Vector2d");var Zx=Tf;function zxe(t){let e,n,i,a,r,o,l;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),E(n,"class","name_space_left"),E(n,"for",a=t[9]),E(e,"class","dialog_bar form_bar")},m(c,d){U(c,e,d),I(e,n),I(n,i),o||(l=bn(r=t[3].call(null,e)),o=!0)},p(c,d){d&1&&ct(i,c[0]),d&512&&a!==(a=c[9])&&E(n,"for",a)},d(c){c&&z(e),o=!1,l()}}}s(zxe,"create_default_slot");function Uxe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[2],$$slots:{default:[zxe,({id:i})=>({9:i}),({id:i})=>i?512:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&1537&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(Uxe,"create_fragment");function qxe(t,e,n){let{label:i}=e,{tooltip:a=""}=e,{options:r}=e,{defaultOption:o}=e,{value:l}=e;l.get()||r[l.get()]||l.set(o);let c=new Interface.CustomElements.SelectInput("dialog-select",{options:r,value:l.get(),onChange(){let m=c.node.getAttribute("value");if(m==null){console.warn("Select value is undefined");return}l.set(m)}});function d(){l.set(o),c.node&&c.set(o)}s(d,"onReset");let u=l.subscribe(m=>{c.set(m)});Zi(()=>{u(),c.node.remove()});let p=s(m=>{m.appendChild(c.node)},"mountSelect");return t.$$set=m=>{"label"in m&&n(0,i=m.label),"tooltip"in m&&n(1,a=m.tooltip),"options"in m&&n(4,r=m.options),"defaultOption"in m&&n(5,o=m.defaultOption),"value"in m&&n(6,l=m.value)},[i,a,d,p,r,o,l]}s(qxe,"instance");var Cf=class extends Pe{constructor(e){super(),Ve(this,e,qxe,Uxe,De,{label:0,tooltip:1,options:4,defaultOption:5,value:6})}};s(Cf,"Select");var es=Cf;function Hxe(t){let e,n,i;return{c(){e=L("div"),n=L("h4"),i=Re(t[0]),E(n,"class","name_space_left svelte-ho0k60"),E(e,"class","dialog_bar form_bar animated-java-section-header svelte-ho0k60")},m(a,r){U(a,e,r),I(e,n),I(n,i)},p(a,[r]){r&1&&ct(i,a[0])},i:ie,o:ie,d(a){a&&z(e)}}}s(Hxe,"create_fragment");function Jxe(t,e,n){let{label:i}=e;return t.$$set=a=>{"label"in a&&n(0,i=a.label)},[i]}s(Jxe,"instance");var Sf=class extends Pe{constructor(e){super(),Ve(this,e,Jxe,Hxe,De,{label:0})}};s(Sf,"SectionHeader");var ts=Sf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".animated-java-section-header.svelte-ho0k60{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}h4.svelte-ho0k60{padding:6px 24px;font-size:24px;border-bottom:5px solid var(--color-back);background-color:var(--color-button);font-family:'MinecraftFull'}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Gxe(t){let e,n,i,a,r,o,l,c,d,u,p,m;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("div"),l=L("input"),d=J(),u=L("div"),u.innerHTML='code',E(n,"class","name_space_left"),E(n,"for",a=t[19]),E(l,"id",c=t[19]),E(l,"class","dark_bordered focusable_input svelte-190iud5"),E(l,"inputmode","decimal"),E(u,"class","tool numaric_input_slider slider-fix svelte-190iud5"),E(o,"class","numeric_input"),E(e,"class","dialog_bar form_bar")},m(f,g){U(f,e,g),I(e,n),I(n,i),I(e,r),I(e,o),I(o,l),t[12](l),Bt(l,t[5]),I(o,d),I(o,u),t[14](u),p||(m=Ue(l,"input",t[13]),p=!0)},p(f,g){g&1&&ct(i,f[0]),g&524288&&a!==(a=f[19])&&E(n,"for",a),g&524288&&c!==(c=f[19])&&E(l,"id",c),g&32&&l.value!==f[5]&&Bt(l,f[5])},d(f){f&&z(e),t[12](null),t[14](null),p=!1,m()}}}s(Gxe,"create_default_slot");function Wxe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[6],$$slots:{default:[Gxe,({id:i})=>({19:i}),({id:i})=>i?524288:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&1572921&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(Wxe,"create_fragment");function Kxe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,N=>n(5,i=N)),c),"$$subscribe_value");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=""}=e,{value:c}=e;r();let{defaultValue:d}=e,{min:u=-1/0}=e,{max:p=1/0}=e,{valueStep:m=.1}=e,{dragStep:f=m}=e,g,x,_=s(N=>Math.clamp(Dr(N,1/(m??1)),u,p)||0,"clampValue"),h=s(N=>{let k=convertTouchEvent(N),R=c.get(),D=s(B=>{let q=convertTouchEvent(B),G=Math.trunc((q.clientX-k.clientX)/10)*(f??1),W=_(R+G);W!==c.get()&&c.set(W)},"drag");addEventListeners(document,"mousemove touchmove",D),addEventListeners(document,"mouseup touchend",()=>removeEventListeners(document,"mousemove touchmove",D),{once:!0})},"onStartDrag"),v=new Molang,b=s(()=>{c.set(_(v.parse(c.get())))},"onInput");requestAnimationFrame(()=>{addEventListeners(x,"mousedown touchstart",h),addEventListeners(g,"focusout dblclick",b)}),Zi(()=>{removeEventListeners(g,"focusout dblclick",b),removeEventListeners(x,"mousedown touchstart",h)});function y(){c.set(d)}s(y,"onReset");function w(N){Te[N?"unshift":"push"](()=>{g=N,n(3,g)})}s(w,"input_1_binding");function S(){i=this.value,c.set(i)}s(S,"input_1_input_handler");function F(N){Te[N?"unshift":"push"](()=>{x=N,n(4,x)})}return s(F,"div0_binding"),t.$$set=N=>{"label"in N&&n(0,o=N.label),"tooltip"in N&&n(1,l=N.tooltip),"value"in N&&r(n(2,c=N.value)),"defaultValue"in N&&n(7,d=N.defaultValue),"min"in N&&n(8,u=N.min),"max"in N&&n(9,p=N.max),"valueStep"in N&&n(10,m=N.valueStep),"dragStep"in N&&n(11,f=N.dragStep)},[o,l,c,g,x,i,y,d,u,p,m,f,w,S,F]}s(Kxe,"instance");var Of=class extends Pe{constructor(e){super(),Ve(this,e,Kxe,Wxe,De,{label:0,tooltip:1,value:2,defaultValue:7,min:8,max:9,valueStep:10,dragStep:11})}};s(Of,"NumberSlider");var Mr=Of;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("input.svelte-190iud5{padding:0 8px !important}.slider-fix.svelte-190iud5{right:8px !important}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Yxe(t){let e,n,i,a,r,o,l,c,d,u;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("input"),E(n,"class","name_space_left"),E(n,"for",a=t[12]),E(o,"type","text"),E(o,"class","dark_bordered half focusable_input svelte-oj6m6h"),E(o,"id",l=t[12]),o.disabled=t[2],E(o,"style",c=t[2]?"color: var(--color-subtle_text);":""),E(e,"class","dialog_bar form_bar")},m(p,m){U(p,e,m),I(e,n),I(n,i),I(e,r),I(e,o),Bt(o,t[3]),d||(u=[Ue(o,"input",t[11]),Ue(o,"change",t[6])],d=!0)},p(p,m){m&1&&ct(i,p[0]),m&4096&&a!==(a=p[12])&&E(n,"for",a),m&4096&&l!==(l=p[12])&&E(o,"id",l),m&4&&(o.disabled=p[2]),m&4&&c!==(c=p[2]?"color: var(--color-subtle_text);":"")&&E(o,"style",c),m&8&&o.value!==p[3]&&Bt(o,p[3])},d(p){p&&z(e),d=!1,Rt(u)}}}s(Yxe,"create_default_slot");function Xxe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],warningText:t[4],errorText:t[5],onReset:t[7],$$slots:{default:[Yxe,({id:i})=>({12:i}),({id:i})=>i?4096:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&16&&(r.warningText=i[4]),a&32&&(r.errorText=i[5]),a&12301&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(Xxe,"create_fragment");function Zxe(t,e,n){let{label:i}=e,{tooltip:a=""}=e,{value:r}=e,{defaultValue:o}=e,{disabled:l=!1}=e,{valueChecker:c=void 0}=e,d=r.get(),u="",p="";function m(){if(c){let x=c(d);x.type==="error"?n(5,p=x.message):n(5,p=""),x.type==="warning"?n(4,u=x.message):n(4,u="")}r.set(d),n(3,d=r.get())}s(m,"onValueChange");function f(){n(3,d=o),m()}s(f,"onReset"),m();function g(){d=this.value,n(3,d)}return s(g,"input_input_handler"),t.$$set=x=>{"label"in x&&n(0,i=x.label),"tooltip"in x&&n(1,a=x.tooltip),"value"in x&&n(8,r=x.value),"defaultValue"in x&&n(9,o=x.defaultValue),"disabled"in x&&n(2,l=x.disabled),"valueChecker"in x&&n(10,c=x.valueChecker)},[i,a,l,d,u,p,m,f,r,o,c,g]}s(Zxe,"instance");var If=class extends Pe{constructor(e){super(),Ve(this,e,Zxe,Xxe,De,{label:0,tooltip:1,value:8,defaultValue:9,disabled:2,valueChecker:10})}};s(If,"LineInput");var aa=If;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("input.svelte-oj6m6h{font-family:var(--font-code)}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Qxe(t){let e,n,i,a,r,o,l,c,d,u,p;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("input"),c=J(),d=L("div"),d.innerHTML='insert_drive_file',E(n,"class","name_space_left"),E(n,"for",a=t[18]),E(o,"type","text"),E(o,"class","dark_bordered half focusable_input svelte-9od7jv"),E(o,"id",l=t[18]),E(d,"class","tool animated-java-file-select-icon svelte-9od7jv"),E(e,"class","dialog_bar form_bar")},m(m,f){U(m,e,f),I(e,n),I(n,i),I(e,r),I(e,o),Bt(o,t[2]),I(e,c),I(e,d),u||(p=[Ue(o,"input",t[13]),Ue(o,"input",t[5]),Ue(o,"change",t[5]),Ue(d,"click",t[14])],u=!0)},p(m,f){f&1&&ct(i,m[0]),f&262144&&a!==(a=m[18])&&E(n,"for",a),f&262144&&l!==(l=m[18])&&E(o,"id",l),f&4&&o.value!==m[2]&&Bt(o,m[2])},d(m){m&&z(e),u=!1,Rt(p)}}}s(Qxe,"create_default_slot");function $xe(t){let e,n,i,a;function r(c){t[15](c)}s(r,"basedialogitem_warningText_binding");function o(c){t[16](c)}s(o,"basedialogitem_errorText_binding");let l={label:t[0],tooltip:t[1],onReset:t[7],$$slots:{default:[Qxe,({id:c})=>({18:c}),({id:c})=>c?262144:0]},$$scope:{ctx:t}};return t[3]!==void 0&&(l.warningText=t[3]),t[4]!==void 0&&(l.errorText=t[4]),e=new Ln({props:l}),Te.push(()=>Be(e,"warningText",r)),Te.push(()=>Be(e,"errorText",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,[d]){let u={};d&1&&(u.label=c[0]),d&2&&(u.tooltip=c[1]),d&786437&&(u.$$scope={dirty:d,ctx:c}),!n&&d&8&&(n=!0,u.warningText=c[3],Me(()=>n=!1)),!i&&d&16&&(i=!0,u.errorText=c[4],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s($xe,"create_fragment");function eve(t,e,n){let{label:i}=e,{tooltip:a=""}=e,{value:r}=e,{defaultValue:o}=e,{filters:l=[]}=e,{fileSelectMessage:c="Select Folder"}=e,d=r.get(),{valueChecker:u=void 0}=e,p="",m="";function f(){if(!u)return;let w=u(r.get());w.type==="error"?n(4,m=w.message):n(4,m=""),w.type==="warning"?n(3,p=w.message):n(3,p="")}s(f,"checkValue"),r.subscribe(()=>f());function g(){r.set(d),n(2,d=r.get())}s(g,"onValueChange");function x(){Promise.any([electron.dialog.showOpenDialog({properties:["openDirectory"],filters:l,message:c})]).then(w=>{w.canceled||(n(2,d=w.filePaths[0]),g())})}s(x,"selectFile");function _(){n(2,d=o),g()}s(_,"onReset"),g();function h(){d=this.value,n(2,d)}s(h,"input_input_handler");let v=s(()=>x(),"click_handler");function b(w){p=w,n(3,p)}s(b,"basedialogitem_warningText_binding");function y(w){m=w,n(4,m)}return s(y,"basedialogitem_errorText_binding"),t.$$set=w=>{"label"in w&&n(0,i=w.label),"tooltip"in w&&n(1,a=w.tooltip),"value"in w&&n(8,r=w.value),"defaultValue"in w&&n(9,o=w.defaultValue),"filters"in w&&n(10,l=w.filters),"fileSelectMessage"in w&&n(11,c=w.fileSelectMessage),"valueChecker"in w&&n(12,u=w.valueChecker)},[i,a,d,p,m,g,x,_,r,o,l,c,u,h,v,b,y]}s(eve,"instance");var Df=class extends Pe{constructor(e){super(),Ve(this,e,eve,$xe,De,{label:0,tooltip:1,value:8,defaultValue:9,filters:10,fileSelectMessage:11,valueChecker:12})}};s(Df,"FolderSelect");var Qx=Df;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".animated-java-file-select-icon.svelte-9od7jv{display:flex;justify-content:flex-end}i.svelte-9od7jv{font-size:20px;margin-right:4px;color:var(--color-subtle_text);cursor:pointer}i.svelte-9od7jv:hover{color:var(--color-text)}input.svelte-9od7jv{font-family:var(--font-code)}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function tve(t){let e,n,i,a,r,o,l,c,d,u,p;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("input"),c=J(),d=L("div"),d.innerHTML='insert_drive_file',E(n,"class","name_space_left"),E(n,"for",a=t[18]),E(o,"type","text"),E(o,"class","dark_bordered half focusable_input svelte-9od7jv"),E(o,"id",l=t[18]),E(d,"class","tool animated-java-file-select-icon svelte-9od7jv"),E(e,"class","dialog_bar form_bar")},m(m,f){U(m,e,f),I(e,n),I(n,i),I(e,r),I(e,o),Bt(o,t[2]),I(e,c),I(e,d),u||(p=[Ue(o,"input",t[13]),Ue(o,"input",t[5]),Ue(o,"change",t[5]),Ue(d,"click",t[14])],u=!0)},p(m,f){f&1&&ct(i,m[0]),f&262144&&a!==(a=m[18])&&E(n,"for",a),f&262144&&l!==(l=m[18])&&E(o,"id",l),f&4&&o.value!==m[2]&&Bt(o,m[2])},d(m){m&&z(e),u=!1,Rt(p)}}}s(tve,"create_default_slot");function nve(t){let e,n,i,a;function r(c){t[15](c)}s(r,"basedialogitem_warningText_binding");function o(c){t[16](c)}s(o,"basedialogitem_errorText_binding");let l={label:t[0],tooltip:t[1],onReset:t[7],$$slots:{default:[tve,({id:c})=>({18:c}),({id:c})=>c?262144:0]},$$scope:{ctx:t}};return t[3]!==void 0&&(l.warningText=t[3]),t[4]!==void 0&&(l.errorText=t[4]),e=new Ln({props:l}),Te.push(()=>Be(e,"warningText",r)),Te.push(()=>Be(e,"errorText",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,[d]){let u={};d&1&&(u.label=c[0]),d&2&&(u.tooltip=c[1]),d&786437&&(u.$$scope={dirty:d,ctx:c}),!n&&d&8&&(n=!0,u.warningText=c[3],Me(()=>n=!1)),!i&&d&16&&(i=!0,u.errorText=c[4],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s(nve,"create_fragment");function ive(t,e,n){let{label:i}=e,{tooltip:a=""}=e,{value:r}=e,{defaultValue:o}=e,{filters:l=[]}=e,{fileSelectMessage:c="Select File"}=e,d=r.get(),{valueChecker:u=void 0}=e,p="",m="";function f(){if(!u)return;let w=u(r.get());w.type==="error"?n(4,m=w.message):n(4,m=""),w.type==="warning"?n(3,p=w.message):n(3,p="")}s(f,"checkValue"),r.subscribe(()=>f());function g(){r.set(d),n(2,d=r.get())}s(g,"onValueChange");function x(){Promise.any([electron.dialog.showOpenDialog({properties:["openFile","promptToCreate"],filters:l,message:c})]).then(w=>{w.canceled||(n(2,d=w.filePaths[0]),g())})}s(x,"selectFile");function _(){n(2,d=o),g()}s(_,"onReset"),g();function h(){d=this.value,n(2,d)}s(h,"input_input_handler");let v=s(()=>x(),"click_handler");function b(w){p=w,n(3,p)}s(b,"basedialogitem_warningText_binding");function y(w){m=w,n(4,m)}return s(y,"basedialogitem_errorText_binding"),t.$$set=w=>{"label"in w&&n(0,i=w.label),"tooltip"in w&&n(1,a=w.tooltip),"value"in w&&n(8,r=w.value),"defaultValue"in w&&n(9,o=w.defaultValue),"filters"in w&&n(10,l=w.filters),"fileSelectMessage"in w&&n(11,c=w.fileSelectMessage),"valueChecker"in w&&n(12,u=w.valueChecker)},[i,a,d,p,m,g,x,_,r,o,l,c,u,h,v,b,y]}s(ive,"instance");var Ff=class extends Pe{constructor(e){super(),Ve(this,e,ive,nve,De,{label:0,tooltip:1,value:8,defaultValue:9,filters:10,fileSelectMessage:11,valueChecker:12})}};s(Ff,"FileSelect");var Nf=Ff;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".animated-java-file-select-icon.svelte-9od7jv{display:flex;justify-content:flex-end}i.svelte-9od7jv{font-size:20px;margin-right:4px;color:var(--color-subtle_text);cursor:pointer}i.svelte-9od7jv:hover{color:var(--color-text)}input.svelte-9od7jv{font-family:var(--font-code)}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var ave=window;function $x(t,e,n={}){let i=Object.assign({tab:" ",indentOn:/[({\[]$/,moveToNewLine:/^[)}\]]/,spellcheck:!1,catchTab:!0,preserveIdent:!0,addClosing:!0,history:!0,window:ave},n),a=i.window,r=a.document,o=[],l=[],c=-1,d=!1,u,p;t.setAttribute("contenteditable","plaintext-only"),t.setAttribute("spellcheck",i.spellcheck?"true":"false"),t.style.outline="none",t.style.overflowWrap="break-word",t.style.overflowY="auto",t.style.whiteSpace="pre-wrap";let m=!1;e(t),t.contentEditable!=="plaintext-only"&&(m=!0),m&&t.setAttribute("contenteditable","true");let f=Q(()=>{let V=v();e(t,V),b(V)},30),g=!1,x=s(V=>!W(V)&&!ee(V)&&V.key!=="Meta"&&V.key!=="Control"&&V.key!=="Alt"&&!V.key.startsWith("Arrow"),"shouldRecord"),_=Q(V=>{x(V)&&(D(),g=!1)},300),h=s((V,H)=>{o.push([V,H]),t.addEventListener(V,H)},"on");h("keydown",V=>{V.defaultPrevented||(p=Ie(),i.preserveIdent?S(V):F(V),i.catchTab&&k(V),i.addClosing&&N(V),i.history&&(R(V),x(V)&&!g&&(D(),g=!0)),m&&!Z(V)&&b(v()))}),h("keyup",V=>{V.defaultPrevented||V.isComposing||(p!==Ie()&&f(),_(V),u&&u(Ie()))}),h("focus",V=>{d=!0}),h("blur",V=>{d=!1}),h("paste",V=>{D(),B(V),D(),u&&u(Ie())});function v(){let V=ge(),H={start:0,end:0,dir:void 0},{anchorNode:re,anchorOffset:xe,focusNode:fe,focusOffset:te}=V;if(!re||!fe)throw"error1";if(re===t&&fe===t)return H.start=xe>0&&t.textContent?t.textContent.length:0,H.end=te>0&&t.textContent?t.textContent.length:0,H.dir=te>=xe?"->":"<-",H;if(re.nodeType===Node.ELEMENT_NODE){let Y=r.createTextNode("");re.insertBefore(Y,re.childNodes[xe]),re=Y,xe=0}if(fe.nodeType===Node.ELEMENT_NODE){let Y=r.createTextNode("");fe.insertBefore(Y,fe.childNodes[te]),fe=Y,te=0}return q(t,Y=>{if(Y===re&&Y===fe)return H.start+=xe,H.end+=te,H.dir=xe<=te?"->":"<-","stop";if(Y===re)if(H.start+=xe,!H.dir)H.dir="->";else return"stop";else if(Y===fe)if(H.end+=te,!H.dir)H.dir="<-";else return"stop";Y.nodeType===Node.TEXT_NODE&&(H.dir!="->"&&(H.start+=Y.nodeValue.length),H.dir!="<-"&&(H.end+=Y.nodeValue.length))}),t.normalize(),H}s(v,"save");function b(V){let H=ge(),re,xe=0,fe,te=0;if(V.dir||(V.dir="->"),V.start<0&&(V.start=0),V.end<0&&(V.end=0),V.dir=="<-"){let{start:we,end:Le}=V;V.start=Le,V.end=we}let Y=0;q(t,we=>{if(we.nodeType!==Node.TEXT_NODE)return;let Le=(we.nodeValue||"").length;if(Y+Le>V.start&&(re||(re=we,xe=V.start-Y),Y+Le>V.end))return fe=we,te=V.end-Y,"stop";Y+=Le}),re||(re=t,xe=t.childNodes.length),fe||(fe=t,te=t.childNodes.length),V.dir=="<-"&&([re,xe,fe,te]=[fe,te,re,xe]),H.setBaseAndExtent(re,xe,fe,te)}s(b,"restore");function y(){let H=ge().getRangeAt(0),re=r.createRange();return re.selectNodeContents(t),re.setEnd(H.startContainer,H.startOffset),re.toString()}s(y,"beforeCursor");function w(){let H=ge().getRangeAt(0),re=r.createRange();return re.selectNodeContents(t),re.setStart(H.endContainer,H.endOffset),re.toString()}s(w,"afterCursor");function S(V){if(V.key==="Enter"){let H=y(),re=w(),[xe]=he(H),fe=xe;if(i.indentOn.test(H)&&(fe+=i.tab),fe.length>0?(le(V),V.stopPropagation(),X(` `+fe)):F(V),fe!==xe&&i.moveToNewLine.test(re)){let te=v();X(` `+xe),b(te)}}}s(S,"handleNewLine");function F(V){if(m&&V.key==="Enter")if(le(V),V.stopPropagation(),w()==""){X(` `);let H=v();H.start=--H.end,b(H)}else X(` `)}s(F,"legacyNewLineFix");function N(V){let H=`([{'"`,re=`)]}'"`,xe=w(),fe=y(),te=fe.substr(fe.length-1)==="\\",Y=xe.substr(0,1);if(re.includes(V.key)&&!te&&Y===V.key){let we=v();le(V),we.start=++we.end,b(we)}else if(H.includes(V.key)&&!te&&(`"'`.includes(V.key)||[""," ",` `].includes(Y))){le(V);let we=v(),Le=we.start==we.end?"":ge().toString(),Tt=V.key+Le+re[H.indexOf(V.key)];X(Tt),we.start++,we.end++,b(we)}}s(N,"handleSelfClosingCharacters");function k(V){if(V.key==="Tab")if(le(V),V.shiftKey){let H=y(),[re,xe]=he(H);if(re.length>0){let fe=v(),te=Math.min(i.tab.length,re.length);b({start:xe,end:xe+te}),r.execCommand("delete"),fe.start-=te,fe.end-=te,b(fe)}}else X(i.tab)}s(k,"handleTabCharacters");function R(V){if(W(V)){le(V),c--;let H=l[c];H&&(t.innerHTML=H.html,b(H.pos)),c<0&&(c=0)}if(ee(V)){le(V),c++;let H=l[c];H&&(t.innerHTML=H.html,b(H.pos)),c>=l.length&&c--}}s(R,"handleUndoRedo");function D(){if(!d)return;let V=t.innerHTML,H=v(),re=l[c];if(re&&re.html===V&&re.pos.start===H.start&&re.pos.end===H.end)return;c++,l[c]={html:V,pos:H},l.splice(c+1);let xe=300;c>xe&&(c=xe,l.splice(0,1))}s(D,"recordHistory");function B(V){le(V);let H=(V.originalEvent||V).clipboardData.getData("text/plain").replace(/\r/g,""),re=v();X(H),e(t),b({start:Math.min(re.start,re.end)+H.length,end:Math.min(re.start,re.end)+H.length,dir:"<-"})}s(B,"handlePaste");function q(V,H){let re=[];V.firstChild&&re.push(V.firstChild);let xe=re.pop();for(;xe&&H(xe)!=="stop";)xe.nextSibling&&re.push(xe.nextSibling),xe.firstChild&&re.push(xe.firstChild),xe=re.pop()}s(q,"visit");function G(V){return V.metaKey||V.ctrlKey}s(G,"isCtrl");function W(V){return G(V)&&!V.shiftKey&&me(V)==="Z"}s(W,"isUndo");function ee(V){return G(V)&&V.shiftKey&&me(V)==="Z"}s(ee,"isRedo");function Z(V){return G(V)&&me(V)==="C"}s(Z,"isCopy");function me(V){let H=V.key||V.keyCode||V.which;if(H)return(typeof H=="string"?H:String.fromCharCode(H)).toUpperCase()}s(me,"getKeyCode");function X(V){V=V.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),r.execCommand("insertHTML",!1,V)}s(X,"insert");function Q(V,H){let re=0;return(...xe)=>{clearTimeout(re),re=a.setTimeout(()=>V(...xe),H)}}s(Q,"debounce");function he(V){let H=V.length-1;for(;H>=0&&V[H]!==` `;)H--;H++;let re=H;for(;rei.style.top=`-${a.scrollTop}px`));let o=(a.textContent||"").replace(/\n+$/,` `).split(` `).length+1,l="";for(let c=1;c{var x;g.innerHTML=m((x=g.textContent)!==null&&x!==void 0?x:"",a)}:g=>{};return o?zT(f):f}return s(p,"wrapHighlight"),t.addEventListener("input",u),{destroy(){d(),t.removeEventListener("input",u)},update(m){({highlight:n,onUpdate:i,syntax:a,value:r,withLineNumbers:o,...l}=m),e.highlight!==n||e.withLineNumbers!==o?(d(),c=$x(t,p(n),e)):c.updateOptions(l),r!==c.toString()&&c.updateCode(r),e={highlight:n,value:r,withLineNumbers:o,...l}}}}s(UT,"codejar");function ove(t){let e;return{c(){e=Re(t[1])},m(n,i){U(n,e,i)},p(n,i){i&2&&ct(e,n[1])},d(n){n&&z(e)}}}s(ove,"create_else_block");function sve(t){let e,n=t[12](t[1],t[13])+"",i;return{c(){e=new Yi(!1),i=_t(),e.a=i},m(a,r){e.m(n,a,r),U(a,i,r)},p(a,r){r&12290&&n!==(n=a[12](a[1],a[13])+"")&&e.p(n)},d(a){a&&z(i),a&&e.d()}}}s(sve,"create_if_block");function lve(t){let e,n,i,a,r,o,l,c;function d(m,f){return m[12]?sve:ove}s(d,"select_block_type");let u=d(t,-1),p=u(t);return{c(){e=L("pre"),n=L("code"),p.c(),E(n,"class",i=t[13]?`language-${t[13]}`:""),E(e,"class",a=(t[13]?`language-${t[13]}`:"")+" "+(t[2]??"")),E(e,"style",r=t[3]?t[3]:"")},m(m,f){U(m,e,f),I(e,n),p.m(n,null),t[15](e),l||(c=bn(o=UT.call(null,e,{addClosing:t[4],catchTab:t[5],highlight:t[12],history:t[6],indentOn:t[7],onUpdate:t[14],preserveIdent:t[8],spellcheck:t[9],syntax:t[13],tab:t[10],value:t[1],withLineNumbers:t[11]})),l=!0)},p(m,[f]){u===(u=d(m,f))&&p?p.p(m,f):(p.d(1),p=u(m),p&&(p.c(),p.m(n,null))),f&8192&&i!==(i=m[13]?`language-${m[13]}`:"")&&E(n,"class",i),f&8196&&a!==(a=(m[13]?`language-${m[13]}`:"")+" "+(m[2]??""))&&E(e,"class",a),f&8&&r!==(r=m[3]?m[3]:"")&&E(e,"style",r),o&&qn(o.update)&&f&16370&&o.update.call(null,{addClosing:m[4],catchTab:m[5],highlight:m[12],history:m[6],indentOn:m[7],onUpdate:m[14],preserveIdent:m[8],spellcheck:m[9],syntax:m[13],tab:m[10],value:m[1],withLineNumbers:m[11]})},i:ie,o:ie,d(m){m&&z(e),p.d(),t[15](null),l=!1,c()}}}s(lve,"create_fragment");function cve(t,e,n){let i=Bg(),{element:a=void 0}=e,{class:r=void 0}=e,{style:o=void 0}=e,{addClosing:l=!0}=e,{catchTab:c=!0}=e,{history:d=!0}=e,{indentOn:u=/{$/}=e,{preserveIdent:p=!0}=e,{spellcheck:m=!1}=e,{tab:f=" "}=e,{withLineNumbers:g=void 0}=e,{highlight:x=void 0}=e,{syntax:_=void 0}=e,{value:h=""}=e;function v(y){n(1,h=y),i("change",{value:y})}s(v,"onUpdate");function b(y){Te[y?"unshift":"push"](()=>{a=y,n(0,a)})}return s(b,"pre_binding"),t.$$set=y=>{"element"in y&&n(0,a=y.element),"class"in y&&n(2,r=y.class),"style"in y&&n(3,o=y.style),"addClosing"in y&&n(4,l=y.addClosing),"catchTab"in y&&n(5,c=y.catchTab),"history"in y&&n(6,d=y.history),"indentOn"in y&&n(7,u=y.indentOn),"preserveIdent"in y&&n(8,p=y.preserveIdent),"spellcheck"in y&&n(9,m=y.spellcheck),"tab"in y&&n(10,f=y.tab),"withLineNumbers"in y&&n(11,g=y.withLineNumbers),"highlight"in y&&n(12,x=y.highlight),"syntax"in y&&n(13,_=y.syntax),"value"in y&&n(1,h=y.value)},[a,h,r,o,l,c,d,u,p,m,f,g,x,_,v,b]}s(cve,"instance");var Rf=class extends Pe{constructor(e){super(),Ve(this,e,cve,lve,De,{element:0,class:2,style:3,addClosing:4,catchTab:5,history:6,indentOn:7,preserveIdent:8,spellcheck:9,tab:10,withLineNumbers:11,highlight:12,syntax:13,value:1})}};s(Rf,"CodeJar");var Td=Rf;function qT(t){let e,n;return{c(){e=L("div"),n=Re(t[1]),E(e,"class","placeholder svelte-e08vqd")},m(i,a){U(i,e,a),I(e,n)},p(i,a){a&2&&ct(n,i[1])},d(i){i&&z(e)}}}s(qT,"create_if_block");function uve(t){let e,n,i,a,r,o,l,c,d,u,p;function m(_){t[7](_)}s(m,"codejar_element_binding");function f(_){t[8](_)}s(f,"codejar_value_binding");let g={syntax:t[3],highlight:dve,preserveIdent:!0,history:!0,class:"language-"+(t[3]??"plaintext"),style:` font-family: var(--font-code); font-size: 14px; padding: 3px 6px; max-height: 20em; height: fit-content; padding-bottom: 1rem; width: 100%; outline: none; overflow-wrap: unset; overflow-y: scroll; white-space: pre; margin: 0; border: 1px solid var(--color-border); border-radius: 0; text-shadow: 0px 1px rgba(0, 0, 0, 0.3); `+t[2]};t[4]!==void 0&&(g.element=t[4]),t[0]!==void 0&&(g.value=t[0]),n=new Td({props:g}),Te.push(()=>Be(n,"element",m)),Te.push(()=>Be(n,"value",f)),n.$on("change",t[9]);let x=t[1]&&(!t[0]||t[0].length===0)&&qT(t);return{c(){e=L("div"),Ce(n.$$.fragment),r=J(),o=L("div"),c=J(),x&&x.c(),E(e,"class","content codejar-container svelte-e08vqd")},m(_,h){U(_,e,h),Ae(n,e,null),I(e,r),I(e,o),I(e,c),x&&x.m(e,null),d=!0,u||(p=[bn(l=t[6].call(null,o)),Ue(e,"keydown",t[5])],u=!0)},p(_,[h]){let v={};h&8&&(v.syntax=_[3]),h&8&&(v.class="language-"+(_[3]??"plaintext")),h&4&&(v.style=` font-family: var(--font-code); font-size: 14px; padding: 3px 6px; max-height: 20em; height: fit-content; padding-bottom: 1rem; width: 100%; outline: none; overflow-wrap: unset; overflow-y: scroll; white-space: pre; margin: 0; border: 1px solid var(--color-border); border-radius: 0; text-shadow: 0px 1px rgba(0, 0, 0, 0.3); `+_[2]),!i&&h&16&&(i=!0,v.element=_[4],Me(()=>i=!1)),!a&&h&1&&(a=!0,v.value=_[0],Me(()=>a=!1)),n.$set(v),_[1]&&(!_[0]||_[0].length===0)?x?x.p(_,h):(x=qT(_),x.c(),x.m(e,null)):x&&(x.d(1),x=null)},i(_){d||(ae(n.$$.fragment,_),d=!0)},o(_){de(n.$$.fragment,_),d=!1},d(_){_&&z(e),je(n),x&&x.d(),u=!1,Rt(p)}}}s(uve,"create_fragment");function dve(t,e){return e?Prism.highlight(t,Prism.languages[e],e):t}s(dve,"highlight");function pve(t,e,n){let{value:i}=e,{placeholder:a=void 0}=e,{style:r=void 0}=e,{syntax:o=void 0}=e,l,c=s(f=>{f instanceof KeyboardEvent&&(f.key==="Tab"||f.key==="Enter"?f.stopPropagation():(f.code==="KeyZ"||f.code==="KeyY")&&f.ctrlKey&&requestAnimationFrame(()=>{l?.textContent!=null&&n(0,i=l.textContent)}))},"onKeydown"),d=s(f=>{l&&(n(4,l.style.overflowWrap="unset",l),n(4,l.style.whiteSpace="pre",l))},"forceNoWrap");function u(f){l=f,n(4,l)}s(u,"codejar_element_binding");function p(f){i=f,n(0,i)}s(p,"codejar_value_binding");let m=s(()=>d(),"change_handler");return t.$$set=f=>{"value"in f&&n(0,i=f.value),"placeholder"in f&&n(1,a=f.placeholder),"style"in f&&n(2,r=f.style),"syntax"in f&&n(3,o=f.syntax)},t.$$.update=()=>{if(t.$$.dirty&16)e:l&&d();if(t.$$.dirty&1)e:i!==void 0&&d()},[i,a,r,o,l,c,d,u,p,m]}s(pve,"instance");var Mf=class extends Pe{constructor(e){super(),Ve(this,e,pve,uve,De,{value:0,placeholder:1,style:2,syntax:3})}};s(Mf,"CustomCodeJar");var $s=Mf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.content.svelte-e08vqd{position:relative}.placeholder.svelte-e08vqd{position:absolute;pointer-events:none;color:var(--color-subtle_text);font-family:var(--font-code);font-size:14px;padding:6px 12px;user-select:none;opacity:0.5;top:0;left:0;width:100%;font-style:italic}.codejar-container.svelte-e08vqd .language-snbtTextComponent{& .brackets {\r color: #5ba8c5;\r };& .token.punctuation {\r color: #89ddff;\r };& .token.property {\r color: #eeffff;\r };& .token.escape-sequence {\r color: #89ddff;\r };& .token.constant {\r color: #c767d7;\r border-bottom: 1px solid;\r };& .token.number {\r color: #f92672;\r };& .token.boolean {\r color: #f78c6c;\r };& .token.string {\r color: #aef941;\r }}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function HT(t){let e,n,i;return{c(){e=L("textarea"),e.readOnly=!0,E(e,"rows",n=t[5].split(` `).length+1),e.value=i=t[5]??t[4],E(e,"class","svelte-j9cb7d")},m(a,r){U(a,e,r)},p(a,r){r&32&&n!==(n=a[5].split(` `).length+1)&&E(e,"rows",n),r&48&&i!==(i=a[5]??a[4])&&(e.value=i)},d(a){a&&z(e)}}}s(HT,"create_if_block");function mve(t){let e,n,i,a,r,o,l,c,d,u,p,m;function f(_){t[11](_)}s(f,"customcodejar_value_binding");let g={syntax:t[3],style:t[5]?"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;":"border: 1px solid var(--color-border);"};t[6]!==void 0&&(g.value=t[6]),l=new $s({props:g}),Te.push(()=>Be(l,"value",f));let x=(t[5]||t[4])&&HT(t);return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("div"),Ce(l.$$.fragment),d=J(),x&&x.c(),E(n,"class","name_space_left svelte-j9cb7d"),E(n,"for",a=t[15]),E(o,"class","content codejar-container svelte-j9cb7d"),E(e,"class","dialog_bar form_bar custom svelte-j9cb7d")},m(_,h){U(_,e,h),I(e,n),I(n,i),I(e,r),I(e,o),Ae(l,o,null),I(o,d),x&&x.m(o,null),u=!0,p||(m=Ue(o,"keydown",t[7]),p=!0)},p(_,h){(!u||h&1)&&ct(i,_[0]),(!u||h&32768&&a!==(a=_[15]))&&E(n,"for",a);let v={};h&8&&(v.syntax=_[3]),h&32&&(v.style=_[5]?"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;":"border: 1px solid var(--color-border);"),!c&&h&64&&(c=!0,v.value=_[6],Me(()=>c=!1)),l.$set(v),_[5]||_[4]?x?x.p(_,h):(x=HT(_),x.c(),x.m(o,null)):x&&(x.d(1),x=null)},i(_){u||(ae(l.$$.fragment,_),u=!0)},o(_){de(l.$$.fragment,_),u=!1},d(_){_&&z(e),je(l),x&&x.d(),p=!1,m()}}}s(mve,"create_default_slot");function fve(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[8],$$slots:{default:[mve,({id:i})=>({15:i}),({id:i})=>i?32768:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&98425&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(fve,"create_fragment");function hve(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,y=>n(6,i=y)),c),"$$subscribe_value");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=""}=e,{value:c}=e;r();let{defaultValue:d}=e,{valueChecker:u=void 0}=e,{syntax:p=void 0}=e;c.get();let m,f="",g="";function x(){if(u){let y=u(i);y.type==="error"?n(5,g=y.message):n(5,g=""),y.type==="warning"?n(4,f=y.message):n(4,f="")}}s(x,"onValueChange");let _=c.subscribe(()=>{x()});Zi(()=>{_()});let h=s(y=>{y instanceof KeyboardEvent&&(y.key==="Tab"||y.key==="Enter"?y.stopPropagation():(y.code==="KeyZ"||y.code==="KeyY")&&y.ctrlKey&&requestAnimationFrame(()=>{m?.textContent!=null&&Jt(c,i=m.textContent,i)}))},"onKeydown");function v(){Jt(c,i=d,i),x()}s(v,"onReset"),x();function b(y){i=y,c.set(i)}return s(b,"customcodejar_value_binding"),t.$$set=y=>{"label"in y&&n(0,o=y.label),"tooltip"in y&&n(1,l=y.tooltip),"value"in y&&r(n(2,c=y.value)),"defaultValue"in y&&n(9,d=y.defaultValue),"valueChecker"in y&&n(10,u=y.valueChecker),"syntax"in y&&n(3,p=y.syntax)},[o,l,c,p,f,g,i,h,v,d,u,b]}s(hve,"instance");var Bf=class extends Pe{constructor(e){super(),Ve(this,e,hve,fve,De,{label:0,tooltip:1,value:2,defaultValue:9,valueChecker:10,syntax:3})}};s(Bf,"CodeInput");var ka=Bf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`label.svelte-j9cb7d{margin-bottom:8px}.custom.svelte-j9cb7d{flex-direction:column}textarea.svelte-j9cb7d{color:var(--color-error);background-color:var(--color-back);padding:3px 6px;overflow:auto;height:min-content;font-size:0.9rem;font-family:var(--font-code);margin:8px;margin-top:0px;border-radius:0 0 0.3em 0.3em;border:1px solid var(--color-error);white-space:pre;tab-size:4}.codejar-container.svelte-j9cb7d .language-snbtTextComponent{& .brackets {\r color: #5ba8c5;\r };& .token.punctuation {\r color: #89ddff;\r };& .token.property {\r color: #eeffff;\r };& .token.escape-sequence {\r color: #89ddff;\r };& .token.constant {\r color: #c767d7;\r border-bottom: 1px solid;\r };& .token.number {\r color: #f92672;\r };& .token.boolean {\r color: #f78c6c;\r };& .token.string {\r color: #aef941;\r }}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function gve(t){let e,n,i,a,r,o,l,c,d,u,p,m;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("div"),l=L("div"),c=J(),d=L("input"),E(n,"class","name_space_left"),E(n,"for",a=t[7]),E(l,"class","spacer svelte-1ai5ebm"),E(d,"type","checkbox"),E(d,"class","focusable_input"),E(d,"id",u=t[7]),E(o,"class","checkbox-line svelte-1ai5ebm"),E(e,"class","dialog_bar form_bar checkbox_bar svelte-1ai5ebm")},m(f,g){U(f,e,g),I(e,n),I(n,i),I(e,r),I(e,o),I(o,l),I(o,c),I(o,d),d.checked=t[3],p||(m=Ue(d,"change",t[6]),p=!0)},p(f,g){g&1&&ct(i,f[0]),g&128&&a!==(a=f[7])&&E(n,"for",a),g&128&&u!==(u=f[7])&&E(d,"id",u),g&8&&(d.checked=f[3])},d(f){f&&z(e),p=!1,m()}}}s(gve,"create_default_slot");function _ve(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[4],$$slots:{default:[gve,({id:i})=>({7:i}),({id:i})=>i?128:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&393&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(_ve,"create_fragment");function xve(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,m=>n(3,i=m)),c),"$$subscribe_checked");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=""}=e,{checked:c}=e;r();let{defaultValue:d}=e;function u(){c.set(d)}s(u,"onReset");function p(){i=this.checked,c.set(i)}return s(p,"input_change_handler"),t.$$set=m=>{"label"in m&&n(0,o=m.label),"tooltip"in m&&n(1,l=m.tooltip),"checked"in m&&r(n(2,c=m.checked)),"defaultValue"in m&&n(5,d=m.defaultValue)},[o,l,c,i,u,d,p]}s(xve,"instance");var Pf=class extends Pe{constructor(e){super(),Ve(this,e,xve,_ve,De,{label:0,tooltip:1,checked:2,defaultValue:5})}};s(Pf,"Checkbox");var mi=Pf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".checkbox_bar.svelte-1ai5ebm{flex-direction:row}.checkbox-line.svelte-1ai5ebm{display:flex;flex-direction:row;align-items:center;height:min-content;flex-grow:1}.spacer.svelte-1ai5ebm{flex-grow:1;border-bottom:2px dashed var(--color-button);height:0px;margin:8px;margin-left:0px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var JT=Ee("module");var vve=(0,JT.createRequire)("/"),bve;try{bve=vve("worker_threads").Worker}catch{}var ra=Uint8Array,kc=Uint16Array,yve=Int32Array,GT=new ra([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),WT=new ra([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),wve=new ra([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),KT=s(function(t,e){for(var n=new kc(31),i=0;i<31;++i)n[i]=e+=1<>1|(Ut&21845)<<1,yo=(yo&52428)>>2|(yo&13107)<<2,yo=(yo&61680)>>4|(yo&3855)<<4,iv[Ut]=((yo&65280)>>8|(yo&255)<<8)>>1;var yo,Ut,Cd=s(function(t,e,n){for(var i=t.length,a=0,r=new kc(e);a>c]=d}else for(l=new kc(i),a=0;a>15-t[a]);return l},"hMap"),Sd=new ra(288);for(Ut=0;Ut<144;++Ut)Sd[Ut]=8;var Ut;for(Ut=144;Ut<256;++Ut)Sd[Ut]=9;var Ut;for(Ut=256;Ut<280;++Ut)Sd[Ut]=7;var Ut;for(Ut=280;Ut<288;++Ut)Sd[Ut]=8;var Ut,QT=new ra(32);for(Ut=0;Ut<32;++Ut)QT[Ut]=5;var Ut;var jve=Cd(Sd,9,1);var Ave=Cd(QT,5,1),ev=s(function(t){for(var e=t[0],n=1;ne&&(e=t[n]);return e},"max"),Ka=s(function(t,e,n){var i=e/8|0;return(t[i]|t[i+1]<<8)>>(e&7)&n},"bits"),tv=s(function(t,e){var n=e/8|0;return(t[n]|t[n+1]<<8|t[n+2]<<16)>>(e&7)},"bits16"),Tve=s(function(t){return(t+7)/8|0},"shft"),rv=s(function(t,e,n){return(e==null||e<0)&&(e=0),(n==null||n>t.length)&&(n=t.length),new ra(t.subarray(e,n))},"slc");var Cve=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],ja=s(function(t,e,n){var i=new Error(e||Cve[t]);if(i.code=t,Error.captureStackTrace&&Error.captureStackTrace(i,ja),!n)throw i;return i},"err"),Sve=s(function(t,e,n,i){var a=t.length,r=i?i.length:0;if(!a||e.f&&!e.l)return n||new ra(0);var o=!n,l=o||e.i!=2,c=e.i;o&&(n=new ra(a*3));var d=s(function(Y){var we=n.length;if(Y>we){var Le=new ra(Math.max(we*2,Y));Le.set(n),n=Le}},"cbuf"),u=e.f||0,p=e.p||0,m=e.b||0,f=e.l,g=e.d,x=e.m,_=e.n,h=a*8;do{if(!f){u=Ka(t,p,1);var v=Ka(t,p+1,3);if(p+=3,v)if(v==1)f=jve,g=Ave,x=9,_=5;else if(v==2){var S=Ka(t,p,31)+257,F=Ka(t,p+10,15)+4,N=S+Ka(t,p+5,31)+1;p+=14;for(var k=new ra(N),R=new ra(19),D=0;D>4;if(b<16)k[D++]=b;else{var ee=0,Z=0;for(b==16?(Z=3+Ka(t,p,3),p+=2,ee=k[D-1]):b==17?(Z=3+Ka(t,p,7),p+=3):b==18&&(Z=11+Ka(t,p,127),p+=7);Z--;)k[D++]=ee}}var me=k.subarray(0,S),X=k.subarray(S);x=ev(me),_=ev(X),f=Cd(me,x,1),g=Cd(X,_,1)}else ja(1);else{var b=Tve(p)+4,y=t[b-4]|t[b-3]<<8,w=b+y;if(w>a){c&&ja(0);break}l&&d(m+y),n.set(t.subarray(b,w),m),e.b=m+=y,e.p=p=w*8,e.f=u;continue}if(p>h){c&&ja(0);break}}l&&d(m+131072);for(var Q=(1<>4;if(p+=ee&15,p>h){c&&ja(0);break}if(ee||ja(2),le<256)n[m++]=le;else if(le==256){Ie=p,f=null;break}else{var ge=le-254;if(le>264){var D=le-257,V=GT[D];ge=Ka(t,p,(1<>4;H||ja(3),p+=H&15;var X=kve[re];if(re>3){var V=WT[re];X+=tv(t,p)&(1<h){c&&ja(0);break}l&&d(m+131072);var xe=m+ge;if(m>>0},"b4"),nv=s(function(t,e){return Ya(t,e)+Ya(t,e+4)*4294967296},"b8");function Ive(t,e){return Sve(t,{i:2},e&&e.out,e&&e.dictionary)}s(Ive,"inflateSync");var av=typeof TextDecoder<"u"&&new TextDecoder,Dve=0;try{av.decode(Ove,{stream:!0}),Dve=1}catch{}var Fve=s(function(t){for(var e="",n=0;;){var i=t[n++],a=(i>127)+(i>223)+(i>239);if(n+a>t.length)return{s:e,r:rv(t,n-1)};a?a==3?(i=((i&15)<<18|(t[n++]&63)<<12|(t[n++]&63)<<6|t[n++]&63)-65536,e+=String.fromCharCode(55296|i>>10,56320|i&1023)):a&1?e+=String.fromCharCode((i&31)<<6|t[n++]&63):e+=String.fromCharCode((i&15)<<12|(t[n++]&63)<<6|t[n++]&63):e+=String.fromCharCode(i)}},"dutf8");function Nve(t,e){if(e){for(var n="",i=0;i65558)&&ja(13);var a=Br(t,i+8);if(!a)return{};var r=Ya(t,i+16),o=r==4294967295||a==65535;if(o){var l=Ya(t,i-12);o=Ya(t,l)==101075792,o&&(a=Ya(t,l+32),r=Ya(t,l+48))}for(var c=e&&e.filter,d=0;dt.charCodeAt(0)));function _n(t){return Buffer.from(Lve[t]).toString("utf-8")}s(_n,"getFile");var e4=_n("src/systems/datapackCompiler/1.20.4/animation.mcb");var ov=_n("src/systems/datapackCompiler/1.20.4/global.mcb");var ns=_n("src/systems/datapackCompiler/1.20.4/global.mcbt");var t4=_n("src/systems/datapackCompiler/1.20.4/static.mcb");var n4=_n("src/systems/datapackCompiler/1.20.5/animation.mcb");var i4=_n("src/systems/datapackCompiler/1.20.5/static.mcb");var a4=_n("src/systems/datapackCompiler/1.21.2/animation.mcb");var sv=_n("src/systems/datapackCompiler/1.21.2/global.mcb");var r4=_n("src/systems/datapackCompiler/1.21.2/static.mcb");var Od=_n("src/systems/datapackCompiler/1.21.4/animation.mcb");var Id=_n("src/systems/datapackCompiler/1.21.4/static.mcb");var Lf=_n("src/systems/datapackCompiler/1.21.5/global.mcb");var Vve={"1.21.9":{animation:Od,static:Id,global:Lf,globalTemplates:ns},"1.21.6":{animation:Od,static:Id,global:Lf,globalTemplates:ns},"1.21.5":{animation:Od,static:Id,global:Lf,globalTemplates:ns},"1.21.4":{animation:Od,static:Id,global:sv,globalTemplates:ns},"1.21.2":{animation:a4,static:r4,global:sv,globalTemplates:ns},"1.20.5":{animation:n4,static:i4,global:ov,globalTemplates:ns},"1.20.4":{animation:e4,static:t4,global:ov,globalTemplates:ns}},wo=Vve;function o4(t){let e,n,i,a;function r(c){t[40](c)}s(r,"vector2d_valueX_binding_1");function o(c){t[41](c)}s(o,"vector2d_valueY_binding_1");let l={label:A("dialog.blueprint_settings.render_box.title"),tooltip:A("dialog.blueprint_settings.render_box.description"),defaultValueX:qt.render_box[0],minX:2,maxX:4096,defaultValueY:qt.render_box[1],minY:2,maxY:4096};return t[9]!==void 0&&(l.valueX=t[9]),t[10]!==void 0&&(l.valueY=t[10]),e=new Zx({props:l}),Te.push(()=>Be(e,"valueX",r)),Te.push(()=>Be(e,"valueY",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,d){let u={};!n&&d[0]&512&&(n=!0,u.valueX=c[9],Me(()=>n=!1)),!i&&d[0]&1024&&(i=!0,u.valueY=c[10],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s(o4,"create_if_block_9");function zve(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_;function h(k){t[46](k)}s(h,"select0_value_binding");let v={label:A("dialog.blueprint_settings.target_minecraft_version.title"),tooltip:A("dialog.blueprint_settings.target_minecraft_version.description"),options:d4,defaultOption:Object.keys(d4).at(-1)??"1.20.4"};t[6]!==void 0&&(v.value=t[6]),e=new es({props:v}),Te.push(()=>Be(e,"value",h)),a=new ts({props:{label:A("dialog.blueprint_settings.resource_pack_settings.title")}});function b(k){t[47](k)}s(b,"select1_value_binding");let y={label:A("dialog.blueprint_settings.resource_pack_export_mode.title"),options:{folder:A("dialog.blueprint_settings.resource_pack_export_mode.options.folder"),none:A("dialog.blueprint_settings.resource_pack_export_mode.options.none")},defaultOption:"folder"};t[4]!==void 0&&(y.value=t[4]),o=new es({props:y}),Te.push(()=>Be(o,"value",b));let w=t[30]!=="none"&&s4(t);u=new ts({props:{label:A("dialog.blueprint_settings.data_pack_settings.title")}});function S(k){t[53](k)}s(S,"select2_value_binding");let F={label:A("dialog.blueprint_settings.data_pack_export_mode.title"),options:{folder:A("dialog.blueprint_settings.data_pack_export_mode.options.folder"),none:A("dialog.blueprint_settings.data_pack_export_mode.options.none")},defaultOption:"folder"};t[5]!==void 0&&(F.value=t[5]),m=new es({props:F}),Te.push(()=>Be(m,"value",S));let N=t[32]!=="none"&&u4(t);return{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),r=J(),Ce(o.$$.fragment),c=J(),w&&w.c(),d=J(),Ce(u.$$.fragment),p=J(),Ce(m.$$.fragment),g=J(),N&&N.c(),x=_t()},m(k,R){Ae(e,k,R),U(k,i,R),Ae(a,k,R),U(k,r,R),Ae(o,k,R),U(k,c,R),w&&w.m(k,R),U(k,d,R),Ae(u,k,R),U(k,p,R),Ae(m,k,R),U(k,g,R),N&&N.m(k,R),U(k,x,R),_=!0},p(k,R){let D={};!n&&R[0]&64&&(n=!0,D.value=k[6],Me(()=>n=!1)),e.$set(D);let B={};!l&&R[0]&16&&(l=!0,B.value=k[4],Me(()=>l=!1)),o.$set(B),k[30]!=="none"?w?(w.p(k,R),R[0]&1073741824&&ae(w,1)):(w=s4(k),w.c(),ae(w,1),w.m(d.parentNode,d)):w&&(Sn(),de(w,1,1,()=>{w=null}),On());let q={};!f&&R[0]&32&&(f=!0,q.value=k[5],Me(()=>f=!1)),m.$set(q),k[32]!=="none"?N?(N.p(k,R),R[1]&2&&ae(N,1)):(N=u4(k),N.c(),ae(N,1),N.m(x.parentNode,x)):N&&(Sn(),de(N,1,1,()=>{N=null}),On())},i(k){_||(ae(e.$$.fragment,k),ae(a.$$.fragment,k),ae(o.$$.fragment,k),ae(w),ae(u.$$.fragment,k),ae(m.$$.fragment,k),ae(N),_=!0)},o(k){de(e.$$.fragment,k),de(a.$$.fragment,k),de(o.$$.fragment,k),de(w),de(u.$$.fragment,k),de(m.$$.fragment,k),de(N),_=!1},d(k){je(e,k),k&&z(i),je(a,k),k&&z(r),je(o,k),k&&z(c),w&&w.d(k),k&&z(d),je(u,k),k&&z(p),je(m,k),k&&z(g),N&&N.d(k),k&&z(x)}}}s(zve,"create_else_block");function Uve(t){let e,n,i,a,r,o,l,c,d;function u(_){t[43](_)}s(u,"lineinput_value_binding");let p={label:A("dialog.blueprint_settings.display_item.title"),tooltip:A("dialog.blueprint_settings.display_item.description"),defaultValue:qt.display_item,valueChecker:p4};t[11]!==void 0&&(p.value=t[11]),e=new aa({props:p}),Te.push(()=>Be(e,"value",u));function m(_){t[44](_)}s(m,"checkbox_checked_binding");let f={label:A("dialog.blueprint_settings.baked_animations.title"),tooltip:A("dialog.blueprint_settings.baked_animations.description"),defaultValue:qt.baked_animations};t[24]!==void 0&&(f.checked=t[24]),a=new mi({props:f}),Te.push(()=>Be(a,"checked",m));function g(_){t[45](_)}s(g,"fileselect_value_binding");let x={label:A("dialog.blueprint_settings.json_file.title"),tooltip:A("dialog.blueprint_settings.json_file.description"),defaultValue:qt.json_file,valueChecker:Qve};return t[25]!==void 0&&(x.value=t[25]),l=new Nf({props:x}),Te.push(()=>Be(l,"value",g)),{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment)},m(_,h){Ae(e,_,h),U(_,i,h),Ae(a,_,h),U(_,o,h),Ae(l,_,h),d=!0},p(_,h){let v={};!n&&h[0]&2048&&(n=!0,v.value=_[11],Me(()=>n=!1)),e.$set(v);let b={};!r&&h[0]&16777216&&(r=!0,b.checked=_[24],Me(()=>r=!1)),a.$set(b);let y={};!c&&h[0]&33554432&&(c=!0,y.value=_[25],Me(()=>c=!1)),l.$set(y)},i(_){d||(ae(e.$$.fragment,_),ae(a.$$.fragment,_),ae(l.$$.fragment,_),d=!0)},o(_){de(e.$$.fragment,_),de(a.$$.fragment,_),de(l.$$.fragment,_),d=!1},d(_){je(e,_),_&&z(i),je(a,_),_&&z(o),je(l,_)}}}s(Uve,"create_if_block");function s4(t){let e,n,i,a,r,o,l,c,d,u=t[27]&&l4(t),p=[Hve,qve],m=[];function f(h,v){return h[30]==="folder"?0:h[30]==="zip"?1:-1}s(f,"select_block_type_1"),~(n=f(t,[-1,-1,-1]))&&(i=m[n]=p[n](t));function g(h){t[51](h)}s(g,"checkbox_checked_binding_1");let x={label:A("dialog.blueprint_settings.enable_advanced_resource_pack_settings.title"),defaultValue:qt.enable_advanced_resource_pack_settings};t[13]!==void 0&&(x.checked=t[13]),r=new mi({props:x}),Te.push(()=>Be(r,"checked",g));let _=t[31]&&c4(t);return{c(){u&&u.c(),e=J(),i&&i.c(),a=J(),Ce(r.$$.fragment),l=J(),_&&_.c(),c=_t()},m(h,v){u&&u.m(h,v),U(h,e,v),~n&&m[n].m(h,v),U(h,a,v),Ae(r,h,v),U(h,l,v),_&&_.m(h,v),U(h,c,v),d=!0},p(h,v){h[27]?u?(u.p(h,v),v[0]&134217728&&ae(u,1)):(u=l4(h),u.c(),ae(u,1),u.m(e.parentNode,e)):u&&(Sn(),de(u,1,1,()=>{u=null}),On());let b=n;n=f(h,v),n===b?~n&&m[n].p(h,v):(i&&(Sn(),de(m[b],1,1,()=>{m[b]=null}),On()),~n?(i=m[n],i?i.p(h,v):(i=m[n]=p[n](h),i.c()),ae(i,1),i.m(a.parentNode,a)):i=null);let y={};!o&&v[0]&8192&&(o=!0,y.checked=h[13],Me(()=>o=!1)),r.$set(y),h[31]?_?(_.p(h,v),v[1]&1&&ae(_,1)):(_=c4(h),_.c(),ae(_,1),_.m(c.parentNode,c)):_&&(Sn(),de(_,1,1,()=>{_=null}),On())},i(h){d||(ae(u),ae(i),ae(r.$$.fragment,h),ae(_),d=!0)},o(h){de(u),de(i),de(r.$$.fragment,h),de(_),d=!1},d(h){u&&u.d(h),h&&z(e),~n&&m[n].d(h),h&&z(a),je(r,h),h&&z(l),_&&_.d(h),h&&z(c)}}}s(s4,"create_if_block_4");function l4(t){let e,n,i;function a(o){t[48](o)}s(a,"lineinput_value_binding_1");let r={label:A("dialog.blueprint_settings.display_item.title"),tooltip:A("dialog.blueprint_settings.display_item.description"),defaultValue:qt.display_item,valueChecker:p4};return t[11]!==void 0&&(r.value=t[11]),e=new aa({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2048&&(n=!0,c.value=o[11],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(l4,"create_if_block_8");function qve(t){let e,n,i;function a(o){t[50](o)}s(a,"fileselect_value_binding_1");let r={label:A("dialog.blueprint_settings.resource_pack_zip.title"),tooltip:A("dialog.blueprint_settings.resource_pack_zip.description"),defaultValue:qt.resource_pack,valueChecker:m4};return t[14]!==void 0&&(r.value=t[14]),e=new Nf({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&16384&&(n=!0,c.value=o[14],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(qve,"create_if_block_7");function Hve(t){let e,n,i;function a(o){t[49](o)}s(a,"folderselect_value_binding");let r={label:A("dialog.blueprint_settings.resource_pack.title"),tooltip:A("dialog.blueprint_settings.resource_pack.description"),defaultValue:qt.resource_pack,valueChecker:Zve};return t[14]!==void 0&&(r.value=t[14]),e=new Qx({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&16384&&(n=!0,c.value=o[14],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Hve,"create_if_block_6");function c4(t){let e,n,i,a,r;function o(c){t[52](c)}s(o,"numberslider_value_binding");let l={label:A("dialog.blueprint_settings.custom_model_data_offset.title"),tooltip:A("dialog.blueprint_settings.custom_model_data_offset.description"),defaultValue:qt.custom_model_data_offset,min:0,max:2147483647,valueStep:1};return t[12]!==void 0&&(l.value=t[12]),i=new Mr({props:l}),Te.push(()=>Be(i,"value",o)),{c(){e=L("p"),e.textContent=`${A("dialog.blueprint_settings.advanced_settings_warning")}`,n=J(),Ce(i.$$.fragment),E(e,"class","warning svelte-1fhdn4b")},m(c,d){U(c,e,d),U(c,n,d),Ae(i,c,d),r=!0},p(c,d){let u={};!a&&d[0]&4096&&(a=!0,u.value=c[12],Me(()=>a=!1)),i.$set(u)},i(c){r||(ae(i.$$.fragment,c),r=!0)},o(c){de(i.$$.fragment,c),r=!1},d(c){c&&z(e),c&&z(n),je(i,c)}}}s(c4,"create_if_block_5");function u4(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B=[Gve,Jve],q=[];function G(Y,we){return Y[32]==="folder"?0:Y[32]==="zip"?1:-1}s(G,"select_block_type_2"),~(e=G(t,[-1,-1,-1]))&&(n=q[e]=B[e](t));function W(Y){t[56](Y)}s(W,"codeinput0_value_binding");let ee={label:A("dialog.blueprint_settings.on_summon_function.title"),tooltip:A("dialog.blueprint_settings.on_summon_function.description"),defaultValue:qt.on_summon_function};t[16]!==void 0&&(ee.value=t[16]),a=new ka({props:ee}),Te.push(()=>Be(a,"value",W));function Z(Y){t[57](Y)}s(Z,"codeinput1_value_binding");let me={label:A("dialog.blueprint_settings.on_remove_function.title"),tooltip:A("dialog.blueprint_settings.on_remove_function.description"),defaultValue:qt.on_remove_function};t[17]!==void 0&&(me.value=t[17]),l=new ka({props:me}),Te.push(()=>Be(l,"value",Z));function X(Y){t[58](Y)}s(X,"codeinput2_value_binding");let Q={label:A("dialog.blueprint_settings.on_pre_tick_function.title"),tooltip:A("dialog.blueprint_settings.on_pre_tick_function.description"),defaultValue:qt.on_pre_tick_function};t[18]!==void 0&&(Q.value=t[18]),u=new ka({props:Q}),Te.push(()=>Be(u,"value",X));function he(Y){t[59](Y)}s(he,"codeinput3_value_binding");let Ie={label:A("dialog.blueprint_settings.on_post_tick_function.title"),tooltip:A("dialog.blueprint_settings.on_post_tick_function.description"),defaultValue:qt.on_post_tick_function};t[19]!==void 0&&(Ie.value=t[19]),f=new ka({props:Ie}),Te.push(()=>Be(f,"value",he));function le(Y){t[60](Y)}s(le,"numberslider0_value_binding");let ge={label:A("dialog.blueprint_settings.interpolation_duration.title"),tooltip:A("dialog.blueprint_settings.interpolation_duration.description"),defaultValue:qt.interpolation_duration,min:0,max:2147483647,valueStep:1};t[20]!==void 0&&(ge.value=t[20]),_=new Mr({props:ge}),Te.push(()=>Be(_,"value",le));function V(Y){t[61](Y)}s(V,"numberslider1_value_binding");let H={label:A("dialog.blueprint_settings.teleportation_duration.title"),tooltip:A("dialog.blueprint_settings.teleportation_duration.description"),defaultValue:qt.teleportation_duration,min:0,max:2147483647,valueStep:1};t[21]!==void 0&&(H.value=t[21]),b=new Mr({props:H}),Te.push(()=>Be(b,"value",V));function re(Y){t[62](Y)}s(re,"checkbox0_checked_binding_1");let xe={label:A("dialog.blueprint_settings.auto_update_rig_orientation.title"),tooltip:A("dialog.blueprint_settings.auto_update_rig_orientation.description"),defaultValue:qt.auto_update_rig_orientation};t[23]!==void 0&&(xe.checked=t[23]),S=new mi({props:xe}),Te.push(()=>Be(S,"checked",re));function fe(Y){t[63](Y)}s(fe,"checkbox1_checked_binding_1");let te={label:A("dialog.blueprint_settings.use_storage_for_animation.title"),tooltip:A("dialog.blueprint_settings.use_storage_for_animation.description"),defaultValue:qt.use_storage_for_animation};return t[22]!==void 0&&(te.checked=t[22]),k=new mi({props:te}),Te.push(()=>Be(k,"checked",fe)),{c(){n&&n.c(),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment),d=J(),Ce(u.$$.fragment),m=J(),Ce(f.$$.fragment),x=J(),Ce(_.$$.fragment),v=J(),Ce(b.$$.fragment),w=J(),Ce(S.$$.fragment),N=J(),Ce(k.$$.fragment)},m(Y,we){~e&&q[e].m(Y,we),U(Y,i,we),Ae(a,Y,we),U(Y,o,we),Ae(l,Y,we),U(Y,d,we),Ae(u,Y,we),U(Y,m,we),Ae(f,Y,we),U(Y,x,we),Ae(_,Y,we),U(Y,v,we),Ae(b,Y,we),U(Y,w,we),Ae(S,Y,we),U(Y,N,we),Ae(k,Y,we),D=!0},p(Y,we){let Le=e;e=G(Y,we),e===Le?~e&&q[e].p(Y,we):(n&&(Sn(),de(q[Le],1,1,()=>{q[Le]=null}),On()),~e?(n=q[e],n?n.p(Y,we):(n=q[e]=B[e](Y),n.c()),ae(n,1),n.m(i.parentNode,i)):n=null);let Tt={};!r&&we[0]&65536&&(r=!0,Tt.value=Y[16],Me(()=>r=!1)),a.$set(Tt);let tn={};!c&&we[0]&131072&&(c=!0,tn.value=Y[17],Me(()=>c=!1)),l.$set(tn);let kn={};!p&&we[0]&262144&&(p=!0,kn.value=Y[18],Me(()=>p=!1)),u.$set(kn);let Rn={};!g&&we[0]&524288&&(g=!0,Rn.value=Y[19],Me(()=>g=!1)),f.$set(Rn);let ii={};!h&&we[0]&1048576&&(h=!0,ii.value=Y[20],Me(()=>h=!1)),_.$set(ii);let Ft={};!y&&we[0]&2097152&&(y=!0,Ft.value=Y[21],Me(()=>y=!1)),b.$set(Ft);let $t={};!F&&we[0]&8388608&&(F=!0,$t.checked=Y[23],Me(()=>F=!1)),S.$set($t);let ai={};!R&&we[0]&4194304&&(R=!0,ai.checked=Y[22],Me(()=>R=!1)),k.$set(ai)},i(Y){D||(ae(n),ae(a.$$.fragment,Y),ae(l.$$.fragment,Y),ae(u.$$.fragment,Y),ae(f.$$.fragment,Y),ae(_.$$.fragment,Y),ae(b.$$.fragment,Y),ae(S.$$.fragment,Y),ae(k.$$.fragment,Y),D=!0)},o(Y){de(n),de(a.$$.fragment,Y),de(l.$$.fragment,Y),de(u.$$.fragment,Y),de(f.$$.fragment,Y),de(_.$$.fragment,Y),de(b.$$.fragment,Y),de(S.$$.fragment,Y),de(k.$$.fragment,Y),D=!1},d(Y){~e&&q[e].d(Y),Y&&z(i),je(a,Y),Y&&z(o),je(l,Y),Y&&z(d),je(u,Y),Y&&z(m),je(f,Y),Y&&z(x),je(_,Y),Y&&z(v),je(b,Y),Y&&z(w),je(S,Y),Y&&z(N),je(k,Y)}}}s(u4,"create_if_block_1");function Jve(t){let e,n,i;function a(o){t[55](o)}s(a,"fileselect_value_binding_2");let r={label:A("dialog.blueprint_settings.data_pack_zip.title"),tooltip:A("dialog.blueprint_settings.data_pack_zip.description"),defaultValue:qt.data_pack,valueChecker:m4};return t[15]!==void 0&&(r.value=t[15]),e=new Nf({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&32768&&(n=!0,c.value=o[15],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Jve,"create_if_block_3");function Gve(t){let e,n,i;function a(o){t[54](o)}s(a,"folderselect_value_binding_1");let r={label:A("dialog.blueprint_settings.data_pack.title"),tooltip:A("dialog.blueprint_settings.data_pack.description"),defaultValue:qt.data_pack,valueChecker:Xve};return t[15]!==void 0&&(r.value=t[15]),e=new Qx({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&32768&&(n=!0,c.value=o[15],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Gve,"create_if_block_2");function Wve(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k;e=new ts({props:{label:A("dialog.blueprint_settings.project_settings.title")}});function R(V){t[35](V)}s(R,"lineinput0_value_binding");let D={label:A("dialog.blueprint_settings.project_name.title"),tooltip:A("dialog.blueprint_settings.project_name.description"),defaultValue:"My Blueprint"};t[0]!==void 0&&(D.value=t[0]),i=new aa({props:D}),Te.push(()=>Be(i,"value",R));function B(V){t[36](V)}s(B,"vector2d_valueX_binding");function q(V){t[37](V)}s(q,"vector2d_valueY_binding");let G={label:A("dialog.blueprint_settings.texture_size.title"),tooltip:A("dialog.blueprint_settings.texture_size.description"),defaultValueX:16,minX:2,maxX:4096,defaultValueY:16,minY:2,maxY:4096,valueChecker:Yve};t[1]!==void 0&&(G.valueX=t[1]),t[2]!==void 0&&(G.valueY=t[2]),o=new Zx({props:G}),Te.push(()=>Be(o,"valueX",B)),Te.push(()=>Be(o,"valueY",q));function W(V){t[38](V)}s(W,"checkbox0_checked_binding");let ee={label:A("dialog.blueprint_settings.show_render_box.title"),tooltip:A("dialog.blueprint_settings.show_render_box.description"),defaultValue:qt.show_render_box};t[7]!==void 0&&(ee.checked=t[7]),u=new mi({props:ee}),Te.push(()=>Be(u,"checked",W));function Z(V){t[39](V)}s(Z,"checkbox1_checked_binding");let me={label:A("dialog.blueprint_settings.auto_render_box.title"),tooltip:A("dialog.blueprint_settings.auto_render_box.description"),defaultValue:qt.auto_render_box};t[8]!==void 0&&(me.checked=t[8]),f=new mi({props:me}),Te.push(()=>Be(f,"checked",Z));let X=!t[29]&&o4(t);h=new ts({props:{label:A("dialog.blueprint_settings.export_settings.title")}});function Q(V){t[42](V)}s(Q,"lineinput1_value_binding");let he={label:A("dialog.blueprint_settings.export_namespace.title"),tooltip:A("dialog.blueprint_settings.export_namespace.description"),defaultValue:qt.export_namespace,valueChecker:Kve};t[3]!==void 0&&(he.value=t[3]),b=new aa({props:he}),Te.push(()=>Be(b,"value",Q));let Ie=[Uve,zve],le=[];function ge(V,H){return V[28]?0:1}return s(ge,"select_block_type"),S=ge(t,[-1,-1,-1]),F=le[S]=Ie[S](t),{c(){Ce(e.$$.fragment),n=J(),Ce(i.$$.fragment),r=J(),Ce(o.$$.fragment),d=J(),Ce(u.$$.fragment),m=J(),Ce(f.$$.fragment),x=J(),X&&X.c(),_=J(),Ce(h.$$.fragment),v=J(),Ce(b.$$.fragment),w=J(),F.c(),N=_t()},m(V,H){Ae(e,V,H),U(V,n,H),Ae(i,V,H),U(V,r,H),Ae(o,V,H),U(V,d,H),Ae(u,V,H),U(V,m,H),Ae(f,V,H),U(V,x,H),X&&X.m(V,H),U(V,_,H),Ae(h,V,H),U(V,v,H),Ae(b,V,H),U(V,w,H),le[S].m(V,H),U(V,N,H),k=!0},p(V,H){let re={};!a&&H[0]&1&&(a=!0,re.value=V[0],Me(()=>a=!1)),i.$set(re);let xe={};!l&&H[0]&2&&(l=!0,xe.valueX=V[1],Me(()=>l=!1)),!c&&H[0]&4&&(c=!0,xe.valueY=V[2],Me(()=>c=!1)),o.$set(xe);let fe={};!p&&H[0]&128&&(p=!0,fe.checked=V[7],Me(()=>p=!1)),u.$set(fe);let te={};!g&&H[0]&256&&(g=!0,te.checked=V[8],Me(()=>g=!1)),f.$set(te),V[29]?X&&(Sn(),de(X,1,1,()=>{X=null}),On()):X?(X.p(V,H),H[0]&536870912&&ae(X,1)):(X=o4(V),X.c(),ae(X,1),X.m(_.parentNode,_));let Y={};!y&&H[0]&8&&(y=!0,Y.value=V[3],Me(()=>y=!1)),b.$set(Y);let we=S;S=ge(V,H),S===we?le[S].p(V,H):(Sn(),de(le[we],1,1,()=>{le[we]=null}),On(),F=le[S],F?F.p(V,H):(F=le[S]=Ie[S](V),F.c()),ae(F,1),F.m(N.parentNode,N))},i(V){k||(ae(e.$$.fragment,V),ae(i.$$.fragment,V),ae(o.$$.fragment,V),ae(u.$$.fragment,V),ae(f.$$.fragment,V),ae(X),ae(h.$$.fragment,V),ae(b.$$.fragment,V),ae(F),k=!0)},o(V){de(e.$$.fragment,V),de(i.$$.fragment,V),de(o.$$.fragment,V),de(u.$$.fragment,V),de(f.$$.fragment,V),de(X),de(h.$$.fragment,V),de(b.$$.fragment,V),de(F),k=!1},d(V){je(e,V),V&&z(n),je(i,V),V&&z(r),je(o,V),V&&z(d),je(u,V),V&&z(m),je(f,V),V&&z(x),X&&X.d(V),V&&z(_),je(h,V),V&&z(v),je(b,V),V&&z(w),le[S].d(V),V&&z(N)}}}s(Wve,"create_fragment");[...document.fonts.keys()].some(t=>t.family==="MinecraftFull")||new FontFace("MinecraftFull",Xx,{}).load().then(t=>{document.fonts.add(t)});var d4=Object.fromEntries(Object.entries(wo).map(([t])=>[t,t]));function Kve(t){return t===""?{type:"error",message:A("dialog.blueprint_settings.export_namespace.error.empty")}:/[^a-zA-Z0-9_]/.exec(t.trim())?{type:"error",message:A("dialog.blueprint_settings.export_namespace.error.invalid_characters")}:["global","animated_java"].includes(t)?{type:"error",message:A("dialog.blueprint_settings.export_namespace.error.reserved",t)}:{type:"success",message:""}}s(Kve,"exportNamespaceChecker");function p4(t){if(t==="")return{type:"error",message:A("dialog.blueprint_settings.display_item.error.no_item_selected")};if(t.split(":").length!==2)return{type:"error",message:A("dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace")};if(t.includes(" "))return{type:"error",message:A("dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace")};if(Xn.item&&!Xn.item.has(t.replace("minecraft:","")))return{type:"warning",message:A("dialog.blueprint_settings.display_item.warning.item_does_not_exist")};{let e;try{e=Mi("assets/minecraft/models/item/"+t.replace("minecraft:","")+".json")}catch(n){return console.error(n),{type:"error",message:A("dialog.blueprint_settings.display_item.error.item_model_not_found")}}return e.parent==="item/generated"||e.parent==="minecraft:item/generated"?{type:"success",message:""}:{type:"warning",message:A("dialog.blueprint_settings.display_item.warning.item_model_not_generated")}}}s(p4,"displayItemChecker");function Yve(t){let e=Number(t.x),n=Number(t.y),i=Number(Texture.all.map(r=>r.height).reduce((r,o)=>Math.max(r,o),0)),a=Number(Texture.all.map(r=>r.width).reduce((r,o)=>Math.max(r,o),0));return e===a&&n===i?e!==n?{type:"warning",message:A("dialog.blueprint_settings.texture_size.warning.not_square")}:e!==2**Math.floor(Math.log2(e))||n!==2**Math.floor(Math.log2(n))?{type:"warning",message:A("dialog.blueprint_settings.texture_size.warning.not_a_power_of_2")}:{type:"success",message:""}:{type:"warning",message:A("dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture")}}s(Yve,"textureSizeChecker");function Xve(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:"error",message:A("dialog.blueprint_settings.data_pack.error.folder_does_not_exist")}}switch(!0){case t==="":return{type:"error",message:A("dialog.blueprint_settings.data_pack.error.no_folder_selected")};case!fs.existsSync(e):return{type:"error",message:A("dialog.blueprint_settings.data_pack.error.folder_does_not_exist")};case!fs.statSync(e).isDirectory():return{type:"error",message:A("dialog.blueprint_settings.data_pack.error.not_a_folder")};case!fs.existsSync(PathModule.join(e,"pack.mcmeta")):return{type:"error",message:A("dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta")};case!fs.existsSync(PathModule.join(e,"data")):return{type:"warning",message:A("dialog.blueprint_settings.data_pack.warning.missing_data_folder")};default:return{type:"success",message:""}}}s(Xve,"dataPackFolderChecker");function Zve(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:"error",message:A("dialog.blueprint_settings.resource_pack.error.folder_does_not_exist")}}switch(!0){case t==="":return{type:"error",message:A("dialog.blueprint_settings.resource_pack.error.no_folder_selected")};case!fs.existsSync(e):return{type:"error",message:A("dialog.blueprint_settings.resource_pack.error.folder_does_not_exist")};case!fs.statSync(e).isDirectory():return{type:"error",message:A("dialog.blueprint_settings.resource_pack.error.not_a_folder")};case!fs.existsSync(PathModule.join(e,"pack.mcmeta")):return{type:"error",message:A("dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta")};case!fs.existsSync(PathModule.join(e,"assets")):return{type:"warning",message:A("dialog.blueprint_settings.resource_pack.warning.missing_assets_folder")};default:return{type:"success",message:""}}}s(Zve,"resourcePackFolderChecker");function Qve(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:"error",message:A("dialog.blueprint_settings.json_file.error.file_does_not_exist")}}switch(!0){case t==="":return{type:"error",message:A("dialog.blueprint_settings.json_file.error.no_file_selected")};case(fs.existsSync(e)&&!fs.statSync(e).isFile()):return{type:"error",message:A("dialog.blueprint_settings.json_file.error.not_a_file")};default:return{type:"success",message:""}}}s(Qve,"jsonFileChecker");function m4(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:"error",message:A("dialog.blueprint_settings.data_pack_zip.error.file_does_not_exist")}}switch(!0){case t==="":return{type:"error",message:A("dialog.blueprint_settings.resource_pack_zip.error.no_file_selected")};case(fs.existsSync(e)&&!fs.statSync(e).isFile()):return{type:"error",message:A("dialog.blueprint_settings.resource_pack_zip.error.not_a_file")};default:return{type:"success",message:""}}}s(m4,"zipChecker");function $ve(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(q,ce=>n(34,i=ce)),q),"$$subscribe_targetMinecraftVersion"),o,l,c=ie,d=s(()=>(c(),c=rt(R,ce=>n(28,l=ce)),R),"$$subscribe_enablePluginMode"),u,p=ie,m=s(()=>(p(),p=rt(W,ce=>n(29,u=ce)),W),"$$subscribe_autoRenderBox"),f,g=ie,x=s(()=>(g(),g=rt(D,ce=>n(30,f=ce)),D),"$$subscribe_resourcePackExportMode"),_,h=ie,v=s(()=>(h(),h=rt(Q,ce=>n(31,_=ce)),Q),"$$subscribe_enableAdvancedResourcePackSettings"),b,y=ie,w=s(()=>(y(),y=rt(B,ce=>n(32,b=ce)),B),"$$subscribe_dataPackExportMode");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>c()),t.$$.on_destroy.push(()=>p()),t.$$.on_destroy.push(()=>g()),t.$$.on_destroy.push(()=>h()),t.$$.on_destroy.push(()=>y());let{blueprintName:S}=e,{textureSizeX:F}=e,{textureSizeY:N}=e,{exportNamespace:k}=e,{enablePluginMode:R}=e;d(),Jt(R,l=!1,l);let{resourcePackExportMode:D}=e;x();let{dataPackExportMode:B}=e;w();let{targetMinecraftVersion:q}=e;r();let{showRenderBox:G}=e,{autoRenderBox:W}=e;m();let{renderBoxX:ee}=e,{renderBoxY:Z}=e,{displayItem:me}=e,{customModelDataOffset:X}=e,{enableAdvancedResourcePackSettings:Q}=e;v();let{resourcePack:he}=e,{dataPack:Ie}=e,{onSummonFunction:le}=e,{onRemoveFunction:ge}=e,{onPreTickFunction:V}=e,{onPostTickFunction:H}=e,{interpolationDuration:re}=e,{teleportationDuration:xe}=e,{useStorageForAnimation:fe}=e,{autoUpdateRigOrientation:te}=e,{bakedAnimations:Y}=e,{jsonFile:we}=e,Le=new ke(!1);Pa(t,Le,ce=>n(27,o=ce));function Tt(ce){S=ce,n(0,S)}s(Tt,"lineinput0_value_binding");function tn(ce){F=ce,n(1,F)}s(tn,"vector2d_valueX_binding");function kn(ce){N=ce,n(2,N)}s(kn,"vector2d_valueY_binding");function Rn(ce){G=ce,n(7,G)}s(Rn,"checkbox0_checked_binding");function ii(ce){W=ce,m(n(8,W))}s(ii,"checkbox1_checked_binding");function Ft(ce){ee=ce,n(9,ee)}s(Ft,"vector2d_valueX_binding_1");function $t(ce){Z=ce,n(10,Z)}s($t,"vector2d_valueY_binding_1");function ai(ce){k=ce,n(3,k)}s(ai,"lineinput1_value_binding");function cr(ce){me=ce,n(11,me)}s(cr,"lineinput_value_binding");function Fa(ce){Y=ce,n(24,Y)}s(Fa,"checkbox_checked_binding");function Na(ce){we=ce,n(25,we)}s(Na,"fileselect_value_binding");function Ra(ce){q=ce,r(n(6,q))}s(Ra,"select0_value_binding");function ur(ce){D=ce,x(n(4,D))}s(ur,"select1_value_binding");function Fi(ce){me=ce,n(11,me)}s(Fi,"lineinput_value_binding_1");function Gr(ce){he=ce,n(14,he)}s(Gr,"folderselect_value_binding");function Ma(ce){he=ce,n(14,he)}s(Ma,"fileselect_value_binding_1");function Wr(ce){Q=ce,v(n(13,Q))}s(Wr,"checkbox_checked_binding_1");function Wi(ce){X=ce,n(12,X)}s(Wi,"numberslider_value_binding");function Ne(ce){B=ce,w(n(5,B))}s(Ne,"select2_value_binding");function Un(ce){Ie=ce,n(15,Ie)}s(Un,"folderselect_value_binding_1");function Kr(ce){Ie=ce,n(15,Ie)}s(Kr,"fileselect_value_binding_2");function dr(ce){le=ce,n(16,le)}s(dr,"codeinput0_value_binding");function Yr(ce){ge=ce,n(17,ge)}s(Yr,"codeinput1_value_binding");function pr(ce){V=ce,n(18,V)}s(pr,"codeinput2_value_binding");function _l(ce){H=ce,n(19,H)}s(_l,"codeinput3_value_binding");function So(ce){re=ce,n(20,re)}s(So,"numberslider0_value_binding");function mr(ce){xe=ce,n(21,xe)}s(mr,"numberslider1_value_binding");function Xr(ce){te=ce,n(23,te)}s(Xr,"checkbox0_checked_binding_1");function ps(ce){fe=ce,n(22,fe)}return s(ps,"checkbox1_checked_binding_1"),t.$$set=ce=>{"blueprintName"in ce&&n(0,S=ce.blueprintName),"textureSizeX"in ce&&n(1,F=ce.textureSizeX),"textureSizeY"in ce&&n(2,N=ce.textureSizeY),"exportNamespace"in ce&&n(3,k=ce.exportNamespace),"enablePluginMode"in ce&&d(n(26,R=ce.enablePluginMode)),"resourcePackExportMode"in ce&&x(n(4,D=ce.resourcePackExportMode)),"dataPackExportMode"in ce&&w(n(5,B=ce.dataPackExportMode)),"targetMinecraftVersion"in ce&&r(n(6,q=ce.targetMinecraftVersion)),"showRenderBox"in ce&&n(7,G=ce.showRenderBox),"autoRenderBox"in ce&&m(n(8,W=ce.autoRenderBox)),"renderBoxX"in ce&&n(9,ee=ce.renderBoxX),"renderBoxY"in ce&&n(10,Z=ce.renderBoxY),"displayItem"in ce&&n(11,me=ce.displayItem),"customModelDataOffset"in ce&&n(12,X=ce.customModelDataOffset),"enableAdvancedResourcePackSettings"in ce&&v(n(13,Q=ce.enableAdvancedResourcePackSettings)),"resourcePack"in ce&&n(14,he=ce.resourcePack),"dataPack"in ce&&n(15,Ie=ce.dataPack),"onSummonFunction"in ce&&n(16,le=ce.onSummonFunction),"onRemoveFunction"in ce&&n(17,ge=ce.onRemoveFunction),"onPreTickFunction"in ce&&n(18,V=ce.onPreTickFunction),"onPostTickFunction"in ce&&n(19,H=ce.onPostTickFunction),"interpolationDuration"in ce&&n(20,re=ce.interpolationDuration),"teleportationDuration"in ce&&n(21,xe=ce.teleportationDuration),"useStorageForAnimation"in ce&&n(22,fe=ce.useStorageForAnimation),"autoUpdateRigOrientation"in ce&&n(23,te=ce.autoUpdateRigOrientation),"bakedAnimations"in ce&&n(24,Y=ce.bakedAnimations),"jsonFile"in ce&&n(25,we=ce.jsonFile)},t.$$.update=()=>{if(t.$$.dirty[1]&8)e:Jt(Le,o=compareVersions("1.21.2",i),o)},[S,F,N,k,D,B,q,G,W,ee,Z,me,X,Q,he,Ie,le,ge,V,H,re,xe,fe,te,Y,we,R,o,l,u,f,_,b,Le,i,Tt,tn,kn,Rn,ii,Ft,$t,ai,cr,Fa,Na,Ra,ur,Fi,Gr,Ma,Wr,Wi,Ne,Un,Kr,dr,Yr,pr,_l,So,mr,Xr,ps]}s($ve,"instance");var Vf=class extends Pe{constructor(e){super(),Ve(this,e,$ve,Wve,De,{blueprintName:0,textureSizeX:1,textureSizeY:2,exportNamespace:3,enablePluginMode:26,resourcePackExportMode:4,dataPackExportMode:5,targetMinecraftVersion:6,showRenderBox:7,autoRenderBox:8,renderBoxX:9,renderBoxY:10,displayItem:11,customModelDataOffset:12,enableAdvancedResourcePackSettings:13,resourcePack:14,dataPack:15,onSummonFunction:16,onRemoveFunction:17,onPreTickFunction:18,onPostTickFunction:19,interpolationDuration:20,teleportationDuration:21,useStorageForAnimation:22,autoUpdateRigOrientation:23,bakedAnimations:24,jsonFile:25},null,[-1,-1,-1])}};s(Vf,"BlueprintSettingsDialog");var f4=Vf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".warning.svelte-1fhdn4b{color:var(--color-warning);font-family:var(--font-code);font-size:0.8em;margin:-16px 29px 8px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function ebe(){return{blueprintName:new ke(Project.name,t=>t||"My Blueprint"),textureSizeX:new ke(Project.texture_width),textureSizeY:new ke(Project.texture_height),showRenderBox:new ke(Project.animated_java.show_render_box),autoRenderBox:new ke(Project.animated_java.auto_render_box),renderBoxX:new ke(Project.animated_java.render_box[0]),renderBoxY:new ke(Project.animated_java.render_box[1]),enablePluginMode:new ke(Project.animated_java.enable_plugin_mode),exportNamespace:new ke(Project.animated_java.export_namespace,t=>t?Kt(t):qt.export_namespace),resourcePackExportMode:new ke(Project.animated_java.resource_pack_export_mode),dataPackExportMode:new ke(Project.animated_java.data_pack_export_mode),targetMinecraftVersion:new ke(Project.animated_java.target_minecraft_version),displayItem:new ke(Project.animated_java.display_item,t=>t||qt.display_item),customModelDataOffset:new ke(Project.animated_java.custom_model_data_offset),enableAdvancedResourcePackSettings:new ke(Project.animated_java.enable_advanced_resource_pack_settings),resourcePack:new ke(Project.animated_java.resource_pack),enableAdvancedDataPackSettings:new ke(Project.animated_java.enable_advanced_data_pack_settings),dataPack:new ke(Project.animated_java.data_pack),onSummonFunction:new ke(Project.animated_java.on_summon_function),onRemoveFunction:new ke(Project.animated_java.on_remove_function),onPreTickFunction:new ke(Project.animated_java.on_pre_tick_function),onPostTickFunction:new ke(Project.animated_java.on_post_tick_function),interpolationDuration:new ke(Project.animated_java.interpolation_duration),teleportationDuration:new ke(Project.animated_java.teleportation_duration),autoUpdateRigOrientation:new ke(Project.animated_java.auto_update_rig_orientation),useStorageForAnimation:new ke(Project.animated_java.use_storage_for_animation),bakedAnimations:new ke(Project.animated_java.baked_animations),jsonFile:new ke(Project.animated_java.json_file)}}s(ebe,"getSettings");function tbe(t){Project&&(Project.name=t.blueprintName.get(),setProjectResolution(t.textureSizeX.get(),t.textureSizeY.get(),!0),Project.animated_java.show_render_box=t.showRenderBox.get(),Project.animated_java.auto_render_box=t.autoRenderBox.get(),Project.animated_java.render_box=[t.renderBoxX.get(),t.renderBoxY.get()],Project.animated_java.enable_plugin_mode=t.enablePluginMode.get(),Project.pluginMode.set(t.enablePluginMode.get()),Project.animated_java.export_namespace=t.exportNamespace.get(),Project.animated_java.resource_pack_export_mode=t.resourcePackExportMode.get(),Project.animated_java.data_pack_export_mode=t.dataPackExportMode.get(),Project.animated_java.target_minecraft_version=t.targetMinecraftVersion.get(),Project.animated_java.display_item=t.displayItem.get(),Project.animated_java.custom_model_data_offset=t.customModelDataOffset.get(),Project.animated_java.enable_advanced_resource_pack_settings=t.enableAdvancedResourcePackSettings.get(),Project.animated_java.resource_pack=t.resourcePack.get(),Project.animated_java.enable_advanced_data_pack_settings=t.enableAdvancedDataPackSettings.get(),Project.animated_java.data_pack=t.dataPack.get(),Project.animated_java.on_summon_function=t.onSummonFunction.get(),Project.animated_java.on_remove_function=t.onRemoveFunction.get(),Project.animated_java.on_pre_tick_function=t.onPreTickFunction.get(),Project.animated_java.on_post_tick_function=t.onPostTickFunction.get(),Project.animated_java.interpolation_duration=t.interpolationDuration.get(),Project.animated_java.teleportation_duration=t.teleportationDuration.get(),Project.animated_java.auto_update_rig_orientation=t.autoUpdateRigOrientation.get(),Project.animated_java.use_storage_for_animation=t.useStorageForAnimation.get(),Project.animated_java.baked_animations=t.bakedAnimations.get(),Project.animated_java.json_file=t.jsonFile.get(),console.log("Successfully saved project settings",Project))}s(tbe,"setSettings");function jc(){if(!Project)return;let t=ebe();return new cn({id:`${Ke.name}:blueprintSettingsDialog`,title:A("dialog.blueprint_settings.title"),width:800,content:{component:f4,props:t},extra:{component:BT},contentStyle:{marginTop:"10px"},preventKeybinds:!0,onConfirm(){tbe(t),zf(),Yx(),Canvas.updateAll()}}).show()}s(jc,"openBlueprintSettingsDialog");function h4(t){let e,n;return{c(){e=L("progress"),e.value=n=t[4]/t[5]||0,E(e,"max","1"),E(e,"class","svelte-x7e53b")},m(i,a){U(i,e,a)},p(i,a){a&48&&n!==(n=i[4]/i[5]||0)&&(e.value=n)},d(i){i&&z(e)}}}s(h4,"create_if_block");function nbe(t){let e,n,i,a,r,o,l,c,d=t[4]!==0&&h4(t);return{c(){e=L("div"),n=L("div"),i=L("p"),a=Re(t[3]),r=J(),o=L("img"),c=J(),d&&d.c(),Ht(o.src,l=Vm)||E(o,"src",l),E(o,"width","64px"),E(n,"class","progress-container svelte-x7e53b"),E(e,"class","dialog-container svelte-x7e53b")},m(u,p){U(u,e,p),I(e,n),I(n,i),I(i,a),I(n,r),I(n,o),I(e,c),d&&d.m(e,null)},p(u,[p]){p&8&&ct(a,u[3]),u[4]!==0?d?d.p(u,p):(d=h4(u),d.c(),d.m(e,null)):d&&(d.d(1),d=null)},i:ie,o:ie,d(u){u&&z(e),d&&d.d()}}}s(nbe,"create_fragment");function ibe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(g,x=>n(3,i=x)),g),"$$subscribe_progressDescription"),o,l=ie,c=s(()=>(l(),l=rt(m,x=>n(4,o=x)),m),"$$subscribe_progress"),d,u=ie,p=s(()=>(u(),u=rt(f,x=>n(5,d=x)),f),"$$subscribe_maxProgress");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l()),t.$$.on_destroy.push(()=>u());let{progress:m}=e;c();let{maxProgress:f}=e;p();let{progressDescription:g}=e;return r(),t.$$set=x=>{"progress"in x&&c(n(0,m=x.progress)),"maxProgress"in x&&p(n(1,f=x.maxProgress)),"progressDescription"in x&&r(n(2,g=x.progressDescription))},[m,f,g,i,o,d]}s(ibe,"instance");var Uf=class extends Pe{constructor(e){super(),Ve(this,e,ibe,nbe,De,{progress:0,maxProgress:1,progressDescription:2})}};s(Uf,"ExportProgressDialog");var g4=Uf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".dialog-container.svelte-x7e53b{display:flex;flex-direction:column;align-items:center}.progress-container.svelte-x7e53b{width:100%;display:flex;flex-direction:row;align-items:center;justify-content:space-between}progress.svelte-x7e53b{width:100%}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Pt=new ke(0),Bi=new ke(1),Dn=new ke("");function qf(t){return Pt.set(0),Bi.set(1),Dn.set("Preparing..."),t&&(Bi.set(1e3),setInterval(()=>{Pt.set(Pt.get()+1),Pt.get()>=Bi.get()&&Pt.set(0)},10)),new cn({id:`${Ke.name}:exportProgressDialog`,title:A("dialog.export_progress.title"),width:512,content:{component:g4,props:{progress:Pt,maxProgress:Bi,progressDescription:Dn}},preventKeybinds:!0,buttons:[]}).show()}s(qf,"openExportProgressDialog");var _4=wi(Ee("crypto"),1);var Dd=new ke(!0);Nt({id:"animated-java:override-function/bone-animator/interpolate",object:BoneAnimator.prototype,key:"interpolate",condition:()=>Dd.get()&&Fe(),get:t=>function(e,n,i){if(!Dd.get()||!Fe()||n===!1)return t.call(this,e,n,i);let a=this.animation.time;try{Timeline.time=Dr(this.animation.time,20);let r,o,l,c;if(Timeline.time[l.time,l])):new Map;Fd.set(a,o)}cv=new Set(t.excluded_nodes?t.excluded_nodes.map(a=>a.value):[]),Jf=new Map;for(let a of cbe())Jf.set(a.uuid,a)}for(let[a,r]of Object.entries(e)){let o=Jf.get(a);if(!o||cv.has(a))continue;let l=Fd.get(a);if(!l)continue;let c=l.get(n),d=l.get(n-.05),u=Ac.get(a),p={};switch(r.type){case"text_display":case"item_display":case"block_display":case"bone":{if(p.matrix=Hf(o,r.base_scale),r.parent&&r.parent!=="root"){let x=Fd.get(r.parent),_=x?.get(n),h=x?.get(n-.05);_?.interpolation==="step"?p.interpolation="step":h?.data_points.length===2&&(p.interpolation="pre-post")}if(u&&u.matrix.equals(p.matrix)&&p.interpolation==null)continue;if(c?.interpolation==="step")p.interpolation="step";else if(d?.data_points.length===2){p.interpolation="pre-post",Nd(t,n+.001);let x=Hf(o,r.base_scale);p.matrix=x,Nd(t,n)}Ac.set(a,{matrix:p.matrix,keyframe:c});break}case"locator":{if(p.matrix=Hf(o,1),c)p.function=c.function,p.function_execute_condition=c.execute_condition,Ac.set(a,{matrix:p.matrix,keyframe:c});else if(u?.keyframe){let x=u.keyframe.repeat,_=u.keyframe.repeat_frequency;x&&_&&Math.round(n*20)%_===0&&(p.function=u.keyframe.function,p.function_execute_condition=u.keyframe.execute_condition)}break}case"camera":case"struct":{if(p.matrix=Hf(o,1),u?.matrix.equals(p.matrix))continue;Ac.set(a,{matrix:p.matrix,keyframe:c});break}}let m=new THREE.Vector3,f=new THREE.Quaternion,g=new THREE.Vector3;p.matrix.decompose(m,f,g),p.decomposed=abe(p.matrix),(r.type==="locator"||r.type==="camera")&&(r.max_distance=Math.max(r.max_distance,m.length())),p.pos=[m.x,m.y,m.z],p.rot=pf(f).toArray(),p.scale=[g.x,g.y,g.z],p.head_rot=rbe(f),i.node_transforms[a]=p}return i}s(pv,"getFrame");function obe(t,e){let n=t.animators.effects?.variant;if(n){let i=n.find(a=>a.time===e);if(i){let a=i.variant?.uuid;if(a)return Ks({variants:[a],variants_execute_condition:i.execute_condition?.trim()})}}return{}}s(obe,"getVariantKeyframe");function sbe(t,e){let n=t.animators.effects?.function;if(n){let i=n.find(a=>a.time===e);if(i)return Ks({function:i.function?.trim(),function_execute_condition:i.execute_condition?.trim()})}return{}}s(sbe,"getFunctionKeyframe");function Nd(t,e){Timeline.time=e,Animator.showDefaultPose(!0);let n=[...Group.all,...NullObject.all,...Locator.all,...ve.all,...$e.all,...We.all];OutlinerElement.types.camera&&n.push(...OutlinerElement.types.camera.all);for(let i of n)i.constructor.animator&&(Animator.resetLastValues(),t.getBoneAnimator(i).displayFrame());Animator.resetLastValues(),scene.updateMatrixWorld(),t.effects&&t.effects.displayFrame()}s(Nd,"updatePreview");function lbe(t,e){let n={name:t.name,storage_name:Kt(t.name),uuid:t.uuid,loop_delay:Number(t.loop_delay)||0,frames:[],duration:0,loop_mode:t.loop,modified_nodes:{}};t.select();let i=new Set;for(let a=0;a<=t.length;a=Dr(a+.05,20)){Nd(t,a);let r=pv(t,e.nodes,a);Object.keys(r.node_transforms).forEach(o=>i.add(o)),n.frames.push(r)}return n.duration=n.frames.length,n.modified_nodes=Object.fromEntries(Array.from(i).map(a=>[a,e.nodes[a]])),n}s(lbe,"renderAnimation");function x4(t){let e=_4.createHash("sha256");for(let n of t){e.update("anim;"+n.name),e.update(";"+n.duration.toString()),e.update(";"+n.loop_mode),e.update(";"+Object.keys(n.modified_nodes).join(";"));for(let i of n.frames){e.update(";"+i.time.toString());for(let[a,r]of Object.entries(i.node_transforms))e.update(";"+a),e.update(";"+r.pos.join(";")),e.update(";"+r.rot.join(";")),e.update(";"+r.scale.join(";")),r.interpolation&&e.update(";"+r.interpolation),r.function&&e.update(";"+r.function),r.function_execute_condition&&e.update(";"+r.function_execute_condition);i.variants&&(e.update(";"+i.variants),i.variants_execute_condition&&e.update(";"+i.variants_execute_condition)),i.function&&e.update(";"+i.function),i.function_execute_condition&&e.update(";"+i.function_execute_condition)}}return e.digest("hex")}s(x4,"hashAnimations");function cbe(){return[...Group.all,...Locator.all,...ve.all,...$e.all,...We.all,...OutlinerElement.types.camera?OutlinerElement.types.camera.all:[]]}s(cbe,"getAnimatableNodes");async function v4(t,e){lv=void 0,Ac=new Map,Fd=new Map,cv=new Set,Jf=new Map,Dd.set(!1),Dn.set("Rendering Animations..."),Pt.set(0),Bi.set(t.animations.length),console.time("Rendering animations took");let n,i=0;Timeline.pause(),Mode.selected.id==="animate"&&(n=Animator.selected,i=Timeline.time),uv();let a=[];for(let r of t.animations)a.push(lbe(r,e)),Pt.set(Pt.get()+1),await b4();return dv(),Dd.set(!0),Mode.selected.id==="animate"&&n?(n.select(),Timeline.setTime(i),Animator.preview()):Mode.selected.id==="edit"&&Animator.showDefaultPose(),console.timeEnd("Rendering animations took"),console.log("Animations:",a),a}s(v4,"renderProjectAnimations");var Rd=class{constructor(e){this.limit=e;this.lastTime=performance.now()}lastTime;async sync(){return performance.now()-this.lastTime>=this.limit?(await new Promise(i=>requestAnimationFrame(i)),this.lastTime=performance.now(),!0):!1}};s(Rd,"MSLimiter");var j=class{static global(e){return j.globals[e]?j.globals[e]:j.globals[e]={}}static createStatic(e,n,i){let a=null;Object.defineProperty(e,n,{enumerable:!0,get:function(){return i!=null&&(a=i(),i=null),a},set:function(r){i!=null&&(a=i(),i=null),a=r}})}static iterator(e){if(Array.isArray(e)){let n=e;return function(){return j.mkIter(n)}}else return typeof e.iterator=="function"?e.iterator.bind(e):e.iterator}static getIterator(e){return Array.isArray(e)?j.mkIter(e):e.iterator()}static mkIter(e){return new mv(e)}static extend(e){function n(){this[j.new].apply(this,arguments)}return s(n,"res"),Object.setPrototypeOf(n.prototype,e.prototype),n}static inherits(e,n){n==null&&(n=!1);function i(){n&&e&&i[j.init]&&i[j.init](),this[j.new].apply(this,arguments)}return s(i,"res"),n?i[j.init]=()=>{let a=e();a[j.init]&&a[j.init](),Object.setPrototypeOf(i.prototype,a.prototype),i[j.init]=void 0}:e&&e[j.init]?(n=!0,i[j.init]=()=>{e[j.init]&&e[j.init](),Object.setPrototypeOf(i.prototype,e.prototype),i[j.init]=void 0}):e&&Object.setPrototypeOf(i.prototype,e.prototype),i}static bind(e,n){if(n==null)return null;n.__id__==null&&(n.__id__=j.fid++);let i=null;return e.hx__closures__==null?e.hx__closures__={}:i=e.hx__closures__[n.__id__],i==null&&(i=n.bind(e),e.hx__closures__[n.__id__]=i),i}static get __name__(){return"genes.Register"}get __class__(){return j}};s(j,"Register");j.$global=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:void 0;j.globals={};j.new=Symbol();j.init=Symbol();j.fid=0;var mv=j.global("$hxClasses")["genes._Register.ArrayIterator"]=s(class y4 extends j.inherits(){[j.new](e){this.current=0,this.array=e}hasNext(){return this.currentne,!0){[j.new](e,n,i){super[j.new](String(e),n,i),this.value=e}unwrap(){return this.value}static get __name__(){return"haxe.ValueException"}static get __super__(){return ne}get __class__(){return w4}},"ValueException");Gf.prototype.value=null;var $Fe=j.$global,ne=j.global("$hxClasses")["haxe.Exception"]=s(class Md extends j.inherits(()=>Error,!0){[j.new](e,n,i){Error.call(this,e),this.message=e,this.__previousException=n,this.__nativeException=i??this}unwrap(){return this.__nativeException}toString(){return this.get_message()}get_message(){return this.message}get_native(){return this.__nativeException}static caught(e){return e instanceof Md?e:e instanceof Error?new Md(e.message,null,e):new Gf(e,null,e)}static thrown(e){return e instanceof Md?e.get_native():e instanceof Error?e:new Gf(e)}static get __name__(){return"haxe.Exception"}static get __super__(){return Error}get __class__(){return Md}},"Exception");ne.prototype.message=null;ne.prototype.native=null;ne.prototype.__skipStack=null;ne.prototype.__nativeException=null;ne.prototype.__previousException=null;var aNe=j.$global,at=j.global("$hxClasses").HxOverrides=s(class E4{static dateStr(e){let n=e.getMonth()+1,i=e.getDate(),a=e.getHours(),r=e.getMinutes(),o=e.getSeconds();return e.getFullYear()+"-"+(n<10?"0"+n:""+n)+"-"+(i<10?"0"+i:""+i)+" "+(a<10?"0"+a:""+a)+":"+(r<10?"0"+r:""+r)+":"+(o<10?"0"+o:""+o)}static strDate(e){switch(e.length){case 8:let n=e.split(":"),i=new Date;return i.setTime(0),i.setUTCHours(n[0]),i.setUTCMinutes(n[1]),i.setUTCSeconds(n[2]),i;break;case 10:let a=e.split("-");return new Date(a[0],a[1]-1,a[2],0,0,0);case 19:let r=e.split(" "),o=r[0].split("-"),l=r[1].split(":");return new Date(o[0],o[1]-1,o[2],l[0],l[1],l[2]);default:throw ne.thrown("Invalid date format : "+e)}}static cca(e,n){let i=e.charCodeAt(n);if(i==i)return i}static substr(e,n,i){if(i==null)i=e.length;else if(i<0)if(n==0)i=e.length+i;else return"";return e.substr(n,i)}static now(){return Date.now()}static get __name__(){return"HxOverrides"}get __class__(){return E4}},"HxOverrides");typeof performance<"u"&&typeof performance.now=="function"&&(at.now=performance.now.bind(performance));var cNe=j.$global,Et=j.global("$hxClasses").StringTools=s(class Tc{static isSpace(e,n){let i=at.cca(e,n);return i>8&&i<14?!0:i==32}static ltrim(e){let n=e.length,i=0;for(;i0?at.substr(e,i,n-i):e}static rtrim(e){let n=e.length,i=0;for(;i0?at.substr(e,0,n-i):e}static trim(e){return Tc.ltrim(Tc.rtrim(e))}static hex(e,n){let i="",a="0123456789ABCDEF";do i=a.charAt(e&15)+i,e>>>=4;while(e>0);if(n!=null)for(;i.length({_hx_index:0,__enum__:"mcl.Token",v:t,pos:e,"@kind":"Literal"}),{_hx_name:"Literal",__params__:["v","pos"]}),BracketOpen:Object.assign((t,e)=>({_hx_index:1,__enum__:"mcl.Token",pos:t,data:e,"@kind":"BracketOpen"}),{_hx_name:"BracketOpen",__params__:["pos","data"]}),BracketClose:Object.assign(t=>({_hx_index:2,__enum__:"mcl.Token",pos:t,"@kind":"BracketClose"}),{_hx_name:"BracketClose",__params__:["pos"]})};Nn.__constructs__=[Nn.Literal,Nn.BracketOpen,Nn.BracketClose];Nn.__empty_constructs__=[];var Eo=j.global("$hxEnums")["mcl.Brackets"]={__ename__:"mcl.Brackets",Curly:{_hx_name:"Curly",_hx_index:0,__enum__:"mcl.Brackets","@kind":"Curly"},Square:{_hx_name:"Square",_hx_index:1,__enum__:"mcl.Brackets","@kind":"Square"},Round:{_hx_name:"Round",_hx_index:2,__enum__:"mcl.Brackets","@kind":"Round"}};Eo.__constructs__=[Eo.Curly,Eo.Square,Eo.Round];Eo.__empty_constructs__=[Eo.Curly,Eo.Square,Eo.Round];var Zn=j.global("$hxClasses")["mcl.Tokenizer"]=s(class k4{static tokenize(e,n){let i=!1,a=[],r=[],o=0,l=e.split(` `);for(;o0&&d.push(Nn.Literal(w,{line:u,col:p+g,file:n}));let S=Et.trim(f.substring(b+1));d.push(Nn.BracketOpen({line:u,col:p+g+b,file:n},S)),h=!0;break}_.pop()}++x}let v=Et.trim(f);h||v.length==0||d.push(Nn.Literal(Et.trim(v),{line:u,col:p+g,file:n}))}return d}static get __name__(){return"mcl.Tokenizer"}get __class__(){return k4}},"Tokenizer");var Bv=wi(Ee("module"));var vNe=j.$global,Ci=j.global("$hxClasses")["mcl.error.McbError"]=s(class fv extends j.inherits(ne){[j.new](e,n){super[j.new](e),this.mcbstack=n}__init__(){}static isMclError(e){return e instanceof fv}static get __name__(){return"mcl.error.McbError"}static get __super__(){return ne}get __class__(){return fv}},"McbError");Ci.prototype.mcbstack=null;var kNe=j.$global,Je=j.global("$hxClasses")["mcl.error.CompilerError"]=s(class j4 extends j.inherits(Ci){[j.new](e,n,i){super[j.new]((n?"Internal ":"")+`Compiler Error: `+e,i),this.internal=n}static get __name__(){return"mcl.error.CompilerError"}static get __super__(){return Ci}get __class__(){return j4}},"CompilerError");Je.prototype.internal=null;var SNe=j.$global,Ze=j.global("$hxClasses")["haxe.io.Path"]=s(class el extends j.inherits(){[j.new](e){switch(e){case".":case"..":this.dir=e,this.file="";return}let n=e.lastIndexOf("/"),i=e.lastIndexOf("\\");n0&&i[i.length-1]!=".."?i.pop():m==""?(i.length>0||at.cca(e,0)==47)&&i.push(m):m!="."&&i.push(m)}let o=i.join(n),l="",c=!1,d=!1,u=0,p=o;for(;u=55296&&g<=56319&&(g=g-55232<<10|m.charCodeAt(f+1)&1023);let x=g;x>=65536&&++u;let _=x;switch(_){case 47:if(!c)d=!0;else{let v=_;c=!1,d&&(l+="/",d=!1),l+=String.fromCodePoint(v)}break;case 58:l+=":",c=!0;break;default:let h=_;c=!1,d&&(l+="/",d=!1),l+=String.fromCodePoint(h)}}return l}static addTrailingSlash(e){if(e.length==0)return"/";let n=e.lastIndexOf("/"),i=e.lastIndexOf("\\");return n({_hx_index:0,__enum__:"mcl.JsonTagType",subType:t,replace:e,entries:n,"@kind":"Tag"}),{_hx_name:"Tag",__params__:["subType","replace","entries"]}),Advancement:Object.assign(t=>({_hx_index:1,__enum__:"mcl.JsonTagType",entries:t,"@kind":"Advancement"}),{_hx_name:"Advancement",__params__:["entries"]}),ItemModifier:Object.assign(t=>({_hx_index:2,__enum__:"mcl.JsonTagType",entries:t,"@kind":"ItemModifier"}),{_hx_name:"ItemModifier",__params__:["entries"]}),LootTable:Object.assign(t=>({_hx_index:3,__enum__:"mcl.JsonTagType",entries:t,"@kind":"LootTable"}),{_hx_name:"LootTable",__params__:["entries"]}),Predicate:Object.assign(t=>({_hx_index:4,__enum__:"mcl.JsonTagType",entries:t,"@kind":"Predicate"}),{_hx_name:"Predicate",__params__:["entries"]}),Recipe:Object.assign(t=>({_hx_index:5,__enum__:"mcl.JsonTagType",entries:t,"@kind":"Recipe"}),{_hx_name:"Recipe",__params__:["entries"]}),ChatType:Object.assign(t=>({_hx_index:6,__enum__:"mcl.JsonTagType",entries:t,"@kind":"ChatType"}),{_hx_name:"ChatType",__params__:["entries"]}),DamageType:Object.assign(t=>({_hx_index:7,__enum__:"mcl.JsonTagType",entries:t,"@kind":"DamageType"}),{_hx_name:"DamageType",__params__:["entries"]}),Dimension:Object.assign(t=>({_hx_index:8,__enum__:"mcl.JsonTagType",entries:t,"@kind":"Dimension"}),{_hx_name:"Dimension",__params__:["entries"]}),DimensionType:Object.assign(t=>({_hx_index:9,__enum__:"mcl.JsonTagType",entries:t,"@kind":"DimensionType"}),{_hx_name:"DimensionType",__params__:["entries"]}),Enchantment:Object.assign(t=>({_hx_index:10,__enum__:"mcl.JsonTagType",entries:t,"@kind":"Enchantment"}),{_hx_name:"Enchantment",__params__:["entries"]}),WorldGen:Object.assign((t,e,n)=>({_hx_index:11,__enum__:"mcl.JsonTagType",subType:t,name:e,entries:n,"@kind":"WorldGen"}),{_hx_name:"WorldGen",__params__:["subType","name","entries"]})};Yt.__constructs__=[Yt.Tag,Yt.Advancement,Yt.ItemModifier,Yt.LootTable,Yt.Predicate,Yt.Recipe,Yt.ChatType,Yt.DamageType,Yt.Dimension,Yt.DimensionType,Yt.Enchantment,Yt.WorldGen];Yt.__empty_constructs__=[];var pe=j.global("$hxEnums")["mcl.AstNode"]={__ename__:"mcl.AstNode",Raw:Object.assign((t,e,n,i)=>({_hx_index:0,__enum__:"mcl.AstNode",pos:t,value:e,continuations:n,isMacro:i,"@kind":"Raw"}),{_hx_name:"Raw",__params__:["pos","value","continuations","isMacro"]}),FunctionDef:Object.assign((t,e,n,i)=>({_hx_index:1,__enum__:"mcl.AstNode",pos:t,name:e,body:n,appendTo:i,"@kind":"FunctionDef"}),{_hx_name:"FunctionDef",__params__:["pos","name","body","appendTo"]}),TemplateDef:Object.assign((t,e,n)=>({_hx_index:2,__enum__:"mcl.AstNode",pos:t,name:e,body:n,"@kind":"TemplateDef"}),{_hx_name:"TemplateDef",__params__:["pos","name","body"]}),Directory:Object.assign((t,e,n)=>({_hx_index:3,__enum__:"mcl.AstNode",pos:t,name:e,body:n,"@kind":"Directory"}),{_hx_name:"Directory",__params__:["pos","name","body"]}),Import:Object.assign((t,e)=>({_hx_index:4,__enum__:"mcl.AstNode",pos:t,name:e,"@kind":"Import"}),{_hx_name:"Import",__params__:["pos","name"]}),CompileTimeLoop:Object.assign((t,e,n,i)=>({_hx_index:5,__enum__:"mcl.AstNode",pos:t,expression:e,as:n,body:i,"@kind":"CompileTimeLoop"}),{_hx_name:"CompileTimeLoop",__params__:["pos","expression","as","body"]}),CompileTimeIf:Object.assign((t,e,n,i)=>({_hx_index:6,__enum__:"mcl.AstNode",pos:t,expression:e,body:n,elseExpressions:i,"@kind":"CompileTimeIf"}),{_hx_name:"CompileTimeIf",__params__:["pos","expression","body","elseExpressions"]}),MultiLineScript:Object.assign((t,e)=>({_hx_index:7,__enum__:"mcl.AstNode",pos:t,value:e,"@kind":"MultiLineScript"}),{_hx_name:"MultiLineScript",__params__:["pos","value"]}),Block:Object.assign((t,e,n,i,a,r)=>({_hx_index:8,__enum__:"mcl.AstNode",pos:t,name:e,body:n,data:i,isMacro:a,isInline:r,"@kind":"Block"}),{_hx_name:"Block",__params__:["pos","name","body","data","isMacro","isInline"]}),TickBlock:Object.assign((t,e)=>({_hx_index:9,__enum__:"mcl.AstNode",pos:t,body:e,"@kind":"TickBlock"}),{_hx_name:"TickBlock",__params__:["pos","body"]}),LoadBlock:Object.assign((t,e)=>({_hx_index:10,__enum__:"mcl.AstNode",pos:t,body:e,"@kind":"LoadBlock"}),{_hx_name:"LoadBlock",__params__:["pos","body"]}),ExecuteBlock:Object.assign((t,e,n,i,a,r)=>({_hx_index:11,__enum__:"mcl.AstNode",pos:t,execute:e,data:n,body:i,continuations:a,isMacro:r,"@kind":"ExecuteBlock"}),{_hx_name:"ExecuteBlock",__params__:["pos","execute","data","body","continuations","isMacro"]}),ScheduleBlock:Object.assign((t,e,n,i,a)=>({_hx_index:12,__enum__:"mcl.AstNode",pos:t,delay:e,type:n,body:i,isMacro:a,"@kind":"ScheduleBlock"}),{_hx_name:"ScheduleBlock",__params__:["pos","delay","type","body","isMacro"]}),SequenceBlock:Object.assign((t,e)=>({_hx_index:13,__enum__:"mcl.AstNode",pos:t,body:e,"@kind":"SequenceBlock"}),{_hx_name:"SequenceBlock",__params__:["pos","body"]}),RuntimeLoop:Object.assign((t,e,n)=>({_hx_index:14,__enum__:"mcl.AstNode",pos:t,expression:e,body:n,"@kind":"RuntimeLoop"}),{_hx_name:"RuntimeLoop",__params__:["pos","expression","body"]}),Comment:Object.assign((t,e)=>({_hx_index:15,__enum__:"mcl.AstNode",pos:t,value:e,"@kind":"Comment"}),{_hx_name:"Comment",__params__:["pos","value"]}),JsonFile:Object.assign((t,e,n)=>({_hx_index:16,__enum__:"mcl.AstNode",pos:t,name:e,info:n,"@kind":"JsonFile"}),{_hx_name:"JsonFile",__params__:["pos","name","info"]}),TemplateOverload:Object.assign((t,e,n)=>({_hx_index:17,__enum__:"mcl.AstNode",pos:t,args:e,body:n,"@kind":"TemplateOverload"}),{_hx_name:"TemplateOverload",__params__:["pos","args","body"]}),ClockExpr:Object.assign((t,e,n,i)=>({_hx_index:18,__enum__:"mcl.AstNode",pos:t,name:e,time:n,body:i,"@kind":"ClockExpr"}),{_hx_name:"ClockExpr",__params__:["pos","name","time","body"]}),Execute:Object.assign((t,e,n,i)=>({_hx_index:19,__enum__:"mcl.AstNode",pos:t,command:e,value:n,isMacro:i,"@kind":"Execute"}),{_hx_name:"Execute",__params__:["pos","command","value","isMacro"]}),FunctionCall:Object.assign((t,e,n,i)=>({_hx_index:20,__enum__:"mcl.AstNode",pos:t,name:e,data:n,isMacro:i,"@kind":"FunctionCall"}),{_hx_name:"FunctionCall",__params__:["pos","name","data","isMacro"]}),EqCommand:Object.assign((t,e)=>({_hx_index:21,__enum__:"mcl.AstNode",pos:t,command:e,"@kind":"EqCommand"}),{_hx_name:"EqCommand",__params__:["pos","command"]}),ScheduleCall:Object.assign((t,e,n,i,a)=>({_hx_index:22,__enum__:"mcl.AstNode",pos:t,delay:e,target:n,mode:i,isMacro:a,"@kind":"ScheduleCall"}),{_hx_name:"ScheduleCall",__params__:["pos","delay","target","mode","isMacro"]}),ReturnRun:Object.assign((t,e,n)=>({_hx_index:23,__enum__:"mcl.AstNode",pos:t,value:e,isMacro:n,"@kind":"ReturnRun"}),{_hx_name:"ReturnRun",__params__:["pos","value","isMacro"]}),ScheduleClear:Object.assign((t,e,n)=>({_hx_index:24,__enum__:"mcl.AstNode",pos:t,target:e,isMacro:n,"@kind":"ScheduleClear"}),{_hx_name:"ScheduleClear",__params__:["pos","target","isMacro"]}),Void:{_hx_name:"Void",_hx_index:25,__enum__:"mcl.AstNode","@kind":"Void"},Group:Object.assign(t=>({_hx_index:26,__enum__:"mcl.AstNode",body:t,"@kind":"Group"}),{_hx_name:"Group",__params__:["body"]})};pe.__constructs__=[pe.Raw,pe.FunctionDef,pe.TemplateDef,pe.Directory,pe.Import,pe.CompileTimeLoop,pe.CompileTimeIf,pe.MultiLineScript,pe.Block,pe.TickBlock,pe.LoadBlock,pe.ExecuteBlock,pe.ScheduleBlock,pe.SequenceBlock,pe.RuntimeLoop,pe.Comment,pe.JsonFile,pe.TemplateOverload,pe.ClockExpr,pe.Execute,pe.FunctionCall,pe.EqCommand,pe.ScheduleCall,pe.ReturnRun,pe.ScheduleClear,pe.Void,pe.Group];pe.__empty_constructs__=[pe.Void];var dRe=j.$global,Pr=j.global("$hxClasses")["js.Boot"]=s(class vi{static getClass(e){if(e==null)return null;if(e instanceof Array)return Array;{let n=e.__class__;if(n!=null)return n;let i=vi.__nativeClassName(e);return i!=null?vi.__resolveNativeClass(i):null}}static __string_rec(e,n){if(e==null)return"null";if(n.length>=5)return"<...>";let i=typeof e;switch(i=="function"&&(e.__name__||e.__ename__)&&(i="object"),i){case"function":return"";case"object":if(e.__enum__){let d=j.global("$hxEnums")[e.__enum__].__constructs__[e._hx_index],u=d._hx_name;return d.__params__?(n=n+" ",u+"("+function(p){var m;let f=[];{let g=0,x=d.__params__;for(;g0?",":"")+vi.__string_rec(e[p],n)}return c+="]",c}let a;try{a=e.toString}catch{return"???"}if(a!=null&&a!=Object.toString&&typeof a=="function"){let c=e.toString();if(c!="[object Object]")return c}let r=`{ `;n+=" ";let o=e.hasOwnProperty!=null,l=null;for(l in e)o&&!e.hasOwnProperty(l)||l=="prototype"||l=="__class__"||l=="__super__"||l=="__interfaces__"||l=="__properties__"||(r.length!=2&&(r+=`, `),r+=n+l+" : "+vi.__string_rec(e[l],n));return n=n.substring(1),r+=` `+n+"}",r;break;case"string":return e;default:return String(e)}}static __interfLoop(e,n){if(e==null)return!1;if(e==n)return!0;let i=e.__interfaces__;if(i!=null&&(e.__super__==null||e.__super__.__interfaces__!=i)){let a=0,r=i.length;for(;a=0&&e=this.array.length)throw new Si("Tried to read past the end of the token list");let e=this.array,n=this.get_index();return this.set_index(n+1),e[n]}skip(){this.set_index(this.get_index()+1)}peek(){return this.array[this.get_index()]}hasNext(){return this.get_index()0)throw ye.unreachable(i);return r}else return null}static block(e,n,i,a){i==null&&(i=!0);let r=ye.expectThenData(e,i);for(;;){if(!e.hasNext())throw new Si("Unexpected end of file!");let o=e.peek();if(o._hx_index==2){let l=o.pos;a?.(o);break}else n()}return ye.expect(e,function(o){return o._hx_index==2}),r==""?null:r}static readFunction(e,n,i){let a=[],r=null,o=e.split(" ");return o.length==2?(e=o[0],r=o[1]):o.length==1&&(e=o[0]),ye.block(n,function(){a.push(ye.innerParse(n))},!1),pe.FunctionDef(i,e,a,r)}static innerParseTemplate(e){let n=e.peek();if(n._hx_index==0){let i=n.v,a=n.pos;switch(i){case"load":let r=a;e.skip();let o=[];return ye.block(e,function(){o.push(ye.innerParse(e))},!1),pe.LoadBlock(r,o);break;case"tick":let l=a;e.skip();let c=[];return ye.block(e,function(){c.push(ye.innerParse(e))},!1),pe.TickBlock(l,c);break;default:let d=i,u=a;if(d=="with"||d.startsWith("with ")){e.skip();let p=Et.trim(d.substring(5)),m=[];return ye.block(e,function(){m.push(ye.innerParse(e))},!1),pe.TemplateOverload(u,p,m)}else{let p=i,m=a;if(p.startsWith("#"))return e.skip(),null;throw ye.unreachable(e.next())}}}else throw ye.unreachable(e.next())}static readTemplate(e,n,i){let a=[];return ye.block(n,function(){let r=ye.innerParseTemplate(n);r!=null&&a.push(r)},!1),pe.TemplateDef(i,e,a)}static pos(e){switch(e._hx_index){case 0:let n=e.v;return e.pos;case 1:let a=e.data;return e.pos;case 2:return e.pos}}static json(e){let n=ye.pos(e.peek()),i=0,a="";do{if(!e.hasNext())throw new Si("Unexpected end of file!");let r=e.next();switch(r._hx_index){case 0:let o=r.pos,l=r.v;a+=l;break;case 1:let c=r.pos,d=r.data;a+="{",a+=d,++i;break;case 2:let u=r.pos;--i,a+="}";break}}while(i>0);return pe.Raw(n,a,[],!1)}static parseMcbFile(e){let n=new ko(e),i=[];for(;n.hasNext();)i.push(ye.parseTLD(n));return i}static parseMcbtFile(e){let n=new ko(e),i=[];for(;n.hasNext();){let a=n.next(),r;if(a._hx_index==0){let o=a.v,l=a.pos;if(o.startsWith("template ")){let c=Et.trim(o.substring(9));r=ye.readTemplate(c,n,l)}else if(o.startsWith("#"))r=pe.Comment(l,o);else if(o.startsWith("import "))r=pe.Import(l,o.substring(7));else throw ye.unreachable(a)}else throw ye.unreachable(a);i.push(r)}return i}static parserCompilerLoop(e,n,i,a){let r=[];if(ye.block(i,function(){r.push(a())}),ye.loopRegExp.match(e)){let o=ye.loopRegExp.matched(1),l=ye.loopRegExp.matched(2),c;if(l.length==0)c=null;else{let d=[],u=0,p=l.split(",");for(;u"){e.skip();break}}r.push(e.next())}return pe.MultiLineScript(a,r)}else{if(i.startsWith("#"))return pe.Comment(a,i);if(i.startsWith("REPEAT"))return ye.parserCompilerLoop(i,a,e,function(){return ye.parseTLD(e)});if(i.startsWith("IF"))return ye.parseCompileTimeIf(i,a,e,function(){return ye.parseTLD(e)});if(i.startsWith("tag ")){let r=Et.trim(i.substring(4)).split(" "),o=r.shift(),l=r.shift(),c=r.shift()=="replace",d=[];return ye.block(e,function(){d.push(ye.innerParse(e))}),pe.JsonFile(a,l,Yt.Tag(o,c,d))}else{if(i.startsWith("advancement ")||i.startsWith("enchantment ")||i.startsWith("item_modifier ")||i.startsWith("loot_table ")||i.startsWith("predicate ")||i.startsWith("recipe ")||i.startsWith("chat_type ")||i.startsWith("damage_type ")||i.startsWith("dimension ")||i.startsWith("dimension_type "))return ye.readPlainJsonFile(i,a,e);if(i.startsWith("worldgen ")){let r=Et.trim(i.substring(9)),o=r.substring(0,r.indexOf(" "));r=r.substring(r.indexOf(" ")+1);let l=[];return ye.block(e,function(){l.push(ye.innerParse(e))}),pe.JsonFile(a,r,Yt.WorldGen(o,r,l))}else throw ye.unreachable(Nn.Literal(i,a))}}}}else{let i=n;throw ye.unreachable(i)}}static readPlainJsonFile(e,n,i){let a=[],r=0,o=e.split(" ");for(;r"){e.skip();break}}u.push(e.next())}return pe.MultiLineScript(a,u)}else{if(i.startsWith("IF"))return ye.parseCompileTimeIf(i,a,e,function(){return ye.innerParse(e)});if(i.startsWith("function ")){let u=i.substring(9),p=u.indexOf(" "),m=u.substring(0,p==-1?u.length:p),f=u.substring(m.length+1);return pe.FunctionCall(a,m,f,r)}else if(i.startsWith("schedule ")){let u=Et.trim(i.substring(9));if(u.startsWith("function ")){let x=u.substring(9),_=x.indexOf(" "),h=x.substring(0,_==-1?x.length:_),v=_==-1?null:x.substring(h.length+1),b="replace";if(v.endsWith(" append")&&(b="append",v=v.substring(0,v.length-7)),v.endsWith(" replace")&&(b="replace",v=v.substring(0,v.length-8)),v==null)throw new Si(ye.format('"Expected delay after function name in schedule command" at {}:{}:{}',a.file,a.line,a.col));return pe.ScheduleCall(a,v,h,b,r)}if(u.startsWith("clear "))return pe.ScheduleClear(a,u.substring(6),r);let p=u.indexOf(" "),m=p==-1?u:u.substring(0,p),f="append";u.endsWith(" append")&&(f="append",u=u.substring(0,u.length-7)),u.endsWith(" replace")&&(f="replace",u=u.substring(0,u.length-8));let g=[];if(e.peek()._hx_index!=1)throw new Si("Expected { after delay in schedule block command");return ye.block(e,function(){g.push(ye.innerParse(e))}),pe.ScheduleBlock(a,m,f,g,r)}else if(i.startsWith("execute")&&(i.charAt(7)==" "||i.charAt(7)=="<"))if(e.hasNext()&&e.peek()._hx_index==1){let u=[];if(!i.endsWith("run")&&ye.executeRegExp.match(i)){let f=ye.executeRegExp.matchedPos(),g={file:a.file,line:a.line,col:a.col+f.pos+f.len},x=Nn.Literal(Et.ltrim(i.substring(f.pos+f.len)),g);return e.insert(x),pe.Execute(a,Et.rtrim(i.substring(0,f.pos+3)),ye.innerParse(e),r)}let p=ye.block(e,function(){u.push(ye.innerParse(e))}),m=[];e:for(;e.hasNext();){let f=e.peek();if(f._hx_index==0){let g=f.v,x=f.pos;switch(g){case"else $run":let _=x;e.skip();let h=[],v=ye.block(e,function(){h.push(ye.innerParse(e))});m.push(pe.Block(_,null,h,v,!0,!1));break;case"else run":let b=x;e.skip();let y=[],w=ye.block(e,function(){y.push(ye.innerParse(e))});m.push(pe.Block(b,null,y,w,!1,!1));break;default:let S=g,F=x;if(S.startsWith("else $")&&S.endsWith("run")){e.skip();let N=Et.trim(S.substring(6)),k=[],R=ye.block(e,function(){k.push(ye.innerParse(e))});F.col+=5,m.push(pe.ExecuteBlock(F,N,R,k,null,!0))}else{let N=g,k=x;if(N.startsWith("else ")&&N.endsWith("run")){e.skip();let R=Et.trim(N.substring(5)),D=[],B=ye.block(e,function(){D.push(ye.innerParse(e))});k.col+=5,m.push(pe.ExecuteBlock(k,R,B,D,null,!1))}else break e}}}else break}return pe.ExecuteBlock(a,i,p,u,m.length>0?m:null,r)}else{if(!ye.executeRegExp.match(i))return ye.readRaw(a,i,e,r);let u=ye.executeRegExp.matchedPos(),p={file:a.file,line:a.line,col:a.col+u.pos+u.len},m=Nn.Literal(Et.ltrim(i.substring(u.pos+u.len)),p);return e.insert(m),pe.Execute(a,Et.rtrim(i.substring(0,u.pos+3)),ye.innerParse(e),r)}else{if(i.startsWith("REPEAT"))return ye.parserCompilerLoop(i,a,e,function(){return ye.innerParse(e)});if(i.startsWith("#"))return pe.Comment(a,i);if(i=="block"||i.startsWith("block ")){let u=Et.trim(i.substring(6)),p=[],m=ye.block(e,function(){p.push(ye.innerParse(e))});return pe.Block(a,u,p,m,r,!1)}else if(i.startsWith("return run")){let u=Et.trim(i.substring(11)),p={file:a.file,line:a.line,col:a.col+11},m=e.peek();if(m._hx_index==1){let f=m.pos,g=m.data;if(u.length==0){let x=[],_=ye.block(e,function(){x.push(ye.innerParse(e))});return pe.ReturnRun(f,pe.Block(f,null,x,_,!1,!1),r)}else return e.back(),e.update(Nn.Literal(u,p)),pe.ReturnRun(p,ye.innerParse(e),r)}else return e.back(),e.update(Nn.Literal(u,p)),pe.ReturnRun(p,ye.innerParse(e),r)}else if(i=="tick"){let u=[];return ye.block(e,function(){u.push(ye.innerParse(e))},!1),pe.TickBlock(a,u)}else if(i=="load"){let u=[];return ye.block(e,function(){u.push(ye.innerParse(e))},!1),pe.LoadBlock(a,u)}else return i.startsWith("eq ")?pe.EqCommand(a,i.substring(3)):ye.readRaw(a,i,e,r)}}break;case 1:let o=n.data,l=n.pos,c=[],d=ye.block(e,function(){c.push(ye.innerParse(e))});return pe.Block(l,null,c,d,!1,!1);default:throw ye.unreachable(n)}}static readRaw(e,n,i,a){if(!i.hasNext())return pe.Raw(e,n,[],a);let r=[],o=e.line;e:for(;;){if(!i.hasNext())throw new Si("Unexpected end of file!");let l=i.peek();switch(l._hx_index){case 0:let c=l.v,d=l.pos;if(d.line==o)i.skip(),r.push(pe.Raw(d,c,[],!1));else break e;break;case 1:let u=l.pos,p=l.data;if(u.line==o){let f=[],g=ye.block(i,function(){f.push(ye.innerParse(i))});r.push(pe.Block(u,null,f,g,!1,!1))}else break e;break;case 2:let m=l.pos;if(m.line==o)throw ye.unreachable(Nn.Literal(n,m));break e;default:break e}}return pe.Raw(e,n,r,a)}static parseCompileTimeIf(e,n,i,a){let r=Et.trim(e.substring(2)),o=[];ye.block(i,function(){o.push(a())},!1);let l=[];for(;;){if(!i.hasNext())throw new Si("Unexpected end of file!");let c=i.peek();if(c._hx_index==0){let d=c.v,u=c.pos;if(d=="ELSE"||d.startsWith("ELSE ")){i.skip();let p=d=="ELSE"?null:Et.trim(d.substring(5));p!=null?p.startsWith("IF")&&(p=Et.trim(p.substring(2))):p=null;let m=[];ye.block(i,function(){m.push(a())},!1),l.push({condition:p,node:m})}else break}else break}return pe.CompileTimeIf(n,r,o,l)}static get __name__(){return"mcl.Parser"}get __class__(){return ye}},"Parser");Xt.loopRegExp=new Lr("(REPEAT\\s*\\(.+?\\))\\s\\s*as\\s\\s*([a-zA-Z,\\s]+)","");Xt.executeRegExp=new Lr("\\b(run\\s+?)\\b","");var MRe=j.$global,mt=j.global("$hxEnums")["haxpression.ValueType"]={__ename__:"haxpression.ValueType",VFloat:Object.assign(t=>({_hx_index:0,__enum__:"haxpression.ValueType",v:t,"@kind":"VFloat"}),{_hx_name:"VFloat",__params__:["v"]}),VInt:Object.assign(t=>({_hx_index:1,__enum__:"haxpression.ValueType",v:t,"@kind":"VInt"}),{_hx_name:"VInt",__params__:["v"]}),VBool:Object.assign(t=>({_hx_index:2,__enum__:"haxpression.ValueType",v:t,"@kind":"VBool"}),{_hx_name:"VBool",__params__:["v"]}),VString:Object.assign(t=>({_hx_index:3,__enum__:"haxpression.ValueType",v:t,"@kind":"VString"}),{_hx_name:"VString",__params__:["v"]}),VNA:{_hx_name:"VNA",_hx_index:4,__enum__:"haxpression.ValueType","@kind":"VNA"},VNM:{_hx_name:"VNM",_hx_index:5,__enum__:"haxpression.ValueType","@kind":"VNM"}};mt.__constructs__=[mt.VFloat,mt.VInt,mt.VBool,mt.VString,mt.VNA,mt.VNM];mt.__empty_constructs__=[mt.VNA,mt.VNM];var LRe=j.$global,nt=j.global("$hxClasses")["haxpression.utils.Chars"]=s(class Pi{static isDecimalDigit(e){return e>=48?e<=57:!1}static isUpperCaseLetter(e){return e>=65?e<=90:!1}static isLowerCaseLetter(e){return e>=97?e<=122:!1}static isIdentifierStart(e){return e==Pi.DOLLAR_CODE||e==Pi.UNDERSCORE_CODE||Pi.isUpperCaseLetter(e)||Pi.isLowerCaseLetter(e)?!0:Pi.OTHER_IDENTIFIER_START_CODES.includes(e)}static isIdentifierPart(e){return Pi.isIdentifierStart(e)||Pi.isDecimalDigit(e)?!0:Pi.OTHER_IDENTIFIER_PART_CODES.includes(e)}static isWhiteSpace(e){return e==Pi.TAB_CODE||e==Pi.LF_CODE||e==Pi.CR_CODE?!0:e==Pi.SPACE_CODE}static get __name__(){return"haxpression.utils.Chars"}get __class__(){return Pi}},"Chars");nt.TAB_CODE=9;nt.LF_CODE=10;nt.CR_CODE=13;nt.SPACE_CODE=32;nt.EXCLAMATION_POINT_CODE=33;nt.DOUBLE_QUOTE_CODE=34;nt.DOLLAR_CODE=36;nt.SINGLE_QUOTE_CODE=39;nt.OPEN_PAREN_CODE=40;nt.CLOSE_PAREN_CODE=41;nt.COMMA_CODE=44;nt.PERIOD_CODE=46;nt.COLON_CODE=58;nt.SEMICOLON_CODE=59;nt.QUESTION_MARK_CODE=63;nt.OPEN_BRACKET_CODE=91;nt.CLOSE_BRACKET_CODE=93;nt.UNDERSCORE_CODE=95;nt.OTHER_IDENTIFIER_START_CODES=[];nt.OTHER_IDENTIFIER_PART_CODES=[nt.EXCLAMATION_POINT_CODE,nt.DOLLAR_CODE,nt.COLON_CODE];var qRe=j.$global,Wf=j.global("$hxClasses")["haxpression.utils.Iterators"]=s(class D4{static toArray(e){let n=[],i=e;for(;i.hasNext();){let a=i.next();n.push(a)}return n}static get __name__(){return"haxpression.utils.Iterators"}get __class__(){return D4}},"Iterators");var WRe=j.$global,Cc=j.global("$hxClasses")["haxpression.utils.Arrays"]=s(class F4{static all(e,n){let i=[],a=0,r=e;for(;ae?n.length:e},0)}static wrapOperation(e){return function(n){return se.isNA(n)?se.fromValueType(mt.VNA):se.isNM(n)?se.fromValueType(mt.VNM):e(n)}}static get __name__(){return"haxpression.UnaryOperations"}get __class__(){return il}},"UnaryOperations");Xa.map=new et,Xa.addOperator("-",function(t){return se.fromFloat(se.toFloat(t)*-1)}),Xa.addOperator("+",function(t){return se.fromFloat(se.toFloat(t))}),Xa.addOperator("!",function(t){return se.fromBool(!se.toBool(t))}),Xa.addOperator("~",function(t){return se.fromInt(~se.toInt(t))});var xMe=j.$global,He=j.global("$hxEnums")["haxpression.ExpressionType"]={__ename__:"haxpression.ExpressionType",ELiteral:Object.assign(t=>({_hx_index:0,__enum__:"haxpression.ExpressionType",value:t,"@kind":"ELiteral"}),{_hx_name:"ELiteral",__params__:["value"]}),EIdentifier:Object.assign(t=>({_hx_index:1,__enum__:"haxpression.ExpressionType",name:t,"@kind":"EIdentifier"}),{_hx_name:"EIdentifier",__params__:["name"]}),EUnary:Object.assign((t,e)=>({_hx_index:2,__enum__:"haxpression.ExpressionType",operator_:t,operand:e,"@kind":"EUnary"}),{_hx_name:"EUnary",__params__:["operator_","operand"]}),EBinary:Object.assign((t,e,n)=>({_hx_index:3,__enum__:"haxpression.ExpressionType",operator_:t,left:e,right:n,"@kind":"EBinary"}),{_hx_name:"EBinary",__params__:["operator_","left","right"]}),ECall:Object.assign((t,e)=>({_hx_index:4,__enum__:"haxpression.ExpressionType",callee:t,arguments:e,"@kind":"ECall"}),{_hx_name:"ECall",__params__:["callee","arguments"]}),EConditional:Object.assign((t,e,n)=>({_hx_index:5,__enum__:"haxpression.ExpressionType",test:t,consequent:e,alternate:n,"@kind":"EConditional"}),{_hx_name:"EConditional",__params__:["test","consequent","alternate"]}),EArray:Object.assign(t=>({_hx_index:6,__enum__:"haxpression.ExpressionType",items:t,"@kind":"EArray"}),{_hx_name:"EArray",__params__:["items"]}),ECompound:Object.assign(t=>({_hx_index:7,__enum__:"haxpression.ExpressionType",items:t,"@kind":"ECompound"}),{_hx_name:"ECompound",__params__:["items"]})};He.__constructs__=[He.ELiteral,He.EIdentifier,He.EUnary,He.EBinary,He.ECall,He.EConditional,He.EArray,He.ECompound];He.__empty_constructs__=[];var EMe=j.$global,oa=j.global("$hxClasses")["haxpression.ExpressionTypes"]=s(class R4{static canEvaluateAll(e){return Cc.all(e,function(n){return bt.canEvaluate(bt.fromExpressionType(n))})}static simplify(e){let n=new Array(e.length),i=0,a=e.length;for(;i=0&&i!=n.length?!1:oa.canEvaluateAll(n)}static evaluate(e,n){return Aa.getFunction(e)(n)}static wrapOperation(e,n,i){return function(a){if(n>=0&&a.length!=n)throw ne.thrown(new At("function "+e+" expects exactly "+n+" argument(s)"));return i(a)}}static get __name__(){return"haxpression.CallOperations"}get __class__(){return Aa}},"CallOperations");on.map=new et,on.addFunction("abs",1,function(t){return se.fromFloat(Math.abs(se.toFloat(t[0])))}),on.addFunction("acos",1,function(t){return se.fromFloat(Math.acos(se.toFloat(t[0])))}),on.addFunction("asin",1,function(t){return se.fromFloat(Math.asin(se.toFloat(t[0])))}),on.addFunction("atan",1,function(t){return se.fromFloat(Math.atan(se.toFloat(t[0])))}),on.addFunction("atan2",2,function(t){return se.fromFloat(Math.atan2(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction("ceil",1,function(t){return se.fromInt(Math.ceil(se.toFloat(t[0])))}),on.addFunction("cos",1,function(t){return se.fromFloat(Math.cos(se.toFloat(t[0])))}),on.addFunction("exp",1,function(t){return se.fromFloat(Math.exp(se.toFloat(t[0])))}),on.addFunction("fceil",1,function(t){return se.fromFloat(Math.ceil(se.toFloat(t[0])))}),on.addFunction("ffloor",1,function(t){return se.fromFloat(Math.floor(se.toFloat(t[0])))}),on.addFunction("floor",1,function(t){return se.fromInt(Math.floor(se.toFloat(t[0])))}),on.addFunction("fround",1,function(t){return se.fromFloat(Math.round(se.toFloat(t[0])))}),on.addFunction("log",1,function(t){return se.fromFloat(Math.log(se.toFloat(t[0])))}),on.addFunction("max",2,function(t){return se.fromFloat(Math.max(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction("min",2,function(t){return se.fromFloat(Math.min(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction("pow",2,function(t){return se.fromFloat(Math.pow(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction("random",0,function(t){return se.fromFloat(Math.random())}),on.addFunction("rand",0,function(t){return se.fromFloat(Math.random())}),on.addFunction("round",1,function(t){return se.fromInt(Math.round(se.toFloat(t[0])))}),on.addFunction("sin",1,function(t){return se.fromFloat(Math.sin(se.toFloat(t[0])))}),on.addFunction("sqrt",1,function(t){return se.fromFloat(Math.sqrt(se.toFloat(t[0])))}),on.addFunction("tan",1,function(t){return se.fromFloat(Math.tan(se.toFloat(t[0])))});var UMe=j.$global,Zt=j.global("$hxClasses")["haxpression.BinaryOperations"]=s(class is{static evaluate(e,n,i){return is.map.inst.get(e).operation(n,i)}static addOperator(e,n,i){let a=is.map,r={precedence:n,operation:is.wrapOperation(i)};a.inst.set(e,r)}static hasOperator(e){return is.map.inst.has(e)}static getOperatorPrecedence(e){return is.map.inst.get(e).precedence}static getMaxOperatorLength(){return Cc.reduce(Wf.toArray(Mt.adaptIterator(is.map.inst.keys())),function(e,n){return n.length>e?n.length:e},0)}static wrapOperation(e){return function(n,i){return se.isNA(n)||se.isNA(i)?se.fromValueType(mt.VNA):se.isNM(n)||se.isNM(i)?se.fromValueType(mt.VNM):e(n,i)}}static get __name__(){return"haxpression.BinaryOperations"}get __class__(){return is}},"BinaryOperations");Zt.map=new et,Zt.addOperator("||",1,function(t,e){return se.fromBool(se.toBool(t)||se.toBool(e))}),Zt.addOperator("&&",2,function(t,e){return se.fromBool(se.toBool(t)&&se.toBool(e))}),Zt.addOperator("|",3,function(t,e){return se.fromInt(se.toInt(t)|se.toInt(e))}),Zt.addOperator("^",4,function(t,e){return se.fromInt(se.toInt(t)^se.toInt(e))}),Zt.addOperator("&",5,function(t,e){return se.fromInt(se.toInt(t)&se.toInt(e))}),Zt.addOperator("==",6,function(t,e){return se.fromBool(se.toFloat(t)==se.toFloat(e))}),Zt.addOperator("!=",6,function(t,e){return se.fromBool(se.toFloat(t)!=se.toFloat(e))}),Zt.addOperator("<",7,function(t,e){return se.fromBool(se.toFloat(t)",7,function(t,e){return se.fromBool(se.toFloat(t)>se.toFloat(e))}),Zt.addOperator("<=",7,function(t,e){return se.fromBool(se.toFloat(t)<=se.toFloat(e))}),Zt.addOperator(">=",7,function(t,e){return se.fromBool(se.toFloat(t)>=se.toFloat(e))}),Zt.addOperator("<<",8,function(t,e){return se.fromInt(se.toInt(t)<>",8,function(t,e){return se.fromInt(se.toInt(t)>>se.toInt(e))}),Zt.addOperator(">>>",8,function(t,e){return se.fromInt(se.toInt(t)>>>se.toInt(e))}),Zt.addOperator("+",9,function(t,e){return se.fromFloat(se.toFloat(t)+se.toFloat(e))}),Zt.addOperator("-",9,function(t,e){return se.fromFloat(se.toFloat(t)-se.toFloat(e))}),Zt.addOperator("*",10,function(t,e){return se.fromFloat(se.toFloat(t)*se.toFloat(e))}),Zt.addOperator("/",10,function(t,e){return se.fromFloat(se.toFloat(t)/se.toFloat(e))}),Zt.addOperator("%",10,function(t,e){return se.fromFloat(se.toFloat(t)%se.toFloat(e))}),Zt.addOperator("**",11,function(t,e){return se.fromFloat(Math.pow(se.toFloat(t),se.toFloat(e)))});var nBe=j.$global,bt=j.global("$hxClasses")["haxpression._Expression.Expression"]=s(class ze{static fromExpressionType(e){return e}static toExpressionType(e){return e}static simplify(e){switch(e._hx_index){case 0:let n=e.value;return ze.fromExpressionType(He.ELiteral(n));case 1:let i=e.name;return ze.fromExpressionType(He.EIdentifier(i));case 2:let a=e.operator_,r=e.operand;return ze.canEvaluate(ze.fromExpressionType(r))?ze.fromExpressionType(He.ELiteral(se.toValueType(Xa.evaluate(a,ze.evaluate(ze.fromExpressionType(r)))))):ze.fromExpressionType(He.EUnary(a,ze.toExpressionType(ze.simplify(ze.fromExpressionType(r)))));case 3:let o=e.operator_,l=e.left,c=e.right;return ze.canEvaluate(ze.fromExpressionType(l))&&ze.canEvaluate(ze.fromExpressionType(c))?ze.fromExpressionType(He.ELiteral(se.toValueType(Zt.evaluate(o,ze.evaluate(ze.fromExpressionType(l)),ze.evaluate(ze.fromExpressionType(c)))))):ze.fromExpressionType(He.EBinary(o,ze.toExpressionType(ze.simplify(ze.fromExpressionType(l))),ze.toExpressionType(ze.simplify(ze.fromExpressionType(c)))));case 4:let d=e.callee,u=e.arguments;return oa.canEvaluateAll(u)?ze.fromExpressionType(He.ELiteral(se.toValueType(on.evaluate(d,oa.evaluate(u))))):ze.fromExpressionType(He.ECall(d,oa.simplify(u)));case 5:let p=e.test,m=e.consequent,f=e.alternate;return ze.canEvaluate(ze.fromExpressionType(p))?se.toBool(ze.evaluate(ze.fromExpressionType(p)))?ze.simplify(ze.fromExpressionType(m)):ze.simplify(ze.fromExpressionType(f)):ze.fromExpressionType(He.EConditional(ze.toExpressionType(ze.simplify(ze.fromExpressionType(p))),ze.toExpressionType(ze.simplify(ze.fromExpressionType(m))),ze.toExpressionType(ze.simplify(ze.fromExpressionType(f)))));case 6:let g=e.items;return ze.fromExpressionType(He.EArray(oa.simplify(g)));case 7:let x=e.items;return ze.fromExpressionType(He.ECompound(oa.simplify(x)))}}static canEvaluate(e){switch(e._hx_index){case 0:let n=e.value;return!0;case 1:let i=e.name;return!1;case 2:let a=e.operator_,r=e.operand;return ze.canEvaluate(ze.fromExpressionType(r));case 3:let o=e.operator_,l=e.left,c=e.right;return ze.canEvaluate(ze.fromExpressionType(l))?ze.canEvaluate(ze.fromExpressionType(c)):!1;case 4:let d=e.callee,u=e.arguments;return on.canEvaluate(d,u);case 5:let p=e.test,m=e.consequent,f=e.alternate;return ze.canEvaluate(ze.fromExpressionType(p))?se.toBool(ze.evaluate(ze.fromExpressionType(p)))?ze.canEvaluate(ze.fromExpressionType(m)):ze.canEvaluate(ze.fromExpressionType(f)):!1;case 6:let g=e.items;return oa.canEvaluateAll(g);case 7:let x=e.items;return oa.canEvaluateAll(x)}}static evaluate(e,n){switch(n==null&&(n=new et),e._hx_index){case 0:let i=e.value;return se.fromValueType(i);case 1:let a=e.name;if(!n.inst.has(a))throw ne.thrown(new At("cannot evaluate expression with unset variable: "+a));return n.inst.get(a);case 2:let r=e.operator_,o=e.operand,l=ze.evaluate(ze.fromExpressionType(o),n);return Xa.evaluate(r,l);case 3:let c=e.operator_,d=e.left,u=e.right,p=ze.evaluate(ze.fromExpressionType(d),n),m=ze.evaluate(ze.fromExpressionType(u),n);return Zt.evaluate(c,p,m);case 4:let f=e.callee,g=e.arguments;return on.evaluate(f,oa.evaluate(g,n));case 5:let x=e.test,_=e.consequent,h=e.alternate;return se.toBool(ze.evaluate(ze.fromExpressionType(x),n))?ze.evaluate(ze.fromExpressionType(_),n):ze.evaluate(ze.fromExpressionType(h),n);case 6:let v=e.items;if(v.length==0)return se.fromValueType(mt.VNA);{let y=oa.evaluate(v,n);return y[y.length-1]}break;case 7:let b=e.items;if(b.length==0)return se.fromValueType(mt.VNA);{let y=oa.evaluate(b,n);return y[y.length-1]}break}}static isCompound(e){let n=ze.toExpressionType(e);if(n._hx_index==7){let i=n.items;return!0}else return!1}static get __name__(){return"haxpression._Expression.Expression_Impl_"}get __class__(){return ze}},"Expression");var hBe=j.$global,Oc=j.global("$hxClasses")["haxpression.Parser"]=s(class _v extends j.inherits(){[j.new](e){this.inputString=e,this.index=0,this.length=e.length,this.expressions=[]}internalParse(){for(;this.index0;){if(Zt.hasOperator(e))return this.index+=n,e;--n,e=at.substr(e,0,n)}return null}gobbleBinaryExpression(){let e,n,i,a,r,o,l,c=this.gobbleToken(),d=this.gobbleBinaryOperator();if(d==null)return c;let u={operator_:d,precedence:Zt.getOperatorPrecedence(d)},p=this.gobbleToken();if(p==null)throw ne.thrown(new At('expected expression after binary operator_: "'+d+'"',this.inputString,this.index));let m=[c,u,p];for(;d=this.gobbleBinaryOperator(),!(d==null||(a=Zt.getOperatorPrecedence(d),a==0));){for(u={operator_:d,precedence:a};m.length>2&&a<=m[m.length-2].precedence;){p=m.pop(),d=m.pop().operator_,c=m.pop();let g=He.EBinary(d,bt.toExpressionType(c),bt.toExpressionType(p));m.push(g)}if(n=this.gobbleToken(),n==null)throw ne.thrown(new At('expected expression after binary operator_: "'+d+'"',this.inputString,this.index));m.push(u),m.push(n)}let f=m.length-1;for(n=m[f];f>1;)n=bt.fromExpressionType(He.EBinary(m[f-1].operator_,m[f-2],bt.toExpressionType(n))),f-=2;return n}gobbleToken(){this.gobbleSpaces();let e=this.charCodeAt(this.index);if(nt.isDecimalDigit(e)||e==nt.PERIOD_CODE)return this.gobbleNumericLiteral();if(e==nt.SINGLE_QUOTE_CODE||e==nt.DOUBLE_QUOTE_CODE)return this.gobbleStringLiteral();if(nt.isIdentifierStart(e)||e==nt.OPEN_PAREN_CODE)return this.gobbleVariable();if(e==nt.OPEN_BRACKET_CODE)return this.gobbleArray();{let n=at.substr(this.inputString,this.index,Xa.getMaxOperatorLength()),i=n.length;for(;i>0;){if(Xa.hasOperator(n))return this.index+=i,bt.fromExpressionType(He.EUnary(n,bt.toExpressionType(this.gobbleToken())));--i,n=at.substr(n,0,i)}return null}}gobbleNumericLiteral(){let e="";for(;this.index=this.length)return bt.fromExpressionType(He.ELiteral(mt.VFloat(parseFloat(e))));let i=this.charCodeAt(this.index);if(nt.isIdentifierStart(i))throw ne.thrown(new At('variable names cannot start with a number: "'+e+this.charAt(this.index)+'"',this.inputString,this.index));if(i==nt.PERIOD_CODE)throw ne.thrown(new At('unexpected period in numeric literal: "'+e+this.charAt(this.index)+'"',this.inputString,this.index));return bt.fromExpressionType(He.ELiteral(mt.VFloat(parseFloat(e))))}gobbleStringLiteral(){let e="",n=this.charAt(this.index++),i=!1;for(;this.index({_hx_index:0,__enum__:"mcl.FlattenedType",value:t,"@kind":"FLiteral"}),{_hx_name:"FLiteral",__params__:["value"]}),FIdentifier:Object.assign(t=>({_hx_index:1,__enum__:"mcl.FlattenedType",name:t,"@kind":"FIdentifier"}),{_hx_name:"FIdentifier",__params__:["name"]}),FUnary:Object.assign((t,e)=>({_hx_index:2,__enum__:"mcl.FlattenedType",operant:t,operand:e,"@kind":"FUnary"}),{_hx_name:"FUnary",__params__:["operant","operand"]}),FBinary:Object.assign((t,e,n)=>({_hx_index:3,__enum__:"mcl.FlattenedType",operant:t,left:e,right:n,"@kind":"FBinary"}),{_hx_name:"FBinary",__params__:["operant","left","right"]}),FAdd:Object.assign(t=>({_hx_index:4,__enum__:"mcl.FlattenedType",item:t,"@kind":"FAdd"}),{_hx_name:"FAdd",__params__:["item"]}),FMul:Object.assign(t=>({_hx_index:5,__enum__:"mcl.FlattenedType",item:t,"@kind":"FMul"}),{_hx_name:"FMul",__params__:["item"]}),FCall:Object.assign((t,e)=>({_hx_index:6,__enum__:"mcl.FlattenedType",callee:t,args:e,"@kind":"FCall"}),{_hx_name:"FCall",__params__:["callee","args"]}),FConditional:Object.assign((t,e,n)=>({_hx_index:7,__enum__:"mcl.FlattenedType",test:t,consequent:e,alternate:n,"@kind":"FConditional"}),{_hx_name:"FConditional",__params__:["test","consequent","alternate"]}),FArray:Object.assign(t=>({_hx_index:8,__enum__:"mcl.FlattenedType",items:t,"@kind":"FArray"}),{_hx_name:"FArray",__params__:["items"]}),FCompound:Object.assign(t=>({_hx_index:9,__enum__:"mcl.FlattenedType",items:t,"@kind":"FCompound"}),{_hx_name:"FCompound",__params__:["items"]})};En.__constructs__=[En.FLiteral,En.FIdentifier,En.FUnary,En.FBinary,En.FAdd,En.FMul,En.FCall,En.FConditional,En.FArray,En.FCompound];En.__empty_constructs__=[];var M4=j.global("$hxClasses")["mcl.McMath"]=s(class gt{static flatten(e){switch(e._hx_index){case 0:let n=e.value;return En.FLiteral(n);case 1:let i=e.name;return En.FIdentifier(i);case 2:let a=e.operator_,r=e.operand;return En.FUnary(a,gt.flatten(r));case 3:let o=e.operator_,l=e.left,c=e.right;if(o=="+"){let B=new Array,q=0,G=null;return G=s(function(W){switch(W._hx_index){case 0:let ee=W.value;switch(ee._hx_index){case 0:let Z=ee.v;Z==Math.floor(Z)?q+=Math.floor(Z):B.push(gt.flatten(W));break;case 1:let me=ee.v;q+=me;break;default:B.push(gt.flatten(W))}break;case 3:if(W.operator_=="+"){let Z=W.left,me=W.right;G(Z),G(me)}else B.push(gt.flatten(W));break;default:B.push(gt.flatten(W))}},"flattenAdd"),G(e),q!=0&&B.push(En.FLiteral(mt.VInt(q))),En.FAdd(B)}if(o=="*"){let B=new Array,q=1,G=null;return G=s(function(W){switch(W._hx_index){case 0:let ee=W.value;switch(ee._hx_index){case 0:let Z=ee.v;Z==Math.floor(Z)?q*=Math.floor(Z):B.push(gt.flatten(W));break;case 1:let me=ee.v;q*=me;break;default:B.push(gt.flatten(W))}break;case 3:if(W.operator_=="*"){let Z=W.left,me=W.right;G(Z),G(me)}else B.push(gt.flatten(W));break;default:B.push(gt.flatten(W))}},"flattenMul"),G(e),q!=1&&B.push(En.FLiteral(mt.VInt(q))),En.FMul(B)}return En.FBinary(o,gt.flatten(l),gt.flatten(c));case 4:let d=e.callee,u=e.arguments,p=gt.flatten,m=new Array(u.length),f=0,g=u.length;for(;f=97&&S<=122||S>=65&&S<=90||S>=48&&S<=57||S==46||S==95||S==36||S==35?!0:S==64},"isAlphaNumeric"),f=0,g=s(function(){return f+=1,"var"+f},"getNextVarName"),x="";for(;p=97&&S<=122||S>=65&&S<=90){let F="";for(;p({_hx_index:6,__enum__:"ValueType",c:t,"@kind":"TClass"}),{_hx_name:"TClass",__params__:["c"]}),TEnum:Object.assign(t=>({_hx_index:7,__enum__:"ValueType",e:t,"@kind":"TEnum"}),{_hx_name:"TEnum",__params__:["e"]}),TUnknown:{_hx_name:"TUnknown",_hx_index:8,__enum__:"ValueType","@kind":"TUnknown"}};ft.__constructs__=[ft.TNull,ft.TInt,ft.TFloat,ft.TBool,ft.TObject,ft.TFunction,ft.TClass,ft.TEnum,ft.TUnknown];ft.__empty_constructs__=[ft.TNull,ft.TInt,ft.TFloat,ft.TBool,ft.TObject,ft.TFunction,ft.TUnknown];var Li=j.global("$hxClasses").Type=s(class xv{static createInstance(e,n){let i=Function.prototype.bind.apply(e,[null].concat(n));return new i}static createEnum(e,n,i){let a=sn.field(e,n);if(a==null)throw ne.thrown("No such constructor "+n);if(sn.isFunction(a)){if(i==null)throw ne.thrown("Constructor "+n+" need parameters");return a.apply(e,i)}if(i!=null&&i.length!=0)throw ne.thrown("Constructor "+n+" does not need parameters");return a}static typeof(e){switch(typeof e){case"boolean":return ft.TBool;case"function":return e.__name__||e.__ename__?ft.TObject:ft.TFunction;case"number":return Math.ceil(e)==e%2147483648?ft.TInt:ft.TFloat;case"object":if(e==null)return ft.TNull;let n=e.__enum__;if(n!=null)return ft.TEnum(j.global("$hxEnums")[n]);let i=Pr.getClass(e);return i!=null?ft.TClass(i):ft.TObject;case"string":return ft.TClass(String);case"undefined":return ft.TNull;default:return ft.TUnknown}}static enumEq(e,n){if(e==n)return!0;try{let i=e.__enum__;if(i==null||i!=n.__enum__||e._hx_index!=n._hx_index)return!1;let r=j.global("$hxEnums")[i].__constructs__[e._hx_index].__params__,o=0;for(;o=this.max}next(){let e=this.current;if(!this.hasNext())throw ne.thrown("No such element");return this.current+=this.offset,e}static get __name__(){return"mcl.McIntIterator"}get __class__(){return V4}},"McIntIterator");Bd.prototype.min=null;Bd.prototype.max=null;Bd.prototype.current=null;Bd.prototype.offset=null;var Pd=j.global("$hxClasses")["mcl.McFloatIterator"]=s(class z4 extends j.inherits(){[j.new](e,n,i){if(this.min=e,this.max=n,this.current=e,this.offset=i,i<0&&e0&&e>n)throw ne.thrown("Invalid step for range")}hasNext(){return this.offset>0?this.current<=this.max:this.current>=this.max}next(){let e=this.current;if(!this.hasNext())throw ne.thrown("No such element");return this.current+=this.offset,e}static get __name__(){return"mcl.McFloatIterator"}get __class__(){return z4}},"McFloatIterator");Pd.prototype.min=null;Pd.prototype.max=null;Pd.prototype.current=null;Pd.prototype.offset=null;var rs=j.global("$hxClasses")["mcl.Globals"]=s(class Dc{static set(e,n){Dc.map.inst.set(e,n)}static get(e){return Dc.map.inst.get(e)}static has(e){return Dc.map.inst.has(e)}static delete(e){return Dc.map.inst.delete(e)}static get __name__(){return"mcl.Globals"}get __class__(){return Dc}},"Globals");rs.loopVariants=function(t){var e;let n=new Ic;return n.inst.set([ft.TInt,ft.TInt],function(i){let a=i[0],r=i[1];return new Bd(a,r)}),n.inst.set([ft.TFloat,ft.TFloat,ft.TFloat],function(i){let a=i[0],r=i[1],o=i[2];return new Pd(a,r,o)}),n.inst.set([ft.TClass(Array)],function(i){return new as(i[0])}),n.inst.set([ft.TObject],function(i){return new as(Object.entries(i[0]))}),n.inst.set([ft.TFunction],function(i){let a=i[0];return new as(Array.from(a()))}),e=n,e}(void 0);rs.map=function(t){var e;let n=new et;return n.inst.set("REPEAT",function(...i){let a=i.length,r=rs.loopVariants,o=r,l=r.keys();for(;l.hasNext();){let m=l.next(),f=o.get(m),x=m,_=f;if(x.length==a){let h=!1,v=0,b=a;for(;v({_hx_index:3,__enum__:"haxe.io.Error",e:t,"@kind":"Custom"}),{_hx_name:"Custom",__params__:["e"]})};Qa.__constructs__=[Qa.Blocked,Qa.Overflow,Qa.OutsideBounds,Qa.Custom];Qa.__empty_constructs__=[Qa.Blocked,Qa.Overflow,Qa.OutsideBounds];var ZPe=j.$global,$a=j.global("$hxEnums")["haxe.io.Encoding"]={__ename__:"haxe.io.Encoding",UTF8:{_hx_name:"UTF8",_hx_index:0,__enum__:"haxe.io.Encoding","@kind":"UTF8"},RawNative:{_hx_name:"RawNative",_hx_index:1,__enum__:"haxe.io.Encoding","@kind":"RawNative"}};$a.__constructs__=[$a.UTF8,$a.RawNative];$a.__empty_constructs__=[$a.UTF8,$a.RawNative];var iLe=j.$global,Oi=j.global("$hxClasses")["haxe.io.Bytes"]=s(class zd extends j.inherits(){[j.new](e){this.length=e.byteLength,this.b=new Uint8Array(e),this.b.bufferValue=e,e.hxBytes=this,e.bytes=this.b}getString(e,n,i){if(e<0||n<0||e+n>this.length)throw ne.thrown(Qa.OutsideBounds);i==null&&(i=$a.UTF8);let a="",r=this.b,o=e,l=e+n;switch(i._hx_index){case 0:let c=e>0;for(;o>8}return new zd(r.buffer)}let i=new Array,a=0;for(;a>6),i.push(128|r&63)):r<=65535?(i.push(224|r>>12),i.push(128|r>>6&63),i.push(128|r&63)):(i.push(240|r>>18),i.push(128|r>>12&63),i.push(128|r>>6&63),i.push(128|r&63))}return new zd(new Uint8Array(i).buffer)}static ofData(e){let n=e.hxBytes;return n??new zd(e)}static get __name__(){return"haxe.io.Bytes"}get __class__(){return zd}},"Bytes");Oi.prototype.length=null;Oi.prototype.b=null;var lLe=j.$global,kC=j.global("$hxClasses")["js.node.buffer._Buffer.Helper"]=s(class jC{static bytesOfBuffer(e){let n=Object.create(Oi.prototype);return n.length=e.byteLength,n.b=e,e.bufferValue=e,e.hxBytes=n,e.bytes=e,n}static get __name__(){return"js.node.buffer._Buffer.Helper"}get __class__(){return jC}},"Helper");var fLe=j.$global,Cv=j.global("$hxClasses")["haxe.crypto.Sha1"]=s(class ih extends j.inherits(){[j.new](){}doEncode(e){let n=new Array,i=1732584193,a=-271733879,r=-1732584194,o=271733878,l=-1009589776,c=0;for(;c>>31}let x=(i<<5|i>>>27)+this.ft(g,a,r,o)+l+n[g]+this.kt(g);l=o,o=r,r=a<<30|a>>>2,a=i,i=x,++g}i+=d,a+=u,r+=p,o+=m,l+=f,c+=16}return[i,a,r,o,l]}ft(e,n,i,a){return e<20?n&i|~n&a:e<40?n^i^a:e<60?n&i|n&a|i&a:n^i^a}kt(e){return e<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514}hex(e){let n="",i=0;for(;i>6)+1,a=new Array,r=0,o=i*16;for(;r>2;a[m]|=n.b[p]<<24-((p&3)<<3)}let d=n.length,u=d>>2;return a[u]|=128<<24-((d&3)<<3),a[i*16-1]=n.length*8,a}static get __name__(){return"haxe.crypto.Sha1"}get __class__(){return ih}},"Sha1");var bLe=j.$global,Ud=j.global("$hxClasses")["haxe.crypto.BaseCode"]=s(class AC extends j.inherits(){[j.new](e){let n=e.length,i=1;for(;n>1<8||n!=1<>3,o=new Oi(new ArrayBuffer(r)),l=0,c=0,d=0,u=0;for(;u>c&255}return o}static get __name__(){return"haxe.crypto.BaseCode"}get __class__(){return AC}},"BaseCode");Ud.prototype.base=null;Ud.prototype.nbits=null;Ud.prototype.tbl=null;var TLe=j.$global,qd=j.global("$hxClasses")["haxe.crypto.Base64"]=s(class Sv{static decode(e,n){if(n==null&&(n=!0),n)for(;at.cca(e,e.length-1)==61;)e=at.substr(e,0,-1);return new Ud(Sv.BYTES).decodeBytes(Oi.ofString(e))}static get __name__(){return"haxe.crypto.Base64"}get __class__(){return Sv}},"Base64");qd.CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";qd.BYTES=Oi.ofString(qd.CHARS);var DLe=j.$global,Iv=j.global("$hxClasses")["haxe.Resource"]=s(class Ov{static getString(e){let n=0,i=Ov.content;for(;n`:i+=` at `+r.file+":"+r.line+":"+(r.col+1)}return i}static formatContext(e,n,i){return Pv.formatWithStack(e,i.stack.concat([n]))}static get __name__(){return"mcl.ErrorUtil"}get __class__(){return Pv}},"ErrorUtil"),rh=j.global("$hxClasses")["mcl._Compiler.UidTracker"]=s(class NC extends j.inherits(){[j.new](){this.uid=0}get(){return this.uid++}static get __name__(){return"mcl._Compiler.UidTracker"}get __class__(){return NC}},"UidTracker");rh.prototype.uid=null;var jo=j.global("$hxClasses")["mcl.McTemplate"]=s(class RC extends j.inherits(){[j.new](e,n,i){this.jsValueCache=new Fc,this.hasBeenUsed=!1,this.tickBlock=null,this.loadBlock=null,this.overloads=new Ic,this.name=e,this.body=n,this.parse(n),this.file=i}compileArgs(e,n){let i=[],a=e.split(" "),r=0,o=0;for(;o0){let a=this.loadBlock[0].pos;i.push(pe.FunctionDef(a,"load",this.loadBlock,"minecraft:load"))}if(this.tickBlock!=null&&this.tickBlock.length>0){let a=this.tickBlock[0].pos;i.push(pe.FunctionDef(a,"tick",this.tickBlock,"minecraft:tick"))}if(i.length>0){let a=i[0].pos,r=e.compiler.getInitialPathInfo(this.file.name),o={append:function(c){throw new Je(Qe.formatContext("tried to append to a Void context (template virtual context)",a,e),!1,[a].concat(e.stack))},namespace:r.namespace,path:r.path,uidIndex:e.uidIndex,variables:new Gt(e.globalVariables),templates:this.file.templates,stack:e.stack,replacements:new Gt(null),isTemplate:!1,requireTemplateKeyword:!0,compiler:e.compiler,globalVariables:e.globalVariables,functions:e.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:e.currentFunction},l=pe.Directory(a,this.name,i);n.embed(o,a,new et,[l],!0)}}injectTransform(e,n){this.hasBeenUsed=!0;let i=[];if(this.loadBlock!=null&&this.loadBlock.length>0){let a=this.loadBlock[0].pos;i.push(pe.FunctionDef(a,"load",this.loadBlock,"minecraft:load"))}if(this.tickBlock!=null&&this.tickBlock.length>0){let a=this.tickBlock[0].pos;i.push(pe.FunctionDef(a,"tick",this.tickBlock,"minecraft:tick"))}if(i.length>0){let a=i[0].pos,r=e.compiler.getInitialPathInfo(this.file.name),o={append:function(c){throw new Je(Qe.formatContext("tried to append to a Void context (template virtual context)",a,e),!1,[a].concat(e.stack))},namespace:r.namespace,path:r.path,uidIndex:e.uidIndex,variables:new Gt(e.globalVariables),templates:this.file.templates,stack:e.stack,replacements:new Gt(null),isTemplate:!1,requireTemplateKeyword:!0,compiler:e.compiler,globalVariables:e.globalVariables,functions:e.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:e.currentFunction},l=pe.Directory(a,this.name,i);n.embedTransform(o,a,new et,[l],!0)}return pe.Void}process(e,n,i,a,r){let o=Et.ltrim(a.substring(this.name.length));this.jsValueCache.clear(),dt.jsCache=this.jsValueCache;let l=this.overloads,c=l,d=l.keys();for(;d.hasNext();){let u=d.next(),p=c.get(u),f=u,g=p,x=new et,_=0,h=0,v=[o].concat(r??[]),b=!1,y=0,w=0;for(;w=v.length)break;if(F.expectBlock){if(!Li.enumEq(Li.typeof(v[h]),ft.TEnum(pe)))break;let N=F.parseValueBlock(v[h],i,n);if(!N.success)break;b=!0,x.inst.set(F.name,N.value),v[h]=N.raw,++_,++h}else{if(typeof v[h]!="string")break;let N=v[h],k=null;if(N.charAt(0)=="<"&&N.charAt(1)=="%"&&!F.expectJsValue){let D=N.indexOf("%>");if(D==-1)throw new Je(Qe.formatContext("Unexpected end of inline script block",i,n),!1,[i].concat(n.stack));let B=N.substring(2,D);if(k=B,this.jsValueCache.inst.has(y)){let q=this.jsValueCache.inst.get(y);N=q==null?"null":Ge.string(q)}else{let q=ei.invokeExpressionInline(B,n,i);this.jsValueCache.inst.set(y,q),N=q==null?"null":Ge.string(q)}++y}else F.expectJsValue&&(dt.jsCacheIdx=y,++y);let R=F.parseValue(N,i,n);if(!R.success)break;F.name!=null&&x.inst.set(F.name,R.value),k!=null?v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(k.length+4)):v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(R.raw.length)),++_,b=!1}}for(;h=v.length)break;if(N.expectBlock){if(!Li.enumEq(Li.typeof(v[h]),ft.TEnum(pe)))break;let k=N.parseValueBlock(v[h],i,n);if(!k.success)break;b=!0,x.inst.set(N.name,k.value),v[h]=k.raw,++_,++h}else{if(typeof v[h]!="string")break;let k=v[h],R=null;if(k.charAt(0)=="<"&&k.charAt(1)=="%"&&!N.expectJsValue){let B=k.indexOf("%>");if(B==-1)throw new Je(Qe.formatContext("Unexpected end of inline script block",i,n),!1,[i].concat(n.stack));let q=k.substring(2,B);if(R=q,this.jsValueCache.inst.has(y)){let G=this.jsValueCache.inst.get(y);k=G==null?"null":Ge.string(G)}else{let G=ei.invokeExpressionInline(q,n,i);this.jsValueCache.inst.set(y,G),k=G==null?"null":Ge.string(G)}++y}else N.expectJsValue&&(dt.jsCacheIdx=y,++y);let D=N.parseValue(k,i,n);if(!D.success)break;N.name!=null&&x.inst.set(N.name,D.value),R!=null?v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(R.length+4)):v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(D.raw.length)),++_,b=!1}}for(;h({_hx_index:0,__enum__:"mcl.ImportFileType",f:t,"@kind":"IMcFile"}),{_hx_name:"IMcFile",__params__:["f"]}),IJsFile:Object.assign(t=>({_hx_index:1,__enum__:"mcl.ImportFileType",f:t,"@kind":"IJsFile"}),{_hx_name:"IJsFile",__params__:["f"]})};ol.__constructs__=[ol.IMcFile,ol.IJsFile];ol.__empty_constructs__=[];var ei=j.global("$hxClasses")["mcl.McFile"]=s(class rl extends j.inherits(){[j.new](e,n){this.tagsDir="tags",this.functionsDir="functions",this.fileJs={},this.tickCommands=[],this.loadCommands=[],this.imports=new et,this.exportedTemplates=new et,this.templates=new et,this.ast=[],this.name=e,this.ast=n,this.ext=Ze.extension(e)}getTemplates(){if(this.ext=="mcbt")return this.exportedTemplates;throw new Je("tried to get templates from non-template file:"+this.name,!0)}setup(e){e.config.features.useFolderRenames48&&(this.functionsDir="function");let n=this.ast;this.ast=[];let i=0;for(;i0&&B.endsWith(".mcfunction")&&(q=a.compiler.config.header+` `+q),a.compiler.io.write(B,q);let G="function "+a.namespace+":"+a.path.concat([d]).join("/"),W=i==null?"":" "+this.injectValues(i,a,e);return(o?"$":"")+(G+W)}embedTransform(e,n,i,a,r){r==null&&(r=!1);let o=e.namespace,l=e.append,c=e.globalVariables,d=new Gt(Gt.globals,(i==null?c:new Gt(c,i)).get()),u=e.path,p={append:l,namespace:o,path:u??[],uidIndex:e.uidIndex,variables:d,stack:e.stack,replacements:e.replacements,isTemplate:this.ext=="mcbt",templates:e.templates,requireTemplateKeyword:e.requireTemplateKeyword,compiler:e.compiler,globalVariables:e.globalVariables,functions:e.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:e.currentFunction},m=[],f=0;for(;f0)throw new Je(Qe.formatContext("Unexpected extra data in non template command",n,e),!1,[n].concat(e.stack))}return pe.Raw(n,this.injectValues(i,e,n),a,r)}processTemplate(e,n,i,a,r){if(e.compiler.templateParsingEnabled){i.startsWith("template ")&&(i=i.substring(9));let l=e.templates,c=l,d=l.keys();for(;d.hasNext();){let u=d.next(),p=c.get(u),f=u,g=p;if(i==f||i.startsWith(""+f+" ")){g.process(this,e,n,i,a);return}}if(a!=null&&a.length>0)throw new Je(Qe.formatContext("Unexpected extra data in non template command",n,e),!1,[n].concat(e.stack))}let o=this.injectValues(i,e,n);e.append((r?"$":"")+o)}compileInline(e,n,i){i==null&&(i=!1);let a=Zn.tokenize(n,""),r=new ko(a),o=[];for(;r.hasNext();)i?o.push(Xt.parseTLD(r)):o.push(Xt.innerParse(r));if(i){let l=0;for(;l"),r=new ko(a),o=[];for(;r.hasNext();)i?o.push(Xt.parseTLD(r)):o.push(Xt.innerParse(r));let l;if(i){let c=[],d=0;for(;d0&&y.endsWith(".mcfunction")&&(w=e.compiler.config.header+` `+w),e.compiler.io.write(y,w);let S=""+e.namespace+":"+e.path.concat([b]).join("/");return e.append("function "+S+(v==null?"":" "+v)),S},"emitBlock");c.mcb=u,a||(c.block=p);let m=[c,e,function(h){if(a)throw new Je(Qe.formatContext("embed not available in toplevel script blocks",n,e),!1,[n].concat(e.stack));return h.embedTo(e,n,d)},e.compiler.disableRequire?function(h){throw new Je(Qe.formatContext("Require not available as it has been disabled, please disable compiler.disableRequire",n,e),!1,[n].concat(e.stack))}:Bv.createRequire(this.name)],g=e.variables.get(),x=g,_=g.keys();for(;_.hasNext();){let h=_.next(),v=x.get(h),y=h,w=v;l.push(y),m.push(w)}try{new Function(...l,r)(...m)}catch(h){let v=ne.caught(h);throw v instanceof Ci?ne.thrown(v):new Je(Qe.formatContext("Error in multi-line script, '"+v.get_message()+"' at "+n.file+":"+n.line+":"+(n.col+1),n,e),!1,[n].concat(e.stack))}}processMlScriptTransform(e,n,i,a){a==null&&(a=!1);let r="",o=0;for(;o0&&tn.endsWith(".mcfunction")&&(kn=n.compiler.config.header+` `+kn),n.compiler.io.write(tn,kn);let Rn=n,ii=this.injectValues((V?"$":"")+(""+he+" function "+fe+(Ie==null?"":" "+Ie)),n,Q);if(Rn.append(ii),ge!=null){let yt=0,Mn=0;for(;Mn0&&xy.endsWith(".mcfunction")&&(xg=n.compiler.config.header+` `+xg),n.compiler.io.write(xy,xg);let sI=n,lI="execute if score #ifelse "+n.compiler.config.internalScoreboardName+" matches 0 run function "+n.namespace+":"+n.path.concat([n.compiler.config.generatedDirName,gg]).join("/");sI.append((tI?"$":"")+(lI+(hy==null?"":" "+hy)));break;case 11:let i2e=dn.continuations,a2e=dn.pos,vg=dn.execute,vy=dn.data,by=dn.body,cI=dn.isMacro,yy=["scoreboard players set #ifelse "+n.compiler.config.internalScoreboardName+" 1"],uI=s(function(bs){yy.push(bs)},"embedAppend"),bg=Ge.string(n.uidIndex.get()),dI=""+n.namespace+":"+n.path.concat([n.compiler.config.generatedDirName,bg]).join("/"),pI=n.functions.concat([dI]),wy=n.path,mI={append:uI,namespace:n.namespace,path:wy??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext=="mcbt",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:pI,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},yg=0;for(;yg0&&Ey.endsWith(".mcfunction")&&(wg=n.compiler.config.header+` `+wg),n.compiler.io.write(Ey,wg);let hI=vg.startsWith("execute ")?vg.substring(8):vg,gI=n,_I="execute if score #ifelse "+n.compiler.config.internalScoreboardName+" matches 0 "+hI+" function "+n.namespace+":"+n.path.concat([n.compiler.config.generatedDirName,bg]).join("/");gI.append((cI?"$":"")+(_I+(vy==null?"":" "+vy)));break;default:let ky=dn.pos;throw new Je(Qe.formatContext("Unexpected continuation type: "+Ge.string(dn),ky,we),!1,[ky].concat(we.stack))}++yt}}break;case 12:let Ft=e.pos,$t=e.delay,ai=e.type,cr=e.body,Fa=e.isMacro;$t=this.injectValues($t,n,Ft),ai=this.injectValues(ai,n,Ft);let Na=[],Ra=s(function(yt){Na.push(yt)},"append1"),ur=Ge.string(n.uidIndex.get()),Fi=""+n.namespace+":"+n.path.concat([n.compiler.config.generatedDirName,ur]).join("/"),Gr=n.functions.concat([Fi]),Ma=n.path,Wr={append:Ra,namespace:n.namespace,path:Ma??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext=="mcbt",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:Gr,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},Wi=0;for(;Wi0&&Kr.endsWith(".mcfunction")&&(dr=n.compiler.config.header+` `+dr),n.compiler.io.write(Kr,dr);let Yr=n,pr="schedule function "+n.namespace+":"+n.path.concat([n.compiler.config.generatedDirName,Un]).join("/")+" "+$t+" "+ai;Yr.append((Fa?"$":"")+pr);break;case 15:let _l=e.pos,So=e.value;n.compiler.config.dontEmitComments||n.append(So);break;case 19:let mr=e.pos,Xr=e.command,ps=e.value,ce=e.isMacro,ln=[],Ba=n.path,$c={append:function(yt){ln.push(yt)},namespace:n.namespace,path:Ba??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext=="mcbt",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:n.functions,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction};if(this.compileCommand(ps,$c),ln.length!=1)throw new Je(Qe.formatContext("Expected exactly 1 command after execute, got "+ln.length,mr,n),!1,[mr].concat(n.stack));let hp=n,pg=this.injectValues((ce?"$":"")+(""+Xr+" "+ln[0]),n,mr);hp.append(pg);break;case 20:let xl=e.pos,gp=e.name,eu=e.data,Se=e.isMacro,ue=n,tt="function "+this.evaluateFunctionHandle(gp,n,xl,Se),mg=eu.length==0?"":" "+this.injectValues(eu,n,xl),py=this.injectValues((Se?"$":"")+(tt+mg),n,xl);ue.append(py);break;case 21:let fg=e.pos,hg=e.command,tu=M4.compile(this.injectValues(hg,n,fg),n);n.append(tu.commands);let Oo="scoreboard objectives add "+n.compiler.config.eqConstScoreboardName+" dummy";this.loadCommands.includes(Oo)||this.loadCommands.push(Oo),Oo="scoreboard objectives add "+n.compiler.config.eqVarScoreboardName+" dummy",this.loadCommands.includes(Oo)||this.loadCommands.push(Oo);let ms=0,ht=tu.constants;for(;ms0&&f.endsWith(".mcfunction")&&(g=r.compiler.config.header+` `+g),r.compiler.io.write(f,g)}compileDirectory(e,n,i,a){n=this.injectValues(n,a,e);let r=a.namespace,o=a.variables,l=a.path.concat([n]),c=new rh,d={append:function(p){throw new Je(Qe.formatContext("append not available for directory context",e,a),!0,[e].concat(a.stack))},namespace:r,path:l??[],uidIndex:c,variables:o,stack:a.stack,replacements:a.replacements,isTemplate:this.ext=="mcbt",templates:a.templates,requireTemplateKeyword:a.requireTemplateKeyword,compiler:a.compiler,globalVariables:a.globalVariables,functions:a.functions,baseNamespaceInfo:a.baseNamespaceInfo,currentFunction:a.currentFunction},u=0;for(;u0&&Ie.endsWith(".mcfunction")&&(le=n.compiler.config.header+` `+le),n.compiler.io.write(Ie,le),n.compiler.tags.addTagEntry("minecraft:load",X,n);break;default:let ge=e.pos;throw new Je(Qe.formatContext("unexpected node type:"+Ge.string(e),ge,n),!0,[ge].concat(n.stack))}}compileJsonFileImpl(e,n,i,a,r){let o="{"+this.stringifyJsonTag(e,n,a,r)+"}",l;switch(i._hx_index){case 1:let u=i.entries;l=r.compiler.config.features.useFolderRenames48?"advancement":"advancements";break;case 2:let p=i.entries;l=r.compiler.config.features.useFolderRenames48?"item_modifier":"item_modifiers";break;case 3:let m=i.entries;l=r.compiler.config.features.useFolderRenames48?"loot_table":"loot_tables";break;case 4:let f=i.entries;l=r.compiler.config.features.useFolderRenames48?"predicate":"predicates";break;case 5:let g=i.entries;l=r.compiler.config.features.useFolderRenames48?"recipe":"recipes";break;case 6:let x=i.entries;l="chat";break;case 7:let _=i.entries;l="damage";break;case 8:let h=i.entries;l="dimension";break;case 9:let v=i.entries;l="dimension_type";break;case 10:let b=i.entries;l="enchantment";break;default:throw new Je(Qe.formatContext("unexpected json tag type:"+Ge.string(i),e,r),!0,[e].concat(r.stack))}let c=Ze.join(["data",r.namespace,l].concat(r.path.concat([n+".json"]))),d=o;r.compiler.config.header.length>0&&c.endsWith(".mcfunction")&&(d=r.compiler.config.header+` `+d),r.compiler.io.write(c,d)}compileJsonFile(e,n,i,a){switch(i._hx_index){case 0:let r=i.subType,o=i.replace,l=i.entries;if(r=="function"||r=="functions"){n=a.namespace+":"+a.path.concat([n]).join("/"),a.compiler.tags.ensureTag(n,a);let N=0;for(;N0&&q.endsWith(".mcfunction")&&(G=a.compiler.config.header+` `+G),a.compiler.io.write(q,G)}break;case 1:let c=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,c,a);break;case 2:let d=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,d,a);break;case 3:let u=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,u,a);break;case 4:let p=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,p,a);break;case 5:let m=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,m,a);break;case 6:let f=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,f,a);break;case 7:let g=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,g,a);break;case 8:let x=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,x,a);break;case 9:let _=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,_,a);break;case 10:let h=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,h,a);break;case 11:let v=i.subType,b=i.name,y=i.entries;b=this.injectValues(b,a,e);let w="{"+this.stringifyJsonTag(e,b,y,a)+"}",S=Ze.join(["data",a.namespace,"worldgen",v].concat(a.path.concat([b+".json"]))),F=w;a.compiler.config.header.length>0&&S.endsWith(".mcfunction")&&(F=a.compiler.config.header+` `+F),a.compiler.io.write(S,F);break}}processCompilerLoop(e,n,i,a,r,o){let c=rl.invokeExpressionInline(e,i,r);for(;c.hasNext();){let d=c.next();if(n==null){let u=0;for(;u0)throw new Je(Qe.formatContext("Unexpected extra data in json tag",S,a),!1,[S].concat(a.stack));r.push(this.injectValues(w,a,S))}else{let y=u.pos;throw new Je(Qe.formatContext("unexpected node type:"+Ge.string(u),y,a),!0,[y].concat(a.stack))}break;case 5:let p=u.pos,m=u.expression,f=u.as,g=u.body;this.processCompilerLoop(m,f,a,g,p,function(y,w){c.compileCommand(w,y)});break;case 6:let x=u.pos,_=u.expression,h=u.body,v=u.elseExpressions;this.compileTimeIf(_,h,v,x,l,function(y){c.compileCommand(y,a)});break;default:let b=u.pos;throw new Je(Qe.formatContext("unexpected node type:"+Ge.string(u),b,a),!0,[b].concat(a.stack))}}return r.join("")}injectValues(e,n,i){if(e==null)return"";if(e.indexOf("<%")==-1)return e;let a=n.variables.get(),r=["embed","context"],o=this,l=[function(_){return _.embedTo(n,i,o)},n],c=a,d=c,u=c.keys();for(;u.hasNext();){let _=u.next(),h=d.get(_),b=_,y=h;r.push(b),l.push(y)}let p=[],m=[],f=0,g=e.split("<%");for(;f");h.length==1?(m.push(h[0]),p.push("$$context["+Ge.string(m.length-1)+"]")):(p.push(h[0]),m.push(h[1]),p.push("$$context["+Ge.string(m.length-1)+"]"))}let x="return (["+p.join(",")+"].join(''));";try{return new Function(...r,"$$context",x).apply(null,l.concat([m]))}catch(_){let h=ne.caught(_);throw new Je(Qe.formatContext(Xt.format("Encountered an error whilst evaluating expression '{}' at {}:{}:{}",h.get_message(),i.file,i.line,i.col+1),i,n),!1,[i].concat(n.stack))}}transformCompileTimeIf(e,n,i,a,r,o,l){if(l==null&&(l=!1),rl.invokeExpressionInline(e,r,a)){let d=[],u=0;for(;u0){let h=this.ast[0].pos;throw new Je(Qe.formatContext("Unexpected top-level content in template file",h,f),!1,[h].concat(f.stack))}return[pe.Void]}let g=[],x=0,_=this.ast;for(;x<_.length;){let h=_[x];++x;let v;switch(h._hx_index){case 2:let b=h.pos,y=h.name,w=h.body;throw new Je("import or template definition found after setup",!0);case 4:let S=h.pos,F=h.name;throw new Je("import or template definition found after setup",!0);default:v=this.transformTld(h,f)}g.push(v)}return g}compile(e,n){let i=n.getInitialPathInfo(this.name),a=new et,r=0,o=sn.fields(this.fileJs);for(;r0){let _=this.ast[0].pos;throw new Je(Qe.formatContext("Unexpected top-level content in template file",_,f),!1,[_].concat(f.stack))}return}let g=0,x=this.ast;for(;g0){let _=Ze.join(["data",f.namespace,this.functionsDir].concat(f.path.concat([f.compiler.config.generatedDirName,"load.mcfunction"]))),h=this.loadCommands.join(` `);f.compiler.config.header.length>0&&_.endsWith(".mcfunction")&&(h=f.compiler.config.header+` `+h),f.compiler.io.write(_,h),n.tags.addTagEntry("minecraft:load",f.namespace+":"+f.path.concat([f.compiler.config.generatedDirName,"load"]).join("/"),f)}if(this.tickCommands.length>0){let _=Ze.join(["data",f.namespace,this.functionsDir].concat(f.path.concat([f.compiler.config.generatedDirName,"tick.mcfunction"]))),h=this.tickCommands.join(` `);f.compiler.config.header.length>0&&_.endsWith(".mcfunction")&&(h=f.compiler.config.header+` `+h),f.compiler.io.write(_,h),n.tags.addTagEntry("minecraft:tick",f.namespace+":"+f.path.concat([f.compiler.config.generatedDirName,"tick"]).join("/"),f)}}static invokeExpressionInline(e,n,i){let a=n.variables.get(),r=["context"],o=[n],l=a,c=l,d=l.keys();for(;d.hasNext();){let p=d.next(),m=c.get(p),g=p,x=m;r.push(g),o.push(x)}let u="return ("+e+");";try{return new Function(...r,u).apply(null,o)}catch(p){let m=ne.caught(p);throw new Je(Qe.formatContext(Xt.format("Encountered an error whilst evaluating expression '{}' at {}:{}:{}",m.get_message(),i.file,i.line,i.col+1),i,n),!1,[i].concat(n.stack))}}static get __name__(){return"mcl.McFile"}get __class__(){return rl}},"McFile");ei.prototype.name=null;ei.prototype.ast=null;ei.prototype.templates=null;ei.prototype.exportedTemplates=null;ei.prototype.imports=null;ei.prototype.ext=null;ei.prototype.loadCommands=null;ei.prototype.tickCommands=null;ei.prototype.fileJs=null;ei.prototype.functionsDir=null;ei.prototype.tagsDir=null;var Fn=j.global("$hxClasses")["mcl.Compiler"]=s(class MC extends j.inherits(){[j.new](e,n,i){this.topLevelAstNodes=new Array,this.success=!0,this.templateParsingEnabled=!0,this.disableRequire=!1,this.packNamespace="mcb-"+Ge.string(new Date),this.tags=new gv,this.libStore=null,this.alreadySetupFiles=new et,this.files=new et,this.io=new zi,this.config=sa.create(n),this.baseDir=e,this.libStore=i}addFile(e,n){let i=new ei(e,n);this.files.inst.set(e,i)}resolve(e,n){if(n.charAt(0)=="."||n.charAt(0)=="/"){let i;n.charAt(0)=="/"?(n=n.substring(1),i=this.baseDir):i=Ze.directory(e);let a=Ze.join([i,n]),r=Ze.extension(n);if(r.endsWith("js")||r=="json")return ol.IJsFile(Ee(a));if(this.files.inst.has(a))return this.alreadySetupFiles.inst.has(a)||(this.alreadySetupFiles.inst.set(a,!0),this.files.inst.get(a).setup(this)),ol.IMcFile(this.files.inst.get(a));throw new Je("Failed to resolve import: "+a,!1)}else return ol.IMcFile(this.libStore.lookup(n,{file:e,line:0,col:0},this))}getInitialPathInfo(e){let n=(e.startsWith(this.baseDir)?e.substring(this.baseDir.length):e).split("\\").join("/");n.charAt(0)=="/"&&(n=n.substring(1));let i=n.split("/"),a=Ze.withoutExtension(i[0]),r=i.slice(1).join("/");return{namespace:a,path:i.length>1?Ze.withoutExtension(r).split("/"):[]}}compile(e){this.success=!0;try{let n=Mt.adaptIterator(this.files.inst.values());for(;n.hasNext();){let a=n.next();this.alreadySetupFiles.inst.has(a.name)||a.setup(this)}let i=Mt.adaptIterator(this.files.inst.values());for(;i.hasNext();)i.next().compile(e,this);this.tags.writeTagFiles(this)}catch(n){let i=ne.caught(n).unwrap();throw this.success=!1,ne.thrown(i)}}transform(e){let n=new Map,i=Mt.adaptIterator(this.files.inst.values());for(;i.hasNext();){let r=i.next();this.alreadySetupFiles.inst.has(r.name)||r.setup(this)}let a=Mt.adaptIterator(this.files.inst.values());for(;a.hasNext();){let r=a.next();this.topLevelAstNodes=[],n.set(r.name,pe.Group(r.transform(e,this).concat(this.topLevelAstNodes)))}return n}addTopLevelAstNode(e){this.topLevelAstNodes.push(e)}static get __name__(){return"mcl.Compiler"}get __class__(){return MC}},"Compiler");Fn.prototype.io=null;Fn.prototype.files=null;Fn.prototype.alreadySetupFiles=null;Fn.prototype.libStore=null;Fn.prototype.baseDir=null;Fn.prototype.tags=null;Fn.prototype.packNamespace=null;Fn.prototype.config=null;Fn.prototype.disableRequire=null;Fn.prototype.templateParsingEnabled=null;Fn.prototype.success=null;Fn.prototype.topLevelAstNodes=null;var F7e=j.$global,oh=j.global("$hxClasses")["mcl.args.JsTemplateArgument"]=s(class Vv extends j.inherits(()=>dt,!0){[j.new](e,n){super[j.new](e,n),this.expectJsValue=!0}parseValue(e,n,i){if(e.startsWith("<%")){let a=e.indexOf("%>");if(a==-1)return{success:!1};let r=e.substring(2,a);try{let o=dt.jsCacheIdx,l=dt.jsCache.inst.has(o),c;return l?c=dt.jsCache.inst.get(o):(c=ei.invokeExpressionInline(r,i,n),dt.jsCache.inst.set(o,c)),{success:!0,value:c,raw:e.substring(0,a+2)}}catch{return{success:!1}}}return{success:!1}}static register(){dt.register("js",Vv)}static get __name__(){return"mcl.args.JsTemplateArgument"}static get __super__(){return dt}get __class__(){return Vv}},"JsTemplateArgument");var L7e=j.$global,zv=j.global("$hxClasses")["mcl.args.LiteralTemplateArgument"]=s(class BC extends j.inherits(()=>dt,!0){[j.new](e,n){this.value=n,super[j.new](null,e)}parseValue(e,n,i){return e==this.value||e.startsWith(this.value+" ")?{success:!0,value:e,raw:this.value}:{success:!1}}static register(){dt.register("literal",oh)}static get __name__(){return"mcl.args.LiteralTemplateArgument"}static get __super__(){return dt}get __class__(){return BC}},"LiteralTemplateArgument");zv.prototype.value=null;var W7e=j.$global,dt=j.global("$hxClasses")["mcl.args.TemplateArgument"]=s(class Lc extends j.inherits(){[j.new](e,n){this.expectJsValue=!1,this.expectBlock=!1,this.name=e,this.pos=n}parseValue(e,n,i){throw ne.thrown("override this method in subclass, plz thx")}parseValueBlock(e,n,i){throw ne.thrown("override this method in subclass, plz thx")}static parse(e,n){let i=e.indexOf(":"),a=i==-1?"literal":e.substring(i+1),r=i==-1?e:e.substring(0,i);if(a=="literal")return new zv(n,r);if(!Lc.argumentTypes.inst.has(a))throw ne.thrown("Unknown template argument type: '"+a+"'");return Li.createInstance(Lc.argumentTypes.inst.get(a),[r])}static register(e,n){if(Lc.argumentTypes.inst.has(e))throw ne.thrown("Template argument type already registered: "+e);Lc.argumentTypes.inst.set(e,n)}static get __name__(){return"mcl.args.TemplateArgument"}get __class__(){return Lc}},"TemplateArgument");dt.prototype.name=null;dt.prototype.pos=null;dt.prototype.expectBlock=null;dt.prototype.expectJsValue=null;dt.jsCache=null;dt.jsCacheIdx=0;dt.argumentTypes=new et;var $7e=j.$global,PC=j.global("$hxClasses")["mcl.args.WordTemplateArgument"]=s(class Uv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){if(e=="")return{success:!1};let a=e.indexOf(" "),r=a==-1?e:at.substr(e,0,a);return{success:!0,value:r,raw:r}}static register(){dt.register("word",Uv)}static get __name__(){return"mcl.args.WordTemplateArgument"}static get __super__(){return dt}get __class__(){return Uv}},"WordTemplateArgument");var a9e=j.$global,LC=j.global("$hxClasses")["mcl.args.RawTemplateArgument"]=s(class qv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){return{success:!0,value:e,raw:e}}static register(){dt.register("raw",qv)}static get __name__(){return"mcl.args.RawTemplateArgument"}static get __super__(){return dt}get __class__(){return qv}},"RawTemplateArgument");var u9e=j.$global,VC=j.global("$hxClasses")["mcl.args.IntTemplateArgument"]=s(class Hv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){let a=e.indexOf(" ");a!=-1&&(e=e.substring(0,a));let r=Ge.parseInt(e);return r==null?{success:!1}:{success:!0,value:r,raw:e}}static register(){dt.register("int",Hv)}static get __name__(){return"mcl.args.IntTemplateArgument"}static get __super__(){return dt}get __class__(){return Hv}},"IntTemplateArgument");var h9e=j.$global,zC=j.global("$hxClasses")["mcl.args.FloatTemplateArgument"]=s(class Jv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){let a=e.indexOf(" ");a!=-1&&(e=e.substring(0,a));let r=parseFloat(e);return r==null?{success:!1}:{success:!0,value:r,raw:e}}static register(){dt.register("float",Jv)}static get __name__(){return"mcl.args.FloatTemplateArgument"}static get __super__(){return dt}get __class__(){return Jv}},"FloatTemplateArgument");var j9e=j.$global,Wv=j.global("$hxClasses")["mcl.args.BoundBlock"]=s(class UC extends j.inherits(){[j.new](e,n){this.node=e,this.ctx=n}appendAstNode(e){let n=this.node;if(n._hx_index==8){let i=n.pos,a=n.name,r=n.data,o=n.isMacro,l=n.isInline;n.body.push(e)}else throw ne.thrown("BoundBlock.append: node is not a block")}append(e){let n=Zn.tokenize(e,""),i=new ko(n);for(;i.hasNext();)this.appendAstNode(Xt.innerParse(i))}setName(e){let n=this.node;if(n._hx_index==8){let i=n.name,a=n.pos,r=n.body,o=n.data,l=n.isMacro,c=n.isInline;this.node=pe.Block(a,e,r,o,l,c)}else throw ne.thrown("BoundBlock.setName: node is not a block")}embedTo(e,n,i,a){a==null&&(a=!0);let r=[],o={isTemplate:!1,uidIndex:e.uidIndex,namespace:e.namespace,path:e.path,variables:this.ctx.variables,replacements:this.ctx.replacements,stack:this.ctx.stack,append:function(l){r.push(l)},templates:this.ctx.templates,requireTemplateKeyword:this.ctx.requireTemplateKeyword,compiler:this.ctx.compiler,globalVariables:this.ctx.globalVariables,functions:this.ctx.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:this.ctx.currentFunction};return a?i.embed(o,n,new et,[this.node]):i.embedTransform(o,n,new et,[this.node]),r.join(` `)}static get __name__(){return"mcl.args.BoundBlock"}get __class__(){return UC}},"BoundBlock");Wv.prototype.node=null;Wv.prototype.ctx=null;var qC=j.global("$hxClasses")["mcl.args.BlockTemplateArgument"]=s(class Gv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n),this.expectBlock=!0}parseValueBlock(e,n,i){if(e._hx_index==8){let a=e.pos,r=e.name,o=e.body,l=e.data,c=e.isMacro,d=e.isInline;return{success:!0,value:new Wv(e,i)}}else return{success:!1}}static register(){dt.register("block",Gv)}static get __name__(){return"mcl.args.BlockTemplateArgument"}static get __super__(){return dt}get __class__(){return Gv}},"BlockTemplateArgument");var R9e=j.$global,sh=j.global("$hxClasses")["mcl.TemplateRegisterer"]=s(class HC{static register(){LC.register(),VC.register(),oh.register(),qC.register(),zC.register(),PC.register()}static get __name__(){return"mcl.TemplateRegisterer"}get __class__(){return HC}},"TemplateRegisterer");var JC=wi(Ee("fs"));var G9e=j.$global,Yv=j.global("$hxClasses").LibMain=s(class Kv{static main(){sh.register()}static createCompiler(e,n,i){return new Fn(e,n,i)}static parseFile(e,n){let i=Ze.extension(e),a=Zn.tokenize(n,e);if(i=="mcb")return Xt.parseMcbFile(a);if(i=="mcbt")return Xt.parseMcbtFile(a);throw ne.thrown("Unknown file extension: "+i)}static addFileToCompiler(e,n){let i=Ze.extension(n),a=Zn.tokenize(JC.readFileSync(n,{encoding:"utf8"}),n);e.addFile(n,i=="mcb"?Xt.parseMcbFile(a):Xt.parseMcbtFile(a))}static compileFromFsLikeMap(e,n,i){let a=Kv.createCompiler(e,{},null),r=n.entries(),o=r,l=r.next();for(;!l.done;){let c=l.value;l=o.next();let d=c,u=Zn.tokenize(d[1],d[0]),p=Ze.extension(d[0])=="mcb"?Xt.parseMcbFile(u):Xt.parseMcbtFile(u);a.addFile(d[0],p)}a.io=i,a.compile(new Gt(null))}static createIoProvider(e){switch(e){case 0:return new zi;case 1:return new Ui;default:return new Vr(e)}}static get __name__(){return"LibMain"}get __class__(){return Kv}},"LibMain");var $9e=j.$global,lh=j.global("$hxClasses")["mcl.AstStringifier"]=s(class Xv extends j.inherits(){[j.new](){this.tabs=[""],this.indent=0,this.segments=[]}tab(){let e;if(this.tabs.length>this.indent)e=this.tabs[this.indent];else{let n=this.tabs[this.tabs.length-1],i=this.tabs.length-1,a=this.indent;for(;i0)throw ne.thrown("continuations not supported");this.segments.push(` `);break;case 1:let c=e.pos,d=e.name,u=e.body,p=e.appendTo;n&&this.tab(),this.segments.push("function "),this.segments.push(d),p!=null&&(this.segments.push(" "),this.segments.push(p)),this.segments.push(`{ `),this.inc();let m=0;for(;m=200&&v<400?x.success(x.responseBytes):x.onError("Http Error #"+v)})},"httpResponse");this.req=i?XC.request(g,_):ZC.request(g,_),e&&(this.postData!=null?this.req.write(this.postData):this.postBytes!=null&&(this.req.setHeader("Content-Length",""+this.postBytes.length),this.req.write(ks.from(this.postBytes.b.bufferValue)))),this.req.end()}static get __name__(){return"haxe.http.HttpNodeJs"}static get __super__(){return er}get __class__(){return QC}},"HttpNodeJs");uh.prototype.responseHeaders=null;uh.prototype.req=null;var MVe=j.$global,tr=j.global("$hxClasses")["haxe.ds.List"]=s(class $C extends j.inherits(){[j.new](){this.length=0}add(e){let n=new dh(e,null);this.h==null?this.h=n:this.q.next=n,this.q=n,this.length++}push(e){let n=new dh(e,this.h);this.h=n,this.q==null&&(this.q=n),this.length++}first(){return this.h==null?null:this.h.item}pop(){if(this.h==null)return null;let e=this.h.item;return this.h=this.h.next,this.h==null&&(this.q=null),this.length--,e}isEmpty(){return this.h==null}toString(){let e="",n=!0,i=this.h;for(e+="{";i!=null;)n?n=!1:e+=", ",e+=Ge.string(Ge.string(i.item)),i=i.next;return e+="}",e}static get __name__(){return"haxe.ds.List"}get __class__(){return $C}},"List");tr.prototype.h=null;tr.prototype.q=null;tr.prototype.length=null;var dh=j.global("$hxClasses")["haxe.ds._List.ListNode"]=s(class eS extends j.inherits(){[j.new](e,n){this.item=e,this.next=n}static get __name__(){return"haxe.ds._List.ListNode"}get __class__(){return eS}},"ListNode");dh.prototype.item=null;dh.prototype.next=null;var KVe=j.$global,tS=j.global("$hxClasses")["haxe._Unserializer.DefaultResolver"]=s(class nS extends j.inherits(){[j.new](){}resolveClass(e){return j.global("$hxClasses")[e]}resolveEnum(e){return j.global("$hxEnums")[e]}static get __name__(){return"haxe._Unserializer.DefaultResolver"}get __class__(){return nS}},"DefaultResolver"),nr=j.global("$hxClasses")["haxe.Unserializer"]=s(class Ao extends j.inherits(){[j.new](e){this.buf=e,this.length=this.buf.length,this.pos=0,this.scache=new Array,this.cache=new Array;let n=Ao.DEFAULT_RESOLVER;n==null&&(n=new tS,Ao.DEFAULT_RESOLVER=n),this.resolver=n}readDigits(){let e=0,n=!1,i=this.pos;for(;;){let a=this.buf.charCodeAt(this.pos);if(a!=a)break;if(a==45){if(this.pos!=i)break;n=!0,this.pos++;continue}if(a<48||a>57)break;e=e*10+(a-48),this.pos++}return n&&(e*=-1),e}readFloat(){let e=this.pos;for(;;){let n=this.buf.charCodeAt(this.pos);if(n!=n)break;if(n>=43&&n<58||n==101||n==69)this.pos++;else break}return parseFloat(at.substr(this.buf,e,this.pos-e))}unserializeObject(e){for(;;){if(this.pos>=this.length)throw ne.thrown("Invalid object");if(this.buf.charCodeAt(this.pos)==103)break;let n=this.unserialize();if(typeof n!="string")throw ne.thrown("Invalid object key");let i=this.unserialize();e[n]=i}this.pos++}unserializeEnum(e,n){if(this.buf.charCodeAt(this.pos++)!=58)throw ne.thrown("Invalid enum format");let i=this.readDigits();if(i==0)return Li.createEnum(e,n);let a=new Array;for(;i-- >0;)a.push(this.unserialize());return Li.createEnum(e,n,a)}unserialize(){switch(this.buf.charCodeAt(this.pos++)){case 65:let e=this.unserialize(),n=this.resolver.resolveClass(e);if(n==null)throw ne.thrown("Class not found "+e);return n;case 66:let i=this.unserialize(),a=this.resolver.resolveEnum(i);if(a==null)throw ne.thrown("Enum not found "+i);return a;case 67:let r=this.unserialize(),o=this.resolver.resolveClass(r);if(o==null)throw ne.thrown("Class not found "+r);let l=Object.create(o.prototype);if(this.cache.push(l),l.hxUnserialize(this),this.buf.charCodeAt(this.pos++)!=103)throw ne.thrown("Invalid custom data");return l;case 77:let c=new Ic;this.cache.push(c);let d=this.buf;for(;this.buf.charCodeAt(this.pos)!=104;){let Le=this.unserialize(),Tt=this.unserialize();c.inst.set(Le,Tt)}return this.pos++,c;break;case 82:let u=this.readDigits();if(u<0||u>=this.scache.length)throw ne.thrown("Invalid string reference");return this.scache[u];case 97:let p=this.buf,m=new Array;for(this.cache.push(m);;){let Le=this.buf.charCodeAt(this.pos);if(Le==104){this.pos++;break}if(Le==117){this.pos++;let Tt=this.readDigits();m[m.length+Tt-1]=null}else m.push(this.unserialize())}return m;case 98:let f=new et;this.cache.push(f);let g=this.buf;for(;this.buf.charCodeAt(this.pos)!=104;){let Le=this.unserialize(),Tt=this.unserialize();f.inst.set(Le,Tt)}return this.pos++,f;break;case 99:let x=this.unserialize(),_=this.resolver.resolveClass(x);if(_==null)throw ne.thrown("Class not found "+x);let h=Object.create(_.prototype);return this.cache.push(h),this.unserializeObject(h),h;break;case 100:return this.readFloat();case 102:return!1;case 105:return this.readDigits();case 106:let v=this.unserialize(),b=this.resolver.resolveEnum(v);if(b==null)throw ne.thrown("Enum not found "+v);this.pos++;let y=this.readDigits(),w=b.__constructs__,S=new Array(w.length),F=0,N=w.length;for(;F=this.cache.length)throw ne.thrown("Invalid reference");return this.cache[Z];case 115:let me=this.readDigits(),X=this.buf;if(this.buf.charCodeAt(this.pos++)!=58||this.length-this.pos>2)*3+(Ie>=2?Ie-1:0),ge=he+(me-Ie),V=new Oi(new ArrayBuffer(le)),H=0;for(;he>4;let tn=Q[X.charCodeAt(he++)];V.b[H++]=Tt<<4|tn>>2;let kn=Q[X.charCodeAt(he++)];V.b[H++]=tn<<6|kn}if(Ie>=2){let Le=Q[X.charCodeAt(he++)],Tt=Q[X.charCodeAt(he++)];if(V.b[H++]=Le<<2|Tt>>4,Ie==3){let tn=Q[X.charCodeAt(he++)];V.b[H++]=Tt<<4|tn>>2}}return this.pos+=me,this.cache.push(V),V;break;case 116:return!0;case 118:let re;return this.buf.charCodeAt(this.pos)>=48&&this.buf.charCodeAt(this.pos)<=57&&this.buf.charCodeAt(this.pos+1)>=48&&this.buf.charCodeAt(this.pos+1)<=57&&this.buf.charCodeAt(this.pos+2)>=48&&this.buf.charCodeAt(this.pos+2)<=57&&this.buf.charCodeAt(this.pos+3)>=48&&this.buf.charCodeAt(this.pos+3)<=57&&this.buf.charCodeAt(this.pos+4)==45?(re=at.strDate(at.substr(this.buf,this.pos,19)),this.pos+=19):re=new Date(this.readFloat()),this.cache.push(re),re;break;case 119:let xe=this.unserialize(),fe=this.resolver.resolveEnum(xe);if(fe==null)throw ne.thrown("Enum not found "+xe);let te=this.unserializeEnum(fe,this.unserialize());return this.cache.push(te),te;break;case 120:throw ne.thrown(this.unserialize());case 121:let Y=this.readDigits();if(this.buf.charCodeAt(this.pos++)!=58||this.length-this.pos({_hx_index:0,__enum__:"haxe._Template.TemplateExpr",v:t,"@kind":"OpVar"}),{_hx_name:"OpVar",__params__:["v"]}),OpExpr:Object.assign(t=>({_hx_index:1,__enum__:"haxe._Template.TemplateExpr",expr:t,"@kind":"OpExpr"}),{_hx_name:"OpExpr",__params__:["expr"]}),OpIf:Object.assign((t,e,n)=>({_hx_index:2,__enum__:"haxe._Template.TemplateExpr",expr:t,eif:e,eelse:n,"@kind":"OpIf"}),{_hx_name:"OpIf",__params__:["expr","eif","eelse"]}),OpStr:Object.assign(t=>({_hx_index:3,__enum__:"haxe._Template.TemplateExpr",str:t,"@kind":"OpStr"}),{_hx_name:"OpStr",__params__:["str"]}),OpBlock:Object.assign(t=>({_hx_index:4,__enum__:"haxe._Template.TemplateExpr",l:t,"@kind":"OpBlock"}),{_hx_name:"OpBlock",__params__:["l"]}),OpForeach:Object.assign((t,e)=>({_hx_index:5,__enum__:"haxe._Template.TemplateExpr",expr:t,loop:e,"@kind":"OpForeach"}),{_hx_name:"OpForeach",__params__:["expr","loop"]}),OpMacro:Object.assign((t,e)=>({_hx_index:6,__enum__:"haxe._Template.TemplateExpr",name:t,params:e,"@kind":"OpMacro"}),{_hx_name:"OpMacro",__params__:["name","params"]})};bi.__constructs__=[bi.OpVar,bi.OpExpr,bi.OpIf,bi.OpStr,bi.OpBlock,bi.OpForeach,bi.OpMacro];bi.__empty_constructs__=[];var qi=j.global("$hxClasses")["haxe.Template"]=s(class ti extends j.inherits(){[j.new](e){let n=this.parseTokens(e);if(this.expr=this.parseBlock(n),!n.isEmpty())throw ne.thrown("Unexpected '"+Ge.string(n.first().s)+"'")}execute(e,n){return this.macros=n??{},this.context=e,this.stack=new tr,this.buf=new ph,this.run(this.expr),this.buf.b}resolve(e){if(e=="__current__")return this.context;if(sn.isObject(this.context)){let i=sn.getProperty(this.context,e);if(i!=null||Object.prototype.hasOwnProperty.call(this.context,e))return i}let n=this.stack.h;for(;n!=null;){let i=n.item;n=n.next;let a=i,r=sn.getProperty(a,e);if(r!=null||Object.prototype.hasOwnProperty.call(a,e))return r}return sn.field(ti.globals,e)}parseTokens(e){let n=new tr;for(;ti.splitter.match(e);){let i=ti.splitter.matchedPos();if(i.pos>0&&n.add({p:at.substr(e,0,i.pos),s:!0,l:null}),at.cca(e,i.pos)==58){n.add({p:at.substr(e,i.pos+2,i.len-4),s:!1,l:null}),e=ti.splitter.matchedRight();continue}let a=i.pos+i.len,r=1,o=[],l="";for(;;){let c=at.cca(e,a);if(++a,c==40)++r;else if(c==41){if(--r,r<=0)break}else if(c==null)throw ne.thrown("Unclosed macro parenthesis");c==44&&r==1?(o.push(l),l=""):l+=String.fromCodePoint(c)}o.push(l),n.add({p:ti.splitter.matched(2),s:!1,l:o}),e=at.substr(e,a,e.length-a)}return e.length>0&&n.add({p:e,s:!0,l:null}),n}parseBlock(e){let n=new tr;for(;;){let i=e.first();if(i==null||!i.s&&(i.p=="end"||i.p=="else"||at.substr(i.p,0,7)=="elseif "))break;n.add(this.parse(e))}return n.length==1?n.first():bi.OpBlock(n)}parse(e){let n=e.pop(),i=n.p;if(n.s)return bi.OpStr(i);if(n.l!=null){let l=new tr,c=0,d=n.l;for(;c0){i=at.substr(i,r,i.length-r);let l=this.parseExpr(i),c=this.parseBlock(e),d=e.first(),u;if(d==null)throw ne.thrown("Unclosed 'if'");if(d.p=="end")e.pop(),u=null;else if(d.p=="else"){if(e.pop(),u=this.parseBlock(e),d=e.pop(),d==null||d.p!="end")throw ne.thrown("Unclosed 'else'")}else d.p=at.substr(d.p,4,d.p.length-4),u=this.parse(e);return bi.OpIf(l,c,u)}let o=a("foreach");if(o>=0){i=at.substr(i,o,i.length-o);let l=this.parseExpr(i),c=this.parseBlock(e),d=e.pop();if(d==null||d.p!="end")throw ne.thrown("Unclosed 'foreach'");return bi.OpForeach(l,c)}return ti.expr_splitter.match(i)?bi.OpExpr(this.parseExpr(i)):bi.OpVar(i)}parseExpr(e){let n=new tr,i=e;for(;ti.expr_splitter.match(e);){let r=ti.expr_splitter.matchedPos(),o=r.pos+r.len;r.pos!=0&&n.add({p:at.substr(e,0,r.pos),s:!0});let l=ti.expr_splitter.matched(0);n.add({p:l,s:l.indexOf('"')>=0}),e=ti.expr_splitter.matchedRight()}if(e.length!=0){let r=0,o=e;for(;r");if(n.s)return this.makeConst(n.p);switch(n.p){case"!":let i=this.makeExpr(e);return function(){let d=i();return d!=null?d==!1:!0};case"(":this.skipSpaces(e);let a=this.makeExpr(e);this.skipSpaces(e);let r=e.pop();if(r==null||r.s)throw ne.thrown(r);if(r.p==")")return a;this.skipSpaces(e);let o=this.makeExpr(e);this.skipSpaces(e);let l=e.pop();if(this.skipSpaces(e),l==null||l.p!=")")throw ne.thrown(l);switch(r.p){case"!=":return function(){return a()!=o()};case"&&":return function(){return a()&&o()};case"*":return function(){return a()*o()};case"+":return function(){return a()+o()};case"-":return function(){return a()-o()};case"/":return function(){return a()/o()};case"<":return function(){return a()":return function(){return a()>o()};case">=":return function(){return a()>=o()};case"||":return function(){return a()||o()};default:throw ne.thrown("Unknown operation "+r.p)}break;case"-":let c=this.makeExpr(e);return function(){return-c()}}throw ne.thrown(n.p)}run(e){switch(e._hx_index){case 0:let n=e.v,i=this.buf,a=Ge.string(this.resolve(n));i.b+=Ge.string(a);break;case 1:let r=e.expr,o=this.buf,l=Ge.string(r());o.b+=Ge.string(l);break;case 2:let c=e.expr,d=e.eif,u=e.eelse,p=c();p==null||p==!1?u!=null&&this.run(u):this.run(d);break;case 3:let m=e.str;this.buf.b+=m==null?"null":""+m;break;case 4:let g=e.l.h;for(;g!=null;){let R=g.item;g=g.next;let D=R;this.run(D)}break;case 5:let x=e.expr,_=e.loop,h=x();try{let R=j.getIterator(h);if(R.hasNext==null)throw ne.thrown(null);h=R}catch{try{if(h.hasNext==null)throw ne.thrown(null)}catch{throw ne.thrown("Cannot iter on "+Ge.string(h))}}this.stack.push(this.context);let b=h;for(;b.hasNext();){let R=b.next();this.context=R,this.run(_)}this.context=this.stack.pop();break;case 6:let y=e.name,w=e.params,S=sn.field(this.macros,y),F=new Array,N=this.buf;F.push(j.bind(this,this.resolve));let k=w.h;for(;k!=null;){let R=k.item;k=k.next;let D=R;if(D._hx_index==0){let B=D.v;F.push(this.resolve(B))}else this.buf=new ph,this.run(D),F.push(this.buf.b)}this.buf=N;try{let R=this.buf,D=Ge.string(S.apply(this.macros,F));R.b+=Ge.string(D)}catch(R){let D=ne.caught(R).unwrap(),B;try{B=F.join(",")}catch{B="???"}let q="Macro call "+y+"("+B+") failed ("+Ge.string(D)+")";throw ne.thrown(q)}break}}static get __name__(){return"haxe.Template"}get __class__(){return ti}},"Template");qi.prototype.expr=null;qi.prototype.context=null;qi.prototype.macros=null;qi.prototype.stack=null;qi.prototype.buf=null;qi.splitter=new Lr('(::[A-Za-z0-9_ ()&|!+=/><*."-]+::|\\$\\$([A-Za-z0-9_-]+)\\()',"");qi.expr_splitter=new Lr(`(\\(|\\)|[ \r ]*"[^"]*"[ \r ]*|[!+=/><*.&|-]+)`,"");qi.expr_trim=new Lr("^[ ]*([^ ]+)[ ]*$","");qi.expr_int=new Lr("^[0-9]+$","");qi.expr_float=new Lr("^([+-]?)(?=\\d|,\\d)\\d*(,\\d*)?([Ee]([+-]?\\d+))?$","");qi.globals={};qi.hxKeepArrayIterator=new as([]);var en=wi(Ee("fs"));var Ize=j.$global,Qv=j.global("$hxClasses")["mcb.AppMain"]=s(class zr{static loadDebugProject(e,n){let i=new nr(en.readFileSync(e,{encoding:"utf8"}));for(;;){let a=i.unserialize();if(a==null)break;let r=Ze.join([n,a.f]);xn.createDirectory(Ze.directory(r)),en.writeFileSync(r,a.s),en.writeFileSync(r+".tokens",Ge.string(a.t)),en.writeFileSync(r+".ast",Ge.string(a.a))}}static discoverConfigFile(e){return xn.exists(e+".cjs")?e+".cjs":xn.exists(e+".js")?e+".js":xn.exists(e+".json")?e+".json":e}static getFilesInDirectory(e){let n=en.readdirSync(e),i=[],a=0;for(;a{let m=PathModule.join(e,u);a.set(m,{content:p,includeInAJMeta:!0})},d}s(o,"createSyncIO"),r.io=o(),console.time("MC-Build compiled in");let l=Object.entries(t).filter(([d])=>d.endsWith(".mcbt")),c=Object.entries(t).filter(([d])=>d.endsWith(".mcb"));for(let[d,u]of l)try{r.addFile(d,Xt.parseMcbtFile(Zn.tokenize(u,d)))}catch(p){throw p instanceof Error&&(p.message=`Failed to compile "${d}": ${p.message}`),p}for(let[d,u]of c)try{r.addFile(d,Xt.parseMcbFile(Zn.tokenize(u,d)))}catch(p){throw p instanceof Error&&(p.message=`Failed to compile "${d}": ${p.message}`),p}return r.compile(Gt.fromObject(n)),console.timeEnd("MC-Build compiled in"),console.log("Exported files:",a.keys()),console.groupEnd(),a}s(aS,"compileMcbProject");var _e;(Se=>(Se.NEW=s(()=>"aj.new","NEW"),Se.GLOBAL_ENTITY=s(()=>"aj.global.entity","GLOBAL_ENTITY"),Se.GLOBAL_ROOT=s(()=>"aj.global.root","GLOBAL_ROOT"),Se.GLOBAL_ROOT_CHILD=s(()=>"aj.global.root.child","GLOBAL_ROOT_CHILD"),Se.GLOBAL_ROOT_CHILD_BONE=s(()=>"aj.global.root.child.bone","GLOBAL_ROOT_CHILD_BONE"),Se.GLOBAL_ROOT_CHILD_ITEM_DISPLAY=s(()=>"aj.global.root.child.item_display","GLOBAL_ROOT_CHILD_ITEM_DISPLAY"),Se.GLOBAL_ROOT_CHILD_BLOCK_DISPLAY=s(()=>"aj.global.root.child.block_display","GLOBAL_ROOT_CHILD_BLOCK_DISPLAY"),Se.GLOBAL_ROOT_CHILD_TEXT_DISPLAY=s(()=>"aj.global.root.child.text_display","GLOBAL_ROOT_CHILD_TEXT_DISPLAY"),Se.GLOBAL_ROOT_CHILD_LOCATOR=s(()=>"aj.global.root.child.locator","GLOBAL_ROOT_CHILD_LOCATOR"),Se.GLOBAL_ROOT_CHILD_CAMERA=s(()=>"aj.global.root.child.camera","GLOBAL_ROOT_CHILD_CAMERA"),Se.GLOBAL_ROOT_CHILD_DATA=s(()=>"aj.global.root.child.data","GLOBAL_ROOT_CHILD_DATA"),Se.GLOBAL_NODE=s(()=>"aj.global.node","GLOBAL_NODE"),Se.GLOBAL_DISPLAY_NODE=s(()=>"aj.global.display_node","GLOBAL_DISPLAY_NODE"),Se.GLOBAL_VANILLA_DISPLAY_NODE=s(()=>"aj.global.vanilla_display_node","GLOBAL_VANILLA_DISPLAY_NODE"),Se.GLOBAL_BONE=s(()=>"aj.global.bone","GLOBAL_BONE"),Se.GLOBAL_ITEM_DISPLAY=s(()=>"aj.global.item_display","GLOBAL_ITEM_DISPLAY"),Se.GLOBAL_BLOCK_DISPLAY=s(()=>"aj.global.block_display","GLOBAL_BLOCK_DISPLAY"),Se.GLOBAL_TEXT_DISPLAY=s(()=>"aj.global.text_display","GLOBAL_TEXT_DISPLAY"),Se.GLOBAL_CAMERA=s(()=>"aj.global.camera","GLOBAL_CAMERA"),Se.GLOBAL_LOCATOR=s(()=>"aj.global.locator","GLOBAL_LOCATOR"),Se.GLOBAL_DATA=s(()=>"aj.global.data","GLOBAL_DATA"),Se.GLOBAL_NODE_NAMED=s(ue=>`aj.global.node.${ue}`,"GLOBAL_NODE_NAMED"),Se.GLOBAL_DISPLAY_NODE_NAMED=s(ue=>`aj.global.display_node.${ue}`,"GLOBAL_DISPLAY_NODE_NAMED"),Se.GLOBAL_BONE_CHILD=s(ue=>`aj.global.bone.${ue}.child`,"GLOBAL_BONE_CHILD"),Se.GLOBAL_BONE_CHILD_BONE=s(ue=>`aj.global.bone.${ue}.child.bone`,"GLOBAL_BONE_CHILD_BONE"),Se.GLOBAL_BONE_CHILD_ITEM_DISPLAY=s(ue=>`aj.global.bone.${ue}.child.item_display`,"GLOBAL_BONE_CHILD_ITEM_DISPLAY"),Se.GLOBAL_BONE_CHILD_BLOCK_DISPLAY=s(ue=>`aj.global.bone.${ue}.child.block_display`,"GLOBAL_BONE_CHILD_BLOCK_DISPLAY"),Se.GLOBAL_BONE_CHILD_TEXT_DISPLAY=s(ue=>`aj.global.bone.${ue}.child.text_display`,"GLOBAL_BONE_CHILD_TEXT_DISPLAY"),Se.GLOBAL_BONE_CHILD_LOCATOR=s(ue=>`aj.global.bone.${ue}.child.locator`,"GLOBAL_BONE_CHILD_LOCATOR"),Se.GLOBAL_BONE_CHILD_CAMERA=s(ue=>`aj.global.bone.${ue}.child.camera`,"GLOBAL_BONE_CHILD_CAMERA"),Se.GLOBAL_BONE_DECENDANT=s(ue=>`aj.global.bone.${ue}.decendant`,"GLOBAL_BONE_DECENDANT"),Se.GLOBAL_BONE_DECENDANT_BONE=s(ue=>`aj.global.bone.${ue}.decendant.bone`,"GLOBAL_BONE_DECENDANT_BONE"),Se.GLOBAL_BONE_DECENDANT_ITEM_DISPLAY=s(ue=>`aj.global.bone.${ue}.decendant.item_display`,"GLOBAL_BONE_DECENDANT_ITEM_DISPLAY"),Se.GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY=s(ue=>`aj.global.bone.${ue}.decendant.block_display`,"GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY"),Se.GLOBAL_BONE_DECENDANT_TEXT_DISPLAY=s(ue=>`aj.global.bone.${ue}.decendant.text_display`,"GLOBAL_BONE_DECENDANT_TEXT_DISPLAY"),Se.GLOBAL_BONE_DECENDANT_LOCATOR=s(ue=>`aj.global.bone.${ue}.decendant.locator`,"GLOBAL_BONE_DECENDANT_LOCATOR"),Se.GLOBAL_BONE_DECENDANT_CAMERA=s(ue=>`aj.global.bone.${ue}.decendant.camera`,"GLOBAL_BONE_DECENDANT_CAMERA"),Se.GLOBAL_BONE_TREE=s(ue=>`aj.global.bone.${ue}.tree`,"GLOBAL_BONE_TREE"),Se.GLOBAL_BONE_TREE_BONE=s(ue=>`aj.global.bone.${ue}.tree.bone`,"GLOBAL_BONE_TREE_BONE"),Se.PROJECT_ENTITY=s(ue=>`aj.${ue}.entity`,"PROJECT_ENTITY"),Se.PROJECT_ROOT=s(ue=>`aj.${ue}.root`,"PROJECT_ROOT"),Se.PROJECT_ROOT_CHILD=s(ue=>`aj.${ue}.root.child`,"PROJECT_ROOT_CHILD"),Se.PROJECT_ROOT_CHILD_BONE=s(ue=>`aj.${ue}.root.child.bone`,"PROJECT_ROOT_CHILD_BONE"),Se.PROJECT_ROOT_CHILD_ITEM_DISPLAY=s(ue=>`aj.${ue}.root.child.item_display`,"PROJECT_ROOT_CHILD_ITEM_DISPLAY"),Se.PROJECT_ROOT_CHILD_BLOCK_DISPLAY=s(ue=>`aj.${ue}.root.child.block_display`,"PROJECT_ROOT_CHILD_BLOCK_DISPLAY"),Se.PROJECT_ROOT_CHILD_TEXT_DISPLAY=s(ue=>`aj.${ue}.root.child.text_display`,"PROJECT_ROOT_CHILD_TEXT_DISPLAY"),Se.PROJECT_ROOT_CHILD_LOCATOR=s(ue=>`aj.${ue}.root.child.locator`,"PROJECT_ROOT_CHILD_LOCATOR"),Se.PROJECT_ROOT_CHILD_CAMERA=s(ue=>`aj.${ue}.root.child.camera`,"PROJECT_ROOT_CHILD_CAMERA"),Se.PROJECT_ROOT_CHILD_DATA=s(ue=>`aj.${ue}.root.child.data`,"PROJECT_ROOT_CHILD_DATA"),Se.PROJECT_NODE=s(ue=>`aj.${ue}.node`,"PROJECT_NODE"),Se.PROJECT_DISPLAY_NODE=s(ue=>`aj.${ue}.display_node`,"PROJECT_DISPLAY_NODE"),Se.PROJECT_VANILLA_DISPLAY_NODE=s(ue=>`aj.${ue}.vanilla_display_node`,"PROJECT_VANILLA_DISPLAY_NODE"),Se.PROJECT_BONE=s(ue=>`aj.${ue}.bone`,"PROJECT_BONE"),Se.PROJECT_ITEM_DISPLAY=s(ue=>`aj.${ue}.item_display`,"PROJECT_ITEM_DISPLAY"),Se.PROJECT_BLOCK_DISPLAY=s(ue=>`aj.${ue}.block_display`,"PROJECT_BLOCK_DISPLAY"),Se.PROJECT_TEXT_DISPLAY=s(ue=>`aj.${ue}.text_display`,"PROJECT_TEXT_DISPLAY"),Se.PROJECT_CAMERA=s(ue=>`aj.${ue}.camera`,"PROJECT_CAMERA"),Se.PROJECT_LOCATOR=s(ue=>`aj.${ue}.locator`,"PROJECT_LOCATOR"),Se.PROJECT_DATA=s(ue=>`aj.${ue}.data`,"PROJECT_DATA"),Se.PROJECT_NODE_NAMED=s((ue,tt)=>`aj.${ue}.node.${tt}`,"PROJECT_NODE_NAMED"),Se.PROJECT_BONE_NAMED=s((ue,tt)=>`aj.${ue}.bone.${tt}`,"PROJECT_BONE_NAMED"),Se.PROJECT_DISPLAY_NODE_NAMED=s((ue,tt)=>`aj.${ue}.display_node.${tt}`,"PROJECT_DISPLAY_NODE_NAMED"),Se.PROJECT_ITEM_DISPLAY_NAMED=s((ue,tt)=>`aj.${ue}.item_display.${tt}`,"PROJECT_ITEM_DISPLAY_NAMED"),Se.PROJECT_BLOCK_DISPLAY_NAMED=s((ue,tt)=>`aj.${ue}.block_display.${tt}`,"PROJECT_BLOCK_DISPLAY_NAMED"),Se.PROJECT_TEXT_DISPLAY_NAMED=s((ue,tt)=>`aj.${ue}.text_display.${tt}`,"PROJECT_TEXT_DISPLAY_NAMED"),Se.PROJECT_CAMERA_NAMED=s((ue,tt)=>`aj.${ue}.camera.${tt}`,"PROJECT_CAMERA_NAMED"),Se.PROJECT_LOCATOR_NAMED=s((ue,tt)=>`aj.${ue}.locator.${tt}`,"PROJECT_LOCATOR_NAMED"),Se.PROJECT_BONE_CHILD=s((ue,tt)=>`aj.${ue}.bone.${tt}.child`,"PROJECT_BONE_CHILD"),Se.PROJECT_BONE_CHILD_BONE=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.bone`,"PROJECT_BONE_CHILD_BONE"),Se.PROJECT_BONE_CHILD_ITEM_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.item_display`,"PROJECT_BONE_CHILD_ITEM_DISPLAY"),Se.PROJECT_BONE_CHILD_BLOCK_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.block_display`,"PROJECT_BONE_CHILD_BLOCK_DISPLAY"),Se.PROJECT_BONE_CHILD_TEXT_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.text_display`,"PROJECT_BONE_CHILD_TEXT_DISPLAY"),Se.PROJECT_BONE_CHILD_LOCATOR=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.locator`,"PROJECT_BONE_CHILD_LOCATOR"),Se.PROJECT_BONE_CHILD_CAMERA=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.camera`,"PROJECT_BONE_CHILD_CAMERA"),Se.PROJECT_BONE_DECENDANT=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant`,"PROJECT_BONE_DECENDANT"),Se.PROJECT_BONE_DECENDANT_BONE=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.bone`,"PROJECT_BONE_DECENDANT_BONE"),Se.PROJECT_BONE_DECENDANT_ITEM_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.item_display`,"PROJECT_BONE_DECENDANT_ITEM_DISPLAY"),Se.PROJECT_BONE_DECENDANT_BLOCK_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.block_display`,"PROJECT_BONE_DECENDANT_BLOCK_DISPLAY"),Se.PROJECT_BONE_DECENDANT_TEXT_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.text_display`,"PROJECT_BONE_DECENDANT_TEXT_DISPLAY"),Se.PROJECT_BONE_DECENDANT_LOCATOR=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.locator`,"PROJECT_BONE_DECENDANT_LOCATOR"),Se.PROJECT_BONE_DECENDANT_CAMERA=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.camera`,"PROJECT_BONE_DECENDANT_CAMERA"),Se.PROJECT_BONE_TREE=s((ue,tt)=>`aj.${ue}.bone.${tt}.tree`,"PROJECT_BONE_TREE"),Se.PROJECT_BONE_TREE_BONE=s((ue,tt)=>`aj.${ue}.bone.${tt}.tree.bone`,"PROJECT_BONE_TREE_BONE"),Se.ANIMATION_PLAYING=s((ue,tt)=>`aj.${ue}.animation.${tt}.playing`,"ANIMATION_PLAYING"),Se.TWEENING=s((ue,tt)=>`aj.${ue}.animation.${tt}.tween_playing`,"TWEENING"),Se.VARIANT_APPLIED=s((ue,tt)=>`aj.${ue}.variant.${tt}.applied`,"VARIANT_APPLIED"),Se.TRANSFORMS_ONLY=s(()=>"aj.transforms_only","TRANSFORMS_ONLY"),Se.OUTDATED_RIG_TEXT_DISPLAY=s(()=>"aj.outdated_rig_text_display","OUTDATED_RIG_TEXT_DISPLAY")))(_e||={});var $v=s(()=>new jt([{text:` `,color:"gray"},{text:Ca("Animated Java"),color:"#00aced"},{text:` (animated_java:${Project.animated_java.export_namespace})`,color:"dark_gray",italic:!0},` \u2192 `]).flatten(),"TELLRAW_PREFIX"),eb=s(()=>` `,"TELLRAW_SUFFIX"),Hi=s((t,e)=>new jt([{text:"",color:"red"},$v(),Ca("error")+": ",{text:t,underlined:!0},` `,...Array.isArray(e)?e:[e],eb()]),"TELLRAW_ERROR"),Ube=s((t,e)=>new jt([{text:"",color:"yellow"},$v(),Ca("warning")+": ",{text:t,underlined:!0},` `,...Array.isArray(e)?e:[e],eb()]),"TELLRAW_WARNING"),qbe=s(t=>new jt([` `,compareVersions("1.21.5",Project.animated_java.target_minecraft_version)?{text:"\u25B6 Learn More \u25C0",color:"blue",underlined:!0,italic:!0,clickEvent:{action:"open_url",value:t}}:{text:"\u25B6 Learn More \u25C0",color:"blue",underlined:!0,italic:!0,click_event:{action:"open_url",url:t}}]).flatten(),"CREATE_TELLRAW_HELP_LINK"),rS;(h=>(h.RIG_OUTDATED=s(()=>Hi("Outdated Rig Instance",["The instance of ",{text:"$(export_namespace)",color:"yellow"}," at ",{text:"$(x), $(y), $(z)",color:"yellow"}," was summoned using an older export of its Blueprint."," It should be removed and re-summoned to ensure it functions correctly.",{text:` \u2261 `,color:"white"},compareVersions("1.21.5",Project.animated_java.target_minecraft_version)?{text:Ca("Teleport to Instance"),clickEvent:{action:"suggest_command",value:"/tp @s $(uuid)"},color:"aqua",underlined:!0}:{text:Ca("Teleport to Instance"),click_event:{action:"suggest_command",command:"/tp @s $(uuid)"},color:"aqua",underlined:!0},{text:` \u2261 `,color:"white"},compareVersions("1.21.5",Project.animated_java.target_minecraft_version)?{text:Ca("Remove Instance"),clickEvent:{action:"suggest_command",value:"/execute as $(uuid) run function animated_java:$(export_namespace)/remove/this"},color:"aqua",underlined:!0}:{text:Ca("Remove Instance"),click_event:{action:"suggest_command",command:"/execute as $(uuid) run function animated_java:$(export_namespace)/remove/this"},color:"aqua",underlined:!0}]),"RIG_OUTDATED"),h.RIG_OUTDATED_TEXT_DISPLAY=s(()=>new jt([{text:"\u26A0 This rig instance is outdated! \u26A0",color:"red"},` It should be removed and re-summoned to ensure it functions correctly.`]).toString().replaceAll("\\n","\\\\n"),"RIG_OUTDATED_TEXT_DISPLAY"),h.FUNCTION_NOT_EXECUTED_AS_ROOT_ERROR=s((v,b)=>{let y=new jt([{text:v,color:"yellow"},""]).flatten(),w=`/execute as @e[tag=${b}] run function ${v}`;return Hi("Function Not Executed as Root Entity",[compareVersions("1.21.5",Project.animated_java.target_minecraft_version)?{text:"[This Function]",color:"yellow",hoverEvent:{action:"show_text",contents:y}}:{text:"[This Function]",color:"yellow",hover_event:{action:"show_text",value:y}}," must be executed as the rig's root entity.",{text:` \u2261 `,color:"white",extra:[compareVersions("1.21.5",Project.animated_java.target_minecraft_version)?{text:Ca("Show Example Command"),color:"aqua",underlined:!0,clickEvent:{action:"suggest_command",value:w}}:{text:Ca("Show Example Command"),color:"aqua",underlined:!0,click_event:{action:"suggest_command",command:w}}]},qbe("https://animated-java.dev/docs/rigs/controlling-a-rig-instance")])},"FUNCTION_NOT_EXECUTED_AS_ROOT_ERROR"),h.INVALID_VARIANT=s(v=>Hi("Invalid Variant",["The variant ",{nbt:"args.variant",storage:"animated_java:temp",color:"yellow"}," does not exist.",` `,{text:" \u2261 ",color:"white"},{text:"Available Variants:",color:"green"},...Object.values(v).map(b=>new jt([{text:` `,color:"gray"},"\\s\\s\\s"," \u25CF ",{text:b.name,color:"yellow"}]).flatten())]),"INVALID_VARIANT"),h.FRAME_CANNOT_BE_NEGATIVE=s(()=>Hi("Frame cannot be negative",[{text:"frame",color:"yellow"},{text:" must be a non-negative integer."}]),"FRAME_CANNOT_BE_NEGATIVE"),h.INVALID_ANIMATION=s(v=>Hi("Invalid Animation",["The animation ",{nbt:"args.animation",storage:"animated_java:temp",color:"yellow"}," does not exist.",` `,{text:" \u2261 ",color:"white"},{text:"Available Animations:",color:"green"},...v.map(b=>new jt([{text:` `,color:"gray"},"\\s\\s\\s"," \u25CF ",{text:b.storage_name,color:"yellow"}]).flatten())]),"INVALID_ANIMATION"),h.NO_VARIANTS=s(()=>Hi("No Variants",["This Blueprint has no variants to switch between."]),"NO_VARIANTS"),h.INVALID_VERSION=s(()=>Hi("Invalid Minecraft Version",["Attempted to load an Animated Java Data Pack that was exported for ",{text:`Minecraft ${Project.animated_java.target_minecraft_version}`,color:"aqua"}," in the wrong version!",` Please ensure that the data pack is loaded in the correct version, or that your Blueprint settings are configured to target the correct version(s) of Minecraft.`]),"INVALID_VERSION"),h.UNINSTALL=s(()=>new jt([$v(),[{text:"Successfully uninstalled ",color:"green"},{text:Project.animated_java.export_namespace,color:"yellow"},{text:"!"},{text:` If you have exported multiple times, you may have to remove objectives from previous exports manually, as Animated Java only knows about the objectives from the most recent export.`,color:"gray",italic:!0}],eb()]),"UNINSTALL"),h.ARGUMENT_CANNOT_BE_EMPTY=s(v=>Hi("Argument Cannot Be Empty",["Argument ",{text:v,color:"yellow"},{text:" cannot be an empty string."}]),"ARGUMENT_CANNOT_BE_EMPTY"),h.LOCATOR_NOT_FOUND=s(()=>Hi("Locator Not Found",["Locator ",{nbt:"args.name",storage:"animated_java:temp",color:"aqua"}," not found!",` Please ensure that the name is spelled correctly.`]),"LOCATOR_NOT_FOUND"),h.LOCATOR_ENTITY_NOT_FOUND=s(()=>Hi("Locator Not Found",["Locator ",{nbt:"args.name",storage:"animated_java:temp",color:"aqua"}," does not exist!",{text:` Please ensure that the name is spelled correctly, and `},{text:'"Use Entity"',color:"yellow"}," is enabled in the locator's config."]),"LOCATOR_ENTITY_NOT_FOUND"),h.LOCATOR_COMMAND_FAILED_TO_EXECUTE=s(()=>Hi("Failed to Execute Command as Locator",["Failed to execute command ",{nbt:"args.command",storage:"animated_java:temp",color:"yellow"}," as Locator ",{nbt:"args.name",storage:"animated_java:temp",color:"aqua"},".",` Please ensure the command is valid.`]),"LOCATOR_COMMAND_FAILED_TO_EXECUTE"),h.CAMERA_ENTITY_NOT_FOUND=s(()=>Hi("Camera Not Found",["Camera ",{nbt:"args.name",storage:"animated_java:temp",color:"aqua"}," does not exist!",` Please ensure that its name is spelled correctly.`]),"CAMERA_ENTITY_NOT_FOUND"),h.CAMERA_COMMAND_FAILED_TO_EXECUTE=s(()=>Hi("Failed to Execute Command as Camera",["Failed to execute command ",{nbt:"args.command",storage:"animated_java:temp",color:"yellow"}," as Camera ",{nbt:"args.name",storage:"animated_java:temp",color:"aqua"},".",` Please ensure the command is valid.`]),"CAMERA_COMMAND_FAILED_TO_EXECUTE"),h.AUTO_UPDATE_RIG_ORIENTATION_MOVE_WARNING=s(()=>Hi("Called Move Function while Auto Update Rig Orientation is Enabled",["The ",{text:"move",color:"yellow"}," function cannot be called while ",{text:"Auto Update Rig Orientation",color:"yellow"}," is enabled.",` Please either disable `,{text:"Auto Update Rig Orientation",color:"yellow"}," or avoid calling the ",{text:"move",color:"yellow"}," function."]),"AUTO_UPDATE_RIG_ORIENTATION_MOVE_WARNING"),h.DEPRECATED_FUNCTION_WARNING=s((v,b)=>Ube("Deprecated Function",["The function ",{text:v,color:"aqua"},` is deprecated. Please use `,{text:b,color:"aqua"}," instead."]),"DEPRECATED_FUNCTION_WARNING")))(rS||={});var mh=rS;var tb=["bone","text_display","item_display","block_display"],oS;(r=>(r.I=s(()=>"aj.i","I"),r.ID=s(()=>"aj.id","ID"),r.FRAME=s(o=>`aj.${o}.frame`,"FRAME"),r.IS_RIG_LOADED=s(()=>"aj.is_rig_loaded","IS_RIG_LOADED"),r.TWEEN_DURATION=s(()=>"aj.tween_duration","TWEEN_DURATION")))(oS||={});function sS(t,e){let n=[],i=[];function a(o){o.parent==="root"||o.parent&&(i.push({name:e.nodes[o.parent].storage_name,type:e.nodes[o.parent].type}),a(e.nodes[o.parent]))}s(a,"recurseParents"),a(t);let r=t.parent&&t.parent!=="root";switch(n.push(_e.NEW(),_e.GLOBAL_ENTITY(),_e.GLOBAL_NODE(),_e.GLOBAL_NODE_NAMED(t.storage_name),_e.PROJECT_ENTITY(Project.animated_java.export_namespace),_e.PROJECT_NODE(Project.animated_java.export_namespace),_e.PROJECT_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name)),r||n.push(_e.GLOBAL_ROOT_CHILD()),t.type){case"bone":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_BONE(),_e.GLOBAL_BONE_TREE(t.storage_name),_e.GLOBAL_BONE_TREE_BONE(t.storage_name),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BONE(Project.animated_java.export_namespace),_e.PROJECT_BONE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BONE_TREE_BONE(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_BONE(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_BONE(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_BONE());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_BONE(o),_e.GLOBAL_BONE_TREE(o),_e.GLOBAL_BONE_TREE_BONE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_BONE(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE_BONE(Project.animated_java.export_namespace,o));break}case"item_display":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_ITEM_DISPLAY(),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_ITEM_DISPLAY(Project.animated_java.export_namespace),_e.PROJECT_ITEM_DISPLAY_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_ITEM_DISPLAY(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_ITEM_DISPLAY(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_ITEM_DISPLAY());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_ITEM_DISPLAY(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_ITEM_DISPLAY(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case"block_display":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_BLOCK_DISPLAY(),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BLOCK_DISPLAY(Project.animated_java.export_namespace),_e.PROJECT_BLOCK_DISPLAY_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_BLOCK_DISPLAY(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_BLOCK_DISPLAY(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_BLOCK_DISPLAY());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_BLOCK_DISPLAY(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case"text_display":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_TEXT_DISPLAY(),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_TEXT_DISPLAY(Project.animated_java.export_namespace),_e.PROJECT_TEXT_DISPLAY_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_TEXT_DISPLAY(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_TEXT_DISPLAY(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_TEXT_DISPLAY());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_TEXT_DISPLAY(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_TEXT_DISPLAY(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case"locator":{n.push(_e.GLOBAL_LOCATOR(),_e.PROJECT_LOCATOR(Project.animated_java.export_namespace),_e.PROJECT_LOCATOR_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_LOCATOR(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_LOCATOR(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_LOCATOR());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_LOCATOR(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_LOCATOR(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case"camera":{n.push(_e.GLOBAL_CAMERA(),_e.PROJECT_CAMERA(Project.animated_java.export_namespace),_e.PROJECT_CAMERA_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_CAMERA(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_CAMERA(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_CAMERA());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_CAMERA(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_CAMERA(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}default:throw new fi(`Attempted to get tags for an unknown node type: '${t.type}'!`)}return new Tn(n.sort().map(o=>new xt(o)))}s(sS,"getNodeTags");async function Hbe(t,e,n){let i=Project.animated_java,a=new Tn,r=new ot;if(!compareVersions("1.21.5",t))r.set("id",new xt("minecraft:item_display"));else if(!compareVersions("1.20.4",t))r.set("id",new xt("minecraft:marker"));else throw new Error("Minecraft version is below minimum supported version 1.20.4!");a.add(r.set("Tags",new Tn([new xt(_e.NEW()),new xt(_e.GLOBAL_ENTITY()),new xt(_e.GLOBAL_DATA()),new xt(_e.PROJECT_ENTITY(i.export_namespace)),new xt(_e.PROJECT_DATA(i.export_namespace))])).set("data",new ot().set("rig_hash",new xt(n)).set("export_namespace",new xt(i.export_namespace))));for(let[l,c]of Object.entries(e.nodes)){if(c.type==="struct")continue;let d=new ot,u=sS(c,e);switch(d.set("Tags",u),tb.includes(c.type)&&d.set("height",new fn(i.render_box[1])).set("width",new fn(i.render_box[0])).set("teleport_duration",new an(0)).set("interpolation_duration",new an(i.interpolation_duration)).set("transformation",new ot().set("translation",To([0,0,0])).set("left_rotation",To([0,0,0,1])).set("right_rotation",To([0,0,0,1])).set("scale",To([0,0,0]))),c.type){case"bone":{let p=new ot().set("id",new xt(i.display_item));d.set("id",new xt("minecraft:item_display")).set("item",p).set("item_display",new xt("head"));let m=e.variants[qe.getDefault().uuid].models[l];if(!m)throw new Error(`Model for bone '${c.storage_name}' not found!`);compareVersions("1.21.4",t)?compareVersions("1.21.2",t)?compareVersions("1.20.5",t)?compareVersions("1.20.4",t)||(p.set("tag",new ot().set("CustomModelData",new an(m.custom_model_data))),p.set("Count",new an(1))):p.set("components",new ot().set("minecraft:custom_model_data",new an(m.custom_model_data))):p.set("components",new ot().set("minecraft:item_model",new xt(m.item_model))):p.set("components",new ot().set("minecraft:item_model",new xt(m.item_model)).set("minecraft:custom_model_data",new ot().set("strings",new Tn([new xt("default")])))),c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}case"text_display":{if(d.set("id",new xt("minecraft:text_display")).set("background",new an(jt.hexToInt(c.background_color))).set("line_width",new an(c.line_width)).set("shadow",new di(c.shadow?1:0)).set("see_through",new di(c.see_through?1:0)).set("alignment",new xt(c.align)),!compareVersions("1.21.5",t))d.set("text",new xt("$$$"+c.type+"_"+c.storage_name+"_text_placeholder$$$"));else if(!compareVersions("1.20.4",t))d.set("text",new xt(new Yn({minecraftVersion:t}).parse(c.text).toString(!0,t)));else throw new Error(`Unsupported Minecraft version '${t}' for text display!`);c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}case"item_display":{let p=new ot().set("id",new xt(c.item));if(d.set("id",new xt("minecraft:item_display")).set("item",p).set("item_display",new xt(c.item_display)),!compareVersions(t,"1.20.4")){p.set("Count",new an(1));break}c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}case"block_display":{let p=new ot,m=await wd(c.block);if(!m)throw new Error(`Invalid Blockstate '${c.block}' in node '${c.storage_name}'!`);for(let[f,g]of Object.entries(m.states))p.set(f,new xt(g.toString()));d.set("id",new xt("minecraft:block_display")).set("block_state",new ot().set("Name",new xt(m.resource.name)).set("Properties",p)),c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}default:continue}a.add(d)}let o=a.toString();if(!compareVersions("1.21.5",t))for(let l of Object.values(e.nodes).filter(c=>c.type==="text_display"))o=o.replace('"$$$'+l.type+"_"+l.storage_name+'_text_placeholder$$$"',new Yn({minecraftVersion:t}).parse(l.text).toString(!0,t));return o}s(Hbe,"generateRootEntityPassengers");async function Jbe(t,e){Dn.set("Creating Animation Storage..."),Pt.set(0),Bi.set(e.length+e.reduce((a,r)=>a+r.frames.length,0));let n=[],i=new Rd(16);for(let a of e){Dn.set(`Creating Animation Storage for '${a.storage_name}'`);let r=new ot,o=s(()=>{let l=`data modify storage animated_java:${Project.animated_java.export_namespace}/animations ${a.storage_name} merge value ${r.toString()}`;n.push(l),r=new ot},"addFrameDataCommand");for(let l=0;l1e6&&o(),Pt.set(Pt.get()+1),await i.sync()}o(),Pt.set(Pt.get()+1),await i.sync()}return n}s(Jbe,"createAnimationStorage");function Gbe(t,e){return t.type==="locator"&&e.type!=="locator"?1:t.type!=="locator"&&e.type==="locator"?-1:0}s(Gbe,"nodeSorter");async function Gd(t,e){console.time("Data Pack Compilation took");let n=Project.animated_java,i=new Ur(PathModule.join(e.dataPackFolder,"data.ajmeta"),n.export_namespace,Project.last_used_export_namespace,e.dataPackFolder);n.data_pack_export_mode==="folder"&&i.read();let a=new Map,r=new Map,o=e.dataPackFolder;for(let m of t){console.groupCollapsed(`Compiling data pack for Minecraft ${m}`);let f=new Map,g=new Map,x=t.length>1?PathModule.join(e.dataPackFolder,`animated_java_${m.replaceAll(".","_")}`):o;await Kbe({...e,ajmeta:i,version:m,coreFiles:f,versionedFiles:g});for(let[_,h]of f){let v=PathModule.join(o,_);a.set(v,h),h.includeInAJMeta!==!1&&i.coreFiles.add(v)}for(let[_,h]of g){let v=PathModule.join(x,_);r.set(v,h),h.includeInAJMeta!==!1&&i.versionedFiles.add(v)}console.groupEnd()}console.log("Exported Files:",a.size+r.size);let l=PathModule.join(e.dataPackFolder,"pack.mcmeta"),c=Co.fromFile(l);c.content.pack??={};let d=fh(t[0]),u=Jd(t[0]),p=d?Jd(d):1e7;if(compareVersions("1.21.9",t[0])?(c.content.pack.pack_format=u,c.content.pack.supported_formats={min_inclusive:u,max_inclusive:p-1}):(c.content.pack.min_format=u,c.content.pack.max_format=p-1),c.content.pack.description??=`Animated Java Data Pack for ${t.join(", ")}`,a.set(PathModule.join(e.dataPackFolder,"pack.mcmeta"),{content:autoStringify(c.toJSON()),includeInAJMeta:!1}),n.data_pack_export_mode==="folder"){await Wbe(i),i.coreFiles=new Set(a.keys()),i.versionedFiles=new Set(r.keys()),i.write();let m=new Map([...a,...r]);console.time("Writing DataPack Files took"),await Ybe(m,e.dataPackFolder),console.timeEnd("Writing DataPack Files took")}console.timeEnd("Data Pack Compilation took")}s(Gd,"compileDataPack");async function Wbe(t){console.time("Removing Files took");let e=Project.animated_java;if(e.data_pack_export_mode==="folder"){Dn.set("Removing Old Data Pack Files..."),Pt.set(0),Bi.set(t.previousVersionedFiles.size);let n=new Set;for(let i of t.previousVersionedFiles){if(Ec(i)&&fs.existsSync(i)){if(e.export_namespace!==Project.last_used_export_namespace&&Vc(i).resourceLocation.startsWith(`animated_java:${Project.last_used_export_namespace}/`)){let l=Wd(i,Project.last_used_export_namespace,e.export_namespace);await fs.promises.mkdir(PathModule.dirname(l),{recursive:!0}),await fs.promises.copyFile(i,l),await fs.promises.unlink(i)}let r;try{r=JSON.parse((await fs.promises.readFile(i)).toString())}catch(o){if(o instanceof SyntaxError)throw new fi(`Failed to parse function tag file: '${i}'. Please ensure that the file is valid JSON.`);continue}r.values=r.values.filter(o=>typeof o=="string"&&(!o.startsWith(`animated_java:${e.export_namespace}/`)||!o.startsWith(`animated_java:${Project.last_used_export_namespace}/`))),await fs.promises.writeFile(i,autoStringify(r))}else fs.existsSync(i)&&await fs.promises.unlink(i);let a=PathModule.dirname(i);for(;!n.has(a)&&fs.existsSync(a)&&(await fs.promises.readdir(a)).length===0;)await fs.promises.rm(a,{recursive:!0}),n.add(a),a=PathModule.dirname(a);Pt.set(Pt.get()+1)}}console.timeEnd("Removing Files took")}s(Wbe,"removeFiles");var Kbe=s(async({version:t,versionedFiles:e,rig:n,animations:i,rigHash:a,animationHash:r,debugMode:o})=>{jt.defaultMinecraftVersion=t;let l=Project.animated_java,c=i.length===0,d={export_namespace:l.export_namespace,interpolation_duration:l.interpolation_duration,teleportation_duration:l.teleportation_duration,display_item:l.display_item,rig:n,animations:i,export_version:Math.random().toString().substring(2,10),root_entity_passengers:await Hbe(t,n,a),TAGS:_e,OBJECTIVES:oS,TELLRAW:mh,on_summon_function:l.on_summon_function,on_remove_function:l.on_remove_function,on_pre_tick_function:l.on_pre_tick_function,on_post_tick_function:l.on_post_tick_function,matrixToNbtFloatArray:nb,transformationToNbt:lS,use_storage_for_animation:l.use_storage_for_animation,animationStorage:l.use_storage_for_animation?await Jbe(n,i):null,rig_hash:a,animation_hash:r,boundingBox:l.render_box,DisplayEntityConfig:wt,roundTo:Ja,nodeSorter:Gbe,getRotationFromQuaternion:pf,has_locators:Object.values(n.nodes).filter(u=>u.type==="locator").length>0,has_entity_locators:Object.values(n.nodes).filter(u=>u.type==="locator"&&u.config?.use_entity).length>0,has_ticking_locators:Object.values(n.nodes).filter(u=>u.type==="locator"&&u.config?.on_tick_function).length>0,has_cameras:Object.values(n.nodes).filter(u=>u.type==="camera").length>0,is_static:c,getNodeTags:sS,BONE_TYPES:tb,project_storage:`animated_java:${l.export_namespace}`,temp_storage:"animated_java:temp",gu_storage:"animated_java:gu",auto_update_rig_orientation:l.auto_update_rig_orientation,debug_mode:o};aS({sourceFiles:{"src/global.mcbt":wo[t].globalTemplates,"src/animated_java.mcb":wo[t].global,[`src/animated_java/${l.export_namespace}.mcb`]:c?wo[t].static:wo[t].animation},destPath:".",variables:d,version:t,exportedFiles:e})},"dataPackCompiler");async function Ybe(t,e){Dn.set("Writing Data Pack..."),Pt.set(0),Bi.set(t.size);let n=Project.animated_java,i=Project.last_used_export_namespace,a=new Set,r=new Map;async function o(d,u){if(Ec(d)&&fs.existsSync(d)){r.set(d,u);return}let p=PathModule.dirname(d);a.has(p)||(await fs.promises.mkdir(p,{recursive:!0}),a.add(p)),u.writeHandler?await u.writeHandler(d,u.content):await fs.promises.writeFile(d,new Uint8Array(Buffer.isBuffer(u.content)?u.content:Buffer.from(u.content))),Pt.set(Pt.get()+1)}s(o,"writeFile");let l=8,c=new Map;for(let[d,u]of t)c.set(d,o(d,u).finally(()=>{c.delete(d)})),c.size>=l&&await Promise.any(c.values());await Promise.all(c.values()),Dn.set("Merging Function Tags..."),Bi.set(r.size),Pt.set(0);for(let[d,u]of r.entries()){let m=Ii.fromJSON(JSON.parse(fs.readFileSync(d,"utf-8"))).merge(Ii.fromJSON(JSON.parse(u.content.toString())));m.filter(f=>{let g=Ii.getEntryId(f),x=g.startsWith("#"),_=bc(x?g.substring(1):g);if(_.namespace!=="animated_java")return!0;if(n.export_namespace!==i&&_.namespace===i)return!1;let h=Rr("1.21")?"function":"functions",v=(x?"tags/":"")+h,b=x?".json":".mcfunction";for(let y of fs.readdirSync(e)){let w=PathModule.join(e,y,_.namespace,v,_.path+b);if(fs.existsSync(w))return!0}return console.warn(`Removed reference to ${x?"tag":"function"} '${g}' in '${d}' because it does not exist!`),!1}),m.sort(),await fs.promises.writeFile(d,autoStringify(m.toJSON())),Pt.set(Pt.get()+1)}}s(Ybe,"writeFiles");var hh=class{overrides=new Map;externalOverrides=new Map;lastOverrideId=1;rigs={};parent="item/generated";textures={};setOverride(e,n){this.overrides.set(e,n)}addOverride(e){let n=this.lastOverrideId;for(;this.overrides.has(n)||this.externalOverrides.has(n);)n++;return this.lastOverrideId=n,this.overrides.set(n,e),n}assertOverride(e,n){this.overrides.has(e)||this.externalOverrides.has(e)||this.setOverride(e,n)}readExisting(e){let n=Project.animated_java,i;try{i=JSON.parse(fs.readFileSync(e,"utf-8"))}catch(a){console.error("Failed to read existing display item model:",a);return}if(i.animated_java,i.parent&&(this.parent=i.parent),i.textures&&(this.textures=i.textures),i.overrides??=[],i.animated_java??={},typeof i.animated_java.rigs=="object"&&!Array.isArray(i.animated_java.rigs)){let a=i.animated_java.rigs;i.animated_java={};for(let r of Object.keys(a))i.animated_java[r]=a[r].used_ids}i.animated_java[n.export_namespace]??=[];for(let[a,r]of Object.entries(i.animated_java)){let o=n.export_namespace,l=Project.last_used_export_namespace;if(a===o||a===l){i.overrides=i.overrides.filter(c=>!r.includes(c.predicate.custom_model_data)),a===l&&o!==l&&delete i.animated_java[l];continue}else for(let c of r){let d=i.overrides.find(u=>u.predicate.custom_model_data===c);this.externalOverrides.set(c,d.model)}this.rigs[a]=r}}toJSON(){let[e,n]=Project.animated_java.display_item.split(":"),i=Project.animated_java.export_namespace;return{parent:this.parent,textures:Object.keys(this.textures).length>0?this.textures:{layer0:`${e}:item/${n}`},overrides:[...this.externalOverrides.entries(),...this.overrides.entries()].sort((a,r)=>a[0]-r[0]).map(([a,r])=>({predicate:{custom_model_data:a},model:r})),animated_java:gh({...this.rigs,[i]:[...this.overrides.keys()]})}}};s(hh,"PredicateItemModel");var Xbe=s(async({coreFiles:t,versionedFiles:e,rig:n,resourcePackPath:i,displayItemPath:a,textureExportFolder:r,modelExportFolder:o})=>{let l=Project.animated_java;Dn.set("Compiling Resource Pack..."),console.log("Compiling resource pack...",{rig:n,displayItemPath:a,textureExportFolder:r,modelExportFolder:o}),e.set(PathModule.join("assets/animated_java/models/empty.json"),{content:"{}"});let c=new hh,d=PathModule.join(i,a);fs.existsSync(d)&&(console.warn("Display item already exists! Attempting to merge..."),c.readExisting(d)),c.lastOverrideId=Math.max(1,l.enable_advanced_resource_pack_settings?l.custom_model_data_offset:0),c.assertOverride(1,"animated_java:empty");for(let m of Object.values(n.textures)){let f,g,x;if(m.source?.startsWith("data:"))f=Buffer.from(m.source.split(",")[1],"base64");else if(m.path&&fs.existsSync(m.path)){if(qr(m.path))continue;{f=fs.readFileSync(m.path);let h=m.path+".mcmeta",v=m.path.replace(".png","_e.png");fs.existsSync(h)&&(g=fs.readFileSync(h)),fs.existsSync(v)&&(x=fs.readFileSync(v))}}if(f===void 0)throw new Error(`Texture ${m.name} is missing it's image data.`);let _=m.name.replace(/\.png$/,"");_=Kt(_)+".png",e.set(PathModule.join(r,_),{content:f}),g!==void 0&&e.set(PathModule.join(r,_+".mcmeta"),{content:g}),x!==void 0&&e.set(PathModule.join(r,_+"_e.png"),{content:x})}let u=PathModule.join("assets/minecraft/atlases/blocks.json"),p=await fs.promises.readFile(u,"utf-8").catch(()=>(console.log("Creating new block atlas..."),'{ "sources": [] }')).then(m=>JSON.parse(m));p.sources?.some(m=>m.type==="directory"&&m.source==="blueprint"&&m.prefix==="blueprint/")||(p.sources??=[],p.sources.push({type:"directory",source:"blueprint",prefix:"blueprint/"})),t.set(u,{content:autoStringify(p)});for(let m of Object.values(n.variants))for(let[f,g]of Object.entries(m.models)){let x=n.nodes[f];if(g.custom_model_data!==-1)continue;g.custom_model_data=c.addOverride(g.resource_location);let _=m.is_default?PathModule.join(o,x.name+".json"):PathModule.join(o,m.name,x.name+".json");e.set(PathModule.join(_),{content:autoStringify(g.model)})}console.log("Display Item Model",c.toJSON()),e.set(a,{content:autoStringify(c.toJSON()),includeInAJMeta:!1}),console.log("Resource pack compiled!")},"compileResourcePack"),ib=Xbe;var Zbe=s(async({coreFiles:t,versionedFiles:e,rig:n,textureExportFolder:i,modelExportFolder:a})=>{let r=a.replace(/([\\/])blueprint([\\/])/,"$1item$2");Dn.set("Compiling Resource Pack..."),console.log("Compiling resource pack...",{rig:n,textureExportFolder:i,modelExportFolder:a});let o=PathModule.join("assets/minecraft/atlases/blocks.json"),l=await fs.promises.readFile(o,"utf-8").catch(()=>(console.log("Creating new block atlas..."),JSON.stringify({sources:[]}))).then(c=>JSON.parse(c));l.sources?.some(c=>c.type==="directory"&&c.source==="blueprint"&&c.prefix==="blueprint/")||(l.sources??=[],l.sources.push({type:"directory",source:"blueprint",prefix:"blueprint/"})),t.set(o,{content:autoStringify(l)}),e.set(PathModule.join("assets/animated_java/models/item/empty.json"),{content:"{}"});for(let c of Object.values(n.textures)){let d,u,p;if(c.source?.startsWith("data:"))d=Buffer.from(c.source.split(",")[1],"base64");else if(c.path&&fs.existsSync(c.path)){if(qr(c.path))continue;if(d=Ef(c.path),d==null)throw new Error(`Failed to read texture "${c.name}" at ${c.path}`);u=Ef(c.path+".mcmeta"),p=Ef(c.path.replace(".png","_e.png"))}if(d===void 0)throw new Error(`Texture ${c.name} is missing it's image data.`);let m=c.name.replace(/\.png$/,"");m=Kt(m)+".png",e.set(PathModule.join(i,m),{content:d}),u!==void 0&&e.set(PathModule.join(i,m+".mcmeta"),{content:u}),p!==void 0&&e.set(PathModule.join(i,m+"_e.png"),{content:p})}for(let c of Object.values(n.variants))for(let[d,u]of Object.entries(c.models)){let p=n.nodes[d];if(u.custom_model_data!==-1)continue;let m=c.is_default?PathModule.join(r,p.name+".json"):PathModule.join(r,c.name,p.name+".json");u.model?.parent&&(u.model.parent=u.model.parent.replace("animated_java:blueprint/","animated_java:item/")),u.item_model=u.item_model.replace("animated_java:blueprint/","animated_java:"),console.log("Exporting model",u.model,"to",m),e.set(PathModule.join(m),{content:autoStringify(u.model)})}console.log("Resource pack compiled!")},"compileResourcePack"),cS=Zbe;var Qbe=s(async({coreFiles:t,versionedFiles:e,rig:n,textureExportFolder:i,modelExportFolder:a})=>{let r=Project.animated_java;Dn.set("Compiling Resource Pack..."),console.log("Compiling resource pack...",{rig:n,textureExportFolder:i,modelExportFolder:a});let o=PathModule.join("assets/animated_java/items/blueprint/",r.export_namespace),l=PathModule.join("assets/minecraft/atlases/blocks.json"),c=await fs.promises.readFile(l,"utf-8").catch(()=>(console.log("Creating new block atlas..."),'{ "sources": [] }')).then(u=>JSON.parse(u));c.sources?.some(u=>u.type==="directory"&&u.source==="blueprint"&&u.prefix==="blueprint/")||(c.sources??=[],c.sources.push({type:"directory",source:"blueprint",prefix:"blueprint/"})),t.set(l,{content:autoStringify(c)});for(let u of Object.values(n.textures)){let p,m,f;if(u.source?.startsWith("data:"))p=Buffer.from(u.source.split(",")[1],"base64");else if(u.path&&fs.existsSync(u.path)){if(qr(u.path))continue;{p=fs.readFileSync(u.path);let x=u.path+".mcmeta",_=u.path.replace(".png","_e.png");fs.existsSync(x)&&(m=fs.readFileSync(x)),fs.existsSync(_)&&(f=fs.readFileSync(_))}}if(p===void 0)throw new Error(`Texture ${u.name} is missing it's image data.`);let g=u.name.replace(/\.png$/,"");g=Kt(g)+".png",e.set(PathModule.join(i,g),{content:p}),m!==void 0&&e.set(PathModule.join(i,g+".mcmeta"),{content:m}),f!==void 0&&e.set(PathModule.join(i,g+"_e.png"),{content:f})}let d=qe.getDefault();for(let[u,p]of Object.entries(n.variants[d.uuid].models)){let m=n.nodes[u],f=PathModule.join(o,m.name+".json"),g;Object.values(n.variants).length===1?g=uS(p):g=$be(u,p,n),e.set(f,{content:autoStringify(g)})}for(let u of Object.values(n.variants))for(let[p,m]of Object.entries(u.models)){let f=n.nodes[p];if(m.custom_model_data!==-1)continue;let g=u.is_default?PathModule.join(a,f.name+".json"):PathModule.join(a,u.name,f.name+".json");e.set(PathModule.join(g),{content:autoStringify(m.model)})}console.log("Resource pack compiled!")},"compileResourcePack"),Kd=Qbe;function uS(t){return{model:{type:"minecraft:model",model:t.resource_location,tints:[new oneLiner({type:"minecraft:dye",default:[1,1,1]})]}}}s(uS,"createSingleVariantItemDefinition");function $be(t,e,n){let i={model:{type:"minecraft:select",property:"minecraft:custom_model_data",cases:[{when:"AJ_INTERNAL_EMPTY",model:{type:"minecraft:empty"}}],fallback:{type:"minecraft:model",model:e.resource_location,tints:[new oneLiner({type:"minecraft:dye",default:[1,1,1]})]}}};for(let a of Object.values(n.variants)){let r=a.models[t];!r||a.is_default||i.model.cases.push({when:a.name,model:{type:"minecraft:model",model:r.resource_location,tints:[new oneLiner({type:"minecraft:dye",default:[1,1,1]})]}})}return i.model.cases.length===0?uS(e):i}s($be,"createMultiVariantItemDefinition");var eye={"1.21.9":Kd,"1.21.6":Kd,"1.21.5":Kd,"1.21.4":Kd,"1.21.2":cS,"1.20.5":ib,"1.20.4":ib};async function Yd(t,e){let n=Project.animated_java,i=new Ur(PathModule.join(e.resourcePackFolder,"assets.ajmeta"),n.export_namespace,Project.last_used_export_namespace,e.resourcePackFolder);n.resource_pack_export_mode==="folder"&&i.read();let a=new Map,r=new Map,o=e.resourcePackFolder;for(let m of t){console.groupCollapsed(`Compiling resource pack for Minecraft ${m}`);let f=new Map,g=new Map,x=t.length>1?PathModule.join(e.resourcePackFolder,`animated_java_${m.replaceAll(".","_")}`):e.resourcePackFolder;await eye[m]({...e,resourcePackPath:x,ajmeta:i,coreFiles:f,versionedFiles:g});for(let[_,h]of f){let v=PathModule.join(o,_);a.set(v,h),h.includeInAJMeta!==!1&&i.coreFiles.add(v)}for(let[_,h]of g){let v=PathModule.join(x,_);r.set(v,h),h.includeInAJMeta!==!1&&i.versionedFiles.add(v)}console.groupEnd()}console.log("Exported files:",a.size+r.size);let l=PathModule.join(e.resourcePackFolder,"pack.mcmeta"),c=Co.fromFile(l);c.content.pack??={};let d=fh(t[0]),u=ab(t[0]),p=d?ab(d):1e7;if(compareVersions("1.21.9",t[0])?(c.content.pack.pack_format=u,c.content.pack.supported_formats={min_inclusive:u,max_inclusive:p-1}):(c.content.pack.min_format=u,c.content.pack.max_format=p-1),c.content.pack.description??=`Animated Java Resource Pack for ${t.join(", ")}`,a.set(PathModule.join(e.resourcePackFolder,"pack.mcmeta"),{content:autoStringify(c.toJSON())}),n.enable_plugin_mode)console.log("Plugin mode enabled. Skipping resource pack export.");else if(n.resource_pack_export_mode==="folder"){Dn.set("Removing Old Resource Pack Files..."),Pt.set(0),Bi.set(i.previousVersionedFiles.size);let m=new Set;for(let x of i.previousVersionedFiles){fs.existsSync(x)&&await fs.promises.unlink(x);let _=PathModule.dirname(x);for(;!m.has(_)&&fs.existsSync(_)&&(await fs.promises.readdir(_)).length===0;)await fs.promises.rm(_,{recursive:!0}),m.add(_),_=PathModule.dirname(_);Pt.set(Pt.get()+1)}i.coreFiles=new Set(a.keys()),i.versionedFiles=new Set(r.keys()),i.write();let f=new Map([...a,...r]);Dn.set("Writing Resource Pack..."),Pt.set(0),Bi.set(f.size);let g=new Set;for(let[x,_]of f){let h=PathModule.dirname(x);g.has(h)||(await fs.promises.mkdir(h,{recursive:!0}),g.add(h)),_.writeHandler?await _.writeHandler(x,_.content):await fs.promises.writeFile(x,new Uint8Array(Buffer.isBuffer(_.content)?_.content:Buffer.from(_.content))),Pt.set(Pt.get()+1)}}else if(n.resource_pack_export_mode==="zip")throw new fi("ZIP export is not yet implemented.")}s(Yd,"compileResourcePack");var dS=wi(Ee("crypto"),1);function tye(t,e,n){if(!t.export)return;let i={};if(i.from=t.from.slice(),i.to=t.to.slice(),t.inflate&&(i.from=i.from.map(a=>a-t.inflate),i.to=i.to.map(a=>a+t.inflate)),t.shade===!1&&(i.shade=!1),t.rotation.allEqual(0)&&t.origin.allEqual(0))t.rescale&&(i.rotation={angle:0,axis:t.rotation_axis||"y",origin:t.origin,rescale:!0});else{let a=t.rotationAxis()||"y";i.rotation={angle:t.rotation[getAxisNumber(a)],axis:a,origin:t.origin},t.rescale&&(i.rotation.rescale=!0)}if(t.parent instanceof Group){let a=t.parent;i.from=i.from.map((r,o)=>r-a.origin[o]),i.to=i.to.map((r,o)=>r-a.origin[o]),i.rotation&&!Array.isArray(i.rotation)&&(i.rotation.origin=i.rotation.origin.map((r,o)=>r-a.origin[o]))}i.faces={};for(let[a,r]of Object.entries(t.faces)){if(!r?.texture)continue;let o={};if(r.enabled&&(o.uv=r.uv.slice().map((l,c)=>l*16/UVEditor.getResolution(c%2))),r.rotation&&(o.rotation=r.rotation),r.texture){let l=r.getTexture();if(!l)throw new Error("Texture not found");o.texture="#"+l.id,e.textures[l.id]=l;let c=pS(l,e).resourceLocation;c&&(n.textures[l.id]=c)}r.cullface&&(o.cullface=r.cullface),r.tint>=0&&(o.tintindex=r.tint),i.faces[a]=o}Object.keys(i.faces).length!==0&&(t.light_emission&&(i.light_emission=t.light_emission),n.elements??=[],n.elements.push(i))}s(tye,"renderCube");var Xd=new Map;function pS(t,e){if(Xd.has(t.uuid))return Xd.get(t.uuid);let n=t.name.replace(/\.png$/,"");if(n=Kt(n)+".png",t.path&&fs.existsSync(t.path)&&fs.statSync(t.path).isFile()){let r=Sa(t.path);if(r)return Xd.set(t.uuid,r),r;console.warn(`Texture ${t.name} has a custom path that is not in a valid resource pack location: ${t.path}`)}let i=PathModule.join(e.texture_export_folder,n),a=Sa(i);if(a)return Xd.set(t.uuid,a),a;throw console.error(t),new Error(`Invalid texture path: ${i}`)}s(pS,"getTextureResourceLocation");function _h(t){let e=new THREE.Box3;if(t instanceof Group){let n=t.children.filter(i=>i instanceof Cube);for(let i of n)e.expandByPoint(new THREE.Vector3(i.from[0]-i.inflate,i.from[1]-i.inflate,i.from[2]-i.inflate)),e.expandByPoint(new THREE.Vector3(i.to[0]+i.inflate,i.to[1]+i.inflate,i.to[2]+i.inflate))}else(t instanceof ve||t instanceof We||t instanceof $e)&&e.setFromObject(t.mesh);return e.expandByPoint(new THREE.Vector3(t.origin[0],t.origin[1],t.origin[2])),e}s(_h,"getNodeBoundingBox");function mS(t,e,n){if(!t.export)return;let i=t.parent instanceof Group?t.parent.uuid:void 0,a=PathModule.join(e.model_export_folder,t.name+".json"),r=Sa(a);if(!r)throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${a}`);let o={type:"bone",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:i,bounding_box:_h(t),base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),default_transform:{}},l=n.models[t.uuid];l||(l=n.models[t.uuid]={model:{textures:{particle:"minecraft:item/pufferfish"},display:{head:{rotation:[0,180,0]}}},custom_model_data:-1,resource_location:r.resourceLocation,item_model:r.resourceLocation});for(let p of t.children)if(p.export)switch(!0){case p instanceof Group:{mS(p,e,n);break}case p instanceof Locator:{_S(p,e);break}case p instanceof ve:{gS(p,e);break}case(OutlinerElement.types.camera&&p instanceof OutlinerElement.types.camera):{xS(p,e);break}case p instanceof We:{fS(p,e);break}case p instanceof $e:{hS(p,e);break}case p instanceof Cube:{tye(p,e,l.model),e.includes_custom_models=!0;break}default:console.warn("Encountered unknown node type:",p)}if(!l.model?.elements||l.model.elements.length===0){delete n.models[t.uuid];let p={type:"struct",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:i,default_transform:{}};e.nodes[t.uuid]=p;return}let c=new THREE.Vector3().subVectors(o.bounding_box.max,o.bounding_box.min),d=Math.max(c.x,c.y,c.z),u=Math.min(1,24/d);for(let p of l.model.elements)p.from=p.from.map(m=>m*u+8),p.to=p.to.map(m=>m*u+8),p.rotation&&!Array.isArray(p.rotation)&&(p.rotation.origin=p.rotation.origin.map(m=>m*u+8));o.base_scale=1/u,e.nodes[t.uuid]=o}s(mS,"renderGroup");function fS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:void 0,i=PathModule.join(e.model_export_folder,t.name+".json");if(!Sa(i))throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${i}`);let r={type:"item_display",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,item:t.item,item_display:t.itemDisplay,base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),bounding_box:_h(t),default_transform:{}};e.nodes[t.uuid]=r}s(fS,"renderItemDisplay");function hS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:void 0,i=PathModule.join(e.model_export_folder,t.name+".json");if(!Sa(i))throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${i}`);let r={type:"block_display",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,block:t.block,parent:n,base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),bounding_box:_h(t),default_transform:{}};e.nodes[t.uuid]=r}s(hS,"renderBlockDisplay");function gS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:void 0,i=PathModule.join(e.model_export_folder,t.name+".json");if(!Sa(i))throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${i}`);let r=tinycolor(t.backgroundColor),o={type:"text_display",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,text:t.text,line_width:t.lineWidth,background_color:jt.moveHex8AlphaToStart(r.toHex8String()),background_alpha:r.getAlpha(),align:t.align,shadow:t.shadow,see_through:t.seeThrough,base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),bounding_box:_h(t),default_transform:{}};return e.nodes[t.uuid]=o,{uuid:t.uuid,children:[]}}s(gS,"renderTextDisplay");function _S(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:t.parent,i={type:"locator",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,config:structuredClone(t.config),max_distance:0,default_transform:{}};e.nodes[t.uuid]=i}s(_S,"renderLocator");function xS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:t.parent,i={type:"camera",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,max_distance:0,default_transform:{}};e.nodes[t.uuid]=i}s(xS,"renderCamera");function nye(t,e){let n={},i=qe.getDefault(),a=e.variants[i.uuid].models;for(let[r,o]of Object.entries(e.nodes)){if(o.type!=="bone"||t.excludedNodes.find(g=>g.value===r))continue;let l={},c=!0,d=new Set(Object.keys(a[r].model.textures));for(let[g,x]of t.textureMap.map.entries()){let _=Texture.all.find(v=>v.uuid===g);if(!_)throw new Error(`From texture not found: ${g}`);let h=Texture.all.find(v=>v.uuid===x);if(!h)throw new Error(`To texture not found: ${x}`);l[_.id]=pS(h,e).resourceLocation,e.textures[h.id]=h,c=!1}if(Object.keys(l).length===0)continue;if(c&&d.size===0){n[r]={model:null,custom_model_data:1,resource_location:"animated_java:empty",item_model:"animated_java:empty"};continue}let u=PathModule.join(e.model_export_folder,o.storage_name+".json"),p=Sa(u);if(!p)throw new Error(`Invalid Bone Name: '${o.storage_name}' -> '${u}'`);let m=t.isDefault?PathModule.join(e.model_export_folder,o.storage_name+".json"):PathModule.join(e.model_export_folder,t.name,o.storage_name+".json"),f=Sa(m);if(!f)throw new Error(`Invalid Variant Name: '${t.name}' -> '${m}'`);n[r]={model:{parent:p.resourceLocation,textures:l},custom_model_data:-1,resource_location:f.resourceLocation,item_model:f.resourceLocation}}return n}s(nye,"renderVariantModels");function vS(t){let e=dS.createHash("sha256");for(let[n,i]of Object.entries(t.nodes))switch(e.update("node;"),e.update(n),e.update(i.name),e.update(i.default_transform.matrix.elements.toString()),i.type){case"bone":{e.update(";"+JSON.stringify(t.variants[qe.getDefault().uuid].models[n])),i.configs&&e.update(";"+JSON.stringify(i.configs));break}case"block_display":e.update(`;${i.block}`),i.configs&&e.update(";"+JSON.stringify(i.configs));break;case"item_display":e.update(`;${i.item};${i.item_display}`),i.configs&&e.update(";"+JSON.stringify(i.configs));break;case"text_display":e.update(`;${i.text}`),i.configs&&e.update(";"+JSON.stringify(i.configs));break;case"locator":{i.config&&e.update(";"+JSON.stringify(i.config));break}}return e.digest("hex")}s(vS,"hashRig");function iye(t,e){return{...t.toJSON(),models:nye(t,e)}}s(iye,"renderVariant");function aye(t){let e=new Blockbench.Animation;uv(),Nd(e,0);let n=pv(e,t.nodes).node_transforms;return dv(),n}s(aye,"getDefaultTransforms");function bS(t,e){console.time("Rendering rig took"),Texture.all.forEach((r,o)=>r.id=String(o)),Animator.showDefaultPose();let n={nodes:{},variants:{},textures:{},model_export_folder:t,texture_export_folder:e,includes_custom_models:!1},i=qe.getDefault();n.variants[i.uuid]={...i.toJSON(),models:{}};for(let r of Outliner.root)switch(!0){case r instanceof Group:{mS(r,n,n.variants[i.uuid]);break}case r instanceof Locator:{_S(r,n);break}case r instanceof ve:{gS(r,n);break}case(OutlinerElement.types.camera&&r instanceof OutlinerElement.types.camera):{xS(r,n);break}case r instanceof We:{fS(r,n);break}case r instanceof $e:{hS(r,n);break}case r instanceof Cube:throw new fi(`Cubes cannot be exported as root nodes. Please parent them to a bone. (Found '${r.name}' outside of a bone)`);default:console.warn("Encountered unknown node type:",r)}let a=aye(n);for(let[r,o]of Object.entries(n.nodes))o.default_transform=a[r];for(let r of qe.all)r.isDefault||(n.variants[r.uuid]=iye(r,n));return Xd.clear(),console.timeEnd("Rendering rig took"),console.log("Rendered rig:",n),n}s(bS,"renderRig");var fi=class extends Error{constructor(n,i,a){super(n);this.messageBoxOptions=i;this.messageBoxCallback=a;this.name="IntentionalExportError"}};s(fi,"IntentionalExportError");var Zd=class extends fi{constructor(n,i){let a=PathModule.parse(n);super(`Failed to read file ${a.base}: \`\`\` `+i+"\n```",{commands:{open_file:{text:"Open File Location",icon:"folder_open"}}},r=>{r==="open_file"&&shell.showItemInFolder(n)});this.originalError=i;this.name="IntentionalExportErrorFromInvalidFile"}};s(Zd,"IntentionalExportErrorFromInvalidFile");function rb(){let t=Project.animated_java,e=$o(t.resource_pack),n=$o(t.data_pack),i=PathModule.join("assets/animated_java/models/blueprint/",t.export_namespace),a=PathModule.join("assets/animated_java/textures/blueprint/",t.export_namespace),r=PathModule.join("assets/minecraft/models/item/",t.display_item.split(":").at(-1)+".json");return{resourcePackFolder:e,dataPackFolder:n,textureExportFolder:a,modelExportFolder:i,displayItemPath:r}}s(rb,"getExportPaths");async function rye({forceSave:t=!0,debugMode:e=!1}={}){let n=Project.animated_java,i=qf();await new Promise(o=>requestAnimationFrame(o));let a=qe.selected;qe.getDefault().select();let r=new pi("Project Export").start();try{for(let x of qe.all)x.verifyTextureMap();for(let x of Texture.all)if(!(x.path&&qr(x.path)&&fs.existsSync(x.path))&&Texture.all.some(_=>_!==x&&_.name===x.name))throw new fi(`Texture name "${x.name}" is used more than once. Please make sure all textures have unique names.`);let{resourcePackFolder:o,dataPackFolder:l,textureExportFolder:c,modelExportFolder:d,displayItemPath:u}=rb();Dn.set("Rendering Rig...");let p=bS(d,c);if(!p.includes_custom_models&&Texture.all.length!==0)throw new fi(A("misc.failed_to_export.rig_has_textures_but_no_custom_models.message"));if(p.includes_custom_models&&Texture.all.length===0)throw new fi(A("misc.failed_to_export.rig_has_custom_models_but_no_textures.message"));if(Project.animated_java.resource_pack_export_mode==="none"&&p.includes_custom_models)return Blockbench.showMessageBox({title:A("misc.failed_to_export.title"),message:A("misc.failed_to_export.custom_models.message"),buttons:[A("misc.failed_to_export.button")]}),i.close(0),!1;let m=await v4(Project,p);Dn.set("Hashing Rendered Objects...");let f=vS(p),g=x4(m);return await Yd([n.target_minecraft_version],{rig:p,displayItemPath:u,resourcePackFolder:o,textureExportFolder:c,modelExportFolder:d,debugMode:e}),n.data_pack_export_mode!=="none"&&await Gd([n.target_minecraft_version],{rig:p,animations:m,dataPackFolder:l,rigHash:f,animationHash:g,debugMode:e}),Project.last_used_export_namespace=n.export_namespace,t&&xh(),Blockbench.showQuickMessage("Project exported successfully!",2e3),!0}catch(o){if(console.error(o),o instanceof fi)return Blockbench.showMessageBox({title:A("misc.failed_to_export.title"),message:o.message,buttons:[A("misc.failed_to_export.button")],...o.messageBoxOptions},o.messageBoxCallback),!1;Fo(o)}finally{a?.select(),i.close(0),r.debug()}return!1}s(rye,"actuallyExportProject");async function zc(t){if(!Project)return!1;if(Cube.all.some(n=>Ad(n)==="invalid"))return Blockbench.showMessageBox({title:A("misc.failed_to_export.title"),message:A(Rr("1.21.6")?"misc.failed_to_export.invalid_rotation.message_post_1_21_6":"misc.failed_to_export.invalid_rotation.message"),buttons:[A("misc.failed_to_export.button")]}),!1;bo.set({});let e=jc();return await new Promise(n=>requestAnimationFrame(n)),console.log("Blueprint Setting Errors",bo.get()),Object.keys(bo.get()).length>0?(Blockbench.showMessageBox({title:A("misc.failed_to_export.title"),message:A("misc.failed_to_export.blueprint_settings.message")+` `+Object.entries(bo.get()).map(n=>A("misc.failed_to_export.blueprint_settings.error_item",n[0])+` - `+n[1]).join(` `),buttons:[A("misc.failed_to_export.button")]}),!1):(e.close(0),await rye(t))}s(zc,"exportProject");var vh=(t=>(t["1.20.4"]="1.20.4",t["1.20.5"]="1.20.5",t["1.21.2"]="1.21.2",t["1.21.4"]="1.21.4",t["1.21.5"]="1.21.5",t["1.21.6"]="1.21.6",t["1.21.9"]="1.21.9",t))(vh||{}),Ur=class{constructor(e,n,i,a){this.path=e;this.exportNamespace=n;this.lastUsedExportNamespace=i;this.rootFolder=a}coreFiles=new Set;previousCoreFiles=new Set;versionedFiles=new Set;previousVersionedFiles=new Set;previousAJMeta={};read(){if(!fs.existsSync(this.path))return;try{this.previousAJMeta=JSON.parse(fs.readFileSync(this.path,"utf-8"))}catch(i){throw new fi(`Failed to read existing AJMeta file: ${i}`)}if(this.previousAJMeta.formatVersion!=="1.0.0"){let i=this.previousAJMeta;this.previousAJMeta={formatVersion:"1.0.0",rigs:{}};for(let[a,r]of Object.entries(i))this.previousAJMeta.rigs[a]={versionedFiles:r.files}}this.previousAJMeta.rigs??={};let e=this.previousAJMeta.rigs[this.lastUsedExportNamespace];if(e){Array.isArray(e.versionedFiles)||(e.versionedFiles=[]);for(let i of e.versionedFiles)this.previousVersionedFiles.add(PathModule.join(this.rootFolder,i));delete this.previousAJMeta.rigs[this.lastUsedExportNamespace]}let n=this.previousAJMeta.rigs[this.exportNamespace];if(n){Array.isArray(n.versionedFiles)||(n.versionedFiles=[]);for(let i of n.versionedFiles)this.previousVersionedFiles.add(PathModule.join(this.rootFolder,i));delete this.previousAJMeta.rigs[this.exportNamespace]}}write(){let e=PathModule.dirname(this.path),n={formatVersion:"1.0.0",rigs:gh({...this.previousAJMeta.rigs,[this.exportNamespace]:{coreFiles:Array.from(this.coreFiles).map(i=>wf(PathModule.relative(e,i))).sort(),versionedFiles:Array.from(this.versionedFiles).map(i=>wf(PathModule.relative(e,i))).sort()}})};fs.writeFileSync(this.path,autoStringify(n))}};s(Ur,"AJMeta");var Co=class{content={};static fromFile(e){let n=new Co;if(!fs.existsSync(e))return console.warn(`Pack meta file does not exist at ${e}`),n;let i=fs.readFileSync(e,"utf-8");try{n.content=JSON.parse(i)}catch(a){throw new Zd(e,a)}return n}toJSON(){return structuredClone(this.content)}};s(Co,"PackMeta");var qt={export_namespace:"blueprint",show_render_box:!1,auto_render_box:!0,render_box:[48,48],enable_plugin_mode:!1,resource_pack_export_mode:"folder",data_pack_export_mode:"folder",target_minecraft_version:"1.21.9",display_item:"minecraft:white_dye",custom_model_data_offset:0,enable_advanced_resource_pack_settings:!1,resource_pack:"",enable_advanced_data_pack_settings:!1,data_pack:"",on_summon_function:"",on_remove_function:"",on_pre_tick_function:"",on_post_tick_function:"",interpolation_duration:1,teleportation_duration:1,auto_update_rig_orientation:!0,use_storage_for_animation:!1,baked_animations:!0,json_file:""},bo=new ke({});var Hr=Ny({id:"animated-java:codec/blueprint"},{name:"Blueprint",extension:"ajblueprint",remember:!0,load_filter:{extensions:["ajblueprint"],type:"json"},load(t,e){let n=ss.get();if(!n)throw new Error("Animated Java Blueprint format is not registered!");if(console.log(`Loading Animated Java Blueprint from '${e.name}'...`),t=yf(t),setupProject(n,t.meta?.uuid),!Project)throw new Error("Failed to load Animated Java Blueprint");this.parse(t,e.path);let i=pathToName(e.path,!0);if(e.path&&isApp&&!e.no_file){Project.name=pathToName(e.path,!1),Project.save_path=e.path,addRecentProject({name:i,path:e.path,icon:ss.get()?.icon});let a=Project;setTimeout(()=>{Project===a&&updateRecentProjectThumbnail()},500)}Settings.updateSettingsInProfiles(),console.log(`Successfully loaded Animated Java Blueprint - Project: ${Project.name} - UUID: ${Project.uuid}`)},parse(t,e){if(console.log(`Parsing Animated Java Blueprint from '${e}'...`),!Project)throw new Error("No project to parse into");Project.save_path=e,t.meta?.box_uv!==void 0&&(Project.box_uv=t.meta.box_uv),t.resolution!==void 0&&(Project.texture_width=t.resolution.width??16,Project.texture_height=t.resolution.height??16);for(let n in ModelProject.properties)ModelProject.properties[n].merge(Project,t);if(t.blueprint_settings&&(Project.animated_java={...qt,...t.blueprint_settings}),Project.animated_java.enable_plugin_mode&&(Project.animated_java.enable_plugin_mode=!1),Project.last_used_export_namespace=t.meta?.last_used_export_namespace??Project.animated_java.export_namespace,t.textures)for(let n of t.textures){let i=new Texture(n,n.uuid).add(!1);if(n.relative_path&&Project.save_path){let a=PathModule.resolve(Project.save_path,n.relative_path);if(fs.existsSync(a)){i.fromPath(a);continue}}n.path&&fs.existsSync(n.path)&&!t.meta?.backup?i.fromPath(n.path):n.source?.startsWith("data:")&&i.fromDataURL(n.source)}if(t.elements){let n=Texture.getDefault();for(let i of t.elements){let a=OutlinerElement.fromSave(i,!0);switch(!0){case a instanceof Cube:{for(let r in a.faces)if(i.faces){let o=i.faces[r].texture!==void 0&&Texture.all[i.faces[r].texture];o&&(a.faces[r].texture=o.uuid)}else n&&a.faces&&a.faces[r].texture!==void 0&&(a.faces[r].texture=n.uuid);break}}}}if(t.outliner){parseGroups(t.outliner);for(let n of Group.all)n.name=Kt(n.name)}if(t.variants&&(qe.all=[],t.variants.default?qe.fromJSON(t.variants?.default,!0):(console.warn('No default Variant found, creating one named "Default"'),new qe("Default",!0)),Array.isArray(t.variants.list))){for(let n of t.variants.list)qe.fromJSON(n);Project.variants=qe.all}if(t.animations)for(let n of t.animations){let i=new Blockbench.Animation;i.uuid=n.uuid??guid(),i.extend(n).add()}if(t.animation_controllers)for(let n of t.animation_controllers){let i=new Blockbench.AnimationController;i.uuid=n.uuid??guid(),i.extend(n).add()}if(t.animation_variable_placeholders&&(Interface.Panels.variable_placeholders.inside_vue.$data.text=t.animation_variable_placeholders),t.backgrounds){for(let n in t.backgrounds)if(Object.hasOwn(Project.backgrounds,n)){let i=t.backgrounds[n],a=Project.backgrounds[n];i.image!==void 0&&(a.image=i.image),i.size!==void 0&&(a.size=i.size),i.x!==void 0&&(a.x=i.x),i.y!==void 0&&(a.y=i.y),i.lock!==void 0&&(a.lock=i.lock)}Preview.all.forEach(n=>{n.canvas.isConnected&&n.loadBackground()})}if(Array.isArray(t.collections))for(let n of t.collections)new Collection(n,n.uuid).add();Canvas.updateAll(),Validator.validate(),this.dispatchEvent("parsed",{model:t})},compile(t={}){if(console.log(`Compiling Animated Java Blueprint from ${Project.name}...`),!Project)throw new Error("No project to compile.");let e=qe.selected;qe.selectDefault();let n={meta:{format:Qt,format_version:Ke.version,uuid:Project.uuid,save_location:Project.save_path,last_used_export_namespace:Project.last_used_export_namespace},resolution:{width:Project.texture_width??16,height:Project.texture_height??16}},i=Qs();for(let r of Object.keys(Project.animated_java)){let o=Project.animated_java[r];o==null||o===i[r]||(n.blueprint_settings??={},n.blueprint_settings[r]=o)}for(let r in ModelProject.properties)ModelProject.properties[r].export&&ModelProject.properties[r].copy(Project,n);n.elements=[];for(let r of elements)n.elements.push(r.getSaveCopy?.(!!n.meta));n.outliner=compileGroups(!0),n.textures=[];for(let r of Texture.all){let o=r.getSaveCopy();if(delete o.selected,isApp&&Project.save_path&&r.path&&PathModule.isAbsolute(r.path)){let l=PathModule.relative(PathModule.dirname(Project.save_path),r.path);o.relative_path=l.replace(/\\/g,"/")}t.bitmaps!=!1&&(Settings.get("embed_textures")||t.backup||t.bitmaps==!0)&&(o.source=r.getDataURL(),o.internal=!0),t.absolute_paths==!1&&delete o.path,n.textures.push(o)}n.variants={default:qe.getDefault().toJSON(),list:qe.allExcludingDefault().map(r=>r.toJSON())};let a={bone_names:!0,absolute_paths:t.absolute_paths};if(Blockbench.Animation.all.length>0){n.animations=[];for(let r of Blockbench.Animation.all)r.getUndoCopy&&n.animations.push(r.getUndoCopy(a,!0))}if(Blockbench.AnimationController.all.length>0){n.animation_controllers=[];for(let r of Blockbench.AnimationController.all)r.getUndoCopy&&n.animation_controllers.push(r.getUndoCopy(a,!0))}if(Interface.Panels.variable_placeholders.inside_vue.$data.text&&(n.animation_variable_placeholders=Interface.Panels.variable_placeholders.inside_vue.$data.text),!t.backup){let r={};for(let o in Project.backgrounds){let l=Project.backgrounds[o];l.image&&(r[o]=l.getSaveCopy())}Object.keys(r).length&&(n.backgrounds=r)}return Collection.all.length>0&&(n.collections=Collection.all.map(r=>r.getSaveCopy())),e?.select(),console.log("Successfully compiled Animated Java Blueprint",n),t.raw?n:compileJSON(n)},export(){if(console.log(`Exporting Animated Java Blueprint for ${Project.name}...`),!Project)throw new Error("No project to export.");Blockbench.export({resource_id:"animated_java_blueprint.export",name:(Project.name||"unnamed")+".ajblueprint",startpath:Project.save_path,type:"json",extensions:[this.extension],content:this.compile(),custom_writer:(t,e)=>{fs.existsSync(PathModule.dirname(e))?(Project.save_path=e,this.write(t,e)):(console.error(`Failed to export Animated Java Blueprint, file location '${e}' does not exist!`),Blockbench.showMessageBox({title:A("error.blueprint_export_path_doesnt_exist.title"),message:A("error.blueprint_export_path_doesnt_exist",e)}))}})},fileName(){return Project?.name?`${Project.name}.ajblueprint`:"unnamed_project.ajblueprint"}});var Qt="animated-java:format/blueprint";function wS(t){let e=Math.max(...t.rotation),n=Math.min(...t.rotation);if(e<=45&&n>=-45)return;let i=Math.abs(e)>=Math.abs(n)?e:n,a=t.rotation.indexOf(i),r=Project.selected_elements;Project.selected_elements=[t],rotateOnAxis(()=>i,a,!0),Project.selected_elements=r}s(wS,"fixCubeRotation");function ES(){Project.save_path="",Project.last_used_export_namespace="";for(let t of Group.all)t.createUniqueName(Group.all.filter(e=>e!==t)),t.sanitizeName();for(let t of Blockbench.Animation.all)t.createUniqueName(Blockbench.Animation.all.filter(e=>e!==t)),t.name=Kt(t.name);for(let t of Cube.all)t.setUVMode(!1),wS(t);Canvas.updateAll()}s(ES,"convertToBlueprint");function Qs(){return{...qt}}s(Qs,"getDefaultProjectSettings");K.UPDATE_VIEW.subscribe(()=>{if(!Project||!Fe()||(Project.visualBoundingBox&&scene.remove(Project.visualBoundingBox),!Project.animated_java.show_render_box))return;let t=0,e=0;if(Project.animated_java.auto_render_box){for(let a of Cube.all)t=Math.max(t,Math.abs(a.to[0]),Math.abs(a.to[2]),Math.abs(a.from[0]),Math.abs(a.from[2])),e=Math.max(e,a.to[1],a.from[1]);for(let a of[...AnimatedJava.TextDisplay.all,...AnimatedJava.VanillaItemDisplay.all,...AnimatedJava.VanillaBlockDisplay.all]){let r=new THREE.Box3().setFromObject(a.mesh);t=Math.max(t,Math.abs(r.min.x),Math.abs(r.min.z),Math.abs(r.max.x),Math.abs(r.max.z)),e=Math.max(e,r.max.y)}let i=8;t+=i,e+=i}else t=Project.animated_java.render_box[0],e=Project.animated_java.render_box[1];let n=new THREE.BoxGeometry(t*2,e,t*2);Project.visualBoundingBox=new THREE.LineSegments(new THREE.EdgesGeometry(n),new THREE.LineBasicMaterial({color:"#855000"})),Project.visualBoundingBox.position.set(0,e/2,0),scene.add(Project.visualBoundingBox)});var ss=Fy({id:Qt,dependencies:["animated-java:codec/blueprint"]},{name:A("format.blueprint.name"),icon:"icon-armor_stand",category:"animated_java",target:"Minecraft: Java Edition",confidential:!1,condition:()=>!0,show_on_start_screen:!0,format_page:{component:{template:`
`,mounted(){Gn({component:iT,target:`div[id="${Qt}/format_page_mount"]`})}}},onSetup(t,e){console.log("Animated Java Blueprint format setup");let n=Qs();e?(t.animated_java=n,t.last_used_export_namespace=""):t.animated_java={...n,...t.animated_java},t.pluginMode=new ke(t.animated_java.enable_plugin_mode),requestAnimationFrame(()=>{let i=ModelProject.all.indexOf(t),a=document.querySelectorAll("#tab_bar_list .project_tab")[i];if(!a){console.error("Could not find project tab for Animated Java Blueprint project!");return}a.querySelector("i")?.remove(),Gn({target:a,prepend:!0,component:oT,props:{pluginMode:t.pluginMode}});for(let r of Cube.all)r.setUVMode(!1),wS(r);Canvas.updateAll()})},animated_textures:!0,animation_controllers:!0,animation_files:!0,texture_mcmeta:!0,animation_mode:!0,bone_binding_expression:!0,bone_rig:!0,box_uv:!1,centered_grid:!0,display_mode:!1,edit_mode:!0,integer_size:!1,java_face_properties:!0,locators:!0,meshes:!1,model_identifier:!1,optional_box_uv:!0,paint_mode:!0,parent_model_id:!1,pose_mode:!1,render_sides:"front",rotate_cubes:!0,rotation_limit:!1,select_texture_for_particles:!1,single_texture:!1,texture_folder:!1,texture_meshes:!1,uv_rotation:!0,vertex_color_ambient_occlusion:!0,java_cube_shading_properties:!0,box_uv_float_size:!1,cullfaces:!0});Language.data["format_category.animated_java"]=A("format_category.animated_java");ss.onCreated(t=>{let e=Hr.get();if(!e)throw new Error("Animated Java Blueprint codec is not registered!");e.format=t,t.codec=e});function Fe(){return Format instanceof ModelFormat&&Format.id===Qt}s(Fe,"activeProjectIsBlueprintFormat");function aT(){let t=ss.get();if(!t)throw new Error("Animated Java Blueprint format is not registered!");newProject(t),requestAnimationFrame(()=>{Project.openSettings()})}s(aT,"createNewBlueprintProject");function xh(){if(!Project||!Format||!Fe())return;let t=Hr.get();if(!t)throw new Error("Animated Java Blueprint codec is not registered!");t.write(t.compile(),Project.save_path)}s(xh,"saveBlueprint");function Rr(t){return!compareVersions(t,Project.animated_java.target_minecraft_version)}s(Rr,"projectTargetVersionIsAtLeast");function oye(){return!!Group.first_selected||!!AnimatedJava.TextDisplay.selected.length||!!AnimatedJava.VanillaItemDisplay.selected.length||!!AnimatedJava.VanillaBlockDisplay.selected.length||!!(Array.isArray(OutlinerElement.types.locator?.selected)&&OutlinerElement.types.locator.selected.length)||!!(Array.isArray(OutlinerElement.types.camera?.selected)&&OutlinerElement.types.camera.selected.length)}s(oye,"hasNonElementSelection");function zf(){if(!Fe())return;let t=ss.get();if(!t){console.error("Animated Java Blueprint format is not registered!");return}t.rotation_limit=!oye(),Rr("1.21.6")||(t.rotation_snap=t.rotation_limit)}s(zf,"updateRotationConstraints");K.SELECT_PROJECT.subscribe(t=>{t.format.id===Qt&&K.SELECT_AJ_PROJECT.publish(t)});K.UNSELECT_PROJECT.subscribe(t=>{t.format.id===Qt&&K.UNSELECT_AJ_PROJECT.publish(t)});K.UPDATE_SELECTION.subscribe(zf);K.SELECT_AJ_PROJECT.subscribe(()=>{requestAnimationFrame(()=>{zf()})});K.UNSELECT_AJ_PROJECT.subscribe(t=>{t.visualBoundingBox&&scene.remove(t.visualBoundingBox)});function To(t){return new Tn(t.map(e=>new fn(e)))}s(To,"arrayToNbtFloatArray");function nb(t){let e=new THREE.Matrix4().copy(t).transpose().toArray().map(n=>Ja(n,4));return To(e)}s(nb,"matrixToNbtFloatArray");function lS(t){let e=new ot;return e.set("translation",To(t.translation.toArray())),e.set("left_rotation",To(t.left_rotation.toArray())),e.set("scale",To(t.scale.toArray())),e}s(lS,"transformationToNbt");function Wd(t,e,n){return t.split(PathModule.sep).map(i=>i===e?n:i).join(PathModule.sep)}s(Wd,"replacePathPart");function gh(t){let e={};return Object.keys(t).sort().forEach(n=>{e[n]=t[n]}),e}s(gh,"sortObjectKeys");var kS=s((t,e)=>new Promise((n,i)=>{nT(t,e,(a,r)=>{a?i(a):n(r)})}),"unzip");function Ad(t){let e=t.rotation[0]+t.rotation[1]+t.rotation[2];if(e===0)return"valid";let n=e===t.rotation[0]||e===t.rotation[1]||e===t.rotation[2];return n&&Rr("1.21.6")?e<=45&&e>=-45?"1.21.6+":"invalid":n&&(e===-45||e===-22.5||e===0||e===22.5||e===45)?"valid":"invalid"}s(Ad,"isCubeValid");async function b4(){return new Promise(t=>requestAnimationFrame(t))}s(b4,"sleepForAnimationFrame");var jS=ij;async function sye(t,e){fj("Downloading Minecraft Assets...");let n=await(0,AS.default)(t,{retry:{retries:3}}).on("downloadProgress",i=>{mj(i.percent*100)}).catch(i=>{console.error("Failed to download Minecraft client:",i)});if(!n)throw G0(),new Error("Failed to download Minecraft client after 3 retries.");await fs.promises.writeFile(e,new Uint8Array(n))}s(sye,"downloadJar");async function yh(){let t=3,e=await no();for(t=3;t-->=0;){let n;try{n=await fetch(e.url)}catch(i){console.error("Failed to fetch latest Minecraft version API:",i)}if(n?.ok){let i=await n.json();if(!i?.downloads?.client)throw new Error(`Failed to find client download for ${e.id}`);return i.downloads.client.url}}throw new Error("Failed to fetch latest Minecraft version API after 3 retries.")}s(yh,"getLatestVersionClientDownloadUrl");function ob(){let t=electron.app.getPath("userData");return PathModule.join(t,`${Ke.name}/latest.jar`)}s(ob,"getCachedJarFilePath");async function bh(){localStorage.setItem("assetsLoaded","false");let t=await yh();console.log("Downloading latest Minecraft client:",t);let e=ob();await fs.promises.mkdir(PathModule.dirname(e),{recursive:!0}),await sye(t,e),console.log("Downloaded latest Minecraft client:",e)}s(bh,"updateAssets");async function Ux(){console.log("Checking for Minecraft assets update...");let t=Il();if(!t)console.log("No current Minecraft version found, updating assets..."),await bh();else{let n=await no();t.id!==n.id&&(console.log("Minecraft assets are outdated, updating..."),await bh())}let e=ob();(!fs.existsSync(e)||localStorage.getItem("assetsLoaded")!=="true")&&(console.log("No cached Minecraft client found, updating assets..."),await bh()),console.log("Does file exist?",fs.existsSync(e)),console.log("Are assets loaded?",localStorage.getItem("assetsLoaded")==="true"),await TS(),console.log("Minecraft assets are up to date!"),localStorage.setItem("assetsLoaded","true"),requestAnimationFrame(()=>K.MINECRAFT_ASSETS_LOADED.publish())}s(Ux,"checkForAssetsUpdate");var Uc;async function TS(){let t=ob(),e=await fs.promises.readFile(t);Uc=await kS(new Uint8Array(e),{filter:n=>n.name.startsWith("assets/")})}s(TS,"extractAssets");async function Qo(){return new Promise(t=>{Uc!==void 0?t():K.MINECRAFT_ASSETS_LOADED.subscribe(()=>t(),!0)})}s(Qo,"assetsLoaded");function Lx(t){if(!Uc)throw new Error("Assets not loaded");return!!Uc[t]}s(Lx,"hasAsset");function sb(t){if(!Uc)throw new Error("Assets not loaded");if(jS[t])return Buffer.from(jS[t]);let e=Uc[t];if(!e)throw new Error(`Asset not found: ${t}`);return Buffer.from(e)}s(sb,"getRawAsset");function Zo(t){let e=sb(t);if(!e)throw new Error(`Asset not found: ${t}`);return`data:image/png;base64,${e.toString("base64")}`}s(Zo,"getPngAssetAsDataUrl");function Mi(t){let e=sb(t);if(!e)throw new Error(`Asset not found: ${t}`);let n=e.toString("utf-8");try{return JSON.parse(n)}catch(i){throw console.error(`Failed to parse JSON asset from ${t}:`,n,i),i}}s(Mi,"getJSONAsset");K.PLUGIN_LOAD.subscribe(()=>{window.navigator.onLine||G0(),K.NETWORK_CONNECTED.publish(),dj(),Promise.all([new Promise(t=>K.MINECRAFT_ASSETS_LOADED.subscribe(t)),new Promise(t=>K.MINECRAFT_REGISTRY_LOADED.subscribe(t)),new Promise(t=>K.MINECRAFT_FONTS_LOADED.subscribe(t)),new Promise(t=>K.BLOCKSTATE_REGISTRY_LOADED.subscribe(t))]).then(()=>{pj()}).catch(t=>{console.error(t),Blockbench.showToastNotification({text:"Animated Java failed to load! Please restart Blockbench",color:"var(--color-error)"})})});var lye="abcdefghijklmnopqrstuvwxyz0123456789",cye="\u1D00\u0299\u1D04\u1D05\u1D07\uA730\u0262\u029C\u026A\u1D0A\u1D0B\u029F\u1D0D\u0274\u1D0F\u1D18\uA7AF\u0280\uA731\u1D1B\u1D1C\u1D20\u1D21x\u028F\u1D22\u2070\xB9\xB2\xB3\u2074\u2075\u2076\u2077\u2078\u2079";function Ca(t){let e="";for(let n of t){let i=lye.indexOf(n.toLowerCase());i!==-1?e+=cye[i]:e+=n}return e}s(Ca,"toSmallCaps");function Kt(t){return t.toLowerCase().replace(/[^a-z0-9_]+/g,"_")}s(Kt,"sanitizeStorageKey");function Fr(t,e){let[n,...i]=t.split(":");if(!n)throw new Error(`Invalid resource location: '${t}'`);return i.length===0&&(i=[n],n="minecraft"),`assets/${n}/${e}/${i.join("/")}`}s(Fr,"getPathFromResourceLocation");function qr(t){let e=Sa(t);return!!(e?.namespace&&e.resourcePath)}s(qr,"isResourcePackPath");function Sa(t){t=t.replaceAll(/\\/g,"/");let e=t.split("/"),n=e.indexOf("assets");if(n===-1)return;let i=e.slice(0,n).join("/"),a=e[n+1],r=e[n+2],o=e.slice(n+3,-1).join("/"),l=qc.basename(t).split(".").slice(0,-1).join(".");if(l!==l.toLowerCase())return;let c=(a+":"+PathModule.join(o,l)).replaceAll(/\\/g,"/"),d=e.slice(n+4).join("/");return{packRoot:i,namespace:a,resourcePath:o,resourceLocation:c,subtypelessPath:d,fileName:l,fileExtension:qc.extname(t),type:r}}s(Sa,"parseResourcePackPath");function bc(t){let[e,...n]=t.split(":");n.length===0&&(n=[e],e="minecraft");let i=n.join(""),a=i.split("/")[0],r=PathModule.parse(i),o=PathModule.join(e,i);return{namespace:e,path:i,fullPath:o,type:a,dir:r.dir,name:r.name}}s(bc,"parseResourceLocation");function CS(t){let e=Vc(t);return!!(e?.namespace&&e.resourcePath)}s(CS,"isDataPackPath");function Vc(t){t=t.replaceAll(/\\/g,"/");let e=t.split("/"),n=e.indexOf("data");if(n===-1)return;let i=e.slice(0,n).join("/"),a=e[n+1],r=e[n+2],o;switch(r){case"tags":o=e.slice(n+4,-1).join("/");break;default:o=e.slice(n+3,-1).join("/");break}let l=qc.basename(t).split(".").slice(0,-1).join(".");if(l!==l.toLowerCase())return;let c=(a+":"+PathModule.join(o,l)).replaceAll(/\\/g,"/"),d=e.slice(n+4).join("/");return{packRoot:i,namespace:a,resourcePath:o,resourceLocation:c,subtypelessPath:d,fileName:l,fileExtension:qc.extname(t),type:r}}s(Vc,"parseDataPackPath");var Ii=class{replace=!1;values=[];has(e){let n=Ii.getEntryId(e);return this.values.some(i=>Ii.getEntryId(i)===n)}add(e){this.get(e)||this.values.push(e)}get(e){let n=Ii.getEntryId(e);return this.values.find(i=>Ii.getEntryId(i)===n)}filter(e){return this.values=this.values.filter(e),this}merge(e){this.replace=e.replace;for(let n of e.values)this.add(n);return this}sort(){return this.values.sort((e,n)=>{let i=Ii.getEntryId(e),a=Ii.getEntryId(n);return i==="animated_java:global/on_tick"?1:a==="animated_java:global/on_tick"?-1:i.localeCompare(a,"en")}),this}static getEntryId(e){return typeof e=="string"?e:e.id}static fromJSON(e){let n=new Ii;return typeof e.replace=="boolean"&&(n.replace=e.replace),Array.isArray(e.values)&&(n.values=structuredClone(e.values)),n}toJSON(){return{replace:this.replace,values:structuredClone(this.values)}}};s(Ii,"DataPackTag");function Zs(t,e){return t==="true"?!0:t==="false"?!1:isNaN(Number(t))?e&&t.includes("|")?t.split("|").map(n=>n==="true"?!0:n==="false"?!1:isNaN(Number(n))?n:Number(n)):t:Number(t)}s(Zs,"resolveBlockstateValueType");async function bf(t){if(!Xn.item){await Qo();return}let[e,n]=t.split(":");return n||(n=e,e="minecraft"),(e==="minecraft"||e==="")&&Xn.item.has(n)?"":`This item does not exist in Minecraft ${Il().id}.`}s(bf,"validateItem");async function vf(t){Xn.block||await Qo();let e=await wd(t);return e?(e.resource.namespace==="minecraft"||e.resource.namespace==="")&&Xn.block.has(e.resource.name)?Bx(e):`This block does not exist in Minecraft ${Il().id}.`:"Invalid block ID."}s(vf,"validateBlock");async function wd(t){let e={};if(t.includes("[")){let i=/(.+?)\[((?:[^,=[\]]+=[^,=[\]]+,?)+)?]/.exec(t);if(!i)return;if(i[2]!==void 0){let a=i[2].split(",");for(let r of a){let[o,l]=r.trim().split("=");e[o]=Zs(l,!1)}}t=i[1]}let n=bc(t);return{resource:n,resourceLocation:n.namespace+":"+n.path,states:e,blockStateRegistryEntry:await wc(n.name)}}s(wd,"parseBlock");function Jd(t){switch(t){case"1.20.4":return 26;case"1.20.5":return 41;case"1.21.2":return 57;case"1.21.4":return 61;case"1.21.5":return 71;case"1.21.6":return 80;case"1.21.9":return 88;default:return console.warn(`Unknown Minecraft version: ${t}`),1/0}}s(Jd,"getDataPackFormat");function ab(t){switch(t){case"1.20.4":return 22;case"1.20.5":return 32;case"1.21.2":return 42;case"1.21.4":return 46;case"1.21.5":return 55;case"1.21.6":return 63;case"1.21.9":return 69;default:return console.warn(`Unknown Minecraft version: ${t}`),1/0}}s(ab,"getResourcePackFormat");function fh(t){let e=Object.values(vh),n=e.indexOf(t);if(!(n===-1||n===e.length-1))return e[n+1]}s(fh,"getNextSupportedVersion");function uye(t){let e,n,i,a,r;return{c(){e=L("p"),e.textContent=`${A("action.upgrade_old_aj_model_loader.body")}`,n=J(),i=L("button"),i.textContent=`${A("action.upgrade_old_aj_model_loader.button")}`,E(i,"class","svelte-16p5p64")},m(o,l){U(o,e,l),U(o,n,l),U(o,i,l),a||(r=Ue(i,"click",lb),a=!0)},p:ie,i:ie,o:ie,d(o){o&&z(e),o&&z(n),o&&z(i),a=!1,r()}}}s(uye,"create_fragment");var wh=class extends Pe{constructor(e){super(),Ve(this,e,null,uye,De,{})}};s(wh,"FormatPage");var SS=wh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("button.svelte-16p5p64{width:100%;height:40px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var cb=!1;async function lb(){if(cb)return;cb=!0;let t=await electron.dialog.showOpenDialog({properties:["openFile"],filters:[{name:".ajmodel",extensions:["ajmodel"]}],message:A("action.upgrade_old_aj_model_loader.select_file")});cb=!1,!t.canceled&&dye(t.filePaths[0])}s(lb,"openAJModel");function dye(t){try{console.log(`Converting .ajmodel: ${t}`);let e=yf(JSON.parse(fs.readFileSync(t,"utf8"))),n=Hr.get();if(!n)throw new Error("Animated Java Blueprint codec is not registered!");n.load(e,{name:"Upgrade .ajmodel to Blueprint",path:t}),e.blueprint_settings.export_namespace??=Kt(Project.name),requestAnimationFrame(()=>{Project.save_path="",Project.export_path="",Project.openSettings()})}catch(e){console.error(e),Fo(e)}}s(dye,"convertAJModelToBlueprint");My({id:"animated-java:upgrade-aj-model-loader"},{icon:"upload_file",category:"animated_java",name:A("action.upgrade_old_aj_model_loader.name"),condition:!0,format_page:{component:{template:'
',mounted(){Gn({component:SS,target:"#animated-java\\:upgrade-aj-model-loader-target",injectIndex:2})}}},onStart:lb});async function Eh(){let t=Project.animated_java,{resourcePackFolder:e,dataPackFolder:n}=rb();if(t.resource_pack_export_mode==="folder"){let i=PathModule.join(e,"assets.ajmeta"),a=new Ur(i,t.export_namespace,Project.last_used_export_namespace,e);a.read();let r=new Set;for(let o of a.previousVersionedFiles){if(!Ec(o))fs.existsSync(o)&&await fs.promises.unlink(o);else if(t.export_namespace!==Project.last_used_export_namespace&&Vc(o).resourceLocation.startsWith(`animated_java:${Project.last_used_export_namespace}/`)&&fs.existsSync(o)){let d=Wd(o,Project.last_used_export_namespace,t.export_namespace);await fs.promises.mkdir(PathModule.dirname(d),{recursive:!0}),await fs.promises.copyFile(o,d),await fs.promises.unlink(o)}let l=PathModule.dirname(o);for(;!r.has(l)&&fs.existsSync(l)&&(await fs.promises.readdir(l)).length===0&&(await fs.promises.rm(l,{recursive:!0}),r.add(l),l=PathModule.dirname(l),PathModule.basename(l)!=="assets"););}a.write()}if(t.data_pack_export_mode==="folder"){let i=PathModule.join(n,"data.ajmeta"),a=new Ur(i,t.export_namespace,Project.last_used_export_namespace,n);a.read();let r=new Set;for(let o of[...a.previousCoreFiles,...a.previousVersionedFiles]){if(Ec(o)&&fs.existsSync(o)){if(t.export_namespace!==Project.last_used_export_namespace&&Vc(o).resourceLocation.startsWith(`animated_java:${Project.last_used_export_namespace}/`)){let u=Wd(o,Project.last_used_export_namespace,t.export_namespace);await fs.promises.mkdir(PathModule.dirname(u),{recursive:!0}),await fs.promises.copyFile(o,u),await fs.promises.unlink(o)}let c=JSON.parse((await fs.promises.readFile(o)).toString());c.values=c.values.filter(d=>typeof d=="string"&&(!d.startsWith(`animated_java:${t.export_namespace}/`)||!d.startsWith(`animated_java:${Project.last_used_export_namespace}/`))),await fs.promises.writeFile(o,autoStringify(c))}else fs.existsSync(o)&&await fs.promises.unlink(o);let l=PathModule.dirname(o);for(;!r.has(l)&&fs.existsSync(l)&&(await fs.promises.readdir(l)).length===0&&(await fs.promises.rm(l,{recursive:!0}),r.add(l),l=PathModule.dirname(l),PathModule.basename(l)!=="data"););}a.write()}Blockbench.showQuickMessage("Exported files extracted successfully!",2e3)}s(Eh,"cleanupExportedFiles");var ub={"1.6.0":{title:"v1.6.0",author:"Titus Evans (SnaveSutit)",date:"2025-01-08",categories:[{title:"Changes",list:["[BREAKING] Changed default resource pack structure: `animated_java:textures/item/export_namespace/` -> `animated_java:textures/blueprint/export_namespace/` & `animated_java:models/item/export_namespace/` -> `animated_java:models/blueprint/export_namespace/`","Added changelog popup! (You're looking at it right now!)","Added an export target for Minecraft 1.21.4","Added support for item definitions (1.21.4)","Added warning for loading Animated Java Data Packs in the wrong version.","Improved internal MCB File compression","Slightly improved empty JSON text rendering ([#322](https://github.com/Animated-Java/animated-java/issues/322)","Added an Extract action to remove exported files from the Resource Pack and Data Pack","Changed missing assets and data folder for resource and data pack folder settings errors into warnings","Added a dialog and exception for exporting a blueprint with invalid cube rotations."]},{title:"Fixes",list:["Fixed tags getting cleared out in old exports","Fixed incorrect export location for transparent texture.","Fixed Per-Face UV not being enforced when converting","Fixed [#348](https://github.com/Animated-Java/animated-java/issues/348)","Fixed [#349](https://github.com/Animated-Java/animated-java/issues/349)","Fixed [#347](https://github.com/Animated-Java/animated-java/issues/347)","Fixed [#345](https://github.com/Animated-Java/animated-java/issues/345)","Fixed [#341](https://github.com/Animated-Java/animated-java/issues/341)","Fixed [#343](https://github.com/Animated-Java/animated-java/issues/343)","Fixed [#340](https://github.com/Animated-Java/animated-java/issues/340)","Fixed [#342](https://github.com/Animated-Java/animated-java/issues/342)"]}]},"1.6.1":{title:"v1.6.1",author:"Titus Evans (SnaveSutit)",date:"2025-01-10",categories:[{title:"Changes",list:["Slightly improved the changelog."]},{title:"Fixes",list:["Fixed overlays breaking custom function tags.","Fixed [#350](https://github.com/Animated-Java/animated-java/issues/350)","Fixed [#353](https://github.com/Animated-Java/animated-java/issues/353)"]}]},"1.6.2":{title:"v1.6.2",author:"Titus Evans (SnaveSutit)",date:"2025-01-12",categories:[{title:"Changes",list:["[BREAKING] Implemented improved scoreboard tag system. Please visit [this docs page](https://animated-java.dev/docs/rigs/tags) on the Animated Java website to learn more.","[BREAKING] Removed individual variant summon functions. (`animated_java:namespace/summon/variant_name`) in favor of `animated_java:namespace/summon {args:{variant: 'variant_name'}}`.","[BREAKING] Removed advanced folder options for Resource Packs.","Re-organized the file structure of AJ's UI files.","Updated the model format order on the start menu to be organized alphabetically.","Added incomptaibility warnings for installing, or having installed, plugins that are incompatible with Animated Java."]},{title:"Fixes",list:["Fixed some visual and interactivity issues with the Variants panel.","Fixed default Variant UUID changing every time a model is opened.",'Fixed "Display entity is not a string" console spam',"Fixed 1.21.2 using `custom_model_data` instead of `item_model`","Fixed [#304](https://github.com/Animated-Java/animated-java/issues/304)","Fixed [#356](https://github.com/Animated-Java/animated-java/issues/356)","Fixed [#357](https://github.com/Animated-Java/animated-java/issues/357)","Fixed [#358](https://github.com/Animated-Java/animated-java/issues/358)","Fixed [#359](https://github.com/Animated-Java/animated-java/issues/359)"]}]},"1.6.3":{title:"v1.6.3",author:"Titus Evans (SnaveSutit)",date:"2025-01-15",categories:[{title:"Changes",list:["Updated to Blockbench 4.12.0","Removed internal Transparent texture. The plugin will automatically create a transparent texture in your model's texture list if you previously used the internal one in any of your variants."]},{title:"Fixes",list:["Fixed invalid JSON error when exporting into a resource pack without a block texture atlas."]}]},"1.6.4":{title:"v1.6.4",author:"Titus Evans (SnaveSutit)",date:"2025-01-19",categories:[{title:"Fixes",list:['Fixed "safe_name" export crash.',"Fixed double v prefix in About dialog."]}]},"1.7.0":{title:"v1.7.0",author:"Titus Evans (SnaveSutit)",date:"2025-04-30",categories:[{title:"Changes",list:["[BREAKING] Overhauled internal functions and data structures. This may cause some issues with older exports, so you should clean out your old AJ exports and re-export them.","[BREAKING] Renamed `animated_java:/as_own_locator_entities` to `animated_java:/as_all_locators`.","Added support for Minecraft 1.21.5.","Added support for exporting to multiple target Minecraft versions at once.","Reduced the size of exported Data Packs by about 50%.","Added `Sync Passenger Rotation` config option to Locators.","Added a new function: `animated_java:/at_all_locators {command: string}` that runs a command at all of a rig's entity-less locator positions.","Added a new function: `animated_java:/as_locator {name: string, command: string}` that runs a command as and at a named locator's entity.","Added a new function: `animated_java:/at_locator {name: string, command: string}` that runs a command at an entity-less locator's position.","Added a new function: `animated_java:/as_camera {name: string, command: string}` that runs a command as and at a camera's entity.","Added a new function: `animated_java:/remove/entities` that kills all entities owned by a rig, whether they are attached to a root entity or not.","Added a new Blueprint setting: `On-Remove Commands`.","Added support for `shadow_color` to JSON Text Components.","Temporarily made all descriptions of settings appear below settings."]},{title:"Fixes",list:["Fixed project settings leaking between opened `.ajblueprints`.","Fixed textures being forcfully set as internal when saving an `.ajblueprint`.","Fixed `tints` field being placed in the wrong location in exported item model definitions.","Fixed bone rotation not being synced with the root entity when a rig is exported without animations.","Fixed data entity being tagged with GLOBAL_NODE instead of GLOBAL_ENTITY.","Fixed added missing tag PROJECT_ENTITY to data entities.","Fixed locators and cameras missing most of their tags.","Fixed missing PROJECT_ENTITY tag on root entities.","Fixed backslash (\\) being allowed in node names.","Fixed locators not being removed when calling `animated_java:global/remove/everything`.","Fixed crash while exporting when encountering an invalid JSON file in the target data pack.","Fixed [#389](https://github.com/Animated-Java/animated-java/issues/389)","Fixed custom outliner element changes not marking a project as changed."]}]},"1.7.1":{title:"v1.7.1",author:"Titus Evans (SnaveSutit)",date:"2025-05-06",categories:[{title:"Fixes",list:["Fixed [#412](https://github.com/Animated-Java/animated-java/issues/409)"]}]},"1.7.2":{title:"v1.7.2",author:"Titus Evans (SnaveSutit)",date:"2025-05-07",categories:[{title:"Fixes",list:["Fixed incorrect entity type for data entities on versions below 1.21.5.","Fixed missing `as_...` functions in exported data packs below 1.21.5.","Improved .mcb code consistency."]}]},"1.7.3":{title:"v1.7.3",author:"Titus Evans (SnaveSutit)",date:"2025-05-08",categories:[{title:"Fixes",list:["Fixed adding cameras to a rig causing the data entity to dismount root.","Make variant keyframes reset to default if their variant doesn't exist anymore."]}]},"1.8.0-beta.1":{title:"v1.8.0-beta.1",author:"Titus Evans (SnaveSutit)",date:"2025-10-13",categories:[{title:"Changes",list:["[BREAKING] `play` and `stop` functions now pause all animations when called.","[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.","[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.","Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.","Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)","Added support for Minecraft 1.21.6 and 1.21.9","Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)","Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.","Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.","Added a button to copy the exported JSON Text component of a Text Display to your clipboard.","Updated keyframe UI, making it much more responsive, and easier to use.","Added support for `light_emission` on cubes.","The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.","Improved Text Display JSON text input syntax highlighting.","Improved Text Display JSON text input appearance.","Improved JSON Text component parsing and error reporting.","Improved all function errors and tellraws in exported Data Packs.","Improved outdated warning formatting and functionality.","Improved text display rendering performance, and update reactivity.","Display item is no longer configurable in versions that use `item_model` (1.20.5+).","The `summon` function now provides better feedback when using invalid arguments.","Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.","Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.","Increased width of all node configs from 400px to 600px.","Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.","Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.","Renamed all 'Commands' settings to 'Function'.","Renamed 'On-Tick Function' to 'Post-Tick Function'.","Added 'Pre-Tick Function' Blueprint setting.","Renamed `raw` export mode to `folder`.","Added new Blueprint setting: 'Auto Update Rig Orientation'.","Added `animated_java:/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.","Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.","Reduced the number of times the orientation of locators and cameras is updated while animating.","Improved performance of `fontManager` char mesh rendering.","Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.","Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.","Improved plugin incompatibility warnings."]},{title:"Fixes",list:["Fixed a few minor Text Display text wrapping issues.","Fixed display entities causing collections to break.","Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)","Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)","Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)","Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)","Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)","Fixed GU failing on first load due to missing scoreboard dependency.","Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)","Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)","Fixed Text Display JSON text input not catching tab key presses.","Fixed outdated rig warning not working in some cases.","Fixed outdated rig warning entities missing important tags.","Fixed missing translations for install popup.","Fixed function tag merging not working correctly.","Fixed missing `item_display` NBT tag on exported Item Displays.","Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.","Fixed project save status not updating when modifying node configs.","Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)","Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)","Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)","Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.","Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)","Fixed invalid cube warning not updating when editing cubes.","Fixed relative paths not being recognized on windows.","Fixed `set_frame` failing due to incorrect tag in entity selector.","Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.","Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.","Fixed animation config dialog not marking project as unsaved after making changes.","Fixed variants panel animating when switching between projects.","Fixed `ajmodel` upgrader not opening when double clicked"]},{title:"Camera Fixes",list:["Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)","Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)","Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)","Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)","Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)","Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)"]},{title:"Internal Data Pack Changes and Fixes",list:["Updated to the latest version of MC-Build.","Added support for `.mcbt` files to the Data Pack compiler.","Reduced entity data size by reducing the length of locator and camera transform keys.","Removed `global/internal` folder.","Expanded all `aj` namespaces to `animated_java` except tags.","Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.","Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.","Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.","`.mcb` files now use more descriptive variable names.","Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.","Reduced overhead when generating variant functions.","Switched over to using variables for storage names.","Renamed `on_summon_commands` -> `on_summon_function`.","Renamed `on_remove_commands` -> `on_remove_function`.","Renamed `ticking_commands` -> `on_post_tick_function`.","Moved some ticking and loading functionality out of individual namespaces and into global.","Added `debug` macro to reduce code duplication.","Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.","Replaced all `arguments[1]` references with new `context` variable."]},{title:"Other Changes and Fixes",list:["Most enum-like values are now using TS enums.","Removed config functionality from cameras entirely.","Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.","Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.","`AnimatedJava.API` global has been renamed to `AnimatedJava`.","Improve handling of Text and Block Display entity NBT when generating root entity passengers.","Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.","Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.","`.mcb` files now use more descriptive variable names.","`assetManager.getRawAsset` now returns a Buffer.","Fixed broken Animated Java bar item condition.","Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.","Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.","Improve `ModelDataFixerUpper` types, logic flow, and error handling.","Add `ModelDataFixerUpper` upgrade function for v1.8.0.","Made `TELLRAW.RIG_OUTDATED` runtime-generic."]}]},"1.8.0-beta.2":{title:"v1.8.0-beta.2",author:"Titus Evans (SnaveSutit)",date:"2025-10-15",categories:[{title:"Changes",list:["[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.","[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.","Replaced unique node configs with universal DisplayEntityConfig.","Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.","Added 'On Summon Function' to Display Entity Configs.","Added 'On Apply Function' to Per-variant Display Entity Configs.","Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.","Improved the Render Box preview's reactivity."]},{title:"Fixes",list:["Fixed rotation validation not checking the correct version, and marking any rotation as invalid.","Fixed Blueprints becoming unsavable after opening.","Fixed Blueprints becoming unsavable after converting from another format.","Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.","Fixed uncaught error when deleting a text display.","Fixed outdated warning not appearing until the second reload after rig_hash was modified.","Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data."]}]},"1.8.0-beta.3":{title:"v1.8.0-beta.3",author:"Titus Evans (SnaveSutit)",date:"2025-10-15",categories:[{title:"Fixes",list:["Fixed On-Summon Functions and On-Apply Functions not functioning."]}]},"1.8.0-beta.4":{title:"v1.8.0-beta.4",author:"Titus Evans (SnaveSutit)",date:"2025-10-16",categories:[{title:"Fixes",list:["Fixed Blueprint format data fixer uppper failing to upgrade Blueprints past format version 1.6.5.","Fixed outdated rig function failing due to incorrect root tag."]}]},"1.8.0-beta.5":{title:"v1.8.0-beta.5",author:"Titus Evans (SnaveSutit)",date:"2025-10-19",categories:[{title:"Fixes",list:["Fixed cube rotations in 1.21.6+ allowing rotation values outside the -45..45 degree range","Fixed rotation limits not being enforced when converting to a Blueprint.","Fixed rotation limit not being enforced when rotating cubes.","Fixed export crash due to invalid tag reference."]}]},"1.8.0":{title:"v1.8.0",author:"Titus Evans (SnaveSutit)",date:"2025-10-21",categories:[{title:"Changes",list:["[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.","[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.","[BREAKING] `play` and `stop` functions now pause all animations when called.","[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.","[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.","Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.","Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)","Added support for Minecraft 1.21.6 and 1.21.9","Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)","Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.","Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.","Added a button to copy the exported JSON Text component of a Text Display to your clipboard.","Updated keyframe UI, making it much more responsive, and easier to use.","Added support for `light_emission` on cubes.","Replaced unique node configs with universal DisplayEntityConfig.","Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.","Added 'On Summon Function' to Display Entity Configs.","Added 'On Apply Function' to Per-variant Display Entity Configs.","Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.","Improved the Render Box preview's reactivity.","The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.","Improved Text Display JSON text input syntax highlighting.","Improved Text Display JSON text input appearance.","Improved JSON Text component parsing and error reporting.","Improved all function errors and tellraws in exported Data Packs.","Improved outdated warning formatting and functionality.","Improved text display rendering performance, and update reactivity.","Display item is no longer configurable in versions that use `item_model` (1.20.5+).","The `summon` function now provides better feedback when using invalid arguments.","Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.","Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.","Increased width of all node configs from 400px to 600px.","Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.","Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.","Renamed all 'Commands' settings to 'Function'.","Renamed 'On-Tick Function' to 'Post-Tick Function'.","Added 'Pre-Tick Function' Blueprint setting.","Renamed `raw` export mode to `folder`.","Added new Blueprint setting: 'Auto Update Rig Orientation'.","Added `animated_java:/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.","Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.","Reduced the number of times the orientation of locators and cameras is updated while animating.","Improved performance of `fontManager` char mesh rendering.","Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.","Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.","Improved plugin incompatibility warnings."]},{title:"Fixes",list:["Fixed a few minor Text Display text wrapping issues.","Fixed display entities causing collections to break.","Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)","Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)","Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)","Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)","Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)","Fixed GU failing on first load due to missing scoreboard dependency.","Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)","Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)","Fixed Text Display JSON text input not catching tab key presses.","Fixed outdated rig warning not working in some cases.","Fixed outdated rig warning entities missing important tags.","Fixed missing translations for install popup.","Fixed function tag merging not working correctly.","Fixed missing `item_display` NBT tag on exported Item Displays.","Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.","Fixed project save status not updating when modifying node configs.","Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)","Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)","Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)","Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.","Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)","Fixed invalid cube warning not updating when editing cubes.","Fixed relative paths not being recognized on windows.","Fixed `set_frame` failing due to incorrect tag in entity selector.","Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.","Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.","Fixed animation config dialog not marking project as unsaved after making changes.","Fixed variants panel animating when switching between projects.","Fixed `ajmodel` upgrader not opening when double clicked.","Fixed rotation validation not checking the correct version, and marking any rotation as invalid.","Fixed Blueprints becoming unsavable after opening.","Fixed Blueprints becoming unsavable after converting from another format.","Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.","Fixed uncaught error when deleting a text display.","Fixed Blueprint format data fixer upper failing to upgrade Blueprints past format version 1.6.5.","Fixed outdated warning not appearing until the second reload after rig_hash was modified.","Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data."]},{title:"Camera Fixes",list:["Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)","Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)","Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)","Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)","Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)","Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)"]},{title:"Internal Data Pack Changes and Fixes",list:["Updated to the latest version of MC-Build.","Added support for `.mcbt` files to the Data Pack compiler.","Reduced entity data size by reducing the length of locator and camera transform keys.","Removed `global/internal` folder.","Expanded all `aj` namespaces to `animated_java` except tags.","Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.","Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.","Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.","`.mcb` files now use more descriptive variable names.","Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.","Reduced overhead when generating variant functions.","Switched over to using variables for storage names.","Renamed `on_summon_commands` -> `on_summon_function`.","Renamed `on_remove_commands` -> `on_remove_function`.","Renamed `ticking_commands` -> `on_post_tick_function`.","Moved some ticking and loading functionality out of individual namespaces and into global.","Added `debug` macro to reduce code duplication.","Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.","Replaced all `arguments[1]` references with new `context` variable.","Fixed outdated rig function failing due to incorrect root tag."]},{title:"Other Changes and Fixes",list:["Most enum-like values are now using TS enums.","Removed config functionality from cameras entirely.","Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.","Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.","`AnimatedJava.API` global has been renamed to `AnimatedJava`.","Improve handling of Text and Block Display entity NBT when generating root entity passengers.","Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.","Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.","`.mcb` files now use more descriptive variable names.","`assetManager.getRawAsset` now returns a Buffer.","Fixed broken Animated Java bar item condition.","Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.","Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.","Improve `ModelDataFixerUpper` types, logic flow, and error handling.","Add `ModelDataFixerUpper` upgrade function for v1.8.0.","Made `TELLRAW.RIG_OUTDATED` runtime-generic."]}]},"1.8.1":{title:"v1.8.1",author:"Titus Evans (SnaveSutit)",date:"2025-11-2",categories:[{title:"Changes",list:["\u{1F4AC} Added Russian localization - Thanks Koishem!","Added previewing for Item Display's `item_display` transforms."]},{title:"Fixes",list:["Fixed [#465](https://github.com/Animated-Java/animated-java/issues/465)","Fixed `global/on_tick` function being placed at start of `minecraft:tick` function tag.","Fixed backwards / missing chest model.","Fixed block models on Item Displays using the wrong pivot point.","Fixed item display panel losing focus when a valid item is entered."]}]}};function OS(t,e,n){let i=t.slice();return i[0]=e[n],i}s(OS,"get_each_context");function IS(t,e,n){let i=t.slice();return i[3]=e[n],i}s(IS,"get_each_context_1");function DS(t,e,n){let i=t.slice();i[6]=e[n];let a=/^Fixed \[#(\d+)\]\(.+?\)$/.exec(i[6]);return i[7]=a,i}s(DS,"get_each_context_2");function mye(t){let e,n,i=pureMarked(t[6])+"",a;return{c(){e=L("li"),n=new Yi(!1),a=J(),n.a=a},m(r,o){U(r,e,o),n.m(i,e),I(e,a)},p:ie,d(r){r&&z(e)}}}s(mye,"create_else_block_1");function fye(t){let e,n,i,a,r,o=pureMarked(t[6].replace("[BREAKING]","").trim())+"",l;return{c(){e=L("li"),n=L("p"),i=L("span"),i.textContent="BREAKING",a=J(),r=new Yi(!1),l=J(),E(i,"class","breaking"),r.a=null,E(n,"class","svelte-1hhexqb"),E(e,"class","svelte-1hhexqb")},m(c,d){U(c,e,d),I(e,n),I(n,i),I(n,a),r.m(o,n),I(e,l)},p:ie,d(c){c&&z(e)}}}s(fye,"create_if_block_2");function hye(t){let e,n,i={ctx:t,current:null,token:null,hasCatch:!0,pending:bye,then:_ye,catch:gye,value:10};return a1(n=kye(t[7][1]),i),{c(){e=_t(),i.block.c()},m(a,r){U(a,e,r),i.block.m(a,i.anchor=r),i.mount=()=>e.parentNode,i.anchor=e},p(a,r){t=a,r1(i,t,r)},d(a){a&&z(e),i.block.d(a),i.token=null,i=null}}}s(hye,"create_if_block");function gye(t){let e,n=pureMarked(t[6])+"",i;return{c(){e=L("li"),i=J()},m(a,r){U(a,e,r),e.innerHTML=n,U(a,i,r)},p:ie,d(a){a&&z(e),a&&z(i)}}}s(gye,"create_catch_block");function _ye(t){let e,n,i="Fixed ",a,r,o;function l(u,p){return u[10]?vye:xye}s(l,"select_block_type_1");let d=l(t,-1)(t);return{c(){e=L("li"),n=L("p"),a=Re(i),r=J(),d.c(),o=J(),E(n,"class","svelte-1hhexqb"),E(e,"class","svelte-1hhexqb")},m(u,p){U(u,e,p),I(e,n),I(n,a),I(n,r),d.m(n,null),U(u,o,p)},p(u,p){d.p(u,p)},d(u){u&&z(e),d.d(),u&&z(o)}}}s(_ye,"create_then_block");function xye(t){let e,n="#"+t[7][1],i,a;return{c(){e=L("a"),i=Re(n),E(e,"href",a="$"+(MS+t[7][1])),E(e,"target","_blank")},m(r,o){U(r,e,o),I(e,i)},p:ie,d(r){r&&z(e)}}}s(xye,"create_else_block");function vye(t){let e,n="#"+t[10].number,i,a,r,o=" - ",l,c,d,u=pureMarked(t[10].title)+"",p;return{c(){e=L("a"),i=Re(n),r=J(),l=Re(o),c=J(),d=new Yi(!1),p=_t(),E(e,"href",a=t[10].html_url),E(e,"target","_blank"),d.a=p},m(m,f){U(m,e,f),I(e,i),U(m,r,f),U(m,l,f),U(m,c,f),d.m(u,m,f),U(m,p,f)},p:ie,d(m){m&&z(e),m&&z(r),m&&z(l),m&&z(c),m&&z(p),m&&d.d()}}}s(vye,"create_if_block_1");function bye(t){let e,n,i,a,r,o=pureMarked(t[6])+"",l;return{c(){e=L("li"),n=L("p"),i=L("i"),i.textContent="progress_activity",a=J(),r=new Yi(!1),l=J(),E(i,"class","material-icons icon spinner svelte-1hhexqb"),r.a=null,E(n,"class","svelte-1hhexqb"),E(e,"class","svelte-1hhexqb")},m(c,d){U(c,e,d),I(e,n),I(n,i),I(n,a),r.m(o,n),U(c,l,d)},p:ie,d(c){c&&z(e),c&&z(l)}}}s(bye,"create_pending_block");function FS(t){let e,n;function i(o,l){return o[7]?hye:o[6].startsWith("[BREAKING]")?fye:mye}s(i,"select_block_type");let r=i(t,-1)(t);return{c(){r.c(),n=_t()},m(o,l){r.m(o,l),U(o,n,l)},p(o,l){r.p(o,l)},d(o){r.d(o),o&&z(n)}}}s(FS,"create_each_block_2");function NS(t){let e,n,i=t[3].title+"",a,r,o,l,c=t[3].list,d=[];for(let u=0;ugetDateDisplay(t).full,"formatDateFull"),Eye=s(t=>getDateDisplay(t).short,"formatDateShort"),db=new Map,kye=s(async t=>{if(db.has(t))return db.get(t);let e=await fetch(MS+t).then(async n=>{let i=await n.json();if(!n.ok)throw new Error(`Failed to fetch issue ${t}: `+(i.message??n.statusText));return i}).catch(n=>{console.error(`Failed to fetch issue ${t}`,n)});return e&&db.set(t,e),e},"fetchIssue"),kh=class extends Pe{constructor(e){super(),Ve(this,e,null,yye,De,{})}};s(kh,"ChangelogDialog");var pb=kh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".content.svelte-1hhexqb.svelte-1hhexqb{max-height:75vh;overflow:auto}.plugin_browser_tabbed_page code{background-color:var(--color-back);padding:0.2em 0.4em;border-radius:3px;font-size:0.8em}.plugin_browser_tabbed_page .breaking{background-color:var(--color-error);color:var(--color-back);padding:0 0.3em;border-radius:3px;font-size:0.9em;font-weight:bold;height:min-content}img.svelte-1hhexqb.svelte-1hhexqb{border-radius:4px;width:24px;height:24px;margin-left:0.5px;box-shadow:1px 1px 1px #000000aa}.title-container.svelte-1hhexqb h3.svelte-1hhexqb{margin-left:8px;margin-top:0}.title-container.svelte-1hhexqb.svelte-1hhexqb{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;margin-top:8px}hr.svelte-1hhexqb.svelte-1hhexqb{margin:2rem 0}.disclaimer.svelte-1hhexqb.svelte-1hhexqb{font-size:0.9em;color:var(--color-text-secondary);font-style:italic;text-align:center;margin-top:1rem}li.svelte-1hhexqb>p.svelte-1hhexqb{display:flex;flex-direction:row;gap:0.5rem;align-items:flex-start}@keyframes svelte-1hhexqb-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.spinner.svelte-1hhexqb.svelte-1hhexqb{animation:svelte-1hhexqb-spin 1s linear infinite}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var jye=`${Ke.name}:animationPropertiesDialog`;function Qd(){new cn({id:jye,title:A("dialog.changelog_dialog.title"),width:800,content:{component:pb},buttons:["OK!"],preventKeybinds:!0}).show()}s(Qd,"openChangelogDialog");var BS='data:image/svg+xml,%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A';function PS(t,e,n){let i=t.slice();return i[0]=e[n],i}s(PS,"get_each_context");function LS(t,e,n){let i=t.slice();return i[0]=e[n],i}s(LS,"get_each_context_1");function VS(t){let e,n=t[0]+"",i;return{c(){e=L("p"),i=Re(n),E(e,"class","svelte-by5dje")},m(a,r){U(a,e,r),I(e,i)},p:ie,d(a){a&&z(e)}}}s(VS,"create_each_block_1");function zS(t){let e,n=t[0]+"",i;return{c(){e=L("p"),i=Re(n),E(e,"class","svelte-by5dje")},m(a,r){U(a,e,r),I(e,i)},p:ie,d(a){a&&z(e)}}}s(zS,"create_each_block");function Tye(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B,q,G,W,ee,Z,me,X,Q,he,Ie,le=Ke.subscription_supporters.sort(),ge=[];for(let re=0;re `,b=J(),y=L("a"),y.innerHTML=` `,w=J(),S=L("a"),S.innerHTML=` `,F=J(),N=L("p"),N.textContent="Created by Titus Evans (SnaveSutit)",k=J(),R=L("p"),R.textContent=`${Ke.description}`,D=J(),B=L("h4"),B.textContent="Special Thanks to",q=J(),G=L("div"),G.innerHTML=`

Ian Senne (FetchBot)

For always being there to help.

Jesse Spicer (Dominexis)

For making quaternions and matrices make sense.

Jannis Petersen

For creating an amazing tool and community.

Ewan Howell

For keeping me sane as I dig through Blockbench source code.

Boxic

For throwing absurd amounts of money at me.

Flubberschnub

For showing off the power of AJ with his boss fights.

`,W=J(),ee=L("h4"),ee.textContent="Ko-fi Supporters",Z=J(),me=L("div");for(let re=0;re{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".content.svelte-by5dje.svelte-by5dje{display:flex;flex-direction:column;align-items:center;overflow-y:scroll;max-height:55rem;padding-right:16px}.header-container.svelte-by5dje.svelte-by5dje{display:flex;align-items:center;margin-bottom:1.5rem}.header-container.svelte-by5dje div.svelte-by5dje{display:flex;flex-direction:column;justify-content:center;margin-left:2rem}.header-container.svelte-by5dje img.svelte-by5dje{width:128px;border-radius:16px;box-shadow:4px 4px 8px -4px black}.header-container.svelte-by5dje h1.svelte-by5dje{margin:0px}.header-container.svelte-by5dje h3.svelte-by5dje{margin:0px}h4.svelte-by5dje.svelte-by5dje{color:var(--color-subtle_text);margin-top:30px;border-top:2px solid var(--color-border);padding-top:12px;padding-bottom:8px;text-transform:uppercase;text-align:center;width:100%}.socials.svelte-by5dje.svelte-by5dje{display:flex;justify-content:space-evenly;width:100%;margin-bottom:16px}.socials.svelte-by5dje a.svelte-by5dje{display:flex;flex-direction:column;align-items:center;text-decoration:none;width:64px;height:64px;padding:8px;background-color:var(--color-button);border-radius:8px}.socials.svelte-by5dje a.svelte-by5dje:hover{background-color:var(--color-selected)}.socials.svelte-by5dje a .svelte-by5dje:not(label){flex-grow:1}.socials.svelte-by5dje a label.svelte-by5dje{color:var(--color-subtle_text)}.socials.svelte-by5dje a i.svelte-by5dje{display:flex;align-items:center;font-size:2em}.socials.svelte-by5dje img.svelte-by5dje{width:32px;height:32px}.grid.svelte-by5dje.svelte-by5dje{display:grid;grid-template-columns:1fr 1fr 1fr;grid-gap:0.75rem;justify-items:center}.grid.svelte-by5dje p.svelte-by5dje{text-align:center}.grid.svelte-by5dje p.svelte-by5dje:nth-child(even){color:var(--color-subtle_text)}.grid2.svelte-by5dje.svelte-by5dje{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;justify-items:center;gap:4px 8px;margin-bottom:8px}.grid2.svelte-by5dje p.svelte-by5dje{text-align:center;width:100%;box-shadow:2px 2px 4px var(--color-back);background:var(--color-button);padding:0px 4px;border-radius:4px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function qS(){new cn({id:`${Ke.name}:aboutDialog`,title:A("dialog.about.title"),width:700,content:{component:US},buttons:[A("dialog.about.close_button")],preventKeybinds:!0}).show()}s(qS,"openAboutDialog");function Cye(){let t=document.createElement("img");return Object.assign(t,{src:ya,width:16,height:16}),Object.assign(t.style,{position:"relative",top:"2px",borderRadius:"2px",marginRight:"6px",boxShadow:"1px 1px 1px #000000aa"}),t}s(Cye,"createIconImg");var Sye=new MenuSeparator("animated-java:menu-separator/menubar-separator-a"),Oye=new MenuSeparator("animated-java:menu-separator/menubar-separator-b"),Iye=nn({id:"animated-java:action/about"},{icon:"info",category:"animated_java",name:A("action.open_about.name"),click(){qS()}}),Dye=nn({id:"animated-java:action/documentation"},{icon:"find_in_page",category:"animated_java",name:A("action.open_documentation.name"),click(){Blockbench.openLink("https://animated-java.dev/docs")}}),Fye=nn({id:"animated-java:action/changelog"},{icon:"history",category:"animated_java",name:A("action.open_changelog.name"),click(){Qd()}});function GS(){return Blockbench.ModelProject.all.filter(t=>t.format.id===Qt).length>1}s(GS,"areMultipleBlueprintsOpen");async function WS(t){let e=Project,n=Blockbench.ModelProject.all.filter(a=>a.format.id===Qt),i=!0;for(let a of n){if(a.select(),await new Promise(r=>requestAnimationFrame(r)),i=await zc({debugMode:t}),!i)break;await new Promise(r=>requestAnimationFrame(r))}i&&e?.select()}s(WS,"exportAll");var Nye=nn({id:"animated-java:action/export-all-debug"},{icon:"bug_report",category:"animated_java",name:A("action.export_all_debug.name"),description:A("action.export_all_debug.description"),condition:GS,click(){console.log("Exporting all open Blueprints in development mode..."),WS(!0)}}),Rye=nn({id:"animated-java:action/export-all"},{icon:"insert_drive_file",category:"animated_java",name:A("action.export_all.name"),description:A("action.export_all.description"),condition:GS,click(){console.log("Exporting all open Blueprints..."),WS(!1)}}),Mye=nn({id:"animated-java:action/blueprint-settings"},{icon:"settings",category:"animated_java",name:A("action.open_blueprint_settings.name"),condition:Fe,click(){jc()}}),HS=nn({id:"animated-java:action/extract"},{icon:"fa-trash-can",category:"animated_java",name:A("action.extract.confirm"),condition:Fe,click(){Eh()}}),Bye=nn({id:"animated-java:action/export-debug"},{icon:"bug_report",category:"animated_java",name:A("action.export_debug.name"),condition:Fe,click(){zc({debugMode:!0})},keybind:new Keybind({ctrl:!0,key:69})}),Pye=nn({id:"animated-java:action/export"},{icon:"insert_drive_file",category:"animated_java",name:A("action.export.name"),condition:Fe,click(){zc()},keybind:new Keybind({ctrl:!0,shift:!0,key:69})});function Lye(){if(HS.get()!=null)return{id:"animated_java:submenu/extract",name:A("action.extract.name"),icon:"fa-trash-can",searchable:!1,children:[HS.get()],condition:Fe}}s(Lye,"createExtractSubMenu");var JS=Ry({id:"animated-java:menubar/main"},[]);JS.onCreated(t=>{t.label.style.display="inline-block",t.label.innerHTML=A("menubar.label"),t.label.prepend(Cye()),MenuBar.update(),El(()=>{let e=[Iye.get(),Dye.get(),Fye.get(),Sye,Nye.get(),Rye.get(),Oye,Mye.get(),Lye(),Bye.get(),Pye.get()];if(e.every(n=>n!=null))return e},()=>!JS.get()).then(e=>{for(let n of e)n instanceof Action&&t.addAction(n);t.structure=e})});function Ah(t,e={}){let n=[];return e?.excludeEmptyGroups?n.push(...Group.all.filter(a=>a.children.length>0&&a.children.some(r=>r instanceof Cube))):n.push(...Group.all),e?.groupsOnly||n.push(...Locator.all,...ve.all,...We.all,...$e.all,...OutlinerElement.types.camera?.all||[]),n.map(a=>{let r=t.find(l=>l.value===a.uuid);r&&(r.name=a.name);let o;switch(!0){case a instanceof Group:o="folder";break;case a instanceof Locator:o="anchor";break;case a instanceof ve:case a instanceof We:case a instanceof $e:o=a.icon;break;case a instanceof OutlinerElement.types.camera:o="videocam";break;default:o="close";break}return{icon:o,name:a.name,value:a.uuid}})}s(Ah,"getAvailableNodes");function $d(t){return t*t*t}s($d,"cubicIn");function mb(t){let e=t-1;return e*e*e+1}s(mb,"cubicOut");function ep(t,{delay:e=0,duration:n=400,easing:i=ou}={}){let a=+getComputedStyle(t).opacity;return{delay:e,duration:n,easing:i,css:r=>`opacity: ${r*a}`}}s(ep,"fade");function tp(t,{from:e,to:n},i={}){let a=getComputedStyle(t),r=a.transform==="none"?"":a.transform,[o,l]=a.transformOrigin.split(" ").map(parseFloat),c=e.left+e.width*o/n.width-(n.left+o),d=e.top+e.height*l/n.height-(n.top+l),{delay:u=0,duration:p=s(f=>Math.sqrt(f)*120,"duration"),easing:m=mb}=i;return{delay:u,duration:qn(p)?p(Math.sqrt(c*c+d*d)):p,easing:m,css:(f,g)=>{let x=g*c,_=g*d,h=f+g*e.width/n.width,v=f+g*e.height/n.height;return`transform: ${r} translate(${x}px, ${_}px) scale(${h}, ${v});`}}}s(tp,"flip");function KS(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),n.push.apply(n,i)}return n}s(KS,"ownKeys");function Sh(t){for(var e=1;e=0)&&(n[a]=t[a]);return n}s(Vye,"_objectWithoutPropertiesLoose");function zye(t,e){if(t==null)return{};var n=Vye(t,e),i,a;if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(a=0;a=0)&&Object.prototype.propertyIsEnumerable.call(t,i)&&(n[i]=t[i])}return n}s(zye,"_objectWithoutProperties");function Uye(t,e){return Hye(t)||Gye(t,e)||Eb(t,e)||Kye()}s(Uye,"_slicedToArray");function Ia(t){return qye(t)||Jye(t)||Eb(t)||Wye()}s(Ia,"_toConsumableArray");function qye(t){if(Array.isArray(t))return hb(t)}s(qye,"_arrayWithoutHoles");function Hye(t){if(Array.isArray(t))return t}s(Hye,"_arrayWithHoles");function Jye(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)}s(Jye,"_iterableToArray");function Gye(t,e){var n=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(n!=null){var i=[],a=!0,r=!1,o,l;try{for(n=n.call(t);!(a=(o=n.next()).done)&&(i.push(o.value),!(e&&i.length===e));a=!0);}catch(c){r=!0,l=c}finally{try{!a&&n.return!=null&&n.return()}finally{if(r)throw l}}return i}}s(Gye,"_iterableToArrayLimit");function Eb(t,e){if(t){if(typeof t=="string")return hb(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return hb(t,e)}}s(Eb,"_unsupportedIterableToArray");function hb(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(c){throw c},f:a}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var r=!0,o=!1,l;return{s:function(){n=n.call(t)},n:function(){var c=n.next();return r=c.done,c},e:function(c){o=!0,l=c},f:function(){try{!r&&n.return!=null&&n.return()}finally{if(o)throw l}}}}s(lp,"_createForOfIteratorHelper");var Yye="finalize",Xye="consider";function Wc(t,e,n){t.dispatchEvent(new CustomEvent(Yye,{detail:{items:e,info:n}}))}s(Wc,"dispatchFinalizeEvent");function ds(t,e,n){t.dispatchEvent(new CustomEvent(Xye,{detail:{items:e,info:n}}))}s(ds,"dispatchConsiderEvent");var Mh="draggedEntered",cp="draggedLeft",Bh="draggedOverIndex",kb="draggedLeftDocument",Oh={LEFT_FOR_ANOTHER:"leftForAnother",OUTSIDE_OF_ANY:"outsideOfAny"};function Zye(t,e,n){t.dispatchEvent(new CustomEvent(Mh,{detail:{indexObj:e,draggedEl:n}}))}s(Zye,"dispatchDraggedElementEnteredContainer");function Qye(t,e,n){t.dispatchEvent(new CustomEvent(cp,{detail:{draggedEl:e,type:Oh.LEFT_FOR_ANOTHER,theOtherDz:n}}))}s(Qye,"dispatchDraggedElementLeftContainerForAnother");function $ye(t,e){t.dispatchEvent(new CustomEvent(cp,{detail:{draggedEl:e,type:Oh.OUTSIDE_OF_ANY}}))}s($ye,"dispatchDraggedElementLeftContainerForNone");function e1e(t,e,n){t.dispatchEvent(new CustomEvent(Bh,{detail:{indexObj:e,draggedEl:n}}))}s(e1e,"dispatchDraggedElementIsOverIndex");function t1e(t){window.dispatchEvent(new CustomEvent(kb,{detail:{draggedEl:t}}))}s(t1e,"dispatchDraggedLeftDocument");var Di={DRAG_STARTED:"dragStarted",DRAGGED_ENTERED:Mh,DRAGGED_ENTERED_ANOTHER:"dragEnteredAnother",DRAGGED_OVER_INDEX:Bh,DRAGGED_LEFT:cp,DRAGGED_LEFT_ALL:"draggedLeftAll",DROPPED_INTO_ZONE:"droppedIntoZone",DROPPED_INTO_ANOTHER:"droppedIntoAnother",DROPPED_OUTSIDE_OF_ANY:"droppedOutsideOfAny",DRAG_STOPPED:"dragStopped"},Gi={POINTER:"pointer",KEYBOARD:"keyboard"},sr="isDndShadowItem",jb="data-is-dnd-shadow-item-internal",n1e="data-is-dnd-shadow-item-hint",i1e="id:dnd-shadow-placeholder-0000",a1e="dnd-action-dragged-el",ni="id",gb=0;function sO(){gb++}s(sO,"incrementActiveDropZoneCount");function lO(){if(gb===0)throw new Error("Bug! trying to decrement when there are no dropzones");gb--}s(lO,"decrementActiveDropZoneCount");var Ab=typeof window>"u",vt=s(function(){},"printDebug");function _b(t){var e,n=t.getBoundingClientRect(),i=getComputedStyle(t),a=i.transform;if(a){var r,o,l,c;if(a.startsWith("matrix3d("))e=a.slice(9,-1).split(/, /),r=+e[0],o=+e[5],l=+e[12],c=+e[13];else if(a.startsWith("matrix("))e=a.slice(7,-1).split(/, /),r=+e[0],o=+e[3],l=+e[4],c=+e[5];else return n;var d=i.transformOrigin,u=n.x-l-(1-r)*parseFloat(d),p=n.y-c-(1-o)*parseFloat(d.slice(d.indexOf(" ")+1)),m=r?n.width/r:t.offsetWidth,f=o?n.height/o:t.offsetHeight;return{x:u,y:p,width:m,height:f,top:p,right:u+m,bottom:p+f,left:u}}else return n}s(_b,"getBoundingRectNoTransforms");function cO(t){var e=_b(t);return{top:e.top+window.scrollY,bottom:e.bottom+window.scrollY,left:e.left+window.scrollX,right:e.right+window.scrollX}}s(cO,"getAbsoluteRectNoTransforms");function uO(t){var e=t.getBoundingClientRect();return{top:e.top+window.scrollY,bottom:e.bottom+window.scrollY,left:e.left+window.scrollX,right:e.right+window.scrollX}}s(uO,"getAbsoluteRect");function dO(t){return{x:(t.left+t.right)/2,y:(t.top+t.bottom)/2}}s(dO,"findCenter");function r1e(t,e){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}s(r1e,"calcDistance");function Ph(t,e){return t.y<=e.bottom&&t.y>=e.top&&t.x>=e.left&&t.x<=e.right}s(Ph,"isPointInsideRect");function rp(t){return dO(uO(t))}s(rp,"findCenterOfElement");function YS(t,e){var n=rp(t),i=cO(e);return Ph(n,i)}s(YS,"isCenterOfAInsideB");function o1e(t,e){var n=rp(t),i=rp(e);return r1e(n,i)}s(o1e,"calcDistanceBetweenCenters");function s1e(t){var e=uO(t);return e.right<0||e.left>document.documentElement.scrollWidth||e.bottom<0||e.top>document.documentElement.scrollHeight}s(s1e,"isElementOffDocument");var Hc;function Tb(){vt(function(){return"resetting indexes cache"}),Hc=new Map}s(Tb,"resetIndexesCache");Tb();function l1e(t){var e=Array.from(t.children).findIndex(function(n){return n.getAttribute(jb)});if(e>=0)return Hc.has(t)||Hc.set(t,new Map),Hc.get(t).set(e,cO(t.children[e])),e}s(l1e,"cacheShadowRect");function c1e(t,e){if(!YS(t,e))return null;var n=e.children;if(n.length===0)return{index:0,isProximityBased:!0};for(var i=l1e(e),a=0;a1&&arguments[1]!==void 0?arguments[1]:0;return t.parentElement?pO(t.parentElement,e+1):e-1}s(pO,"_getDepth");function u1e(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var n in t)if(!{}.hasOwnProperty.call(e,n)||e[n]!==t[n])return!1;return!0}s(u1e,"areObjectsShallowEqual");function d1e(t,e){if(t.length!==e.length)return!1;for(var n=0;n2&&arguments[2]!==void 0?arguments[2]:p1e,i=arguments.length>3?arguments[3]:void 0,a,r,o=!1,l,c=Array.from(e).sort(function(u,p){return Ih(p)-Ih(u)});function d(){var u=rp(t),p=i.multiScrollIfNeeded();if(!p&&l&&Math.abs(l.x-u.x)o.clientHeight&&(l.bottomo.clientWidth&&(l.right0&&arguments[0]!==void 0?arguments[0]:[],e=arguments.length>1?arguments[1]:void 0;vt(function(){return"creating multi-scroller"});var n=v1e(t),i=Array.from(n).sort(function(l,c){return Ih(c)-Ih(l)}),a=h1e(),r=a.scrollIfNeeded;function o(){var l=e();if(!l||!i)return!1;for(var c=i.filter(function(p){return Ph(l,p.getBoundingClientRect())||p===document.scrollingElement}),d=0;d0?o:function(){return!1}}}s(_1e,"createMultiScroller");function x1e(t){if(!t)return[];for(var e=[],n=t;n;){var i=window.getComputedStyle(n),a=i.overflow;a.split(" ").some(function(r){return r.includes("auto")||r.includes("scroll")})&&e.push(n),n=n.parentElement}return e}s(x1e,"findScrollableParents");function v1e(t){var e=new Set,n=lp(t),i;try{for(n.s();!(i=n.n()).done;){var a=i.value;x1e(a).forEach(function(r){return e.add(r)})}}catch(r){n.e(r)}finally{n.f()}return(document.scrollingElement.scrollHeight>document.scrollingElement.clientHeight||document.scrollingElement.scrollWidth>document.scrollingElement.clientHeight)&&e.add(document.scrollingElement),e}s(v1e,"findRelevantScrollContainers");function b1e(t){var e=t.cloneNode(!0),n=[],i=t.tagName==="SELECT",a=i?[t]:Ia(t.querySelectorAll("select")),r=lp(a),o;try{for(r.s();!(o=r.n()).done;){var l=o.value;n.push(l.value)}}catch(b){r.e(b)}finally{r.f()}if(a.length>0)for(var c=i?[e]:Ia(e.querySelectorAll("select")),d=0;d0)for(var x=f?[e]:Ia(e.querySelectorAll("canvas")),_=0;_1&&arguments[1]!==void 0?arguments[1]:function(){},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:function(){return[]};t.forEach(function(i){var a=e(i);Object.keys(a).forEach(function(r){i.style[r]=a[r]}),n(i).forEach(function(r){return i.classList.add(r)})})}s(Ch,"styleActiveDropZones");function Dh(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(){},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:function(){return[]};t.forEach(function(i){var a=e(i);Object.keys(a).forEach(function(r){i.style[r]=""}),n(i).forEach(function(r){return i.classList.contains(r)&&i.classList.remove(r)})})}s(Dh,"styleInactiveDropZones");function S1e(t){var e=t.style.minHeight;t.style.minHeight=window.getComputedStyle(t).getPropertyValue("height");var n=t.style.minWidth;return t.style.minWidth=window.getComputedStyle(t).getPropertyValue("width"),s(function(){t.style.minHeight=e,t.style.minWidth=n},"undo")}s(S1e,"preventShrinking");var O1e="--any--",I1e=100,D1e=20,ZS=3,QS={outline:"rgba(255, 255, 102, 0.7) solid 2px"},$S="data-is-dnd-original-dragged-item",ir,_i,Ji,Lh,Cn,Vh,us,gi,ls,la,cl=!1,Cb=!1,Sb,up=!1,ip=[],or=new Map,zn=new Map,fb=new WeakMap;function F1e(t,e){vt(function(){return"registering drop-zone if absent"}),or.has(e)||or.set(e,new Set),or.get(e).has(t)||(or.get(e).add(t),sO())}s(F1e,"registerDropZone");function eO(t,e){or.get(e).delete(t),lO(),or.get(e).size===0&&or.delete(e)}s(eO,"unregisterDropZone");function N1e(){vt(function(){return"watching dragged element"});var t=or.get(Lh),e=lp(t),n;try{for(e.s();!(n=e.n()).done;){var i=n.value;i.addEventListener(Mh,gO),i.addEventListener(cp,_O),i.addEventListener(Bh,xO)}}catch(l){e.e(l)}finally{e.f()}window.addEventListener(kb,Kc);var a=Math.max.apply(Math,Ia(Array.from(t.keys()).map(function(l){return zn.get(l).dropAnimationDurationMs}))),r=a===0?D1e:Math.max(a,I1e),o=_1e(t,function(){return la});m1e(_i,t,r*1.07,o)}s(N1e,"watchDraggedElement");function R1e(){vt(function(){return"unwatching dragged element"});var t=or.get(Lh),e=lp(t),n;try{for(e.s();!(n=e.n()).done;){var i=n.value;i.removeEventListener(Mh,gO),i.removeEventListener(cp,_O),i.removeEventListener(Bh,xO)}}catch(a){e.e(a)}finally{e.f()}window.removeEventListener(kb,Kc),f1e()}s(R1e,"unWatchDraggedElement");function zh(t){return t.findIndex(function(e){return!!e[sr]})}s(zh,"findShadowElementIdx");function M1e(t){var e;return Sh(Sh({},t),{},(e={},Gc(e,sr,!0),Gc(e,ni,i1e),e))}s(M1e,"createShadowElData");function gO(t){vt(function(){return["dragged entered",t.currentTarget,t.detail]});var e=zn.get(t.currentTarget),n=e.items,i=e.dropFromOthersDisabled;if(i&&t.currentTarget!==Cn){vt(function(){return"ignoring dragged entered because drop is currently disabled"});return}if(up=!1,n=n.filter(function(u){return u[ni]!==us[ni]}),vt(function(){return"dragged entered items ".concat(Jr(n))}),Cn!==t.currentTarget){var a=zn.get(Cn).items,r=a.filter(function(u){return!u[sr]});ds(Cn,r,{trigger:Di.DRAGGED_ENTERED_ANOTHER,id:Ji[ni],source:Gi.POINTER})}var o=t.detail.indexObj,l=o.index,c=o.isProximityBased,d=c&&l===t.currentTarget.children.length-1?l+1:l;gi=t.currentTarget,n.splice(d,0,us),ds(t.currentTarget,n,{trigger:Di.DRAGGED_ENTERED,id:Ji[ni],source:Gi.POINTER})}s(gO,"handleDraggedEntered");function _O(t){if(cl){vt(function(){return["dragged left",t.currentTarget,t.detail]});var e=zn.get(t.currentTarget),n=e.items,i=e.dropFromOthersDisabled;if(i&&t.currentTarget!==Cn&&t.currentTarget!==gi){vt(function(){return"drop is currently disabled"});return}var a=Ia(n),r=zh(a);r!==-1&&a.splice(r,1);var o=gi;gi=void 0;var l=t.detail,c=l.type,d=l.theOtherDz;if(c===Oh.OUTSIDE_OF_ANY||c===Oh.LEFT_FOR_ANOTHER&&d!==Cn&&zn.get(d).dropFromOthersDisabled){vt(function(){return"dragged left all, putting shadow element back in the origin dz"}),up=!0,gi=Cn;var u=o===Cn?a:Ia(zn.get(Cn).items);u.splice(Vh,0,us),ds(Cn,u,{trigger:Di.DRAGGED_LEFT_ALL,id:Ji[ni],source:Gi.POINTER})}ds(t.currentTarget,a,{trigger:Di.DRAGGED_LEFT,id:Ji[ni],source:Gi.POINTER})}}s(_O,"handleDraggedLeft");function xO(t){vt(function(){return["dragged is over index",t.currentTarget,t.detail]});var e=zn.get(t.currentTarget),n=e.items,i=e.dropFromOthersDisabled;if(i&&t.currentTarget!==Cn){vt(function(){return"drop is currently disabled"});return}var a=Ia(n);up=!1;var r=t.detail.indexObj.index,o=zh(a);o!==-1&&a.splice(o,1),a.splice(r,0,us),ds(t.currentTarget,a,{trigger:Di.DRAGGED_OVER_INDEX,id:Ji[ni],source:Gi.POINTER})}s(xO,"handleDraggedIsOverIndex");function Fh(t){t.preventDefault();var e=t.touches?t.touches[0]:t;la={x:e.clientX,y:e.clientY},_i.style.transform="translate3d(".concat(la.x-ls.x,"px, ").concat(la.y-ls.y,"px, 0)")}s(Fh,"handleMouseMove");function Kc(){vt(function(){return"dropped"}),Cb=!0,window.removeEventListener("mousemove",Fh),window.removeEventListener("touchmove",Fh),window.removeEventListener("mouseup",Kc),window.removeEventListener("touchend",Kc),R1e(),k1e(_i),gi||(vt(function(){return"element was dropped right after it left origin but before entering somewhere else"}),gi=Cn),vt(function(){return["dropped in dz",gi]});var t=zn.get(gi),e=t.items,n=t.type;Dh(or.get(n),function(r){return zn.get(r).dropTargetStyle},function(r){return zn.get(r).dropTargetClasses});var i=zh(e);i===-1&&gi===Cn&&(i=Vh),e=e.map(function(r){return r[sr]?Ji:r});function a(){Sb(),Wc(gi,e,{trigger:up?Di.DROPPED_OUTSIDE_OF_ANY:Di.DROPPED_INTO_ZONE,id:Ji[ni],source:Gi.POINTER}),gi!==Cn&&Wc(Cn,zn.get(Cn).items,{trigger:Di.DROPPED_INTO_ANOTHER,id:Ji[ni],source:Gi.POINTER}),i!==-1&&C1e(gi.children[i]),L1e()}s(a,"finalizeWithinZone"),B1e(i,a)}s(Kc,"handleDrop");function B1e(t,e){var n=t>-1?_b(gi.children[t]):_b(gi),i={x:n.left-parseFloat(_i.style.left),y:n.top-parseFloat(_i.style.top)},a=zn.get(gi),r=a.dropAnimationDurationMs,o="transform ".concat(r,"ms ease");_i.style.transition=_i.style.transition?_i.style.transition+","+o:o,_i.style.transform="translate3d(".concat(i.x,"px, ").concat(i.y,"px, 0)"),window.setTimeout(e,r)}s(B1e,"animateDraggedToFinalPosition");function P1e(t,e){ip.push({dz:t,destroy:e}),window.requestAnimationFrame(function(){hO(t),document.body.appendChild(t)})}s(P1e,"scheduleDZForRemovalAfterDrop");function L1e(){_i.remove(),ir.remove(),ip.length&&(vt(function(){return["will destroy zones that were removed during drag",ip]}),ip.forEach(function(t){var e=t.dz,n=t.destroy;n(),e.remove()}),ip=[]),_i=void 0,ir=void 0,Ji=void 0,Lh=void 0,Cn=void 0,Vh=void 0,us=void 0,gi=void 0,ls=void 0,la=void 0,cl=!1,Cb=!1,Sb=void 0,up=!1}s(L1e,"cleanupPostDrop");function V1e(t,e){var n=!1,i={items:void 0,type:void 0,flipDurationMs:0,dragDisabled:!1,morphDisabled:!1,dropFromOthersDisabled:!1,dropTargetStyle:QS,dropTargetClasses:[],transformDraggedElement:s(function(){},"transformDraggedElement"),centreDraggedOnCursor:!1};vt(function(){return["dndzone good to go options: ".concat(Jr(e),", config: ").concat(Jr(i)),{node:t}]});var a=new Map;function r(){window.addEventListener("mousemove",c,{passive:!1}),window.addEventListener("touchmove",c,{passive:!1,capture:!1}),window.addEventListener("mouseup",l,{passive:!1}),window.addEventListener("touchend",l,{passive:!1})}s(r,"addMaybeListeners");function o(){window.removeEventListener("mousemove",c),window.removeEventListener("touchmove",c),window.removeEventListener("mouseup",l),window.removeEventListener("touchend",l)}s(o,"removeMaybeListeners");function l(m){o(),ir=void 0,ls=void 0,la=void 0,m.type==="touchend"&&m.target.click()}s(l,"handleFalseAlarm");function c(m){m.preventDefault();var f=m.touches?m.touches[0]:m;la={x:f.clientX,y:f.clientY},(Math.abs(la.x-ls.x)>=ZS||Math.abs(la.y-ls.y)>=ZS)&&(o(),u())}s(c,"handleMouseMoveMaybeDragStart");function d(m){if(m.target!==m.currentTarget&&(m.target.value!==void 0||m.target.isContentEditable)){vt(function(){return"won't initiate drag on a nested input element"});return}if(m.button){vt(function(){return"ignoring none left click button: ".concat(m.button)});return}if(cl){vt(function(){return"cannot start a new drag before finalizing previous one"});return}m.preventDefault(),m.stopPropagation();var f=m.touches?m.touches[0]:m;ls={x:f.clientX,y:f.clientY},la=Sh({},ls),ir=m.currentTarget,r()}s(d,"handleMouseDown");function u(){vt(function(){return["drag start config: ".concat(Jr(i)),ir]}),cl=!0;var m=a.get(ir);Vh=m,Cn=ir.parentElement;var f=Cn.closest("dialog")||Cn.getRootNode(),g=f.body||f,x=i.items,_=i.type,h=i.centreDraggedOnCursor,v=Ia(x);Ji=v[m],Lh=_,us=M1e(Ji),_i=E1e(ir,h&&la),ir.setAttribute($S,!0);function b(){_i.parentElement?window.requestAnimationFrame(b):(g.appendChild(_i),_i.focus(),N1e(),hO(ir),g.appendChild(ir),us[ni]=Ji[ni])}s(b,"keepOriginalElementInDom"),window.requestAnimationFrame(b),Ch(Array.from(or.get(i.type)).filter(function(y){return y===Cn||!zn.get(y).dropFromOthersDisabled}),function(y){return zn.get(y).dropTargetStyle},function(y){return zn.get(y).dropTargetClasses}),v.splice(m,1,us),Sb=S1e(Cn),ds(Cn,v,{trigger:Di.DRAG_STARTED,id:Ji[ni],source:Gi.POINTER}),window.addEventListener("mousemove",Fh,{passive:!1}),window.addEventListener("touchmove",Fh,{passive:!1,capture:!1}),window.addEventListener("mouseup",Kc,{passive:!1}),window.addEventListener("touchend",Kc,{passive:!1})}s(u,"handleDragStart");function p(m){var f=m.items,g=f===void 0?void 0:f,x=m.flipDurationMs,_=x===void 0?0:x,h=m.type,v=h===void 0?O1e:h,b=m.dragDisabled,y=b===void 0?!1:b,w=m.morphDisabled,S=w===void 0?!1:w,F=m.dropFromOthersDisabled,N=F===void 0?!1:F,k=m.dropTargetStyle,R=k===void 0?QS:k,D=m.dropTargetClasses,B=D===void 0?[]:D,q=m.transformDraggedElement,G=q===void 0?function(){}:q,W=m.centreDraggedOnCursor,ee=W===void 0?!1:W;i.dropAnimationDurationMs=_,i.type&&v!==i.type&&eO(t,i.type),i.type=v,i.items=Ia(g),i.dragDisabled=y,i.morphDisabled=S,i.transformDraggedElement=G,i.centreDraggedOnCursor=ee,n&&cl&&!Cb&&(!u1e(R,i.dropTargetStyle)||!d1e(B,i.dropTargetClasses))&&(Dh([t],function(){return i.dropTargetStyle},function(){return B}),Ch([t],function(){return R},function(){return B})),i.dropTargetStyle=R,i.dropTargetClasses=Ia(B);function Z(he,Ie){return zn.get(he)?zn.get(he)[Ie]:i[Ie]}s(Z,"getConfigProp"),n&&cl&&i.dropFromOthersDisabled!==N&&(N?Dh([t],function(he){return Z(he,"dropTargetStyle")},function(he){return Z(he,"dropTargetClasses")}):Ch([t],function(he){return Z(he,"dropTargetStyle")},function(he){return Z(he,"dropTargetClasses")})),i.dropFromOthersDisabled=N,zn.set(t,i),F1e(t,v);for(var me=zh(i.items),X=0;X".concat(e,"

"),n.style.display="none",n.style.position="fixed",n.style.zIndex="-5",n}s(H1e,"instructionToHiddenDiv");function Jc(t){if(!Ab){Vn||bb(),Vn.innerHTML="";var e=document.createTextNode(t);Vn.appendChild(e),Vn.style.display="none",Vn.style.display="inline"}}s(Jc,"alertToScreenReader");var J1e="--any--",tO={outline:"rgba(255, 255, 102, 0.7) solid 2px"},Oa=!1,yb,yi,ul="",ll,ar,cs="",Nh=new WeakSet,nO=new WeakMap,iO=new WeakMap,wb=new Map,hi=new Map,rr=new Map,Rh;function G1e(t,e){vt(function(){return"registering drop-zone if absent"}),rr.size===0&&(vt(function(){return"adding global keydown and click handlers"}),Rh=U1e(),window.addEventListener("keydown",bO),window.addEventListener("click",yO)),rr.has(e)||rr.set(e,new Set),rr.get(e).has(t)||(rr.get(e).add(t),sO())}s(G1e,"registerDropZone$1");function aO(t,e){vt(function(){return"unregistering drop-zone"}),yi===t&&sp(),rr.get(e).delete(t),lO(),rr.get(e).size===0&&rr.delete(e),rr.size===0&&(vt(function(){return"removing global keydown and click handlers"}),window.removeEventListener("keydown",bO),window.removeEventListener("click",yO),Rh=void 0,q1e())}s(aO,"unregisterDropZone$1");function bO(t){if(Oa)switch(t.key){case"Escape":{sp();break}}}s(bO,"globalKeyDownHandler");function yO(){Oa&&(Nh.has(document.activeElement)||(vt(function(){return"clicked outside of any draggable"}),sp()))}s(yO,"globalClickHandler");function W1e(t){if(vt(function(){return"zone focus"}),!!Oa){var e=t.currentTarget;if(e!==yi){ul=e.getAttribute("aria-label")||"";var n=hi.get(yi),i=n.items,a=i.find(function(p){return p[ni]===ar}),r=i.indexOf(a),o=i.splice(r,1)[0],l=hi.get(e),c=l.items,d=l.autoAriaDisabled;e.getBoundingClientRect().top0&&arguments[0]!==void 0?arguments[0]:!0;vt(function(){return"drop"}),hi.get(yi).autoAriaDisabled||Jc("Stopped dragging item ".concat(cs)),Nh.has(document.activeElement)&&document.activeElement.blur(),t&&ds(yi,hi.get(yi).items,{trigger:Di.DRAG_STOPPED,id:ar,source:Gi.KEYBOARD}),Dh(rr.get(yb),function(e){return hi.get(e).dropTargetStyle},function(e){return hi.get(e).dropTargetClasses}),ll=null,ar=null,cs="",yb=null,yi=null,ul="",Oa=!1,wO()}s(sp,"handleDrop$1");function K1e(t,e){var n={items:void 0,type:void 0,dragDisabled:!1,zoneTabIndex:0,zoneItemTabIndex:0,dropFromOthersDisabled:!1,dropTargetStyle:tO,dropTargetClasses:[],autoAriaDisabled:!1};function i(u,p,m){u.length<=1||u.splice(m,1,u.splice(p,1,u[m])[0])}s(i,"swap");function a(u){switch(vt(function(){return["handling key down",u.key]}),u.key){case"Enter":case" ":{if((u.target.disabled!==void 0||u.target.href||u.target.isContentEditable)&&!Nh.has(u.target))return;u.preventDefault(),u.stopPropagation(),Oa?sp():r(u);break}case"ArrowDown":case"ArrowRight":{if(!Oa)return;u.preventDefault(),u.stopPropagation();var p=hi.get(t),m=p.items,f=Array.from(t.children),g=f.indexOf(u.currentTarget);vt(function(){return["arrow down",g]}),g0&&(n.autoAriaDisabled||Jc("Moved item ".concat(cs," to position ").concat(v," in the list ").concat(ul)),i(_,v,v-1),Wc(t,_,{trigger:Di.DROPPED_INTO_ZONE,id:ar,source:Gi.KEYBOARD}));break}}}s(a,"handleKeyDown");function r(u){vt(function(){return"drag start"}),l(u.currentTarget),yi=t,yb=n.type,Oa=!0;var p=Array.from(rr.get(n.type)).filter(function(f){return f===yi||!hi.get(f).dropFromOthersDisabled});if(Ch(p,function(f){return hi.get(f).dropTargetStyle},function(f){return hi.get(f).dropTargetClasses}),!n.autoAriaDisabled){var m="Started dragging item ".concat(cs,". Use the arrow keys to move it within its list ").concat(ul);p.length>1&&(m+=", or tab to another list in order to move the item into it"),Jc(m)}ds(t,hi.get(t).items,{trigger:Di.DRAG_STARTED,id:ar,source:Gi.KEYBOARD}),wO()}s(r,"handleDragStart");function o(u){Oa&&u.currentTarget!==ll&&(u.stopPropagation(),sp(!1),r(u))}s(o,"handleClick");function l(u){var p=hi.get(t),m=p.items,f=Array.from(t.children),g=f.indexOf(u);ll=u,ll.tabIndex=n.zoneItemTabIndex,ar=m[g][ni],cs=f[g].getAttribute("aria-label")||""}s(l,"setCurrentFocusedItem");function c(u){var p=u.items,m=p===void 0?[]:p,f=u.type,g=f===void 0?J1e:f,x=u.dragDisabled,_=x===void 0?!1:x,h=u.zoneTabIndex,v=h===void 0?0:h,b=u.zoneItemTabIndex,y=b===void 0?0:b,w=u.dropFromOthersDisabled,S=w===void 0?!1:w,F=u.dropTargetStyle,N=F===void 0?tO:F,k=u.dropTargetClasses,R=k===void 0?[]:k,D=u.autoAriaDisabled,B=D===void 0?!1:D;n.items=Ia(m),n.dragDisabled=_,n.dropFromOthersDisabled=S,n.zoneTabIndex=v,n.zoneItemTabIndex=y,n.dropTargetStyle=N,n.dropTargetClasses=R,n.autoAriaDisabled=B,n.type&&g!==n.type&&aO(t,n.type),n.type=g,G1e(t,g),B||(t.setAttribute("aria-disabled",_),t.setAttribute("role","list"),t.setAttribute("aria-describedby",_?Rh.DND_ZONE_DRAG_DISABLED:Rh.DND_ZONE_ACTIVE)),hi.set(t,n),Oa?t.tabIndex=t===yi||ll.contains(t)||n.dropFromOthersDisabled||yi&&n.type!==hi.get(yi).type?-1:0:t.tabIndex=n.zoneTabIndex,t.addEventListener("focus",W1e);for(var q=s(function(ee){var Z=t.children[ee];Nh.add(Z),Z.tabIndex=Oa?-1:n.zoneItemTabIndex,B||Z.setAttribute("role","listitem"),Z.removeEventListener("keydown",nO.get(Z)),Z.removeEventListener("click",iO.get(Z)),_||(Z.addEventListener("keydown",a),nO.set(Z,a),Z.addEventListener("click",o),iO.set(Z,o)),Oa&&n.items[ee][ni]===ar&&(vt(function(){return["focusing on",{i:ee,focusedItemId:ar}]}),ll=Z,ll.tabIndex=n.zoneItemTabIndex,Z.focus())},"_loop"),G=0;G0&&console.warn("dndzone will ignore unknown options",g),!e)throw new Error("no 'items' key provided to dndzone");var x=e.find(function(_){return!{}.hasOwnProperty.call(_,ni)});if(x)throw new Error("missing '".concat(ni,"' property for item ").concat(Jr(x)));if(u&&!Array.isArray(u))throw new Error("dropTargetClasses should be an array but instead it is a ".concat(ap(u),", ").concat(Jr(u)));if(l&&!oO(l))throw new Error("zoneTabIndex should be a number but instead it is a ".concat(ap(l),", ").concat(Jr(l)));if(c&&!oO(c))throw new Error("zoneItemTabIndex should be a number but instead it is a ".concat(ap(c),", ").concat(Jr(c)))}s(rO,"validateOptions");function oO(t){return!isNaN(t)&&function(e){return(e|0)===e}(parseFloat(t))}s(oO,"isInt");function Z1e(t){var e=t,n=new Set;return{get:s(function(){return e},"get"),set:s(function(a){e=a,Array.from(n).forEach(function(r){return r(e)})},"set"),subscribe:s(function(a){n.add(a),a(e)},"subscribe"),unsubscribe:s(function(a){n.delete(a)},"unsubscribe")}}s(Z1e,"createStore");var YJe=Z1e(!0);function EO(t,e,n){let i=t.slice();return i[18]=e[n],i}s(EO,"get_each_context");function kO(t,e,n){let i=t.slice();return i[18]=e[n],i}s(kO,"get_each_context_1");function jO(t){let e,n;return{c(){e=L("div"),Xe(e,"visibility","visible",1),Xe(e,"border-bottom","2px solid var(--color-accent)"),Xe(e,"width","100%"),Xe(e,"height","50%")},m(i,a){U(i,e,a)},p(i,a){t=i},i(i){n||to(()=>{n=cu(e,ep,{duration:150,easing:$d}),n.start()})},o:ie,d(i){i&&z(e)}}}s(jO,"create_if_block_1");function AO(t,e){let n,i,a,r=(e[18].icon??"folder")+"",o,l,c,d=e[18].title+"",u,p,m,f=ie,g=e[18][sr]&&jO(e);return{key:t,first:null,c(){n=L("div"),g&&g.c(),i=J(),a=L("i"),o=Re(r),l=J(),c=L("span"),u=Re(d),p=J(),E(a,"class","material-icons notranslate icon"),Xe(a,"color","rgb(162, 235, 255)"),E(c,"class","svelte-a8pqh0"),E(n,"class","list-item svelte-a8pqh0"),this.first=n},m(x,_){U(x,n,_),g&&g.m(n,null),I(n,i),I(n,a),I(a,o),I(n,l),I(n,c),I(c,u),I(n,p)},p(x,_){e=x,e[18][sr]?g?_&256&&ae(g,1):(g=jO(e),g.c(),ae(g,1),g.m(n,i)):g&&(g.d(1),g=null),_&256&&r!==(r=(e[18].icon??"folder")+"")&&ct(o,r),_&256&&d!==(d=e[18].title+"")&&ct(u,d)},r(){m=n.getBoundingClientRect()},f(){lu(n),f()},a(){f(),f=su(n,m,tp,{duration:150})},i(x){ae(g)},o:ie,d(x){x&&z(n),g&&g.d()}}}s(AO,"create_each_block_1");function TO(t){let e,n;return{c(){e=L("div"),Xe(e,"visibility","visible",1),Xe(e,"border-bottom","2px solid var(--color-accent)"),Xe(e,"width","100%"),Xe(e,"height","50%")},m(i,a){U(i,e,a)},p(i,a){t=i},i(i){n||to(()=>{n=cu(e,ep,{duration:150,easing:$d}),n.start()})},o:ie,d(i){i&&z(e)}}}s(TO,"create_if_block");function CO(t,e){let n,i,a,r=(e[18].icon??"folder")+"",o,l,c,d=e[18].title+"",u,p,m,f=ie,g=e[18][sr]&&TO(e);return{key:t,first:null,c(){n=L("div"),g&&g.c(),i=J(),a=L("i"),o=Re(r),l=J(),c=L("span"),u=Re(d),p=J(),E(a,"class","material-icons notranslate icon"),Xe(a,"color","rgb(162, 235, 255)"),E(c,"class","svelte-a8pqh0"),E(n,"class","list-item svelte-a8pqh0"),this.first=n},m(x,_){U(x,n,_),g&&g.m(n,null),I(n,i),I(n,a),I(a,o),I(n,l),I(n,c),I(c,u),I(n,p)},p(x,_){e=x,e[18][sr]?g?_&128&&ae(g,1):(g=TO(e),g.c(),ae(g,1),g.m(n,i)):g&&(g.d(1),g=null),_&128&&r!==(r=(e[18].icon??"folder")+"")&&ct(o,r),_&128&&d!==(d=e[18].title+"")&&ct(u,d)},r(){m=n.getBoundingClientRect()},f(){lu(n),f()},a(){f(),f=su(n,m,tp,{duration:150})},i(x){ae(g)},o:ie,d(x){x&&z(n),g&&g.d()}}}s(CO,"create_each_block");function Q1e(t){let e,n,i,a,r,o,l=[],c=new Map,d,u,p,m,f,g,x,_,h,v=[],b=new Map,y,w,S,F=t[8],N=s(D=>D[18].id,"get_key");for(let D=0;DD[18].id,"get_key_1");for(let D=0;DF.value===S.value)?m.push({id:w,title:S.name,icon:S.icon}):f.push({id:w,title:S.name,icon:S.icon})}function g(w){n(8,f=w.detail.items)}s(g,"handleSortAvailableItems");function x(w){n(7,m=w.detail.items)}s(x,"handleSortIncludedItems");function _(){p.update(()=>m.map(w=>u.find(S=>S.name===w.title)))}s(_,"finalizeSort");function h(){let w=f;n(8,f=m),n(7,m=w),_()}s(h,"swapColumns");function v(){p.set([])}s(v,"onReset");let b=s(w=>{g(w),_()},"finalize_handler"),y=s(w=>{x(w),_()},"finalize_handler_1");return t.$$set=w=>{"label"in w&&n(0,i=w.label),"tooltip"in w&&n(1,a=w.tooltip),"availableItemsColumnLable"in w&&n(2,r=w.availableItemsColumnLable),"availableItemsColumnTooltip"in w&&n(3,o=w.availableItemsColumnTooltip),"includedItemsColumnLable"in w&&n(4,l=w.includedItemsColumnLable),"includedItemsColumnTooltip"in w&&n(5,c=w.includedItemsColumnTooltip),"swapColumnsButtonTooltip"in w&&n(6,d=w.swapColumnsButtonTooltip),"availableItems"in w&&n(14,u=w.availableItems),"includedItems"in w&&n(15,p=w.includedItems)},[i,a,r,o,l,c,d,m,f,g,x,_,h,v,u,p,b,y]}s(ewe,"instance");var Uh=class extends Pe{constructor(e){super(),Ve(this,e,ewe,$1e,De,{label:0,tooltip:1,availableItemsColumnLable:2,availableItemsColumnTooltip:3,includedItemsColumnLable:4,includedItemsColumnTooltip:5,swapColumnsButtonTooltip:6,availableItems:14,includedItems:15})}};s(Uh,"Collection");var qh=Uh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".main-column-container.svelte-a8pqh0{display:flex;justify-content:space-around}section.sub-column-container.svelte-a8pqh0{display:flex;flex-direction:column;align-items:stretch;width:unset;height:100%;background-color:var(--color-back);border:1px solid var(--color-border);margin:8px;margin-top:0px;padding:6px 8px 30px;max-height:16rem;overflow-y:auto}h3.svelte-a8pqh0{text-align:center;font-size:16px;padding:0px;margin:8px 0px}.column.svelte-a8pqh0{display:flex;flex-direction:column;width:50%}.list-item.svelte-a8pqh0{display:flex;cursor:default !important;width:100%}span.svelte-a8pqh0{padding:0 8px}span.svelte-a8pqh0:hover{color:var(--color-light)}.fa-icon.svelte-a8pqh0{display:flex;align-items:center;justify-content:center;padding-right:8px;padding-left:8px;margin-top:68px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function twe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f;function g(S){t[5](S)}s(g,"lineinput_value_binding");let x={label:A("dialog.animation_properties.animation_name.title"),tooltip:A("dialog.animation_properties.animation_name.description"),defaultValue:"new",valueChecker:nwe};t[0]!==void 0&&(x.value=t[0]),n=new aa({props:x}),Te.push(()=>Be(n,"value",g));function _(S){t[6](S)}s(_,"select_value_binding");let h={label:A("dialog.animation_properties.loop_mode.title"),tooltip:A("dialog.animation_properties.loop_mode.description"),options:{once:A("dialog.animation_properties.loop_mode.options.once"),hold:A("dialog.animation_properties.loop_mode.options.hold"),loop:A("dialog.animation_properties.loop_mode.options.loop")},defaultOption:"once"};t[1]!==void 0&&(h.value=t[1]),r=new es({props:h}),Te.push(()=>Be(r,"value",_));function v(S){t[7](S)}s(v,"numberslider_value_binding");let b={label:A("dialog.animation_properties.loop_delay.title"),tooltip:A("dialog.animation_properties.loop_delay.description"),min:0,valueStep:1,defaultValue:0};t[2]!==void 0&&(b.value=t[2]),c=new Mr({props:b}),Te.push(()=>Be(c,"value",v));function y(S){t[8](S)}s(y,"collection_includedItems_binding");let w={label:A("dialog.animation_properties.excluded_nodes.title"),tooltip:A("dialog.animation_properties.bone_lists.description"),availableItemsColumnLable:A("dialog.animation_properties.included_nodes.title"),availableItemsColumnTooltip:A("dialog.animation_properties.included_nodes.description"),includedItemsColumnLable:A("dialog.animation_properties.excluded_nodes.title"),includedItemsColumnTooltip:A("dialog.animation_properties.excluded_nodes.description"),swapColumnsButtonTooltip:A("dialog.animation_properties.swap_columns_button.tooltip"),availableItems:t[4]};return t[3]!==void 0&&(w.includedItems=t[3]),p=new qh({props:w}),Te.push(()=>Be(p,"includedItems",y)),{c(){e=L("div"),Ce(n.$$.fragment),a=J(),Ce(r.$$.fragment),l=J(),Ce(c.$$.fragment),u=J(),Ce(p.$$.fragment)},m(S,F){U(S,e,F),Ae(n,e,null),I(e,a),Ae(r,e,null),I(e,l),Ae(c,e,null),I(e,u),Ae(p,e,null),f=!0},p(S,[F]){let N={};!i&&F&1&&(i=!0,N.value=S[0],Me(()=>i=!1)),n.$set(N);let k={};!o&&F&2&&(o=!0,k.value=S[1],Me(()=>o=!1)),r.$set(k);let R={};!d&&F&4&&(d=!0,R.value=S[2],Me(()=>d=!1)),c.$set(R);let D={};!m&&F&8&&(m=!0,D.includedItems=S[3],Me(()=>m=!1)),p.$set(D)},i(S){f||(ae(n.$$.fragment,S),ae(r.$$.fragment,S),ae(c.$$.fragment,S),ae(p.$$.fragment,S),f=!0)},o(S){de(n.$$.fragment,S),de(r.$$.fragment,S),de(c.$$.fragment,S),de(p.$$.fragment,S),f=!1},d(S){S&&z(e),je(n),je(r),je(c),je(p)}}}s(twe,"create_fragment");function nwe(t){return t.trim().length===0?{type:"error",message:A("dialog.animation_properties.animation_name.error.empty")}:/[^a-zA-Z0-9_\.]/.exec(t)?{type:"error",message:A("dialog.animation_properties.animation_name.error.invalid_characters")}:{type:"success",message:""}}s(nwe,"animationNameValueChecker");function iwe(t,e,n){let{animationName:i}=e,{loopMode:a}=e,{loopDelay:r}=e,{excludedNodes:o}=e,l=Ah(o.get());function c(m){i=m,n(0,i)}s(c,"lineinput_value_binding");function d(m){a=m,n(1,a)}s(d,"select_value_binding");function u(m){r=m,n(2,r)}s(u,"numberslider_value_binding");function p(m){o=m,n(3,o)}return s(p,"collection_includedItems_binding"),t.$$set=m=>{"animationName"in m&&n(0,i=m.animationName),"loopMode"in m&&n(1,a=m.loopMode),"loopDelay"in m&&n(2,r=m.loopDelay),"excludedNodes"in m&&n(3,o=m.excludedNodes)},[i,a,r,o,l,c,d,u,p]}s(iwe,"instance");var Hh=class extends Pe{constructor(e){super(),Ve(this,e,iwe,twe,De,{animationName:0,loopMode:1,loopDelay:2,excludedNodes:3})}};s(Hh,"AnimationProperties");var SO=Hh;var awe=`${Ke.name}:animationPropertiesDialog`;function OO(t){let e=new ke(t.name),n=new ke(t.loop),i=new ke(Number(t.loop_delay)||0),a=new ke(t.excluded_nodes);new cn({id:awe,title:A("dialog.animation_properties.title",t.name),width:600,content:{component:SO,props:{animationName:e,loopMode:n,loopDelay:i,excludedNodes:a}},preventKeybinds:!0,onConfirm(){t.name=e.get(),t.createUniqueName(Blockbench.Animation.all),t.loop=n.get(),t.loop_delay=i.get().toString(),t.excluded_nodes=a.get(),Project.saved=!1}}).show()}s(OO,"openAnimationPropertiesDialog");var IGe=`${Ke.name}:animationPropertiesDialog`;function rwe(t){let e,n,i,a,r,o,l,c,d;return{c(){e=L("div"),n=L("label"),i=Re(t[0]),r=J(),o=L("div"),E(n,"class","name_space_left"),E(n,"for",a=t[9]),E(e,"class","dialog_bar form_bar")},m(u,p){U(u,e,p),I(e,n),I(n,i),I(e,r),I(e,o),c||(d=bn(l=t[3].call(null,o)),c=!0)},p(u,p){p&1&&ct(i,u[0]),p&512&&a!==(a=u[9])&&E(n,"for",a)},d(u){u&&z(e),c=!1,d()}}}s(rwe,"create_default_slot");function owe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[4],$$slots:{default:[rwe,({id:i})=>({9:i}),({id:i})=>i?512:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&1537&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(owe,"create_fragment");function swe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(d,g=>n(6,i=g)),d),"$$subscribe_value");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=""}=e,{defaultValue:c="#ffffff"}=e,{value:d}=e;r();let u=new ColorPicker(`${Ke.name}:${o}-color_picker`,{onChange(){let g=u.get();Jt(d,i=g.toHexString(),i)}});function p(g){u.toElement(g),u.set(i)}s(p,"mountColorPicker");function m(){Jt(d,i=c,i)}s(m,"onReset");let f=d.subscribe(g=>{u.set(g)});return Zi(()=>{f(),u.delete()}),t.$$set=g=>{"label"in g&&n(0,o=g.label),"tooltip"in g&&n(1,l=g.tooltip),"defaultValue"in g&&n(5,c=g.defaultValue),"value"in g&&r(n(2,d=g.value))},[o,l,d,p,m,c]}s(swe,"instance");var Jh=class extends Pe{constructor(e){super(),Ve(this,e,swe,owe,De,{label:0,tooltip:1,defaultValue:5,value:2})}};s(Jh,"ColorPicker_1");var IO=Jh;function DO(t){let e,n,i;function a(o){t[32](o)}s(a,"numberslider_value_binding");let r={label:A("dialog.display_entity.brightness_override.title"),tooltip:A("dialog.display_entity.brightness_override.description"),defaultValue:wt.prototype.brightnessOverride,min:0,max:15,valueStep:1};return t[7]!==void 0&&(r.value=t[7]),e=new Mr({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&128&&(n=!0,c.value=o[7],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(DO,"create_if_block_2");function FO(t){let e,n,i,a,r,o,l,c,d,u,p;function m(b){t[33](b)}s(m,"checkbox0_checked_binding");let f={label:A("dialog.display_entity.enchanted.title"),tooltip:A("dialog.display_entity.enchanted.description"),defaultValue:wt.prototype.enchanted};t[8]!==void 0&&(f.checked=t[8]),e=new mi({props:f}),Te.push(()=>Be(e,"checked",m));function g(b){t[34](b)}s(g,"checkbox1_checked_binding");let x={label:A("dialog.display_entity.glowing.title"),tooltip:A("dialog.display_entity.glowing.description"),defaultValue:wt.prototype.glowing};t[9]!==void 0&&(x.checked=t[9]),a=new mi({props:x}),Te.push(()=>Be(a,"checked",g));function _(b){t[35](b)}s(_,"checkbox2_checked_binding");let h={label:A("dialog.display_entity.override_glow_color.title"),tooltip:A("dialog.display_entity.override_glow_color.description"),defaultValue:wt.prototype.overrideGlowColor};t[10]!==void 0&&(h.checked=t[10]),l=new mi({props:h}),Te.push(()=>Be(l,"checked",_));let v=t[2]&&NO(t);return{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment),d=J(),v&&v.c(),u=_t()},m(b,y){Ae(e,b,y),U(b,i,y),Ae(a,b,y),U(b,o,y),Ae(l,b,y),U(b,d,y),v&&v.m(b,y),U(b,u,y),p=!0},p(b,y){let w={};!n&&y[0]&256&&(n=!0,w.checked=b[8],Me(()=>n=!1)),e.$set(w);let S={};!r&&y[0]&512&&(r=!0,S.checked=b[9],Me(()=>r=!1)),a.$set(S);let F={};!c&&y[0]&1024&&(c=!0,F.checked=b[10],Me(()=>c=!1)),l.$set(F),b[2]?v?(v.p(b,y),y[0]&4&&ae(v,1)):(v=NO(b),v.c(),ae(v,1),v.m(u.parentNode,u)):v&&(Sn(),de(v,1,1,()=>{v=null}),On())},i(b){p||(ae(e.$$.fragment,b),ae(a.$$.fragment,b),ae(l.$$.fragment,b),ae(v),p=!0)},o(b){de(e.$$.fragment,b),de(a.$$.fragment,b),de(l.$$.fragment,b),de(v),p=!1},d(b){je(e,b),b&&z(i),je(a,b),b&&z(o),je(l,b),b&&z(d),v&&v.d(b),b&&z(u)}}}s(FO,"create_if_block");function NO(t){let e,n,i;function a(o){t[36](o)}s(a,"colorpicker_value_binding");let r={label:A("dialog.display_entity.glow_color.title"),tooltip:A("dialog.display_entity.glow_color.description")};return t[11]!==void 0&&(r.value=t[11]),e=new IO({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2048&&(n=!0,c.value=o[11],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(NO,"create_if_block_1");function lwe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B,q,G,W;e=new ts({props:{label:A("dialog.display_entity.node_options.title")}});function ee(te){t[28](te)}s(ee,"codeinput0_value_binding");let Z={label:A("dialog.display_entity.on_summon_function.title"),tooltip:A("dialog.display_entity.on_summon_function.description"),defaultValue:""};t[0]!==void 0&&(Z.value=t[0]),i=new ka({props:Z}),Te.push(()=>Be(i,"value",ee)),o=new ts({props:{label:A("dialog.display_entity.per_variant_options.title")}});function me(te){t[29](te)}s(me,"codeinput1_value_binding");let X={label:A("dialog.display_entity.on_apply_function.title"),tooltip:A("dialog.display_entity.on_apply_function.description"),defaultValue:""};t[4]!==void 0&&(X.value=t[4]),f=new ka({props:X}),Te.push(()=>Be(f,"value",me));function Q(te){t[30](te)}s(Q,"select_value_binding");let he={label:A("dialog.display_entity.billboard.title"),tooltip:A("dialog.display_entity.billboard.description"),options:cwe,defaultOption:wt.prototype.billboard};t[5]!==void 0&&(he.value=t[5]),_=new es({props:he}),Te.push(()=>Be(_,"value",Q));function Ie(te){t[31](te)}s(Ie,"checkbox_checked_binding");let le={label:A("dialog.display_entity.override_brightness.title"),tooltip:A("dialog.display_entity.override_brightness.description"),defaultValue:wt.prototype.overrideBrightness};t[6]!==void 0&&(le.checked=t[6]),b=new mi({props:le}),Te.push(()=>Be(b,"checked",Ie));let ge=t[3]&&DO(t),V=!(t[1]instanceof ve)&&FO(t);function H(te){t[37](te)}s(H,"numberslider0_value_binding");let re={label:A("dialog.display_entity.shadow_radius.title"),tooltip:A("dialog.display_entity.shadow_radius.description"),defaultValue:wt.prototype.shadowRadius,min:0,max:15};t[12]!==void 0&&(re.value=t[12]),N=new Mr({props:re}),Te.push(()=>Be(N,"value",H));function xe(te){t[38](te)}s(xe,"numberslider1_value_binding");let fe={label:A("dialog.display_entity.shadow_strength.title"),tooltip:A("dialog.display_entity.shadow_strength.description"),defaultValue:wt.prototype.shadowStrength,min:0,max:15};return t[13]!==void 0&&(fe.value=t[13]),D=new Mr({props:fe}),Te.push(()=>Be(D,"value",xe)),{c(){Ce(e.$$.fragment),n=J(),Ce(i.$$.fragment),r=J(),Ce(o.$$.fragment),l=J(),c=L("div"),u=J(),p=L("hr"),m=J(),Ce(f.$$.fragment),x=J(),Ce(_.$$.fragment),v=J(),Ce(b.$$.fragment),w=J(),ge&&ge.c(),S=J(),V&&V.c(),F=J(),Ce(N.$$.fragment),R=J(),Ce(D.$$.fragment),E(c,"class","variant-select svelte-11baq0x")},m(te,Y){Ae(e,te,Y),U(te,n,Y),Ae(i,te,Y),U(te,r,Y),Ae(o,te,Y),U(te,l,Y),U(te,c,Y),U(te,u,Y),U(te,p,Y),U(te,m,Y),Ae(f,te,Y),U(te,x,Y),Ae(_,te,Y),U(te,v,Y),Ae(b,te,Y),U(te,w,Y),ge&&ge.m(te,Y),U(te,S,Y),V&&V.m(te,Y),U(te,F,Y),Ae(N,te,Y),U(te,R,Y),Ae(D,te,Y),q=!0,G||(W=bn(d=t[16].call(null,c)),G=!0)},p(te,Y){let we={};!a&&Y[0]&1&&(a=!0,we.value=te[0],Me(()=>a=!1)),i.$set(we);let Le={};!g&&Y[0]&16&&(g=!0,Le.value=te[4],Me(()=>g=!1)),f.$set(Le);let Tt={};!h&&Y[0]&32&&(h=!0,Tt.value=te[5],Me(()=>h=!1)),_.$set(Tt);let tn={};!y&&Y[0]&64&&(y=!0,tn.checked=te[6],Me(()=>y=!1)),b.$set(tn),te[3]?ge?(ge.p(te,Y),Y[0]&8&&ae(ge,1)):(ge=DO(te),ge.c(),ae(ge,1),ge.m(S.parentNode,S)):ge&&(Sn(),de(ge,1,1,()=>{ge=null}),On()),te[1]instanceof ve?V&&(Sn(),de(V,1,1,()=>{V=null}),On()):V?(V.p(te,Y),Y[0]&2&&ae(V,1)):(V=FO(te),V.c(),ae(V,1),V.m(F.parentNode,F));let kn={};!k&&Y[0]&4096&&(k=!0,kn.value=te[12],Me(()=>k=!1)),N.$set(kn);let Rn={};!B&&Y[0]&8192&&(B=!0,Rn.value=te[13],Me(()=>B=!1)),D.$set(Rn)},i(te){q||(ae(e.$$.fragment,te),ae(i.$$.fragment,te),ae(o.$$.fragment,te),ae(f.$$.fragment,te),ae(_.$$.fragment,te),ae(b.$$.fragment,te),ae(ge),ae(V),ae(N.$$.fragment,te),ae(D.$$.fragment,te),q=!0)},o(te){de(e.$$.fragment,te),de(i.$$.fragment,te),de(o.$$.fragment,te),de(f.$$.fragment,te),de(_.$$.fragment,te),de(b.$$.fragment,te),de(ge),de(V),de(N.$$.fragment,te),de(D.$$.fragment,te),q=!1},d(te){je(e,te),te&&z(n),je(i,te),te&&z(r),je(o,te),te&&z(l),te&&z(c),te&&z(u),te&&z(p),te&&z(m),je(f,te),te&&z(x),je(_,te),te&&z(v),je(b,te),te&&z(w),ge&&ge.d(te),te&&z(S),V&&V.d(te),te&&z(F),je(N,te),te&&z(R),je(D,te),G=!1,W()}}}s(lwe,"create_fragment");var cwe={fixed:A("dialog.display_entity.billboard.options.fixed"),vertical:A("dialog.display_entity.billboard.options.vertical"),horizontal:A("dialog.display_entity.billboard.options.horizontal"),center:A("dialog.display_entity.billboard.options.center")},lr=wt.getDefault();function uwe(t,e,n){let i,a,r=ie,o=s(()=>(r(),r=rt(we,Ne=>n(19,a=Ne)),we),"$$subscribe_shadowStrength"),l,c=ie,d=s(()=>(c(),c=rt(Y,Ne=>n(20,l=Ne)),Y),"$$subscribe_shadowRadius"),u,p,m=ie,f=s(()=>(m(),m=rt(fe,Ne=>n(22,p=Ne)),fe),"$$subscribe_glowColor"),g,x=ie,_=s(()=>(x(),x=rt(xe,Ne=>n(2,g=Ne)),xe),"$$subscribe_overrideGlowColor"),h,v=ie,b=s(()=>(v(),v=rt(re,Ne=>n(23,h=Ne)),re),"$$subscribe_glowing"),y,w=ie,S=s(()=>(w(),w=rt(H,Ne=>n(24,y=Ne)),H),"$$subscribe_enchanted"),F,N=ie,k=s(()=>(N(),N=rt(V,Ne=>n(25,F=Ne)),V),"$$subscribe_brightnessOverride"),R,D=ie,B=s(()=>(D(),D=rt(ge,Ne=>n(3,R=Ne)),ge),"$$subscribe_overrideBrightness"),q,G=ie,W=s(()=>(G(),G=rt(le,Ne=>n(26,q=Ne)),le),"$$subscribe_billboard"),ee,Z=ie,me=s(()=>(Z(),Z=rt(Ie,Ne=>n(27,ee=Ne)),Ie),"$$subscribe_onApplyFunction");t.$$.on_destroy.push(()=>r()),t.$$.on_destroy.push(()=>c()),t.$$.on_destroy.push(()=>m()),t.$$.on_destroy.push(()=>x()),t.$$.on_destroy.push(()=>v()),t.$$.on_destroy.push(()=>w()),t.$$.on_destroy.push(()=>N()),t.$$.on_destroy.push(()=>D()),t.$$.on_destroy.push(()=>G()),t.$$.on_destroy.push(()=>Z());let{displayEntity:X}=e,{onSummonFunction:Q}=e,{configs:he}=e,Ie=new ke(lr.onApplyFunction);me();let le=new ke(lr.billboard);W();let ge=new ke(lr.overrideBrightness);B();let V=new ke(lr.brightnessOverride);k();let H=new ke(lr.enchanted);S();let re=new ke(lr.glowing);b();let xe=new ke(lr.overrideGlowColor);_();let fe=new ke(lr.glowColor);f();let te=new ke(lr.invisible);Pa(t,te,Ne=>n(21,u=Ne));let Y=new ke(lr.shadowRadius);d();let we=new ke(lr.shadowStrength);o();let Le,Tt=s(Ne=>{let Un=qe.getByUUID(Ne);if(!Un){console.error(`Variant with UUID ${Ne} not found`);return}Un.isDefault?Le=wt.fromJSON(he.default):Le=wt.fromJSON(he.variants[Un.uuid]??{}),Jt(Ie,ee=Le.onApplyFunction,ee),Jt(le,q=Le.billboard,q),Jt(ge,R=Le.overrideBrightness,R),Jt(V,F=Le.brightnessOverride,F),Jt(H,y=Le.enchanted,y),Jt(re,h=Le.glowing,h),Jt(xe,g=Le.overrideGlowColor,g),Jt(fe,p=Le.glowColor,p),Jt(te,u=Le.invisible,u),Jt(Y,l=Le.shadowRadius,l),Jt(we,a=Le.shadowStrength,a)},"loadConfig"),tn=s(Ne=>{let Un=qe.getByUUID(Ne);if(!Un){console.error(`Variant with UUID ${Ne} not found`);return}Un.isDefault?n(17,he.default=Le.toJSON(),he):n(17,he.variants[Un.uuid]=Le.toJSON(),he)},"saveConfig"),kn=Object.fromEntries(qe.all.map(Ne=>[Ne.uuid,Ne.displayName])),Rn=new ke(qe.getDefault().uuid);Pa(t,Rn,Ne=>n(18,i=Ne));let ii=new Interface.CustomElements.SelectInput("animated-java:display-entity-variant-select",{options:kn,value:i,onChange(Ne){Jt(Rn,i=Ne,i)}}),Ft=Rn.subscribe(Ne=>{ii.set(Ne)}),$t=s(Ne=>{Ne.appendChild(ii.node)},"mountVariantSelect");Zi(()=>{Ft()});function ai(Ne){Q=Ne,n(0,Q)}s(ai,"codeinput0_value_binding");function cr(Ne){Ie=Ne,me(n(4,Ie))}s(cr,"codeinput1_value_binding");function Fa(Ne){le=Ne,W(n(5,le))}s(Fa,"select_value_binding");function Na(Ne){ge=Ne,B(n(6,ge))}s(Na,"checkbox_checked_binding");function Ra(Ne){V=Ne,k(n(7,V))}s(Ra,"numberslider_value_binding");function ur(Ne){H=Ne,S(n(8,H))}s(ur,"checkbox0_checked_binding");function Fi(Ne){re=Ne,b(n(9,re))}s(Fi,"checkbox1_checked_binding");function Gr(Ne){xe=Ne,_(n(10,xe))}s(Gr,"checkbox2_checked_binding");function Ma(Ne){fe=Ne,f(n(11,fe))}s(Ma,"colorpicker_value_binding");function Wr(Ne){Y=Ne,d(n(12,Y))}s(Wr,"numberslider0_value_binding");function Wi(Ne){we=Ne,o(n(13,we))}return s(Wi,"numberslider1_value_binding"),t.$$set=Ne=>{"displayEntity"in Ne&&n(1,X=Ne.displayEntity),"onSummonFunction"in Ne&&n(0,Q=Ne.onSummonFunction),"configs"in Ne&&n(17,he=Ne.configs)},t.$$.update=()=>{if(t.$$.dirty[0]&262144)e:Tt(i);if(t.$$.dirty[0]&268173324)e:Le.onApplyFunction=ee,Le.billboard=q,Le.overrideBrightness=R,Le.brightnessOverride=F,Le.enchanted=y,Le.glowing=h,Le.overrideGlowColor=g,Le.glowColor=p,Le.invisible=u,Le.shadowRadius=l,Le.shadowStrength=a,tn(i)},[Q,X,g,R,Ie,le,ge,V,H,re,xe,fe,Y,we,te,Rn,$t,he,i,a,l,u,p,h,y,F,q,ee,ai,cr,Fa,Na,Ra,ur,Fi,Gr,Ma,Wr,Wi]}s(uwe,"instance");var Gh=class extends Pe{constructor(e){super(),Ve(this,e,uwe,lwe,De,{displayEntity:1,onSummonFunction:0,configs:17},null,[-1,-1])}};s(Gh,"DisplayEntityConfigDialog");var RO=Gh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".variant-select.svelte-11baq0x{margin:0px 32px 8px 24px}.variant-select.svelte-11baq0x bb-select{width:100%}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Ob(t){return t instanceof Group||t instanceof ve||t instanceof We||t instanceof $e}s(Ob,"isDisplayEntity");function dwe(t){let e=new ke(t.onSummonFunction??""),n=structuredClone(t.configs);new cn({id:"animated-java:displayEntityConfig",title:A("dialog.display_entity.title",t.name),width:600,content:{component:RO,props:{displayEntity:t,onSummonFunction:e,configs:n}},preventKeybinds:!0,onConfirm(){console.log("Saving display entity config for",t.name,n),t.onSummonFunction=e.get().trim(),t.configs=n,Project.saved=!1}}).show()}s(dwe,"openDisplayEntityConfigDialog");var dl=null,pwe=nn({id:"animated-java:action/copy-display-entity-config"},{icon:"content_copy",name:A("action.copy_display_entity_config.name"),click:()=>{let t=Group.first_selected??selected.at(0);Ob(t)?(dl={sourceName:t.name,onSummonFunction:t.onSummonFunction??"",configs:structuredClone(t.configs)},Blockbench.showQuickMessage(A("action.copy_display_entity_config.message",dl.sourceName))):console.error("Attempted to copy display entity config with no display entity selected")}}),mwe=nn({id:"animated-java:action/paste-display-entity-config"},{icon:"content_paste",name:A("action.paste_display_entity_config.name"),condition:()=>!!dl&&Fe(),click:()=>{if(!dl)return;let t=Group.first_selected??selected.at(0);if(Ob(t)){t instanceof Group?Undo.initEdit({group:t}):Undo.initEdit({elements:[t]}),t.onSummonFunction=dl.onSummonFunction,t.configs=structuredClone(dl.configs);let e=A("action.paste_display_entity_config.message",dl.sourceName);t instanceof Group?Undo.finishEdit(e,{group:t}):Undo.finishEdit(e,{elements:[t]}),Blockbench.showQuickMessage(e)}else console.error("Attempted to paste display entity config with no display entity selected")}}),fwe=nn({id:"animated-java:action/open-display-entity-config",dependencies:["animated-java:action/copy-display-entity-config","animated-java:action/paste-display-entity-config"]},{icon:"settings",name:A("action.open_display_entity_config.name"),condition:Fe,click:()=>{let t=Group.first_selected??selected.at(0);Ob(t)?dwe(t):console.error("Attempted to open display entity config dialog with no display entity selected")}});fwe.onCreated(t=>{let e=pwe.get();if(!e){console.error("Copy display entity config action not registered");return}let n=mwe.get();if(!n){console.error("Paste display entity config action not registered");return}Group.prototype.menu.structure.splice(6,0,"_"),Group.prototype.menu.addAction(t,7),Group.prototype.menu.addAction(e,8),Group.prototype.menu.addAction(n,9);let i=new Menu([...Outliner.control_menu_group,"_",t,e,n,"_","rename","delete"]);ve.prototype.menu=i,We.prototype.menu=i,$e.prototype.menu=i});function MO(t,e,n){let i=t.slice();return i[14]=e[n],i}s(MO,"get_each_context");function hwe(t){let e,n,i,a,r,o,l;function c(f){t[8](f)}s(c,"checkbox_checked_binding");let d={label:A("dialog.locator_config.use_entity.title"),tooltip:A("dialog.locator_config.use_entity.description"),defaultValue:!1};t[0]!==void 0&&(d.checked=t[0]),e=new mi({props:d}),Te.push(()=>Be(e,"checked",c));let u=t[6]&&BO(t);function p(f){t[13](f)}s(p,"codeinput_value_binding");let m={label:A("dialog.locator_config.on_tick_function.title"),tooltip:t[6]?A("dialog.locator_config.on_tick_function.description_with_use_entity"):A("dialog.locator_config.on_tick_function.description"),defaultValue:""};return t[5]!==void 0&&(m.value=t[5]),r=new ka({props:m}),Te.push(()=>Be(r,"value",p)),{c(){Ce(e.$$.fragment),i=J(),u&&u.c(),a=J(),Ce(r.$$.fragment)},m(f,g){Ae(e,f,g),U(f,i,g),u&&u.m(f,g),U(f,a,g),Ae(r,f,g),l=!0},p(f,g){let x={};!n&&g&1&&(n=!0,x.checked=f[0],Me(()=>n=!1)),e.$set(x),f[6]?u?(u.p(f,g),g&64&&ae(u,1)):(u=BO(f),u.c(),ae(u,1),u.m(a.parentNode,a)):u&&(Sn(),de(u,1,1,()=>{u=null}),On());let _={};g&64&&(_.tooltip=f[6]?A("dialog.locator_config.on_tick_function.description_with_use_entity"):A("dialog.locator_config.on_tick_function.description")),!o&&g&32&&(o=!0,_.value=f[5],Me(()=>o=!1)),r.$set(_)},i(f){l||(ae(e.$$.fragment,f),ae(u),ae(r.$$.fragment,f),l=!0)},o(f){de(e.$$.fragment,f),de(u),de(r.$$.fragment,f),l=!1},d(f){je(e,f),f&&z(i),u&&u.d(f),f&&z(a),je(r,f)}}}s(hwe,"create_else_block");function gwe(t){let e,n=A("dialog.locator_config.plugin_mode_warning").split(` `),i=[];for(let a=0;aBe(e,"value",f));function x(w){t[10](w)}s(x,"checkbox_checked_binding_1");let _={label:A("dialog.locator_config.sync_passenger_rotation.title"),tooltip:A("dialog.locator_config.sync_passenger_rotation.description"),defaultValue:!1};t[2]!==void 0&&(_.checked=t[2]),a=new mi({props:_}),Te.push(()=>Be(a,"checked",x));function h(w){t[11](w)}s(h,"codeinput0_value_binding");let v={label:A("dialog.locator_config.on_summon_function.title"),tooltip:t[6]?A("dialog.locator_config.on_summon_function.description_with_use_entity"):A("dialog.locator_config.on_summon_function.description"),defaultValue:""};t[3]!==void 0&&(v.value=t[3]),l=new ka({props:v}),Te.push(()=>Be(l,"value",h));function b(w){t[12](w)}s(b,"codeinput1_value_binding");let y={label:A("dialog.locator_config.on_remove_function.title"),tooltip:t[6]?A("dialog.locator_config.on_remove_function.description_with_use_entity"):A("dialog.locator_config.on_remove_function.description"),defaultValue:""};return t[4]!==void 0&&(y.value=t[4]),u=new ka({props:y}),Te.push(()=>Be(u,"value",b)),{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment),d=J(),Ce(u.$$.fragment)},m(w,S){Ae(e,w,S),U(w,i,S),Ae(a,w,S),U(w,o,S),Ae(l,w,S),U(w,d,S),Ae(u,w,S),m=!0},p(w,S){let F={};!n&&S&2&&(n=!0,F.value=w[1],Me(()=>n=!1)),e.$set(F);let N={};!r&&S&4&&(r=!0,N.checked=w[2],Me(()=>r=!1)),a.$set(N);let k={};S&64&&(k.tooltip=w[6]?A("dialog.locator_config.on_summon_function.description_with_use_entity"):A("dialog.locator_config.on_summon_function.description")),!c&&S&8&&(c=!0,k.value=w[3],Me(()=>c=!1)),l.$set(k);let R={};S&64&&(R.tooltip=w[6]?A("dialog.locator_config.on_remove_function.description_with_use_entity"):A("dialog.locator_config.on_remove_function.description")),!p&&S&16&&(p=!0,R.value=w[4],Me(()=>p=!1)),u.$set(R)},i(w){m||(ae(e.$$.fragment,w),ae(a.$$.fragment,w),ae(l.$$.fragment,w),ae(u.$$.fragment,w),m=!0)},o(w){de(e.$$.fragment,w),de(a.$$.fragment,w),de(l.$$.fragment,w),de(u.$$.fragment,w),m=!1},d(w){je(e,w),w&&z(i),je(a,w),w&&z(o),je(l,w),w&&z(d),je(u,w)}}}s(BO,"create_if_block_1");function PO(t){let e,n=t[14]+"",i;return{c(){e=L("p"),i=Re(n)},m(a,r){U(a,e,r),I(e,i)},p:ie,d(a){a&&z(e)}}}s(PO,"create_each_block");function _we(t){let e,n,i,a,r=[gwe,hwe],o=[];function l(c,d){return c[7]?0:1}return s(l,"select_block_type"),n=l(t,-1),i=o[n]=r[n](t),{c(){e=L("div"),i.c()},m(c,d){U(c,e,d),o[n].m(e,null),a=!0},p(c,[d]){i.p(c,d)},i(c){a||(ae(i),a=!0)},o(c){de(i),a=!1},d(c){c&&z(e),o[n].d()}}}s(_we,"create_fragment");var xwe=s(t=>t.length===0?{type:"error",message:A("dialog.locator_config.entity_type.error.empty")}:Xn.entity_type?.has(t)||Xn.entity_type?.has(t.replace(/^minecraft\:/,""))?{type:"success",message:""}:{type:"warning",message:A("dialog.locator_config.entity_type.warning.invalid")},"entityTypeValidator");function vwe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(l,b=>n(6,i=b)),l),"$$subscribe_useEntity");t.$$.on_destroy.push(()=>a());let o=!!Project?.animated_java?.enable_plugin_mode,{useEntity:l}=e;r();let{entityType:c}=e,{syncPassengerRotation:d}=e,{onSummonFunction:u}=e,{onRemoveFunction:p}=e,{onTickFunction:m}=e;function f(b){l=b,r(n(0,l))}s(f,"checkbox_checked_binding");function g(b){c=b,n(1,c)}s(g,"lineinput_value_binding");function x(b){d=b,n(2,d)}s(x,"checkbox_checked_binding_1");function _(b){u=b,n(3,u)}s(_,"codeinput0_value_binding");function h(b){p=b,n(4,p)}s(h,"codeinput1_value_binding");function v(b){m=b,n(5,m)}return s(v,"codeinput_value_binding"),t.$$set=b=>{"useEntity"in b&&r(n(0,l=b.useEntity)),"entityType"in b&&n(1,c=b.entityType),"syncPassengerRotation"in b&&n(2,d=b.syncPassengerRotation),"onSummonFunction"in b&&n(3,u=b.onSummonFunction),"onRemoveFunction"in b&&n(4,p=b.onRemoveFunction),"onTickFunction"in b&&n(5,m=b.onTickFunction)},[l,c,d,u,p,m,i,o,f,g,x,_,h,v]}s(vwe,"instance");var Wh=class extends Pe{constructor(e){super(),Ve(this,e,vwe,_we,De,{useEntity:0,entityType:1,syncPassengerRotation:2,onSummonFunction:3,onRemoveFunction:4,onTickFunction:5})}};s(Wh,"LocatorConfigDialog");var LO=Wh;function bwe(t){let e=Nr.fromJSON(t.config??=new Nr().toJSON()),n=new ke(e.useEntity),i=new ke(e.entityType),a=new ke(e.syncPassengerRotation),r=new ke(e.onSummonFunction),o=new ke(e.onRemoveFunction),l=new ke(e.onTickFunction);new cn({id:`${Ke.name}:locatorConfig`,title:A("dialog.locator_config.title"),width:600,content:{component:LO,props:{useEntity:n,entityType:i,syncPassengerRotation:a,onSummonFunction:r,onRemoveFunction:o,onTickFunction:l}},preventKeybinds:!0,onConfirm(){e.useEntity=n.get(),e.entityType=i.get(),e.syncPassengerRotation=a.get(),e.onSummonFunction=r.get(),e.onRemoveFunction=o.get(),e.onTickFunction=l.get(),t.config=e.toJSON()}}).show()}s(bwe,"openLocatorConfigDialog");var ywe=nn({id:"animated-java:locator-config"},{icon:"settings",name:A("action.open_locator_config.name"),condition:Fe,click:()=>{let t=Locator.selected.at(0);t&&bwe(t)}});ywe.onCreated(t=>{Locator.prototype.menu.addAction(t,"6")});var VO="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA0SURBVHgB7ZKhDQBACAOPF7//vBgIC9RgCKH2khNtzYlA5GMK82jmBBMENbL8gWt8Je4QJCfXBhajwtfNAAAAAElFTkSuQmCC";function zO(t,e,n){let i=t.slice();return i[31]=e[n],i}s(zO,"get_each_context");function UO(t,e,n){let i=t.slice();return i[34]=e[n],i}s(UO,"get_each_context_1");function qO(t,e,n){let i=t.slice();return i[34]=e[n],i}s(qO,"get_each_context_2");function Ewe(t){let e,n,i;function a(o){t[21](o)}s(a,"lineinput_value_binding_2");let r={label:A("dialog.variant_config.variant_name"),tooltip:A("dialog.variant_config.variant_name.description"),defaultValue:"new_variant"};return t[1]!==void 0&&(r.value=t[1]),e=new aa({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2&&(n=!0,c.value=o[1],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Ewe,"create_else_block_1");function kwe(t){let e,n,i;function a(o){t[20](o)}s(a,"lineinput_value_binding_1");let r={label:A("dialog.variant_config.variant_name"),tooltip:A("dialog.variant_config.variant_name.description"),disabled:!0,defaultValue:"new_variant"};return t[1]!==void 0&&(r.value=t[1]),e=new aa({props:r}),Te.push(()=>Be(e,"value",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2&&(n=!0,c.value=o[1],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(kwe,"create_if_block_1");function HO(t){let e,n,i,a,r=[kwe,Ewe],o=[];function l(c,d){return c[8]?0:1}return s(l,"select_block_type"),e=l(t,[-1,-1]),n=o[e]=r[e](t),{c(){n.c(),i=_t()},m(c,d){o[e].m(c,d),U(c,i,d),a=!0},p(c,d){let u=e;e=l(c,d),e===u?o[e].p(c,d):(Sn(),de(o[u],1,1,()=>{o[u]=null}),On(),n=o[e],n?n.p(c,d):(n=o[e]=r[e](c),n.c()),ae(n,1),n.m(i.parentNode,i))},i(c){a||(ae(n),a=!0)},o(c){de(n),a=!1},d(c){o[e].d(c),c&&z(i)}}}s(HO,"create_key_block_1");function JO(t){let e,n,i,a,r,o,l,c,d,u=t[7],p,m,f=A("dialog.variant_config.texture_map.description")+"",g,x,_,h,v,b,y=XO(t);function w(F){t[27](F)}s(w,"collection_includedItems_binding");let S={label:A("dialog.variant_config.excluded_nodes.title"),tooltip:A("dialog.variant_config.bone_lists.description"),availableItemsColumnLable:A("dialog.variant_config.included_nodes.title"),availableItemsColumnTooltip:A("dialog.variant_config.included_nodes.description"),includedItemsColumnLable:A("dialog.variant_config.excluded_nodes.title"),includedItemsColumnTooltip:A("dialog.variant_config.excluded_nodes.description"),swapColumnsButtonTooltip:A("dialog.variant_config.swap_columns_button.tooltip"),availableItems:t[13]};return t[3]!==void 0&&(S.includedItems=t[3]),x=new qh({props:S}),Te.push(()=>Be(x,"includedItems",w)),{c(){e=L("div"),n=L("div"),n.textContent=`${A("dialog.variant_config.texture_map.title")}`,i=J(),a=L("div"),r=J(),o=L("div"),l=L("i"),l.textContent="add",d=J(),y.c(),p=J(),m=L("div"),g=J(),Ce(x.$$.fragment),E(a,"class","spacer svelte-ihnqu8"),E(l,"class","material-icons icon"),E(o,"class","tool"),E(o,"title",c=A("dialog.variant_config.texture_map.create_new_mapping")),E(e,"class","toolbar svelte-ihnqu8"),Xe(e,"margin","8px 0"),E(m,"class","texture-map-description svelte-ihnqu8")},m(F,N){U(F,e,N),I(e,n),I(e,i),I(e,a),I(e,r),I(e,o),I(o,l),U(F,d,N),y.m(F,N),U(F,p,N),U(F,m,N),m.innerHTML=f,U(F,g,N),Ae(x,F,N),h=!0,v||(b=Ue(o,"click",t[23]),v=!0)},p(F,N){N[0]&128&&De(u,u=F[7])?(y.d(1),y=XO(F),y.c(),y.m(p.parentNode,p)):y.p(F,N);let k={};!_&&N[0]&8&&(_=!0,k.includedItems=F[3],Me(()=>_=!1)),x.$set(k)},i(F){h||(ae(x.$$.fragment,F),h=!0)},o(F){de(x.$$.fragment,F),h=!1},d(F){F&&z(e),F&&z(d),y.d(F),F&&z(p),F&&z(m),F&&z(g),je(x,F),v=!1,b()}}}s(JO,"create_if_block");function GO(t){let e;return{c(){e=L("div"),e.textContent=`${A("dialog.variant_config.texture_map.no_mappings")} `,E(e,"class","no-mappings svelte-ihnqu8")},m(n,i){U(n,e,i)},p:ie,d(n){n&&z(e)}}}s(GO,"create_else_block");function WO(t){let e,n=t[34].name+"",i,a,r,o;return{c(){e=L("option"),i=Re(n),a=J(),e.selected=r=t[34].uuid===t[31][0],e.__value=o=`\r `+t[34].name+`\r `,e.value=e.__value},m(l,c){U(l,e,c),I(e,i),I(e,a)},p(l,c){c[0]&64&&r!==(r=l[34].uuid===l[31][0])&&(e.selected=r)},d(l){l&&z(e)}}}s(WO,"create_each_block_2");function KO(t){let e,n=t[34].name+"",i,a,r,o;return{c(){e=L("option"),i=Re(n),a=J(),e.selected=r=t[34].uuid===t[31][1],e.__value=o=`\r `+t[34].name+`\r `,e.value=e.__value},m(l,c){U(l,e,c),I(e,i),I(e,a)},p(l,c){c[0]&64&&r!==(r=l[34].uuid===l[31][1])&&(e.selected=r)},d(l){l&&z(e)}}}s(KO,"create_each_block_1");function YO(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N=t[11],k=[];for(let W=0;WBe(n,"value",g));let _=HO(t);function h(y){t[22](y)}s(h,"checkbox_checked_binding");let v={label:A("dialog.variant_config.generate_name_from_display_name"),tooltip:A("dialog.variant_config.generate_name_from_display_name.description"),defaultValue:!0};t[2]!==void 0&&(v.checked=t[2]),l=new mi({props:v}),Te.push(()=>Be(l,"checked",h));let b=!t[4].isDefault&&JO(t);return{c(){e=L("div"),Ce(n.$$.fragment),a=J(),_.c(),o=J(),Ce(l.$$.fragment),d=J(),b&&b.c(),u=J(),p=L("div"),m=Re(t[10]),E(p,"class","uuid svelte-ihnqu8"),E(e,"class","dialog-container svelte-ihnqu8")},m(y,w){U(y,e,w),Ae(n,e,null),I(e,a),_.m(e,null),I(e,o),Ae(l,e,null),I(e,d),b&&b.m(e,null),I(e,u),I(e,p),I(p,m),f=!0},p(y,w){let S={};!i&&w[0]&1&&(i=!0,S.value=y[0],Me(()=>i=!1)),n.$set(S),w[0]&512&&De(r,r=y[9])?(Sn(),de(_,1,1,ie),On(),_=HO(y),_.c(),ae(_,1),_.m(e,o)):_.p(y,w);let F={};!c&&w[0]&4&&(c=!0,F.checked=y[2],Me(()=>c=!1)),l.$set(F),y[4].isDefault?b&&(Sn(),de(b,1,1,()=>{b=null}),On()):b?(b.p(y,w),w[0]&16&&ae(b,1)):(b=JO(y),b.c(),ae(b,1),b.m(e,u)),(!f||w[0]&1024)&&ct(m,y[10])},i(y){f||(ae(n.$$.fragment,y),ae(_),ae(l.$$.fragment,y),ae(b),f=!0)},o(y){de(n.$$.fragment,y),de(_),de(l.$$.fragment,y),de(b),f=!1},d(y){y&&z(e),je(n),_.d(y),je(l),b&&b.d()}}}s(jwe,"create_fragment");function Awe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(_,H=>n(28,i=H)),_),"$$subscribe_displayName"),o,l=ie,c=s(()=>(l(),l=rt(y,H=>n(8,o=H)),y),"$$subscribe_generateNameFromDisplayName"),d,u=ie,p=s(()=>(u(),u=rt(h,H=>n(9,d=H)),h),"$$subscribe_name"),m,f=ie,g=s(()=>(f(),f=rt(v,H=>n(10,m=H)),v),"$$subscribe_uuid");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l()),t.$$.on_destroy.push(()=>u()),t.$$.on_destroy.push(()=>f());let{variant:x}=e,{displayName:_}=e;r();let{name:h}=e;p();let{uuid:v}=e;g();let{textureMap:b}=e,{generateNameFromDisplayName:y}=e;c();let{excludedNodes:w}=e,S=[...Texture.all],F=[...Texture.all],N=S,k=Ah(w.get(),{groupsOnly:!0,excludeEmptyGroups:!0}),R=0;_.subscribe(H=>{o&&h.set(qe.makeNameUnique(x,H))}),y.subscribe(H=>{H&&h.set(qe.makeNameUnique(x,i))});function D(){let H=ee()[0];H&&(b.add(H.uuid,H.uuid),n(7,R++,R))}s(D,"createTextureMapping");function B(H){b.delete(H),n(7,R++,R)}s(B,"deleteTextureMapping");function q(H){let re=S.find(xe=>xe.uuid===H);return re?re.img.src:VO}s(q,"getTextureSrc");function G(H,re){let fe=H.target.value.trim(),te=F.find(we=>we.name===fe)?.uuid;if(!te){console.error(`Failed to find new primary texture with the name: ${fe}`);return}let Y=b.get(re);if(!Y){console.error(`Failed to find secondary texture with the uuid: ${re}`);return}b.delete(re),b.add(te,Y),n(7,R++,R)}s(G,"selectNewPrimaryTexture");function W(H,re){let fe=H.target.value.trim(),te=N.find(Y=>Y.name===fe)?.uuid;if(!te){console.error(`Failed to find new secondary texture with the name: ${fe}`);return}b.add(re,te),n(7,R++,R)}s(W,"selectNewSecondaryTexture");function ee(){let H=[...b.map.keys()];return F.filter(re=>!H.includes(re.uuid))}s(ee,"getUnusedPrimaryTextures");function Z(H){_=H,r(n(0,_))}s(Z,"lineinput_value_binding");function me(H){h=H,p(n(1,h))}s(me,"lineinput_value_binding_1");function X(H){h=H,p(n(1,h))}s(X,"lineinput_value_binding_2");function Q(H){y=H,c(n(2,y))}s(Q,"checkbox_checked_binding");let he=s(()=>D(),"click_handler"),Ie=s((H,re)=>G(re,H[0]),"change_handler"),le=s((H,re)=>W(re,H[0]),"change_handler_1"),ge=s(H=>B(H[0]),"click_handler_1");function V(H){w=H,n(3,w)}return s(V,"collection_includedItems_binding"),t.$$set=H=>{"variant"in H&&n(4,x=H.variant),"displayName"in H&&r(n(0,_=H.displayName)),"name"in H&&p(n(1,h=H.name)),"uuid"in H&&g(n(5,v=H.uuid)),"textureMap"in H&&n(6,b=H.textureMap),"generateNameFromDisplayName"in H&&c(n(2,y=H.generateNameFromDisplayName)),"excludedNodes"in H&&n(3,w=H.excludedNodes)},[_,h,y,w,x,v,b,R,o,d,m,F,N,k,D,B,q,G,W,Z,me,X,Q,he,Ie,le,ge,V]}s(Awe,"instance");var Kh=class extends Pe{constructor(e){super(),Ve(this,e,Awe,jwe,De,{variant:4,displayName:0,name:1,uuid:5,textureMap:6,generateNameFromDisplayName:2,excludedNodes:3},null,[-1,-1])}};s(Kh,"VariantConfigDialog");var ZO=Kh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.dialog-container.svelte-ihnqu8{display:flex;flex-direction:column;overflow-y:auto;max-height:75vh}.uuid.svelte-ihnqu8{color:var(--color-subtle_text);font-style:italic;text-align:center;font-size:14px;user-select:all}.no-mappings.svelte-ihnqu8{color:var(--color-subtle_text);font-style:italic;text-align:center}.img-container.svelte-ihnqu8{display:flex;align-items:flex-start;width:128px;height:128px;pointer-events:none;background:repeating-conic-gradient(var(--color-dark) 0% 25%, transparent 0% 50%) 50% /\r 16px 16px}img.svelte-ihnqu8{width:128px;pointer-events:none}.texture-mapping-item.svelte-ihnqu8{display:flex;align-items:center;justify-content:space-between}.texture-mapping-item-dropdown-container.svelte-ihnqu8{position:relative;flex-grow:1;height:164px;display:flex;flex-direction:column;align-items:center;justify-content:center}.texture-mapping-item-dropdown.svelte-ihnqu8{display:flex;flex-direction:column;align-items:center;max-width:128px}.texture-map-container.svelte-ihnqu8{display:flex;flex-direction:column;border:1px solid var(--color-border);background-color:var(--color-back);padding:4px;overflow-y:auto;max-height:600px;overflow-y:auto;max-height:16rem;min-height:12rem}.spacer.svelte-ihnqu8{flex-grow:1}.toolbar.svelte-ihnqu8{display:flex;flex-direction:row;align-items:center}.texture-map-description.svelte-ihnqu8{font-size:0.9em;color:var(--color-subtle_text);margin-top:4px;margin-bottom:16px;max-width:80%}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Yh(t){let e=new ke(t.displayName),n=new ke(t.name),i=new ke(t.uuid),a=t.textureMap.copy(),r=new ke(t.generateNameFromDisplayName),o=new ke(t.excludedNodes);new cn({id:`${Ke.name}:variantConfig`,title:A("dialog.variant_config.title"),width:700,content:{component:ZO,props:{variant:t,displayName:e,name:n,uuid:i,textureMap:a,generateNameFromDisplayName:r,excludedNodes:o}},preventKeybinds:!0,onConfirm(){t.displayName=e.get(),t.name=n.get(),t.uuid=i.get(),t.textureMap=a,t.generateNameFromDisplayName=r.get(),t.excludedNodes=o.get(),K.UPDATE_VARIANT.publish(t),t.select(),Project.saved=!1}}).show()}s(Yh,"openVariantConfigDialog");function Twe(t,e,n){if(te[e.length-1])return e.length-1;let i=0,a=0,r=e.length-1;for(;r-a!==1;)i=a+Math.floor((r-a)/2),t>=e[i]?a=i:r=i;return n?r:a}s(Twe,"findIntervalBorderIndex");function Cwe(t,e=1){if(t<2)throw new Error(`steps must be > 2, got: ${t}`);let n=e/t;return Array.from({length:t},(i,a)=>a*n)}s(Cwe,"stepRange");var it=class{static step0(e){return e>0?1:0}static step1(e){return e>=1?1:0}static linear(e){return e}static quad(e){return e*e}static cubic(e){return e*e*e}static poly(e){return n=>Math.pow(n,e)}static sin(e){return 1-Math.cos(e*Math.PI/2)}static circle(e){return 1-Math.sqrt(1-e*e)}static exp(e){return Math.pow(2,10*(e-1))}static elastic(e=1){let n=e*Math.PI;return i=>1-Math.pow(Math.cos(i*Math.PI/2),3)*Math.cos(i*n)}static back(e=1.70158){return n=>n*n*((e+1)*n-e)}static bounce(e=.5){let n=s(o=>7.5625*o*o,"q"),i=s(o=>121/4*e*Math.pow(o-6/11,2)+1-e,"w"),a=s(o=>121*e*e*Math.pow(o-9/11,2)+1-e*e,"r"),r=s(o=>484*e*e*e*Math.pow(o-10.5/11,2)+1-e*e*e,"t");return o=>Math.min(n(o),i(o),a(o),r(o))}static in(e){return e}static out(e){return n=>1-e(1-n)}static inOut(e){return n=>n<.5?e(n*2)/2:1-e((1-n)*2)/2}};s(it,"Easing");var Ib=it.poly(4),Db=it.poly(5),Fb=s((t,e,n)=>t(it.back(1.70158*e))(n),"back"),Nb=s((t,e,n)=>t(it.elastic(e))(n),"elastic"),Rb=s((t,e,n)=>t(it.bounce(e))(n),"bounce"),Mb={linear:it.linear,step(t,e){let n=Cwe(t);return n[Twe(e,n,!1)]},easeInQuad:it.in(it.quad),easeOutQuad:it.out(it.quad),easeInOutQuad:it.inOut(it.quad),easeInCubic:it.in(it.cubic),easeOutCubic:it.out(it.cubic),easeInOutCubic:it.inOut(it.cubic),easeInQuart:it.in(Ib),easeOutQuart:it.out(Ib),easeInOutQuart:it.inOut(Ib),easeInQuint:it.in(Db),easeOutQuint:it.out(Db),easeInOutQuint:it.inOut(Db),easeInSine:it.in(it.sin),easeOutSine:it.out(it.sin),easeInOutSine:it.inOut(it.sin),easeInExpo:it.in(it.exp),easeOutExpo:it.out(it.exp),easeInOutExpo:it.inOut(it.exp),easeInCirc:it.in(it.circle),easeOutCirc:it.out(it.circle),easeInOutCirc:it.inOut(it.circle),easeInBack:Fb.bind(null,it.in),easeOutBack:Fb.bind(null,it.out),easeInOutBack:Fb.bind(null,it.inOut),easeInElastic:Nb.bind(null,it.in),easeOutElastic:Nb.bind(null,it.out),easeInOutElastic:Nb.bind(null,it.inOut),easeInBounce:Rb.bind(null,it.in),easeOutBounce:Rb.bind(null,it.out),easeInOutBounce:Rb.bind(null,it.inOut)},Da=Object.fromEntries(Object.entries(Mb).map(t=>[t[0],t[0]]));Object.freeze(Da);var QO="linear",Xh=s(t=>{switch(t.easing){case Da.easeInBack:case Da.easeOutBack:case Da.easeInOutBack:case Da.easeInElastic:case Da.easeOutElastic:case Da.easeInOutElastic:return 1;case Da.easeInBounce:case Da.easeOutBounce:case Da.easeInOutBounce:return .25;case Da.step:return 5;default:return null}},"getEasingArgDefault");function pl(t=""){return t.includes("Back")||t.includes("Elastic")||t.includes("Bounce")||t===Da.step}s(pl,"hasArgs");var Bb={};vn(Bb,{default:()=>Owe});var Owe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Pb={};vn(Pb,{default:()=>Dwe});var Dwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Lb={};vn(Lb,{default:()=>Nwe});var Nwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Vb={};vn(Vb,{default:()=>Mwe});var Mwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var zb={};vn(zb,{default:()=>Pwe});var Pwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Ub={};vn(Ub,{default:()=>Vwe});var Vwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var qb={};vn(qb,{default:()=>Uwe});var Uwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Hb={};vn(Hb,{default:()=>Hwe});var Hwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Jb={};vn(Jb,{default:()=>Gwe});var Gwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Gb={};vn(Gb,{default:()=>Kwe});var Kwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Wb={};vn(Wb,{default:()=>Xwe});var Xwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Kb={};vn(Kb,{default:()=>Qwe});var Qwe='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Yb={};vn(Yb,{default:()=>e3e});var e3e='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var Xb={};vn(Xb,{default:()=>n3e});var n3e='data:image/svg+xml,%0D%0A%0D%0A%0D%0A';var i3e=[Bb,Pb,Lb,Vb,zb,Ub,qb,Hb,Jb,Gb,Wb,Kb,Yb,Xb],$O=i3e,e6=["../assets/easingIcons/Back.svg","../assets/easingIcons/Bounce.svg","../assets/easingIcons/Circ.svg","../assets/easingIcons/Cubic.svg","../assets/easingIcons/Elastic.svg","../assets/easingIcons/Expo.svg","../assets/easingIcons/InOut.svg","../assets/easingIcons/Linear.svg","../assets/easingIcons/Out.svg","../assets/easingIcons/Quad.svg","../assets/easingIcons/Quart.svg","../assets/easingIcons/Quint.svg","../assets/easingIcons/Sine.svg","../assets/easingIcons/Step.svg"];function t6(t,e,n){let i=t.slice();return i[13]=e[n],i}s(t6,"get_each_context");function n6(t,e,n){let i=t.slice();return i[16]=e[n],i}s(n6,"get_each_context_1");function i6(t){let e;function n(r,o){return r[3]?.interpolation==="linear"?r3e:a3e}s(n,"select_block_type");let i=n(t,-1),a=i(t);return{c(){a.c(),e=_t()},m(r,o){a.m(r,o),U(r,e,o)},p(r,o){i===(i=n(r,o))&&a?a.p(r,o):(a.d(1),a=i(r),a&&(a.c(),a.m(e.parentNode,e)))},d(r){a.d(r),r&&z(e)}}}s(i6,"create_if_block");function a3e(t){let e;return{c(){e=L("div"),e.textContent=`${A("panel.keyframe.nonlinear_interpolation")}`,E(e,"class","easings-disabled svelte-59d7u1")},m(n,i){U(n,e,i)},p:ie,d(n){n&&z(e)}}}s(a3e,"create_else_block");function r3e(t){let e,n,i=A("panel.keyframe.easing_type.title")+"",a,r,o,l=t[0],c,d,u=pl(t[3]?.easing),p,m=r6(t),f=t[3].easing!=="linear"&&o6(t),g=u&&c6(t);return{c(){e=L("div"),n=L("label"),a=Re(i),o=J(),m.c(),c=J(),f&&f.c(),d=J(),g&&g.c(),p=_t(),E(n,"for","easing_type_input"),E(n,"class","undefined"),Xe(n,"font-weight","unset"),Xe(n,"width","100px"),Xe(n,"text-align","left"),E(n,"title",r=A("panel.keyframe.easing_type.description")),E(e,"class","bar flex")},m(x,_){U(x,e,_),I(e,n),I(n,a),I(e,o),m.m(e,null),U(x,c,_),f&&f.m(x,_),U(x,d,_),g&&g.m(x,_),U(x,p,_)},p(x,_){_&1&&De(l,l=x[0])?(m.d(1),m=r6(x),m.c(),m.m(e,null)):m.p(x,_),x[3].easing!=="linear"?f?f.p(x,_):(f=o6(x),f.c(),f.m(d.parentNode,d)):f&&(f.d(1),f=null),_&8&&(u=pl(x[3]?.easing)),u?g?g.p(x,_):(g=c6(x),g.c(),g.m(p.parentNode,p)):g&&(g.d(1),g=null)},d(x){x&&z(e),m.d(x),x&&z(c),f&&f.d(x),x&&z(d),g&&g.d(x),x&&z(p)}}}s(r3e,"create_if_block_1");function a6(t){let e,n,i,a,r,o,l,c,d;function u(){return t[6](t[16])}return s(u,"click_handler"),{c(){e=L("button"),n=L("img"),o=J(),E(n,"class",i=Xi(t[0]===t[16]?"selected-keyframe-icon":"")+" svelte-59d7u1"),Ht(n.src,a=Zh[t[16]])||E(n,"src",a),E(n,"alt",r=t[16]),E(e,"class","easing-type svelte-59d7u1"),E(e,"title",l=A(`panel.keyframe.easing_type.options.${t[16]}`))},m(p,m){U(p,e,m),I(e,n),I(e,o),c||(d=Ue(e,"click",u),c=!0)},p(p,m){t=p,m&1&&i!==(i=Xi(t[0]===t[16]?"selected-keyframe-icon":"")+" svelte-59d7u1")&&E(n,"class",i)},d(p){p&&z(e),c=!1,d()}}}s(a6,"create_each_block_1");function r6(t){let e,n=u6,i=[];for(let a=0;a[PathModule.basename(e6[e]).replace(".svg","").toLowerCase(),t.default])),s3e={in:Zh.expo,out:Zh.out,inout:Zh.inout},u6=["linear","sine","quad","cubic","quart","quint","expo","circ","elastic","back","bounce"],d6=["in","out","inout"];function l3e(t){return t.animator.keyframes.filter(e=>e.channel===t.channel).sort((e,n)=>e.time-n.time)[0]===t}s(l3e,"isFirstKeyframe");function c3e(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,v=>n(4,i=v)),c),"$$subscribe_easingArg");t.$$.on_destroy.push(()=>a());let o="linear",l,c;function d(){if(!g?.easing)return;let v=/ease(InOut|Out|In)(.+)/.exec(g.easing);return v?(pl(g.easing)&&m(),{type:v?.[2].toLowerCase(),mode:v?.[1].toLowerCase()}):{type:g.easing}}s(d,"getSelectedEasing");function u(v,b="inout"){g&&(v==="linear"?n(3,g.easing="linear",g):n(3,g.easing=`ease${b&&b!=="inout"?b[0].toUpperCase()+b.slice(1):"InOut"}${v[0].toUpperCase()+v.slice(1)}`,g),o!==v&&m(),n(0,o=v),n(1,l=b))}s(u,"setSelectedEasing");let p;function m(){p?.(),g&&(pl(g.easing)?(r(n(2,c=new ke(g.easingArgs?.[0]??Xh(g)??0))),p=c?.subscribe(v=>f(v))):r(n(2,c=void 0)))}s(m,"getEasingArgs");function f(v){if(g){if(!v){delete g.easingArgs;return}n(3,g.easingArgs=[v],g)}}s(f,"setEasingArgs");let g;K.UPDATE_KEYFRAME_SELECTION.subscribe(()=>{let v=Timeline.selected.at(0);if(Fe()&&v&&["position","rotation","scale"].includes(v.channel)&&!l3e(v)){n(3,g=v);let b=d();b&&(n(0,o=b.type),n(1,l=b.mode))}else f(i),n(3,g=void 0)}),K.UNSELECT_AJ_PROJECT.subscribe(()=>{f(i),n(3,g=void 0)});let x=s(v=>u(v,l),"click_handler"),_=s(v=>u(o,v),"click_handler_1");function h(){i=Sl(this.value),c.set(i)}return s(h,"input_input_handler"),[o,l,c,g,i,u,x,_,h]}s(c3e,"instance");var Qh=class extends Pe{constructor(e){super(),Ve(this,e,c3e,o3e,De,{})}};s(Qh,"KeyframeEasings");var p6=Qh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.easings-disabled.svelte-59d7u1{margin-left:16px;font-size:16px;color:var(--color-subtle_text);text-wrap:balance;margin-bottom:1rem;font-style:italic}.easing-container.svelte-59d7u1{display:flex;flex-direction:row;flex-wrap:wrap;grid-gap:2px;margin-left:2px}.easing-type.svelte-59d7u1{width:32px;padding:0px;margin:0px;min-width:unset;display:flex;align-items:center;justify-content:center}.easing-type.svelte-59d7u1:hover{background-color:var(--color-selected)}.selected-keyframe-icon.svelte-59d7u1{filter:invert(49%) sepia(16%) saturate(6320%) hue-rotate(198deg) brightness(101%)\r contrast(106%)}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();yp({id:"animated-java:mounted-svelte/keyframe-easings",component:p6,target:"#panel_keyframe"});function m6(t){let e,n,i=A("panel.keyframe.repeat_frequency.title")+"",a,r,o,l,c,d;return{c(){e=L("div"),n=L("label"),a=Re(i),o=J(),l=L("input"),E(n,"for","repeat_frequency_input"),E(n,"class","undefined"),Xe(n,"font-weight","unset"),E(n,"title",r=A("animated_java.panel.keyframe.repeat_frequency.description")),E(l,"id","repeat_frequency_input"),E(l,"class","dark_bordered tab_target"),E(l,"type","number"),E(e,"class","bar flex")},m(u,p){U(u,e,p),I(e,n),I(n,a),I(e,o),I(e,l),Bt(l,t[4]),c||(d=Ue(l,"input",t[8]),c=!0)},p(u,p){p&16&&Sl(l.value)!==u[4]&&Bt(l,u[4])},d(u){u&&z(e),c=!1,d()}}}s(m6,"create_if_block");function u3e(t){let e,n,i=A("panel.keyframe.function.title")+"",a,r,o,l,c,d,u,p,m=A("panel.keyframe.execute_condition.title")+"",f,g,x,_,h,v,b,y,w=A("panel.keyframe.repeat.title")+"",S,F,N,k,R,D,B,q,G;function W(Q){t[5](Q)}s(W,"customcodejar0_value_binding");let ee={placeholder:"say Hello, World!"};t[1]!==void 0&&(ee.value=t[1]),l=new $s({props:ee}),Te.push(()=>Be(l,"value",W));function Z(Q){t[6](Q)}s(Z,"customcodejar1_value_binding");let me={placeholder:"if score @s matches 1.."};t[2]!==void 0&&(me.value=t[2]),_=new $s({props:me}),Te.push(()=>Be(_,"value",Z));let X=t[0]?.repeat&&m6(t);return{c(){e=L("div"),n=L("label"),a=Re(i),o=J(),Ce(l.$$.fragment),d=J(),u=L("div"),p=L("label"),f=Re(m),x=J(),Ce(_.$$.fragment),v=J(),b=L("div"),y=L("label"),S=Re(w),N=J(),k=L("input"),R=J(),X&&X.c(),D=_t(),E(n,"for","commands_input"),E(n,"class","undefined"),Xe(n,"font-weight","unset"),E(n,"title",r=A("panel.keyframe.function.description")),E(e,"class","bar flex custom-bar svelte-1s4pafb"),E(p,"for","execute_condition"),E(p,"class","undefined"),Xe(p,"font-weight","unset"),E(p,"title",g=A("panel.keyframe.execute_condition.description")),E(u,"class","bar flex custom-bar svelte-1s4pafb"),E(y,"for","repeat_input"),E(y,"class","undefined"),Xe(y,"font-weight","unset"),E(y,"title",F=A("animated_java.panel.keyframe.repeat.description")),E(k,"id","repeat_input"),E(k,"class","dark_bordered tab_target svelte-1s4pafb"),E(k,"type","checkbox"),E(b,"class","bar flex")},m(Q,he){U(Q,e,he),I(e,n),I(n,a),I(e,o),Ae(l,e,null),U(Q,d,he),U(Q,u,he),I(u,p),I(p,f),I(u,x),Ae(_,u,null),U(Q,v,he),U(Q,b,he),I(b,y),I(y,S),I(b,N),I(b,k),k.checked=t[3],U(Q,R,he),X&&X.m(Q,he),U(Q,D,he),B=!0,q||(G=Ue(k,"change",t[7]),q=!0)},p(Q,[he]){let Ie={};!c&&he&2&&(c=!0,Ie.value=Q[1],Me(()=>c=!1)),l.$set(Ie);let le={};!h&&he&4&&(h=!0,le.value=Q[2],Me(()=>h=!1)),_.$set(le),he&8&&(k.checked=Q[3]),Q[0]?.repeat?X?X.p(Q,he):(X=m6(Q),X.c(),X.m(D.parentNode,D)):X&&(X.d(1),X=null)},i(Q){B||(ae(l.$$.fragment,Q),ae(_.$$.fragment,Q),B=!0)},o(Q){de(l.$$.fragment,Q),de(_.$$.fragment,Q),B=!1},d(Q){Q&&z(e),je(l),Q&&z(d),Q&&z(u),je(_),Q&&z(v),Q&&z(b),Q&&z(R),X&&X.d(Q),Q&&z(D),q=!1,G()}}}s(u3e,"create_fragment");function d3e(t,e,n){let{keyframe:i}=e,a=i?.function??"",r=i?.execute_condition??"",o=i?.repeat??!1,l=i?.repeat_frequency??1;function c(m){a=m,n(1,a)}s(c,"customcodejar0_value_binding");function d(m){r=m,n(2,r)}s(d,"customcodejar1_value_binding");function u(){o=this.checked,n(3,o)}s(u,"input_change_handler");function p(){l=Sl(this.value),n(4,l)}return s(p,"input_input_handler"),t.$$set=m=>{"keyframe"in m&&n(0,i=m.keyframe)},t.$$.update=()=>{if(t.$$.dirty&30)e:n(0,i.function=a,i),n(0,i.execute_condition=r,i),n(0,i.repeat=o,i),n(0,i.repeat_frequency=l,i)},[i,a,r,o,l,c,d,u,p]}s(d3e,"instance");var $h=class extends Pe{constructor(e){super(),Ve(this,e,d3e,u3e,De,{keyframe:0})}};s($h,"CommandsKeyframePanel");var f6=$h;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".custom-bar.svelte-1s4pafb{flex-direction:column}input[type='checkbox'].svelte-1s4pafb{display:flex;align-items:center;justify-content:flex-start;padding-left:8px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function p3e(t){let e,n,i=A("panel.keyframe.variant.title")+"",a,r,o,l,c,d,u,p=A("panel.keyframe.execute_condition.title")+"",m,f,g,x,_,h;function v(y){t[5](y)}s(v,"customcodejar_value_binding");let b={placeholder:"if score @s matches 1.."};return t[0]!==void 0&&(b.value=t[0]),x=new $s({props:b}),Te.push(()=>Be(x,"value",v)),{c(){e=L("div"),n=L("label"),a=Re(i),o=J(),l=L("div"),c=J(),d=L("div"),u=L("label"),m=Re(p),g=J(),Ce(x.$$.fragment),E(n,"for","variant_input"),E(n,"class","undefined"),Xe(n,"font-weight","unset"),Xe(n,"width","fit-content"),E(n,"title",r=A("panel.keyframe.variant.description")),E(l,"class","select-container svelte-1gy8tdu"),E(e,"class","bar flex"),E(u,"for","execute_condition"),E(u,"class","undefined"),Xe(u,"font-weight","unset"),E(u,"title",f=A("panel.keyframe.execute_condition.description")),E(d,"class","bar flex custom-bar svelte-1gy8tdu")},m(y,w){U(y,e,w),I(e,n),I(n,a),I(e,o),I(e,l),t[4](l),U(y,c,w),U(y,d,w),I(d,u),I(u,m),I(d,g),Ae(x,d,null),h=!0},p(y,[w]){let S={};!_&&w&1&&(_=!0,S.value=y[0],Me(()=>_=!1)),x.$set(S)},i(y){h||(ae(x.$$.fragment,y),h=!0)},o(y){de(x.$$.fragment,y),h=!1},d(y){y&&z(e),t[4](null),y&&z(c),y&&z(d),je(x)}}}s(p3e,"create_fragment");function m3e(t,e,n){let{keyframe:i}=e,a=i?.variant?.uuid??qe.getDefault().uuid,r=i?.execute_condition??"",o=Object.fromEntries(qe.all.map(p=>[p.uuid,p.displayName])),l=new Interface.CustomElements.SelectInput("keyframe-variant-selector",{options:o,value:a,onChange(){let p=l.node.getAttribute("value");if(p==null){console.warn("Variant value is undefined");return}n(3,a=p)}}),c;requestAnimationFrame(()=>{c.appendChild(l.node)});function d(p){Te[p?"unshift":"push"](()=>{c=p,n(1,c)})}s(d,"div0_binding");function u(p){r=p,n(0,r)}return s(u,"customcodejar_value_binding"),t.$$set=p=>{"keyframe"in p&&n(2,i=p.keyframe)},t.$$.update=()=>{if(t.$$.dirty&9)e:n(2,i.variant=qe.getByUUID(a)??qe.getDefault(),i),n(2,i.execute_condition=r,i),Animator.preview()},[r,c,i,a,d,u]}s(m3e,"instance");var eg=class extends Pe{constructor(e){super(),Ve(this,e,m3e,p3e,De,{keyframe:2})}};s(eg,"VariantKeyframePanel");var h6=eg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".custom-bar.svelte-1gy8tdu{flex-direction:column}.select-container.svelte-1gy8tdu{flex-grow:1;height:30px;padding-left:8px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var tg=(n=>(n.VARIANT="variant",n.FUNCTION="function",n))(tg||{});function Zb(t){return Object.values(tg).includes(t)}s(Zb,"isCustomKeyframeChannel");Nt({id:"animated-java:keyframe/data-point/variant",object:Blockbench.Keyframe.prototype,key:"variant",condition:()=>Fe(),get(){let t=this.data_points.at(0)?.["variant"];if(t)return qe.getByUUID(t);console.error("Keyframe variant",t,"not found!")},set(t){let e=this.data_points.at(0);e&&(e["variant"]=t?.uuid)}});Nt({id:"animated-java:keyframe/data-point/function",object:Blockbench.Keyframe.prototype,key:"function",condition:()=>Fe(),get(){return this.data_points.at(0)?.["function"]??""},set(t){let e=this.data_points.at(0);e&&(e["function"]=t)}});Nt({id:"animated-java:keyframe/data-point/execute-condition",object:Blockbench.Keyframe.prototype,key:"execute_condition",condition:()=>Fe(),get(){return this.data_points.at(0)?.["execute_condition"]??""},set(t){let e=this.data_points.at(0);e&&(e["execute_condition"]=t)}});Nt({id:"animated-java:keyframe/data-point/repeat",object:Blockbench.Keyframe.prototype,key:"repeat",condition:()=>Fe(),get(){return this.data_points.at(0)?.["repeat"]??!1},set(t){let e=this.data_points.at(0);e&&(e["repeat"]=t)}});Nt({id:"animated-java:keyframe/data-point/repeat-frequency",object:Blockbench.Keyframe.prototype,key:"repeat_frequency",condition:()=>Fe(),get(){return this.data_points.at(0)?.["repeat_frequency"]??1},set(t){let e=this.data_points.at(0);e&&(e["repeat_frequency"]=t)}});da({id:"animated-java:custom-keyframes",condition:t=>t.format.id===Qt,apply:()=>{let t={...EffectAnimator.prototype.channels};EffectAnimator.addChannel("variant",{name:A("effect_animator.timeline.variant"),mutable:!0,max_data_points:1}),EffectAnimator.addChannel("function",{name:A("effect_animator.timeline.function"),mutable:!0,max_data_points:1});let e=[new Property(KeyframeDataPoint,"string","variant",{label:A("effect_animator.keyframe_data_point.variant"),condition:i=>i.keyframe.channel==="variant",exposed:!1,default:()=>qe.getDefault().uuid}),new Property(KeyframeDataPoint,"string","function",{label:A("effect_animator.keyframe_data_point.function"),default:"",condition:i=>i.keyframe.channel==="function",exposed:!1}),new Property(KeyframeDataPoint,"string","execute_condition",{label:A("effect_animator.keyframe_data_point.execute_condition"),default:"",condition:i=>Zb(i.keyframe.channel),exposed:!1}),new Property(KeyframeDataPoint,"boolean","repeat",{label:A("effect_animator.keyframe_data_point.repeat"),default:!1,condition:i=>i.keyframe.channel==="function",exposed:!1}),new Property(KeyframeDataPoint,"number","repeat_frequency",{label:A("effect_animator.keyframe_data_point.repeat_frequency"),default:1,condition:i=>i.keyframe.channel==="function",exposed:!1})];for(let i of Object.keys(t))i!=="sound"&&delete EffectAnimator.prototype.channels[i];let n=EffectAnimator.prototype.displayFrame;return EffectAnimator.prototype.displayFrame=function(i){if(this.muted.particle=!0,this.muted.timeline=!0,n.call(this,i),!!(Project&&Fe())){if(!this.muted["variant"]){let a,r,o;for(let l of this["variant"])l.timer.time)&&(r=l):(!a||l.time{for(let i of Object.keys(t))i!=="sound"&&(EffectAnimator.prototype.channels[i]=t[i]);for(let i of n)KeyframeDataPoint.properties[i.name]?.delete();for(let i of Object.values(tg))delete EffectAnimator.prototype.channels[i];delete BoneAnimator.prototype.channels.commands,delete BoneAnimator.prototype.commands,EffectAnimator.prototype.displayFrame=e}});St({id:"animated-java:panel/custom-keyframe-data-points",apply:()=>{Language.data["timeline.variant"]=A("effect_animator.timeline.variant"),Language.data["timeline.function"]=A("effect_animator.timeline.function");let t,e=[K.UPDATE_KEYFRAME_SELECTION.subscribe(()=>{t?.$destroy(),t=void 0;let n=Timeline.selected.at(0),i=Zb(n?.channel??"");if(n&&i){let a;switch(n.channel){case"variant":a=h6;break;case"function":a=f6;break;default:console.error(`Unknown custom keyframe channel: '${n.channel}'`);return}t=Gn({component:a,props:{keyframe:n},target:"#panel_keyframe .panel_vue_wrapper .keyframe_data_point",hideTargetChildren:!0})}}),K.UNSELECT_AJ_PROJECT.subscribe(()=>{t?.$destroy(),t=void 0})];return{mounted:t,unsubs:e}},revert:({mounted:t,unsubs:e})=>{delete Language.data["timeline.variant"],delete Language.data["timeline.function"],e.forEach(n=>n()),t?.$destroy()}});function g6(t){let e,n;return{c(){e=L("textarea"),e.readOnly=!0,E(e,"rows",n=t[3].split(` `).length+1),e.value=t[3],E(e,"class","svelte-w0fo30")},m(i,a){U(i,e,a)},p(i,a){a&8&&n!==(n=i[3].split(` `).length+1)&&E(e,"rows",n),a&8&&(e.value=i[3])},d(i){i&&z(e)}}}s(g6,"create_if_block");function f3e(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B,q,G,W;function ee(Q){t[13](Q)}s(ee,"codejar_element_binding");function Z(Q){t[14](Q)}s(Z,"codejar_value_binding");let me={syntax:"snbtTextComponent",highlight:h3e,preserveIdent:!0,history:!0,style:`\r background-color: var(--color-back);\r font-family: var(--font-code);\r font-size: 14px;\r padding: 3px 6px;\r max-height: 20em;\r height: fit-content;\r min-height: 5rem;\r width: 100%;\r outline: none;\r overflow-wrap: unset;\r overflow-y: scroll;\r white-space: pre;\r margin: 8px;\r margin-bottom: 0px;\r `+(t[3]?"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;":"border: 1px solid var(--color-border);")+`\r text-shadow: 0px 1px rgba(0, 0, 0, 0.3);\r `};t[2]!==void 0&&(me.element=t[2]),t[1]!==void 0&&(me.value=t[1]),N=new Td({props:me}),Te.push(()=>Be(N,"element",ee)),Te.push(()=>Be(N,"value",Z)),N.$on("change",t[15]);let X=t[3]&&g6(t);return{c(){e=L("p"),e.textContent=`${A("panel.text_display.title")}`,n=J(),i=L("div"),a=L("div"),o=J(),l=L("div"),d=J(),u=L("div"),m=J(),f=L("div"),x=J(),_=L("div"),v=J(),b=L("div"),w=J(),S=L("div"),F=L("div"),Ce(N.$$.fragment),D=J(),X&&X.c(),E(e,"class","panel_toolbar_label label svelte-w0fo30"),E(a,"class","content"),E(l,"class","content"),E(u,"class","content"),E(f,"class","content"),E(_,"class","content"),E(b,"class","content"),E(i,"class","toolbar text-display-toolbar svelte-w0fo30"),E(F,"class","content codejar-container svelte-w0fo30"),E(S,"class","toolbar text-display-text-toolbar svelte-w0fo30"),E(S,"style",B=t[0]?"margin-bottom: 16px;":"visibility:hidden; height: 0px;")},m(Q,he){U(Q,e,he),U(Q,n,he),U(Q,i,he),I(i,a),I(i,o),I(i,l),I(i,d),I(i,u),I(i,m),I(i,f),I(i,x),I(i,_),I(i,v),I(i,b),U(Q,w,he),U(Q,S,he),I(S,F),Ae(N,F,null),I(F,D),X&&X.m(F,null),q=!0,G||(W=[bn(r=t[5].call(null,a)),bn(c=t[6].call(null,l)),bn(p=t[7].call(null,u)),bn(g=t[8].call(null,f)),bn(h=t[9].call(null,_)),bn(y=t[10].call(null,b)),Ue(F,"keydown",t[12])],G=!0)},p(Q,[he]){let Ie={};he&8&&(Ie.style=`\r background-color: var(--color-back);\r font-family: var(--font-code);\r font-size: 14px;\r padding: 3px 6px;\r max-height: 20em;\r height: fit-content;\r min-height: 5rem;\r width: 100%;\r outline: none;\r overflow-wrap: unset;\r overflow-y: scroll;\r white-space: pre;\r margin: 8px;\r margin-bottom: 0px;\r `+(Q[3]?"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;":"border: 1px solid var(--color-border);")+`\r text-shadow: 0px 1px rgba(0, 0, 0, 0.3);\r `),!k&&he&4&&(k=!0,Ie.element=Q[2],Me(()=>k=!1)),!R&&he&2&&(R=!0,Ie.value=Q[1],Me(()=>R=!1)),N.$set(Ie),Q[3]?X?X.p(Q,he):(X=g6(Q),X.c(),X.m(F,null)):X&&(X.d(1),X=null),(!q||he&1&&B!==(B=Q[0]?"margin-bottom: 16px;":"visibility:hidden; height: 0px;"))&&E(S,"style",B)},i(Q){q||(ae(N.$$.fragment,Q),q=!0)},o(Q){de(N.$$.fragment,Q),q=!1},d(Q){Q&&z(e),Q&&z(n),Q&&z(i),Q&&z(w),Q&&z(S),je(N),X&&X.d(),G=!1,Rt(W)}}}s(f3e,"create_fragment");var _6=new Map;function h3e(t,e){if(!e)return t;let n=_6.get(t);if(n)return n;if(t.length>1e4)return console.warn("Skipping syntax highlighting due to large text size"),t;let i=new pi("Highlighting").start(),a=Prism.highlight(t,Prism.languages[e],e);return i.debug({code:t,result:a}),_6.set(t,a),a}s(h3e,"highlight");function g3e(t,e,n){let i,{selected:a}=e,r=a.text,o=a.textError;Pa(t,o,b=>n(3,i=b));let l;Qb.setValue(a.lineWidth),ml.set(tinycolor(a.backgroundColor)),fl.set(a.shadow),pp.set(a.align),hl.set(a.seeThrough);let c=s(b=>{b.appendChild(Qb.node)},"mountLineWidth"),d=s(b=>{b.appendChild(fl.node)},"mountShadow"),u=s(b=>{b.appendChild(pp.node)},"mountAlignment"),p=s(b=>{b.appendChild(hl.node)},"mountSeeThrough"),m=s(b=>{b.appendChild(ml.node)},"mountBackgroundColor"),f=s(b=>{b.appendChild(v6.node)},"mountCopyText");requestAnimationFrame(()=>{g()});function g(){l&&(n(2,l.style.overflowWrap="unset",l),n(2,l.style.whiteSpace="pre",l))}s(g,"forceNoWrap");let x=s(b=>{b instanceof KeyboardEvent&&(b.key==="Tab"?b.stopPropagation():b.code==="KeyZ"&&b.ctrlKey&&requestAnimationFrame(()=>{a&&l?.textContent!=null&&n(1,r=l.textContent)}))},"onKeydown");function _(b){l=b,n(2,l)}s(_,"codejar_element_binding");function h(b){r=b,n(1,r)}s(h,"codejar_value_binding");let v=s(()=>g(),"change_handler");return t.$$set=b=>{"selected"in b&&n(0,a=b.selected)},t.$$.update=()=>{if(t.$$.dirty&3)e:a.text!==r&&(Undo.initEdit({elements:[a]}),n(0,a.text=r,a),a.updateTextMesh(),Project.saved=!1,Undo.finishEdit("Change Text Display Text",{elements:[a]}))},[a,r,l,i,o,c,d,u,p,m,f,g,x,_,h,v]}s(g3e,"instance");var ng=class extends Pe{constructor(e){super(),Ve(this,e,g3e,f3e,De,{selected:0})}};s(ng,"TextDisplayElementPanel");var x6=ng;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.label.svelte-w0fo30{margin-bottom:-3px !important}.text-display-text-toolbar.svelte-w0fo30{display:flex}textarea.svelte-w0fo30{color:var(--color-error);background-color:var(--color-back);padding:3px 6px;overflow:auto;height:min-content;font-size:14px;font-family:var(--font-code);width:-webkit-fill-available;margin:8px;margin-top:0px;border-radius:0 0 0.3em 0.3em;border:1px solid var(--color-error);white-space:pre;tab-size:4}.codejar-container.svelte-w0fo30{width:100%}.codejar-container.svelte-w0fo30 .language-snbtTextComponent{& .brackets {\r color: #5ba8c5;\r };& .token.punctuation {\r color: #89ddff;\r };& .token.property {\r color: #eeffff;\r };& .token.escape-sequence {\r color: #89ddff;\r };& .token.constant {\r color: #c767d7;\r border-bottom: 1px solid;\r };& .token.number {\r color: #f92672;\r };& .token.boolean {\r color: #f78c6c;\r };& .token.string {\r color: #aef941;\r }}.text-display-toolbar.svelte-w0fo30{display:flex;flex-direction:row;margin-bottom:1px}.text-display-toolbar.svelte-w0fo30 .sp-replacer{padding:4px 18px !important;height:28px !important;margin:2px 0px !important}.text-display-toolbar.svelte-w0fo30 [toolbar_item='animated_java:textDisplayShadowToggle']{margin-right:2px !important}.text-display-toolbar.svelte-w0fo30 .bar_select{height:28px !important;margin:2px 0px !important}.text-display-toolbar.svelte-w0fo30 bb-select{height:28px !important;display:flex;align-items:center;padding-top:0}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var $b=null,b6=s(()=>{$b?.$destroy(),$b=null},"destroyMounted"),_3e=s(()=>{b6();let t=ve.selected.at(0);t&&($b=Gn({component:x6,props:{selected:t},target:"#panel_element"}))},"updatePanel");da({id:"animated-java:append-element-panel/text-display",condition:t=>t.format.id===Qt,apply:()=>({unsubscribers:[K.UPDATE_SELECTION.subscribe(_3e)]}),revert:({unsubscribers:t})=>{t.forEach(e=>e()),b6()}});function x3e(){let t={pattern:/^['"]|['"]$/,alias:"quotation"};Prism.languages.snbtTextComponent=Prism.languages.extend("json",{punctuation:/[,:]/,brackets:{pattern:/[{}[\]]/g},property:[{pattern:/('|")?\w+\1\s*(?=\s*:)/,inside:{punctuation:t}}],string:[{pattern:/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{punctuation:t,"named-unicode-escape-sequence":{pattern:/\\N\{ *[\w ]+ *\}/,alias:"escape-sequence",inside:{constant:{pattern:/(\\N\{ *)[\w ]+?(?= *\})/,lookbehind:!0}}},"unicode-escape-sequence":{pattern:/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|U[\da-fA-F]{8})/,alias:"escape-sequence",inside:{constant:{pattern:/(?:[\da-fA-F]+)/}}},"escape-sequence":{pattern:/\\(?:n|s|t|b|f|r|'|"|\\)/}}},{pattern:/([:,]\s*)\b(?!true|false)\w+\b/i,inside:{punctuation:t},lookbehind:!0}],boolean:{pattern:/\b(?:true|false|0b|1b)\b/i},number:/(?:(?:#|0x)[\dA-Fa-f_]{1,8}\b|[-]?(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:[eE][+-]?[\d_]+\b)?)/})}s(x3e,"addPrismSyntaxForSnbtTextComponents");x3e();var Yc=s(()=>Fe()&&!!ve.selected.length,"TEXT_DISPLAY_CONDITION"),Qb=new NumSlider("animated-java:text-display-line-width-slider",{name:A("tool.text_display.line_width.title"),icon:"format_size",description:A("tool.text_display.line_width.description"),settings:{min:1,max:1e4,interval:1},condition:Yc,get(){let t=ve.selected.at(0);return t?t.lineWidth:ve.properties.lineWidth.default},change(t){if(!Project)return;let e=ve.selected.at(0);if(!e)return;let n=Math.clamp(t(e.lineWidth),1,1e4);e.lineWidth!==n&&(e.lineWidth=n,e.updateTextMesh(),Project.saved=!1)}}),ml=new ColorPicker("animated-java:text-display-background-color-picker",{name:A("tool.text_display.background_color.title"),icon:"format_color_fill",description:A("tool.text_display.background_color.description"),condition:Yc});ml.jq.spectrum("option","defaultColor",ve.properties.backgroundColor.default);ml.get=function(){let t=ve.selected.at(0);return t?tinycolor(t.backgroundColor):tinycolor(ve.properties.backgroundColor.default)};ml.set=function(t){this.value=t,this.jq.spectrum("set",t.toHex8String());let e=ve.selected.at(0);if(!e)return this;let n=t.toHex8String();return e.backgroundColor===n?this:(e.backgroundColor=t.toHex8String(),e.updateTextMesh(),Project.saved=!1,this)};ml.change=function(t){if(!Project)return this;let e=ve.selected.at(0);if(!e)return this;let n=t.toHex8String();return e.backgroundColor===n?this:(e.backgroundColor=n,e.updateTextMesh(),Project.saved=!1,this)};var fl=new Toggle("animated-java:text-display-shadow-toggle",{name:A("tool.text_display.text_shadow.title"),icon:"check_box_outline_blank",description:A("tool.text_display.text_shadow.description"),condition:Yc,default:ve.properties.shadow.default,onChange(){if(!Project)return;let t=fl;t.setIcon(t.value?"check_box":"check_box_outline_blank");let e=ve.selected.at(0);e&&e.shadow!==fl.value&&(e.shadow=fl.value,e.updateTextMesh(),Project.saved=!1)}});fl.set=function(t){return this.value===t?this:(this.click(),this)};var pp=new BarSelect("animated-java:text-display-alignment-select",{name:A("tool.text_display.text_alignment.title"),icon:"format_align_left",description:A("tool.text_display.text_alignment.description"),condition:Yc,options:{left:A("tool.text_display.text_alignment.options.left"),center:A("tool.text_display.text_alignment.options.center"),right:A("tool.text_display.text_alignment.options.right")}});pp.get=function(){let t=ve.selected.at(0);return t?t.align:ve.properties.align.default};pp.set=function(t){let e=ve.selected.at(0);if(!e)return this;this.value=t;let n=this.getNameFor(t);return this.nodes.forEach(i=>{$(i).find("bb-select").text(n)}),this.nodes.includes(this.node)||$(this.node).find("bb-select").text(n),e.align===t?this:(e.align=t,e.updateTextMesh(),Project.saved=!1,this)};var hl=new Toggle("animated-java:text-display-see-through-toggle",{name:A("tool.text_display.see_through.title"),icon:"check_box_outline_blank",description:A("tool.text_display.see_through.description"),condition:Yc,onChange(){if(!Project)return;let t=hl;t.setIcon(t.value?"check_box":"check_box_outline_blank");let e=ve.selected.at(0);e&&e.seeThrough!==hl.value&&(e.seeThrough=hl.value,e.updateTextMesh(),Project.saved=!1)}});hl.set=function(t){return this.value===t?this:(this.click(),this)};var v6=new Action("animated-java:text-display-copy-text-action",{name:A("tool.text_display.copy_text.title"),icon:"content_copy",description:A("tool.text_display.copy_text.description"),condition:Yc,click:()=>{if(!Project)return;let t=ve.selected.at(0);if(t)try{let e=new Yn({minecraftVersion:Project.animated_java.target_minecraft_version}).parse(t.text).toString(!0,Project.animated_java.target_minecraft_version);clipboard.writeText(e),Blockbench.showQuickMessage(A("tool.text_display.copy_text.copied"),2e3)}catch(e){console.error(e),Blockbench.showQuickMessage("Failed to copy text to clipboard",2e3)}}});function y6(t){let e,n;return{c(){e=L("div"),n=Re(t[1]),E(e,"class","error svelte-1gpclxv")},m(i,a){U(i,e,a),I(e,n)},p(i,a){a&2&&ct(n,i[1])},d(i){i&&z(e)}}}s(y6,"create_if_block");function v3e(t){let e,n,i,a,r,o,l,c,d,u,p=t[1]&&y6(t);return{c(){e=L("p"),e.textContent=`${A("panel.vanilla_block_display.title")}`,n=J(),i=L("div"),a=L("div"),r=L("input"),l=J(),p&&p.c(),c=_t(),E(e,"class","panel_toolbar_label label svelte-1gpclxv"),E(r,"type","text"),E(r,"class","svelte-1gpclxv"),E(a,"class","content"),Xe(a,"width","95%"),E(i,"class","toolbar custom-toolbar svelte-1gpclxv"),E(i,"title",o=A("panel.vanilla_block_display.description"))},m(m,f){U(m,e,f),U(m,n,f),U(m,i,f),I(i,a),I(a,r),Bt(r,t[0]),U(m,l,f),p&&p.m(m,f),U(m,c,f),d||(u=Ue(r,"input",t[4]),d=!0)},p(m,[f]){f&1&&r.value!==m[0]&&Bt(r,m[0]),m[1]?p?p.p(m,f):(p=y6(m),p.c(),p.m(c.parentNode,c)):p&&(p.d(1),p=null)},i:ie,o:ie,d(m){m&&z(e),m&&z(n),m&&z(i),m&&z(l),p&&p.d(m),m&&z(c),d=!1,u()}}}s(v3e,"create_fragment");function b3e(t,e,n){let i,{selected:a}=e,r=a.block,o=a.error;Pa(t,o,c=>n(1,i=c));function l(){r=this.value,n(0,r)}return s(l,"input_input_handler"),t.$$set=c=>{"selected"in c&&n(3,a=c.selected)},t.$$.update=()=>{if(t.$$.dirty&9)e:Jt(o,i="",i),a.block!==r&&vf(r).then(c=>{if(c){Jt(o,i=c,i),console.log("Block validation error:",c);return}console.log("Changing block to",r),Undo.initEdit({elements:[a]}),n(3,a.block=r,a),Project.saved=!1,Undo.finishEdit(`Change Block Display Block to "${r}"`,{elements:[a]})}).catch(c=>{Jt(o,i=c.message,i)})},[r,i,o,a,l]}s(b3e,"instance");var ig=class extends Pe{constructor(e){super(),Ve(this,e,b3e,v3e,De,{selected:3})}};s(ig,"VanillaBlockDisplayElementPanel");var w6=ig;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("input.svelte-1gpclxv{background-color:var(--color-button);padding:2px 8px;width:100%}.label.svelte-1gpclxv{margin-bottom:-3px !important}.custom-toolbar.svelte-1gpclxv{display:flex;flex-direction:row;margin-bottom:1px}.custom-toolbar.svelte-1gpclxv .sp-replacer{padding:4px 18px !important;height:28px !important;margin:1px 0px !important}.error.svelte-1gpclxv{margin:2px 8px;font-size:14px;color:var(--color-error)}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var ty=null,E6=s(()=>{ty?.$destroy(),ty=null},"destroyMounted"),ey=s(()=>{E6();let t=$e.selected.at(0);t&&(ty=Gn({component:w6,props:{selected:t},target:"#panel_element"}))},"updatePanel");da({id:"animated-java:append-element-panel/vanilla-block-display",condition:t=>t.format.id===Qt,apply:()=>({unsubscribers:[K.UNDO.subscribe(ey),K.REDO.subscribe(ey),K.UPDATE_SELECTION.subscribe(ey)]}),revert:({unsubscribers:t})=>{t.forEach(e=>e()),E6()}});function k6(t){let e,n;return{c(){e=L("div"),n=Re(t[1]),E(e,"class","error svelte-lxqp9c")},m(i,a){U(i,e,a),I(e,n)},p(i,a){a&2&&ct(n,i[1])},d(i){i&&z(e)}}}s(k6,"create_if_block");function y3e(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g=t[1]&&k6(t);return{c(){e=L("p"),e.textContent=`${A("panel.vanilla_item_display.title")}`,n=J(),i=L("div"),a=L("div"),r=L("input"),o=J(),l=L("div"),u=J(),g&&g.c(),p=_t(),E(e,"class","panel_toolbar_label label svelte-lxqp9c"),E(r,"type","text"),E(r,"class","svelte-lxqp9c"),E(a,"class","content"),Xe(a,"width","95%"),E(l,"class","content"),E(i,"class","toolbar custom-toolbar svelte-lxqp9c"),E(i,"title",d=A("panel.vanilla_item_display.description"))},m(x,_){U(x,e,_),U(x,n,_),U(x,i,_),I(i,a),I(a,r),Bt(r,t[0]),I(i,o),I(i,l),U(x,u,_),g&&g.m(x,_),U(x,p,_),m||(f=[Ue(r,"input",t[5]),bn(c=t[3].call(null,l))],m=!0)},p(x,[_]){_&1&&r.value!==x[0]&&Bt(r,x[0]),x[1]?g?g.p(x,_):(g=k6(x),g.c(),g.m(p.parentNode,p)):g&&(g.d(1),g=null)},i:ie,o:ie,d(x){x&&z(e),x&&z(n),x&&z(i),x&&z(u),g&&g.d(x),x&&z(p),m=!1,Rt(f)}}}s(y3e,"create_fragment");function w3e(t,e,n){let i,{selected:a}=e,r=a.item,o=a.error;Pa(t,o,d=>n(1,i=d)),Xc.set(a.itemDisplay);let l=s(d=>{d.appendChild(Xc.node)},"mountItemDisplaySelect");function c(){r=this.value,n(0,r)}return s(c,"input_input_handler"),t.$$set=d=>{"selected"in d&&n(4,a=d.selected)},t.$$.update=()=>{if(t.$$.dirty&17)e:Jt(o,i="",i),a.item!==r&&bf(r).then(d=>{if(d){Jt(o,i=d,i),console.log("Item validation error:",d);return}console.log("Changing item to",r),Undo.initEdit({elements:[a]}),n(4,a.item=r,a),Project.saved=!1,Undo.finishEdit(`Change Item Display Item to "${r}"`,{elements:[a]})}).catch(d=>{Jt(o,i=d.message,i)})},[r,i,o,l,a,c]}s(w3e,"instance");var ag=class extends Pe{constructor(e){super(),Ve(this,e,w3e,y3e,De,{selected:4})}};s(ag,"VanillaItemDisplayElementPanel");var j6=ag;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("input.svelte-lxqp9c{background-color:var(--color-button);padding:2px 8px;width:100%}.label.svelte-lxqp9c{margin-bottom:-3px !important}.custom-toolbar.svelte-lxqp9c{display:flex;flex-direction:row;margin-bottom:1px}.custom-toolbar.svelte-lxqp9c .sp-replacer{padding:4px 18px !important;height:28px !important;margin:1px 0px !important}.error.svelte-lxqp9c{margin:2px 8px;font-size:14px;color:var(--color-error)}.custom-toolbar.svelte-lxqp9c [toolbar_item='animated_java:itemDisplayAlignmentSelect']{margin:0px 2px !important}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var iy=null,A6=s(()=>{iy?.$destroy(),iy=null},"destroyMounted"),ny=s(()=>{A6();let t=We.selected.at(0);t&&(iy=Gn({component:j6,props:{selected:t},target:"#panel_element"}))},"updatePanel");da({id:"animated-java:append-element-panel/vanilla-item-display",condition:t=>t.format.id===Qt,apply:()=>({unsubscribers:[K.UNDO.subscribe(ny),K.REDO.subscribe(ny),K.UPDATE_SELECTION.subscribe(ny)]}),revert:({unsubscribers:t})=>{t.forEach(e=>e()),A6()}});var Xc=new BarSelect(`${Ke.name}:itemDisplayAlignmentSelect`,{name:A("tool.item_display.item_display.title"),icon:"format_align_left",description:A("tool.item_display.item_display.description"),condition:()=>Fe()&&!!We.selected.length,options:{none:A("tool.item_display.item_display.options.none"),thirdperson_lefthand:A("tool.item_display.item_display.options.thirdperson_lefthand"),thirdperson_righthand:A("tool.item_display.item_display.options.thirdperson_righthand"),firstperson_lefthand:A("tool.item_display.item_display.options.firstperson_lefthand"),firstperson_righthand:A("tool.item_display.item_display.options.firstperson_righthand"),head:A("tool.item_display.item_display.options.head"),gui:A("tool.item_display.item_display.options.gui"),ground:A("tool.item_display.item_display.options.ground"),fixed:A("tool.item_display.item_display.options.fixed")}});Xc.get=function(){let t=We.selected[0];return t?t.itemDisplay:"left"};Xc.set=function(t){let e=We.selected.at(0);if(!e)return this;this.value=t;let n=this.getNameFor(t);if(this.nodes.forEach(i=>{$(i).find("bb-select").text(n)}),this.nodes.includes(this.node)||$(this.node).find("bb-select").text(n),e.itemDisplay===t)return this;if(Undo.initEdit({elements:We.selected}),We.selected.length>1)for(let i of We.selected)i.itemDisplay=t,i.updateItem();else e.itemDisplay=t,e.updateItem();return Project.saved=!1,Undo.finishEdit(`Change Item Display Node's Item Display Mode to ${t}`,{elements:We.selected}),this};function T6(){let t=We.selected.at(0)?.itemDisplay;t??="none",Xc.set(t)}s(T6,"updateItemDisplaySelect");K.UNDO.subscribe(()=>{T6()});K.REDO.subscribe(()=>{T6()});function C6(t,e,n){let i=t.slice();return i[13]=e[n],i}s(C6,"get_each_context");function E3e(t){let e,n,i,a=t[13].value.displayName+"",r,o,l,c,d,u,p;function m(w,S){return w[13].value.isDefault?A3e:j3e}s(m,"select_block_type_1");let f=m(t,-1),g=f(t);function x(w,S){return qe.selected===w[13].value?C3e:T3e}s(x,"select_block_type_2");let _=x(t,-1),h=_(t);function v(w,S){return w[13].value.isDefault?S3e:O3e}s(v,"select_block_type_3");let b=v(t,-1),y=b(t);return{c(){e=L("i"),e.textContent="texture",n=J(),i=L("div"),r=Re(a),o=J(),l=L("div"),c=J(),g.c(),d=J(),h.c(),u=J(),y.c(),p=_t(),E(e,"class","material-icons icon in_list_button"),E(i,"class","variant_item_name svelte-1deur0j"),E(l,"class","spacer svelte-1deur0j")},m(w,S){U(w,e,S),U(w,n,S),U(w,i,S),I(i,r),U(w,o,S),U(w,l,S),U(w,c,S),g.m(w,S),U(w,d,S),h.m(w,S),U(w,u,S),y.m(w,S),U(w,p,S)},p(w,S){S&2&&a!==(a=w[13].value.displayName+"")&&ct(r,a),f===(f=m(w,S))&&g?g.p(w,S):(g.d(1),g=f(w),g&&(g.c(),g.m(d.parentNode,d))),_===(_=x(w,S))&&h?h.p(w,S):(h.d(1),h=_(w),h&&(h.c(),h.m(u.parentNode,u))),b===(b=v(w,S))&&y?y.p(w,S):(y.d(1),y=b(w),y&&(y.c(),y.m(p.parentNode,p)))},i:ie,o:ie,d(w){w&&z(e),w&&z(n),w&&z(i),w&&z(o),w&&z(l),w&&z(c),g.d(w),w&&z(d),h.d(w),w&&z(u),y.d(w),w&&z(p)}}}s(E3e,"create_else_block");function k3e(t){let e,n;return{c(){e=L("div"),Xe(e,"visibility","visible",1),Xe(e,"position","relative"),Xe(e,"top","0"),Xe(e,"left","0"),Xe(e,"border-bottom","2px solid var(--color-accent)"),Xe(e,"width","100%"),Xe(e,"height","15px")},m(i,a){U(i,e,a)},p(i,a){t=i},i(i){n||to(()=>{n=cu(e,ep,{duration:150,easing:$d}),n.start()})},o:ie,d(i){i&&z(e)}}}s(k3e,"create_if_block");function j3e(t){let e,n,i,a,r;function o(){return t[8](t[13])}return s(o,"click_handler_3"),{c(){e=L("i"),n=Re("edit"),E(e,"class","material-icons icon in_list_button"),E(e,"title",i=A("panel.variants.tool.edit_variant"))},m(l,c){U(l,e,c),I(e,n),a||(r=Ue(e,"click",o),a=!0)},p(l,c){t=l},d(l){l&&z(e),a=!1,r()}}}s(j3e,"create_else_block_3");function A3e(t){let e,n,i;return{c(){e=L("i"),n=Re("edit"),E(e,"class","material-icons icon in_list_button in_list_button_disabled svelte-1deur0j"),E(e,"title",i=A("panel.variants.tool.cannot_edit_default_variant"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(A3e,"create_if_block_3");function T3e(t){let e,n,i;return{c(){e=L("i"),n=Re("visibility_off"),E(e,"class","material-icons icon in_list_button in_list_button_disabled svelte-1deur0j"),E(e,"title",i=A("panel.variants.tool.variant_not_visible"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(T3e,"create_else_block_2");function C3e(t){let e,n,i;return{c(){e=L("i"),n=Re("visibility"),E(e,"class","material-icons icon in_list_button"),E(e,"title",i=A("panel.variants.tool.variant_visible"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(C3e,"create_if_block_2");function S3e(t){let e,n,i;return{c(){e=L("i"),n=Re("delete"),E(e,"class","material-icons icon in_list_button_disabled svelte-1deur0j"),E(e,"title",i=A("panel.variants.tool.cannot_delete_default_variant"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(S3e,"create_else_block_1");function O3e(t){let e,n,i;return{c(){e=L("i"),e.textContent="delete",E(e,"class","material-icons icon in_list_button")},m(a,r){U(a,e,r),n||(i=Ue(e,"click",t[9]),n=!0)},p:ie,d(a){a&&z(e),n=!1,i()}}}s(O3e,"create_if_block_1");function S6(t,e){let n,i,a,r,o=ie,l,c;function d(g,x){return g[13][sr]?k3e:E3e}s(d,"select_block_type");let u=d(e,-1),p=u(e);function m(){return e[10](e[13])}s(m,"click_handler_5");function f(...g){return e[11](e[13],...g)}return s(f,"contextmenu_handler"),{key:t,first:null,c(){n=L("li"),p.c(),i=J(),E(n,"class",a=Xi(e[13].value===qe.selected?"variant_item selected_variant_item":"variant_item")+" svelte-1deur0j"),this.first=n},m(g,x){U(g,n,x),p.m(n,null),I(n,i),l||(c=[Ue(n,"click",m),Ue(n,"contextmenu",t1(f))],l=!0)},p(g,x){e=g,u===(u=d(e,x))&&p?p.p(e,x):(p.d(1),p=u(e),p&&(p.c(),ae(p,1),p.m(n,i))),x&2&&a!==(a=Xi(e[13].value===qe.selected?"variant_item selected_variant_item":"variant_item")+" svelte-1deur0j")&&E(n,"class",a)},r(){r=n.getBoundingClientRect()},f(){lu(n),o()},a(){o(),o=su(n,r,tp,{duration:ay})},i(g){ae(p)},o:ie,d(g){g&&z(n),p.d(),l=!1,Rt(c)}}}s(S6,"create_each_block");function O6(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v=[],b=new Map,y,w,S,F=t[1],N=s(k=>k[13].id,"get_key");for(let k=0;k({id:h,value:_})))}s(r,"updateLocalVariants"),K.CREATE_VARIANT.subscribe(()=>{r()}),K.UPDATE_VARIANT.subscribe(()=>{r()}),K.DELETE_VARIANT.subscribe(()=>{r()}),K.SELECT_AJ_PROJECT.subscribe(_=>{n(0,i=_),qe.selectDefault(),r()}),K.UNSELECT_PROJECT.subscribe(_=>{n(0,i=_)}),K.SELECT_VARIANT.subscribe(()=>{r()});function o(_){_.select(),r()}s(o,"selectVariant");function l(_){n(1,a=_.detail.items)}s(l,"handleSort");function c(_){n(1,a=_.detail.items),qe.all=a.map(h=>h.value)}return s(c,"finalizeSort"),r(),[i,a,o,l,c,s(_=>D3e(_),"click_handler"),s(_=>F3e(_),"click_handler_1"),s(_=>I6(_),"click_handler_2"),s(_=>Yh(_.value),"click_handler_3"),s(_=>I6(_),"click_handler_4"),s(_=>o(_.value),"click_handler_5"),s((_,h)=>{_.value.select(),F6.get()?.open(h)},"contextmenu_handler")]}s(N3e,"instance");var rg=class extends Pe{constructor(e){super(),Ve(this,e,N3e,I3e,De,{})}};s(rg,"VariantsPanel");var D6=rg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".panel_container.svelte-1deur0j{display:flex;flex-direction:column}.spacer.svelte-1deur0j{flex-grow:1}.variants_list.svelte-1deur0j{list-style:none;background-color:var(--color-back);scroll-behavior:smooth;overflow-y:auto;max-height:250px}.variant_item.svelte-1deur0j{display:flex;flex-direction:row;justify-content:flex-start;padding:4px;cursor:unset !important;min-height:32px;max-height:32px}.variant_item_name.svelte-1deur0j{margin-left:8px}.variant_item.svelte-1deur0j:hover{color:var(--color-light)}.in_list_button_disabled.svelte-1deur0j{color:var(--color-subtle_text)}.selected_variant_item.svelte-1deur0j{background-color:var(--color-selected)}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var mp=class extends Panel{instance;constructor(e){let n=`${Ke.name}-svelte-panel-`+guid();super(e.id,{...e,component:{name:e.id,template:`
`}}),El(()=>document.querySelector(`#${n}`),()=>!1).then(i=>{this.instance=new e.component({target:i.parentElement,props:e.props})})}};s(mp,"SveltePanel");var ry=nn({id:"animated-java:create-variant"},{name:A("action.variants.create"),icon:"add",click(){new qe("New Variant")}}),oy=nn({id:"animated-java:duplicate-variant"},{name:A("action.variants.duplicate"),icon:"content_copy",condition:()=>!!qe.selected,click(){qe.selected&&qe.selected.duplicate()}}),sy=nn({id:"animated-java:delete-variant"},{name:A("action.variants.delete"),icon:"delete",condition:()=>!!qe.selected&&!qe.selected.isDefault,click(){!qe.selected||qe.selected.isDefault||qe.selected.delete()}}),R3e=nn({id:"animated-java:open-variant-config"},{name:A("action.variants.open_config"),icon:"settings",condition:()=>!!qe.selected&&!qe.selected.isDefault,click(){qe.selected&&Yh(qe.selected)}}),F6=By({id:"animated-java:variant-panel-context-menu"},()=>{let t=[R3e.get(),new MenuSeparator,ry.get(),oy.get(),new MenuSeparator,sy.get()];return t.every(e=>e!=null)?t:[]},{}),gXe=new mp({id:"animated-java:variants-panel",name:A("panel.variants.title"),expand_button:!0,default_side:"right",default_position:{slot:"left_bar",height:200,float_position:[0,0],float_size:[200,200],folded:!1},icon:"settings",condition:{formats:[Qt],modes:[Modes.options.edit.id,Modes.options.paint.id]},component:D6,props:{}});function N6(t,e,n){let i=t.slice();return i[3]=e[n],i}s(N6,"get_each_context");function R6(t){let e,n=t[3].hasImageIcon(),i,a=t[3].title+"",r,o,l,c,d,u=tl("dialog.plugins.disable")+"",p,m,f,g,x=n&&M6(t);function _(){return t[2](t[3])}return s(_,"click_handler"),{c(){e=L("li"),x&&x.c(),i=J(),r=Re(a),o=J(),l=L("button"),c=L("i"),c.textContent="bedtime",d=J(),p=Re(u),m=J(),E(c,"class","material-icons icon svelte-2n8ep5"),E(l,"class","svelte-2n8ep5"),E(e,"class","svelte-2n8ep5")},m(h,v){U(h,e,v),x&&x.m(e,null),I(e,i),I(e,r),I(e,o),I(e,l),I(l,c),I(l,d),I(l,p),I(e,m),f||(g=Ue(l,"click",_),f=!0)},p(h,v){t=h,v&1&&(n=t[3].hasImageIcon()),n?x?x.p(t,v):(x=M6(t),x.c(),x.m(e,i)):x&&(x.d(1),x=null),v&1&&a!==(a=t[3].title+"")&&ct(r,a)},d(h){h&&z(e),x&&x.d(),f=!1,g()}}}s(R6,"create_if_block");function M6(t){let e,n;return{c(){e=L("img"),Ht(e.src,n=t[3].getIcon())||E(e,"src",n),E(e,"alt",""),E(e,"class","svelte-2n8ep5")},m(i,a){U(i,e,a)},p(i,a){a&1&&!Ht(e.src,n=i[3].getIcon())&&E(e,"src",n)},d(i){i&&z(e)}}}s(M6,"create_if_block_1");function B6(t){let e,n=!t[3].disabled&&R6(t);return{c(){n&&n.c(),e=_t()},m(i,a){n&&n.m(i,a),U(i,e,a)},p(i,a){i[3].disabled?n&&(n.d(1),n=null):n?n.p(i,a):(n=R6(i),n.c(),n.m(e.parentNode,e))},d(i){n&&n.d(i),i&&z(e)}}}s(B6,"create_each_block");function M3e(t){let e,n=A("popup.incompatability_popup.description").replaceAll(` `,"
")+"",i,a,r=t[0],o=[];for(let l=0;la(o),"click_handler");return t.$$set=o=>{"plugins"in o&&n(0,i=o.plugins)},[i,a,r]}s(B3e,"instance");var og=class extends Pe{constructor(e){super(),Ve(this,e,B3e,M3e,De,{plugins:0})}};s(og,"IncompatabilityPopup");var P6=og;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("ul.svelte-2n8ep5{display:flex;flex-direction:column;margin-top:1rem;gap:0.75rem}li.svelte-2n8ep5{display:flex;align-items:center;justify-content:flex-start;font-size:24px;background:var(--color-back);padding:12px}img.svelte-2n8ep5{width:64px;margin-right:16px}button.svelte-2n8ep5{margin-left:auto;font-size:16px;height:64px;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:unset}i.svelte-2n8ep5{font-size:32px;max-width:min-content}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var V6=(n=>(n.GECKOLIB_ANIMATION_UTILS="animation_utils",n.GECKOLIB="geckolib",n))(V6||{}),gl=null;function P3e(t){gl||(gl=new cn({id:`${Ke.name}:incompatabilityPopup`,title:A("popup.incompatability_popup.title"),width:700,content:{component:P6,props:{plugins:t}},preventKeybinds:!0,preventKeybindCancel:!0,buttons:[A("popup.incompatability_popup.button.disable_all"),A("popup.incompatability_popup.button.ignore")],onButton:e=>{e===0&&t.forEach(n=>{n.disabled||n.toggleDisabled()})},onClose:()=>{gl=null}}).show())}s(P3e,"openIncompatabilityPopup");function L6(){gl&&(gl.hide(),gl.delete(),gl=null)}s(L6,"closeIncompatabilityPopup");function ly(t){return Object.values(V6).includes(t.id)}s(ly,"isIncompatiblePlugin");function sg(){let t=Plugins.all.filter(e=>e.installed&&!e.disabled&&ly(e));return t.length>0?(P3e(t),!0):!1}s(sg,"checkForIncompatabilities");K.EXTERNAL_PLUGIN_LOAD.subscribe(()=>{sg()});function L3e(t){let e,n,i,a,r,o,l,c;return{c(){e=L("div"),n=L("div"),i=L("img"),r=J(),o=L("div"),o.innerHTML=`

Welcome to Animated Java!

Effortlessly craft complex animations for Minecraft: Java Edition

`,l=J(),c=L("div"),c.innerHTML=`

Not Sure Where to Start?

Check out our getting started page to learn how to use Animated Java!

You can open our docs at any time via the Animated Java menu at the top of the screen.

Need Help?

Join our Discord server to ask questions via our support channel.

`,Ht(i.src,a=ya)||E(i,"src",a),E(i,"class","svelte-1h2xm0u"),E(o,"class","svelte-1h2xm0u"),E(n,"class","header-container svelte-1h2xm0u"),E(c,"class","another-container svelte-1h2xm0u"),E(e,"class","content-container svelte-1h2xm0u")},m(d,u){U(d,e,u),I(e,n),I(n,i),I(n,r),I(n,o),I(e,l),I(e,c)},p:ie,i:ie,o:ie,d(d){d&&z(e)}}}s(L3e,"create_fragment");var lg=class extends Pe{constructor(e){super(),Ve(this,e,null,L3e,De,{})}};s(lg,"InstalledPopup");var z6=lg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(".another-container.svelte-1h2xm0u.svelte-1h2xm0u{display:flex;align-items:flex-start;flex-direction:column;padding:0 10%}.content-container.svelte-1h2xm0u.svelte-1h2xm0u{display:flex;flex-direction:column;align-items:center}p.svelte-1h2xm0u.svelte-1h2xm0u{text-align:left}h2.svelte-1h2xm0u.svelte-1h2xm0u{text-align:center;margin-top:2rem;font-weight:500;border-bottom:1px solid var(--color-accent);margin-bottom:1rem}.header-container.svelte-1h2xm0u.svelte-1h2xm0u{display:flex;align-items:center;margin-top:1rem;justify-content:center}.header-container.svelte-1h2xm0u div.svelte-1h2xm0u{display:flex;flex-direction:column;justify-content:center;margin-left:2rem}.header-container.svelte-1h2xm0u img.svelte-1h2xm0u{width:128px;border-radius:16px;box-shadow:4px 4px 8px -4px black}.header-container.svelte-1h2xm0u h1.svelte-1h2xm0u{margin:0px;border-bottom:1px solid var(--color-accent);margin-bottom:4px}.header-container.svelte-1h2xm0u h3.svelte-1h2xm0u{margin:0px;color:var(--color-subtle_text);font-size:medium;max-width:23rem}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function cy(){new cn({id:`${Ke.name}:installedPopup`,title:A("popup.installed_popup.title"),width:700,content:{component:z6},preventKeybinds:!0,buttons:[A("popup.installed_popup.close_button")]}).show()}s(cy,"openInstallPopup");Nt({id:"animated-java:action-click-override/save-project",object:BarItems.save_project,key:"click",condition:()=>Fe(),get:()=>xh});Nt({id:"animated-java:action-click-override/save-project-as",object:BarItems.save_project_as,key:"click",condition:()=>Fe(),get:()=>()=>{let t=Hr.get();if(!t)throw new Error("Blueprint codec not registered");t.export()}});Nt({id:"animated-java:action-click-override/project-window",object:BarItems.project_window,key:"click",condition:()=>Fe(),get:()=>jc});Nt({id:"animated-java:action-click-override/export-project",object:BarItems.export_over,key:"click",condition:()=>Fe(),get:()=>()=>{if(!Project||!Format)return;let t=Hr.get();if(!t)throw new Error("Blueprint codec not registered");let e=Project.save_path||Project.export_path;e?fs.existsSync(PathModule.dirname(e))?(Project.save_path=e,t.write(t.compile(),e)):(console.error(`Failed to export Animated Java Blueprint, file location '${e}' does not exist!`),t.export()):t.export()}});var U6=20,q6=.05;Nt({id:"animated-java:function-override/animation/extend",object:Blockbench.Animation.prototype,key:"extend",condition:()=>Fe(),get:t=>function(e){t.call(this,e),this.snapping=U6,this.length=Math.max(this.length,q6);for(let n of Object.values(this.animators)){if(!n)continue;let i=-1/0;for(let a of n.keyframes){let r=Dr(a.time,U6);r!==a.time&&(r===i&&(r+=.05),a.time=r,i=r)}}return this}});Nt({id:"animated-java:function-override/animation/set-length",object:Blockbench.Animation.prototype,key:"setLength",condition:()=>Fe(),get:t=>function(e){return e=Math.max(e??this.length,q6),t.call(this,e)}});Nt({id:"animated-java:function-override/animation/properties-dialog",object:Blockbench.Animation.prototype,key:"propertiesDialog",condition:()=>Fe(),get:()=>function(){if(!Blockbench.Animation.selected){Blockbench.showQuickMessage("No animation selected");return}OO(Blockbench.Animation.selected)}});St({id:"animated-java:property-definitions/animation",apply:()=>({excludedNodesProperty:new Property(Blockbench.Animation,"array","excluded_nodes",{condition:()=>Fe(),label:A("animation.excluded_nodes"),default:[]})}),revert:({excludedNodesProperty:t})=>{t.delete()}});Nt({id:"animated-java:animation-force-saved",object:Blockbench.Animation.prototype,key:"saved",condition:()=>Fe(),get:()=>!0});Nt({id:"animated-java:action-condition-override/save-all-animations",object:BarItems.save_all_animations,key:"condition",condition:()=>Fe(),get:()=>!1});Nt({id:"animated-java:animation-controller-force-saved",object:AnimationController.prototype,key:"saved",condition:()=>Fe(),get:()=>!0});Dy({id:"animated-java:camera-plugin/camera-name-sanitization",condition:t=>t.id==="cameras",apply:()=>{let t=OutlinerElement.types.camera,e=t.prototype.saveName;t.prototype.saveName=function(i){return Fe()&&(this.name=Ea(this.name,this.uuid)),e.call(this,i)};let n=t.prototype.sanitizeName;return t.prototype.sanitizeName=function(){return Fe()&&(this.name=Ea(this.name,this.uuid)),n.call(this)},{camera:t,originalRename:e,originalSanitize:n}},revert:({camera:t,originalRename:e,originalSanitize:n})=>{t.prototype.rename=e,t.prototype.sanitizeName=n}});Nt({id:"animated-java:property-condition-override/collection/export-path",object:Collection.properties.export_path,key:"condition",condition:()=>Fe(),get:()=>!1});function V3e(t){let e,n;return{c(){e=L("img"),Ht(e.src,n=ya)||E(e,"src",n),E(e,"alt",""),E(e,"class","svelte-1wuqa5")},m(i,a){U(i,e,a)},p:ie,i:ie,o:ie,d(i){i&&z(e)}}}s(V3e,"create_fragment");var cg=class extends Pe{constructor(e){super(),Ve(this,e,null,V3e,De,{})}};s(cg,"Icon");var H6=cg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("img.svelte-1wuqa5{border-radius:4px;width:24px;height:24px;margin-left:0.5px;margin-top:2px;box-shadow:1px 1px 1px #000000aa}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();yp({id:"animated-java:injected-svelte/format-icon",component:H6,target:`li[format="${Qt}"] span`,replaceChildren:!0});St({id:"animated-java:prioritize-animated-java-formats",apply:()=>{let t=setInterval(()=>{let e=$("li.format_category > label:contains('Animated Java')").first().parent();if(e.length===0)return;let n=$("li.format_category > label:contains('General')").first().parent();e.insertBefore(n),clearInterval(t)},16)},revert:()=>{}});iu({id:"animated-java:event-hook/external-plugin-load/load",object:BBPlugin.prototype,key:"load",get:t=>function(){let e=t.call(this);return console.log("Loaded plugin:",this.id),K.EXTERNAL_PLUGIN_LOAD.publish(this),e}});iu({id:"animated-java:event-hook/external-plugin-load/toggle-disabled",object:BBPlugin.prototype,key:"toggleDisabled",get:t=>function(){let e=t.call(this);return this.disabled||(console.log("Enabled plugin:",this.id),K.EXTERNAL_PLUGIN_LOAD.publish(this)),e}});iu({id:"animated-java:event-hook/external-plugin-unload/unload",object:BBPlugin.prototype,key:"unload",get:t=>function(){let e=t.call(this);return console.log("Unloaded plugin:",this.id),K.EXTERNAL_PLUGIN_UNLOAD.publish(this),e}});iu({id:"animated-java:event-hook/pre-post-select-project-event",object:ModelProject.prototype,key:"loadEditorState",get:t=>function(){K.PRE_SELECT_PROJECT.publish(this);let e=t.call(this);return K.POST_SELECT_PROJECT.publish(this),e}});var J6=`dialog.dialog p code {\r padding: 2px 6px;\r border: none;\r font-size: smaller;\r }\r \r dialog.dialog pre:has(code) {\r background-color: var(--color-back);\r padding: 4px 7px;\r font-size: smaller;\r user-select: text;\r white-space: pre-wrap;\r }\r \r #collection_properties_vue > ul > li {\r max-width: unset !important;\r }\r \r #edit_history_list ul li {\r height: unset !important;\r }\r \r #edit_history_list > ul > li label {\r margin-right: auto !important;\r overflow-x: auto !important;\r white-space: nowrap !important;\r max-width: 75% !important;\r }\r `;St({id:"animated-java:global-css",apply:()=>Blockbench.addCSS(J6),revert:t=>{t.delete()}});St({id:"animated-java:bone-properties",apply:()=>({properties:[new Property(Group,"string","onSummonFunction",{condition:Fe,default:""}),new Ga(Group,"configs",{condition:Fe,default:()=>({default:new wt().toJSON(),variants:{}})})]}),revert:({properties:t})=>{t.forEach(e=>e.delete())}});Nt({id:"animated-java:override-function/group/save-name",object:Group.prototype,key:"saveName",condition:()=>Fe(),get:t=>function(e){return this.name=Ea(this.name,this.uuid),t.call(this,e)}});Nt({id:"animated-java:override-function/group/sanitize-name",object:Group.prototype,key:"sanitizeName",condition:()=>Fe(),get:t=>function(){return this.name=Ea(this.name,this.uuid),t.call(this)}});function U3e(t,e,n){return n*(e-t)+t}s(U3e,"lerp");St({id:"animated-java:keyframe-easing",apply:()=>{let t=[new Property(Blockbench.Keyframe,"string","easing",{default:QO,condition:()=>Fe()}),new Property(Blockbench.Keyframe,"array","easingArgs",{condition:()=>Fe()})],e=Blockbench.Keyframe.prototype.getLerp;return Blockbench.Keyframe.prototype.getLerp=function(n,i,a,r){let o=n.easing??"linear";if(!Fe()||o==="linear")return e.call(this,n,i,a,r);let l=Mb[o];if(pl(o)){let m=Array.isArray(n.easingArgs)&&n.easingArgs.length>0?n.easingArgs[0]:Xh(n);l=l.bind(null,m??0)}let c=l(a),d=this.calc(i),u=n.calc(i),p=U3e(d,u,c);if(Number.isNaN(p))throw new Error("Invalid easing function or arguments.");return p},{properties:t,originalGetLerp:e}},revert:({properties:t,originalGetLerp:e})=>{for(let n of t)n.delete();Blockbench.Keyframe.prototype.getLerp=e}});function q3e(t){return!t||t.startsWith("easeInOut")?t:t.startsWith("easeIn")?t.replace("easeIn","easeOut"):t.startsWith("easeOut")?t.replace("easeOut","easeIn"):t}s(q3e,"reverseEasing");Nt({id:"animated-java:action-click-override/reverse-keyframes",object:BarItems.reverse_keyframes,key:"click",condition:()=>Fe(),get:t=>e=>{t(e),Undo.initEdit({keyframes:Timeline.selected||void 0});let n={};for(let a of Timeline.selected||[])n[a.animator.uuid]??=[],n[a.animator.uuid].push(a);let i={};for(let[a,r]of Object.entries(n)){let o={};i[a]=o;for(let l of r)o[l.channel]??=[],o[l.channel].push(l)}for(let a of Object.values(i))for(let r of Object.values(a)){r.sort((l,c)=>l.time-c.time);let o=r.map(l=>({easing:q3e(l.easing),easingArgs:l.easingArgs}));r.forEach((l,c)=>{if(c==0){l.easing=void 0,l.easingArgs=void 0;return}let d=o[c-1];l.easing=d.easing,l.easingArgs=d.easingArgs})}Undo.finishEdit("Reverse keyframe easing"),updateKeyframeSelection(),Animator.preview()}});var Zc=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(this.element.selected!==!0&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element?.parent&&this.element.parent!=="root"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayPosition(e,n=1){let i=this.element.mesh;return e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}interpolate(){return[0,0,0]}displayFrame(){this.doRender()&&this.getElement()}showMotionTrail(){}};s(Zc,"LocatorAnimator");Zc.prototype.type="locator";Zc.prototype.channels={function:{name:A("effect_animator.timeline.function"),mutable:!0,transform:!0,max_data_points:1}};Nt({id:"animated-java:property-override/locator/animator",object:Locator,key:"animator",condition:()=>Fe(),get:()=>Zc});Nt({id:"animated-java:function-override/locator/select",object:Locator.prototype,key:"select",condition:()=>Fe(),get:t=>function(e,n){let i=t.call(this,e,n);return Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator().select(),i}});Nt({id:"animated-java:function-override/animator/show-motion-trail",object:Animator,key:"showMotionTrail",condition:()=>Fe(),get:t=>function(e){if(!(!e||e instanceof Locator))return t(e)}});Nt({id:"animated-java:function-override/animator/preview",object:Animator,key:"preview",condition:()=>Fe(),get:t=>function(e){let n=t(e);return Mode.selected.id===Modes.options.animate.id&&Outliner.selected[0]instanceof Locator&&(Canvas.gizmos[0].visible=!1,Transformer.visible=!1),n}});da({id:"animated-java:project-mod/locator-animator/hide-gizmos",condition:t=>t.format.id===Qt,apply:()=>({unsub:K.UPDATE_SELECTION.subscribe(()=>{Mode.selected.id===Modes.options.animate.id&&selected.at(0)instanceof Locator&&(Canvas.gizmos[0].visible=!1,Transformer.visible=!1)})}),revert:({unsub:t})=>{t()}});St({id:"animated-java:locator-properties",apply:()=>({config:new Property(Locator,"instance","config",{condition:Fe,default:void 0})}),revert:({config:t})=>{t?.delete()}});St({id:"animated-java:model-format-convert-to-mod",apply:()=>{let t=ModelFormat.prototype.convertTo;return ModelFormat.prototype.convertTo=function(){let e=t.call(this);return this.id===Qt&&ES(),e},{original:t}},revert:({original:t})=>{ModelFormat.prototype.convertTo=t}});var G6={"smoothmin(a, b, k)":`v.h = math.clamp(0.5 + (0.5 * (a - b) / k), 0, 1); return math.lerp(a, b, v.h) - (k * v.h * (1 - v.h));`,"smoothclamp(value, min, max, k)":"return lunar.smoothmin(lunar.smoothmin(value, min, -k), max, k);","lopsided_wave(value, lopside_mag)":"return math.sin(value + math.cos(value) * lopside_mag);","easeinsine(progress)":"return 1 - math.cos((progress * 180) / 2);","easeoutsine(progress)":"return math.sin((progress * 180) / 2);","easeinoutsine(progress)":"return(math.cos(180 * progress) - 1) * -1 / 2;","easeinquad(progress)":"return progress * progress;","easeoutquad(progress)":"return 1 - (1 - progress) * (1 - progress);","easeinoutquad(progress)":`return progress < 0.5 ? 2 * progress * progress : 1 - math.pow(-2 * progress + 2, 2) / 2;`,"easeincubic(progress)":"return progress * progress * progress;","easeoutcubic(progress)":"return 1 - math.pow(1 - progress, 3);","easeinoutcubic(progress)":`return progress < 0.5 ? 4 * progress * progress * progress : 1 - math.pow(-2 * progress + 2, 3) / 2;`,"easeinquart(progress)":"return progress * progress * progress * progress;","easeoutquart(progress)":"return 1 - math.pow(1 - progress, 4);","easeinoutquart(progress)":`return progress < 0.5 ? 8 * progress * progress * progress * progress : 1 - math.pow(-2 * progress + 2, 4) / 2;`,"easeinquint(progress)":"return progress * progress * progress * progress * progress;","easeoutquint(progress)":"return 1 - math.pow(1 - progress, 5);","easeinoutquint(progress)":`return progress < 0.5 ? 16 * progress * progress * progress * progress * progress : 1 - math.pow(-2 * progress + 2, 5) / 2;`,"easeinexpo(progress)":`return progress == 0 ? 0 : math.pow(2, 10 * progress - 10);`,"easeoutexpo(progress)":`return progress == 1 ? 1 : 1 - math.pow(2, -10 * progress);`,"easeinoutexpo(progress)":`return progress == 0 ? 0 : progress == 1 ? 1 : progress < 0.5 ? math.pow(2, 20 * progress - 10) / 2 : (2 - math.pow(2, -20 * progress + 10)) / 2;`,"easeincirc(progress)":"return math.sqrt(1 - math.pow(progress - 1, 2));","easeoutcirc(progress)":"return math.sqrt(1 - math.pow(progress - 1, 2));","easeinoutcirc(progress)":`return progress < 0.5 ? (1 - math.sqrt(1 - math.pow(2 * progress, 2))) / 2 : (math.sqrt(1 - math.pow(-2 * progress + 2, 2)) + 1) / 2;`,"easeinback(progress, overshoot)":`t.overshoot=1.70158 * (overshoot ?? 1); return (t.overshoot + 1) * progress * progress * progress - t.overshoot * progress * progress;`,"easeoutback(progress, overshoot)":`t.overshoot=1.70158 * (overshoot ?? 1); return 1 + (t.overshoot + 1) * math.pow(progress - 1, 3) + t.overshoot * math.pow(progress - 1, 2);`,"easeinoutback(progress, overshoot)":`t.overshoot=1.70158 * (overshoot ?? 1); t.c2 = t.overshoot + 1; return progress < 0.5 ? (math.pow(2 * progress, 2) * ((t.c2 + 1) * 2 * progress - t.c2)) / 2 : (math.pow(2 * progress - 2, 2) * ((t.c2 + 1) * (progress * 2 - 2) + t.c2) + 2) / 2;`,"easeinelastic(progress)":`return progress == 0 ? 0 : progress == 1 ? 1 : -math.pow(2, 10 * progress - 10) * math.sin((progress * 10 - 10.75) * 90);`,"easeoutelastic(progress)":`return progress == 0 ? 0 : progress == 1 ? 1 : math.pow(2, -10 * progress) * math.sin((progress * 10 - 0.75) * 90) + 1;`,"easeinoutelastic(progress)":`return progress == 0 ? 0 : progress == 1 ? 1 : progress < 0.5 ? (math.pow(2, 20 * progress - 10) * math.sin((20 * progress - 11.125) * 90) * -1) / 2 : (math.pow(2, -20 * progress + 10) * math.sin((20 * progress - 11.125) * 90)) / 2 + 1;`,"easeinbounce(progress)":"return 1 - easeoutbounce(1 - progress);","easeoutbounce(progress)":`t.n1=7.5625; t.d1=2.75; return progress < 1 / t.d1 ? (t.n1 * progress * progress) : progress < 2 / t.d1 ? { progress = progress - 1.5 / t.d1; t.n1 * progress * progress + 0.75; } : progress < 2.5 / t.d1 ? { progress = progress - 2.25 / t.d1; t.n1 * progress * progress + 0.9375; } : { progress = progress - 2.625 / t.d1; t.n1 * progress * progress + 0.984375; };`,"easeinoutbounce(progress)":`return progress < 0.5 ? 1-easeinbounce(1-2 * progress) / 2 : 1 + easeoutbounce(2 * progress - 1) / 2;`,"linear_wave(progress, hang)":`t.progress = progress * (math.pi / 180) + math.pi * 600; t.hang = hang * (math.pi / 180); return math.mod(math.abs(t.progress), 2 * math.pi + t.hang * 2) > math.pi + t.hang ? math.clamp(-math.mod(math.abs(t.progress), math.pi + t.hang) / math.pi + 1, 0, 1) : math.clamp(math.mod(math.abs(t.progress), math.pi + t.hang) / math.pi, 0, 1);`};var W6=Animator.MolangParser.global_variables,J3e=["true","false","math.","query.","variable.","temp.","context.","this","loop()","return","break","continue"],G3e=["all_animations_finished","any_animation_finished","anim_time","life_time","yaw_speed","ground_speed","vertical_speed","property","has_property()","variant","mark_variant","skin_id","above_top_solid","actor_count","all()","all_tags","anger_level","any()","any_tag","approx_eq()","armor_color_slot","armor_material_slot","armor_texture_slot","average_frame_time","blocking","body_x_rotation","body_y_rotation","bone_aabb","bone_origin","bone_rotation","camera_distance_range_lerp","camera_rotation()","can_climb","can_damage_nearby_mobs","can_dash","can_fly","can_power_jump","can_swim","can_walk","cape_flap_amount","cardinal_facing","cardinal_facing_2d","cardinal_player_facing","combine_entities()","count","current_squish_value","dash_cooldown_progress","day","death_ticks","debug_output","delta_time","distance_from_camera","effect_emitter_count","effect_particle_count","equipment_count","equipped_item_all_tags","equipped_item_any_tag()","equipped_item_is_attachable","eye_target_x_rotation","eye_target_y_rotation","facing_target_to_range_attack","frame_alpha","get_actor_info_id","get_animation_frame","get_default_bone_pivot","get_locator_offset","get_root_locator_offset","had_component_group()","has_any_family()","has_armor_slot","has_biome_tag","has_block_property","has_cape","has_collision","has_dash_cooldown","has_gravity","has_owner","has_rider","has_target","head_roll_angle","head_x_rotation","head_y_rotation","health","heartbeat_interval","heartbeat_phase","heightmap","hurt_direction","hurt_time","in_range()","invulnerable_ticks","is_admiring","is_alive","is_angry","is_attached_to_entity","is_avoiding_block","is_avoiding_mobs","is_baby","is_breathing","is_bribed","is_carrying_block","is_casting","is_celebrating","is_celebrating_special","is_charged","is_charging","is_chested","is_critical","is_croaking","is_dancing","is_delayed_attacking","is_digging","is_eating","is_eating_mob","is_elder","is_emerging","is_emoting","is_enchanted","is_fire_immune","is_first_person","is_ghost","is_gliding","is_grazing","is_idling","is_ignited","is_illager_captain","is_in_contact_with_water","is_in_love","is_in_ui","is_in_water","is_in_water_or_rain","is_interested","is_invisible","is_item_equipped","is_item_name_any()","is_jump_goal_jumping","is_jumping","is_laying_down","is_laying_egg","is_leashed","is_levitating","is_lingering","is_moving","is_name_any()","is_on_fire","is_on_ground","is_on_screen","is_onfire","is_orphaned","is_owner_identifier_any()","is_persona_or_premium_skin","is_playing_dead","is_powered","is_pregnant","is_ram_attacking","is_resting","is_riding","is_roaring","is_rolling","is_saddled","is_scared","is_selected_item","is_shaking","is_shaking_wetness","is_sheared","is_shield_powered","is_silent","is_sitting","is_sleeping","is_sneaking","is_sneezing","is_sniffing","is_sonic_boom","is_spectator","is_sprinting","is_stackable","is_stalking","is_standing","is_stunned","is_swimming","is_tamed","is_transforming","is_using_item","is_wall_climbing","item_in_use_duration","item_is_charged","item_max_use_duration","item_remaining_use_duration","item_slot_to_bone_name()","key_frame_lerp_time","last_frame_time","last_hit_by_player","lie_amount","life_span","lod_index","log","main_hand_item_max_duration","main_hand_item_use_duration","max_durability","max_health","max_trade_tier","maximum_frame_time","minimum_frame_time","model_scale","modified_distance_moved","modified_move_speed","moon_brightness","moon_phase","movement_direction","noise","on_fire_time","out_of_control","player_level","position()","position_delta()","previous_squish_value","remaining_durability","roll_counter","rotation_to_camera()","shake_angle","shake_time","shield_blocking_bob","show_bottom","sit_amount","sleep_rotation","sneeze_counter","spellcolor","standing_scale","structural_integrity","surface_particle_color","surface_particle_texture_coordinate","surface_particle_texture_size","swell_amount","swelling_dir","swim_amount","tail_angle","target_x_rotation","target_y_rotation","texture_frame_index","time_of_day","time_since_last_vibration_detection","time_stamp","total_emitter_count","total_particle_count","trade_tier","unhappy_counter","walk_distance","wing_flap_position","wing_flap_speed"],W3e={"in_range()":"in_range( value, min, max )","all()":"in_range( value, values... )","any()":"in_range( value, values... )","approx_eq()":"in_range( value, values... )"},K3e=["item_slot","block_face","cardinal_block_face_placed_on","is_first_person","owning_entity","player_offhand_arm_height","other","count"],Y3e=["attack_time","is_first_person"],X3e=["sin()","cos()","abs()","clamp()","pow()","sqrt()","random()","ceil()","round()","trunc()","floor()","mod()","min()","max()","exp()","ln()","lerp()","lerprotate()","pi","asin()","acos()","atan()","atan2()","die_roll()","die_roll_integer()","hermite_blend()","random_integer()"],Z3e={"clamp()":"clamp( value, min, max )","pow()":"pow( base, exponent )","random()":"random( low, high )","mod()":"mod( value, denominator )","min()":"min( A, B )","max()":"max( A, B )","lerp()":"lerp( start, end, 0_to_1 )","lerprotate()":"lerprotate( start, end, 0_to_1 )","atan2()":"atan2( y, x )","die_roll()":"die_roll( num, low, high )","die_roll_integer()":"die_roll_integer( num, low, high )","random_integer()":"random_integer( low, high )","hermite_blend()":"hermite_blend( 0_to_1 )"},uy={},dy={};for(let[t,e]of Object.entries(G6)){let n=/^(.+?)\((.*?)\)$/.exec(t);if(!n)continue;let i=n[1],a=n[2].split(",").map(r=>r.trim());uy[i]=(...r)=>{let o={};for(let l=0;l{if(!i.value)return;let a=i.value.match(/(v|variable)\.\w+/gi);a&&a.forEach(r=>{let o=r.substring(r.indexOf(".")+1);o!==t&&e.add(o)})}),e}s(Q3e,"getProjectVariables");function Qc(t,e,n=!1,i=void 0){let a=t.filter(r=>r.startsWith(e)&&r.length!=e.length);return t.forEach(r=>{!a.includes(r)&&r.includes(e)&&r.length!=e.length&&a.push(r)}),n&&n.forEach(r=>a.remove(r)),a.map(r=>({text:r,label:i?.[r],overlap:e.length}))}s(Qc,"filterAndSortList");da({id:"animated-java:molang-mod",condition:t=>t.format.id===Qt,apply:()=>{Object.assign(W6,uy);let t=Animator.autocompleteMolang;return Animator.autocompleteMolang=function(e,n,i){let a=e.substring(0,n).split(/[^a-zA-Z_.]\.*/g).last();if(!a)return[];if(a=a.toLowerCase(),a.includes(".")){let[r,o]=a.split(".");if(r=="math")return Qc(X3e,o,void 0,Z3e);if(r=="query"||r=="q")return Qc(G3e,o,i!=="controller"&&["all_animations_finished","any_animation_finished"],W3e);if(r=="temp"||r=="t"){let l=e.match(/([^a-z]|^)t(emp)?\.\w+/gi);if(l){let c=l.map(u=>u.split(".")[1]),d=c.filter((u,p)=>u!==o&&c.indexOf(u)===p);return Qc(d,o)}}if(r=="context"||r=="c")return Qc([...K3e],o);if(r=="variable"||r=="v"){let l=[...Q3e(o)];return l.safePush(...Y3e),Qc(l,o)}}else{let r=J3e.slice(),o={};return i==="placeholders"&&(o={"toggle()":"toggle( name )","slider()":"slider( name, step?, min?, max? )","impulse()":"impulse( name, duration )"},r.push(...Object.keys(o))),Qc([...r,...Object.keys(dy)],a,void 0,{...o,...dy})}return[]},{originalAutocompleteMolang:t}},revert:({originalAutocompleteMolang:t})=>{for(let e of Object.keys(uy))delete W6[e];Animator.autocompleteMolang=t}});St({id:"animated-java:append-toolbar/outliner/add-locator-action",apply:()=>{let t=BarItems.add_locator;return Toolbars.outliner.add(t,0),{action:t}},revert:({action:t})=>{Toolbars.outliner.remove(t)}});St({id:"animated-java:panel-mod",apply:()=>{let t=Interface.Panels.animations,e=t.inside_vue.$options.computed.files;return t.inside_vue.$options.computed.files=function(){return Fe()?{"":{animations:[...Blockbench.Animation.all,...Blockbench.AnimationController.all],name:"",hide_head:!0}}:e.call(this)},{panel:t,originalFilesFunction:e}},revert:({panel:t,originalFilesFunction:e})=>{t.inside_vue.$options.computed.files=e}});function $3e(t){let e,n,i,a,r=pureMarked(A("plugin_dialog.incompatability_notice"))+"";return{c(){e=L("div"),n=L("i"),n.textContent="warning",i=J(),a=L("div"),E(n,"class","material-icons icon svelte-18kkwsp"),E(a,"class","description svelte-18kkwsp"),E(e,"class","incompatible_plugin_notice svelte-18kkwsp")},m(o,l){U(o,e,l),I(e,n),I(e,i),I(e,a),a.innerHTML=r},p:ie,d(o){o&&z(e)}}}s($3e,"create_if_block");function e2e(t){let e,n=t[0]&&$3e(t);return{c(){n&&n.c(),e=_t()},m(i,a){n&&n.m(i,a),U(i,e,a)},p(i,[a]){i[0]&&n.p(i,a)},i:ie,o:ie,d(i){n&&n.d(i),i&&z(e)}}}s(e2e,"create_fragment");var ug=s(t=>jQuery(`.plugin_browser_page_header button:has(span:contains("${t}"))`)[0],"getButton");function t2e(t,e,n){let{selectedPlugin:i}=e,a=!!i&&ly(i),r=s(()=>{requestAnimationFrame(()=>{let l=ug(tl("dialog.plugins.install"));l&&(l.disabled=!!a,l.title=A("plugin_dialog.incompatability_notice"));let c=ug(tl("dialog.plugins.enable"));c&&(c.disabled=!!a,c.title=A("plugin_dialog.incompatability_notice"));let d=ug(tl("dialog.plugins.uninstall"));d&&(d.disabled=!1);let u=ug(tl("dialog.plugins.disable"));u&&(u.disabled=!1)})},"updateButtons");r();let o=[K.EXTERNAL_PLUGIN_LOAD.subscribe(r),K.EXTERNAL_PLUGIN_UNLOAD.subscribe(r)];return Zi(()=>{o.forEach(l=>l())}),t.$$set=l=>{"selectedPlugin"in l&&n(1,i=l.selectedPlugin)},[a,i]}s(t2e,"instance");var dg=class extends Pe{constructor(e){super(),Ve(this,e,t2e,e2e,De,{selectedPlugin:1})}};s(dg,"IncompatiblePluginNotice");var K6=dg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS("div.plugin_browser_page_header button:has(span):disabled{opacity:0.5 !important;cursor:not-allowed !important}div.plugin_browser_page_header > button:has(span):disabled:hover{color:var(--color-subtle_text) !important;background-color:var(--color-ui) !important}div.incompatible_plugin_notice.svelte-18kkwsp{display:flex;flex-direction:row;color:var(--color-warning);font-size:20px;border:2px solid;background-color:var(--color-button);margin-top:12px;padding:4px}i.svelte-18kkwsp{margin:5px}div.description.svelte-18kkwsp{display:flex;flex-direction:column;margin-left:5px}")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Y6=new ke(null);St({id:"animated-java:plugins-dialog-mod",apply:()=>{let t=Plugins.dialog.component.methods.selectPlugin;return Plugins.dialog.component.methods.selectPlugin=function(e){let n=t.call(this,e);return Y6.set(e),n},{original:t}},revert:({original:t})=>{Plugins.dialog.component.methods.selectPlugin=t}});var fp=null;Y6.subscribe(t=>{fp&&(fp.$destroy(),fp=null),t&&requestAnimationFrame(()=>{fp=Gn({component:K6,props:{selectedPlugin:t},target:".plugin_browser_page_header",prepend:!0,onDestroy:()=>{fp=null}})})});St({id:"animated-java:show-default-pose",apply:()=>{let t=Animator.showDefaultPose;return Animator.showDefaultPose=function(e){if(!Fe())return t(e);let n=[...Group.all,...Outliner.elements];for(let i of n){if(!i.constructor.animator)continue;let a=i.mesh;a.fix_rotation&&a.rotation.copy(a.fix_rotation),a.fix_position&&a.position.copy(a.fix_position),a.fix_scale?a.scale.copy(a.fix_scale):i.constructor.animator.prototype.channels?.scale&&(a.scale.x=a.scale.y=a.scale.z=1)}e||scene.updateMatrixWorld()},{original:t}},revert:({original:t})=>{Animator.showDefaultPose=t}});St({id:"animated-java:variant-preview-cube-face",apply:()=>{let t=CubeFace.prototype.getTexture;return CubeFace.prototype.getTexture=function(){if(Fe()&&this.texture){let e=qe.selected;if(e&&this.cube.parent instanceof Group&&!e.excludedNodes.find(n=>n.value===this.cube.parent.uuid)&&e.textureMap.has(this.texture))return this.lastVariant=e,e.textureMap.getMappedTexture(this.texture);if(Mode.selected.id===Modes.options.animate.id&&this.lastVariant&&!e?.isDefault)return this.lastVariant.textureMap.getMappedTexture(this.texture)}return this.lastVariant=void 0,t.call(this)},{original:t}},revert:({original:t})=>{CubeFace.prototype.getTexture=t}});var n2e={parseResourcePackPath:Sa,datapackCompiler:Gd,resourcepackCompiler:Yd,Variant:qe,MINECRAFT_REGISTRY:Xn,openExportProgressDialog:qf,isResourcePackPath:qr,isDataPackPath:CS,blueprintSettingErrors:bo,openUnexpectedErrorDialog:Fo,BLUEPRINT_FORMAT:ss,BLUEPRINT_CODEC:Hr,TextDisplay:ve,getLatestVersionClientDownloadUrl:yh,getVanillaFont:_c,assetManager:mf,itemModelManager:Nx,blockModelManager:Px,VanillaItemDisplay:We,VanillaBlockDisplay:$e,debugBlocks:TT,debugBlockState:CT,BLOCKSTATE_REGISTRY:yc,exportProject:zc,openInstallPopup:cy,removeCubesAssociatedWithTexture(t){let e=Cube.all.filter(n=>Object.values(n.faces).some(i=>i.texture===t.uuid));Undo.initEdit({elements:e,outliner:!0,textures:[t]}),e.forEach(n=>n.remove()),t.remove(),Undo.finishEdit("Remove Cubes Associated With Texture")},cleanupExportedFiles:Eh,mcbFiles:wo,openChangelogDialog:Qd,checkForIncompatabilities:sg,toSmallCharacters:Ca,printMinecraftFontSheet:()=>Mi("assets/minecraft/font/include/default.json").providers[0].chars.map((e,n)=>`${n}: `+e.split("").join(" ")),TELLRAW:mh,JsonText:jt,getBlockState:wc};window.AnimatedJava=n2e;K.EXTRACT_MODS.subscribe(()=>{delete window.AnimatedJava});BBPlugin.register(Ke.name,{title:Ke.title,author:Ke.author.name,description:Ke.description,icon:"icon.svg",variant:"desktop",version:Ke.version,min_version:Ke.min_blockbench_version,tags:["Minecraft: Java Edition","Animation","Display Entities"],await_loading:!0,onload(){requestAnimationFrame(()=>{K.PLUGIN_LOAD.publish()})},onunload(){K.PLUGIN_UNLOAD.publish()},oninstall(){K.PLUGIN_INSTALL.publish(),cy()},onuninstall(){K.PLUGIN_UNINSTALL.publish(),Blockbench.showMessageBox({title:"Animated Java has Been Uninstalled!",message:"In order to fully uninstall Animated Java, please restart Blockbench.",buttons:["OK"]})}});K.PLUGIN_FINISHED_LOADING.subscribe(()=>{if(sg())return;localStorage.getItem("animated-java-last-version")!==Ke.version&&(localStorage.setItem("animated-java-last-version",Ke.version),Qd())});})(); /*! Bundled license information: safe-buffer/index.js: (*! safe-buffer. MIT License. Feross Aboukhadijeh *) content-disposition/index.js: (*! * content-disposition * Copyright(c) 2014-2017 Douglas Christopher Wilson * MIT Licensed *) object-assign/index.js: (* object-assign (c) Sindre Sorhus @license MIT *) is-natural-number/index.js: (*! * is-natural-number.js | MIT (c) Shinnosuke Watanabe * https://github.com/shinnn/is-natural-number.js *) strip-dirs/index.js: (*! * strip-dirs | MIT (c) Shinnosuke Watanabe * https://github.com/shinnn/node-strip-dirs *) has-symbol-support-x/index.js: (** * @file Tests if ES6 Symbol is supported. * @version 1.4.2 * @author Xotic750 * @copyright Xotic750 * @license {@link MIT} * @module has-symbol-support-x *) has-to-string-tag-x/index.js: (** * @file Tests if ES6 @@toStringTag is supported. * @see {@link http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag|26.3.1 @@toStringTag} * @version 1.4.1 * @author Xotic750 * @copyright Xotic750 * @license {@link MIT} * @module has-to-string-tag-x *) mime-db/index.js: (*! * mime-db * Copyright(c) 2014 Jonathan Ong * Copyright(c) 2015-2022 Douglas Christopher Wilson * MIT Licensed *) pako/dist/pako.esm.mjs: (*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) *) */ ================================================ FILE: plugins/animated_java/changelog.json ================================================ { "1.6.0": { "title": "v1.6.0", "author": "Titus Evans (SnaveSutit)", "date": "2025-01-08", "categories": [ { "title": "Changes", "list": [ "[BREAKING] Changed default resource pack structure: `animated_java:textures/item/export_namespace/` -> `animated_java:textures/blueprint/export_namespace/` & `animated_java:models/item/export_namespace/` -> `animated_java:models/blueprint/export_namespace/`", "Added changelog popup! (You're looking at it right now!)", "Added an export target for Minecraft 1.21.4", "Added support for item definitions (1.21.4)", "Added warning for loading Animated Java Data Packs in the wrong version.", "Improved internal MCB File compression", "Slightly improved empty JSON text rendering ([#322](https://github.com/Animated-Java/animated-java/issues/322)", "Added an Extract action to remove exported files from the Resource Pack and Data Pack", "Changed missing assets and data folder for resource and data pack folder settings errors into warnings", "Added a dialog and exception for exporting a blueprint with invalid cube rotations." ] }, { "title": "Fixes", "list": [ "Fixed tags getting cleared out in old exports", "Fixed incorrect export location for transparent texture.", "Fixed Per-Face UV not being enforced when converting", "Fixed [#348](https://github.com/Animated-Java/animated-java/issues/348)", "Fixed [#349](https://github.com/Animated-Java/animated-java/issues/349)", "Fixed [#347](https://github.com/Animated-Java/animated-java/issues/347)", "Fixed [#345](https://github.com/Animated-Java/animated-java/issues/345)", "Fixed [#341](https://github.com/Animated-Java/animated-java/issues/341)", "Fixed [#343](https://github.com/Animated-Java/animated-java/issues/343)", "Fixed [#340](https://github.com/Animated-Java/animated-java/issues/340)", "Fixed [#342](https://github.com/Animated-Java/animated-java/issues/342)" ] } ] }, "1.6.1": { "title": "v1.6.1", "author": "Titus Evans (SnaveSutit)", "date": "2025-01-10", "categories": [ { "title": "Changes", "list": ["Slightly improved the changelog."] }, { "title": "Fixes", "list": [ "Fixed overlays breaking custom function tags.", "Fixed [#350](https://github.com/Animated-Java/animated-java/issues/350)", "Fixed [#353](https://github.com/Animated-Java/animated-java/issues/353)" ] } ] }, "1.6.2": { "title": "v1.6.2", "author": "Titus Evans (SnaveSutit)", "date": "2025-01-12", "categories": [ { "title": "Changes", "list": [ "[BREAKING] Implemented improved scoreboard tag system. Please visit [this docs page](https://animated-java.dev/docs/rigs/tags) on the Animated Java website to learn more.", "[BREAKING] Removed individual variant summon functions. (`animated_java:namespace/summon/variant_name`) in favor of `animated_java:namespace/summon {args:{variant: 'variant_name'}}`.", "[BREAKING] Removed advanced folder options for Resource Packs.", "Re-organized the file structure of AJ's UI files.", "Updated the model format order on the start menu to be organized alphabetically.", "Added incomptaibility warnings for installing, or having installed, plugins that are incompatible with Animated Java." ] }, { "title": "Fixes", "list": [ "Fixed some visual and interactivity issues with the Variants panel.", "Fixed default Variant UUID changing every time a model is opened.", "Fixed \"Display entity is not a string\" console spam", "Fixed 1.21.2 using `custom_model_data` instead of `item_model`", "Fixed [#304](https://github.com/Animated-Java/animated-java/issues/304)", "Fixed [#356](https://github.com/Animated-Java/animated-java/issues/356)", "Fixed [#357](https://github.com/Animated-Java/animated-java/issues/357)", "Fixed [#358](https://github.com/Animated-Java/animated-java/issues/358)", "Fixed [#359](https://github.com/Animated-Java/animated-java/issues/359)" ] } ] }, "1.6.3": { "title": "v1.6.3", "author": "Titus Evans (SnaveSutit)", "date": "2025-01-15", "categories": [ { "title": "Changes", "list": [ "Updated to Blockbench 4.12.0", "Removed internal Transparent texture. The plugin will automatically create a transparent texture in your model's texture list if you previously used the internal one in any of your variants." ] }, { "title": "Fixes", "list": [ "Fixed invalid JSON error when exporting into a resource pack without a block texture atlas." ] } ] }, "1.6.4": { "title": "v1.6.4", "author": "Titus Evans (SnaveSutit)", "date": "2025-01-19", "categories": [ { "title": "Fixes", "list": [ "Fixed \"safe_name\" export crash.", "Fixed double v prefix in About dialog." ] } ] }, "1.7.0": { "title": "v1.7.0", "author": "Titus Evans (SnaveSutit)", "date": "2025-04-30", "categories": [ { "title": "Changes", "list": [ "[BREAKING] Overhauled internal functions and data structures. This may cause some issues with older exports, so you should clean out your old AJ exports and re-export them.", "[BREAKING] Renamed `animated_java:/as_own_locator_entities` to `animated_java:/as_all_locators`.", "Added support for Minecraft 1.21.5.", "Added support for exporting to multiple target Minecraft versions at once.", "Reduced the size of exported Data Packs by about 50%.", "Added `Sync Passenger Rotation` config option to Locators.", "Added a new function: `animated_java:/at_all_locators {command: string}` that runs a command at all of a rig's entity-less locator positions.", "Added a new function: `animated_java:/as_locator {name: string, command: string}` that runs a command as and at a named locator's entity.", "Added a new function: `animated_java:/at_locator {name: string, command: string}` that runs a command at an entity-less locator's position.", "Added a new function: `animated_java:/as_camera {name: string, command: string}` that runs a command as and at a camera's entity.", "Added a new function: `animated_java:/remove/entities` that kills all entities owned by a rig, whether they are attached to a root entity or not.", "Added a new Blueprint setting: `On-Remove Commands`.", "Added support for `shadow_color` to JSON Text Components.", "Temporarily made all descriptions of settings appear below settings." ] }, { "title": "Fixes", "list": [ "Fixed project settings leaking between opened `.ajblueprints`.", "Fixed textures being forcfully set as internal when saving an `.ajblueprint`.", "Fixed `tints` field being placed in the wrong location in exported item model definitions.", "Fixed bone rotation not being synced with the root entity when a rig is exported without animations.", "Fixed data entity being tagged with GLOBAL_NODE instead of GLOBAL_ENTITY.", "Fixed added missing tag PROJECT_ENTITY to data entities.", "Fixed locators and cameras missing most of their tags.", "Fixed missing PROJECT_ENTITY tag on root entities.", "Fixed backslash (\\) being allowed in node names.", "Fixed locators not being removed when calling `animated_java:global/remove/everything`.", "Fixed crash while exporting when encountering an invalid JSON file in the target data pack.", "Fixed [#389](https://github.com/Animated-Java/animated-java/issues/389)", "Fixed custom outliner element changes not marking a project as changed." ] } ] }, "1.7.1": { "title": "v1.7.1", "author": "Titus Evans (SnaveSutit)", "date": "2025-05-06", "categories": [ { "title": "Fixes", "list": ["Fixed [#412](https://github.com/Animated-Java/animated-java/issues/409)"] } ] }, "1.7.2": { "title": "v1.7.2", "author": "Titus Evans (SnaveSutit)", "date": "2025-05-07", "categories": [ { "title": "Fixes", "list": [ "Fixed incorrect entity type for data entities on versions below 1.21.5.", "Fixed missing `as_...` functions in exported data packs below 1.21.5.", "Improved .mcb code consistency." ] } ] }, "1.7.3": { "title": "v1.7.3", "author": "Titus Evans (SnaveSutit)", "date": "2025-05-08", "categories": [ { "title": "Fixes", "list": [ "Fixed adding cameras to a rig causing the data entity to dismount root.", "Make variant keyframes reset to default if their variant doesn't exist anymore." ] } ] }, "1.8.0-beta.1": { "title": "v1.8.0-beta.1", "author": "Titus Evans (SnaveSutit)", "date": "2025-10-13", "categories": [ { "title": "Changes", "list": [ "[BREAKING] `play` and `stop` functions now pause all animations when called.", "[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.", "[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.", "Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.", "Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)", "Added support for Minecraft 1.21.6 and 1.21.9", "Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)", "Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.", "Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.", "Added a button to copy the exported JSON Text component of a Text Display to your clipboard.", "Updated keyframe UI, making it much more responsive, and easier to use.", "Added support for `light_emission` on cubes.", "The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.", "Improved Text Display JSON text input syntax highlighting.", "Improved Text Display JSON text input appearance.", "Improved JSON Text component parsing and error reporting.", "Improved all function errors and tellraws in exported Data Packs.", "Improved outdated warning formatting and functionality.", "Improved text display rendering performance, and update reactivity.", "Display item is no longer configurable in versions that use `item_model` (1.20.5+).", "The `summon` function now provides better feedback when using invalid arguments.", "Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.", "Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.", "Increased width of all node configs from 400px to 600px.", "Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.", "Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.", "Renamed all 'Commands' settings to 'Function'.", "Renamed 'On-Tick Function' to 'Post-Tick Function'.", "Added 'Pre-Tick Function' Blueprint setting.", "Renamed `raw` export mode to `folder`.", "Added new Blueprint setting: 'Auto Update Rig Orientation'.", "Added `animated_java:/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.", "Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.", "Reduced the number of times the orientation of locators and cameras is updated while animating.", "Improved performance of `fontManager` char mesh rendering.", "Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.", "Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.", "Improved plugin incompatibility warnings." ] }, { "title": "Fixes", "list": [ "Fixed a few minor Text Display text wrapping issues.", "Fixed display entities causing collections to break.", "Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)", "Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)", "Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)", "Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)", "Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)", "Fixed GU failing on first load due to missing scoreboard dependency.", "Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)", "Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)", "Fixed Text Display JSON text input not catching tab key presses.", "Fixed outdated rig warning not working in some cases.", "Fixed outdated rig warning entities missing important tags.", "Fixed missing translations for install popup.", "Fixed function tag merging not working correctly.", "Fixed missing `item_display` NBT tag on exported Item Displays.", "Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.", "Fixed project save status not updating when modifying node configs.", "Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)", "Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)", "Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)", "Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.", "Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)", "Fixed invalid cube warning not updating when editing cubes.", "Fixed relative paths not being recognized on windows.", "Fixed `set_frame` failing due to incorrect tag in entity selector.", "Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.", "Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.", "Fixed animation config dialog not marking project as unsaved after making changes.", "Fixed variants panel animating when switching between projects.", "Fixed `ajmodel` upgrader not opening when double clicked" ] }, { "title": "Camera Fixes", "list": [ "Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)", "Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)", "Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)", "Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)", "Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)", "Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)" ] }, { "title": "Internal Data Pack Changes and Fixes", "list": [ "Updated to the latest version of MC-Build.", "Added support for `.mcbt` files to the Data Pack compiler.", "Reduced entity data size by reducing the length of locator and camera transform keys.", "Removed `global/internal` folder.", "Expanded all `aj` namespaces to `animated_java` except tags.", "Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.", "Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.", "Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.", "`.mcb` files now use more descriptive variable names.", "Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.", "Reduced overhead when generating variant functions.", "Switched over to using variables for storage names.", "Renamed `on_summon_commands` -> `on_summon_function`.", "Renamed `on_remove_commands` -> `on_remove_function`.", "Renamed `ticking_commands` -> `on_post_tick_function`.", "Moved some ticking and loading functionality out of individual namespaces and into global.", "Added `debug` macro to reduce code duplication.", "Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.", "Replaced all `arguments[1]` references with new `context` variable." ] }, { "title": "Other Changes and Fixes", "list": [ "Most enum-like values are now using TS enums.", "Removed config functionality from cameras entirely.", "Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.", "Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.", "`AnimatedJava.API` global has been renamed to `AnimatedJava`.", "Improve handling of Text and Block Display entity NBT when generating root entity passengers.", "Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.", "Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.", "`.mcb` files now use more descriptive variable names.", "`assetManager.getRawAsset` now returns a Buffer.", "Fixed broken Animated Java bar item condition.", "Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.", "Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.", "Improve `ModelDataFixerUpper` types, logic flow, and error handling.", "Add `ModelDataFixerUpper` upgrade function for v1.8.0.", "Made `TELLRAW.RIG_OUTDATED` runtime-generic." ] } ] }, "1.8.0-beta.2": { "title": "v1.8.0-beta.2", "author": "Titus Evans (SnaveSutit)", "date": "2025-10-15", "categories": [ { "title": "Changes", "list": [ "[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.", "[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.", "Replaced unique node configs with universal DisplayEntityConfig.", "Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.", "Added 'On Summon Function' to Display Entity Configs.", "Added 'On Apply Function' to Per-variant Display Entity Configs.", "Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.", "Improved the Render Box preview's reactivity." ] }, { "title": "Fixes", "list": [ "Fixed rotation validation not checking the correct version, and marking any rotation as invalid.", "Fixed Blueprints becoming unsavable after opening.", "Fixed Blueprints becoming unsavable after converting from another format.", "Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.", "Fixed uncaught error when deleting a text display.", "Fixed outdated warning not appearing until the second reload after rig_hash was modified.", "Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data." ] } ] }, "1.8.0-beta.3": { "title": "v1.8.0-beta.3", "author": "Titus Evans (SnaveSutit)", "date": "2025-10-15", "categories": [ { "title": "Fixes", "list": ["Fixed On-Summon Functions and On-Apply Functions not functioning."] } ] }, "1.8.0-beta.4": { "title": "v1.8.0-beta.4", "author": "Titus Evans (SnaveSutit)", "date": "2025-10-16", "categories": [ { "title": "Fixes", "list": [ "Fixed Blueprint format data fixer uppper failing to upgrade Blueprints past format version 1.6.5.", "Fixed outdated rig function failing due to incorrect root tag." ] } ] }, "1.8.0-beta.5": { "title": "v1.8.0-beta.5", "author": "Titus Evans (SnaveSutit)", "date": "2025-10-19", "categories": [ { "title": "Fixes", "list": [ "Fixed cube rotations in 1.21.6+ allowing rotation values outside the -45..45 degree range", "Fixed rotation limits not being enforced when converting to a Blueprint.", "Fixed rotation limit not being enforced when rotating cubes.", "Fixed export crash due to invalid tag reference." ] } ] }, "1.8.0": { "title": "v1.8.0", "author": "Titus Evans (SnaveSutit)", "date": "2025-10-21", "categories": [ { "title": "Changes", "list": [ "[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.", "[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.", "[BREAKING] `play` and `stop` functions now pause all animations when called.", "[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.", "[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.", "Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.", "Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)", "Added support for Minecraft 1.21.6 and 1.21.9", "Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)", "Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.", "Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.", "Added a button to copy the exported JSON Text component of a Text Display to your clipboard.", "Updated keyframe UI, making it much more responsive, and easier to use.", "Added support for `light_emission` on cubes.", "Replaced unique node configs with universal DisplayEntityConfig.", "Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.", "Added 'On Summon Function' to Display Entity Configs.", "Added 'On Apply Function' to Per-variant Display Entity Configs.", "Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.", "Improved the Render Box preview's reactivity.", "The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.", "Improved Text Display JSON text input syntax highlighting.", "Improved Text Display JSON text input appearance.", "Improved JSON Text component parsing and error reporting.", "Improved all function errors and tellraws in exported Data Packs.", "Improved outdated warning formatting and functionality.", "Improved text display rendering performance, and update reactivity.", "Display item is no longer configurable in versions that use `item_model` (1.20.5+).", "The `summon` function now provides better feedback when using invalid arguments.", "Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.", "Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.", "Increased width of all node configs from 400px to 600px.", "Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.", "Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.", "Renamed all 'Commands' settings to 'Function'.", "Renamed 'On-Tick Function' to 'Post-Tick Function'.", "Added 'Pre-Tick Function' Blueprint setting.", "Renamed `raw` export mode to `folder`.", "Added new Blueprint setting: 'Auto Update Rig Orientation'.", "Added `animated_java:/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.", "Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.", "Reduced the number of times the orientation of locators and cameras is updated while animating.", "Improved performance of `fontManager` char mesh rendering.", "Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.", "Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.", "Improved plugin incompatibility warnings." ] }, { "title": "Fixes", "list": [ "Fixed a few minor Text Display text wrapping issues.", "Fixed display entities causing collections to break.", "Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)", "Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)", "Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)", "Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)", "Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)", "Fixed GU failing on first load due to missing scoreboard dependency.", "Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)", "Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)", "Fixed Text Display JSON text input not catching tab key presses.", "Fixed outdated rig warning not working in some cases.", "Fixed outdated rig warning entities missing important tags.", "Fixed missing translations for install popup.", "Fixed function tag merging not working correctly.", "Fixed missing `item_display` NBT tag on exported Item Displays.", "Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.", "Fixed project save status not updating when modifying node configs.", "Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)", "Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)", "Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)", "Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.", "Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)", "Fixed invalid cube warning not updating when editing cubes.", "Fixed relative paths not being recognized on windows.", "Fixed `set_frame` failing due to incorrect tag in entity selector.", "Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.", "Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.", "Fixed animation config dialog not marking project as unsaved after making changes.", "Fixed variants panel animating when switching between projects.", "Fixed `ajmodel` upgrader not opening when double clicked.", "Fixed rotation validation not checking the correct version, and marking any rotation as invalid.", "Fixed Blueprints becoming unsavable after opening.", "Fixed Blueprints becoming unsavable after converting from another format.", "Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.", "Fixed uncaught error when deleting a text display.", "Fixed Blueprint format data fixer upper failing to upgrade Blueprints past format version 1.6.5.", "Fixed outdated warning not appearing until the second reload after rig_hash was modified.", "Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data." ] }, { "title": "Camera Fixes", "list": [ "Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)", "Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)", "Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)", "Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)", "Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)", "Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)" ] }, { "title": "Internal Data Pack Changes and Fixes", "list": [ "Updated to the latest version of MC-Build.", "Added support for `.mcbt` files to the Data Pack compiler.", "Reduced entity data size by reducing the length of locator and camera transform keys.", "Removed `global/internal` folder.", "Expanded all `aj` namespaces to `animated_java` except tags.", "Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.", "Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.", "Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.", "`.mcb` files now use more descriptive variable names.", "Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.", "Reduced overhead when generating variant functions.", "Switched over to using variables for storage names.", "Renamed `on_summon_commands` -> `on_summon_function`.", "Renamed `on_remove_commands` -> `on_remove_function`.", "Renamed `ticking_commands` -> `on_post_tick_function`.", "Moved some ticking and loading functionality out of individual namespaces and into global.", "Added `debug` macro to reduce code duplication.", "Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.", "Replaced all `arguments[1]` references with new `context` variable.", "Fixed outdated rig function failing due to incorrect root tag." ] }, { "title": "Other Changes and Fixes", "list": [ "Most enum-like values are now using TS enums.", "Removed config functionality from cameras entirely.", "Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.", "Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.", "`AnimatedJava.API` global has been renamed to `AnimatedJava`.", "Improve handling of Text and Block Display entity NBT when generating root entity passengers.", "Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.", "Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.", "`.mcb` files now use more descriptive variable names.", "`assetManager.getRawAsset` now returns a Buffer.", "Fixed broken Animated Java bar item condition.", "Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.", "Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.", "Improve `ModelDataFixerUpper` types, logic flow, and error handling.", "Add `ModelDataFixerUpper` upgrade function for v1.8.0.", "Made `TELLRAW.RIG_OUTDATED` runtime-generic." ] } ] }, "1.8.1": { "title": "v1.8.1", "author": "Titus Evans (SnaveSutit)", "date": "2025-11-2", "categories": [ { "title": "Changes", "list": [ "💬 Added Russian localization - Thanks Koishem!", "Added previewing for Item Display's `item_display` transforms." ] }, { "title": "Fixes", "list": [ "Fixed [#465](https://github.com/Animated-Java/animated-java/issues/465)", "Fixed `global/on_tick` function being placed at start of `minecraft:tick` function tag.", "Fixed backwards / missing chest model.", "Fixed block models on Item Displays using the wrong pivot point.", "Fixed item display panel losing focus when a valid item is entered." ] } ] } } ================================================ FILE: plugins/animated_java/members.yml ================================================ maintainers: - SnaveSutit ================================================ FILE: plugins/animated_platforms/about.md ================================================ # Animated Platforms An animated ground plane for Blockbench to preview motion (walk cycles, vehicles, etc.) by scrolling a textured plane under your model. This is especially useful for Minecraft mobs / entity animation, but it works for any animation workflow. ## Features - Scroll speed in blocks/sec (with quick presets) - Size/placement controls (width/length/height, rotation) - Optional custom texture + rotate/flip - Texture library for quick reuse - Per-animation presets (save / auto-save) ## Notes - Custom texture rotation is visual only; movement direction stays consistent. - Presets are stored locally (Blockbench localStorage) and are scoped so different projects/animations don’t overwrite each other. ## Author Cazfps ================================================ FILE: plugins/animated_platforms/animated_platforms.js ================================================ (function () { const PLUGIN_ID = "animated_platforms"; const PLUGIN_VERSION = "1.0.0"; // Settings storage key for this standalone plugin. const SETTINGS_KEY = "animated_platforms_settings"; // Legacy IDs/keys (migration) const LEGACY_PLUGIN_ID = "moving_ground_plane"; const LEGACY_SETTINGS_KEY = "moving_ground_plane_settings"; const LEGACY_PRESET_PREFIX = "cazfps_mgp_anim_presets::"; const PRESET_PREFIX = "cazfps_animated_platforms_anim_presets::"; // ============================================================ // Singleton guard (prevents duplicate timers if this file is loaded twice) // ============================================================ const INSTANCE_KEY = "__cazfps_animated_platforms_instance__"; const LEGACY_INSTANCE_KEY = "__cazfps_moving_ground_plane_instance__"; try { const prev1 = globalThis?.[INSTANCE_KEY]; if (prev1 && typeof prev1.cleanup === "function") prev1.cleanup(); const prev0 = globalThis?.[LEGACY_INSTANCE_KEY]; if (prev0 && typeof prev0.cleanup === "function") prev0.cleanup(); } catch (e) {} try { globalThis[INSTANCE_KEY] = { cleanup() {}, }; } catch (e) {} // ============================================================ // UI: Make this dialog non-modal (no blackout) // ============================================================ // Dialog UX hack (opt-in): disables the modal overlay/blur while this plugin's dialogs are open. // This mutates global DOM/CSS and must always be reverted on dialog close and on unload. // This hack mutates global DOM/CSS and can cause persistent FPS drops on some // systems/GPUs after opening a dialog. Keep it off by default. const ENABLE_NO_OVERLAY_HACK = true; // ============================================================ // Plugin asset URL helpers (works for store/web + file installs) // ============================================================ function getAnimatedPlatformsAssetUrl(filename) { const f = String(filename || "").trim(); if (!f) return ""; try { const all = Plugins?.all; const p = Array.isArray(all) ? all.find((x) => x && x.id === PLUGIN_ID) : null; const source = String(p?.source || ""); const path = String(p?.path || ""); // File/URL installs: resolve relative to the plugin JS path. if ((source === "file" || source === "url") && path) { return path.replace(/[^\\/]+\.js(\?.*)?$/, f); } } catch (e) {} // Store / web: resolve from plugin CDN path. try { if (typeof Plugins !== "undefined" && Plugins?.api_path) { return `${Plugins.api_path}/${PLUGIN_ID}/${encodeURIComponent(f)}`; } } catch (e) {} return f; } // NOTE: We avoid rewriting the Plugins window DOM. // The about.md provides its own icon markup, so no cross-plugin DOM hooks are needed. const NO_OVERLAY_CLASS = "animated_platforms_no_overlay"; const NO_OVERLAY_STYLE_ID = "animated_platforms_no_overlay_style"; // Some Blockbench builds apply blur/filters to the preview when dialogs are open. // On some GPUs/drivers this tanks FPS while the dialog is visible. // We disable ONLY the blur/filter while this plugin's dialog is open. const NO_BLUR_CLASS = "animated_platforms_no_blur"; const NO_BLUR_STYLE_ID = "animated_platforms_no_blur_style"; // Dialog CSS injection (Dialog.lines HTML is deprecated) const PANEL_STYLE_ID = "animated_platforms_panel_style"; const ABOUT_STYLE_ID = "animated_platforms_about_style"; function ensureStyleTag(id, cssText) { try { if (!document?.head) return; if (!id) return; if (document.getElementById(id)) return; const style = document.createElement("style"); style.id = id; style.textContent = String(cssText || ""); document.head.appendChild(style); } catch (e) {} } function ensurePanelStyle() { ensureStyleTag( PANEL_STYLE_ID, ` #animated_platforms_panel .dialog_content { margin: 0; } #animated_platforms_panel #mgp-panel { padding: 14px 16px 12px; } #animated_platforms_panel .mgp-section { margin-bottom: 14px; } #animated_platforms_panel .mgp-section-title { font-weight: 700; margin: 10px 0 8px; } #animated_platforms_panel .mgp-row { display: flex; align-items: center; gap: 10px; margin: 6px 0; } #animated_platforms_panel .mgp-row label { flex: 1; opacity: 0.95; } #animated_platforms_panel .mgp-row .mgp-right { display: flex; align-items: center; gap: 8px; } #animated_platforms_panel .mgp-row .mgp-right > * { flex: initial; } #animated_platforms_panel .mgp-checkbox { display: flex; align-items: center; gap: 8px; } #animated_platforms_panel .mgp-checkbox input { margin: 0; } #animated_platforms_panel .mgp-select { min-width: 150px; } #animated_platforms_panel .mgp-footer { display: flex; align-items: center; gap: 10px; padding-top: 10px; border-top: 1px solid var(--color-border); margin-top: 10px; } #animated_platforms_panel .mgp-author { opacity: 0.8; font-size: 0.95em; } #animated_platforms_panel .mgp-spacer { flex: 1; } #animated_platforms_panel .mgp-button-row { display: flex; gap: 8px; flex-wrap: wrap; } #animated_platforms_panel .mgp-button-row > button.tool { flex: 1; min-width: 170px; } #animated_platforms_panel button.tool { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-height: 34px; } #animated_platforms_panel button.tool > * { pointer-events: none; } #animated_platforms_panel .mgp-subtle { opacity: 0.8; } #animated_platforms_panel numeric-input { width: 140px; } #animated_platforms_textures #mgp-texture-library { padding: 12px 14px; } #animated_platforms_textures .mgp-texture-library-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; } #animated_platforms_textures .mgp-empty { opacity: 0.8; padding: 12px 0; } #animated_platforms_textures .mgp-texture-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; } #animated_platforms_textures .mgp-texture-card { background: var(--color-back); border: 1px solid var(--color-border); padding: 8px; display: flex; flex-direction: column; gap: 8px; } #animated_platforms_textures .mgp-thumb { background: var(--color-dark); aspect-ratio: 1 / 1; overflow: hidden; display: flex; align-items: center; justify-content: center; } #animated_platforms_textures .mgp-thumb img { width: 100%; height: 100%; object-fit: cover; image-rendering: pixelated; display: block; } #animated_platforms_textures .mgp-texture-actions { display: flex; gap: 8px; flex-wrap: wrap; } #animated_platforms_textures .mgp-texture-actions > button.tool { flex: 1 1 0; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } #animated_platforms_textures .mgp-footer { display: flex; align-items: center; gap: 10px; padding-top: 10px; border-top: 1px solid var(--color-border); margin-top: 10px; } #animated_platforms_textures .spacer { flex: 1; } `.trim() ); } function ensureAboutStyle() { ensureStyleTag( ABOUT_STYLE_ID, ` dialog#mgp_about .dialog_title { padding-left: 0; display: flex; align-items: center; gap: 10px; } dialog#mgp_about .dialog_content { text-align: left !important; margin: 0 !important; } dialog#mgp_about #mgp_banner { background-color: var(--color-accent); color: var(--color-accent_text); width: 100%; padding: 0 8px; } dialog#mgp_about #mgp_content { margin: 24px; } dialog#mgp_about .mgp-socials { display: flex; gap: 22px; justify-content: center; margin-top: 22px; } dialog#mgp_about .mgp-socials a { display: flex; flex-direction: column; align-items: center; gap: 8px; text-decoration: none; color: var(--color-text); min-width: 160px; padding: 10px; } dialog#mgp_about .mgp-socials a:hover { background-color: var(--color-selected); color: var(--color-light); } dialog#mgp_about .mgp-socials i { font-size: 32px; } dialog#mgp_about .mgp-socials img.mgp-site-icon { width: 32px; height: 32px; object-fit: contain; } dialog#mgp_about .mgp-socials label { cursor: pointer; text-decoration: underline; } `.trim() ); } function migrateLegacyStorageOnce() { try { // Copy legacy settings if the new key is empty. const cur = localStorage.getItem(SETTINGS_KEY); const old = localStorage.getItem(LEGACY_SETTINGS_KEY); if ((!cur || !cur.trim()) && old && old.trim()) { localStorage.setItem(SETTINGS_KEY, old); } // Copy legacy per-project preset buckets (prefix rename). // This keeps per-animation presets working after the plugin id rename. const keys = []; for (let i = 0; i < localStorage.length; i++) { const k = localStorage.key(i); if (k) keys.push(k); } keys.forEach((k) => { if (!k.startsWith(LEGACY_PRESET_PREFIX)) return; const newKey = PRESET_PREFIX + k.slice(LEGACY_PRESET_PREFIX.length); const hasNew = localStorage.getItem(newKey); if (hasNew) return; const v = localStorage.getItem(k); if (v !== null && v !== undefined) localStorage.setItem(newKey, v); }); } catch (e) {} } const NO_OVERLAY_SELECTORS = [ ".dialog_background", ".dialog_backdrop", ".dialog_barrier", ".dialog_overlay", "#dialog_background", "#dialog_backdrop", "#blackout", ".blackout", ".modal-backdrop", ".modal_backdrop", ".overlay", ".overlay_background", ".dark_overlay", ]; function ensureNoOverlayStyle() { if (document.getElementById(NO_OVERLAY_STYLE_ID)) return; const style = document.createElement("style"); style.id = NO_OVERLAY_STYLE_ID; style.textContent = ` /* Remove any blur/filters applied when a dialog is open */ body.${NO_OVERLAY_CLASS} #page_wrapper, body.${NO_OVERLAY_CLASS} #work_screen, body.${NO_OVERLAY_CLASS} #center, body.${NO_OVERLAY_CLASS} .preview, body.${NO_OVERLAY_CLASS} canvas.preview, body.${NO_OVERLAY_CLASS} .preview canvas, body.${NO_OVERLAY_CLASS} .preview_panel, body.${NO_OVERLAY_CLASS} .preview_background { filter: none !important; backdrop-filter: none !important; opacity: 1 !important; } /* Remove the dim overlay behind dialogs and make it click-through */ body.${NO_OVERLAY_CLASS} .dialog_background, body.${NO_OVERLAY_CLASS} .dialog_backdrop, body.${NO_OVERLAY_CLASS} .dialog_barrier, body.${NO_OVERLAY_CLASS} .dialog_overlay, body.${NO_OVERLAY_CLASS} #dialog_background, body.${NO_OVERLAY_CLASS} #dialog_backdrop, body.${NO_OVERLAY_CLASS} #blackout, body.${NO_OVERLAY_CLASS} .blackout, body.${NO_OVERLAY_CLASS} .modal-backdrop, body.${NO_OVERLAY_CLASS} .modal_backdrop, body.${NO_OVERLAY_CLASS} .overlay, body.${NO_OVERLAY_CLASS} .overlay_background, body.${NO_OVERLAY_CLASS} .dark_overlay { background: transparent !important; background-color: transparent !important; backdrop-filter: none !important; opacity: 1 !important; pointer-events: none !important; } /* Fallback for versions that use inline styles for the dimmer */ body.${NO_OVERLAY_CLASS} div[style*="rgba(0,0,0"], body.${NO_OVERLAY_CLASS} div[style*="rgb(0, 0, 0"], body.${NO_OVERLAY_CLASS} div[style*="background: rgba(0,0,0"], body.${NO_OVERLAY_CLASS} div[style*="background-color: rgba(0,0,0"] { background: transparent !important; background-color: transparent !important; backdrop-filter: none !important; opacity: 1 !important; pointer-events: none !important; } `; document.head.appendChild(style); } function ensureNoBlurStyle() { if (document.getElementById(NO_BLUR_STYLE_ID)) return; const style = document.createElement("style"); style.id = NO_BLUR_STYLE_ID; style.textContent = ` body.${NO_BLUR_CLASS} #page_wrapper, body.${NO_BLUR_CLASS} #work_screen, body.${NO_BLUR_CLASS} #center, body.${NO_BLUR_CLASS} .preview, body.${NO_BLUR_CLASS} canvas.preview, body.${NO_BLUR_CLASS} .preview canvas, body.${NO_BLUR_CLASS} .preview_panel, body.${NO_BLUR_CLASS} .preview_background { filter: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; } `; document.head.appendChild(style); } function setNoBlurEnabled(enabled) { if (!document?.body) return; if (enabled) { ensureNoBlurStyle(); document.body.classList.add(NO_BLUR_CLASS); } else { document.body.classList.remove(NO_BLUR_CLASS); } } function setDialogOverlayTransparent(enabled) { try { const nodes = []; for (const sel of NO_OVERLAY_SELECTORS) { document.querySelectorAll(sel).forEach((n) => nodes.push(n)); } for (const el of nodes) { if (!(el instanceof HTMLElement)) continue; if (enabled) { if (!el.dataset.mgpPrevBg) { el.dataset.mgpPrevBg = el.style.background || ""; el.dataset.mgpPrevBgc = el.style.backgroundColor || ""; el.dataset.mgpPrevOpacity = el.style.opacity || ""; el.dataset.mgpPrevFilter = el.style.backdropFilter || ""; el.dataset.mgpPrevPointerEvents = el.style.pointerEvents || ""; } el.style.background = "transparent"; el.style.backgroundColor = "transparent"; el.style.backdropFilter = "none"; el.style.opacity = "1"; el.style.pointerEvents = "none"; } else if (el.dataset.mgpPrevBg !== undefined) { el.style.background = el.dataset.mgpPrevBg; el.style.backgroundColor = el.dataset.mgpPrevBgc; el.style.opacity = el.dataset.mgpPrevOpacity; el.style.backdropFilter = el.dataset.mgpPrevFilter; el.style.pointerEvents = el.dataset.mgpPrevPointerEvents; delete el.dataset.mgpPrevBg; delete el.dataset.mgpPrevBgc; delete el.dataset.mgpPrevOpacity; delete el.dataset.mgpPrevFilter; delete el.dataset.mgpPrevPointerEvents; } } } catch (e) {} } function setNoOverlayEnabled(enabled) { if (!ENABLE_NO_OVERLAY_HACK) return; if (!document?.body) return; if (enabled) { ensureNoOverlayStyle(); document.body.classList.add(NO_OVERLAY_CLASS); setDialogOverlayTransparent(true); // Some overlays are created slightly after dialog open. setTimeout(() => setDialogOverlayTransparent(true), 0); setTimeout(() => setDialogOverlayTransparent(true), 50); } else { setDialogOverlayTransparent(false); document.body.classList.remove(NO_OVERLAY_CLASS); } } // ============================================================ // Settings // ============================================================ const Settings = { enabled: false, autoSaveToAnimation: false, edgeFadeEnabled: true, edgeFadeWidthUv: 0.08, speedBlocksPerSec: 2.0, widthBlocks: 256, lengthBlocks: 256, yBlocks: 0, xBlocks: 0, zBlocks: 0, yaw: 0, tilt: 0, opacity: 1.0, gridBlocksPerTile: 16, // 16 blocks per texture tile => 1 block squares textureResolutionPx: 512, gridColor: "#ffffff", backgroundColor: "#2b2b2b", gridMinorOpacity: 1.0, gridMajorOpacity: 1.0, backgroundOpacity: 1.0, lineThicknessMult: 1.0, useCustomTexture: false, customTextureDataUrl: "", // Custom texture transforms customTextureRotation90: 0, // 0..3 customTextureFlipX: false, customTextureFlipY: false, // Saved texture library (data URLs) savedTextures: [], load() { try { const raw = localStorage.getItem(SETTINGS_KEY); if (!raw) return; const obj = JSON.parse(raw); if (!obj || typeof obj !== "object") return; Object.assign(this, obj); // Normalize numeric values this.enabled = !!this.enabled; this.autoSaveToAnimation = !!this.autoSaveToAnimation; this.edgeFadeEnabled = this.edgeFadeEnabled !== false; this.edgeFadeWidthUv = Math.max( 0.001, Math.min(0.5, Number(this.edgeFadeWidthUv ?? 0.08)) ); this.speedBlocksPerSec = Number(this.speedBlocksPerSec ?? 2.0); // Backward compatibility: older versions stored a single sizeBlocks. const legacySize = Number(this.sizeBlocks); const legacy = Number.isFinite(legacySize) ? legacySize : null; this.widthBlocks = Math.max( 3, Number(this.widthBlocks ?? legacy ?? 256) ); this.lengthBlocks = Math.max( 3, Number(this.lengthBlocks ?? legacy ?? 256) ); this.yBlocks = Number(this.yBlocks ?? 0); this.xBlocks = Number(this.xBlocks ?? 0); this.zBlocks = Number(this.zBlocks ?? 0); this.yaw = Number(this.yaw ?? 0); this.tilt = Number(this.tilt ?? 0); this.opacity = Math.max(0, Math.min(1, Number(this.opacity ?? 1.0))); this.gridBlocksPerTile = Math.max( 0.25, Math.min(1024, Number(this.gridBlocksPerTile ?? 16)) ); this.textureResolutionPx = Math.max( 64, Math.min(2048, Math.floor(Number(this.textureResolutionPx ?? 512))) ); this.gridColor = normalizeColorToHex(this.gridColor, "#ffffff"); this.backgroundColor = normalizeColorToHex( this.backgroundColor, "#2b2b2b" ); this.gridMinorOpacity = Math.max( 0, Math.min(1, Number(this.gridMinorOpacity ?? 1.0)) ); this.gridMajorOpacity = Math.max( 0, Math.min(1, Number(this.gridMajorOpacity ?? 1.0)) ); this.backgroundOpacity = Math.max( 0, Math.min(1, Number(this.backgroundOpacity ?? 1.0)) ); this.lineThicknessMult = Math.max( 0.25, Math.min(6, Number(this.lineThicknessMult ?? 1.0)) ); this.useCustomTexture = !!this.useCustomTexture; this.customTextureDataUrl = String(this.customTextureDataUrl || ""); if (!this.customTextureDataUrl) this.useCustomTexture = false; this.customTextureRotation90 = Math.max( 0, Math.min(3, Math.floor(Number(this.customTextureRotation90 ?? 0))) ); this.customTextureFlipX = !!this.customTextureFlipX; this.customTextureFlipY = !!this.customTextureFlipY; if (!Array.isArray(this.savedTextures)) this.savedTextures = []; // Ensure the library only contains valid strings this.savedTextures = this.savedTextures .filter((e) => typeof e === "string" && e.trim()) .slice(0, 64); } catch (e) {} }, _lastSaveError: "", save() { try { this._lastSaveError = ""; localStorage.setItem( SETTINGS_KEY, JSON.stringify({ enabled: !!this.enabled, autoSaveToAnimation: !!this.autoSaveToAnimation, edgeFadeEnabled: this.edgeFadeEnabled !== false, edgeFadeWidthUv: Number(this.edgeFadeWidthUv ?? 0.08), speedBlocksPerSec: Number(this.speedBlocksPerSec ?? 0), widthBlocks: Number(this.widthBlocks ?? 256), lengthBlocks: Number(this.lengthBlocks ?? 256), yBlocks: Number(this.yBlocks ?? 0), xBlocks: Number(this.xBlocks ?? 0), zBlocks: Number(this.zBlocks ?? 0), yaw: Number(this.yaw ?? 0), tilt: Number(this.tilt ?? 0), opacity: Number(this.opacity ?? 1.0), gridBlocksPerTile: Number(this.gridBlocksPerTile ?? 16), textureResolutionPx: Number(this.textureResolutionPx ?? 512), gridColor: normalizeColorToHex(this.gridColor, "#ffffff"), backgroundColor: normalizeColorToHex( this.backgroundColor, "#2b2b2b" ), gridMinorOpacity: Number(this.gridMinorOpacity ?? 1.0), gridMajorOpacity: Number(this.gridMajorOpacity ?? 1.0), backgroundOpacity: Number(this.backgroundOpacity ?? 1.0), lineThicknessMult: Number(this.lineThicknessMult ?? 1.0), useCustomTexture: !!this.useCustomTexture, customTextureDataUrl: String(this.customTextureDataUrl || ""), customTextureRotation90: Number(this.customTextureRotation90 ?? 0), customTextureFlipX: !!this.customTextureFlipX, customTextureFlipY: !!this.customTextureFlipY, savedTextures: Array.isArray(this.savedTextures) ? this.savedTextures.slice(0, 64) : [], }) ); return true; } catch (e) {} try { this._lastSaveError = String(e?.message || e || ""); } catch (_) {} return false; }, }; function normalizeTextureDataUrlForStorage(dataUrl, maxDim = 512) { return new Promise((resolve) => { const url = String(dataUrl || ""); if (!url) return resolve(""); try { const img = new Image(); img.decoding = "async"; img.onload = () => { try { const w = Math.max(1, img.naturalWidth || img.width || 1); const h = Math.max(1, img.naturalHeight || img.height || 1); const max = Math.max(w, h); const md = Math.max(32, Math.min(2048, Math.floor(Number(maxDim) || 512))); const scale = max > md ? md / max : 1; const outW = Math.max(1, Math.floor(w * scale)); const outH = Math.max(1, Math.floor(h * scale)); // If already small enough, keep original if (scale === 1) return resolve(url); const canvas = document.createElement("canvas"); canvas.width = outW; canvas.height = outH; const ctx = canvas.getContext("2d"); if (!ctx) return resolve(url); // Keep pixel-art crisp ctx.imageSmoothingEnabled = false; ctx.clearRect(0, 0, outW, outH); ctx.drawImage(img, 0, 0, outW, outH); try { return resolve(canvas.toDataURL("image/png")); } catch (e) { return resolve(url); } } catch (e) { return resolve(url); } }; img.onerror = () => resolve(url); img.src = url; } catch (e) { return resolve(url); } }); } function hexToRgbaCss(hex, alpha = 1.0) { const a = Math.max(0, Math.min(1, Number(alpha ?? 1))); const rgb = parseHexColorToRgb255(hex) || parseHexColorToRgb255("#000000") || { r: 0, g: 0, b: 0 }; return `rgba(${rgb.r},${rgb.g},${rgb.b},${a})`; } // ============================================================ // Color helpers (Blockbench color fields can return many shapes) // ============================================================ function parseHexColorToRgb255(hex) { const s = String(hex || "").trim(); const m = /^#?([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(s); if (!m) return null; let h = m[1]; if (h.length === 3 || h.length === 4) { h = h .split("") .map((c) => c + c) .join(""); } if (h.length === 8) h = h.slice(0, 6); const n = parseInt(h, 16); return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 }; } function rgb255ToHex(rgb) { const r = Math.max(0, Math.min(255, Math.round(Number(rgb?.r ?? 0)))); const g = Math.max(0, Math.min(255, Math.round(Number(rgb?.g ?? 0)))); const b = Math.max(0, Math.min(255, Math.round(Number(rgb?.b ?? 0)))); const to2 = (n) => n.toString(16).padStart(2, "0"); return `#${to2(r)}${to2(g)}${to2(b)}`; } function parseCssRgbToRgb255(input) { const s = String(input || "").trim(); const m = /^rgba?\(\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)(?:\s*,\s*([0-9.]+%?)\s*)?\)$/i.exec( s ); if (!m) return null; const parseChan = (v) => { const t = String(v || "").trim(); if (t.endsWith("%")) { const p = Number.parseFloat(t.slice(0, -1)); if (!Number.isFinite(p)) return null; return (p / 100) * 255; } const n = Number.parseFloat(t); if (!Number.isFinite(n)) return null; return n; }; const r = parseChan(m[1]); const g = parseChan(m[2]); const b = parseChan(m[3]); if (![r, g, b].every((n) => Number.isFinite(n))) return null; return { r: Math.max(0, Math.min(255, r)), g: Math.max(0, Math.min(255, g)), b: Math.max(0, Math.min(255, b)), }; } function normalizeColorToHex(value, fallbackHex) { const fallback = String(fallbackHex || "#ffffff"); try { if (typeof value === "string") { const s = value.trim(); if (parseHexColorToRgb255(s)) return s.startsWith("#") ? s : `#${s}`; const rgb = parseCssRgbToRgb255(s); if (rgb) return rgb255ToHex(rgb); return fallback; } if (typeof value === "number" && Number.isFinite(value)) { const n = Math.max(0, Math.min(0xffffff, Math.floor(value))); return `#${n.toString(16).padStart(6, "0")}`; } if (value && typeof value === "object") { if (typeof value.hex === "string") return normalizeColorToHex(value.hex, fallback); if (typeof value.value === "string") return normalizeColorToHex(value.value, fallback); if (value.rgb && typeof value.rgb === "object") return normalizeColorToHex(value.rgb, fallback); if ( Number.isFinite(Number(value.red)) && Number.isFinite(Number(value.green)) && Number.isFinite(Number(value.blue)) ) { return normalizeColorToHex( { r: value.red, g: value.green, b: value.blue }, fallback ); } if ( Number.isFinite(Number(value._r)) && Number.isFinite(Number(value._g)) && Number.isFinite(Number(value._b)) ) { return normalizeColorToHex( { r: value._r, g: value._g, b: value._b }, fallback ); } if (typeof value.getHexString === "function") { const h = String(value.getHexString() || "").trim(); if (h) return normalizeColorToHex(`#${h}`, fallback); } if (Array.isArray(value) && value.length >= 3) { const r = Number(value[0]); const g = Number(value[1]); const b = Number(value[2]); if ([r, g, b].every((n) => Number.isFinite(n))) { const is01 = r <= 1 && g <= 1 && b <= 1; return rgb255ToHex({ r: is01 ? r * 255 : r, g: is01 ? g * 255 : g, b: is01 ? b * 255 : b, }); } } if (Array.isArray(value.value) && value.value.length >= 3) { return normalizeColorToHex(value.value, fallback); } if ( Number.isFinite(Number(value.r)) && Number.isFinite(Number(value.g)) && Number.isFinite(Number(value.b)) ) { const r = Number(value.r); const g = Number(value.g); const b = Number(value.b); const is01 = r <= 1 && g <= 1 && b <= 1; return rgb255ToHex({ r: is01 ? r * 255 : r, g: is01 ? g * 255 : g, b: is01 ? b * 255 : b, }); } } } catch (e) {} return fallback; } // ============================================================ // Timeline helpers // ============================================================ function isBlockbenchAnimationPlaying() { try { if (typeof Animator !== "undefined" && Animator) { if (typeof Animator.isPlaying === "function") return !!Animator.isPlaying(); if (typeof Animator.playing !== "undefined") return !!Animator.playing; if (typeof Animator.playback !== "undefined") return !!Animator.playback; } if (typeof Timeline !== "undefined" && Timeline) { if (typeof Timeline.isPlaying === "function") return !!Timeline.isPlaying(); if (typeof Timeline.playing !== "undefined") return !!Timeline.playing; } if (typeof Animation !== "undefined" && Animation?.selected) { const a = Animation.selected; if (typeof a.playing !== "undefined") return !!a.playing; } if (typeof BarItems !== "undefined" && BarItems?.play_animation) { const b = BarItems.play_animation; if (typeof b.active !== "undefined") return !!b.active; if (typeof b.pressed !== "undefined") return !!b.pressed; if (typeof b.value !== "undefined") return !!b.value; } } catch (e) {} return false; } function getBlockbenchTimelineTimeSeconds() { try { const normalize = (v) => { if (!Number.isFinite(v)) return null; const n = Number(v); // Some builds expose ms; most expose seconds. return n > 10000 ? n / 1000 : n; }; if (typeof Timeline !== "undefined" && Timeline) { const t = normalize(Timeline.time) ?? normalize(Timeline.currentTime) ?? normalize(Timeline.cursor_time) ?? normalize(Timeline.playhead) ?? normalize(Timeline.position); if (t !== null) return t; } if (typeof Animator !== "undefined" && Animator) { const t = normalize(Animator.time) ?? normalize(Animator.currentTime) ?? normalize(Animator.playhead); if (t !== null) return t; } if (typeof Animation !== "undefined" && Animation?.selected) { const a = Animation.selected; const t = normalize(a?.time) ?? normalize(a?.currentTime) ?? normalize(a?.playhead); if (t !== null) return t; } } catch (e) {} return null; } function parsePlaybackSpeedMult(v) { try { if (v === null || v === undefined) return null; if (typeof v === "string") { const s0 = v.trim(); if (!s0) return null; const isPct = s0.endsWith("%"); const hasX = /x/i.test(s0); const s = s0.replace(/[%x]/gi, "").trim(); const n = Number.parseFloat(s); if (!Number.isFinite(n)) return null; if (isPct) return n / 100; // Heuristic: Blockbench commonly stores playback speed as percent integers // (e.g. 100 = 100%, 10 = 10%). Only treat as a raw multiplier when explicitly marked with 'x'. if (!hasX) { if (Number.isFinite(n) && Math.abs(n - Math.round(n)) < 1e-6) { if (n > 0 && n <= 1000) return n / 100; } if (n > 10 && n <= 1000) return n / 100; } return n; } if (typeof v === "number" && Number.isFinite(v)) { // Same heuristic as the string path: small integer values usually mean percent. if (Math.abs(v - Math.round(v)) < 1e-6) { if (v > 0 && v <= 1000) return v / 100; } if (v > 10 && v <= 1000) return v / 100; return v; } if (typeof v === "object") { if (Number.isFinite(Number(v.value))) return parsePlaybackSpeedMult(v.value); if (Number.isFinite(Number(v.current))) return parsePlaybackSpeedMult(v.current); } } catch (e) {} return null; } function getBlockbenchPlaybackSpeedMult() { try { const clamp = (mult) => Math.max(0.01, Math.min(10, mult)); const tryParse = (v) => { const mult = parsePlaybackSpeedMult(v); return Number.isFinite(mult) ? clamp(mult) : null; }; if (typeof Timeline !== "undefined" && Timeline) { const v = tryParse(Timeline.playback_speed) ?? tryParse(Timeline.playbackSpeed) ?? tryParse(Timeline.playback_rate) ?? tryParse(Timeline.playbackRate) ?? tryParse(Timeline.speed) ?? tryParse(Timeline.timescale) ?? tryParse(Timeline.time_scale); if (v !== null) return v; } if (typeof Animator !== "undefined" && Animator) { const v = tryParse(Animator.playback_speed) ?? tryParse(Animator.playbackSpeed) ?? tryParse(Animator.playback_rate) ?? tryParse(Animator.playbackRate) ?? tryParse(Animator.speed) ?? tryParse(Animator.timescale) ?? tryParse(Animator.time_scale); if (v !== null) return v; } if (typeof Animation !== "undefined" && Animation?.selected) { const a = Animation.selected; const v = tryParse(a?.playback_speed) ?? tryParse(a?.playbackSpeed) ?? tryParse(a?.speed) ?? tryParse(a?.timescale) ?? tryParse(a?.time_scale); if (v !== null) return v; } if (typeof BarItems !== "undefined" && BarItems) { const v = tryParse(BarItems.playback_speed?.value) ?? tryParse(BarItems.playback_speed) ?? tryParse(BarItems.animation_speed?.value) ?? tryParse(BarItems.animation_speed); if (v !== null) return v; } } catch (e) {} return 1.0; } // ============================================================ // Textures // ============================================================ function createMovingGroundGridTexture( sizePx, minorAlpha = 1.0, majorAlpha = 1.0, backgroundColor = "#2b2b2b", gridColor = "#ffffff", lineThicknessMult = 1.0 ) { const s = Math.max(64, Math.min(2048, Math.floor(sizePx || 512))); const canvas = document.createElement("canvas"); canvas.width = s; canvas.height = s; const ctx = canvas.getContext("2d"); if (!ctx) return null; ctx.fillStyle = String(backgroundColor || "#2b2b2b"); ctx.fillRect(0, 0, s, s); const rgb = parseHexColorToRgb255(gridColor) || parseHexColorToRgb255("#ffffff") || { r: 255, g: 255, b: 255 }; const minor = Math.max(8, Math.floor(s / 16)); const major = minor * 4; const mult = Math.max(0.25, Math.min(6, Number(lineThicknessMult) || 1)); const baseLineW = Math.max(0.25, Math.min(10, (s / 512) * mult)); const majorLineW = Math.max(baseLineW, Math.min(14, baseLineW * 1.75)); // Minor grid ctx.strokeStyle = `rgba(${rgb.r},${rgb.g},${rgb.b},${Math.max( 0, Math.min(1, minorAlpha) )})`; ctx.lineWidth = baseLineW; for (let i = 0; i <= s; i += minor) { ctx.beginPath(); ctx.moveTo(i + 0.5, 0); ctx.lineTo(i + 0.5, s); ctx.stroke(); ctx.beginPath(); ctx.moveTo(0, i + 0.5); ctx.lineTo(s, i + 0.5); ctx.stroke(); } // Major grid ctx.strokeStyle = `rgba(${rgb.r},${rgb.g},${rgb.b},${Math.max( 0, Math.min(1, majorAlpha) )})`; ctx.lineWidth = majorLineW; for (let i = 0; i <= s; i += major) { ctx.beginPath(); ctx.moveTo(i + 0.5, 0); ctx.lineTo(i + 0.5, s); ctx.stroke(); ctx.beginPath(); ctx.moveTo(0, i + 0.5); ctx.lineTo(s, i + 0.5); ctx.stroke(); } const tex = new THREE.CanvasTexture(canvas); tex.wrapS = THREE.RepeatWrapping; tex.wrapT = THREE.RepeatWrapping; try { tex.magFilter = THREE.NearestFilter; tex.minFilter = THREE.NearestMipmapNearestFilter; tex.generateMipmaps = true; tex.anisotropy = 1; tex.matrixAutoUpdate = true; } catch (e) {} tex.needsUpdate = true; return tex; } function createMovingGroundCustomTextureFromDataUrl(dataUrl) { const url = String(dataUrl || ""); if (!url) return null; try { const img = new Image(); img.src = url; const tex = new THREE.Texture(img); img.onload = () => { try { tex.magFilter = THREE.NearestFilter; tex.minFilter = THREE.NearestFilter; tex.generateMipmaps = false; tex.anisotropy = 1; tex.needsUpdate = true; } catch (e) {} }; tex.wrapS = THREE.RepeatWrapping; tex.wrapT = THREE.RepeatWrapping; try { tex.magFilter = THREE.NearestFilter; tex.minFilter = THREE.NearestFilter; tex.generateMipmaps = false; tex.anisotropy = 1; tex.matrixAutoUpdate = true; } catch (e) {} tex.needsUpdate = true; return tex; } catch (e) {} return null; } // ============================================================ // Material helpers // ============================================================ function isGifRecordingActive() { try { const el = document.getElementById("gif_recording_frame"); return !!el && el.classList?.contains?.("recording"); } catch (e) {} return false; } // Shader patch: edge fade (plane borders) // - UV-space alpha fade so edges softly disappear (no texture regeneration) // - Chains other onBeforeCompile hooks and self-heals if the material is recompiled function enableEdgeFadeOnMaterial(material, fadeWidthUv = 0.08, ditherForGif = false) { try { if (!material) return; const w = Math.max(0.001, Math.min(0.5, Number(fadeWidthUv) || 0.08)); const d = ditherForGif ? 1 : 0; material.userData = material.userData || {}; // If already enabled, just update width (no shader recompile) if (material.userData.__mgpEdgeFadeEnabled) { const prevW = Number(material.userData.__mgpEdgeFadeWidthUv ?? 0); const prevD = Number(material.userData.__mgpEdgeFadeDither ?? 0); material.userData.__mgpEdgeFadeWidthUv = w; material.userData.__mgpEdgeFadeDither = d; try { if (material.userData.__mgpEdgeFadeUniform?.value !== undefined) { material.userData.__mgpEdgeFadeUniform.value = w; } } catch (e) {} try { if (material.userData.__mgpEdgeFadeDitherUniform?.value !== undefined) { material.userData.__mgpEdgeFadeDitherUniform.value = d; } } catch (e) {} // If the uniform handles are missing (e.g. a different renderer compiled the material), // request a recompile so onBeforeCompile can re-bind uniforms. try { if (!material.userData.__mgpEdgeFadeUniform || !material.userData.__mgpEdgeFadeDitherUniform) { material.needsUpdate = true; } } catch (e) {} // If another system replaced onBeforeCompile, recompile so our hook runs again. try { if ( material.userData.__mgpEdgeFadeOnBeforeCompileRef && material.onBeforeCompile !== material.userData.__mgpEdgeFadeOnBeforeCompileRef ) { material.needsUpdate = true; } } catch (e) {} // Safety: occasionally Blockbench/Three can end up with stale shader state. // Debounce a recompile after the user stops scrubbing to guarantee the new value sticks. try { const changed = Math.abs(prevW - w) > 1e-6 || prevD !== d; if (changed) { if (material.userData.__mgpEdgeFadeRecompileTimer) { clearTimeout(material.userData.__mgpEdgeFadeRecompileTimer); } material.userData.__mgpEdgeFadeRecompileTimer = setTimeout(() => { try { material.needsUpdate = true; } catch (e) {} }, 120); } } catch (e) {} return; } material.userData.__mgpEdgeFadeEnabled = true; material.userData.__mgpEdgeFadeWidthUv = w; material.userData.__mgpEdgeFadeDither = d; if (material.userData.__mgpPrevOnBeforeCompile === undefined) { material.userData.__mgpPrevOnBeforeCompile = material.onBeforeCompile || null; } // Needs blending for fade. material.transparent = true; material.depthWrite = false; material.onBeforeCompile = (shader) => { try { // Preserve any previous shader modifications from Blockbench/other plugins try { const prev = material?.userData?.__mgpPrevOnBeforeCompile; if (typeof prev === "function") prev(shader); } catch (e) {} const curW = Math.max( 0.001, Math.min(0.5, Number(material?.userData?.__mgpEdgeFadeWidthUv ?? 0.08) || 0.08) ); const curD = Number(material?.userData?.__mgpEdgeFadeDither) ? 1 : 0; shader.uniforms.mgpEdgeFadeWidthUv = { value: curW }; shader.uniforms.mgpEdgeFadeDither = { value: curD }; try { material.userData.__mgpEdgeFadeUniform = shader.uniforms.mgpEdgeFadeWidthUv; material.userData.__mgpEdgeFadeDitherUniform = shader.uniforms.mgpEdgeFadeDither; } catch (e) {} // IMPORTANT: vUv in MeshBasicMaterial is usually the *transformed* UV (repeat/offset/matrix). // We want the plane-edge fade to stay glued to the geometry, not scroll with the texture. // So we pass through the raw geometry UV as mgpUv0. shader.vertexShader = `varying vec2 mgpUv0;\n` + shader.vertexShader; shader.fragmentShader = `uniform float mgpEdgeFadeWidthUv;\n` + `uniform float mgpEdgeFadeDither;\n` + `varying vec2 mgpUv0;\n` + `float mgpBayer4(vec2 p) {\n` + ` vec2 fp = floor(mod(p, 4.0));\n` + ` int x = int(fp.x);\n` + ` int y = int(fp.y);\n` + ` int i = x + y * 4;\n` + ` float b = 0.0;\n` + ` if (i == 0) b = 0.0; else if (i == 1) b = 8.0; else if (i == 2) b = 2.0; else if (i == 3) b = 10.0;\n` + ` else if (i == 4) b = 12.0; else if (i == 5) b = 4.0; else if (i == 6) b = 14.0; else if (i == 7) b = 6.0;\n` + ` else if (i == 8) b = 3.0; else if (i == 9) b = 11.0; else if (i == 10) b = 1.0; else if (i == 11) b = 9.0;\n` + ` else if (i == 12) b = 15.0; else if (i == 13) b = 7.0; else if (i == 14) b = 13.0; else if (i == 15) b = 5.0;\n` + ` return (b + 0.5) / 16.0;\n` + `}\n` + shader.fragmentShader; const uvInject = `mgpUv0 = uv;\n#include `; const vsBefore = shader.vertexShader; let vsAfter = shader.vertexShader.replace(/#include /g, uvInject); if (vsAfter === vsBefore) { // Fallback: insert right after main() starts. vsAfter = shader.vertexShader.replace( /void\s+main\s*\(\s*\)\s*\{/, (m) => `${m}\n mgpUv0 = uv;` ); } shader.vertexShader = vsAfter; const inject = ` vec2 mgpEdgeUv = clamp(mgpUv0, 0.0, 1.0); float mgpEdgeDist = min(min(mgpEdgeUv.x, 1.0 - mgpEdgeUv.x), min(mgpEdgeUv.y, 1.0 - mgpEdgeUv.y)); float mgpEdgeFade = smoothstep(0.0, mgpEdgeFadeWidthUv, mgpEdgeDist); float mgpB = mgpBayer4(gl_FragCoord.xy); float mgpEdgeFadeMask = mix(mgpEdgeFade, step(mgpB, mgpEdgeFade), clamp(mgpEdgeFadeDither, 0.0, 1.0)); diffuseColor.a *= mgpEdgeFadeMask; `; // Preferred path: modify alpha then run normal output chunk. const before = shader.fragmentShader; let after = shader.fragmentShader.replace( /#include /g, `${inject}\n#include ` ); // Fallback: if output chunk is inlined, patch common assignments. if (after === before) { after = after.replace( /gl_FragColor\s*=\s*vec4\s*\(\s*outgoingLight\s*,\s*diffuseColor\.a\s*\)\s*;/g, `${inject}\n gl_FragColor = vec4(outgoingLight, diffuseColor.a);` ); } shader.fragmentShader = after; } catch (e) {} }; try { material.userData.__mgpEdgeFadeOnBeforeCompileRef = material.onBeforeCompile; } catch (e) {} material.needsUpdate = true; } catch (e) {} } function disableEdgeFadeOnMaterial(material) { try { if (!material?.userData?.__mgpEdgeFadeEnabled) return; material.userData.__mgpEdgeFadeEnabled = false; try { delete material.userData.__mgpEdgeFadeUniform; delete material.userData.__mgpEdgeFadeDitherUniform; delete material.userData.__mgpEdgeFadeOnBeforeCompileRef; if (material.userData.__mgpEdgeFadeRecompileTimer) { clearTimeout(material.userData.__mgpEdgeFadeRecompileTimer); } delete material.userData.__mgpEdgeFadeRecompileTimer; } catch (e) {} const prev = material.userData.__mgpPrevOnBeforeCompile; material.onBeforeCompile = typeof prev === "function" ? prev : null; material.needsUpdate = true; } catch (e) {} } // ============================================================ // Moving Ground Rig // ============================================================ class MovingGroundRig { constructor() { this.group = null; this.plane = null; this.depth_plane = null; this.side_helper = null; this.texture = null; this._raf = null; this._lastMs = 0; this._gridBlocksPerTile = null; this._texResPx = null; this._gridColor = null; this._bgColor = null; this._gridMinorOpacity = null; this._gridMajorOpacity = null; this._bgOpacity = null; this._lineThicknessMult = null; this._useCustomTexture = null; this._customTextureDataUrl = null; this._customRot90 = null; this._customFlipX = null; this._customFlipY = null; // Effective rotation applied to the texture (0..3). Used to keep scroll direction stable. this._effectiveScrollRot90 = 0; // Timeline-anchored scrolling this._timelineAnchorTime = null; this._timelineAnchorOffsetX = 0; this._timelineAnchorOffsetY = 0; this._timelineAnchorSpeed = null; this._timelineAnchorTileBlocks = null; // Cached timeline/playback values to avoid heavy polling each frame this._cachePlaying = false; this._cachePlayingMs = 0; this._cacheTimelineSec = null; this._cacheTimelineMs = 0; this._cachePlaybackMult = 1.0; this._cachePlaybackMs = 0; } ensure() { if (this.group) return; if (!Canvas?.scene) return; const g = new THREE.Group(); g.name = "cazfps_animated_platforms"; const geom = new THREE.PlaneGeometry(1, 1, 1, 1); const tex = createMovingGroundGridTexture(512); // Depth-only prepass mesh: makes the plane behave as a solid occluder. // It writes to the depth buffer but does not draw color. const depthMat = new THREE.MeshBasicMaterial({ color: 0x000000, transparent: false, opacity: 1, side: THREE.DoubleSide, depthTest: true, depthWrite: true, colorWrite: false, }); const mat = new THREE.MeshBasicMaterial({ map: tex, transparent: true, opacity: 1, side: THREE.DoubleSide, depthTest: true, depthWrite: false, }); if (Settings.edgeFadeEnabled !== false) { enableEdgeFadeOnMaterial( mat, Math.max(0.001, Math.min(0.5, Number(Settings.edgeFadeWidthUv ?? 0.08))), false ); } const depthPlane = new THREE.Mesh(geom, depthMat); depthPlane.name = "cazfps_animated_platforms_depth"; depthPlane.rotation.x = -Math.PI / 2; depthPlane.renderOrder = -60; depthPlane.frustumCulled = false; const plane = new THREE.Mesh(geom, mat); plane.name = "cazfps_animated_platforms_mesh"; plane.rotation.x = -Math.PI / 2; plane.renderOrder = -50; plane.frustumCulled = false; // Side-view helper: a thin line that stays visible in *exact* orthographic side views // so the user can still reference the ground height when the plane is edge-on. const helperGeom = new THREE.BufferGeometry(); helperGeom.setAttribute( "position", new THREE.BufferAttribute(new Float32Array(6), 3) ); const helperMat = new THREE.LineBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.9, depthTest: false, }); const sideHelper = new THREE.Line(helperGeom, helperMat); sideHelper.name = "cazfps_animated_platforms_side_helper"; sideHelper.renderOrder = 10_000; sideHelper.frustumCulled = false; sideHelper.visible = false; g.add(depthPlane); g.add(plane); g.add(sideHelper); Canvas.scene.add(g); this.group = g; this.plane = plane; this.depth_plane = depthPlane; this.side_helper = sideHelper; this.texture = tex; } start() { if (this._raf) return; this._lastMs = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now(); const loop = () => { // If we were stopped/disposed while a frame was queued. if (!this._raf) return; try { this.tick(); } catch (e) {} // Only keep the loop alive while enabled + visible. if (Settings?.enabled && this.group?.visible) { this._raf = requestAnimationFrame(loop); } else { this._raf = null; } }; this._raf = requestAnimationFrame(loop); } stop() { if (!this._raf) return; try { cancelAnimationFrame(this._raf); } catch (e) {} this._raf = null; } dispose() { this.stop(); try { if (this.plane) { this.plane.geometry?.dispose?.(); this.plane.material?.dispose?.(); } if (this.depth_plane) { this.depth_plane.material?.dispose?.(); } if (this.side_helper) { this.side_helper.geometry?.dispose?.(); this.side_helper.material?.dispose?.(); } } catch (e) {} try { this.texture?.dispose?.(); } catch (e) {} try { Canvas?.scene?.remove(this.group); } catch (e) {} this.group = null; this.plane = null; this.depth_plane = null; this.side_helper = null; this.texture = null; } _updateOrthoSideHelper() { const helper = this.side_helper; if (!helper?.geometry) return; try { helper.visible = false; const cam = Canvas?.camera; if (!cam) return; if (!cam.isOrthographicCamera) return; if (!this.group) return; // Camera direction in world space const dir = new THREE.Vector3(); cam.getWorldDirection(dir); // Convert camera direction into the platform's local space (respect yaw/tilt) const invQ = this.group.getWorldQuaternion(new THREE.Quaternion()).invert(); dir.applyQuaternion(invQ).normalize(); // Only show when it's truly side-on: almost perfectly horizontal, and nearly aligned to ±X or ±Z. const epsY = 0.01; // ~0.57° const epsAxis = 0.001; // extremely strict axis alignment if (Math.abs(dir.y) > epsY) return; const ax = Math.abs(dir.x); const az = Math.abs(dir.z); const alignedX = ax > 1 - epsAxis; const alignedZ = az > 1 - epsAxis; if (!alignedX && !alignedZ) return; const blockSize = 16; const widthBlocks = Math.max(3, Number(Settings.widthBlocks || 256)); const lengthBlocks = Math.max(3, Number(Settings.lengthBlocks || 256)); const halfW = (widthBlocks * blockSize) / 2; const halfL = (lengthBlocks * blockSize) / 2; const pos = helper.geometry.attributes.position; if (!pos || pos.count < 2) return; if (alignedX) { // Looking along local ±X: show a line across local Z at y=0. pos.setXYZ(0, 0, 0, -halfL); pos.setXYZ(1, 0, 0, halfL); } else { // Looking along local ±Z: show a line across local X at y=0. pos.setXYZ(0, -halfW, 0, 0); pos.setXYZ(1, halfW, 0, 0); } pos.needsUpdate = true; try { // Tint like the grid color, and use the major opacity as intensity. helper.material.color = new THREE.Color( normalizeColorToHex(Settings.gridColor, "#ffffff") ); helper.material.opacity = Math.max( 0.15, Math.min(1, Number(Settings.gridMajorOpacity ?? 1.0)) ); helper.material.needsUpdate = false; } catch (e) {} helper.visible = true; } catch (e) {} } setEnabled(enabled) { this.ensure(); if (!this.group || !this.plane) return; const on = !!enabled; this.group.visible = on; if (on) this.start(); else this.stop(); } rebuildTexture( blocksPerTile, resPx, backgroundColor, backgroundOpacity, gridColor, minorAlpha, majorAlpha, lineThicknessMult, useCustomTexture, customTextureDataUrl ) { if (!this.plane) return; const bpt = Math.max(0.25, Math.min(1024, Number(blocksPerTile) || 16)); const res = Math.max(64, Math.min(2048, Math.floor(resPx || 512))); const bg = normalizeColorToHex(backgroundColor, "#2b2b2b"); const bgA = Math.max(0, Math.min(1, Number(backgroundOpacity ?? 1.0))); const gc = normalizeColorToHex(gridColor, "#ffffff"); const minorA = Math.max(0, Math.min(1, Number(minorAlpha ?? 1.0))); const majorA = Math.max(0, Math.min(1, Number(majorAlpha ?? 1.0))); const thickness = Math.max( 0.25, Math.min(6, Number(lineThicknessMult) || 1) ); const dataUrl = String(customTextureDataUrl || ""); const useCustom = !!useCustomTexture && !!dataUrl; const oldTex = this.texture; const prevOffsetX = oldTex?.offset?.x || 0; const prevOffsetY = oldTex?.offset?.y || 0; const newTex = useCustom ? createMovingGroundCustomTextureFromDataUrl(dataUrl) : createMovingGroundGridTexture( res, minorA, majorA, hexToRgbaCss(bg, bgA), gc, thickness ); if (!newTex) return; try { newTex.offset.set(prevOffsetX, prevOffsetY); } catch (e) {} this.texture = newTex; const mat = this.plane.material; if (mat && mat.map !== newTex) { mat.map = newTex; mat.needsUpdate = true; } try { oldTex?.dispose?.(); } catch (e) {} this._gridBlocksPerTile = bpt; this._texResPx = res; this._bgColor = bg; this._bgOpacity = bgA; this._gridColor = gc; this._gridMinorOpacity = minorA; this._gridMajorOpacity = majorA; this._lineThicknessMult = thickness; this._useCustomTexture = useCustom; this._customTextureDataUrl = dataUrl; } refresh() { this.ensure(); if (!this.group || !this.plane) return; const blockSize = 16; const widthBlocks = Math.max(3, Number(Settings.widthBlocks || 256)); const lengthBlocks = Math.max(3, Number(Settings.lengthBlocks || 256)); const width = widthBlocks * blockSize; const length = lengthBlocks * blockSize; const opacity = Math.max(0, Math.min(1, Number(Settings.opacity ?? 1))); const yBlocks = Number(Settings.yBlocks || 0); const xBlocks = Number(Settings.xBlocks || 0); const zBlocks = Number(Settings.zBlocks || 0); const yaw = Number(Settings.yaw || 0); const tilt = Number(Settings.tilt || 0); const gridBlocksPerTile = Math.max( 0.25, Math.min(1024, Number(Settings.gridBlocksPerTile || 16)) ); const texResPx = Math.max( 64, Math.min(2048, Math.floor(Number(Settings.textureResolutionPx || 512))) ); const bgColor = normalizeColorToHex(Settings.backgroundColor, "#2b2b2b"); const bgOpacity = Math.max(0, Math.min(1, Number(Settings.backgroundOpacity ?? 1.0))); const gridColor = normalizeColorToHex(Settings.gridColor, "#ffffff"); const minorAlpha = Math.max(0, Math.min(1, Number(Settings.gridMinorOpacity ?? 1.0))); const majorAlpha = Math.max(0, Math.min(1, Number(Settings.gridMajorOpacity ?? 1.0))); const lineThicknessMult = Math.max( 0.25, Math.min(6, Number(Settings.lineThicknessMult || 1)) ); const useCustomTexture = !!Settings.useCustomTexture; const customTextureDataUrl = String(Settings.customTextureDataUrl || ""); const effectiveUseCustomTexture = useCustomTexture && !!customTextureDataUrl; const rot90 = Math.max( 0, Math.min(3, Math.floor(Number(Settings.customTextureRotation90 ?? 0))) ); const flipX = !!Settings.customTextureFlipX; const flipY = !!Settings.customTextureFlipY; this.plane.scale.set(width, length, 1); if (this.depth_plane) this.depth_plane.scale.set(width, length, 1); this.group.position.set( xBlocks * blockSize, yBlocks * blockSize, zBlocks * blockSize ); this.group.rotation.set( THREE.MathUtils.degToRad(tilt), THREE.MathUtils.degToRad(yaw), 0 ); if ( this._gridBlocksPerTile !== gridBlocksPerTile || this._texResPx !== texResPx || this._bgColor !== bgColor || this._bgOpacity !== bgOpacity || this._gridColor !== gridColor || this._gridMinorOpacity !== minorAlpha || this._gridMajorOpacity !== majorAlpha || this._lineThicknessMult !== lineThicknessMult || this._useCustomTexture !== effectiveUseCustomTexture || this._customTextureDataUrl !== customTextureDataUrl ) { this.rebuildTexture( gridBlocksPerTile, texResPx, bgColor, bgOpacity, gridColor, minorAlpha, majorAlpha, lineThicknessMult, effectiveUseCustomTexture, customTextureDataUrl ); } if (this.texture) { const denom = Math.max(0.25, gridBlocksPerTile); const repX = widthBlocks / denom; const repY = lengthBlocks / denom; // Apply custom texture transforms without regenerating textures. // These controls only apply to custom textures. const tRot = effectiveUseCustomTexture ? rot90 : 0; const tFlipX = effectiveUseCustomTexture ? flipX : false; const tFlipY = effectiveUseCustomTexture ? flipY : false; // Cache the effective rotation so the tick() can compensate scrolling. this._effectiveScrollRot90 = tRot; // Note: rotation swaps repeat axes. const oddRot = tRot % 2 === 1; const baseRepU = oddRot ? repY : repX; const baseRepV = oddRot ? repX : repY; const repU = baseRepU * (tFlipX ? -1 : 1); const repV = baseRepV * (tFlipY ? -1 : 1); this.texture.repeat.set(repU, repV); try { this.texture.center.set(0.5, 0.5); // Keep U anchored; compensate for negative repeat so tiling stays aligned. this.texture.offset.x = repU < 0 ? 1 : 0; } catch (e) {} try { this.texture.rotation = (Math.PI / 2) * tRot; } catch (e) {} this.texture.matrixAutoUpdate = true; try { this.texture.updateMatrix?.(); } catch (e) {} // Changing offset/repeat/transform matrix does not require a texture re-upload. } // Track whether the visible plane is treated as transparent in Three's renderer. // If it is, we must not keep the depth-only occluder enabled; otherwise it blocks // objects behind the plane (e.g. the model above when viewing from below). let nextTransparent = opacity < 0.999; try { const mat = this.plane.material; if (mat) { // Edge fade toggle try { if (Settings.edgeFadeEnabled !== false) { const w = Math.max( 0.001, Math.min(0.5, Number(Settings.edgeFadeWidthUv ?? 0.08)) ); enableEdgeFadeOnMaterial(mat, w, isGifRecordingActive()); } else { disableEdgeFadeOnMaterial(mat); } } catch (e) {} const edgeFadeActive = !!mat.userData?.__mgpEdgeFadeEnabled; nextTransparent = edgeFadeActive || opacity < 0.999; const nextDepthWrite = !nextTransparent; const prevTransparent = !!mat.transparent; const prevDepthWrite = !!mat.depthWrite; // Transparency blending needs the plane to render after opaque meshes. // The mesh is created with a negative renderOrder (so it sits "under" the scene), // but that makes semi-transparent opacity ineffective when viewing from below. try { const desiredOrder = nextTransparent ? 50 : -50; if (this.plane && this.plane.renderOrder !== desiredOrder) { this.plane.renderOrder = desiredOrder; } } catch (e) {} mat.opacity = opacity; mat.transparent = nextTransparent; mat.depthWrite = nextDepthWrite; if (prevTransparent !== nextTransparent || prevDepthWrite !== nextDepthWrite) { mat.needsUpdate = true; } } } catch (e) {} // Control whether the occluder is active. // The occluder exists to make the platform behave like a solid ground plane. // Only enable it when the user actually wants an opaque plane (opacity ~ 1). // If opacity is lowered, the occluder would block models behind the plane. try { if (this.depth_plane) { const maxTexAlpha = effectiveUseCustomTexture ? 1 : Math.max(bgOpacity, minorAlpha, majorAlpha); const effectiveAlpha = opacity * maxTexAlpha; const wantsOpaqueOccluder = opacity >= 0.999; this.depth_plane.visible = wantsOpaqueOccluder && effectiveAlpha > 1e-4; } } catch (e) {} // Cache custom texture transform settings this._customRot90 = rot90; this._customFlipX = flipX; this._customFlipY = flipY; this.setEnabled(!!Settings.enabled); } tick() { // Safety: if the user disabled the plane but something left the timer running, // stop it immediately to avoid persistent lag. if (!Settings?.enabled) { try { if (this.group) this.group.visible = false; } catch (e) {} this.stop(); return; } if (!this.group?.visible) return; // Keep the orthographic side helper reactive to camera changes. // This is very cheap (a few vector ops) and makes side views usable. this._updateOrthoSideHelper(); if (!this.texture) return; const wrap01 = (v) => { let x = Number(v || 0); x = x % 1; if (x < 0) x += 1; return x; }; // Rotating the texture should not rotate the *movement direction*. // Compensate by scrolling along a different UV axis depending on rotation. const rot90 = Number(this._effectiveScrollRot90 || 0) & 3; const scrollDeltaToUv = (deltaUv) => { switch (rot90) { case 1: return { du: deltaUv, dv: 0 }; case 2: return { du: 0, dv: -deltaUv }; case 3: return { du: -deltaUv, dv: 0 }; default: return { du: 0, dv: deltaUv }; } }; const now = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now(); const speed = Number(Settings.speedBlocksPerSec || 0); const gridBlocksPerTile = Math.max( 0.25, Math.min(1024, Number(Settings.gridBlocksPerTile || 16)) ); const effectiveTileBlocks = Math.max(0.25, gridBlocksPerTile); // Fast-path: nothing to animate. if (!speed) { this._lastMs = now; return; } // Cache play state (and playback speed) to reduce per-tick overhead. let playing = this._cachePlaying; // Keep this responsive: when the user hits pause/stop, the ground should stop immediately. // We still keep a tiny cache window to avoid redundant checks multiple times within the same ms. if (!this._cachePlayingMs || now - this._cachePlayingMs > 16) { const prevPlaying = this._cachePlaying; playing = isBlockbenchAnimationPlaying(); this._cachePlaying = playing; this._cachePlayingMs = now; // If we just transitioned from playing -> paused, avoid any extra "drift". if (prevPlaying && !playing) { this._lastMs = now; this._timelineAnchorTime = null; this._timelineAnchorSpeed = null; this._timelineAnchorTileBlocks = null; } } if (!playing) { let timelineSec = this._cacheTimelineSec; if (!this._cacheTimelineMs || now - this._cacheTimelineMs > 60) { timelineSec = getBlockbenchTimelineTimeSeconds(); this._cacheTimelineSec = timelineSec; this._cacheTimelineMs = now; } if (Number.isFinite(timelineSec)) { const t = Number(timelineSec); if ( this._timelineAnchorTime === null || this._timelineAnchorSpeed !== speed || this._timelineAnchorTileBlocks !== effectiveTileBlocks ) { this._timelineAnchorTime = t; this._timelineAnchorOffsetX = this.texture.offset?.x || 0; this._timelineAnchorOffsetY = this.texture.offset?.y || 0; this._timelineAnchorSpeed = speed; this._timelineAnchorTileBlocks = effectiveTileBlocks; } const deltaUv = ((t - this._timelineAnchorTime) * speed) / effectiveTileBlocks; const { du, dv } = scrollDeltaToUv(deltaUv); const nextX = wrap01(this._timelineAnchorOffsetX + du); const nextY = wrap01(this._timelineAnchorOffsetY + dv); const curX = Number(this.texture.offset?.x || 0); const curY = Number(this.texture.offset?.y || 0); if (Math.abs(nextX - curX) > 1e-6) this.texture.offset.x = nextX; if (Math.abs(nextY - curY) > 1e-6) this.texture.offset.y = nextY; this._lastMs = now; return; } this._lastMs = now; return; } this._timelineAnchorTime = null; this._timelineAnchorSpeed = null; this._timelineAnchorTileBlocks = null; const dt = Math.max(0, Math.min(0.2, (now - this._lastMs) / 1000)); this._lastMs = now; let playbackMult = this._cachePlaybackMult; if (!this._cachePlaybackMs || now - this._cachePlaybackMs > 250) { playbackMult = getBlockbenchPlaybackSpeedMult(); this._cachePlaybackMult = playbackMult; this._cachePlaybackMs = now; } const effectiveSpeed = speed * playbackMult; const deltaUv = (effectiveSpeed * dt) / effectiveTileBlocks; const { du, dv } = scrollDeltaToUv(deltaUv); const nextX = wrap01((this.texture.offset?.x || 0) + du); const nextY = wrap01((this.texture.offset?.y || 0) + dv); const curX = Number(this.texture.offset?.x || 0); const curY = Number(this.texture.offset?.y || 0); if (Math.abs(nextX - curX) > 1e-6) this.texture.offset.x = nextX; if (Math.abs(nextY - curY) > 1e-6) this.texture.offset.y = nextY; } } const rig = new MovingGroundRig(); // ============================================================ // Animation presets (per-project + per-animation) // ============================================================ function getSelectedAnimationSafe() { try { if (typeof Animation !== "undefined" && Animation?.selected) return Animation.selected; if (typeof Animator !== "undefined" && Animator?.animation) return Animator.animation; } catch (e) {} return null; } function getSelectedAnimationKey() { const a = getSelectedAnimationSafe(); if (!a) return null; // Prefer stable UUID when available. const uuid = String(a?.uuid || a?._uuid || "").trim(); if (uuid) return `uuid:${uuid}`; const name = String(a?.name || "").trim(); if (name) return `name:${name}`; const id = String(a?.id || "").trim(); if (id) return `id:${id}`; return null; } function getSelectedAnimationName() { const a = getSelectedAnimationSafe(); const name = String(a?.name || "").trim(); return name || "(Unnamed Animation)"; } function sanitizeStorageKeyPart(value) { return String(value || "global") .trim() .replace(/[^a-z0-9._-]+/gi, "_") .slice(0, 200); } function hashStringFNV1a(str) { // Small, fast, stable hash for namespacing keys. // Returns 8-hex chars (32-bit). let h = 0x811c9dc5; const s = String(str || ""); for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); // h *= 16777619 (but keep 32-bit) h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0; } return ("00000000" + h.toString(16)).slice(-8); } function getProjectSafe() { try { // Accessing an undeclared global (Project) can throw a ReferenceError. if (typeof Project !== "undefined") return Project; } catch (e) {} return null; } function getProjectFilePathLike(p) { // Blockbench has used different field names across builds. // Prefer the real on-disk identity when available. try { const candidates = [ p?.save_path, p?.savePath, p?.path, p?.file_path, p?.filePath, p?.model_path, p?.modelPath, p?.export_path, p?.exportPath, ] .map((v) => String(v || "").trim()) .filter(Boolean); if (candidates.length) return candidates[0]; } catch (e) {} return ""; } function getAnimPresetPrimaryStorageKey() { try { const p = getProjectSafe(); const filePath = getProjectFilePathLike(p); const uuid = String(p?.uuid || p?._uuid || p?.id || "").trim(); const name = String(p?.name || "").trim(); const ident = filePath ? `file:${filePath}` : uuid ? `uuid:${uuid}` : name ? `name:${name}` : "global"; const hash = hashStringFNV1a(ident); const hint = sanitizeStorageKeyPart(ident).slice(0, 32); return `${PRESET_PREFIX}${hash}_${hint}`; } catch (e) {} return `${PRESET_PREFIX}global`; } const _mgpProjectInstanceIds = new WeakMap(); function getOrCreateProjectInstanceId(p) { try { if (!p || typeof p !== "object") return "no_project"; const existing = _mgpProjectInstanceIds.get(p); if (existing) return existing; const id = "inst_" + Date.now().toString(36) + "_" + Math.random().toString(36).slice(2, 10); _mgpProjectInstanceIds.set(p, id); return id; } catch (e) {} return "no_project"; } function getProjectIdentityKey() { // Each save must be unique to the bbmodel. // Prefer a stable on-disk identity (path). If unsaved, prefer a session-unique // Project uuid/id over Project name (names collide a lot across models). try { const p = getProjectSafe(); const filePath = getProjectFilePathLike(p); if (filePath) return `file:${filePath}`; const candidates = [ p?.uuid, p?._uuid, p?.id, // Some builds attach a per-project UUID under different names p?.project_uuid, p?.projectUUID, ] .map((v) => String(v || "").trim()) .filter(Boolean); if (candidates.length) return `uuid:${candidates[0]}`; const name = String(p?.name || "").trim(); if (name) return `name:${name}`; // Absolute last resort: per-project-instance identity. // Ensures different open models don't collide even if Blockbench doesn't expose // a path/uuid for them. return `inst:${getOrCreateProjectInstanceId(p)}`; } catch (e) {} return "global"; } function getProjectNamespace() { // Use a hash to avoid collisions from sanitization/truncation. const ident = getProjectIdentityKey(); const hash = hashStringFNV1a(ident); // Keep a short readable hint for debugging, but don't rely on it. const hint = sanitizeStorageKeyPart(ident).slice(0, 32); return `p_${hash}_${hint}`; } function getAnimPresetStorageKeys() { return [getAnimPresetPrimaryStorageKey()]; } function getGlobalAnimPresetStorageKey() { return `${PRESET_PREFIX}global`; } function loadAnimPresetMap() { try { const keys = getAnimPresetStorageKeys(); const merged = {}; for (const key of keys) { const raw = localStorage.getItem(key); if (!raw) continue; const obj = JSON.parse(raw); if (obj && typeof obj === "object") Object.assign(merged, obj); } return merged; } catch (e) {} return {}; } // Cache presets in-memory to avoid JSON parse churn while animating. let _presetCacheKeySig = null; let _presetCacheMap = null; function getPresetCacheKeySig() { try { const keys = [...getAnimPresetStorageKeys()]; return keys.join("|"); } catch (e) {} return "__preset_cache_sig__"; } function loadAnimPresetMapCached() { const sig = getPresetCacheKeySig(); if (_presetCacheMap && _presetCacheKeySig === sig) return _presetCacheMap; _presetCacheKeySig = sig; _presetCacheMap = loadAnimPresetMap(); return _presetCacheMap; } function saveAnimPresetMap(map) { try { const keys = getAnimPresetStorageKeys(); const primary = keys[0] || getGlobalAnimPresetStorageKey(); localStorage.setItem(primary, JSON.stringify(map || {})); // Refresh cache immediately after saving. _presetCacheKeySig = null; _presetCacheMap = null; } catch (e) {} } function capturePreset() { return { enabled: !!Settings.enabled, edgeFadeEnabled: Settings.edgeFadeEnabled !== false, speedBlocksPerSec: Number(Settings.speedBlocksPerSec || 0), widthBlocks: Number(Settings.widthBlocks || 256), lengthBlocks: Number(Settings.lengthBlocks || 256), yBlocks: Number(Settings.yBlocks || 0), yaw: Number(Settings.yaw || 0), tilt: Number(Settings.tilt || 0), opacity: Number(Settings.opacity ?? 1.0), gridBlocksPerTile: Number(Settings.gridBlocksPerTile || 16), textureResolutionPx: Number(Settings.textureResolutionPx || 512), gridColor: normalizeColorToHex(Settings.gridColor, "#ffffff"), backgroundColor: normalizeColorToHex(Settings.backgroundColor, "#2b2b2b"), lineThicknessMult: Number(Settings.lineThicknessMult || 1.0), useCustomTexture: !!Settings.useCustomTexture, customTextureDataUrl: String(Settings.customTextureDataUrl || ""), }; } function applyPreset(preset, options = {}) { if (!preset || typeof preset !== "object") return; const persist = options.persist !== false; const updateDialog = options.updateDialog !== false; Settings.enabled = !!preset.enabled; Settings.edgeFadeEnabled = preset.edgeFadeEnabled !== false; Settings.speedBlocksPerSec = Number(preset.speedBlocksPerSec || 0); // Backward compatibility: older presets stored sizeBlocks. const legacySize = Number(preset.sizeBlocks); const legacy = Number.isFinite(legacySize) ? legacySize : null; Settings.widthBlocks = Math.max( 3, Number(preset.widthBlocks ?? legacy ?? 256) ); Settings.lengthBlocks = Math.max( 3, Number(preset.lengthBlocks ?? legacy ?? 256) ); Settings.yBlocks = Number(preset.yBlocks || 0); Settings.yaw = Number(preset.yaw || 0); Settings.tilt = Number(preset.tilt || 0); Settings.opacity = Math.max(0, Math.min(1, Number(preset.opacity ?? 1.0))); Settings.gridBlocksPerTile = Math.max( 0.25, Math.min(1024, Number(preset.gridBlocksPerTile || 16)) ); Settings.textureResolutionPx = Math.max( 64, Math.min(2048, Math.floor(Number(preset.textureResolutionPx || 512))) ); Settings.gridColor = normalizeColorToHex(preset.gridColor, "#ffffff"); Settings.backgroundColor = normalizeColorToHex( preset.backgroundColor, "#2b2b2b" ); Settings.lineThicknessMult = Math.max( 0.25, Math.min(6, Number(preset.lineThicknessMult || 1.0)) ); Settings.useCustomTexture = !!preset.useCustomTexture; Settings.customTextureDataUrl = String(preset.customTextureDataUrl || ""); if (persist) { Settings.save(); } rig.refresh(); if (updateDialog) refreshDialogFromSettings(); } function getPresetSavedForLabel() { const key = getSelectedAnimationKey(); if (!key) return "No animation selected"; const map = loadAnimPresetMapCached(); const a = getSelectedAnimationSafe(); const legacyKeys = []; try { const name = String(a?.name || "").trim(); if (name) { legacyKeys.push(name); legacyKeys.push(`name:${name}`); } const uuid = String(a?.uuid || a?._uuid || "").trim(); if (uuid) { legacyKeys.push(uuid); legacyKeys.push(`uuid:${uuid}`); legacyKeys.push(`id:${uuid}`); } const id = String(a?.id || "").trim(); if (id) { legacyKeys.push(id); legacyKeys.push(`id:${id}`); } } catch (e) {} if (map && (map[key] || legacyKeys.some((k) => map[k]))) { return `Saved for: ${getSelectedAnimationName()}`; } return "Not saved for this animation"; } function savePresetForSelectedAnimation() { return savePresetForSelectedAnimationImpl({ silent: false }); } function savePresetForAnimationKey(animKey, animName, options = {}) { const key = String(animKey || ""); if (!key) return; const name = String(animName || "").trim() || "(Unnamed Animation)"; const map = loadAnimPresetMapCached(); map[key] = { name, savedAt: Date.now(), preset: capturePreset(), }; saveAnimPresetMap(map); } function savePresetForSelectedAnimationImpl(options = {}) { const key = getSelectedAnimationKey(); if (!key) { if (!options.silent) Blockbench.showQuickMessage("No animation selected"); return; } savePresetForAnimationKey(key, getSelectedAnimationName(), options); if (!options.silent) { Blockbench.showQuickMessage(`Saved for ${getSelectedAnimationName()}`); refreshDialogFromSettings(); } } function maybeApplyPresetForSelectedAnimation() { const key = getSelectedAnimationKey(); if (!key) return; const map = loadAnimPresetMapCached(); let entry = map?.[key]; // Backward compatibility for older saved keys. if (!entry?.preset) { try { const a = getSelectedAnimationSafe(); const name = String(a?.name || "").trim(); const uuid = String(a?.uuid || a?._uuid || "").trim(); const id = String(a?.id || "").trim(); const candidates = [ name, name ? `name:${name}` : "", uuid, uuid ? `uuid:${uuid}` : "", uuid ? `id:${uuid}` : "", id, id ? `id:${id}` : "", ] .map((v) => String(v || "").trim()) .filter(Boolean); for (const k of candidates) { const e = map?.[k]; if (e?.preset) { entry = e; break; } } } catch (e) {} } if (!entry?.preset) return; // Apply instantly without persisting settings to storage (fast + avoids stutter). applyPreset(entry.preset, { persist: false, updateDialog: true }); } // ============================================================ // UI // ============================================================ let dialog = null; let action = null; let timelineToggleAction = null; let timelinePanelAction = null; let aboutAction = null; function deleteBarItemIfExists(id) { try { if (!id) return; if (typeof BarItems !== "undefined" && BarItems && BarItems[id]) { BarItems[id]?.delete?.(); } } catch (e) {} } function tryAddActionToToolbar(toolbar, actionToAdd) { try { if (!toolbar || typeof toolbar.add !== "function" || !actionToAdd) return false; // Avoid duplicates if Blockbench already placed it. try { const id = String(actionToAdd?.id || ""); const candidates = [ toolbar?.children, toolbar?.items, toolbar?.actions, toolbar?.buttons, toolbar?.content, ].filter(Array.isArray); for (const arr of candidates) { if (arr.some((it) => it === actionToAdd || String(it?.id || it) === id)) { return true; } } } catch (e) {} // Some toolbars accept (item, index) try { toolbar.add(actionToAdd); return true; } catch (e) { try { toolbar.add(actionToAdd, 0); return true; } catch (e2) {} } } catch (e) {} return false; } function tryAttachTimelineToolbarActionsOnce() { try { if (!timelineToggleAction || !timelinePanelAction) return false; if (typeof Toolbars === "undefined" || !Toolbars) return false; // Prefer the canonical toolbar if present. const candidates = []; try { if (Toolbars.timeline) candidates.push(Toolbars.timeline); } catch (e) {} // Best-effort discovery across versions. try { for (const [key, bar] of Object.entries(Toolbars)) { const k = String(key || "").toLowerCase(); if (!k.includes("timeline")) continue; if (bar && !candidates.includes(bar)) candidates.push(bar); } } catch (e) {} let any = false; for (const bar of candidates) { any = tryAddActionToToolbar(bar, timelineToggleAction) || any; any = tryAddActionToToolbar(bar, timelinePanelAction) || any; // Some builds expose addAction instead of add if (!any) { try { if (typeof bar?.addAction === "function") { bar.addAction(timelineToggleAction); bar.addAction(timelinePanelAction); any = true; } } catch (e) {} } } return any; } catch (e) {} return false; } function waitForTimelineToolbarAndAttach() { // Toolbars often initialize after plugins; wait a bit and attach once. try { let tries = 0; const maxTries = 60; // ~15s at 250ms const intervalMs = 250; const timer = setInterval(() => { tries++; let done = false; try { done = !!tryAttachTimelineToolbarActionsOnce(); } catch (e) {} if (done || tries >= maxTries) { try { clearInterval(timer); } catch (e) {} } }, intervalMs); } catch (e) {} } function attachTimelineToolbarActions() { try { if (!timelineToggleAction || !timelinePanelAction) return; if (typeof Toolbars === "undefined" || !Toolbars) return; // Best-effort: find a toolbar that looks like the timeline toolbar. const candidates = []; try { for (const [key, bar] of Object.entries(Toolbars)) { if (!key) continue; const k = String(key).toLowerCase(); if (!k.includes("timeline")) continue; candidates.push(bar); } } catch (e) {} // Also try common names if present. try { if (Toolbars.timeline) candidates.unshift(Toolbars.timeline); } catch (e) {} let any = false; for (const bar of candidates) { any = tryAddActionToToolbar(bar, timelineToggleAction) || any; any = tryAddActionToToolbar(bar, timelinePanelAction) || any; } // If no timeline toolbar is discoverable, we still keep the actions registered // so they appear in Blockbench's action lists. return any; } catch (e) {} return false; } // ============================================================ // Persistent Timeline toolbar actions // ============================================================ // IMPORTANT: // These actions are created at script-evaluation time (outside `onload`). // Blockbench restores custom toolbar layouts early during startup. // If actions are only created in `onload`, they may not exist yet when the // timeline toolbar layout is restored, causing the items to be dropped. // // By registering them immediately with stable IDs, Blockbench can resolve // them and they persist across restarts. function ensureTimelineActionsRegistered() { try { // Avoid duplicates on hot-reload or duplicate script injections. deleteBarItemIfExists("animated_platforms_toggle"); deleteBarItemIfExists("animated_platforms_panel_timeline"); timelineToggleAction = new Action("animated_platforms_toggle", { name: "Toggle ground plane", description: "Toggle Animated Platforms on/off", icon: "check_box", click() { Settings.enabled = !Settings.enabled; Settings.save(); scheduleRigRefresh(); try { refreshDialogFromSettings(); } catch (e) {} Blockbench.showQuickMessage( Settings.enabled ? "Animated Platforms enabled" : "Animated Platforms disabled" ); }, }); timelinePanelAction = new Action("animated_platforms_panel_timeline", { name: "Animated Platforms", description: "Open Animated Platforms controls", icon: "grid_on", click: showPanel, }); } catch (e) { console.error("[AnimatedPlatforms] Failed to register timeline actions", e); } } function showAbout(banner = true) { const name = "Animated Platforms"; const icon = "grid_on"; const links = { discord: "https://discord.gg/KDd2rcAPqA", twitter: "https://x.com/cazfps1", website: "https://www.cazfps.com/links", }; const websiteLogoUrl = getAnimatedPlatformsAssetUrl("cazfps.png"); ensureAboutStyle(); new Dialog({ id: "mgp_about", title: name, width: 780, buttons: [], lines: [], component: { data() { return { banner: !!banner, name, links, websiteLogoUrl, }; }, template: `
This window can be reopened at any time from Help > About Plugins > {{name}}

{{name}}

An animated ground plane for easier walk cycles and vehicle motion previews.

How to use

Open the panel from View > Animated Platforms (or add the buttons to the Timeline toolbar). Enable it, then play/pause the animation to preview foot contact and motion against the scrolling ground.

Tips

- Hold Shift while adjusting values for finer steps.

- Use Texture Library to quickly reuse previous custom textures.

- Use Save to store a preset for the selected animation.

`, }, }).show(); try { $("dialog#mgp_about .dialog_title").html(` ${icon} ${name} `); } catch (e) {} } function addAboutButton() { try { let about = MenuBar.menus.help.structure.find((e) => e.id === "about_plugins"); if (!about) { about = new Action("about_plugins", { name: "About Plugins...", icon: "info", children: [], }); MenuBar.addAction(about, "help"); } aboutAction = new Action(`about_${PLUGIN_ID}`, { name: "About Animated Platforms...", icon: "info", click: () => showAbout(true), }); about.children.push(aboutAction); } catch (e) {} } let toggle_action = null; // Watchers let presetWatcher = null; let lastAnimKey = null; let dialogLabelWatcher = null; // Track last dialog values so we can tell whether the slider or number field changed. // (Removed) slider+number pairing; we now use Blockbench's numeric-input widget. // Pointer-lock for numeric scrubbing (prevents cursor hitting screen edges) let numericScrubPointerLockCleanup = null; function installNumericScrubPointerLock() { try { // Idempotent if (typeof numericScrubPointerLockCleanup === "function") return; const getDialogRoot = () => { // Blockbench dialog roots vary by version; try a few selectors. return ( document.getElementById("animated_platforms_panel") || document.querySelector(".dialog#animated_platforms_panel") || document.querySelector('.dialog[dialog_id="animated_platforms_panel"]') || document.querySelector('.dialog[dialog-id="animated_platforms_panel"]') || null ); }; const getPointerLockTarget = () => { try { const dom = Canvas?.renderer?.domElement; if (dom && typeof dom.requestPointerLock === "function") return dom; } catch (e) {} try { const c = document.querySelector("canvas.preview") || document.querySelector(".preview canvas"); if (c && typeof c.requestPointerLock === "function") return c; } catch (e) {} try { if (document.body && typeof document.body.requestPointerLock === "function") return document.body; } catch (e) {} return null; }; const parseNum = (v, fallback = 0) => { const n = Number(v); return Number.isFinite(n) ? n : fallback; }; const clamp = (v, min, max) => Math.max(min, Math.min(max, v)); const getStep = (input) => { const s = parseNum(input?.step, 0); return s > 0 ? s : 1; }; const dispatch = (el, type) => { try { el?.dispatchEvent?.(new Event(type, { bubbles: true })); } catch (e) {} }; let active = null; const startScrub = (input, e) => { try { if (!input) return false; // Request pointer lock in the *down* event (required on some builds). try { // Prefer the interacted element (most consistent with Electron gesture gating) const t = e?.target; if (t && typeof t.requestPointerLock === "function") { t.requestPointerLock(); } else if (input && typeof input.requestPointerLock === "function") { input.requestPointerLock(); } else { const root = getDialogRoot(); if (root && typeof root.requestPointerLock === "function") root.requestPointerLock(); else { const lockTarget = getPointerLockTarget(); lockTarget?.requestPointerLock?.(); } } } catch (e) {} const step = getStep(input); const min = input?.min !== undefined ? parseNum(input.min, -Infinity) : -Infinity; const max = input?.max !== undefined ? parseNum(input.max, Infinity) : Infinity; const base = parseNum(input.value, 0); active = { input, base, value: base, step, min, max, }; // Prevent the native drag from fighting our movement-based scrub. try { e?.preventDefault?.(); e?.stopPropagation?.(); } catch (e) {} return true; } catch (e) {} return false; }; const stopScrub = () => { try { if (active?.input) { dispatch(active.input, "change"); } } catch (e) {} active = null; try { if (document.pointerLockElement) document.exitPointerLock?.(); } catch (e) {} }; const pickScrubbableInput = (target, root) => { try { // Range sliders: scrub the range itself. const range = target.closest('input[type="range"]'); if (range && root.contains(range)) return range; // Number inputs: only scrub when the user is NOT clicking into the input text. const numDirect = target.closest('input[type="number"]'); if (numDirect && root.contains(numDirect)) { // If the click is on the arrow/stepper area (usually the right edge), allow scrub. try { const r = numDirect.getBoundingClientRect(); const x = Number(target.ownerDocument?.defaultView?.event?.clientX ?? NaN); // We can't reliably access the event here; fallback to always allow on modifiers. } catch (e) {} return null; } const row = target.closest( ".form_bar,.form_line,.form_row,.form-row,.form_group,.form-group" ); if (!row || !root.contains(row)) return null; const num = row.querySelector('input[type="number"]'); if (num) return num; } catch (e) {} return null; }; const onDownCapture = (e) => { try { if (!e) return; if (typeof e.button === "number" && e.button !== 0) return; const root = getDialogRoot(); if (!root) return; const target = e.target; if (!(target instanceof HTMLElement)) return; if (!root.contains(target)) return; // Never scrub text inputs directly. if (target.matches('textarea,select,[contenteditable="true"]')) return; // Special-case: number input arrow area drag let input = pickScrubbableInput(target, root); if (!input) { const num = target.closest('input[type="number"]'); if (num && root.contains(num)) { // If user is dragging (or intends to drag) the stepper area at the right edge, // start scrubbing instead of focusing for typing. const rect = num.getBoundingClientRect?.(); const x = Number(e.clientX ?? 0); const y = Number(e.clientY ?? 0); const inRect = rect && x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom; const inStepper = inRect && rect && x >= rect.right - 24; if (inStepper) input = num; } } if (!input) return; startScrub(input, e); } catch (e) {} }; const onMoveCapture = (e) => { try { if (!active?.input) return; if (!e) return; const buttons = typeof e.buttons === "number" ? e.buttons : 1; if ((buttons & 1) === 0) return; // movementX works best with pointer lock; fall back to clientX diff. const dx = Number.isFinite(e.movementX) ? e.movementX : 0; const step = active.step; // Shift = finer changes (smaller delta) const multShift = e.shiftKey ? 0.2 : 1; const multCtrl = e.ctrlKey || e.metaKey ? 0.2 : 1; const scale = 0.2; // ~5px per step const delta = dx * step * scale * multShift * multCtrl; if (!delta) return; let next = active.value + delta; next = clamp(next, active.min, active.max); // Keep reasonable precision for fractional steps. const stepStr = String(active.input.step || ""); const decimals = (stepStr.split(".")[1] || "").length; if (decimals > 0) { const p = Math.pow(10, Math.min(8, decimals)); next = Math.round(next * p) / p; } else { next = Math.round(next); } active.value = next; active.input.value = String(next); dispatch(active.input, "input"); } catch (e) {} }; const onUp = () => stopScrub(); const onKeyDown = (e) => { // Escape reliably exits pointer lock. try { if (e?.key === "Escape") stopScrub(); } catch (e) {} }; const onPointerLockChange = () => { try { // If pointer lock was denied/exited externally, keep scrubbing (without lock) // until mouseup, but don't force-stop mid-drag. } catch (e) {} }; document.addEventListener("mousedown", onDownCapture, true); document.addEventListener("pointerdown", onDownCapture, true); document.addEventListener("mousemove", onMoveCapture, true); document.addEventListener("pointermove", onMoveCapture, true); document.addEventListener("mouseup", onUp, true); document.addEventListener("pointerup", onUp, true); document.addEventListener("keydown", onKeyDown, true); document.addEventListener("pointerlockchange", onPointerLockChange, false); numericScrubPointerLockCleanup = () => { try { document.removeEventListener("mousedown", onDownCapture, true); document.removeEventListener("pointerdown", onDownCapture, true); document.removeEventListener("mousemove", onMoveCapture, true); document.removeEventListener("pointermove", onMoveCapture, true); document.removeEventListener("mouseup", onUp, true); document.removeEventListener("pointerup", onUp, true); document.removeEventListener("keydown", onKeyDown, true); document.removeEventListener( "pointerlockchange", onPointerLockChange, false ); } catch (e) {} stopScrub(); numericScrubPointerLockCleanup = null; }; } catch (e) { numericScrubPointerLockCleanup = null; } } // Debounce refresh to avoid hammering the renderer while dragging sliders. let refreshDebounceTimer = null; function scheduleRigRefresh() { try { if (refreshDebounceTimer) clearTimeout(refreshDebounceTimer); } catch (e) {} refreshDebounceTimer = null; try { refreshDebounceTimer = setTimeout(() => { try { rig.refresh(); } catch (e) {} }, 16); } catch (e) {} } // Debounced auto-save of the current settings as the selected animation's preset. let autoSaveDebounceTimer = null; function scheduleAutoSaveToSelectedAnimation() { // Capture the current target key at schedule time. // Otherwise, if the user switches animations/models during the debounce window, // the save would apply to the *new* selection and overwrite other presets. let targetKey = null; let targetName = ""; try { if (!Settings?.autoSaveToAnimation) return; targetKey = getSelectedAnimationKey(); if (!targetKey) return; targetName = getSelectedAnimationName(); } catch (e) { return; } try { if (autoSaveDebounceTimer) clearTimeout(autoSaveDebounceTimer); } catch (e) {} autoSaveDebounceTimer = null; try { autoSaveDebounceTimer = setTimeout(() => { try { if (!Settings?.autoSaveToAnimation) return; savePresetForAnimationKey(targetKey, targetName, { silent: true }); } catch (e) {} }, 150); } catch (e) {} } function wrapDialogHideToRestoreOverlay(dlg) { try { if (!dlg) return; if (dlg.__mgpHideWrapped) return; const originalHide = dlg.hide?.bind(dlg); if (typeof originalHide !== "function") return; dlg.hide = (...args) => { try { setNoOverlayEnabled(false); } catch (e) {} try { setNoBlurEnabled(false); } catch (e) {} try { numericScrubPointerLockCleanup?.(); } catch (e) {} numericScrubPointerLockCleanup = null; return originalHide(...args); }; dlg.__mgpHideWrapped = true; } catch (e) {} } // Cleanup: revert global side-effects + timers + UI handles. // Safe to call multiple times; used both for defensive double-load and on actual unload. function forceCleanup() { try { if (presetWatcher) clearInterval(presetWatcher); } catch (e) {} presetWatcher = null; lastAnimKey = null; try { if (dialogLabelWatcher) clearInterval(dialogLabelWatcher); } catch (e) {} dialogLabelWatcher = null; try { setNoOverlayEnabled(false); } catch (e) {} try { setNoBlurEnabled(false); } catch (e) {} try { document.getElementById(NO_OVERLAY_STYLE_ID)?.remove?.(); } catch (e) {} try { document.getElementById(NO_BLUR_STYLE_ID)?.remove?.(); } catch (e) {} try { document.getElementById(PANEL_STYLE_ID)?.remove?.(); } catch (e) {} try { document.getElementById(ABOUT_STYLE_ID)?.remove?.(); } catch (e) {} try { dialog?.hide?.(); } catch (e) {} dialog = null; try { textureLibraryDialog?.hide?.(); } catch (e) {} textureLibraryDialog = null; try { numericScrubPointerLockCleanup?.(); } catch (e) {} numericScrubPointerLockCleanup = null; try { rig.dispose(); } catch (e) {} try { if (refreshDebounceTimer) clearTimeout(refreshDebounceTimer); } catch (e) {} refreshDebounceTimer = null; try { if (autoSaveDebounceTimer) clearTimeout(autoSaveDebounceTimer); } catch (e) {} autoSaveDebounceTimer = null; try { if (action && typeof Preview !== "undefined" && Preview.prototype.menu) { Preview.prototype.menu.removeAction(action); } } catch (e) {} try { if (action && typeof Blockbench !== "undefined" && Blockbench.menus?.preview) { Blockbench.menus.preview.removeAction(action); } } catch (e) {} try { action?.delete?.(); } catch (e) {} action = null; try { timelineToggleAction?.delete?.(); } catch (e) {} timelineToggleAction = null; try { timelinePanelAction?.delete?.(); } catch (e) {} timelinePanelAction = null; try { MenuBar.removeAction(`help.about_plugins.about_${PLUGIN_ID}`); } catch (e) {} try { aboutAction?.delete?.(); } catch (e) {} aboutAction = null; } try { if (globalThis?.[INSTANCE_KEY]) { globalThis[INSTANCE_KEY].cleanup = forceCleanup; } } catch (e) {} function trySetDialogFormValues(dlg, values) { try { if (!dlg) return; if (typeof dlg.setFormValues === "function") { dlg.setFormValues(values); } else if (typeof dlg.setFormValue === "function") { for (const [k, v] of Object.entries(values || {})) { dlg.setFormValue(k, v); } } } catch (e) {} } function pickCustomTextureDataUrl(onDone) { try { const input = document.createElement("input"); input.type = "file"; input.accept = "image/*"; input.onchange = () => { const file = input.files && input.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = () => { try { onDone?.(String(reader.result || "")); } catch (e) {} }; reader.readAsDataURL(file); }; input.click(); } catch (e) {} } function refreshDialogFromSettings() { try { const vm = dialog?.content_vue; if (!vm) return; if (typeof vm.syncFromSettings === "function") vm.syncFromSettings(); } catch (e) {} } function rememberCustomTexture(dataUrl) { const url = String(dataUrl || "").trim(); if (!url) return; try { if (!Array.isArray(Settings.savedTextures)) Settings.savedTextures = []; // Move to front if it already exists const idx = Settings.savedTextures.indexOf(url); if (idx !== -1) Settings.savedTextures.splice(idx, 1); Settings.savedTextures.unshift(url); Settings.savedTextures = Settings.savedTextures.slice(0, 64); const ok = Settings.save(); if (!ok) { try { Blockbench.showQuickMessage( "Couldn't save texture library (storage full). Try smaller textures or delete some.", 4000 ); } catch (e) {} } } catch (e) {} } let textureLibraryDialog = null; function showTextureLibraryDialog() { try { if (textureLibraryDialog) { textureLibraryDialog.show(); try { textureLibraryDialog.content_vue?.refresh?.(); } catch (e) {} return; } } catch (e) { textureLibraryDialog = null; } textureLibraryDialog = new Dialog({ id: "animated_platforms_textures", title: "🖼️ Animated Platforms textures", width: 520, buttons: [], component: { data() { return { textures: Array.isArray(Settings.savedTextures) ? Settings.savedTextures.slice() : [], }; }, methods: { refresh() { this.textures = Array.isArray(Settings.savedTextures) ? Settings.savedTextures.slice() : []; }, useTexture(url) { const u = String(url || ""); if (!u) return; Settings.customTextureDataUrl = u; Settings.useCustomTexture = true; rememberCustomTexture(u); Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); try { refreshDialogFromSettings(); } catch (e) {} }, deleteTexture(url) { const u = String(url || ""); if (!u) return; try { const arr = Array.isArray(Settings.savedTextures) ? Settings.savedTextures : []; const i = arr.indexOf(u); if (i !== -1) arr.splice(i, 1); if (Settings.customTextureDataUrl === u) { Settings.customTextureDataUrl = ""; Settings.useCustomTexture = false; } Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); } catch (e) {} this.refresh(); }, clearAll() { try { Settings.savedTextures = []; if (Settings.useCustomTexture) { Settings.useCustomTexture = false; Settings.customTextureDataUrl = ""; } Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); } catch (e) {} this.refresh(); }, close() { try { textureLibraryDialog.hide(); } catch (e) {} }, }, mounted() { this.refresh(); }, template: `
Previously used custom textures
No textures saved yet. Use “Choose Texture” in the main panel.
`, }, }); textureLibraryDialog.show(); } function showPanel() { // Avoid deprecated HTML strings in Dialog.lines ensurePanelStyle(); rig.refresh(); const startDialogLabelWatcher = () => { try { if (dialogLabelWatcher) clearInterval(dialogLabelWatcher); } catch (e) {} dialogLabelWatcher = null; // Only needed while the dialog exists; keep it light. try { dialogLabelWatcher = setInterval(() => { try { if (!dialog) return; const vm = dialog?.content_vue; if (vm && typeof vm === "object") { vm.presetSavedFor = getPresetSavedForLabel(); } } catch (e) {} }, 250); } catch (e) {} }; const stopDialogLabelWatcher = () => { try { if (dialogLabelWatcher) clearInterval(dialogLabelWatcher); } catch (e) {} dialogLabelWatcher = null; }; if (dialog) { try { wrapDialogHideToRestoreOverlay(dialog); // Make this dialog a hovering menu (no blackout overlay). setNoOverlayEnabled(true); setNoBlurEnabled(true); dialog.show(); refreshDialogFromSettings(); startDialogLabelWatcher(); return; } catch (e) {} } dialog = new Dialog({ id: "animated_platforms_panel", title: "🛝 Animated Platforms", width: 460, buttons: [], lines: [], component: { data() { return { _suppress: false, shiftDown: false, presetSavedFor: getPresetSavedForLabel(), // Quick presets sizePreset: "", speedPreset: "", form: { enabled: !!Settings.enabled, autoSaveToAnimation: !!Settings.autoSaveToAnimation, opacity: Number(Settings.opacity ?? 1.0), edgeFadeEnabled: Settings.edgeFadeEnabled !== false, edgeFadeWidthUv: Number(Settings.edgeFadeWidthUv ?? 0.08), speedBlocksPerSec: Number(Settings.speedBlocksPerSec || 0), widthBlocks: Number(Settings.widthBlocks || 256), lengthBlocks: Number(Settings.lengthBlocks || 256), yBlocks: Number(Settings.yBlocks || 0), xBlocks: Number(Settings.xBlocks || 0), zBlocks: Number(Settings.zBlocks || 0), yaw: Number(Settings.yaw || 0), tilt: Number(Settings.tilt || 0), gridSquareBlocks: (Number(Settings.gridBlocksPerTile || 16) || 16) / 16, textureResolutionPx: Number(Settings.textureResolutionPx || 512), lineThicknessMult: Number(Settings.lineThicknessMult || 1.0), gridMinorOpacity: Number(Settings.gridMinorOpacity ?? 1.0), gridMajorOpacity: Number(Settings.gridMajorOpacity ?? 1.0), backgroundOpacity: Number(Settings.backgroundOpacity ?? 1.0), backgroundColor: String(Settings.backgroundColor || "#2b2b2b"), gridColor: String(Settings.gridColor || "#ffffff"), useCustomTexture: !!Settings.useCustomTexture, customTextureRotation90: Number(Settings.customTextureRotation90 ?? 0), customTextureFlipX: !!Settings.customTextureFlipX, customTextureFlipY: !!Settings.customTextureFlipY, }, }; }, methods: { syncFromSettings() { try { this._suppress = true; this.presetSavedFor = getPresetSavedForLabel(); this.form.enabled = !!Settings.enabled; this.form.autoSaveToAnimation = !!Settings.autoSaveToAnimation; this.form.opacity = Number(Settings.opacity ?? 1.0); this.form.edgeFadeEnabled = Settings.edgeFadeEnabled !== false; this.form.edgeFadeWidthUv = Number(Settings.edgeFadeWidthUv ?? 0.08); this.form.speedBlocksPerSec = Number(Settings.speedBlocksPerSec || 0); this.form.widthBlocks = Number(Settings.widthBlocks || 256); this.form.lengthBlocks = Number(Settings.lengthBlocks || 256); this.form.yBlocks = Number(Settings.yBlocks || 0); this.form.xBlocks = Number(Settings.xBlocks || 0); this.form.zBlocks = Number(Settings.zBlocks || 0); this.form.yaw = Number(Settings.yaw || 0); this.form.tilt = Number(Settings.tilt || 0); this.form.gridSquareBlocks = (Number(Settings.gridBlocksPerTile || 16) || 16) / 16; this.form.textureResolutionPx = Number(Settings.textureResolutionPx || 512); this.form.lineThicknessMult = Number(Settings.lineThicknessMult || 1.0); this.form.gridMinorOpacity = Number(Settings.gridMinorOpacity ?? 1.0); this.form.gridMajorOpacity = Number(Settings.gridMajorOpacity ?? 1.0); this.form.backgroundOpacity = Number(Settings.backgroundOpacity ?? 1.0); this.form.backgroundColor = String(Settings.backgroundColor || "#2b2b2b"); this.form.gridColor = String(Settings.gridColor || "#ffffff"); this.form.useCustomTexture = !!Settings.useCustomTexture; this.form.customTextureRotation90 = Number(Settings.customTextureRotation90 ?? 0); this.form.customTextureFlipX = !!Settings.customTextureFlipX; this.form.customTextureFlipY = !!Settings.customTextureFlipY; } catch (e) {} try { this._suppress = false; } catch (e) {} }, apply() { if (this._suppress) return; Settings.enabled = !!this.form.enabled; Settings.autoSaveToAnimation = !!this.form.autoSaveToAnimation; Settings.opacity = Math.max(0, Math.min(1, Number(this.form.opacity ?? 1.0))); Settings.edgeFadeEnabled = this.form.edgeFadeEnabled !== false; Settings.edgeFadeWidthUv = Math.max( 0.001, Math.min(0.5, Number(this.form.edgeFadeWidthUv ?? 0.08)) ); Settings.speedBlocksPerSec = Number(this.form.speedBlocksPerSec || 0); Settings.widthBlocks = Math.max(3, Number(this.form.widthBlocks || 256)); Settings.lengthBlocks = Math.max(3, Number(this.form.lengthBlocks || 256)); Settings.yBlocks = Number(this.form.yBlocks || 0); Settings.xBlocks = Number(this.form.xBlocks || 0); Settings.zBlocks = Number(this.form.zBlocks || 0); Settings.yaw = Number(this.form.yaw || 0); Settings.tilt = Number(this.form.tilt || 0); const sq = Number(this.form.gridSquareBlocks); if (Number.isFinite(sq)) { Settings.gridBlocksPerTile = Math.max(0.25, Math.min(1024, sq * 16)); } Settings.textureResolutionPx = Math.max( 64, Math.min(2048, Math.floor(Number(this.form.textureResolutionPx || 512))) ); Settings.lineThicknessMult = Math.max( 0.25, Math.min(6, Number(this.form.lineThicknessMult || 1.0)) ); Settings.gridMinorOpacity = Math.max(0, Math.min(1, Number(this.form.gridMinorOpacity ?? 1.0))); Settings.gridMajorOpacity = Math.max(0, Math.min(1, Number(this.form.gridMajorOpacity ?? 1.0))); Settings.backgroundOpacity = Math.max(0, Math.min(1, Number(this.form.backgroundOpacity ?? 1.0))); Settings.backgroundColor = normalizeColorToHex(this.form.backgroundColor, "#2b2b2b"); Settings.gridColor = normalizeColorToHex(this.form.gridColor, "#ffffff"); Settings.useCustomTexture = !!this.form.useCustomTexture; Settings.customTextureRotation90 = Math.max( 0, Math.min(3, Math.floor(Number(this.form.customTextureRotation90 ?? 0))) ); Settings.customTextureFlipX = !!this.form.customTextureFlipX; Settings.customTextureFlipY = !!this.form.customTextureFlipY; Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); }, chooseTexture() { pickCustomTextureDataUrl((dataUrl) => { (async () => { const url0 = String(dataUrl || ""); if (!url0) return; // Normalize to avoid localStorage quota issues (keeps pixel-art crisp) const url = await normalizeTextureDataUrlForStorage(url0, 512); if (!url) return; Settings.customTextureDataUrl = url; Settings.useCustomTexture = true; rememberCustomTexture(url); const ok = Settings.save(); if (!ok) { try { Blockbench.showQuickMessage( "Couldn't save texture settings (storage full).", 4000 ); } catch (e) {} } scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); this.syncFromSettings(); Blockbench.showQuickMessage("Custom texture set"); })(); }); }, openTextureLibrary() { showTextureLibraryDialog(); }, clearTexture() { Settings.customTextureDataUrl = ""; Settings.useCustomTexture = false; Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); this.syncFromSettings(); Blockbench.showQuickMessage("Custom texture cleared"); }, savePreset() { savePresetForSelectedAnimationImpl({ silent: false }); this.presetSavedFor = getPresetSavedForLabel(); }, resetAll() { Object.assign(Settings, { enabled: Settings.enabled, autoSaveToAnimation: Settings.autoSaveToAnimation, edgeFadeEnabled: true, edgeFadeWidthUv: 0.08, speedBlocksPerSec: 2.0, widthBlocks: 256, lengthBlocks: 256, yBlocks: 0, xBlocks: 0, zBlocks: 0, yaw: 0, tilt: 0, opacity: 1.0, gridBlocksPerTile: 16, textureResolutionPx: 512, gridColor: "#ffffff", backgroundColor: "#2b2b2b", gridMinorOpacity: 1.0, gridMajorOpacity: 1.0, backgroundOpacity: 1.0, lineThicknessMult: 1.0, useCustomTexture: false, customTextureDataUrl: "", customTextureRotation90: 0, customTextureFlipX: false, customTextureFlipY: false, }); Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); this.syncFromSettings(); }, resetGrid() { Object.assign(Settings, { gridBlocksPerTile: 16, textureResolutionPx: 512, gridColor: "#ffffff", backgroundColor: "#2b2b2b", gridMinorOpacity: 1.0, gridMajorOpacity: 1.0, backgroundOpacity: 1.0, lineThicknessMult: 1.0, }); Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); this.syncFromSettings(); }, resetMotion() { Object.assign(Settings, { speedBlocksPerSec: 2.0, yaw: 0, tilt: 0, }); Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); this.syncFromSettings(); }, resetTexture() { Object.assign(Settings, { useCustomTexture: false, customTextureDataUrl: "", customTextureRotation90: 0, customTextureFlipX: false, customTextureFlipY: false, }); Settings.save(); scheduleRigRefresh(); scheduleAutoSaveToSelectedAnimation(); this.syncFromSettings(); }, applySizePreset() { const v = String(this.sizePreset || ""); if (!v) return; if (v === "small") { this.form.widthBlocks = 16; this.form.lengthBlocks = 16; } else if (v === "medium") { this.form.widthBlocks = 64; this.form.lengthBlocks = 64; } else if (v === "large") { this.form.widthBlocks = 256; this.form.lengthBlocks = 256; } this.sizePreset = ""; }, applySpeedPreset() { const v = String(this.speedPreset || ""); if (!v) return; if (v === "walk") this.form.speedBlocksPerSec = 4.0; else if (v === "run") this.form.speedBlocksPerSec = 8.0; this.speedPreset = ""; }, close() { try { dialog.hide(); } catch (e) {} }, }, watch: { form: { handler() { this.apply(); }, deep: true, }, }, mounted() { this.syncFromSettings(); const onDown = (e) => { if (e?.key === "Shift") this.shiftDown = true; }; const onUp = (e) => { if (e?.key === "Shift") this.shiftDown = false; }; window.addEventListener("keydown", onDown); window.addEventListener("keyup", onUp); this.$once("hook:beforeDestroy", () => { window.removeEventListener("keydown", onDown); window.removeEventListener("keyup", onUp); }); }, template: `
General
Presets
Saved for: {{ presetSavedFor }}
Quick Presets
Placement
Motion
Grid
Custom Texture
X
Y
Resets
`, }, }); wrapDialogHideToRestoreOverlay(dialog); // Also stop the label watcher when the dialog is hidden via X/Esc. try { const originalHide = dialog.hide?.bind(dialog); if (typeof originalHide === "function") { dialog.hide = (...args) => { stopDialogLabelWatcher(); return originalHide(...args); }; } } catch (e) {} // Make this dialog a hovering menu (no blackout overlay). setNoOverlayEnabled(true); setNoBlurEnabled(true); dialog.show(); refreshDialogFromSettings(); startDialogLabelWatcher(); } // ============================================================ // Plugin lifecycle // - onload calls forceCleanup() defensively in case Blockbench loads the file twice // - onunload is the authoritative teardown for store/uninstall/disable // ============================================================ const registerPlugin = (typeof Plugin !== "undefined" && typeof Plugin.register === "function" ? Plugin.register.bind(Plugin) : null) || (typeof BBPlugin !== "undefined" && typeof BBPlugin.register === "function" ? BBPlugin.register.bind(BBPlugin) : null); if (!registerPlugin) { console.error( `[AnimatedPlatforms] Failed to register: Plugin API not found (id=${PLUGIN_ID})` ); return; } // Register persistent toolbar actions as early as possible. ensureTimelineActionsRegistered(); registerPlugin(PLUGIN_ID, { title: "Animated Platforms", author: "Cazfps", description: "An animated ground plane that makes it easier to animate moving entities (walk cycles, vehicles, etc.). " + "It offers customization for size, rotation, speed, opacity, textures, and per-animation presets so you can tune it to your workflow.", icon: "icon.svg", version: PLUGIN_VERSION, min_version: "4.8.0", variant: "both", new_repository_format: true, website: "https://www.cazfps.com/links", tags: ["Minecraft", "Animation", "Tools"], onload() { try { // If this script was loaded twice without a proper unload, clean up first. forceCleanup(); // Migrate settings/presets from the legacy plugin id. migrateLegacyStorageOnce(); Settings.load(); rig.refresh(); // Help > About Plugins entry addAboutButton(); // Timeline-placeable actions (users can add them via the Timeline toolbar menu) // Ensure the two timeline actions exist (should already be created during script eval). if (!timelineToggleAction || !timelinePanelAction) { ensureTimelineActionsRegistered(); } // Blockbench may prune unknown toolbar items before plugins load. // To make the user's Timeline toolbar setup effectively persistent, re-attach // our actions once the timeline toolbar has initialized. waitForTimelineToolbarAndAttach(); action = new Action("animated_platforms_panel", { name: "Animated Platforms", description: "Open Animated Platforms controls", icon: "grid_on", click: showPanel, }); MenuBar.addAction(action, "view"); if (typeof Preview !== "undefined" && Preview.prototype.menu) { Preview.prototype.menu.addAction(action); } if (typeof Blockbench !== "undefined" && Blockbench.menus?.preview) { Blockbench.menus.preview.addAction(action); } // Watch animation selection changes and apply presets. // Important: never touch dialog form values from here (can cause persistent UI reflow lag). try { if (presetWatcher) clearInterval(presetWatcher); } catch (e) {} presetWatcher = null; lastAnimKey = null; try { presetWatcher = setInterval(() => { try { if (!Settings?.enabled) return; const key = getSelectedAnimationKey(); if (!key) return; const scopedKey = `${getAnimPresetStorageKeys()[0]}|${key}`; if (scopedKey !== lastAnimKey) { lastAnimKey = scopedKey; maybeApplyPresetForSelectedAnimation(); } } catch (e) {} }, 50); } catch (e) {} console.log(`[AnimatedPlatforms] v${PLUGIN_VERSION} loaded`); } catch (e) { console.error("[AnimatedPlatforms] Failed to load", e); } }, onunload() { try { if (presetWatcher) clearInterval(presetWatcher); } catch (e) {} presetWatcher = null; lastAnimKey = null; try { if (dialogLabelWatcher) clearInterval(dialogLabelWatcher); } catch (e) {} dialogLabelWatcher = null; // Reset overlay changes if the plugin is unloaded mid-dialog. try { setNoOverlayEnabled(false); } catch (e) {} try { document.getElementById(NO_OVERLAY_STYLE_ID)?.remove?.(); } catch (e) {} try { dialog?.hide?.(); } catch (e) {} dialog = null; try { textureLibraryDialog?.hide?.(); } catch (e) {} textureLibraryDialog = null; try { rig.dispose(); } catch (e) {} if (action && typeof Preview !== "undefined" && Preview.prototype.menu) { Preview.prototype.menu.removeAction(action); } if (action && typeof Blockbench !== "undefined" && Blockbench.menus?.preview) { Blockbench.menus.preview.removeAction(action); } action?.delete?.(); action = null; try { timelineToggleAction?.delete?.(); } catch (e) {} timelineToggleAction = null; try { timelinePanelAction?.delete?.(); } catch (e) {} timelinePanelAction = null; try { MenuBar.removeAction(`help.about_plugins.about_${PLUGIN_ID}`); } catch (e) {} try { aboutAction?.delete?.(); } catch (e) {} aboutAction = null; console.log("[AnimatedPlatforms] Unloaded"); }, }); })(); ================================================ FILE: plugins/animation_sliders/LICENSE.MD ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: plugins/animation_sliders/about.md ================================================ Adds sliders and other tools to modify keyframes: You can add the sliders and tools to any of your toolbars by clicking the three dots on the right side and selecting **Customize**. Search for the slider you want to add and click to add it. - **Tween Keyframes:** Amplify the values of the selected keyframes - **Amplify Keyframes:** Amplify the values of the selected keyframes - **Ease Keyframes:** Create a curve with the selected keyframes between the adjacent keyframes - **Retime Keyframes:** Shift the curve in the graph editor without changing the time of the keyframe. This allows you to change the time of one axis individually - **Ground Speed:** For molang-driven walk animations. Use the slider to sync the animation with the ground below it. This will insert the modified_distance_moved query into the anim time update field. - **Keyframe Slider Axis:** Select which axis the keyframe sliders affect - **Normalize Keyframes:** Subtract the currently displayed value from all selected keyframes, in order to remove the base pose from the model. ================================================ FILE: plugins/animation_sliders/animation_sliders.js ================================================ /// var tween_slider, amplify_slider, easing_slider, axis_selector, ground_speed_slider, normalize_keyframes, updateSliders; Plugin.register('animation_sliders', { title: 'Animation Sliders', icon: 'icon.png', author: 'JannisX11', description: 'Adds multiple sliders to tweak keyframes', tags: ['Animation'], version: '0.5.0', min_version: '4.8.0', variant: 'both', onload() { function calcKeyframeValues(kf) { return [ kf.calc('x'), kf.calc('y'), kf.calc('z'), ] } function getInterval(event) { if ((event.shiftKey || Pressing.overrides.shift) && (event.ctrlOrCmd || Pressing.overrides.ctrl)) { return 0.1; } else if (event.shiftKey || Pressing.overrides.shift) { return 1; } else if (event.ctrlOrCmd || Pressing.overrides.ctrl) { return 0.5; } else { return 1; } } let channels = ['rotation', 'position', 'scale']; let selected_axes = {x: true, y: true, z: true}; axis_selector = new Action('keyframe_slider_axis_selector', { name: 'Keyframe Slider Axis', description: 'Select which axis is affected by animation sliders', icon: 'merge_type', condition: () => Animator.open, children() { return [ { icon: () => selected_axes.x, name: 'X', click() {selected_axes.x = !selected_axes.x}, keybind: axis_selector.sub_keybinds.x.keybind }, { icon: () => selected_axes.y, name: 'Y', click() {selected_axes.y = !selected_axes.y}, keybind: axis_selector.sub_keybinds.y.keybind }, { icon: () => selected_axes.z, name: 'Z', click() {selected_axes.z = !selected_axes.z}, keybind: axis_selector.sub_keybinds.z.keybind }, '_', { icon: 'clear_all', name: 'Enable All', keybind: axis_selector.sub_keybinds.enable_all.keybind, condition: () => { let {length} = [selected_axes.x, selected_axes.y, selected_axes.z].filter(key => key); return length != 3; }, click() { selected_axes.x = true; selected_axes.y = true; selected_axes.z = true; } }, ] }, click(event) { new Menu('keyframe_slider_axis_selector', this.children(), {keep_open: true}).open(event.target); } }); axis_selector.addSubKeybind('x', 'Toggle X', null, () => { selected_axes.x = !selected_axes.x }) axis_selector.addSubKeybind('y', 'Toggle Y', null, () => { selected_axes.y = !selected_axes.y }) axis_selector.addSubKeybind('z', 'Toggle Z', null, () => { selected_axes.z = !selected_axes.z }) axis_selector.addSubKeybind('enable_all', 'Enable All', null, () => { selected_axes.x = true; selected_axes.y = true; selected_axes.z = true; }) let tween_value = 50; tween_slider = new NumSlider('slider_tween_keyframes', { name: 'Tween Keyframes', category: 'animation', condition: () => Animator.open && Timeline.selected.length, settings: {show_bar: true, limit: false, min: 0, max: 100}, getInterval, get: function() { return tween_value; }, change: function(modify) { let previous_tween = tween_value; tween_value = modify(previous_tween); Timeline.animators.forEach(animator => { if (animator instanceof BoneAnimator) { channels.forEach(channel => { let first_selected = animator[channel].find(kf => kf.selected); if (!first_selected) return; let sorted = animator[channel].slice().sort((a, b) => a.time - b.time); let pre, post, found_selected; sorted.forEach(kf => { if (kf.selected) { found_selected = true; } else { if (!found_selected) pre = kf; if (found_selected && !post) post = kf; } }) let pre_val = calcKeyframeValues(pre || post || first_selected); let post_val = calcKeyframeValues(post || pre || first_selected); sorted.forEach(kf => { if (kf.selected) { let val = calcKeyframeValues(kf); if (selected_axes.x) kf.offset('x', pre_val[0] - val[0] + ((post_val[0] - pre_val[0]) * (tween_value / 100))); if (selected_axes.y) kf.offset('y', pre_val[1] - val[1] + ((post_val[1] - pre_val[1]) * (tween_value / 100))); if (selected_axes.z) kf.offset('z', pre_val[2] - val[2] + ((post_val[2] - pre_val[2]) * (tween_value / 100))); } }) }) } }) Animator.preview() }, onBefore: function() { Undo.initEdit({keyframes: Timeline.selected}) }, onAfter: function() { Undo.finishEdit('Tween keyframes') tween_value = 50; this.update(); } }) let amplify_value = 100; let amplify_original_values = {}; amplify_slider = new NumSlider('slider_amplify_keyframes', { name: 'Amplify Keyframes', category: 'animation', condition: () => Animator.open && Timeline.selected.length, settings: {show_bar: true, limit: false, min: 0, max: 200}, getInterval, get: function() { return amplify_value; }, change: function(modify) { let previous_amplify = amplify_value; amplify_value = modify(previous_amplify); Timeline.selected.forEach((kf) => { let val = calcKeyframeValues(kf); if (kf.channel == 'scale') { if (selected_axes.x) kf.offset('x', (amplify_original_values[kf.uuid][0]-1) * (amplify_value/100) + 1 - val[0]); if (selected_axes.y) kf.offset('y', (amplify_original_values[kf.uuid][1]-1) * (amplify_value/100) + 1 - val[1]); if (selected_axes.z) kf.offset('z', (amplify_original_values[kf.uuid][2]-1) * (amplify_value/100) + 1 - val[2]); } else { if (selected_axes.x) kf.offset('x', amplify_original_values[kf.uuid][0] * (amplify_value/100) - val[0]); if (selected_axes.y) kf.offset('y', amplify_original_values[kf.uuid][1] * (amplify_value/100) - val[1]); if (selected_axes.z) kf.offset('z', amplify_original_values[kf.uuid][2] * (amplify_value/100) - val[2]); } }) Animator.preview(); }, onBefore: function() { Timeline.selected.forEach((kf) => { amplify_original_values[kf.uuid] = calcKeyframeValues(kf); }) Undo.initEdit({keyframes: Timeline.selected}) }, onAfter: function() { Undo.finishEdit('Amplify keyframes') amplify_value = 100; amplify_original_values = {}; this.update(); } }) let easing_value = 50; easing_slider = new NumSlider('slider_easing_keyframes', { name: 'Ease Keyframes', category: 'animation', condition: () => Animator.open && Timeline.selected.length, settings: {show_bar: true, limit: false, min: 0, max: 100}, getInterval, get: function() { return easing_value; }, change: function(modify) { let previous_easing = easing_value; easing_value = modify(previous_easing); Timeline.animators.forEach(animator => { if (animator instanceof BoneAnimator) { channels.forEach(channel => { let first_selected = animator[channel].find(kf => kf.selected); if (!first_selected) return; let sorted = animator[channel].slice().sort((a, b) => a.time - b.time); let pre, post, found_selected; sorted.forEach(kf => { if (kf.selected) { found_selected = true; } else { if (!found_selected) pre = kf; if (found_selected && !post) post = kf; } }) let pre_val = calcKeyframeValues(pre || post || first_selected); let post_val = calcKeyframeValues(post || pre || first_selected); sorted.forEach(kf => { if (kf.selected) { let val = calcKeyframeValues(kf); let t = (kf.time - pre.time) / (post.time - pre.time); if (easing_value > 100) { t = Math.clamp(t * (easing_value / 100), 0, 1); } if (easing_value < 0) { t = Math.clamp(1 - (1 - t) * (1 - (easing_value / 100)), 0, 1); } let t_2 = Math.pow(1-t, 2) * 0 + 2*(1-t)*t*(Math.clamp(easing_value, 0, 100)/100) + Math.pow(t, 2) * 1; function offsetAxis(axis) { let x_p2 = pre_val[axis] + (post_val[axis] - pre_val[axis]) * (Math.clamp(easing_value, 0, 100)/100) let x_v = Math.pow(1-t_2, 2) * pre_val[axis] + 2*(1-t_2)*t_2*x_p2 + Math.pow(t_2, 2) * post_val[axis]; kf.offset(getAxisLetter(axis), -val[axis] + x_v); } if (selected_axes.x) offsetAxis(0); if (selected_axes.y) offsetAxis(1); if (selected_axes.z) offsetAxis(2); } }) }) } }) Animator.preview() }, onBefore: function() { Undo.initEdit({keyframes: Timeline.selected}) }, onAfter: function() { Undo.finishEdit('Ease keyframes') easing_value = 50; this.update(); } }) let retime_offset = 0; let retime_original_values = []; retime_slider = new NumSlider('slider_retime_keyframes', { name: 'Retime Keyframes', category: 'animation', condition: () => Animator.open && Animation.selected && Timeline.selected.length, getInterval(event) { return 1 / Animation.selected.snapping; }, get() { return retime_offset; }, change(modify) { let previous_retime = retime_offset; retime_offset = modify(previous_retime); Timeline.selected.forEach((kf) => { let new_time = kf.time + retime_offset; let index = Math.round(new_time * Animation.selected.snapping + retime_original_values.length*100) % retime_original_values.length; let value = retime_original_values[index]; if (selected_axes.x) kf.set('x', value[0]); if (selected_axes.y) kf.set('y', value[1]); if (selected_axes.z) kf.set('z', value[2]); }) Animator.preview(); }, onBefore() { let original_time = Timeline.time; let first = Timeline.selected[0]; for (let time = 0; time <= Animation.selected.length; time += 1 / Animation.selected.snapping) { Timeline.time = time; let value = [ first.animator.interpolate(first.channel, true, 'x'), first.animator.interpolate(first.channel, true, 'y'), first.animator.interpolate(first.channel, true, 'z'), ] retime_original_values.push(value); } Timeline.time = original_time; Undo.initEdit({keyframes: Timeline.selected}) }, onAfter() { Undo.finishEdit('Retime keyframes') retime_offset = 0; retime_original_values = []; this.update(); } }) ground_speed_slider = new NumSlider('slider_animation_ground_speed', { name: 'Ground Speed', category: 'animation', condition: () => Animator.open && Animation.selected, get() { let string = Animation.selected.anim_time_update; if (!string) return 5; let parsed = Animator.MolangParser.parse(string, {'query.modified_distance_moved': 1}); if (parsed) { return 1 / parsed; } let num = parseFloat(string.replace(/[^\d]/g, '')); if (!isNaN(num)) return num; return 5; }, change(modify) { let val = ground_speed_slider.get(); Animation.selected.anim_time_update = 'query.modified_distance_moved / '+modify(val); Animator.preview(); }, onBefore() { Undo.initEdit({animations: [Animation.selected]}); if (settings.ground_plane.value == false) { settings.ground_plane.set(true); } }, onAfter() { Undo.finishEdit('Change animation ground speed') } }) normalize_keyframes = new Action('normalize_keyframes', { name: 'Normalize Keyframes', description: 'Subtract the currently displayed value from all selected keyframes, in order to remove the base pose from the model.', icon: 'equalizer', click() { Undo.initEdit({keyframes: Timeline.selected}) Timeline.animators.forEach(animator => { if (animator instanceof BoneAnimator) { channels.forEach(channel => { let closest_selected = animator[channel].filter(kf => kf.selected).sort((a, b) => Math.abs(Timeline.time - a.time) - Math.abs(Timeline.time - b.time))[0]; if (!closest_selected) return; let values = calcKeyframeValues(closest_selected); animator[channel].forEach(kf => { if (kf.selected) { function offsetAxis(axis) { kf.offset(getAxisLetter(axis), -values[axis]); } if (selected_axes.x) offsetAxis(0); if (selected_axes.y) offsetAxis(1); if (selected_axes.z) offsetAxis(2); } }) }) } }) Animator.preview() Undo.finishEdit('Normalize keyframes') } }) MenuBar.menus.keyframe.addAction(normalize_keyframes) updateSliders = function() { tween_slider.update(); amplify_slider.update(); easing_slider.update(); retime_slider.update(); ground_speed_slider.update(); } Blockbench.on('update_keyframe_selection', updateSliders); }, onunload() { tween_slider.delete(); amplify_slider.delete(); easing_slider.delete(); retime_slider.delete(); ground_speed_slider.delete(); axis_selector.delete(); normalize_keyframes.delete(); Blockbench.removeListener('update_keyframe_selection', updateSliders); } }); ================================================ FILE: plugins/animation_sliders/members.yml ================================================ maintainers: - JannisX11 ================================================ FILE: plugins/animation_to_java.js ================================================ (function () { let menuButton; Plugin.register("animation_to_java", { title: "Animation to Java Converter", author: "MG, Vincent_Huto(PR), DailyCraft(PR), MarcusSlover(PR)", description: "Converts Blockbench animations to Java code for the new 1.19+ keyframe system.", icon: "fa-cube", version: "1.2.0", max_version: "4.12.9", variant: "both", about: "This plugin exports your Blockbench animations as Java code to be used for the new 1.19+ keyframe system. Please note that this system does not support Molang or step interpolation.", tags: ["Deprecated", "Minecraft: Java Edition"], deprecation_note: 'This feature is now built into Blockbench, the plugin is no longer required.', onload() { Formats.modded_entity.animation_mode = true menuButton = new Action("export_animation_to_java", { name: "Export Animations to Java", description: "Exports animations to Java code", icon: "fa-file-export", condition: () => Format.animation_mode, click() { mapToExport(); }, }); MenuBar.addAction(menuButton, "file.export"); }, onunload() { Formats.modded_entity.animation_mode = false menuButton.delete(); }, }); /** * The mappings for the mojang mappings. */ const animation_mojang_mappings = { definition: { name: "AnimationDefinition", builder: "Builder", }, add: "addAnimation", loop: "looping", length: "withLength", channel: { name: "AnimationChannel", targets: { position: { name: "Targets.POSITION", vector: "KeyframeAnimations.posVec" }, rotation: { name: "Targets.ROTATION", vector: "KeyframeAnimations.degreeVec" }, scale: { name: "Targets.SCALE", vector: "KeyframeAnimations.scaleVec" } }, interpolations: { linear: "Interpolations.LINEAR", cubic: "Interpolations.CATMULLROM" } } } /** * The mappings for the yarn mappings. */ const animation_yarn_mappings = { definition: { name: "Animation", builder: "Builder", }, add: "addBoneAnimation", loop: "looping", length: "create", channel: { name: "Transformation", targets: { position: { name: "Targets.TRANSLATE", vector: "AnimationHelper.createTranslationalVector" }, rotation: { name: "Targets.ROTATE", vector: "AnimationHelper.createRotationalVector" }, scale: { name: "Targets.SCALE", vector: "AnimationHelper.createScalingVector" } }, interpolations: { linear: "Interpolations.LINEAR", cubic: "Interpolations.CUBIC" } } } /** * Asks the user for the mappings to use and then generates the file. */ function mapToExport() { new Dialog("select_mappings", { id: "select_mappings", title: "Select Mappings", form: { mappings: { label: "Mappings", type: "select", options: { mojang: "Mojang", yarn: "Yarn", }, default: "mojang", }, }, onConfirm(form) { let data; if (form.mappings === "mojang") { data = generateFile(animation_mojang_mappings); } else { data = generateFile(animation_yarn_mappings); } Blockbench.export({ type: "Text File", extensions: ["txt"], savetype: "text", content: data, }); this.hide(); }, }).show(); } /** * Transforms the interpolation to the correct format. * @param interpolation The interpolation to transform. * @param mappings The mappings to use. * @returns {string|*} The transformed interpolation. */ function transformInterpolation(interpolation, mappings) { if (interpolation === "LINEAR") { return mappings.channel.interpolations.linear; } else if (interpolation === "CUBIC" || interpolation === "CATMULLROM") { return mappings.channel.interpolations.cubic; } } /** * Generates the file from the given mappings. * @param mapping The mappings to use. * @returns {string} The generated file. */ function generateFile(mapping) { let outfileText = ""; const definition = mapping.definition.name; const builder = mapping.definition.builder; const length = mapping.length; const loop = mapping.loop; const add = mapping.add; const channel = mapping.channel.name; const targets = mapping.channel.targets; for (const animation of Animation.all) { outfileText += `\npublic static final ${definition} ${animation.name .replaceAll(".", "_") .replace("animation_", "") .toUpperCase()} = ${definition}.${builder}.${length}(${animation.length }f)`; if (animation.loop === "loop") { outfileText += `.${loop}()`; } for (const id in animation.animators) { const boneAnimator = animation.animators[id]; if (!(boneAnimator instanceof BoneAnimator)) continue; let posKeyArray = []; let rotKeyArray = []; let scaleKeyArray = []; // Position if (boneAnimator.position.length) { outfileText += `\n.${add}("${boneAnimator.name}",\n\tnew ${channel}(${channel}.${targets.position.name}`; //Sorts by time to ensure ordering for (const keyFrame of boneAnimator.position) { posKeyArray.push(keyFrame); } posKeyArray.sort((a, b) => a.time - b.time) for (const keyFrame of posKeyArray) { const {x = 0.0, y = 0.0, z = 0.0} = keyFrame.data_points[0]; const interpolation = transformInterpolation(keyFrame.interpolation.toUpperCase(), mapping); outfileText += `, \n\t\tnew Keyframe(${keyFrame.time }f, ${targets.position.vector}(${round2(x)}f, ${round2(y)}f, ${round2(z)}f),\n\t\t\t${channel}.${interpolation})`; } outfileText += "))"; } // Rotation if (boneAnimator.rotation.length) { outfileText += `\n.${add}("${boneAnimator.name}",\n\tnew ${channel}(${channel}.${targets.rotation.name}`; //Sorts by time to ensure ordering for (const keyFrame of boneAnimator.rotation) { rotKeyArray.push(keyFrame); } rotKeyArray.sort((a, b) => a.time - b.time) for (const keyFrame of rotKeyArray) { const {x = 0.0, y = 0.0, z = 0.0} = keyFrame.data_points[0]; const interpolation = transformInterpolation(keyFrame.interpolation.toUpperCase(), mapping); outfileText += `,\n\t\tnew Keyframe(${keyFrame.time }f, ${targets.rotation.vector}(${round2(x)}f, ${round2(y)}f, ${round2(z)}f),\n\t\t\t${channel}.${interpolation})`; } outfileText += "))"; } // Scale if (boneAnimator.scale.length) { outfileText += `\n.${add}("${boneAnimator.name}",\n\tnew ${channel}(${channel}.${targets.scale.name}`; //Sorts by time to ensure ordering for (const keyFrame of boneAnimator.scale) { scaleKeyArray.push(keyFrame); } scaleKeyArray.sort((a, b) => a.time - b.time) for (const keyFrame of scaleKeyArray) { const {x = 0.0, y = 0.0, z = 0.0} = keyFrame.data_points[0]; const interpolation = transformInterpolation(keyFrame.interpolation.toUpperCase(), mapping); outfileText += `,\n\t\tnew Keyframe(${keyFrame.time }f, ${targets.scale.vector}(${round2(x)}f, ${round2(y)}f, ${round2(z)}f),\n\t\t\t${channel}.${interpolation})`; } outfileText += "))"; } } outfileText += ".build();" } return outfileText.replaceAll("66666666666", "67").replaceAll("33333333333", "34"); } function round2(n) { return Math.round((Number(n) + Number.EPSILON) * 100) / 100; } })(); ================================================ FILE: plugins/animation_to_json.js ================================================ // Based off of https://github.com/JannisX11/blockbench-plugins/blob/master/plugins/animation_to_java.js (function () { var menuButton; Plugin.register("animation_to_json", { title: "Animation to JSON Converter", author: "Gaming32", description: "Converts Blockbench animations to the JSON format for the NeoForge mod loader", icon: "fa-cube", tags: ["Animation", "Minecraft: Java Edition"], variant: "both", version: "1.0.1", onload() { Formats.modded_entity.animation_mode = true; menuButton = new Action("export_animation_to_json", { name: "Export Animations to JSON", description: "Export Animations to JSON format", icon: "fa-file-export", condition: () => Format.animation_mode, click() { const animation = Animation.selected; if (animation == null) return; Blockbench.export({ type: "Json Files", extensions: ["json"], name: `${animation.name.replaceAll(".", "_").replace("animation_", "")}.json`, resource_id: "json_entity_animation", savetype: "text", content: JSON.stringify(generateJson(animation)) }); } }); MenuBar.addAction(menuButton, "file.export"); }, onunload() { menuButton.delete(); } }); function generateJson(animation) { const result = { length: animation.length, animations: [] }; if (animation.loop == "loop") { result.loop = true; } for (const id in animation.animators) { const boneAnimator = animation.animators[id]; if (!(boneAnimator instanceof BoneAnimator)) continue; if (boneAnimator.position.length) { result.animations.push(generateKeyframes(boneAnimator.name, "position", boneAnimator.position)); } if (boneAnimator.rotation.length) { result.animations.push(generateKeyframes(boneAnimator.name, "rotation", boneAnimator.rotation)); } if (boneAnimator.scale.length) { result.animations.push(generateKeyframes(boneAnimator.name, "scale", boneAnimator.scale)); } } return result; } function generateKeyframes(bone, target, keyframes) { const animData = { bone, target, keyframes: [] }; for (const keyframe of [...keyframes].sort((a, b) => a.time - b.time)) { animData.keyframes.push({ timestamp: keyframe.time, target: [ keyframe.get("x"), keyframe.get("y"), keyframe.get("z"), ], interpolation: keyframe.interpolation }); } return animData; } })(); ================================================ FILE: plugins/animation_utils/README.md ================================================ # GeckoLib Animation Utils Developer Readme This readme is intended for developers wishing to work on the GeckoLib plugin. # Environment setup ## Windows Inspect the contents of [.nvmrc](./src/.nvmrc) - this specifies the recommended version of Node.JS to use for plugin development. You can [download the corresponding version of Node.JS here](https://nodejs.org/en/download/releases). ## macOS and Unix It's recommended, though not required, to install the correct version of Node.JS using the Node Version Manager script (nvm). [Follow the install guide here](https://github.com/nvm-sh/nvm/blob/master/README.md). A brief summary of how to use `nvm` once it's installed is to `cd` into the [src](./src) folder of the plugin and then run: ``` nvm install `cat .nvmrc` ``` followed by: ``` nvm use ``` If you have multiple versions of node installed on your system, it may be convenient to [change the default version to the version of node you just installed](https://github.com/nvm-sh/nvm/blob/master/README.md#set-default-node-version). Otherwise you may need to run `nvm use` every time you start a new terminal session. If you are using `nvm` for other projects with other versions of node, you can also use a [shell hook script to automatically run nvm use when changing directories](https://stackoverflow.com/questions/23556330/run-nvm-use-automatically-every-time-theres-a-nvmrc-file-on-the-directory). You can confirm the active node version by running ``` node --version ``` ## All Platforms After Node.JS has been installed, run: ``` npm install ``` Inside the `src` folder. You should run this command any time there has been a change to `package.json`. You might see a diff on `package-lock.json`. This is usually OK and indicates an update to transient dependenices, and should be OK to commit. If you see a LOT of changes to this file it might be an indication you are using the wrong version of node/npm. # Developing the plugin ## Working on the plugin First, start the development webpack bundler: ``` npm start ``` The development bundler will watch the filesystem for changes and automatically re-build the plugin to [animation_utils.js](./animation_utils.js). Then, you can load the plugin in Blockbench from `File` -> `Plugins` and selecting the `Load Plugin from File` button. Every time you make a change to the plugin source code, the bundler will automatically rebuild the plugin, but you still need to reload it in Blockbench in order for the changes to take effect. You can do this by selecting `Help` -> `Developer` -> `Reload Plugins`. In some cases if the global state has been messed up, you may need to reload the entire application using `Help` -> `Developer` -> `Reload Blockbench`. It's also recommended to select `Open Dev Tools` from this menu as it can be very helpful to explore the Blockbench API using the console and inspect error logs and debug breakpoints. As every time you load the plugin, it's considered by the JS interpreter to be a different source file, any breakpoints set on the previously loaded file will be lost. You can work around this by adding a `debugger;` statement inside the source code where you want to set a breakpoint, which will force the JS interpreter to break on that line. If a TypeScript compiler error is encountered, it will be logged to the terminal window, but the JS bundle will still be generated. To check for errors, you can run: ``` npm run test ``` This will run all pretest scripts (eslint and TypeScript type check) as well as unit tests. It's also possible to run pretest separately, or the individual checks by themselves. To see all available npm scripts, run: ``` npm run ``` ## Building a release of the plugin First, inspect [package.json](./src/package.json) to make sure all the properties are correct. If you are making a release of the plugin, you should bump the `version` property to be one minor version up for a bugfix, minor version for new features, or major version for backwards-incompatible breaking changes. Then, check the `blockbenchConfig`. `min_version` should be the lowest version of Blockbench the plugin is known to work with and `max_version` should be the first version the plugin is expected to not work with that's higher than the versions it was tested on. When the metadata is ready, run: ``` npm run build ``` This will first run prebuild/pretest/test scripts, then build the plugin and automatically update the [plugins.json](../../plugins.json) manifest with your settings. Then, update the [changelog](./changelog.json) to add patch notes for the new version. New version entries go at the bottom. Double-check everything looks right, then commit and make a PR to [JannisX11/blockbench-plugins](https://github.com/JannisX11/blockbench-plugins) to release the plugin. Note that it is possible to skip pre-build scripts by running: ``` npm run build:only ``` This is dangerous and shouldn't be done to make a full release, it's better to fix any errors from tests, lint, and compiler before publishing changes. ## Using TypeScript The plugin is now written using a loose version of [TypeScript](https://www.typescriptlang.org/docs/handbook/intro.html). Blockbench types are supplied by the [blockbench-types](https://github.com/JannisX11/blockbench-types) package. Note that these types are hand-written and may contain errors or be missing certain APIs. So just because you see an error message in your IDE or the bundler output doesn't neccessarily mean your code is wrong, it's possible it could be an issue with the type definitions. TypeScript errors won't prevent the plugin from being built so you can always test your code manually and/or inspect the [Blockbench source code](https://github.com/JannisX11/blockbench) to confirm the code is correct. If there's an error in the types, there are a few ways of fixing it: 1. Make a PR to `blockbench-types`. This is the best, although possibly the slowest method of fixing type errors, and will help all other plugin authors. * These changes can be tested locally first using `npm link`. To do so, clone the repo and ensure the same node version is being used as the one for the plugin. Then run `npm link` inside `blockbench-types`. Finally, run `npm link blockbench-types` inside the plugin `src` folder. This will create a symbolic link inside `node_modules` so that the types are resolved from your local copy of `blockbench-types`. You need to run `npm link blockbench-types` after every time you run `npm install` because an install overwrites the symlink. 1. Massage the types inside the plugin. There are a number of ways you can do this, such as: * Use [type assertions (aka casting)](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions). Performing an `as` cast directly into the target type is the safest method. If neccessary, casting via `as unknown as ` will cause the compiler to ignore insufficient overlap between types. It's also possible to attempt to change the type of a function parameter or inferred variable type by adding a type annotation, such as: ```typescript (kf: GeckolibKeyframe) => { } // Otherwise kf would be a Keyframe ``` or ```typescript let easingBar: HTMLElement = document.createElement('div'); // Otherwise this would be an HTMLDivElement ``` * Subclassing a blockbench type (for an example of this see usage of the `GeckolibBoneAnimator` in [codec.ts](./src/codec.ts)). * Performing [type narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html). * There are other options, such as [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#handbook-content). 1. The nuclear option when all else fails: slap a `// @ts-ignore` comment above the problematic line(s). This is a bit dangerous as it shuts off ALL type checking on on that line, but sometimes this is necessary if you need to just force the compiler to ignore a problematic area of the code. Some places that are good to look for help with TypeScript are the [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html), [TypeScript Discord](https://discord.com/invite/typescript), or you can ping Eliot on the GeckoLib Discord. # Working with ESLint [ESLint](https://eslint.org) is a tool for checking the code for common errors or problematic coding styles. It can be integrated into IDEs via plugins, and can be run from the terminal like so: ``` npm run lint ``` Some lint errors can be fixed automatically by running: ``` npm run lint:fix ``` It's best to fix errors by changing the source code when possible. There are some cases in which certain lint rules might get in the way of particular things we might need to do in the plugin. In this case, [the rules can be disabled for different scopes](https://eslint.org/docs/latest/use/configure/rules). It's best to keep the scope as small as possible, so disabling individual rules per-line is the best way to start, or if it's needed in a larger area, disabling individual rules for a block of code, then lastly a whole file. You can search the code for `eslint-disable` to find examples. In some cases it may be necessary to disable a rule for the entire codebase, this can be done in the `rules` block of the [.eslintrc.cjs](./src/.eslintrc.cjs) file. ================================================ FILE: plugins/animation_utils/about.md ================================================ GeckoLib Blockbench plugin for the GeckoLib animation and rendering library mod for Minecraft: Java edition. This plugin allows you to create and edit model and animation assets for GeckoLib-based mods, utilising Blockbench's live animation editor and other editing tools. Utilise native support for resourcepack-able controller-based animations, mathematical expressions, easings, and more to create armour, items, entities, blocks, and anything else you can think of! Must be paired with a Mod for Minecraft: Java utilising the GeckoLib library.

Links:

================================================ FILE: plugins/animation_utils/animation_utils.js ================================================ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css": /*!******************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css ***! \******************************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/getUrl.js */ "./node_modules/css-loader/dist/runtime/getUrl.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;base64,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 */ "data:font/woff2;base64,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"), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, `@font-face { font-family: 'geckolib_icomoon'; font-weight: normal; font-style: normal; src: url(${___CSS_LOADER_URL_REPLACEMENT_0___}) format("woff2"); } [class^="easing-"]:not(.fa), [class*=" easing-"]:not(.fa) { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'geckolib_icomoon' !important; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; font-size: 1.4em; max-width: 24px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .easing-linear:before { content: "\\e925"; } .easing-step:before { content: "\\e921"; } .easing-in_sine:before { content: "\\e915"; } .easing-out_sine:before { content: "\\e916"; } .easing-in_out_sine:before { content: "\\e917"; } .easing-in_quad:before { content: "\\e900"; } .easing-out_quad:before { content: "\\e901"; } .easing-in_out_quad:before { content: "\\e902"; } .easing-in_cubic:before { content: "\\e903"; } .easing-out_cubic:before { content: "\\e904"; } .easing-in_out_cubic:before { content: "\\e905"; } .easing-in_quart:before { content: "\\e906"; } .easing-out_quart:before { content: "\\e907"; } .easing-in_out_quart:before { content: "\\e908"; } .easing-in_quint:before { content: "\\e909"; } .easing-out_quint:before { content: "\\e90a"; } .easing-in_out_quint:before { content: "\\e90b"; } .easing-in_expo:before { content: "\\e90c"; } .easing-out_expo:before { content: "\\e90d"; } .easing-in_out_expo:before { content: "\\e90e"; } .easing-in_circ:before { content: "\\e90f"; } .easing-out_circ:before { content: "\\e910"; } .easing-in_out_circ:before { content: "\\e911"; } .easing-in_back:before { content: "\\e918"; } .easing-out_back:before { content: "\\e919"; } .easing-in_out_back:before { content: "\\e91a"; } .easing-in_elastic:before { content: "\\e91b"; } .easing-out_elastic:before { content: "\\e91c"; } .easing-in_out_elastic:before { content: "\\e91d"; } .easing-in_bounce:before { content: "\\e91e"; } .easing-out_bounce:before { content: "\\e91f"; } .easing-in_out_bounce:before { content: "\\e920"; }`, ""]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/runtime/api.js": /*!*****************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/api.js ***! \*****************************************************/ /***/ ((module) => { "use strict"; /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ "./node_modules/css-loader/dist/runtime/getUrl.js": /*!********************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/getUrl.js ***! \********************************************************/ /***/ ((module) => { "use strict"; module.exports = function (url, options) { if (!options) { options = {}; } if (!url) { return url; } url = String(url.__esModule ? url.default : url); // If url is already wrapped in quotes, remove them if (/^['"].*['"]$/.test(url)) { url = url.slice(1, -1); } if (options.hash) { url += options.hash; } // Should url be wrapped? // See https://drafts.csswg.org/css-values-3/#urls if (/["'() \t\n]|(%20)/.test(url) || options.needQuotes) { return "\"".concat(url.replace(/"/g, '\\"').replace(/\n/g, "\\n"), "\""); } return url; }; /***/ }), /***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js": /*!**************************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***! \**************************************************************/ /***/ ((module) => { "use strict"; module.exports = function (i) { return i[1]; }; /***/ }), /***/ "./node_modules/lodash/_DataView.js": /*!******************************************!*\ !*** ./node_modules/lodash/_DataView.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var DataView = getNative(root, 'DataView'); module.exports = DataView; /***/ }), /***/ "./node_modules/lodash/_Hash.js": /*!**************************************!*\ !*** ./node_modules/lodash/_Hash.js ***! \**************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var hashClear = __webpack_require__(/*! ./_hashClear */ "./node_modules/lodash/_hashClear.js"), hashDelete = __webpack_require__(/*! ./_hashDelete */ "./node_modules/lodash/_hashDelete.js"), hashGet = __webpack_require__(/*! ./_hashGet */ "./node_modules/lodash/_hashGet.js"), hashHas = __webpack_require__(/*! ./_hashHas */ "./node_modules/lodash/_hashHas.js"), hashSet = __webpack_require__(/*! ./_hashSet */ "./node_modules/lodash/_hashSet.js"); /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `Hash`. Hash.prototype.clear = hashClear; Hash.prototype['delete'] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; module.exports = Hash; /***/ }), /***/ "./node_modules/lodash/_ListCache.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_ListCache.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var listCacheClear = __webpack_require__(/*! ./_listCacheClear */ "./node_modules/lodash/_listCacheClear.js"), listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ "./node_modules/lodash/_listCacheDelete.js"), listCacheGet = __webpack_require__(/*! ./_listCacheGet */ "./node_modules/lodash/_listCacheGet.js"), listCacheHas = __webpack_require__(/*! ./_listCacheHas */ "./node_modules/lodash/_listCacheHas.js"), listCacheSet = __webpack_require__(/*! ./_listCacheSet */ "./node_modules/lodash/_listCacheSet.js"); /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `ListCache`. ListCache.prototype.clear = listCacheClear; ListCache.prototype['delete'] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; module.exports = ListCache; /***/ }), /***/ "./node_modules/lodash/_Map.js": /*!*************************************!*\ !*** ./node_modules/lodash/_Map.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var Map = getNative(root, 'Map'); module.exports = Map; /***/ }), /***/ "./node_modules/lodash/_MapCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_MapCache.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ "./node_modules/lodash/_mapCacheClear.js"), mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ "./node_modules/lodash/_mapCacheDelete.js"), mapCacheGet = __webpack_require__(/*! ./_mapCacheGet */ "./node_modules/lodash/_mapCacheGet.js"), mapCacheHas = __webpack_require__(/*! ./_mapCacheHas */ "./node_modules/lodash/_mapCacheHas.js"), mapCacheSet = __webpack_require__(/*! ./_mapCacheSet */ "./node_modules/lodash/_mapCacheSet.js"); /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `MapCache`. MapCache.prototype.clear = mapCacheClear; MapCache.prototype['delete'] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; module.exports = MapCache; /***/ }), /***/ "./node_modules/lodash/_Promise.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_Promise.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var Promise = getNative(root, 'Promise'); module.exports = Promise; /***/ }), /***/ "./node_modules/lodash/_Set.js": /*!*************************************!*\ !*** ./node_modules/lodash/_Set.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var Set = getNative(root, 'Set'); module.exports = Set; /***/ }), /***/ "./node_modules/lodash/_SetCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_SetCache.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"), setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ "./node_modules/lodash/_setCacheAdd.js"), setCacheHas = __webpack_require__(/*! ./_setCacheHas */ "./node_modules/lodash/_setCacheHas.js"); /** * * Creates an array cache object to store unique values. * * @private * @constructor * @param {Array} [values] The values to cache. */ function SetCache(values) { var index = -1, length = values == null ? 0 : values.length; this.__data__ = new MapCache; while (++index < length) { this.add(values[index]); } } // Add methods to `SetCache`. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; SetCache.prototype.has = setCacheHas; module.exports = SetCache; /***/ }), /***/ "./node_modules/lodash/_Stack.js": /*!***************************************!*\ !*** ./node_modules/lodash/_Stack.js ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), stackClear = __webpack_require__(/*! ./_stackClear */ "./node_modules/lodash/_stackClear.js"), stackDelete = __webpack_require__(/*! ./_stackDelete */ "./node_modules/lodash/_stackDelete.js"), stackGet = __webpack_require__(/*! ./_stackGet */ "./node_modules/lodash/_stackGet.js"), stackHas = __webpack_require__(/*! ./_stackHas */ "./node_modules/lodash/_stackHas.js"), stackSet = __webpack_require__(/*! ./_stackSet */ "./node_modules/lodash/_stackSet.js"); /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = this.__data__ = new ListCache(entries); this.size = data.size; } // Add methods to `Stack`. Stack.prototype.clear = stackClear; Stack.prototype['delete'] = stackDelete; Stack.prototype.get = stackGet; Stack.prototype.has = stackHas; Stack.prototype.set = stackSet; module.exports = Stack; /***/ }), /***/ "./node_modules/lodash/_Symbol.js": /*!****************************************!*\ !*** ./node_modules/lodash/_Symbol.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /** Built-in value references. */ var Symbol = root.Symbol; module.exports = Symbol; /***/ }), /***/ "./node_modules/lodash/_Uint8Array.js": /*!********************************************!*\ !*** ./node_modules/lodash/_Uint8Array.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /** Built-in value references. */ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; /***/ }), /***/ "./node_modules/lodash/_WeakMap.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_WeakMap.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; /***/ }), /***/ "./node_modules/lodash/_arrayAggregator.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_arrayAggregator.js ***! \*************************************************/ /***/ ((module) => { /** * A specialized version of `baseAggregator` for arrays. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} setter The function to set `accumulator` values. * @param {Function} iteratee The iteratee to transform keys. * @param {Object} accumulator The initial aggregated object. * @returns {Function} Returns `accumulator`. */ function arrayAggregator(array, setter, iteratee, accumulator) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { var value = array[index]; setter(accumulator, value, iteratee(value), array); } return accumulator; } module.exports = arrayAggregator; /***/ }), /***/ "./node_modules/lodash/_arrayFilter.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_arrayFilter.js ***! \*********************************************/ /***/ ((module) => { /** * A specialized version of `_.filter` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result[resIndex++] = value; } } return result; } module.exports = arrayFilter; /***/ }), /***/ "./node_modules/lodash/_arrayIncludes.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_arrayIncludes.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ "./node_modules/lodash/_baseIndexOf.js"); /** * A specialized version of `_.includes` for arrays without support for * specifying an index to search from. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludes(array, value) { var length = array == null ? 0 : array.length; return !!length && baseIndexOf(array, value, 0) > -1; } module.exports = arrayIncludes; /***/ }), /***/ "./node_modules/lodash/_arrayIncludesWith.js": /*!***************************************************!*\ !*** ./node_modules/lodash/_arrayIncludesWith.js ***! \***************************************************/ /***/ ((module) => { /** * This function is like `arrayIncludes` except that it accepts a comparator. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @param {Function} comparator The comparator invoked per element. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludesWith(array, value, comparator) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (comparator(value, array[index])) { return true; } } return false; } module.exports = arrayIncludesWith; /***/ }), /***/ "./node_modules/lodash/_arrayLikeKeys.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_arrayLikeKeys.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseTimes = __webpack_require__(/*! ./_baseTimes */ "./node_modules/lodash/_baseTimes.js"), isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */ function arrayLikeKeys(value, inherited) { var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; for (var key in value) { if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode. key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers. (isBuff && (key == 'offset' || key == 'parent')) || // PhantomJS 2 has enumerable non-index properties on typed arrays. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || // Skip index properties. isIndex(key, length) ))) { result.push(key); } } return result; } module.exports = arrayLikeKeys; /***/ }), /***/ "./node_modules/lodash/_arrayMap.js": /*!******************************************!*\ !*** ./node_modules/lodash/_arrayMap.js ***! \******************************************/ /***/ ((module) => { /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } module.exports = arrayMap; /***/ }), /***/ "./node_modules/lodash/_arrayPush.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arrayPush.js ***! \*******************************************/ /***/ ((module) => { /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) { array[offset + index] = values[index]; } return array; } module.exports = arrayPush; /***/ }), /***/ "./node_modules/lodash/_arraySome.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arraySome.js ***! \*******************************************/ /***/ ((module) => { /** * A specialized version of `_.some` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. */ function arraySome(array, predicate) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (predicate(array[index], index, array)) { return true; } } return false; } module.exports = arraySome; /***/ }), /***/ "./node_modules/lodash/_assocIndexOf.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_assocIndexOf.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq(array[length][0], key)) { return length; } } return -1; } module.exports = assocIndexOf; /***/ }), /***/ "./node_modules/lodash/_baseAggregator.js": /*!************************************************!*\ !*** ./node_modules/lodash/_baseAggregator.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"); /** * Aggregates elements of `collection` on `accumulator` with keys transformed * by `iteratee` and values set by `setter`. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} setter The function to set `accumulator` values. * @param {Function} iteratee The iteratee to transform keys. * @param {Object} accumulator The initial aggregated object. * @returns {Function} Returns `accumulator`. */ function baseAggregator(collection, setter, iteratee, accumulator) { baseEach(collection, function(value, key, collection) { setter(accumulator, value, iteratee(value), collection); }); return accumulator; } module.exports = baseAggregator; /***/ }), /***/ "./node_modules/lodash/_baseAssignValue.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseAssignValue.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"); /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function baseAssignValue(object, key, value) { if (key == '__proto__' && defineProperty) { defineProperty(object, key, { 'configurable': true, 'enumerable': true, 'value': value, 'writable': true }); } else { object[key] = value; } } module.exports = baseAssignValue; /***/ }), /***/ "./node_modules/lodash/_baseEach.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseEach.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), createBaseEach = __webpack_require__(/*! ./_createBaseEach */ "./node_modules/lodash/_createBaseEach.js"); /** * The base implementation of `_.forEach` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array|Object} Returns `collection`. */ var baseEach = createBaseEach(baseForOwn); module.exports = baseEach; /***/ }), /***/ "./node_modules/lodash/_baseFindIndex.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_baseFindIndex.js ***! \***********************************************/ /***/ ((module) => { /** * The base implementation of `_.findIndex` and `_.findLastIndex` without * support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} predicate The function invoked per iteration. * @param {number} fromIndex The index to search from. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseFindIndex(array, predicate, fromIndex, fromRight) { var length = array.length, index = fromIndex + (fromRight ? 1 : -1); while ((fromRight ? index-- : ++index < length)) { if (predicate(array[index], index, array)) { return index; } } return -1; } module.exports = baseFindIndex; /***/ }), /***/ "./node_modules/lodash/_baseFor.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseFor.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var createBaseFor = __webpack_require__(/*! ./_createBaseFor */ "./node_modules/lodash/_createBaseFor.js"); /** * The base implementation of `baseForOwn` which iterates over `object` * properties returned by `keysFunc` and invokes `iteratee` for each property. * Iteratee functions may exit iteration early by explicitly returning `false`. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {Function} keysFunc The function to get the keys of `object`. * @returns {Object} Returns `object`. */ var baseFor = createBaseFor(); module.exports = baseFor; /***/ }), /***/ "./node_modules/lodash/_baseForOwn.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseForOwn.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** * The base implementation of `_.forOwn` without support for iteratee shorthands. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Object} Returns `object`. */ function baseForOwn(object, iteratee) { return object && baseFor(object, iteratee, keys); } module.exports = baseForOwn; /***/ }), /***/ "./node_modules/lodash/_baseGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseGet.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** * The base implementation of `_.get` without support for default values. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @returns {*} Returns the resolved value. */ function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return (index && index == length) ? object : undefined; } module.exports = baseGet; /***/ }), /***/ "./node_modules/lodash/_baseGetAllKeys.js": /*!************************************************!*\ !*** ./node_modules/lodash/_baseGetAllKeys.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** * The base implementation of `getAllKeys` and `getAllKeysIn` which uses * `keysFunc` and `symbolsFunc` to get the enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @param {Function} keysFunc The function to get the keys of `object`. * @param {Function} symbolsFunc The function to get the symbols of `object`. * @returns {Array} Returns the array of property names and symbols. */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } module.exports = baseGetAllKeys; /***/ }), /***/ "./node_modules/lodash/_baseGetTag.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseGetTag.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"), objectToString = __webpack_require__(/*! ./_objectToString */ "./node_modules/lodash/_objectToString.js"); /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag && symToStringTag in Object(value)) ? getRawTag(value) : objectToString(value); } module.exports = baseGetTag; /***/ }), /***/ "./node_modules/lodash/_baseHasIn.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseHasIn.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.hasIn` without support for deep paths. * * @private * @param {Object} [object] The object to query. * @param {Array|string} key The key to check. * @returns {boolean} Returns `true` if `key` exists, else `false`. */ function baseHasIn(object, key) { return object != null && key in Object(object); } module.exports = baseHasIn; /***/ }), /***/ "./node_modules/lodash/_baseIndexOf.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIndexOf.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ "./node_modules/lodash/_baseIsNaN.js"), strictIndexOf = __webpack_require__(/*! ./_strictIndexOf */ "./node_modules/lodash/_strictIndexOf.js"); /** * The base implementation of `_.indexOf` without `fromIndex` bounds checks. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseIndexOf(array, value, fromIndex) { return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); } module.exports = baseIndexOf; /***/ }), /***/ "./node_modules/lodash/_baseIsArguments.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsArguments.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** `Object#toString` result references. */ var argsTag = '[object Arguments]'; /** * The base implementation of `_.isArguments`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, */ function baseIsArguments(value) { return isObjectLike(value) && baseGetTag(value) == argsTag; } module.exports = baseIsArguments; /***/ }), /***/ "./node_modules/lodash/_baseIsEqual.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsEqual.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ "./node_modules/lodash/_baseIsEqualDeep.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** * The base implementation of `_.isEqual` which supports partial comparisons * and tracks traversed objects. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @param {boolean} bitmask The bitmask flags. * 1 - Unordered comparison * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { return value !== value && other !== other; } return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } module.exports = baseIsEqual; /***/ }), /***/ "./node_modules/lodash/_baseIsEqualDeep.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsEqualDeep.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), equalByTag = __webpack_require__(/*! ./_equalByTag */ "./node_modules/lodash/_equalByTag.js"), equalObjects = __webpack_require__(/*! ./_equalObjects */ "./node_modules/lodash/_equalObjects.js"), getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', objectTag = '[object Object]'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqual` for arrays and objects which performs * deep comparisons and tracks traversed objects enabling objects with circular * references to be compared. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); objTag = objTag == argsTag ? objectTag : objTag; othTag = othTag == argsTag ? objectTag : othTag; var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; if (isSameTag && isBuffer(object)) { if (!isBuffer(other)) { return false; } objIsArr = true; objIsObj = false; } if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } if (!(bitmask & COMPARE_PARTIAL_FLAG)) { var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); if (objIsWrapped || othIsWrapped) { var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack); return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) { return false; } stack || (stack = new Stack); return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } module.exports = baseIsEqualDeep; /***/ }), /***/ "./node_modules/lodash/_baseIsMatch.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsMatch.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.isMatch` without support for iteratee shorthands. * * @private * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. * @param {Array} matchData The property names, values, and compare flags to match. * @param {Function} [customizer] The function to customize comparisons. * @returns {boolean} Returns `true` if `object` is a match, else `false`. */ function baseIsMatch(object, source, matchData, customizer) { var index = matchData.length, length = index, noCustomizer = !customizer; if (object == null) { return !length; } object = Object(object); while (index--) { var data = matchData[index]; if ((noCustomizer && data[2]) ? data[1] !== object[data[0]] : !(data[0] in object) ) { return false; } } while (++index < length) { data = matchData[index]; var key = data[0], objValue = object[key], srcValue = data[1]; if (noCustomizer && data[2]) { if (objValue === undefined && !(key in object)) { return false; } } else { var stack = new Stack; if (customizer) { var result = customizer(objValue, srcValue, key, object, source, stack); } if (!(result === undefined ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result )) { return false; } } } return true; } module.exports = baseIsMatch; /***/ }), /***/ "./node_modules/lodash/_baseIsNaN.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseIsNaN.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.isNaN` without support for number objects. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. */ function baseIsNaN(value) { return value !== value; } module.exports = baseIsNaN; /***/ }), /***/ "./node_modules/lodash/_baseIsNative.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseIsNative.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), isMasked = __webpack_require__(/*! ./_isMasked */ "./node_modules/lodash/_isMasked.js"), isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used for built-in method references. */ var funcProto = Function.prototype, objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject(value) || isMasked(value)) { return false; } var pattern = isFunction(value) ? reIsNative : reIsHostCtor; return pattern.test(toSource(value)); } module.exports = baseIsNative; /***/ }), /***/ "./node_modules/lodash/_baseIsTypedArray.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_baseIsTypedArray.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', weakMapTag = '[object WeakMap]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** Used to identify `toStringTag` values of typed arrays. */ var typedArrayTags = {}; typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; /** * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ function baseIsTypedArray(value) { return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; } module.exports = baseIsTypedArray; /***/ }), /***/ "./node_modules/lodash/_baseIteratee.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseIteratee.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseMatches = __webpack_require__(/*! ./_baseMatches */ "./node_modules/lodash/_baseMatches.js"), baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ "./node_modules/lodash/_baseMatchesProperty.js"), identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), property = __webpack_require__(/*! ./property */ "./node_modules/lodash/property.js"); /** * The base implementation of `_.iteratee`. * * @private * @param {*} [value=_.identity] The value to convert to an iteratee. * @returns {Function} Returns the iteratee. */ function baseIteratee(value) { // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. if (typeof value == 'function') { return value; } if (value == null) { return identity; } if (typeof value == 'object') { return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); } return property(value); } module.exports = baseIteratee; /***/ }), /***/ "./node_modules/lodash/_baseKeys.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseKeys.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), nativeKeys = __webpack_require__(/*! ./_nativeKeys */ "./node_modules/lodash/_nativeKeys.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeys(object) { if (!isPrototype(object)) { return nativeKeys(object); } var result = []; for (var key in Object(object)) { if (hasOwnProperty.call(object, key) && key != 'constructor') { result.push(key); } } return result; } module.exports = baseKeys; /***/ }), /***/ "./node_modules/lodash/_baseMatches.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseMatches.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ "./node_modules/lodash/_baseIsMatch.js"), getMatchData = __webpack_require__(/*! ./_getMatchData */ "./node_modules/lodash/_getMatchData.js"), matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"); /** * The base implementation of `_.matches` which doesn't clone `source`. * * @private * @param {Object} source The object of property values to match. * @returns {Function} Returns the new spec function. */ function baseMatches(source) { var matchData = getMatchData(source); if (matchData.length == 1 && matchData[0][2]) { return matchesStrictComparable(matchData[0][0], matchData[0][1]); } return function(object) { return object === source || baseIsMatch(object, source, matchData); }; } module.exports = baseMatches; /***/ }), /***/ "./node_modules/lodash/_baseMatchesProperty.js": /*!*****************************************************!*\ !*** ./node_modules/lodash/_baseMatchesProperty.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"), get = __webpack_require__(/*! ./get */ "./node_modules/lodash/get.js"), hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"), isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. * * @private * @param {string} path The path of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function baseMatchesProperty(path, srcValue) { if (isKey(path) && isStrictComparable(srcValue)) { return matchesStrictComparable(toKey(path), srcValue); } return function(object) { var objValue = get(object, path); return (objValue === undefined && objValue === srcValue) ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); }; } module.exports = baseMatchesProperty; /***/ }), /***/ "./node_modules/lodash/_baseProperty.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseProperty.js ***! \**********************************************/ /***/ ((module) => { /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new accessor function. */ function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; } module.exports = baseProperty; /***/ }), /***/ "./node_modules/lodash/_basePropertyDeep.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_basePropertyDeep.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); /** * A specialized version of `baseProperty` which supports deep paths. * * @private * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. */ function basePropertyDeep(path) { return function(object) { return baseGet(object, path); }; } module.exports = basePropertyDeep; /***/ }), /***/ "./node_modules/lodash/_baseTimes.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseTimes.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */ function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) { result[index] = iteratee(index); } return result; } module.exports = baseTimes; /***/ }), /***/ "./node_modules/lodash/_baseToString.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseToString.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString) + ''; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = baseToString; /***/ }), /***/ "./node_modules/lodash/_baseUnary.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseUnary.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary(func) { return function(value) { return func(value); }; } module.exports = baseUnary; /***/ }), /***/ "./node_modules/lodash/_baseUniq.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseUniq.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ "./node_modules/lodash/_arrayIncludes.js"), arrayIncludesWith = __webpack_require__(/*! ./_arrayIncludesWith */ "./node_modules/lodash/_arrayIncludesWith.js"), cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"), createSet = __webpack_require__(/*! ./_createSet */ "./node_modules/lodash/_createSet.js"), setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * The base implementation of `_.uniqBy` without support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new duplicate free array. */ function baseUniq(array, iteratee, comparator) { var index = -1, includes = arrayIncludes, length = array.length, isCommon = true, result = [], seen = result; if (comparator) { isCommon = false; includes = arrayIncludesWith; } else if (length >= LARGE_ARRAY_SIZE) { var set = iteratee ? null : createSet(array); if (set) { return setToArray(set); } isCommon = false; includes = cacheHas; seen = new SetCache; } else { seen = iteratee ? [] : result; } outer: while (++index < length) { var value = array[index], computed = iteratee ? iteratee(value) : value; value = (comparator || value !== 0) ? value : 0; if (isCommon && computed === computed) { var seenIndex = seen.length; while (seenIndex--) { if (seen[seenIndex] === computed) { continue outer; } } if (iteratee) { seen.push(computed); } result.push(value); } else if (!includes(seen, computed, comparator)) { if (seen !== result) { seen.push(computed); } result.push(value); } } return result; } module.exports = baseUniq; /***/ }), /***/ "./node_modules/lodash/_cacheHas.js": /*!******************************************!*\ !*** ./node_modules/lodash/_cacheHas.js ***! \******************************************/ /***/ ((module) => { /** * Checks if a `cache` value for `key` exists. * * @private * @param {Object} cache The cache to query. * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function cacheHas(cache, key) { return cache.has(key); } module.exports = cacheHas; /***/ }), /***/ "./node_modules/lodash/_castPath.js": /*!******************************************!*\ !*** ./node_modules/lodash/_castPath.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), stringToPath = __webpack_require__(/*! ./_stringToPath */ "./node_modules/lodash/_stringToPath.js"), toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); /** * Casts `value` to a path array if it's not one. * * @private * @param {*} value The value to inspect. * @param {Object} [object] The object to query keys on. * @returns {Array} Returns the cast property path array. */ function castPath(value, object) { if (isArray(value)) { return value; } return isKey(value, object) ? [value] : stringToPath(toString(value)); } module.exports = castPath; /***/ }), /***/ "./node_modules/lodash/_coreJsData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_coreJsData.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /** Used to detect overreaching core-js shims. */ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; /***/ }), /***/ "./node_modules/lodash/_createAggregator.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_createAggregator.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayAggregator = __webpack_require__(/*! ./_arrayAggregator */ "./node_modules/lodash/_arrayAggregator.js"), baseAggregator = __webpack_require__(/*! ./_baseAggregator */ "./node_modules/lodash/_baseAggregator.js"), baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** * Creates a function like `_.groupBy`. * * @private * @param {Function} setter The function to set accumulator values. * @param {Function} [initializer] The accumulator object initializer. * @returns {Function} Returns the new aggregator function. */ function createAggregator(setter, initializer) { return function(collection, iteratee) { var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {}; return func(collection, setter, baseIteratee(iteratee, 2), accumulator); }; } module.exports = createAggregator; /***/ }), /***/ "./node_modules/lodash/_createBaseEach.js": /*!************************************************!*\ !*** ./node_modules/lodash/_createBaseEach.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** * Creates a `baseEach` or `baseEachRight` function. * * @private * @param {Function} eachFunc The function to iterate over a collection. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseEach(eachFunc, fromRight) { return function(collection, iteratee) { if (collection == null) { return collection; } if (!isArrayLike(collection)) { return eachFunc(collection, iteratee); } var length = collection.length, index = fromRight ? length : -1, iterable = Object(collection); while ((fromRight ? index-- : ++index < length)) { if (iteratee(iterable[index], index, iterable) === false) { break; } } return collection; }; } module.exports = createBaseEach; /***/ }), /***/ "./node_modules/lodash/_createBaseFor.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_createBaseFor.js ***! \***********************************************/ /***/ ((module) => { /** * Creates a base function for methods like `_.forIn` and `_.forOwn`. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseFor(fromRight) { return function(object, iteratee, keysFunc) { var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; while (length--) { var key = props[fromRight ? length : ++index]; if (iteratee(iterable[key], key, iterable) === false) { break; } } return object; }; } module.exports = createBaseFor; /***/ }), /***/ "./node_modules/lodash/_createSet.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_createSet.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), noop = __webpack_require__(/*! ./noop */ "./node_modules/lodash/noop.js"), setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * Creates a set object of `values`. * * @private * @param {Array} values The values to add to the set. * @returns {Object} Returns the new set. */ var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { return new Set(values); }; module.exports = createSet; /***/ }), /***/ "./node_modules/lodash/_defineProperty.js": /*!************************************************!*\ !*** ./node_modules/lodash/_defineProperty.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); var defineProperty = (function() { try { var func = getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); module.exports = defineProperty; /***/ }), /***/ "./node_modules/lodash/_equalArrays.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_equalArrays.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), arraySome = __webpack_require__(/*! ./_arraySome */ "./node_modules/lodash/_arraySome.js"), cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * A specialized version of `baseIsEqualDeep` for arrays with support for * partial deep comparisons. * * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; if (arrLength != othLength && !(isPartial && othLength > arrLength)) { return false; } // Check that cyclic values are equal. var arrStacked = stack.get(array); var othStacked = stack.get(other); if (arrStacked && othStacked) { return arrStacked == other && othStacked == array; } var index = -1, result = true, seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; stack.set(array, other); stack.set(other, array); // Ignore non-index properties. while (++index < arrLength) { var arrValue = array[index], othValue = other[index]; if (customizer) { var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); } if (compared !== undefined) { if (compared) { continue; } result = false; break; } // Recursively compare arrays (susceptible to call stack limits). if (seen) { if (!arraySome(other, function(othValue, othIndex) { if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { return seen.push(othIndex); } })) { result = false; break; } } else if (!( arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack) )) { result = false; break; } } stack['delete'](array); stack['delete'](other); return result; } module.exports = equalArrays; /***/ }), /***/ "./node_modules/lodash/_equalByTag.js": /*!********************************************!*\ !*** ./node_modules/lodash/_equalByTag.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"), eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), mapToArray = __webpack_require__(/*! ./_mapToArray */ "./node_modules/lodash/_mapToArray.js"), setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** `Object#toString` result references. */ var boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', mapTag = '[object Map]', numberTag = '[object Number]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]'; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; /** * A specialized version of `baseIsEqualDeep` for comparing objects of * the same `toStringTag`. * * **Note:** This function only supports comparing values with tags of * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { case dataViewTag: if ((object.byteLength != other.byteLength) || (object.byteOffset != other.byteOffset)) { return false; } object = object.buffer; other = other.buffer; case arrayBufferTag: if ((object.byteLength != other.byteLength) || !equalFunc(new Uint8Array(object), new Uint8Array(other))) { return false; } return true; case boolTag: case dateTag: case numberTag: // Coerce booleans to `1` or `0` and dates to milliseconds. // Invalid dates are coerced to `NaN`. return eq(+object, +other); case errorTag: return object.name == other.name && object.message == other.message; case regexpTag: case stringTag: // Coerce regexes to strings and treat strings, primitives and objects, // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring // for more details. return object == (other + ''); case mapTag: var convert = mapToArray; case setTag: var isPartial = bitmask & COMPARE_PARTIAL_FLAG; convert || (convert = setToArray); if (object.size != other.size && !isPartial) { return false; } // Assume cyclic values are equal. var stacked = stack.get(object); if (stacked) { return stacked == other; } bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). stack.set(object, other); var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack['delete'](object); return result; case symbolTag: if (symbolValueOf) { return symbolValueOf.call(object) == symbolValueOf.call(other); } } return false; } module.exports = equalByTag; /***/ }), /***/ "./node_modules/lodash/_equalObjects.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_equalObjects.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqualDeep` for objects with support for * partial deep comparisons. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; if (objLength != othLength && !isPartial) { return false; } var index = objLength; while (index--) { var key = objProps[index]; if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { return false; } } // Check that cyclic values are equal. var objStacked = stack.get(object); var othStacked = stack.get(other); if (objStacked && othStacked) { return objStacked == other && othStacked == object; } var result = true; stack.set(object, other); stack.set(other, object); var skipCtor = isPartial; while (++index < objLength) { key = objProps[index]; var objValue = object[key], othValue = other[key]; if (customizer) { var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); } // Recursively compare objects (susceptible to call stack limits). if (!(compared === undefined ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) : compared )) { result = false; break; } skipCtor || (skipCtor = key == 'constructor'); } if (result && !skipCtor) { var objCtor = object.constructor, othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal. if (objCtor != othCtor && ('constructor' in object && 'constructor' in other) && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) { result = false; } } stack['delete'](object); stack['delete'](other); return result; } module.exports = equalObjects; /***/ }), /***/ "./node_modules/lodash/_freeGlobal.js": /*!********************************************!*\ !*** ./node_modules/lodash/_freeGlobal.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; module.exports = freeGlobal; /***/ }), /***/ "./node_modules/lodash/_getAllKeys.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getAllKeys.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** * Creates an array of own enumerable property names and symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeys(object) { return baseGetAllKeys(object, keys, getSymbols); } module.exports = getAllKeys; /***/ }), /***/ "./node_modules/lodash/_getMapData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getMapData.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isKeyable = __webpack_require__(/*! ./_isKeyable */ "./node_modules/lodash/_isKeyable.js"); /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; } module.exports = getMapData; /***/ }), /***/ "./node_modules/lodash/_getMatchData.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_getMatchData.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** * Gets the property names, values, and compare flags of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the match data of `object`. */ function getMatchData(object) { var result = keys(object), length = result.length; while (length--) { var key = result[length], value = object[key]; result[length] = [key, value, isStrictComparable(value)]; } return result; } module.exports = getMatchData; /***/ }), /***/ "./node_modules/lodash/_getNative.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_getNative.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsNative = __webpack_require__(/*! ./_baseIsNative */ "./node_modules/lodash/_baseIsNative.js"), getValue = __webpack_require__(/*! ./_getValue */ "./node_modules/lodash/_getValue.js"); /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : undefined; } module.exports = getNative; /***/ }), /***/ "./node_modules/lodash/_getRawTag.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_getRawTag.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } module.exports = getRawTag; /***/ }), /***/ "./node_modules/lodash/_getSymbols.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getSymbols.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeGetSymbols = Object.getOwnPropertySymbols; /** * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { if (object == null) { return []; } object = Object(object); return arrayFilter(nativeGetSymbols(object), function(symbol) { return propertyIsEnumerable.call(object, symbol); }); }; module.exports = getSymbols; /***/ }), /***/ "./node_modules/lodash/_getTag.js": /*!****************************************!*\ !*** ./node_modules/lodash/_getTag.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var DataView = __webpack_require__(/*! ./_DataView */ "./node_modules/lodash/_DataView.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), Promise = __webpack_require__(/*! ./_Promise */ "./node_modules/lodash/_Promise.js"), Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), WeakMap = __webpack_require__(/*! ./_WeakMap */ "./node_modules/lodash/_WeakMap.js"), baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); /** `Object#toString` result references. */ var mapTag = '[object Map]', objectTag = '[object Object]', promiseTag = '[object Promise]', setTag = '[object Set]', weakMapTag = '[object WeakMap]'; var dataViewTag = '[object DataView]'; /** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap); /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || (Map && getTag(new Map) != mapTag) || (Promise && getTag(Promise.resolve()) != promiseTag) || (Set && getTag(new Set) != setTag) || (WeakMap && getTag(new WeakMap) != weakMapTag)) { getTag = function(value) { var result = baseGetTag(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : ''; if (ctorString) { switch (ctorString) { case dataViewCtorString: return dataViewTag; case mapCtorString: return mapTag; case promiseCtorString: return promiseTag; case setCtorString: return setTag; case weakMapCtorString: return weakMapTag; } } return result; }; } module.exports = getTag; /***/ }), /***/ "./node_modules/lodash/_getValue.js": /*!******************************************!*\ !*** ./node_modules/lodash/_getValue.js ***! \******************************************/ /***/ ((module) => { /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue(object, key) { return object == null ? undefined : object[key]; } module.exports = getValue; /***/ }), /***/ "./node_modules/lodash/_hasPath.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hasPath.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** * Checks if `path` exists on `object`. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @param {Function} hasFunc The function to check properties. * @returns {boolean} Returns `true` if `path` exists, else `false`. */ function hasPath(object, path, hasFunc) { path = castPath(path, object); var index = -1, length = path.length, result = false; while (++index < length) { var key = toKey(path[index]); if (!(result = object != null && hasFunc(object, key))) { break; } object = object[key]; } if (result || ++index != length) { return result; } length = object == null ? 0 : object.length; return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); } module.exports = hasPath; /***/ }), /***/ "./node_modules/lodash/_hashClear.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_hashClear.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } module.exports = hashClear; /***/ }), /***/ "./node_modules/lodash/_hashDelete.js": /*!********************************************!*\ !*** ./node_modules/lodash/_hashDelete.js ***! \********************************************/ /***/ ((module) => { /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } module.exports = hashDelete; /***/ }), /***/ "./node_modules/lodash/_hashGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashGet.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED ? undefined : result; } return hasOwnProperty.call(data, key) ? data[key] : undefined; } module.exports = hashGet; /***/ }), /***/ "./node_modules/lodash/_hashHas.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashHas.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); } module.exports = hashHas; /***/ }), /***/ "./node_modules/lodash/_hashSet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashSet.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; return this; } module.exports = hashSet; /***/ }), /***/ "./node_modules/lodash/_isIndex.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_isIndex.js ***! \*****************************************/ /***/ ((module) => { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { var type = typeof value; length = length == null ? MAX_SAFE_INTEGER : length; return !!length && (type == 'number' || (type != 'symbol' && reIsUint.test(value))) && (value > -1 && value % 1 == 0 && value < length); } module.exports = isIndex; /***/ }), /***/ "./node_modules/lodash/_isKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_isKey.js ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** Used to match property names within property paths. */ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/; /** * Checks if `value` is a property name and not a property path. * * @private * @param {*} value The value to check. * @param {Object} [object] The object to query keys on. * @returns {boolean} Returns `true` if `value` is a property name, else `false`. */ function isKey(value, object) { if (isArray(value)) { return false; } var type = typeof value; if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object)); } module.exports = isKey; /***/ }), /***/ "./node_modules/lodash/_isKeyable.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_isKeyable.js ***! \*******************************************/ /***/ ((module) => { /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } module.exports = isKeyable; /***/ }), /***/ "./node_modules/lodash/_isMasked.js": /*!******************************************!*\ !*** ./node_modules/lodash/_isMasked.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var coreJsData = __webpack_require__(/*! ./_coreJsData */ "./node_modules/lodash/_coreJsData.js"); /** Used to detect methods masquerading as native. */ var maskSrcKey = (function() { var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); return uid ? ('Symbol(src)_1.' + uid) : ''; }()); /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && (maskSrcKey in func); } module.exports = isMasked; /***/ }), /***/ "./node_modules/lodash/_isPrototype.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_isPrototype.js ***! \*********************************************/ /***/ ((module) => { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */ function isPrototype(value) { var Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; return value === proto; } module.exports = isPrototype; /***/ }), /***/ "./node_modules/lodash/_isStrictComparable.js": /*!****************************************************!*\ !*** ./node_modules/lodash/_isStrictComparable.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); /** * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` if suitable for strict * equality comparisons, else `false`. */ function isStrictComparable(value) { return value === value && !isObject(value); } module.exports = isStrictComparable; /***/ }), /***/ "./node_modules/lodash/_listCacheClear.js": /*!************************************************!*\ !*** ./node_modules/lodash/_listCacheClear.js ***! \************************************************/ /***/ ((module) => { /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } module.exports = listCacheClear; /***/ }), /***/ "./node_modules/lodash/_listCacheDelete.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_listCacheDelete.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } module.exports = listCacheDelete; /***/ }), /***/ "./node_modules/lodash/_listCacheGet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheGet.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? undefined : data[index][1]; } module.exports = listCacheGet; /***/ }), /***/ "./node_modules/lodash/_listCacheHas.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheHas.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } module.exports = listCacheHas; /***/ }), /***/ "./node_modules/lodash/_listCacheSet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheSet.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } module.exports = listCacheSet; /***/ }), /***/ "./node_modules/lodash/_mapCacheClear.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_mapCacheClear.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Hash = __webpack_require__(/*! ./_Hash */ "./node_modules/lodash/_Hash.js"), ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"); /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { 'hash': new Hash, 'map': new (Map || ListCache), 'string': new Hash }; } module.exports = mapCacheClear; /***/ }), /***/ "./node_modules/lodash/_mapCacheDelete.js": /*!************************************************!*\ !*** ./node_modules/lodash/_mapCacheDelete.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = getMapData(this, key)['delete'](key); this.size -= result ? 1 : 0; return result; } module.exports = mapCacheDelete; /***/ }), /***/ "./node_modules/lodash/_mapCacheGet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheGet.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return getMapData(this, key).get(key); } module.exports = mapCacheGet; /***/ }), /***/ "./node_modules/lodash/_mapCacheHas.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheHas.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return getMapData(this, key).has(key); } module.exports = mapCacheHas; /***/ }), /***/ "./node_modules/lodash/_mapCacheSet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheSet.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } module.exports = mapCacheSet; /***/ }), /***/ "./node_modules/lodash/_mapToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_mapToArray.js ***! \********************************************/ /***/ ((module) => { /** * Converts `map` to its key-value pairs. * * @private * @param {Object} map The map to convert. * @returns {Array} Returns the key-value pairs. */ function mapToArray(map) { var index = -1, result = Array(map.size); map.forEach(function(value, key) { result[++index] = [key, value]; }); return result; } module.exports = mapToArray; /***/ }), /***/ "./node_modules/lodash/_matchesStrictComparable.js": /*!*********************************************************!*\ !*** ./node_modules/lodash/_matchesStrictComparable.js ***! \*********************************************************/ /***/ ((module) => { /** * A specialized version of `matchesProperty` for source values suitable * for strict equality comparisons, i.e. `===`. * * @private * @param {string} key The key of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function matchesStrictComparable(key, srcValue) { return function(object) { if (object == null) { return false; } return object[key] === srcValue && (srcValue !== undefined || (key in Object(object))); }; } module.exports = matchesStrictComparable; /***/ }), /***/ "./node_modules/lodash/_memoizeCapped.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_memoizeCapped.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var memoize = __webpack_require__(/*! ./memoize */ "./node_modules/lodash/memoize.js"); /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** * A specialized version of `_.memoize` which clears the memoized function's * cache when it exceeds `MAX_MEMOIZE_SIZE`. * * @private * @param {Function} func The function to have its output memoized. * @returns {Function} Returns the new memoized function. */ function memoizeCapped(func) { var result = memoize(func, function(key) { if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); var cache = result.cache; return result; } module.exports = memoizeCapped; /***/ }), /***/ "./node_modules/lodash/_nativeCreate.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_nativeCreate.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); /* Built-in method references that are verified to be native. */ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; /***/ }), /***/ "./node_modules/lodash/_nativeKeys.js": /*!********************************************!*\ !*** ./node_modules/lodash/_nativeKeys.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeKeys = overArg(Object.keys, Object); module.exports = nativeKeys; /***/ }), /***/ "./node_modules/lodash/_nodeUtil.js": /*!******************************************!*\ !*** ./node_modules/lodash/_nodeUtil.js ***! \******************************************/ /***/ ((module, exports, __webpack_require__) => { /* module decorator */ module = __webpack_require__.nmd(module); var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); /** Detect free variable `exports`. */ var freeExports = true && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Detect free variable `process` from Node.js. */ var freeProcess = moduleExports && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { // Use `util.types` for Node.js 10+. var types = freeModule && freeModule.require && freeModule.require('util').types; if (types) { return types; } // Legacy `process.binding('util')` for Node.js < 10. return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); module.exports = nodeUtil; /***/ }), /***/ "./node_modules/lodash/_objectToString.js": /*!************************************************!*\ !*** ./node_modules/lodash/_objectToString.js ***! \************************************************/ /***/ ((module) => { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } module.exports = objectToString; /***/ }), /***/ "./node_modules/lodash/_overArg.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_overArg.js ***! \*****************************************/ /***/ ((module) => { /** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */ function overArg(func, transform) { return function(arg) { return func(transform(arg)); }; } module.exports = overArg; /***/ }), /***/ "./node_modules/lodash/_root.js": /*!**************************************!*\ !*** ./node_modules/lodash/_root.js ***! \**************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; /***/ }), /***/ "./node_modules/lodash/_setCacheAdd.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_setCacheAdd.js ***! \*********************************************/ /***/ ((module) => { /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Adds `value` to the array cache. * * @private * @name add * @memberOf SetCache * @alias push * @param {*} value The value to cache. * @returns {Object} Returns the cache instance. */ function setCacheAdd(value) { this.__data__.set(value, HASH_UNDEFINED); return this; } module.exports = setCacheAdd; /***/ }), /***/ "./node_modules/lodash/_setCacheHas.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_setCacheHas.js ***! \*********************************************/ /***/ ((module) => { /** * Checks if `value` is in the array cache. * * @private * @name has * @memberOf SetCache * @param {*} value The value to search for. * @returns {number} Returns `true` if `value` is found, else `false`. */ function setCacheHas(value) { return this.__data__.has(value); } module.exports = setCacheHas; /***/ }), /***/ "./node_modules/lodash/_setToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_setToArray.js ***! \********************************************/ /***/ ((module) => { /** * Converts `set` to an array of its values. * * @private * @param {Object} set The set to convert. * @returns {Array} Returns the values. */ function setToArray(set) { var index = -1, result = Array(set.size); set.forEach(function(value) { result[++index] = value; }); return result; } module.exports = setToArray; /***/ }), /***/ "./node_modules/lodash/_stackClear.js": /*!********************************************!*\ !*** ./node_modules/lodash/_stackClear.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"); /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache; this.size = 0; } module.exports = stackClear; /***/ }), /***/ "./node_modules/lodash/_stackDelete.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_stackDelete.js ***! \*********************************************/ /***/ ((module) => { /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data['delete'](key); this.size = data.size; return result; } module.exports = stackDelete; /***/ }), /***/ "./node_modules/lodash/_stackGet.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackGet.js ***! \******************************************/ /***/ ((module) => { /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } module.exports = stackGet; /***/ }), /***/ "./node_modules/lodash/_stackHas.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackHas.js ***! \******************************************/ /***/ ((module) => { /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } module.exports = stackHas; /***/ }), /***/ "./node_modules/lodash/_stackSet.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackSet.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof ListCache) { var pairs = data.__data__; if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } module.exports = stackSet; /***/ }), /***/ "./node_modules/lodash/_strictIndexOf.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_strictIndexOf.js ***! \***********************************************/ /***/ ((module) => { /** * A specialized version of `_.indexOf` which performs strict equality * comparisons of values, i.e. `===`. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function strictIndexOf(array, value, fromIndex) { var index = fromIndex - 1, length = array.length; while (++index < length) { if (array[index] === value) { return index; } } return -1; } module.exports = strictIndexOf; /***/ }), /***/ "./node_modules/lodash/_stringToPath.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_stringToPath.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ "./node_modules/lodash/_memoizeCapped.js"); /** Used to match property names within property paths. */ var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; /** Used to match backslashes in property paths. */ var reEscapeChar = /\\(\\)?/g; /** * Converts `string` to a property path array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the property path array. */ var stringToPath = memoizeCapped(function(string) { var result = []; if (string.charCodeAt(0) === 46 /* . */) { result.push(''); } string.replace(rePropName, function(match, number, quote, subString) { result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); }); return result; }); module.exports = stringToPath; /***/ }), /***/ "./node_modules/lodash/_toKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_toKey.js ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * Converts `value` to a string key if it's not a string or symbol. * * @private * @param {*} value The value to inspect. * @returns {string|symbol} Returns the key. */ function toKey(value) { if (typeof value == 'string' || isSymbol(value)) { return value; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = toKey; /***/ }), /***/ "./node_modules/lodash/_toSource.js": /*!******************************************!*\ !*** ./node_modules/lodash/_toSource.js ***! \******************************************/ /***/ ((module) => { /** Used for built-in method references. */ var funcProto = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString.call(func); } catch (e) {} try { return (func + ''); } catch (e) {} } return ''; } module.exports = toSource; /***/ }), /***/ "./node_modules/lodash/eq.js": /*!***********************************!*\ !*** ./node_modules/lodash/eq.js ***! \***********************************/ /***/ ((module) => { /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || (value !== value && other !== other); } module.exports = eq; /***/ }), /***/ "./node_modules/lodash/get.js": /*!************************************!*\ !*** ./node_modules/lodash/get.js ***! \************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); /** * Gets the value at `path` of `object`. If the resolved value is * `undefined`, the `defaultValue` is returned in its place. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @param {*} [defaultValue] The value returned for `undefined` resolved values. * @returns {*} Returns the resolved value. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.get(object, 'a[0].b.c'); * // => 3 * * _.get(object, ['a', '0', 'b', 'c']); * // => 3 * * _.get(object, 'a.b.c', 'default'); * // => 'default' */ function get(object, path, defaultValue) { var result = object == null ? undefined : baseGet(object, path); return result === undefined ? defaultValue : result; } module.exports = get; /***/ }), /***/ "./node_modules/lodash/groupBy.js": /*!****************************************!*\ !*** ./node_modules/lodash/groupBy.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), createAggregator = __webpack_require__(/*! ./_createAggregator */ "./node_modules/lodash/_createAggregator.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Creates an object composed of keys generated from the results of running * each element of `collection` thru `iteratee`. The order of grouped values * is determined by the order they occur in `collection`. The corresponding * value of each key is an array of elements responsible for generating the * key. The iteratee is invoked with one argument: (value). * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The iteratee to transform keys. * @returns {Object} Returns the composed aggregate object. * @example * * _.groupBy([6.1, 4.2, 6.3], Math.floor); * // => { '4': [4.2], '6': [6.1, 6.3] } * * // The `_.property` iteratee shorthand. * _.groupBy(['one', 'two', 'three'], 'length'); * // => { '3': ['one', 'two'], '5': ['three'] } */ var groupBy = createAggregator(function(result, value, key) { if (hasOwnProperty.call(result, key)) { result[key].push(value); } else { baseAssignValue(result, key, [value]); } }); module.exports = groupBy; /***/ }), /***/ "./node_modules/lodash/hasIn.js": /*!**************************************!*\ !*** ./node_modules/lodash/hasIn.js ***! \**************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseHasIn = __webpack_require__(/*! ./_baseHasIn */ "./node_modules/lodash/_baseHasIn.js"), hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); /** * Checks if `path` is a direct or inherited property of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * * var object = _.create({ 'a': _.create({ 'b': 2 }) }); * * _.hasIn(object, 'a'); * // => true * * _.hasIn(object, 'a.b'); * // => true * * _.hasIn(object, ['a', 'b']); * // => true * * _.hasIn(object, 'b'); * // => false */ function hasIn(object, path) { return object != null && hasPath(object, path, baseHasIn); } module.exports = hasIn; /***/ }), /***/ "./node_modules/lodash/identity.js": /*!*****************************************!*\ !*** ./node_modules/lodash/identity.js ***! \*****************************************/ /***/ ((module) => { /** * This method returns the first argument it receives. * * @static * @since 0.1.0 * @memberOf _ * @category Util * @param {*} value Any value. * @returns {*} Returns `value`. * @example * * var object = { 'a': 1 }; * * console.log(_.identity(object) === object); * // => true */ function identity(value) { return value; } module.exports = identity; /***/ }), /***/ "./node_modules/lodash/isArguments.js": /*!********************************************!*\ !*** ./node_modules/lodash/isArguments.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ "./node_modules/lodash/_baseIsArguments.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); }; module.exports = isArguments; /***/ }), /***/ "./node_modules/lodash/isArray.js": /*!****************************************!*\ !*** ./node_modules/lodash/isArray.js ***! \****************************************/ /***/ ((module) => { /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; module.exports = isArray; /***/ }), /***/ "./node_modules/lodash/isArrayLike.js": /*!********************************************!*\ !*** ./node_modules/lodash/isArrayLike.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"); /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } module.exports = isArrayLike; /***/ }), /***/ "./node_modules/lodash/isBuffer.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isBuffer.js ***! \*****************************************/ /***/ ((module, exports, __webpack_require__) => { /* module decorator */ module = __webpack_require__.nmd(module); var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"), stubFalse = __webpack_require__(/*! ./stubFalse */ "./node_modules/lodash/stubFalse.js"); /** Detect free variable `exports`. */ var freeExports = true && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Built-in value references. */ var Buffer = moduleExports ? root.Buffer : undefined; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; /** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */ var isBuffer = nativeIsBuffer || stubFalse; module.exports = isBuffer; /***/ }), /***/ "./node_modules/lodash/isFunction.js": /*!*******************************************!*\ !*** ./node_modules/lodash/isFunction.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); /** `Object#toString` result references. */ var asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', proxyTag = '[object Proxy]'; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject(value)) { return false; } // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 9 which returns 'object' for typed arrays and other constructors. var tag = baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } module.exports = isFunction; /***/ }), /***/ "./node_modules/lodash/isLength.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isLength.js ***! \*****************************************/ /***/ ((module) => { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } module.exports = isLength; /***/ }), /***/ "./node_modules/lodash/isObject.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isObject.js ***! \*****************************************/ /***/ ((module) => { /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } module.exports = isObject; /***/ }), /***/ "./node_modules/lodash/isObjectLike.js": /*!*********************************************!*\ !*** ./node_modules/lodash/isObjectLike.js ***! \*********************************************/ /***/ ((module) => { /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == 'object'; } module.exports = isObjectLike; /***/ }), /***/ "./node_modules/lodash/isSymbol.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isSymbol.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag); } module.exports = isSymbol; /***/ }), /***/ "./node_modules/lodash/isTypedArray.js": /*!*********************************************!*\ !*** ./node_modules/lodash/isTypedArray.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ "./node_modules/lodash/_baseIsTypedArray.js"), baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); /* Node.js helper references. */ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** * Checks if `value` is classified as a typed array. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); * // => true * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; module.exports = isTypedArray; /***/ }), /***/ "./node_modules/lodash/keys.js": /*!*************************************!*\ !*** ./node_modules/lodash/keys.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ function keys(object) { return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } module.exports = keys; /***/ }), /***/ "./node_modules/lodash/mapValues.js": /*!******************************************!*\ !*** ./node_modules/lodash/mapValues.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"); /** * Creates an object with the same keys as `object` and values generated * by running each own enumerable string keyed property of `object` thru * `iteratee`. The iteratee is invoked with three arguments: * (value, key, object). * * @static * @memberOf _ * @since 2.4.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns the new mapped object. * @see _.mapKeys * @example * * var users = { * 'fred': { 'user': 'fred', 'age': 40 }, * 'pebbles': { 'user': 'pebbles', 'age': 1 } * }; * * _.mapValues(users, function(o) { return o.age; }); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) * * // The `_.property` iteratee shorthand. * _.mapValues(users, 'age'); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) */ function mapValues(object, iteratee) { var result = {}; iteratee = baseIteratee(iteratee, 3); baseForOwn(object, function(value, key, object) { baseAssignValue(result, key, iteratee(value, key, object)); }); return result; } module.exports = mapValues; /***/ }), /***/ "./node_modules/lodash/memoize.js": /*!****************************************!*\ !*** ./node_modules/lodash/memoize.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); /** Error message constants. */ var FUNC_ERROR_TEXT = 'Expected a function'; /** * Creates a function that memoizes the result of `func`. If `resolver` is * provided, it determines the cache key for storing the result based on the * arguments provided to the memoized function. By default, the first argument * provided to the memoized function is used as the map cache key. The `func` * is invoked with the `this` binding of the memoized function. * * **Note:** The cache is exposed as the `cache` property on the memoized * function. Its creation may be customized by replacing the `_.memoize.Cache` * constructor with one whose instances implement the * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) * method interface of `clear`, `delete`, `get`, `has`, and `set`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to have its output memoized. * @param {Function} [resolver] The function to resolve the cache key. * @returns {Function} Returns the new memoized function. * @example * * var object = { 'a': 1, 'b': 2 }; * var other = { 'c': 3, 'd': 4 }; * * var values = _.memoize(_.values); * values(object); * // => [1, 2] * * values(other); * // => [3, 4] * * object.a = 2; * values(object); * // => [1, 2] * * // Modify the result cache. * values.cache.set(object, ['a', 'b']); * values(object); * // => ['a', 'b'] * * // Replace `_.memoize.Cache`. * _.memoize.Cache = WeakMap; */ function memoize(func, resolver) { if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { throw new TypeError(FUNC_ERROR_TEXT); } var memoized = function() { var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } var result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || MapCache); return memoized; } // Expose `MapCache`. memoize.Cache = MapCache; module.exports = memoize; /***/ }), /***/ "./node_modules/lodash/noop.js": /*!*************************************!*\ !*** ./node_modules/lodash/noop.js ***! \*************************************/ /***/ ((module) => { /** * This method returns `undefined`. * * @static * @memberOf _ * @since 2.3.0 * @category Util * @example * * _.times(2, _.noop); * // => [undefined, undefined] */ function noop() { // No operation performed. } module.exports = noop; /***/ }), /***/ "./node_modules/lodash/property.js": /*!*****************************************!*\ !*** ./node_modules/lodash/property.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"), basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ "./node_modules/lodash/_basePropertyDeep.js"), isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** * Creates a function that returns the value at `path` of a given object. * * @static * @memberOf _ * @since 2.4.0 * @category Util * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. * @example * * var objects = [ * { 'a': { 'b': 2 } }, * { 'a': { 'b': 1 } } * ]; * * _.map(objects, _.property('a.b')); * // => [2, 1] * * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); * // => [1, 2] */ function property(path) { return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); } module.exports = property; /***/ }), /***/ "./node_modules/lodash/stubArray.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubArray.js ***! \******************************************/ /***/ ((module) => { /** * This method returns a new empty array. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {Array} Returns the new empty array. * @example * * var arrays = _.times(2, _.stubArray); * * console.log(arrays); * // => [[], []] * * console.log(arrays[0] === arrays[1]); * // => false */ function stubArray() { return []; } module.exports = stubArray; /***/ }), /***/ "./node_modules/lodash/stubFalse.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubFalse.js ***! \******************************************/ /***/ ((module) => { /** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */ function stubFalse() { return false; } module.exports = stubFalse; /***/ }), /***/ "./node_modules/lodash/toString.js": /*!*****************************************!*\ !*** ./node_modules/lodash/toString.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseToString = __webpack_require__(/*! ./_baseToString */ "./node_modules/lodash/_baseToString.js"); /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } module.exports = toString; /***/ }), /***/ "./node_modules/lodash/uniq.js": /*!*************************************!*\ !*** ./node_modules/lodash/uniq.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseUniq = __webpack_require__(/*! ./_baseUniq */ "./node_modules/lodash/_baseUniq.js"); /** * Creates a duplicate-free version of an array, using * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons, in which only the first occurrence of each element * is kept. The order of result values is determined by the order they occur * in the array. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to inspect. * @returns {Array} Returns the new duplicate free array. * @example * * _.uniq([2, 1, 2]); * // => [2, 1] */ function uniq(array) { return (array && array.length) ? baseUniq(array) : []; } module.exports = uniq; /***/ }), /***/ "./node_modules/semver/classes/comparator.js": /*!***************************************************!*\ !*** ./node_modules/semver/classes/comparator.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const ANY = Symbol('SemVer ANY') // hoisted class for cyclic dependency class Comparator { static get ANY () { return ANY } constructor (comp, options) { if (!options || typeof options !== 'object') { options = { loose: !!options, includePrerelease: false } } if (comp instanceof Comparator) { if (comp.loose === !!options.loose) { return comp } else { comp = comp.value } } debug('comparator', comp, options) this.options = options this.loose = !!options.loose this.parse(comp) if (this.semver === ANY) { this.value = '' } else { this.value = this.operator + this.semver.version } debug('comp', this) } parse (comp) { const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] const m = comp.match(r) if (!m) { throw new TypeError(`Invalid comparator: ${comp}`) } this.operator = m[1] !== undefined ? m[1] : '' if (this.operator === '=') { this.operator = '' } // if it literally is just '>' or '' then allow anything. if (!m[2]) { this.semver = ANY } else { this.semver = new SemVer(m[2], this.options.loose) } } toString () { return this.value } test (version) { debug('Comparator.test', version, this.options.loose) if (this.semver === ANY || version === ANY) { return true } if (typeof version === 'string') { try { version = new SemVer(version, this.options) } catch (er) { return false } } return cmp(version, this.operator, this.semver, this.options) } intersects (comp, options) { if (!(comp instanceof Comparator)) { throw new TypeError('a Comparator is required') } if (!options || typeof options !== 'object') { options = { loose: !!options, includePrerelease: false } } if (this.operator === '') { if (this.value === '') { return true } return new Range(comp.value, options).test(this.value) } else if (comp.operator === '') { if (comp.value === '') { return true } return new Range(this.value, options).test(comp.semver) } const sameDirectionIncreasing = (this.operator === '>=' || this.operator === '>') && (comp.operator === '>=' || comp.operator === '>') const sameDirectionDecreasing = (this.operator === '<=' || this.operator === '<') && (comp.operator === '<=' || comp.operator === '<') const sameSemVer = this.semver.version === comp.semver.version const differentDirectionsInclusive = (this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<=') const oppositeDirectionsLessThan = cmp(this.semver, '<', comp.semver, options) && (this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<') const oppositeDirectionsGreaterThan = cmp(this.semver, '>', comp.semver, options) && (this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>') return ( sameDirectionIncreasing || sameDirectionDecreasing || (sameSemVer && differentDirectionsInclusive) || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan ) } } module.exports = Comparator const {re, t} = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const cmp = __webpack_require__(/*! ../functions/cmp */ "./node_modules/semver/functions/cmp.js") const debug = __webpack_require__(/*! ../internal/debug */ "./node_modules/semver/internal/debug.js") const SemVer = __webpack_require__(/*! ./semver */ "./node_modules/semver/classes/semver.js") const Range = __webpack_require__(/*! ./range */ "./node_modules/semver/classes/range.js") /***/ }), /***/ "./node_modules/semver/classes/range.js": /*!**********************************************!*\ !*** ./node_modules/semver/classes/range.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // hoisted class for cyclic dependency class Range { constructor (range, options) { if (!options || typeof options !== 'object') { options = { loose: !!options, includePrerelease: false } } if (range instanceof Range) { if ( range.loose === !!options.loose && range.includePrerelease === !!options.includePrerelease ) { return range } else { return new Range(range.raw, options) } } if (range instanceof Comparator) { // just put it in the set and return this.raw = range.value this.set = [[range]] this.format() return this } this.options = options this.loose = !!options.loose this.includePrerelease = !!options.includePrerelease // First, split based on boolean or || this.raw = range this.set = range .split(/\s*\|\|\s*/) // map the range to a 2d array of comparators .map(range => this.parseRange(range.trim())) // throw out any comparator lists that are empty // this generally means that it was not a valid range, which is allowed // in loose mode, but will still throw if the WHOLE range is invalid. .filter(c => c.length) if (!this.set.length) { throw new TypeError(`Invalid SemVer Range: ${range}`) } this.format() } format () { this.range = this.set .map((comps) => { return comps.join(' ').trim() }) .join('||') .trim() return this.range } toString () { return this.range } parseRange (range) { const loose = this.options.loose range = range.trim() // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) debug('hyphen replace', range) // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) debug('comparator trim', range, re[t.COMPARATORTRIM]) // `~ 1.2.3` => `~1.2.3` range = range.replace(re[t.TILDETRIM], tildeTrimReplace) // `^ 1.2.3` => `^1.2.3` range = range.replace(re[t.CARETTRIM], caretTrimReplace) // normalize spaces range = range.split(/\s+/).join(' ') // At this point, the range is completely trimmed and // ready to be split into comparators. const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] return range .split(' ') .map(comp => parseComparator(comp, this.options)) .join(' ') .split(/\s+/) .map(comp => replaceGTE0(comp, this.options)) // in loose mode, throw out any that are not valid comparators .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) .map(comp => new Comparator(comp, this.options)) } intersects (range, options) { if (!(range instanceof Range)) { throw new TypeError('a Range is required') } return this.set.some((thisComparators) => { return ( isSatisfiable(thisComparators, options) && range.set.some((rangeComparators) => { return ( isSatisfiable(rangeComparators, options) && thisComparators.every((thisComparator) => { return rangeComparators.every((rangeComparator) => { return thisComparator.intersects(rangeComparator, options) }) }) ) }) ) }) } // if ANY of the sets match ALL of its comparators, then pass test (version) { if (!version) { return false } if (typeof version === 'string') { try { version = new SemVer(version, this.options) } catch (er) { return false } } for (let i = 0; i < this.set.length; i++) { if (testSet(this.set[i], version, this.options)) { return true } } return false } } module.exports = Range const Comparator = __webpack_require__(/*! ./comparator */ "./node_modules/semver/classes/comparator.js") const debug = __webpack_require__(/*! ../internal/debug */ "./node_modules/semver/internal/debug.js") const SemVer = __webpack_require__(/*! ./semver */ "./node_modules/semver/classes/semver.js") const { re, t, comparatorTrimReplace, tildeTrimReplace, caretTrimReplace } = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") // take a set of comparators and determine whether there // exists a version which can satisfy it const isSatisfiable = (comparators, options) => { let result = true const remainingComparators = comparators.slice() let testComparator = remainingComparators.pop() while (result && remainingComparators.length) { result = remainingComparators.every((otherComparator) => { return testComparator.intersects(otherComparator, options) }) testComparator = remainingComparators.pop() } return result } // comprised of xranges, tildes, stars, and gtlt's at this point. // already replaced the hyphen ranges // turn into a set of JUST comparators. const parseComparator = (comp, options) => { debug('comp', comp, options) comp = replaceCarets(comp, options) debug('caret', comp) comp = replaceTildes(comp, options) debug('tildes', comp) comp = replaceXRanges(comp, options) debug('xrange', comp) comp = replaceStars(comp, options) debug('stars', comp) return comp } const isX = id => !id || id.toLowerCase() === 'x' || id === '*' // ~, ~> --> * (any, kinda silly) // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 const replaceTildes = (comp, options) => comp.trim().split(/\s+/).map((comp) => { return replaceTilde(comp, options) }).join(' ') const replaceTilde = (comp, options) => { const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] return comp.replace(r, (_, M, m, p, pr) => { debug('tilde', comp, _, M, m, p, pr) let ret if (isX(M)) { ret = '' } else if (isX(m)) { ret = `>=${M}.0.0 <${+M + 1}.0.0-0` } else if (isX(p)) { // ~1.2 == >=1.2.0 <1.3.0-0 ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` } else if (pr) { debug('replaceTilde pr', pr) ret = `>=${M}.${m}.${p}-${pr } <${M}.${+m + 1}.0-0` } else { // ~1.2.3 == >=1.2.3 <1.3.0-0 ret = `>=${M}.${m}.${p } <${M}.${+m + 1}.0-0` } debug('tilde return', ret) return ret }) } // ^ --> * (any, kinda silly) // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 // ^1.2.3 --> >=1.2.3 <2.0.0-0 // ^1.2.0 --> >=1.2.0 <2.0.0-0 const replaceCarets = (comp, options) => comp.trim().split(/\s+/).map((comp) => { return replaceCaret(comp, options) }).join(' ') const replaceCaret = (comp, options) => { debug('caret', comp, options) const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] const z = options.includePrerelease ? '-0' : '' return comp.replace(r, (_, M, m, p, pr) => { debug('caret', comp, _, M, m, p, pr) let ret if (isX(M)) { ret = '' } else if (isX(m)) { ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` } else if (isX(p)) { if (M === '0') { ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` } else { ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` } } else if (pr) { debug('replaceCaret pr', pr) if (M === '0') { if (m === '0') { ret = `>=${M}.${m}.${p}-${pr } <${M}.${m}.${+p + 1}-0` } else { ret = `>=${M}.${m}.${p}-${pr } <${M}.${+m + 1}.0-0` } } else { ret = `>=${M}.${m}.${p}-${pr } <${+M + 1}.0.0-0` } } else { debug('no pr') if (M === '0') { if (m === '0') { ret = `>=${M}.${m}.${p }${z} <${M}.${m}.${+p + 1}-0` } else { ret = `>=${M}.${m}.${p }${z} <${M}.${+m + 1}.0-0` } } else { ret = `>=${M}.${m}.${p } <${+M + 1}.0.0-0` } } debug('caret return', ret) return ret }) } const replaceXRanges = (comp, options) => { debug('replaceXRanges', comp, options) return comp.split(/\s+/).map((comp) => { return replaceXRange(comp, options) }).join(' ') } const replaceXRange = (comp, options) => { comp = comp.trim() const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] return comp.replace(r, (ret, gtlt, M, m, p, pr) => { debug('xRange', comp, ret, gtlt, M, m, p, pr) const xM = isX(M) const xm = xM || isX(m) const xp = xm || isX(p) const anyX = xp if (gtlt === '=' && anyX) { gtlt = '' } // if we're including prereleases in the match, then we need // to fix this to -0, the lowest possible prerelease value pr = options.includePrerelease ? '-0' : '' if (xM) { if (gtlt === '>' || gtlt === '<') { // nothing is allowed ret = '<0.0.0-0' } else { // nothing is forbidden ret = '*' } } else if (gtlt && anyX) { // we know patch is an x, because we have any x at all. // replace X with 0 if (xm) { m = 0 } p = 0 if (gtlt === '>') { // >1 => >=2.0.0 // >1.2 => >=1.3.0 gtlt = '>=' if (xm) { M = +M + 1 m = 0 p = 0 } else { m = +m + 1 p = 0 } } else if (gtlt === '<=') { // <=0.7.x is actually <0.8.0, since any 0.7.x should // pass. Similarly, <=7.x is actually <8.0.0, etc. gtlt = '<' if (xm) { M = +M + 1 } else { m = +m + 1 } } if (gtlt === '<') pr = '-0' ret = `${gtlt + M}.${m}.${p}${pr}` } else if (xm) { ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` } else if (xp) { ret = `>=${M}.${m}.0${pr } <${M}.${+m + 1}.0-0` } debug('xRange return', ret) return ret }) } // Because * is AND-ed with everything else in the comparator, // and '' means "any version", just remove the *s entirely. const replaceStars = (comp, options) => { debug('replaceStars', comp, options) // Looseness is ignored here. star is always as loose as it gets! return comp.trim().replace(re[t.STAR], '') } const replaceGTE0 = (comp, options) => { debug('replaceGTE0', comp, options) return comp.trim() .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') } // This function is passed to string.replace(re[t.HYPHENRANGE]) // M, m, patch, prerelease, build // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 // 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do // 1.2 - 3.4 => >=1.2.0 <3.5.0-0 const hyphenReplace = incPr => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) => { if (isX(fM)) { from = '' } else if (isX(fm)) { from = `>=${fM}.0.0${incPr ? '-0' : ''}` } else if (isX(fp)) { from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` } else if (fpr) { from = `>=${from}` } else { from = `>=${from}${incPr ? '-0' : ''}` } if (isX(tM)) { to = '' } else if (isX(tm)) { to = `<${+tM + 1}.0.0-0` } else if (isX(tp)) { to = `<${tM}.${+tm + 1}.0-0` } else if (tpr) { to = `<=${tM}.${tm}.${tp}-${tpr}` } else if (incPr) { to = `<${tM}.${tm}.${+tp + 1}-0` } else { to = `<=${to}` } return (`${from} ${to}`).trim() } const testSet = (set, version, options) => { for (let i = 0; i < set.length; i++) { if (!set[i].test(version)) { return false } } if (version.prerelease.length && !options.includePrerelease) { // Find the set of versions that are allowed to have prereleases // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 // That should allow `1.2.3-pr.2` to pass. // However, `1.2.4-alpha.notready` should NOT be allowed, // even though it's within the range set by the comparators. for (let i = 0; i < set.length; i++) { debug(set[i].semver) if (set[i].semver === Comparator.ANY) { continue } if (set[i].semver.prerelease.length > 0) { const allowed = set[i].semver if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) { return true } } } // Version has a -pre, but it's not one of the ones we like. return false } return true } /***/ }), /***/ "./node_modules/semver/classes/semver.js": /*!***********************************************!*\ !*** ./node_modules/semver/classes/semver.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const debug = __webpack_require__(/*! ../internal/debug */ "./node_modules/semver/internal/debug.js") const { MAX_LENGTH, MAX_SAFE_INTEGER } = __webpack_require__(/*! ../internal/constants */ "./node_modules/semver/internal/constants.js") const { re, t } = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const { compareIdentifiers } = __webpack_require__(/*! ../internal/identifiers */ "./node_modules/semver/internal/identifiers.js") class SemVer { constructor (version, options) { if (!options || typeof options !== 'object') { options = { loose: !!options, includePrerelease: false } } if (version instanceof SemVer) { if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) { return version } else { version = version.version } } else if (typeof version !== 'string') { throw new TypeError(`Invalid Version: ${version}`) } if (version.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ) } debug('SemVer', version, options) this.options = options this.loose = !!options.loose // this isn't actually relevant for versions, but keep it so that we // don't run into trouble passing this.options around. this.includePrerelease = !!options.includePrerelease const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) if (!m) { throw new TypeError(`Invalid Version: ${version}`) } this.raw = version // these are actually numbers this.major = +m[1] this.minor = +m[2] this.patch = +m[3] if (this.major > MAX_SAFE_INTEGER || this.major < 0) { throw new TypeError('Invalid major version') } if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { throw new TypeError('Invalid minor version') } if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { throw new TypeError('Invalid patch version') } // numberify any prerelease numeric ids if (!m[4]) { this.prerelease = [] } else { this.prerelease = m[4].split('.').map((id) => { if (/^[0-9]+$/.test(id)) { const num = +id if (num >= 0 && num < MAX_SAFE_INTEGER) { return num } } return id }) } this.build = m[5] ? m[5].split('.') : [] this.format() } format () { this.version = `${this.major}.${this.minor}.${this.patch}` if (this.prerelease.length) { this.version += `-${this.prerelease.join('.')}` } return this.version } toString () { return this.version } compare (other) { debug('SemVer.compare', this.version, this.options, other) if (!(other instanceof SemVer)) { if (typeof other === 'string' && other === this.version) { return 0 } other = new SemVer(other, this.options) } if (other.version === this.version) { return 0 } return this.compareMain(other) || this.comparePre(other) } compareMain (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } return ( compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch) ) } comparePre (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } // NOT having a prerelease is > having one if (this.prerelease.length && !other.prerelease.length) { return -1 } else if (!this.prerelease.length && other.prerelease.length) { return 1 } else if (!this.prerelease.length && !other.prerelease.length) { return 0 } let i = 0 do { const a = this.prerelease[i] const b = other.prerelease[i] debug('prerelease compare', i, a, b) if (a === undefined && b === undefined) { return 0 } else if (b === undefined) { return 1 } else if (a === undefined) { return -1 } else if (a === b) { continue } else { return compareIdentifiers(a, b) } } while (++i) } compareBuild (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } let i = 0 do { const a = this.build[i] const b = other.build[i] debug('prerelease compare', i, a, b) if (a === undefined && b === undefined) { return 0 } else if (b === undefined) { return 1 } else if (a === undefined) { return -1 } else if (a === b) { continue } else { return compareIdentifiers(a, b) } } while (++i) } // preminor will bump the version up to the next minor release, and immediately // down to pre-release. premajor and prepatch work the same way. inc (release, identifier) { switch (release) { case 'premajor': this.prerelease.length = 0 this.patch = 0 this.minor = 0 this.major++ this.inc('pre', identifier) break case 'preminor': this.prerelease.length = 0 this.patch = 0 this.minor++ this.inc('pre', identifier) break case 'prepatch': // If this is already a prerelease, it will bump to the next version // drop any prereleases that might already exist, since they are not // relevant at this point. this.prerelease.length = 0 this.inc('patch', identifier) this.inc('pre', identifier) break // If the input is a non-prerelease version, this acts the same as // prepatch. case 'prerelease': if (this.prerelease.length === 0) { this.inc('patch', identifier) } this.inc('pre', identifier) break case 'major': // If this is a pre-major version, bump up to the same major version. // Otherwise increment major. // 1.0.0-5 bumps to 1.0.0 // 1.1.0 bumps to 2.0.0 if ( this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0 ) { this.major++ } this.minor = 0 this.patch = 0 this.prerelease = [] break case 'minor': // If this is a pre-minor version, bump up to the same minor version. // Otherwise increment minor. // 1.2.0-5 bumps to 1.2.0 // 1.2.1 bumps to 1.3.0 if (this.patch !== 0 || this.prerelease.length === 0) { this.minor++ } this.patch = 0 this.prerelease = [] break case 'patch': // If this is not a pre-release version, it will increment the patch. // If it is a pre-release it will bump up to the same patch version. // 1.2.0-5 patches to 1.2.0 // 1.2.0 patches to 1.2.1 if (this.prerelease.length === 0) { this.patch++ } this.prerelease = [] break // This probably shouldn't be used publicly. // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. case 'pre': if (this.prerelease.length === 0) { this.prerelease = [0] } else { let i = this.prerelease.length while (--i >= 0) { if (typeof this.prerelease[i] === 'number') { this.prerelease[i]++ i = -2 } } if (i === -1) { // didn't increment anything this.prerelease.push(0) } } if (identifier) { // 1.2.0-beta.1 bumps to 1.2.0-beta.2, // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 if (this.prerelease[0] === identifier) { if (isNaN(this.prerelease[1])) { this.prerelease = [identifier, 0] } } else { this.prerelease = [identifier, 0] } } break default: throw new Error(`invalid increment argument: ${release}`) } this.format() this.raw = this.version return this } } module.exports = SemVer /***/ }), /***/ "./node_modules/semver/functions/cmp.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/cmp.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const eq = __webpack_require__(/*! ./eq */ "./node_modules/semver/functions/eq.js") const neq = __webpack_require__(/*! ./neq */ "./node_modules/semver/functions/neq.js") const gt = __webpack_require__(/*! ./gt */ "./node_modules/semver/functions/gt.js") const gte = __webpack_require__(/*! ./gte */ "./node_modules/semver/functions/gte.js") const lt = __webpack_require__(/*! ./lt */ "./node_modules/semver/functions/lt.js") const lte = __webpack_require__(/*! ./lte */ "./node_modules/semver/functions/lte.js") const cmp = (a, op, b, loose) => { switch (op) { case '===': if (typeof a === 'object') a = a.version if (typeof b === 'object') b = b.version return a === b case '!==': if (typeof a === 'object') a = a.version if (typeof b === 'object') b = b.version return a !== b case '': case '=': case '==': return eq(a, b, loose) case '!=': return neq(a, b, loose) case '>': return gt(a, b, loose) case '>=': return gte(a, b, loose) case '<': return lt(a, b, loose) case '<=': return lte(a, b, loose) default: throw new TypeError(`Invalid operator: ${op}`) } } module.exports = cmp /***/ }), /***/ "./node_modules/semver/functions/coerce.js": /*!*************************************************!*\ !*** ./node_modules/semver/functions/coerce.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/semver/classes/semver.js") const parse = __webpack_require__(/*! ./parse */ "./node_modules/semver/functions/parse.js") const {re, t} = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const coerce = (version, options) => { if (version instanceof SemVer) { return version } if (typeof version === 'number') { version = String(version) } if (typeof version !== 'string') { return null } options = options || {} let match = null if (!options.rtl) { match = version.match(re[t.COERCE]) } else { // Find the right-most coercible string that does not share // a terminus with a more left-ward coercible string. // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' // // Walk through the string checking with a /g regexp // Manually set the index so as to pick up overlapping matches. // Stop when we get a match that ends at the string end, since no // coercible string can be more right-ward without the same terminus. let next while ((next = re[t.COERCERTL].exec(version)) && (!match || match.index + match[0].length !== version.length) ) { if (!match || next.index + next[0].length !== match.index + match[0].length) { match = next } re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length } // leave it in a clean state re[t.COERCERTL].lastIndex = -1 } if (match === null) return null return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options) } module.exports = coerce /***/ }), /***/ "./node_modules/semver/functions/compare.js": /*!**************************************************!*\ !*** ./node_modules/semver/functions/compare.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/semver/classes/semver.js") const compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose)) module.exports = compare /***/ }), /***/ "./node_modules/semver/functions/eq.js": /*!*********************************************!*\ !*** ./node_modules/semver/functions/eq.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const eq = (a, b, loose) => compare(a, b, loose) === 0 module.exports = eq /***/ }), /***/ "./node_modules/semver/functions/gt.js": /*!*********************************************!*\ !*** ./node_modules/semver/functions/gt.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const gt = (a, b, loose) => compare(a, b, loose) > 0 module.exports = gt /***/ }), /***/ "./node_modules/semver/functions/gte.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/gte.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const gte = (a, b, loose) => compare(a, b, loose) >= 0 module.exports = gte /***/ }), /***/ "./node_modules/semver/functions/lt.js": /*!*********************************************!*\ !*** ./node_modules/semver/functions/lt.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const lt = (a, b, loose) => compare(a, b, loose) < 0 module.exports = lt /***/ }), /***/ "./node_modules/semver/functions/lte.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/lte.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const lte = (a, b, loose) => compare(a, b, loose) <= 0 module.exports = lte /***/ }), /***/ "./node_modules/semver/functions/neq.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/neq.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const neq = (a, b, loose) => compare(a, b, loose) !== 0 module.exports = neq /***/ }), /***/ "./node_modules/semver/functions/parse.js": /*!************************************************!*\ !*** ./node_modules/semver/functions/parse.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const {MAX_LENGTH} = __webpack_require__(/*! ../internal/constants */ "./node_modules/semver/internal/constants.js") const { re, t } = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/semver/classes/semver.js") const parse = (version, options) => { if (!options || typeof options !== 'object') { options = { loose: !!options, includePrerelease: false } } if (version instanceof SemVer) { return version } if (typeof version !== 'string') { return null } if (version.length > MAX_LENGTH) { return null } const r = options.loose ? re[t.LOOSE] : re[t.FULL] if (!r.test(version)) { return null } try { return new SemVer(version, options) } catch (er) { return null } } module.exports = parse /***/ }), /***/ "./node_modules/semver/functions/satisfies.js": /*!****************************************************!*\ !*** ./node_modules/semver/functions/satisfies.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const Range = __webpack_require__(/*! ../classes/range */ "./node_modules/semver/classes/range.js") const satisfies = (version, range, options) => { try { range = new Range(range, options) } catch (er) { return false } return range.test(version) } module.exports = satisfies /***/ }), /***/ "./node_modules/semver/internal/constants.js": /*!***************************************************!*\ !*** ./node_modules/semver/internal/constants.js ***! \***************************************************/ /***/ ((module) => { // Note: this is the semver.org version of the spec that it implements // Not necessarily the package version of this code. const SEMVER_SPEC_VERSION = '2.0.0' const MAX_LENGTH = 256 const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ 9007199254740991 // Max safe segment length for coercion. const MAX_SAFE_COMPONENT_LENGTH = 16 module.exports = { SEMVER_SPEC_VERSION, MAX_LENGTH, MAX_SAFE_INTEGER, MAX_SAFE_COMPONENT_LENGTH } /***/ }), /***/ "./node_modules/semver/internal/debug.js": /*!***********************************************!*\ !*** ./node_modules/semver/internal/debug.js ***! \***********************************************/ /***/ ((module) => { const debug = ( typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ) ? (...args) => console.error('SEMVER', ...args) : () => {} module.exports = debug /***/ }), /***/ "./node_modules/semver/internal/identifiers.js": /*!*****************************************************!*\ !*** ./node_modules/semver/internal/identifiers.js ***! \*****************************************************/ /***/ ((module) => { const numeric = /^[0-9]+$/ const compareIdentifiers = (a, b) => { const anum = numeric.test(a) const bnum = numeric.test(b) if (anum && bnum) { a = +a b = +b } return a === b ? 0 : (anum && !bnum) ? -1 : (bnum && !anum) ? 1 : a < b ? -1 : 1 } const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) module.exports = { compareIdentifiers, rcompareIdentifiers } /***/ }), /***/ "./node_modules/semver/internal/re.js": /*!********************************************!*\ !*** ./node_modules/semver/internal/re.js ***! \********************************************/ /***/ ((module, exports, __webpack_require__) => { const { MAX_SAFE_COMPONENT_LENGTH } = __webpack_require__(/*! ./constants */ "./node_modules/semver/internal/constants.js") const debug = __webpack_require__(/*! ./debug */ "./node_modules/semver/internal/debug.js") exports = module.exports = {} // The actual regexps go on exports.re const re = exports.re = [] const src = exports.src = [] const t = exports.t = {} let R = 0 const createToken = (name, value, isGlobal) => { const index = R++ debug(index, value) t[name] = index src[index] = value re[index] = new RegExp(value, isGlobal ? 'g' : undefined) } // The following Regular Expressions can be used for tokenizing, // validating, and parsing SemVer version strings. // ## Numeric Identifier // A single `0`, or a non-zero digit followed by zero or more digits. createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') // ## Non-numeric Identifier // Zero or more digits, followed by a letter or hyphen, and then zero or // more letters, digits, or hyphens. createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') // ## Main Version // Three dot-separated numeric identifiers. createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`) createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`) // ## Pre-release Version Identifier // A numeric identifier, or a non-numeric identifier. createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] }|${src[t.NONNUMERICIDENTIFIER]})`) createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] }|${src[t.NONNUMERICIDENTIFIER]})`) // ## Pre-release Version // Hyphen, followed by one or more dot-separated pre-release version // identifiers. createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] }(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] }(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) // ## Build Metadata Identifier // Any combination of digits, letters, or hyphens. createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') // ## Build Metadata // Plus sign, followed by one or more period-separated build metadata // identifiers. createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] }(?:\\.${src[t.BUILDIDENTIFIER]})*))`) // ## Full Version String // A main version, followed optionally by a pre-release version and // build metadata. // Note that the only major, minor, patch, and pre-release sections of // the version string are capturing groups. The build metadata is not a // capturing group, because it should not ever be used in version // comparison. createToken('FULLPLAIN', `v?${src[t.MAINVERSION] }${src[t.PRERELEASE]}?${ src[t.BUILD]}?`) createToken('FULL', `^${src[t.FULLPLAIN]}$`) // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty // common in the npm registry. createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] }${src[t.PRERELEASELOOSE]}?${ src[t.BUILD]}?`) createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) createToken('GTLT', '((?:<|>)?=?)') // Something like "2.*" or "1.2.x". // Note that "x.x" is a valid xRange identifer, meaning "any version" // Only the first item is strictly required. createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${ src[t.BUILD]}?` + `)?)?`) createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${ src[t.BUILD]}?` + `)?)?`) createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) // Coercion. // Extract anything that could conceivably be a part of a valid semver createToken('COERCE', `${'(^|[^\\d])' + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:$|[^\\d])`) createToken('COERCERTL', src[t.COERCE], true) // Tilde ranges. // Meaning is "reasonably at or greater than" createToken('LONETILDE', '(?:~>?)') createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) exports.tildeTrimReplace = '$1~' createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) // Caret ranges. // Meaning is "at least and backwards compatible with" createToken('LONECARET', '(?:\\^)') createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) exports.caretTrimReplace = '$1^' createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) // A simple gt/lt/eq thing, or just "" to indicate "any version" createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) // An expression to strip any whitespace between the gtlt and the thing // it modifies, so that `> 1.2.3` ==> `>1.2.3` createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] }\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) exports.comparatorTrimReplace = '$1$2$3' // Something like `1.2.3 - 1.2.4` // Note that these all use the loose form, because they'll be // checked against either the strict or loose comparator form // later. createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`) createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`) // Star ranges basically just allow anything at all. createToken('STAR', '(<|>)?=?\\s*\\*') // >=0.0.0 is like a star createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') /***/ }), /***/ "./package.json": /*!**********************!*\ !*** ./package.json ***! \**********************/ /***/ ((module) => { "use strict"; module.exports = /*#__PURE__*/JSON.parse('{"name":"animation_utils","version":"4.1.3","private":true,"description":"GeckoLib (Legacy)","main":"index.js","scripts":{"prebuild":"npm run test","build":"npm run build:only","build:only":"webpack && npm run update_manifest","update_manifest":"node scripts/updateManifest.mjs","start":"webpack --watch --mode=development","lint":"eslint .","lint:fix":"eslint --fix .","tsc":"tsc --noEmit","pretest":"npm run lint && npm run tsc","test":"npm run test:only","test:only":"jest"},"author":"Eliot Lash, Tslat, Gecko, McHorse","license":"MIT","blockbenchConfig":{"title":"GeckoLib Animation Utils","author":"Eliot Lash, Tslat, Gecko, McHorse","icon":"icon.png","description":"Replaced by new plugin for Blockbench 5.0+ - Install \'GeckoLib Models and Animations\'","deprecation_note":"This plugin has been discontinued in favour of the \\"GeckoLib Models and Animations\\" plugin. This plugin will continue to work on Blockbench 4 and below. For Blockbench 5+, use \'GeckoLib\' instead.","has_changelog":true,"min_version":"4.12.0","max_version":"5.0.0","variant":"both","website":"https://github.com/bernie-g/geckolib/wiki","repository":"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/animation_utils","bug_tracker":"https://github.com/bernie-g/geckolib/issues"},"sideEffects":["./index.js"],"devDependencies":{"@types/jest":"^29.5.4","@types/lodash":"^4.14.197","@typescript-eslint/eslint-plugin":"^6.5.0","@typescript-eslint/parser":"^6.5.0","blockbench-types":"^4.9.0","eol":"0.9.1","eslint":"^7.7.0","indent-string":"^5.0.0","jest":"^29.6.4","ts-jest":"^29.1.1","ts-loader":"^9.4.4","typescript":"^4.9.5","webpack":"^5.88.2","webpack-cli":"^5.1.4","css-loader":"^6.7.1","to-string-loader":"^1.2.0"},"dependencies":{"lodash":"^4.17.21","semver":"7.3.2"}}'); /***/ }), /***/ "./resources/armorTemplate.json": /*!**************************************!*\ !*** ./resources/armorTemplate.json ***! \**************************************/ /***/ ((module) => { "use strict"; module.exports = /*#__PURE__*/JSON.parse('{"meta":{"format_version":"3.2","model_format":"animated_entity_model","box_uv":true},"name":"CustomArmor","geo_name":"CustomArmor","resolution":{"width":64,"height":64},"elements":[{"name":"dontTouch","from":[-4,24,-4],"to":[4,32,4],"autouv":1,"color":0,"export":false,"locked":true,"origin":[0,0,0],"uuid":"9675593e-b27d-b70e-e1ea-1fc29f46a294"},{"name":"dontTouch","from":[-4,12,-2],"to":[4,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[0,24,0],"uuid":"fa43156a-2a62-948c-082f-483d525f6d1f"},{"name":"dontTouch","from":[4,12,-2],"to":[8,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"aa51170c-8b32-fb62-71f1-58ac0b7785a8"},{"name":"dontTouch","from":[-8,12,-2],"to":[-4,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"bf2c2539-20e3-cfcc-94c0-491734019889"},{"name":"dontTouch","from":[-4,0,-2],"to":[0,12,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"17b9bae0-356a-9bba-fad9-4672e2671191"},{"name":"dontTouch","from":[0,0,-2],"to":[4,12,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"7b31bac4-dc40-2b93-1204-7bbdcfe7d924"}],"outliner":[{"name":"bipedHead","uuid":"d340b6fa-56aa-9c0f-3560-7a067643b77d","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":["9675593e-b27d-b70e-e1ea-1fc29f46a294",{"name":"armorHead","uuid":"6ab88dea-c816-d2bb-6be9-05ed7838da97","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":[]}]},{"name":"bipedBody","uuid":"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":["fa43156a-2a62-948c-082f-483d525f6d1f",{"name":"armorBody","uuid":"282fcdbb-8ea9-4a13-4154-f2ed20d696c8","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":[]}]},{"name":"bipedRightArm","uuid":"d8113cc7-7e10-0930-259e-b8e4211ce9da","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[5,22,0],"children":["aa51170c-8b32-fb62-71f1-58ac0b7785a8",{"name":"armorRightArm","uuid":"c5300e23-fd2f-b56c-3552-45d6650e11c6","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[5,22,0],"children":[]}]},{"name":"bipedLeftArm","uuid":"3b8901e8-3420-0834-51eb-76d64ff2ae8f","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-5,22,0],"children":["bf2c2539-20e3-cfcc-94c0-491734019889",{"name":"armorLeftArm","uuid":"b0d41a53-f4ce-53c1-f899-5a2048c90ac2","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-5,22,0],"children":[]}]},{"name":"bipedLeftLeg","uuid":"37231be7-a8ef-22ca-7fea-40aed58003bb","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":["17b9bae0-356a-9bba-fad9-4672e2671191",{"name":"armorLeftLeg","uuid":"e4b19746-2d17-1f56-befe-00718165ae50","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":[]},{"name":"armorLeftBoot","uuid":"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":[]}]},{"name":"bipedRightLeg","uuid":"45c031a5-b6be-e0a7-5454-b45d07f28429","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":["7b31bac4-dc40-2b93-1204-7bbdcfe7d924",{"name":"armorRightLeg","uuid":"60238f18-e74b-c863-cb45-2e2f162221bd","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":[]},{"name":"armorRightBoot","uuid":"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":[]}]}],"textures":[]}'); /***/ }), /***/ "./resources/easing_keyframes.css": /*!****************************************!*\ !*** ./resources/easing_keyframes.css ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var result = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./easing_keyframes.css */ "./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css"); if (result && result.__esModule) { result = result.default; } if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /***/ "./ts/animationUi.ts": /*!***************************!*\ !*** ./ts/animationUi.ts ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ displayAnimationFrameCallback: () => (/* binding */ displayAnimationFrameCallback), /* harmony export */ loadAnimationUI: () => (/* binding */ loadAnimationUI), /* harmony export */ renderFrameCallback: () => (/* binding */ renderFrameCallback), /* harmony export */ unloadAnimationUI: () => (/* binding */ unloadAnimationUI), /* harmony export */ updateKeyframeEasing: () => (/* binding */ updateKeyframeEasing), /* harmony export */ updateKeyframeEasingArg: () => (/* binding */ updateKeyframeEasingArg), /* harmony export */ updateKeyframeSelectionCallback: () => (/* binding */ updateKeyframeSelectionCallback) /* harmony export */ }); /* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/uniq */ "./node_modules/lodash/uniq.js"); /* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_uniq__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./easing */ "./ts/easing.ts"); const easingRegExp = /^ease(InOut|In|Out)?([\w]+)$/; const loadAnimationUI = () => { Blockbench.on('display_animation_frame', displayAnimationFrameCallback); Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.on('render_frame', renderFrameCallback); (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, "updateKeyframeEasing", updateKeyframeEasing); (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, "updateKeyframeEasingArg", updateKeyframeEasingArg); }; const unloadAnimationUI = () => { Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback); Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.removeListener('render_frame', renderFrameCallback); }; const displayAnimationFrameCallback = ( /*...args*/) => { // const keyframe = $('#keyframe'); // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here }; function renderFrameCallback() { if (Format.id !== "animated_entity_model") return; Timeline.keyframes.forEach((kf) => { if (kf.interpolation != "linear" && kf.easing != undefined) { kf.easing = undefined; kf.easingArgs = undefined; window.updateKeyframeSelection(); } if (kf.interpolation === "step") { kf.interpolation = "linear"; if (kf.data_points.length == 1) addDataPoint(); window.updateKeyframeSelection(); } updateKeyframeIcon(kf); }); const addPrePostButton = document.querySelector('#keyframe_type_label > div'); if (addPrePostButton) addPrePostButton.hidden = true; } function updateKeyframeEasing(value) { Undo.initEdit({ keyframes: Timeline.selected }); // var axis = $(obj).attr('axis'); // const value = $(obj).val(); // console.log('updateKeyframeEasing value:', value, 'obj:', obj); if (value === "-") return; Timeline.selected.forEach((kf) => { kf.easing = value; kf.easingArgs = undefined; kf.interpolation = 'linear'; }); window.updateKeyframeSelection(); // Ensure easingArg display is updated // Animator.preview(); Undo.finishEdit('edit keyframe easing'); } function updateKeyframeEasingArg(obj) { Undo.initEdit({ keyframes: Timeline.selected }); if ($(obj).val() === "-") return; // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); Timeline.selected.forEach((kf) => { const value = (0,_easing__WEBPACK_IMPORTED_MODULE_2__.parseEasingArg)(kf, $(obj).val().trim()); kf.easingArgs = [value]; // obj.value = value; }); Undo.finishEdit('edit keyframe easing argument'); } const updateKeyframeSelectionCallback = ( /*...args*/) => { $('#keyframe_bar_easing').remove(); $('#keyframe_bar_easing_type').remove(); $('#keyframe_bar_easing_arg1').remove(); let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars let channel = false; Timeline.selected.forEach((kf) => { if (channel === false) { channel = kf.channel; } else if (channel !== kf.channel) { multi_channel = true; } }); Timeline.keyframes.forEach((kf) => { updateKeyframe(kf); }); const getMultiSelectValue = (selector, defaultValue, conflictValue) => { const selectorFunction = typeof selector === 'function' ? selector : x => (x[selector] === undefined ? defaultValue : x[selector]); if (Timeline.selected.length > 1) { const uniqSelected = lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected.map(selectorFunction)); if (uniqSelected.length === 1) { return uniqSelected[0]; } else { return conflictValue; } } else { return selectorFunction(Timeline.selected[0]) || defaultValue; } }; const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => { // Dear god I miss lodash if (!acc.has(kf.animator)) acc.set(kf.animator, {}); const animatorChannels = acc.get(kf.animator); if (!animatorChannels[kf.channel]) animatorChannels[kf.channel] = []; animatorChannels[kf.channel].push(kf); animatorChannels[kf.channel].sort((a, b) => { if (a.time < b.time) return -1; if (a.time > b.time) return 1; return 0; }); return acc; }, new Map()); const isFirstInChannel = (kf) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1; if (Timeline.selected.length && Format.id === "animated_entity_model") { if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) { const displayedEasing = getMultiSelectValue('easing', _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_DEFAULT, 'null'); const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => { const easingTypeToTypeId = type => { let finalEasingType = "In"; if (type === "out") { finalEasingType = "Out"; } else if (type === "inout") { finalEasingType = "InOut"; } return finalEasingType; }; let finalEasing = 'ease'; if (inputEasingOrType === "in" || inputEasingOrType === "out" || inputEasingOrType === "inout") { const finalEasingType = easingTypeToTypeId(inputEasingOrType); finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1); } else if (inputEasingOrType === "linear" || inputEasingOrType == "step") { finalEasing = inputEasingOrType; } else { const finalEasingType = easingTypeToTypeId(easingType); finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1); } return finalEasing; }; const addEasingTypeIcons = (bar, easingType, title) => { const div = document.createElement("div"); div.innerHTML = getIcon(easingType); div.id = "kf_easing_type_" + easingType; div.setAttribute("style", "stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px"); div.setAttribute("title", title); div.onclick = () => { const selectedEasing = $(".selected_kf_easing"); const selectedEasingType = $(".selected_kf_easing_type"); const keySelectedEasing = selectedEasing.attr("id").substring(15); const keySelectedEasingType = selectedEasingType.length <= 0 ? "in" : selectedEasingType.attr("id").substring(15); const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing); const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType); if (finalEasing != currentEasing) { // console.log("Changed from " + currentEasing + " to " + finalEasing); updateKeyframeEasing(finalEasing); } }; bar.appendChild(div); }; const keyframe = document.getElementById('panel_keyframe'); let easingBar = document.createElement('div'); keyframe.appendChild(easingBar); easingBar.outerHTML = `
`; easingBar = document.getElementById('keyframe_bar_easing'); addEasingTypeIcons(easingBar, "linear", "Switch to Linear easing"); addEasingTypeIcons(easingBar, "step", "Switch to Step easing"); addEasingTypeIcons(easingBar, "sine", "Switch to Sine easing"); addEasingTypeIcons(easingBar, "quad", "Switch to Quadratic easing"); addEasingTypeIcons(easingBar, "cubic", "Switch to Cubic easing"); addEasingTypeIcons(easingBar, "quart", "Switch to Quartic easing"); addEasingTypeIcons(easingBar, "quint", "Switch to Quntic easing"); addEasingTypeIcons(easingBar, "expo", "Switch to Exponential easing"); addEasingTypeIcons(easingBar, "circ", "Switch to Circle easing"); addEasingTypeIcons(easingBar, "back", "Switch to Back easing"); addEasingTypeIcons(easingBar, "elastic", "Switch to Elastic easing"); addEasingTypeIcons(easingBar, "bounce", "Switch to Bounce easing"); const keyEasing = getEasingInterpolation(displayedEasing); const keyEasingElement = document.getElementById("kf_easing_type_" + keyEasing); keyEasingElement.style.stroke = "var(--color-accent)"; keyEasingElement.classList.add('selected_kf_easing'); if (!(keyEasing === "linear" || keyEasing == "step")) { let easingTypeBar = document.createElement('div'); keyframe.appendChild(easingTypeBar); easingTypeBar.outerHTML = `
`; easingTypeBar = document.getElementById('keyframe_bar_easing_type'); addEasingTypeIcons(easingTypeBar, "in", "Switch to In easing type"); addEasingTypeIcons(easingTypeBar, "out", "Switch to Out easing type"); addEasingTypeIcons(easingTypeBar, "inout", "Switch to In/Out easing type"); const keyEasingType = getEasingType(displayedEasing); const keyEasingTypeElement = document.getElementById("kf_easing_type_" + keyEasingType); keyEasingTypeElement.style.stroke = "var(--color-accent)"; keyEasingTypeElement.classList.add('selected_kf_easing_type'); } if (keyEasing !== "linear") document.getElementById("panel_keyframe").querySelector('div.tool.widget.bar_select bb-select').innerHTML = "GeckoLib"; const getEasingArgLabel = (kf) => { switch (kf.easing) { case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBack: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBack: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBack: return 'Overshoot'; case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInElastic: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutElastic: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutElastic: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBounce: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBounce: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBounce: return 'Bounciness'; case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.step: return 'Steps'; default: return 'N/A'; } }; const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null); if (Timeline.selected.every((kf) => (0,_easing__WEBPACK_IMPORTED_MODULE_2__.isArgsEasing)(kf.easing)) && easingArgLabel !== null) { const argDefault = getMultiSelectValue(_easing__WEBPACK_IMPORTED_MODULE_2__.getEasingArgDefault, null, null); const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]); let scaleBar = document.createElement('div'); keyframe.appendChild(scaleBar); scaleBar.outerHTML = `
`; scaleBar = document.getElementById('keyframe_bar_easing_arg1'); } // console.log('easingBar:', easingBar, 'keyframe:', keyframe); } } }; const getEasingInterpolation = (name) => { const matches = name.match(easingRegExp); if (matches) { return matches[2].toLowerCase(); } return name; }; const getEasingType = (name) => { const matches = name.match(easingRegExp); if (matches) { return matches[1].toLowerCase(); } return "in"; }; const updateKeyframe = (kf) => { if (kf.data_points.length != 1 && kf.interpolation !== "linear") { removeLastDataPoint(); } }; const updateKeyframeIcon = (kf) => { // @ts-expect-error This is needed because this plugin uses an outdated version of blockbench-types that doesn't have kf.uuid const element = document.getElementById(kf.uuid); if (element && element.children && kf.easing) element.children[0].className = 'easing-' + kf.easing.split(/\.?(?=[A-Z])/).join('_').toLowerCase().replace("ease_", ""); }; const addDataPoint = () => { Undo.initEdit({ keyframes: Timeline.selected }); Timeline.selected.forEach(kf => { // @ts-expect-error needed because .channels doesn't exist in dev env if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) { kf.data_points.push(new KeyframeDataPoint(kf)); kf.data_points.last().extend(kf.data_points[0]); } }); Animator.preview(); Undo.finishEdit('Add keyframe data point'); }; const removeLastDataPoint = () => { Undo.initEdit({ keyframes: Timeline.selected }); Timeline.selected.forEach(kf => { if (kf.data_points.length >= 2) { kf.data_points.remove(kf.data_points.last()); } }); Animator.preview(); Undo.finishEdit('Remove keyframe data point'); }; const getIcon = (name) => { switch (name) { case "back": return ''; case "bounce": return ''; case "circ": return ''; case "cubic": return ''; case "elastic": return ''; case "expo": case "in": return ''; case "inout": return ''; case "out": return ''; case "quad": return ''; case "quart": return ''; case "quint": return ''; case "sine": return ''; case "step": return ''; default: // linear return ''; } }; /***/ }), /***/ "./ts/codec.ts": /*!*********************!*\ !*** ./ts/codec.ts ***! \*********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ buildDisplaySettingsJson: () => (/* binding */ buildDisplaySettingsJson), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ format: () => (/* binding */ format), /* harmony export */ openProjectSettingsDialog: () => (/* binding */ openProjectSettingsDialog) /* harmony export */ }); /* harmony import */ var _resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../resources/armorTemplate.json */ "./resources/armorTemplate.json"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); const codec = Codecs.bedrock; // This gets automatically applied by Blockbench, we don't need to do anything with it const format = new ModelFormat({ id: _constants__WEBPACK_IMPORTED_MODULE_0__.GECKOLIB_MODEL_ID, name: "GeckoLib Animated Model", category: "minecraft", description: "Animated Model for Java mods using GeckoLib", icon: "view_in_ar", rotate_cubes: true, box_uv: true, optional_box_uv: true, single_texture: true, bone_rig: true, centered_grid: true, animated_textures: true, select_texture_for_particles: true, animation_files: true, locators: true, codec: Codecs.project, display_mode: false, animation_mode: true, }); // Override the new project panel to allow customisation format.new = function () { if (newProject(this)) return openProjectSettingsDialog(); }; /** * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item */ function openProjectSettingsDialog() { if (Project instanceof ModelProject) return createProjectSettingsDialog(Project, createProjectSettingsForm(Project)); } /** * Internal function for determining the placeholder value for the model_identifier form element in dialog windows */ function getObjectIdPlaceholder(formResult) { const name = formResult === null || formResult === void 0 ? void 0 : formResult['name']; const modelType = formResult === null || formResult === void 0 ? void 0 : formResult[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE]; if (!name && !modelType) return 'my_entity'; const invalidPathChar = new RegExp('[^_\\-/.a-z0-9]+', 'g'); const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g'); if (name) return name.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidPathChar, ""); switch (_constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType[modelType]) { case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ENTITY: return 'my_entity'; case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.BLOCK: return 'my_block'; case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM: return 'my_item'; case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ARMOR: return 'my_armor'; case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.OBJECT: return 'my_object'; default: return 'my_entity'; } } /** * Create the Project Settings dialog form for use in both new projects and editing existing ones */ function createProjectSettingsForm(Project) { const form = { format: { type: 'info', label: 'data.format', text: Format.name || 'unknown', description: Format.description } }; const properties = ModelProject['properties']; const modelType = properties[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE]; if (modelType) { form[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] = { label: modelType.label, description: modelType.description, default: _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ENTITY.toUpperCase(), value: _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType[Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE].toUpperCase()].toUpperCase(), placeholder: modelType.placeholder, type: 'select', options: typeof modelType.options == 'function' ? modelType.options() : modelType.options, }; } for (const key in properties) { const property = properties[key]; if (property.exposed === false || !Condition(property.condition)) continue; const entry = form[property.name] = { label: property.label, description: property.description, value: Project[property.name], placeholder: property.placeholder, type: property.type }; if (property.name === 'name') { entry.label = 'Project Name'; entry.placeholder = 'My Project'; entry.description = 'The name of the Blockbench project'; } else if (property.name === 'model_identifier') { entry.label = 'Object ID'; entry.description = 'The registered id of the object this model represents, for exporting purposes'; entry.placeholder = getObjectIdPlaceholder(); } switch (property.type) { case 'boolean': entry.type = 'checkbox'; break; case 'string': entry.type = 'text'; break; default: if (property.options) { entry['options'] = typeof property.options == 'function' ? property.options() : property.options; entry.type = 'select'; } break; } } if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name']) delete form['name']; form['uv_mode'] = { label: 'dialog.project.default_uv_mode', description: 'dialog.project.default_uv_mode.description', type: 'select', condition: Format.optional_box_uv, options: { face_uv: 'dialog.project.uv_mode.face_uv', box_uv: 'dialog.project.uv_mode.box_uv', }, value: Project.box_uv ? 'box_uv' : 'face_uv', }; form['texture_size'] = { label: 'dialog.project.texture_size', type: 'vector', dimensions: 2, value: [Project.texture_width, Project.texture_height], min: 1 }; return form; } /** * Create the 'new project' popup dialogue for GeckoLib projects. *

* The contents of this is mostly a copy of project.js "project_window" action declaration (Copyright Blockbench)
* Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility * @return false if the user clicks cancel, otherwise true */ function createProjectSettingsDialog(Project, form) { const dialog = new Dialog({ id: 'project', title: 'dialog.project.title', width: 500, form, onConfirm: function (formResult) { let save; const box_uv = formResult['uv_mode'] == 'box_uv'; const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity); const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity); if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) { // Adjust UV Mapping if resolution changed if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) { save = Undo.initEdit({ elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true }); Cube.all.forEach(cube => { for (const key in cube.faces) { const uv = cube.faces[key].uv; uv[0] *= texture_width / Project.texture_width; uv[2] *= texture_width / Project.texture_width; uv[1] *= texture_height / Project.texture_height; uv[3] *= texture_height / Project.texture_height; } }); Mesh.all.forEach(mesh => { for (const key in mesh.faces) { const uv = mesh.faces[key].uv; for (const vkey in uv) { uv[vkey][0] *= texture_width / Project.texture_width; uv[vkey][1] *= texture_height / Project.texture_height; } } }); } // Convert UV mode per element if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) { if (!save) save = Undo.initEdit({ elements: Cube.all, uv_only: true, uv_mode: true }); Cube.all.forEach(cube => cube.setUVMode(box_uv)); } if (!save) save = Undo.initEdit({ uv_mode: true }); Project.texture_width = texture_width; Project.texture_height = texture_height; if (Format.optional_box_uv) Project.box_uv = box_uv; Canvas.updateAllUVs(); updateSelection(); } const properties = ModelProject['properties']; for (const key in properties) { properties[key].merge(Project, formResult); } Project.name = Project.name.trim(); Project.model_identifier = Project.model_identifier.trim(); if (save) Undo.finishEdit('Change project UV settings'); Blockbench.dispatchEvent('update_project_settings', formResult); BARS.updateConditions(); if (Project.EditSession) { const metadata = { texture_width: Project.texture_width, texture_height: Project.texture_height, box_uv: Project.box_uv }; for (const key in properties) { properties[key].copy(Project, metadata); } Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata)); } const modelType = _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType[formResult[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE]]; Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] = modelType; if (modelType == _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM) Project.parent = 'builtin/entity'; if (Project.name === Format.name || Project.name === '') Project.name = "GeckoLib " + Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE]; switch (modelType) { case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ARMOR: if (Outliner.root.length === 0) { Codecs.project.parse(_resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_1__, null); } else { alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.'); return false; } break; default: break; } Format.display_mode = modelType === _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM || settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_ALWAYS_SHOW_DISPLAY].value; dialog.hide(); }, onFormChange(formResult) { try { document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult); } // eslint-disable-next-line no-empty catch (ex) { } }, }); dialog.show(); return true; } /** * Export the item display json *

* Only called for GeckoLib projects */ function buildDisplaySettingsJson(options = {}) { if (!Project) return; const modelProperties = {}; if (options['comment'] || settings.credit.value) modelProperties.credit = settings.credit.value; if (options['parent'] || Project.parent != '') modelProperties.parent = Project.parent; if (options['ambientocclusion'] || Project.ambientocclusion === false) modelProperties.ambientocclusion = false; if (Project.texture_width !== 16 || Project.texture_height !== 16) modelProperties.texture_size = [Project.texture_width, Project.texture_height]; if (options['front_gui_light'] || Project.front_gui_light) modelProperties.gui_light = 'front'; if (options['overrides'] || Project.overrides) modelProperties.overrides = Project.overrides; if (options['display'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(Project.display_settings)) { const nonDefaultDisplays = {}; for (const slot in DisplayMode.slots) { const perspective = DisplayMode.slots[slot]; // eslint-disable-next-line no-prototype-builtins if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) { const display = Project.display_settings[perspective].export(); if (display) nonDefaultDisplays[perspective] = display; } } if (!(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(nonDefaultDisplays)) modelProperties.display = nonDefaultDisplays; } if (options['textures'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(Project.textures)) { for (const texture of Project.textures) { if (texture.particle || (settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) { let name = texture.name; if (name.indexOf(".png") > 0) name = name.substring(0, name.indexOf(".png")); if (!(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isValidPath)(name)) { name = name.toLowerCase().replace(" ", "_"); if (!(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isValidPath)(name)) continue; } name = (Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] == _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.BLOCK ? "block/" : "item/") + name; if (Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODID]) name = Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODID] + ":" + name; modelProperties.textures = { 'particle': name }; break; } } } Blockbench.export({ resource_id: 'model', type: Codecs.java_block.name, extensions: ['json'], name: Project.model_identifier ? (Project.model_identifier + ".json") : codec.fileName().replace(".geo", ""), startpath: Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display, content: JSON.stringify(modelProperties, null, 2), }, file_path => { const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display; Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display = settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display) Project.saved = false; }); return this; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (codec); /***/ }), /***/ "./ts/constants.ts": /*!*************************!*\ !*** ./ts/constants.ts ***! \*************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BAKE_IN_BEZIER_KEYFRAMES: () => (/* binding */ BAKE_IN_BEZIER_KEYFRAMES), /* harmony export */ GECKOLIB_MODEL_ID: () => (/* binding */ GECKOLIB_MODEL_ID), /* harmony export */ GeckoModelType: () => (/* binding */ GeckoModelType), /* harmony export */ PROPERTY_FILEPATH_CACHE: () => (/* binding */ PROPERTY_FILEPATH_CACHE), /* harmony export */ PROPERTY_MODEL_TYPE: () => (/* binding */ PROPERTY_MODEL_TYPE), /* harmony export */ PROPERTY_MODID: () => (/* binding */ PROPERTY_MODID), /* harmony export */ SETTING_ALWAYS_SHOW_DISPLAY: () => (/* binding */ SETTING_ALWAYS_SHOW_DISPLAY), /* harmony export */ SETTING_AUTO_PARTICLE_TEXTURE: () => (/* binding */ SETTING_AUTO_PARTICLE_TEXTURE), /* harmony export */ SETTING_DEFAULT_MODID: () => (/* binding */ SETTING_DEFAULT_MODID), /* harmony export */ SETTING_REMEMBER_EXPORT_LOCATIONS: () => (/* binding */ SETTING_REMEMBER_EXPORT_LOCATIONS) /* harmony export */ }); /** * GeckoLib plugin model format ID. Used to identify model types generated from this plugin */ const GECKOLIB_MODEL_ID = "animated_entity_model"; // Setting name constants const SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture'; const SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display'; const SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations'; const SETTING_DEFAULT_MODID = 'geckolib_default_modid'; const BAKE_IN_BEZIER_KEYFRAMES = "geckolib_bake_in_bezier_keyframes"; // Property name constants const PROPERTY_MODID = 'geckolib_modid'; const PROPERTY_MODEL_TYPE = 'geckolib_model_type'; const PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache'; /** * Available GeckoLib model types */ var GeckoModelType; (function (GeckoModelType) { GeckoModelType["ENTITY"] = "Entity"; GeckoModelType["BLOCK"] = "Block"; GeckoModelType["ITEM"] = "Item"; GeckoModelType["ARMOR"] = "Armor"; GeckoModelType["OBJECT"] = "Object"; })(GeckoModelType || (GeckoModelType = {})); /***/ }), /***/ "./ts/easing.ts": /*!**********************!*\ !*** ./ts/easing.ts ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EASING_DEFAULT: () => (/* binding */ EASING_DEFAULT), /* harmony export */ EASING_OPTIONS: () => (/* binding */ EASING_OPTIONS), /* harmony export */ easingFunctions: () => (/* binding */ easingFunctions), /* harmony export */ getEasingArgDefault: () => (/* binding */ getEasingArgDefault), /* harmony export */ isArgsEasing: () => (/* binding */ isArgsEasing), /* harmony export */ parseEasingArg: () => (/* binding */ parseEasingArg), /* harmony export */ reverseEasing: () => (/* binding */ reverseEasing) /* harmony export */ }); // The MIT license notice below applies to the function findIntervalBorderIndex /* The MIT License (MIT) Copyright (c) 2015 Boris Chumichev 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. /** * * Utilizes bisection method to search an interval to which * point belongs to, then returns an index of left or right * border of the interval * * @param {Number} point * @param {Array} intervals * @param {Boolean} useRightBorder * @returns {Number} */ function findIntervalBorderIndex(point, intervals, useRightBorder) { //If point is beyond given intervals if (point < intervals[0]) return 0; if (point > intervals[intervals.length - 1]) return intervals.length - 1; //If point is inside interval //Start searching on a full range of intervals let indexOfNumberToCompare = 0; let leftBorderIndex = 0; let rightBorderIndex = intervals.length - 1; //Reduce searching range till it find an interval point belongs to using binary search while (rightBorderIndex - leftBorderIndex !== 1) { indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2); point >= intervals[indexOfNumberToCompare] ? leftBorderIndex = indexOfNumberToCompare : rightBorderIndex = indexOfNumberToCompare; } return useRightBorder ? rightBorderIndex : leftBorderIndex; } function stepRange(steps, stop = 1) { if (steps < 2) throw new Error("steps must be > 2, got:" + steps); const stepLength = stop / steps; return Array.from({ length: steps }, (_, i) => i * stepLength); } // The MIT license notice below applies to the Easing class /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ class Easing { /** * A stepping function, returns 1 for any positive value of `n`. */ static step0(n) { return n > 0 ? 1 : 0; } /** * A stepping function, returns 1 if `n` is greater than or equal to 1. */ static step1(n) { return n >= 1 ? 1 : 0; } /** * A linear function, `f(t) = t`. Position correlates to elapsed time one to * one. * * http://cubic-bezier.com/#0,0,1,1 */ static linear(t) { return t; } /** * A simple inertial interaction, similar to an object slowly accelerating to * speed. * * http://cubic-bezier.com/#.42,0,1,1 */ // static ease(t) { // if (!ease) { // ease = Easing.bezier(0.42, 0, 1, 1); // } // return ease(t); // } /** * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed * time. * * http://easings.net/#easeInQuad */ static quad(t) { return t * t; } /** * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed * time. * * http://easings.net/#easeInCubic */ static cubic(t) { return t * t * t; } /** * A power function. Position is equal to the Nth power of elapsed time. * * n = 4: http://easings.net/#easeInQuart * n = 5: http://easings.net/#easeInQuint */ static poly(n) { return (t) => Math.pow(t, n); } /** * A sinusoidal function. * * http://easings.net/#easeInSine */ static sin(t) { return 1 - Math.cos((t * Math.PI) / 2); } /** * A circular function. * * http://easings.net/#easeInCirc */ static circle(t) { return 1 - Math.sqrt(1 - t * t); } /** * An exponential function. * * http://easings.net/#easeInExpo */ static exp(t) { return Math.pow(2, 10 * (t - 1)); } /** * A simple elastic interaction, similar to a spring oscillating back and * forth. * * Default bounciness is 1, which overshoots a little bit once. 0 bounciness * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N * times. * * http://easings.net/#easeInElastic */ static elastic(bounciness = 1) { const p = bounciness * Math.PI; return (t) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p); } /** * Use with `Animated.parallel()` to create a simple effect where the object * animates back slightly as the animation starts. * * Wolfram Plot: * * - http://tiny.cc/back_default (s = 1.70158, default) */ static back(s = 1.70158) { return (t) => t * t * ((s + 1) * t - s); } /** * Provides a simple bouncing effect. * * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up * using min instead of ternaries * http://easings.net/#easeInBounce */ static bounce(k = 0.5) { const q = (x) => (121 / 16) * x * x; const w = (x) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k; const r = (x) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k; const t = (x) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k; return (x) => Math.min(q(x), w(x), r(x), t(x)); } /** * Provides a cubic bezier curve, equivalent to CSS Transitions' * `transition-timing-function`. * * A useful tool to visualize cubic bezier curves can be found at * http://cubic-bezier.com/ */ // static bezier(x1, y1, x2, y2) { // const _bezier = require('./bezier'); // return _bezier(x1, y1, x2, y2); // } /** * Runs an easing function forwards. */ static in(easing) { return easing; } /** * Runs an easing function backwards. */ static out(easing) { return (t) => 1 - easing(1 - t); } /** * Makes any easing function symmetrical. The easing function will run * forwards for half of the duration, then backwards for the rest of the * duration. */ static inOut(easing) { return (t) => { if (t < 0.5) { return easing(t * 2) / 2; } return 1 - easing((1 - t) * 2) / 2; }; } } const quart = Easing.poly(4); const quint = Easing.poly(5); const back = (direction, scalar, t) => direction(Easing.back(1.70158 * scalar))(t); const elastic = (direction, bounciness, t) => direction(Easing.elastic(bounciness))(t); const bounce = (direction, bounciness, t) => direction(Easing.bounce(bounciness))(t); const easingFunctions = { linear: Easing.linear, step(steps, x) { const intervals = stepRange(steps); return intervals[findIntervalBorderIndex(x, intervals, false)]; }, easeInQuad: Easing.in(Easing.quad), easeOutQuad: Easing.out(Easing.quad), easeInOutQuad: Easing.inOut(Easing.quad), easeInCubic: Easing.in(Easing.cubic), easeOutCubic: Easing.out(Easing.cubic), easeInOutCubic: Easing.inOut(Easing.cubic), easeInQuart: Easing.in(quart), easeOutQuart: Easing.out(quart), easeInOutQuart: Easing.inOut(quart), easeInQuint: Easing.in(quint), easeOutQuint: Easing.out(quint), easeInOutQuint: Easing.inOut(quint), easeInSine: Easing.in(Easing.sin), easeOutSine: Easing.out(Easing.sin), easeInOutSine: Easing.inOut(Easing.sin), easeInExpo: Easing.in(Easing.exp), easeOutExpo: Easing.out(Easing.exp), easeInOutExpo: Easing.inOut(Easing.exp), easeInCirc: Easing.in(Easing.circle), easeOutCirc: Easing.out(Easing.circle), easeInOutCirc: Easing.inOut(Easing.circle), easeInBack: back.bind(null, Easing.in), easeOutBack: back.bind(null, Easing.out), easeInOutBack: back.bind(null, Easing.inOut), easeInElastic: elastic.bind(null, Easing.in), easeOutElastic: elastic.bind(null, Easing.out), easeInOutElastic: elastic.bind(null, Easing.inOut), easeInBounce: bounce.bind(null, Easing.in), easeOutBounce: bounce.bind(null, Easing.out), easeInOutBounce: bounce.bind(null, Easing.inOut), }; // Object with the same keys as easingFunctions and values of the stringified key names const EASING_OPTIONS = Object.freeze(Object.fromEntries(Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]])))); const EASING_DEFAULT = 'linear'; const getEasingArgDefault = (kf) => { switch (kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: return 1; case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return 0.5; case EASING_OPTIONS.step: return 5; default: return null; } }; const parseEasingArg = (kf, value) => { switch (kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return parseFloat(value); case EASING_OPTIONS.step: return Math.max(parseInt(value, 10), 2); default: return parseInt(value, 10); } }; function reverseEasing(easing) { if (!easing) return easing; if (easing.startsWith("easeInOut")) return easing; if (easing.startsWith("easeIn")) return easing.replace("easeIn", "easeOut"); if (easing.startsWith("easeOut")) return easing.replace("easeOut", "easeIn"); return easing; } const isArgsEasing = (easing = "") => easing.includes("Back") || easing.includes("Elastic") || easing.includes("Bounce") || easing === EASING_OPTIONS.step; /***/ }), /***/ "./ts/events.ts": /*!**********************!*\ !*** ./ts/events.ts ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ addEventListeners: () => (/* binding */ addEventListeners), /* harmony export */ removeEventListeners: () => (/* binding */ removeEventListeners) /* harmony export */ }); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./keyframe */ "./ts/keyframe.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); /* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./codec */ "./ts/codec.ts"); function addEventListeners() { (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('save_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSave)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Animator, null, "buildFile", monkeypatchAnimatorBuildFile); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Animator, null, "loadFile", monkeypatchAnimatorLoadFile); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Blockbench, null, "export", monkeypatchBlockbenchExport); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(BarItems, 'project_window', "click", monkeypatchProjectWindowClick); } function removeEventListeners() { (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeMonkeypatches)(); } /** * When an existing GeckoLib project is being read from file */ function onProjectParse(e) { onSettingsChanged(); // Because the project hasn't had its model properties applied at this stage Format.display_mode = (e.model[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_MODEL_TYPE] && e.model[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_1__.GeckoModelType.ITEM) || settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_ALWAYS_SHOW_DISPLAY].value; } /** * When the Blockbench project is being saved *

* Only called for GeckoLib projects */ function onProjectSave(e) { if (!settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_REMEMBER_EXPORT_LOCATIONS].value) e.model[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE] = {}; } /** * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to *

* Only called for GeckoLib projects */ function onSettingsChanged() { Modes.selected.select(); Format.display_mode = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.hasModelDisplaySettings)(); if (Project instanceof ModelProject && Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_1__.GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) { Project.parent = 'builtin/entity'; Project.saved = false; } } /** * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs *

* Only called for GeckoLib projects */ function onProjectSelect() { onSettingsChanged(); } /** * When selecting edit/paint/display/animate/etc *

* Only called for GeckoLib projects */ function onModeSelect(e) { // Offset the display emulator to account for GeckoLib's +0.51 manual offset // This is a legacy patch as Blockbench no longer does this internally if (e.mode.id == 'display') Project.model_3d.position.y = 0; } /** * When the model geometry is being compiled for export *

* Only called for GeckoLib projects */ function onBedrockCompile(e) { var _a; // Remove display transforms from non-bedrock geometry (_a = e.model["minecraft:geometry"]) === null || _a === void 0 ? void 0 : _a.forEach((geo) => delete geo["item_display_transforms"]); // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established switch (e.model.format_version) { case "1.14.0": case "1.21.0": case "1.21.20": e.model.format_version = "1.12.0"; break; default: break; } } /** * When the project settings window is being opened, either via a new project or the File -> Project... menu item *

* The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchProjectWindowClick() { if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) { (0,_codec__WEBPACK_IMPORTED_MODULE_2__.openProjectSettingsDialog)(); } else { _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(BarItems).click(); } } /** * When any file is being exported to disk by Blockbench *

* The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchBlockbenchExport(options, cb) { if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) { _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb); return; } if (Project instanceof ModelProject) { if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON const fileName = Project.model_identifier && Project.model_identifier + ".animation"; options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation; const parentCallback = cb; cb = file_path => { if (parentCallback) parentCallback(file_path); const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation; Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation = settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation) Project.saved = false; }; if (fileName) options.name = fileName; } else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo const fileName = Project.model_identifier && Project.model_identifier + ".geo"; options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model; const parentWriter = options.custom_writer; const parentCallback = cb; if (parentWriter) { options.custom_writer = (content, filePath, callback) => { parentWriter(content, filePath, callback); callback(filePath); }; } cb = file_path => { if (parentCallback) parentCallback(file_path); const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model; Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model = settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model) Project.saved = false; }; if (fileName) options.name = fileName; } } _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb); } /** * When the animation file is being loaded into the project *

* The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchAnimatorLoadFile(file, exportingAnims) { // eslint-disable-next-line no-undef const json = file.json || autoParseJSON(file.content); const path = file.path; const new_animations = []; function geoLoopToBbLoop(jsonLoop) { if (jsonLoop) { if (typeof jsonLoop === 'boolean') return jsonLoop ? 'loop' : 'once'; if (typeof jsonLoop === 'string') { if (jsonLoop === "hold_on_last_frame") return 'hold'; if (jsonLoop === "loop" || jsonLoop === "true") return 'loop'; } } return 'once'; } function getKeyframeDataPoints(source) { if (source instanceof Array) return [{ x: source[0], y: source[1], z: source[2], }]; if (['number', 'string'].includes(typeof source)) return [{ x: source, y: source, z: source }]; if (typeof source == 'object') { if (source.vector) return getKeyframeDataPoints(source.vector); const points = []; if (source.pre) points.push(getKeyframeDataPoints(source.pre)[0]); if (source.post) points.push(getKeyframeDataPoints(source.post)[0]); return points; } } if (json && typeof json.animations === 'object') { for (const animName in json.animations) { if (exportingAnims && !exportingAnims.includes(animName)) continue; //Animation const animData = json.animations[animName]; const animation = new Blockbench.Animation({ name: animName, path, loop: geoLoopToBbLoop(animData.loop), override: animData.override_previous_animation, anim_time_update: (typeof animData.anim_time_update == 'string' ? animData.anim_time_update.replace(/;(?!$)/, ';\n') : animData.anim_time_update), blend_weight: (typeof animData.blend_weight == 'string' ? animData.blend_weight.replace(/;(?!$)/, ';\n') : animData.blend_weight), length: animData.animation_length }).add(); //Bones if (animData.bones) { for (const boneName in animData.bones) { const bone = animData.bones[boneName]; const lowercase_bone_name = boneName.toLowerCase(); const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name); const uuid = group ? group.uuid : guid(); let ga; // eslint-disable-line @typescript-eslint/no-unused-vars const boneAnimator = new _keyframe__WEBPACK_IMPORTED_MODULE_3__.GeckolibBoneAnimator(uuid, animation, boneName); animation.animators[uuid] = boneAnimator; //Channels for (const channel in bone) { if (Animator.possible_channels[channel]) { if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel].easing, easingArgs: bone[channel].easingArgs, data_points: getKeyframeDataPoints(bone[channel]), }); } else if (typeof bone[channel] === 'object' && bone[channel].post) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel].easing == "bezier" ? undefined : bone[channel].easing, easingArgs: bone[channel].easingArgs, interpolation: bone[channel].easing == "bezier" ? "bezier" : bone[channel].lerp_mode, data_points: getKeyframeDataPoints(bone[channel]), bezier_right_time: bone[channel].right_time, bezier_left_time: bone[channel].left_time, bezier_left_value: bone[channel].left, bezier_right_value: bone[channel].right }); } else if (typeof bone[channel] === 'object') { for (const timestamp in bone[channel]) { boneAnimator.addKeyframe({ time: parseFloat(timestamp), channel, easing: bone[channel][timestamp].easing == "bezier" ? undefined : bone[channel][timestamp].easing, easingArgs: bone[channel][timestamp].easingArgs, interpolation: bone[channel][timestamp].easing == "bezier" ? "bezier" : bone[channel][timestamp].lerp_mode, data_points: getKeyframeDataPoints(bone[channel][timestamp]), bezier_right_time: bone[channel][timestamp].right_time, bezier_left_time: bone[channel][timestamp].left_time, bezier_left_value: bone[channel][timestamp].left, bezier_right_value: bone[channel][timestamp].right }); } } } } } } if (animData.sound_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.sound_effects) { const sounds = animData.sound_effects[timestamp]; animation.animators.effects.addKeyframe({ channel: 'sound', time: parseFloat(timestamp), data_points: sounds instanceof Array ? sounds : [sounds] }); } } if (animData.particle_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.particle_effects) { let particles = animData.particle_effects[timestamp]; if (!(particles instanceof Array)) particles = [particles]; particles.forEach(particle => { if (particle) particle.script = particle.pre_effect_script; }); animation.animators.effects.addKeyframe({ channel: 'particle', time: parseFloat(timestamp), data_points: particles }); } } if (animData.timeline) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.timeline) { const entry = animData.timeline[timestamp]; const script = entry instanceof Array ? entry.join('\n') : entry; animation.animators.effects.addKeyframe({ channel: 'timeline', time: parseFloat(timestamp), data_points: [{ script }] }); } } animation.calculateSnappingFromKeyframes(); if (!Blockbench.Animation.selected && Animator.open) animation.select(); new_animations.push(animation); } } return new_animations; } /** * When the animations JSON is being compiled for export *

* Makes sure bezier keyframes get exported correctly rather than being baked. */ function monkeypatchAnimatorBuildFile() { var _a; const bezierKeys = []; if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_1__.BAKE_IN_BEZIER_KEYFRAMES].value) { let animation; this.animations.forEach(a => { if (a.name == arguments[1][0]) animation = a; return; }); if (animation) { for (const uuid in animation.animators) { const animator = animation.animators[uuid]; if (!animator.keyframes.length && !animator.rotation_global) continue; if (animator.type == 'bone') { for (const channel in Animator.possible_channels) { if (!((_a = animator[channel]) === null || _a === void 0 ? void 0 : _a.length)) continue; const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time); sorted_keyframes.forEach((kf) => { if (kf.interpolation == "bezier") { bezierKeys[bezierKeys.length] = kf; kf.interpolation = "geckolib_bezier"; } }); } } } } } const result = _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Animator).buildFile.apply(this, arguments); if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_1__.BAKE_IN_BEZIER_KEYFRAMES].value) { result.geckolib_format_version = 2; bezierKeys.forEach((kf) => { kf.interpolation = "bezier"; kf.easing = undefined; }); } return result; } /***/ }), /***/ "./ts/keyframe.ts": /*!************************!*\ !*** ./ts/keyframe.ts ***! \************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GeckolibBoneAnimator: () => (/* binding */ GeckolibBoneAnimator), /* harmony export */ loadKeyframeOverrides: () => (/* binding */ loadKeyframeOverrides), /* harmony export */ unloadKeyframeOverrides: () => (/* binding */ unloadKeyframeOverrides) /* harmony export */ }); /* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/groupBy */ "./node_modules/lodash/groupBy.js"); /* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/mapValues */ "./node_modules/lodash/mapValues.js"); /* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./easing */ "./ts/easing.ts"); var Keyframe = Blockbench.Keyframe; function loadKeyframeOverrides() { (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "getLerp", keyframeGetLerp); (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "compileBedrockKeyframe", keyframeCompileBedrock); (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "getUndoCopy", keyframeGetUndoCopy); (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "extend", keyframeExtend); (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(BarItems.reverse_keyframes, null, "click", onReverseKeyframes); } function unloadKeyframeOverrides() { //No-op for now since monkeypatches are unloaded automatically } // This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch class GeckolibBoneAnimator extends BoneAnimator { addKeyframe(data, uuid) { const keyframe = super.addKeyframe(data, uuid); if (data.bezier_left_time) keyframe.bezier_left_time = data.bezier_left_time; if (data.bezier_right_time) keyframe.bezier_right_time = data.bezier_right_time; if (data.bezier_right_value) keyframe.bezier_right_value = data.bezier_right_value; if (data.bezier_left_value) keyframe.bezier_left_value = data.bezier_left_value; return keyframe; } } function lerp(start, stop, amt) { return amt * (stop - start) + start; } // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars function keyframeGetLerp(other, axis, amount, allow_expression) { const easing = other.easing || _easing__WEBPACK_IMPORTED_MODULE_3__.EASING_DEFAULT; if (Format.id !== "animated_entity_model") { return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getLerp.apply(this, arguments); } let easingFunc = _easing__WEBPACK_IMPORTED_MODULE_3__.easingFunctions[easing]; if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) { const arg1 = Array.isArray(other.easingArgs) && other.easingArgs.length > 0 ? other.easingArgs[0] : (0,_easing__WEBPACK_IMPORTED_MODULE_3__.getEasingArgDefault)(other); // console.log(`keyframeGetLerp arg1: ${arg1}`); easingFunc = easingFunc.bind(null, arg1); } const easedAmount = easingFunc(amount); const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1); const stop = other.calc(axis); const result = lerp(start, stop, easedAmount); // console.log('keyframeGetLerp easing:', easing, 'arguments:', arguments, 'start:', start, 'stop:', stop, 'amount:', amount, 'easedAmount:', easedAmount, 'result:', result); if (Number.isNaN(result)) { throw new Error('batman'); } return result; } function geckolibGetArray(data_point = 0) { const { easing, easingArgs, getArray } = this; let result = getArray.apply(this, [data_point]); if (this.interpolation == "geckolib_bezier") { result = { vector: result, easing: "bezier", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time }; } else if (Format.id === "animated_entity_model") { if (this.data_points.length != 1) result = { pre: result, post: getArray.apply(this, [1]), easing }; else result = { vector: result, easing }; if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) result.easingArgs = easingArgs; } return result; } function keyframeCompileBedrock() { if (Format.id !== "animated_entity_model" || !this.transform) { return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments); } if (this.interpolation == 'catmullrom') { const previous = this.getPreviousKeyframe.apply(this); const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom'); return { pre: include_pre ? geckolibGetArray.call(this, [0]) : undefined, post: geckolibGetArray.call(this, [include_pre ? 1 : 0]), lerp_mode: this.interpolation, }; } else if (this.data_points.length == 1) { return geckolibGetArray.call(this); } else { return geckolibGetArray.call(this, [0]); } } function keyframeGetUndoCopy() { const { easing, easingArgs } = this; const result = _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments); if (Format.id === "animated_entity_model") { Object.assign(result, { easing }); if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) result.easingArgs = easingArgs; } // console.log('keyframeGetUndoCopy arguments:', arguments, 'this:', this, 'result:', result); return result; } function keyframeExtend(dataIn) { const data = Object.assign({}, dataIn); // console.log('keyframeExtend 1 arguments:', arguments); if (Format.id === "animated_entity_model") { if (typeof data.values === 'object') { if (data.values.easing !== undefined) { Merge.string(this, data.values, 'easing'); } if (Array.isArray(data.values.easingArgs)) { this.easingArgs = data.values.easingArgs; } if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) { // Convert data to format expected by KeyframeExtendOriginal data.values = data.values.vector; } } else { if (data.easing !== undefined) { Merge.string(this, data, 'easing'); } if (Array.isArray(data.easingArgs)) { this.easingArgs = data.easingArgs; } } } const result = _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).extend.apply(this, arguments); // console.log('keyframeExtend 2 arguments:', arguments, 'this:', this, 'result:', result); return result; } function onReverseKeyframes() { _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments); // console.log('@@@ onReverseKeyframes selected:', Timeline.selected); // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead Undo.initEdit({ keyframes: Timeline.selected }); const kfByAnimator = lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected, kf => kf.animator.uuid); const kfByAnimatorAndChannel = lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default()(kfByAnimator, keyframesForAnimator => lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(keyframesForAnimator, kf => kf.channel)); Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => { const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid]; Object.keys(animatorChannelGroups).forEach(channel => { const channelKeyframes = animatorChannelGroups[channel]; // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time); // Reverse easing direction const easingData = channelKeyframes.map((kf) => ({ easing: (0,_easing__WEBPACK_IMPORTED_MODULE_3__.reverseEasing)(kf.easing), easingArgs: kf.easingArgs })); // console.log('@@@ onReverseKeyframes PRE animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes, 'easingData:', easingData); // Shift easing data to the right by one keyframe channelKeyframes.forEach((kf, i) => { if (i == 0) { kf.easing = undefined; kf.easingArgs = undefined; return; } const newEasingData = easingData[i - 1]; kf.easing = newEasingData.easing; kf.easingArgs = newEasingData.easingArgs; }); // console.log('@@@ onReverseKeyframes POST animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes); }); }); // console.log('@@@ kfByAnimator:', kfByAnimator, "\nkfByAnimatorAndChannel:", kfByAnimatorAndChannel); Undo.finishEdit('Reverse keyframe easing'); updateKeyframeSelection(); Animator.preview(); } /***/ }), /***/ "./ts/utils.ts": /*!*********************!*\ !*** ./ts/utils.ts ***! \*********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Monkeypatches: () => (/* binding */ Monkeypatches), /* harmony export */ addCodecCallback: () => (/* binding */ addCodecCallback), /* harmony export */ addEventListener: () => (/* binding */ addEventListener), /* harmony export */ addMonkeypatch: () => (/* binding */ addMonkeypatch), /* harmony export */ hasModelDisplaySettings: () => (/* binding */ hasModelDisplaySettings), /* harmony export */ isEmpty: () => (/* binding */ isEmpty), /* harmony export */ isGeckoLibModel: () => (/* binding */ isGeckoLibModel), /* harmony export */ isValidNamespace: () => (/* binding */ isValidNamespace), /* harmony export */ isValidPath: () => (/* binding */ isValidPath), /* harmony export */ make: () => (/* binding */ make), /* harmony export */ onlyIfGeckoLib: () => (/* binding */ onlyIfGeckoLib), /* harmony export */ removeCodecCallback: () => (/* binding */ removeCodecCallback), /* harmony export */ removeEventListener: () => (/* binding */ removeEventListener), /* harmony export */ removeMonkeypatches: () => (/* binding */ removeMonkeypatches) /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); const VALID_NAMESPACE_PATTERN = new RegExp('^[_\\-.a-z0-9]+$'); const VALID_PATH_PATTERN = new RegExp('^[_\\-/.a-z0-9]+$'); const Monkeypatches = new Map(); /** * Add what is effectively an override of another javascript function in a target object. *

* The patched function should call the original first and operate on the result to ensure compatibility *

* * @param symbol The target object * @param path The property of the target to access, or null to access the root target itself * @param functionKey The name of the function to replace * @param newFunction The function to patch in to replace the target */ const addMonkeypatch = (symbol, path, functionKey, newFunction) => { const pathAccessor = path ? symbol[path] : symbol; if (!Monkeypatches.get(symbol)) Monkeypatches.set(symbol, { _pathAccessor: pathAccessor }); Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey]; pathAccessor[functionKey] = newFunction; }; /** * Remove all previously added monkeypatches, reverting their operation to prior to the patch */ const removeMonkeypatches = () => { Monkeypatches.forEach(symbol => { Object.keys(symbol).forEach(functionKey => { if (functionKey.startsWith('_')) return; symbol._pathAccessor[functionKey] = symbol[functionKey]; }); }); Monkeypatches.clear(); }; /** * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety */ const onlyIfGeckoLib = (callback) => { return e => { if (isGeckoLibModel()) callback(e); }; }; /** * Add an event listener to Blockbench's event callback system. *

* This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ const addEventListener = (eventName, callback) => { Blockbench.on(eventName, callback); }; /** * Remove a previously registered event listener from Blockbench's event callback system. *

* All registered event listeners should be removed when the plugin or codec is unloaded */ const removeEventListener = (eventName, callback) => { Blockbench.removeListener(eventName, callback); }; /** * Add a callback to a codec to be called after the task has been completed *

* This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ const addCodecCallback = (codec, taskName, callback) => { codec.on(taskName, callback); }; /** * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable */ function make(obj, consumer) { consumer(obj); return obj; } /** * Remove a previously added codec task completion callback *

* All registered coded callbacks should be removed when the plugin or codec is unloaded */ const removeCodecCallback = (codec, taskName, callback) => { codec.removeListener(taskName, callback); }; /** * Whether a given string is a valid ResourceLocation path for Minecraft */ const isValidPath = (path) => { return VALID_PATH_PATTERN.test(path); }; /** * Whether a given string is a valid ResourceLocation namespace for Minecraft */ const isValidNamespace = (namespace) => { return VALID_NAMESPACE_PATTERN.test(namespace); }; /** * Whether a map-like object has no defined keys or values */ const isEmpty = (object = {}) => Object.keys(object).length === 0; /** * Whether the currently focussed model is a GeckoLib model */ const isGeckoLibModel = () => Format.id === _constants__WEBPACK_IMPORTED_MODULE_0__.GECKOLIB_MODEL_ID; /** * Whether the current project is a GeckoLib model that has or uses item render perspective transforms */ const hasModelDisplaySettings = () => isGeckoLibModel() && Project && ((Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM || !isEmpty(Project.display_settings)) || settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_ALWAYS_SHOW_DISPLAY].value); /***/ }), /***/ "data:font/woff2;base64,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": /*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** data:font/woff2;base64,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 ***! \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /***/ ((module) => { "use strict"; module.exports = "data:font/woff2;base64,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"; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ loaded: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = __webpack_modules__; /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/global */ /******/ (() => { /******/ __webpack_require__.g = (function() { /******/ if (typeof globalThis === 'object') return globalThis; /******/ try { /******/ return this || new Function('return this')(); /******/ } catch (e) { /******/ if (typeof window === 'object') return window; /******/ } /******/ })(); /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/node module decorator */ /******/ (() => { /******/ __webpack_require__.nmd = (module) => { /******/ module.paths = []; /******/ if (!module.children) module.children = []; /******/ return module; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/jsonp chunk loading */ /******/ (() => { /******/ __webpack_require__.b = document.baseURI || self.location.href; /******/ /******/ // object to store loaded and loading chunks /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ "main": 0 /******/ }; /******/ /******/ // no chunk on demand loading /******/ /******/ // no prefetching /******/ /******/ // no preloaded /******/ /******/ // no HMR /******/ /******/ // no HMR manifest /******/ /******/ // no on chunks loaded /******/ /******/ // no jsonp function /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { "use strict"; /*!*********************!*\ !*** ./ts/index.ts ***! \*********************/ __webpack_require__.r(__webpack_exports__); /* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! semver/functions/coerce */ "./node_modules/semver/functions/coerce.js"); /* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! semver/functions/satisfies */ "./node_modules/semver/functions/satisfies.js"); /* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../package.json */ "./package.json"); /* harmony import */ var _animationUi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./animationUi */ "./ts/animationUi.ts"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keyframe */ "./ts/keyframe.ts"); /* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./codec */ "./ts/codec.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); /* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./events */ "./ts/events.ts"); const { version, blockbenchConfig } = _package_json__WEBPACK_IMPORTED_MODULE_2__; const SUPPORTED_BB_VERSION_RANGE = `${blockbenchConfig.min_version} - ${blockbenchConfig.max_version}`; // eslint-disable-next-line @typescript-eslint/no-var-requires const css = (__webpack_require__(/*! ../resources/easing_keyframes.css */ "./resources/easing_keyframes.css").toString)(); if (!semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default()(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default()(Blockbench.version), SUPPORTED_BB_VERSION_RANGE)) alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`); // Register the plugin and define what it adds (function () { let pluginSettings; let pluginProperties; let pluginMenuItems; BBPlugin.register("animation_utils", Object.assign({}, blockbenchConfig, { name: blockbenchConfig.title, version, await_loading: true, onload() { Blockbench.addCSS(css); (0,_events__WEBPACK_IMPORTED_MODULE_3__.addEventListeners)(); (0,_animationUi__WEBPACK_IMPORTED_MODULE_4__.loadAnimationUI)(); (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.loadKeyframeOverrides)(); pluginSettings = createPluginSettings(); pluginProperties = createPluginProperties(); pluginMenuItems = createPluginMenuItems(); for (const menuItem of pluginMenuItems) { MenuBar.addAction(menuItem.action, menuItem.menuCategory); } console.log("Loaded GeckoLib plugin"); }, onunload() { for (const setting of pluginSettings) { setting.delete(); } for (const property of pluginProperties) { property.delete(); } for (const menuItem of pluginMenuItems) { menuItem.action.delete(); } (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.unloadKeyframeOverrides)(); (0,_animationUi__WEBPACK_IMPORTED_MODULE_4__.unloadAnimationUI)(); (0,_events__WEBPACK_IMPORTED_MODULE_3__.removeEventListeners)(); _codec__WEBPACK_IMPORTED_MODULE_6__.format.delete(); console.clear(); }, })); })(); /** * Create and return the plugin's settings. *

* These are found in the Settings panel in the plugin info window */ function createPluginSettings() { return [ new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_AUTO_PARTICLE_TEXTURE, { value: true, category: "export", name: "Auto-compute block/item particle texture", description: "Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json" }), new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.BAKE_IN_BEZIER_KEYFRAMES, { value: false, category: "export", name: "Bake in bezier keyframes", description: "When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier." }), new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_ALWAYS_SHOW_DISPLAY, { value: false, category: "edit", name: "Always show display tab", description: "Force the Display tab to always show, even when not an Item type model" }), new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_REMEMBER_EXPORT_LOCATIONS, { value: true, category: "export", name: "Remember file export locations", description: "Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file." }), (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID, { // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore type: 'text', value: "", category: "export", name: "Default Mod ID", description: "Default Mod ID for models (if applicable)" }), setting => { setting.onChange = function () { const invalidNamespaceChar = new RegExp('[^_\\-.a-z0-9]+', 'g'); const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g'); this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidNamespaceChar, ""); return {}; }; }) ]; } /** * Create and return the plugin's properties. *

* These are metadata values stored in the project, usually used in project settings windows */ function createPluginProperties() { return [ (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Property(ModelProject, "string", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODID, { label: "Mod ID", condition: { formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID] }, values: [], merge_validation: _utils__WEBPACK_IMPORTED_MODULE_8__.isValidNamespace }), property => { property['placeholder'] = 'my_modid'; property['description'] = 'The modid of the mod this model is for'; property.getDefault = function () { return settings[_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID].value; }; }), (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Property(ModelProject, "enum", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE, { label: "Model Type", condition: { formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID] }, exposed: false, options: _constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType, values: Object.values(_constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType) }), property => { property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure'; }), (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Property(ModelProject, "instance", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_FILEPATH_CACHE, { label: "GeckoLib Filepath Cache", condition: { formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID] }, exposed: false, values: [] }), property => { property.default = {}; }) ]; } /** * Create and return the plugin's menu items *

* These are added to Blockbench's menu bar or submenus */ function createPluginMenuItems() { return [ { action: new Action("export_geckolib_model", { name: "Export GeckoLib Model", icon: "archive", description: "Export your model geometry as a model for GeckoLib.", category: "file", condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_8__.isGeckoLibModel)(), click: function () { _codec__WEBPACK_IMPORTED_MODULE_6__["default"].export(); }, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_display", { name: "Export GeckoLib Display Settings", icon: "icon-bb_interface", description: "Export your item/block display settings for GeckoLib.", category: "file", condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_8__.isGeckoLibModel)() && (0,_utils__WEBPACK_IMPORTED_MODULE_8__.hasModelDisplaySettings)(), click: _codec__WEBPACK_IMPORTED_MODULE_6__.buildDisplaySettingsJson, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_animations", { name: "Export GeckoLib Animations", icon: "movie", description: "Export your model animations for GeckoLib.", category: "file", condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_8__.isGeckoLibModel)() && !(0,_utils__WEBPACK_IMPORTED_MODULE_8__.isEmpty)(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object', click: e => BarItems['export_animation_file'].trigger(e), }), menuCategory: 'file.export' } ]; } })(); /******/ })() ; ================================================ FILE: plugins/animation_utils/changelog.json ================================================ { "3.0.7": { "title": "3.0.7", "author": "Eliot Lash", "categories": [ { "title": "Changes", "list": [ "Disable minification of JS bundle, fix some build errors on case sensitive filesystems, and upgrade to NodeJS v16.16" ] }, { "title": "Bug Fixes", "list": [ "Don't save `geckolib_format_version` in animation json for bedrock models", "Remove hold menu hiding code that was causing issues for other plugins (regression of an old bug occurred in version 3.0.6)" ] } ] }, "3.1.0": { "title": "3.1.0", "author": "Eliot Lash", "categories": [ { "title": "New Features", "list": [ "Added support for \"Reverse Keyframes\" action" ] }, { "title": "Changes", "list": [ "Update to new plugin format, bump minimum Blockbench version to 4.8.0", "Ported plugin to TypeScript, added developer README and a few unit tests" ] } ] }, "3.1.1": { "title": "3.1.1", "author": "Tslat", "categories": [ { "title": "Bug Fixes", "list": [ "Fix the item display settings being cleared if saving as an entity type model", "Fix the armour template having swapped pivot points on the legs", "Fix incorrect importing of loop type. Closes [#591](https://github.com/bernie-g/geckolib/issues/591)" ] } ] }, "3.2": { "title": "3.2", "author": "Tslat", "categories": [ { "title": "New Features", "list": [ "Auto-export the particle texture entry in the textures list for block/item display jsons if not defined", "Auto-convert bedrock animation jsons to GeckoLib-supported animation jsons when exporting" ] }, { "title": "Bug Fixes", "list": [ "Fix the particle texture entry not exporting if the name doesn't end in .png", "Fixed item_display_transforms being shipped with .geo jsons for non-bedrock models", "Forced known forward-compatible versions to export as 1.12.0 to maintain compatibility while we work out a better system" ] } ] }, "3.2.1": { "title": "3.2.1", "author": "Tslat", "categories": [ { "title": "Bug Fixes", "list": [ "Fix some animation exporting issues with specific animation setup cases" ] } ] }, "4.0": { "title": "4.0", "date": "2024-10-06", "author": "Tslat", "categories": [ { "title": "New Features", "list": [ "Overhauled the new project window, adding new settings and a much more dynamic experience", "Add export of animations json from File -> Export menu for GeckoLib projects", "Add plugin setting for default modid for projects", "Add plugin setting for forcing the Display tab to be visible", "Add plugin setting for auto-computing the particle texture when otherwise unspecified for item display jsons", "Add plugin setting for auto-converting Bedrock-format animations to GeckoLib-format animations when exporting to json, if relevant", "New GeckoLib models will now state their model type in the tab name", "Auto-apply modid and parent folder prefix to texture path in display settings", "Remember export locations for model, animations and item display settings per-project, independently" ] }, { "title": "Changes", "list": [ "Allow exporting of item display settings if the model has them set, even if not in block/item mode", "Skip auto-exporting particle entry for item display if not a valid path", "Don't store filepath in BB project", "Don't include .item in exported display jsons by default", "Updated the plugin's about panel", "Updated the plugin's icon", "Added api-supported changelog", "Tweaked various information and tooltip entries to be more clear", "Large internal cleanup", "Don't print plugin load console line until plugin is actually loaded", "The Display tab will now disappear/reappear correctly when switching between projects" ] }, { "title": "Bug Fixes", "list": [ "Fix Geckolib item/block models not displaying properly in the display tab", "Fix the item model parent sometimes not being applied" ] } ] }, "4.0.1": { "title": "4.0.1", "author": "Zigy, Squishy", "categories": [ { "title": "Changes", "list": [ "Keyframes now have different icons based on their easing.", "Easing arguments are now reset upon choosing a new easing. Fixes [#690](https://github.com/bernie-g/geckolib/issues/690)", "Fixed a typo where the circle easing was spelled cicle instead." ] } ] }, "4.0.2": { "title": "4.0.2", "author": "Zigy", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the plugin not working on web." ] } ] }, "4.1.0": { "title": "4.1.0", "author": "Zigy", "categories": [ { "title": "Changes", "list": [ "Added support for bezier, step, and smooth (Catmull-Rom) keyframes!" ] }, { "title": "Bug Fixes", "list": [ "Fixed incorrect armor template pivots. Fixes [#527](https://github.com/bernie-g/geckolib/issues/527)" ] } ] }, "4.1.1": { "title": "4.1.1", "author": "Tslat", "categories": [ { "title": "Changes", "list": [ "Deprecated plugin in favour of GeckoLib Models & Animations in preparation for Blockbench 5.0.0" ] } ] } } ================================================ FILE: plugins/animation_utils/members.yml ================================================ maintainers: - bernie-g - fadookie - Tslat ================================================ FILE: plugins/animation_utils/src/.eslintignore ================================================ webpack.config.js jest.config.js ================================================ FILE: plugins/animation_utils/src/.eslintrc.cjs ================================================ /* eslint-env node */ module.exports = { extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], root: true, env: { browser: true, es2015: true, jquery: true }, rules: { 'prefer-rest-params': 'off', '@typescript-eslint/no-explicit-any': 'off', }, }; ================================================ FILE: plugins/animation_utils/src/.gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids *.pid *.seed *.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage *.lcov # nyc test coverage .nyc_output # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) bower_components # node-waf configuration .lock-wscript # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ # Snowpack dependency directory (https://snowpack.dev/) web_modules/ # TypeScript cache *.tsbuildinfo # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Microbundle cache .rpt2_cache/ .rts2_cache_cjs/ .rts2_cache_es/ .rts2_cache_umd/ # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # Yarn Integrity file .yarn-integrity # dotenv environment variables file .env .env.test # parcel-bundler cache (https://parceljs.org/) .cache .parcel-cache # Next.js build output .next out # Nuxt.js build / generate output .nuxt dist # Gatsby files .cache/ # Comment in the public line in if your project uses Gatsby and not Next.js # https://nextjs.org/blog/next-9-1#public-directory-support # public # vuepress build output .vuepress/dist # Serverless directories .serverless/ # FuseBox cache .fusebox/ # DynamoDB Local files .dynamodb/ # TernJS port file .tern-port # Stores VSCode versions used for testing VSCode extensions .vscode-test # yarn v2 .yarn/cache .yarn/unplugged .yarn/build-state.yml .yarn/install-state.gz .pnp.* ================================================ FILE: plugins/animation_utils/src/.nvmrc ================================================ v16.16 ================================================ FILE: plugins/animation_utils/src/jest.config.js ================================================ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { preset: 'ts-jest', testEnvironment: 'node', }; ================================================ FILE: plugins/animation_utils/src/package.json ================================================ { "name": "animation_utils", "version": "4.1.3", "private": true, "description": "GeckoLib (Legacy)", "main": "index.js", "scripts": { "prebuild": "npm run test", "build": "npm run build:only", "build:only": "webpack && npm run update_manifest", "update_manifest": "node scripts/updateManifest.mjs", "start": "webpack --watch --mode=development", "lint": "eslint .", "lint:fix": "eslint --fix .", "tsc": "tsc --noEmit", "pretest": "npm run lint && npm run tsc", "test": "npm run test:only", "test:only": "jest" }, "author": "Eliot Lash, Tslat, Gecko, McHorse", "license": "MIT", "blockbenchConfig": { "title": "GeckoLib Animation Utils", "author": "Eliot Lash, Tslat, Gecko, McHorse", "icon": "icon.png", "description": "Replaced by new plugin for Blockbench 5.0+ - Install 'GeckoLib Models and Animations'", "deprecation_note": "This plugin has been discontinued in favour of the \"GeckoLib Models and Animations\" plugin. This plugin will continue to work on Blockbench 4 and below. For Blockbench 5+, use 'GeckoLib' instead.", "has_changelog": true, "min_version": "4.12.0", "max_version": "5.0.0", "variant": "both", "website": "https://github.com/bernie-g/geckolib/wiki", "repository": "https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/animation_utils", "bug_tracker": "https://github.com/bernie-g/geckolib/issues" }, "sideEffects": [ "./index.js" ], "devDependencies": { "@types/jest": "^29.5.4", "@types/lodash": "^4.14.197", "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^6.5.0", "blockbench-types": "^4.9.0", "eol": "0.9.1", "eslint": "^7.7.0", "indent-string": "^5.0.0", "jest": "^29.6.4", "ts-jest": "^29.1.1", "ts-loader": "^9.4.4", "typescript": "^4.9.5", "webpack": "^5.88.2", "webpack-cli": "^5.1.4", "css-loader": "^6.7.1", "to-string-loader": "^1.2.0" }, "dependencies": { "lodash": "^4.17.21", "semver": "7.3.2" } } ================================================ FILE: plugins/animation_utils/src/resources/armorTemplate.json ================================================ { "meta": { "format_version": "3.2", "model_format": "animated_entity_model", "box_uv": true }, "name": "CustomArmor", "geo_name": "CustomArmor", "resolution": { "width": 64, "height": 64 }, "elements": [ { "name": "dontTouch", "from": [ -4, 24, -4 ], "to": [ 4, 32, 4 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 0, 0, 0 ], "uuid": "9675593e-b27d-b70e-e1ea-1fc29f46a294" }, { "name": "dontTouch", "from": [ -4, 12, -2 ], "to": [ 4, 24, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 0, 24, 0 ], "uuid": "fa43156a-2a62-948c-082f-483d525f6d1f" }, { "name": "dontTouch", "from": [ 4, 12, -2 ], "to": [ 8, 24, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "aa51170c-8b32-fb62-71f1-58ac0b7785a8" }, { "name": "dontTouch", "from": [ -8, 12, -2 ], "to": [ -4, 24, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "bf2c2539-20e3-cfcc-94c0-491734019889" }, { "name": "dontTouch", "from": [ -4, 0, -2 ], "to": [ 0, 12, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "17b9bae0-356a-9bba-fad9-4672e2671191" }, { "name": "dontTouch", "from": [ 0, 0, -2 ], "to": [ 4, 12, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "7b31bac4-dc40-2b93-1204-7bbdcfe7d924" } ], "outliner": [ { "name": "bipedHead", "uuid": "d340b6fa-56aa-9c0f-3560-7a067643b77d", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ "9675593e-b27d-b70e-e1ea-1fc29f46a294", { "name": "armorHead", "uuid": "6ab88dea-c816-d2bb-6be9-05ed7838da97", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ ] } ] }, { "name": "bipedBody", "uuid": "ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ "fa43156a-2a62-948c-082f-483d525f6d1f", { "name": "armorBody", "uuid": "282fcdbb-8ea9-4a13-4154-f2ed20d696c8", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ ] } ] }, { "name": "bipedRightArm", "uuid": "d8113cc7-7e10-0930-259e-b8e4211ce9da", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 5, 22, 0 ], "children": [ "aa51170c-8b32-fb62-71f1-58ac0b7785a8", { "name": "armorRightArm", "uuid": "c5300e23-fd2f-b56c-3552-45d6650e11c6", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 5, 22, 0 ], "children": [ ] } ] }, { "name": "bipedLeftArm", "uuid": "3b8901e8-3420-0834-51eb-76d64ff2ae8f", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -5, 22, 0 ], "children": [ "bf2c2539-20e3-cfcc-94c0-491734019889", { "name": "armorLeftArm", "uuid": "b0d41a53-f4ce-53c1-f899-5a2048c90ac2", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -5, 22, 0 ], "children": [ ] } ] }, { "name": "bipedLeftLeg", "uuid": "37231be7-a8ef-22ca-7fea-40aed58003bb", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -2, 12, 0 ], "children": [ "17b9bae0-356a-9bba-fad9-4672e2671191", { "name": "armorLeftLeg", "uuid": "e4b19746-2d17-1f56-befe-00718165ae50", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -2, 12, 0 ], "children": [ ] }, { "name": "armorLeftBoot", "uuid": "9fe26b9a-ad66-9e6b-2fa2-4168e333b4be", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -2, 12, 0 ], "children": [ ] } ] }, { "name": "bipedRightLeg", "uuid": "45c031a5-b6be-e0a7-5454-b45d07f28429", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 2, 12, 0 ], "children": [ "7b31bac4-dc40-2b93-1204-7bbdcfe7d924", { "name": "armorRightLeg", "uuid": "60238f18-e74b-c863-cb45-2e2f162221bd", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 2, 12, 0 ], "children": [ ] }, { "name": "armorRightBoot", "uuid": "eb3db34b-ccfe-dae9-ac4d-4e22c3222f70", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 2, 12, 0 ], "children": [ ] } ] } ], "textures": [ ] } ================================================ FILE: plugins/animation_utils/src/resources/easing_keyframes.css ================================================ @font-face { font-family: 'geckolib_icomoon'; font-weight: normal; font-style: normal; src: url("data:font/woff2;base64,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") format("woff2"); } [class^="easing-"]:not(.fa), [class*=" easing-"]:not(.fa) { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'geckolib_icomoon' !important; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; font-size: 1.4em; max-width: 24px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .easing-linear:before { content: "\e925"; } .easing-step:before { content: "\e921"; } .easing-in_sine:before { content: "\e915"; } .easing-out_sine:before { content: "\e916"; } .easing-in_out_sine:before { content: "\e917"; } .easing-in_quad:before { content: "\e900"; } .easing-out_quad:before { content: "\e901"; } .easing-in_out_quad:before { content: "\e902"; } .easing-in_cubic:before { content: "\e903"; } .easing-out_cubic:before { content: "\e904"; } .easing-in_out_cubic:before { content: "\e905"; } .easing-in_quart:before { content: "\e906"; } .easing-out_quart:before { content: "\e907"; } .easing-in_out_quart:before { content: "\e908"; } .easing-in_quint:before { content: "\e909"; } .easing-out_quint:before { content: "\e90a"; } .easing-in_out_quint:before { content: "\e90b"; } .easing-in_expo:before { content: "\e90c"; } .easing-out_expo:before { content: "\e90d"; } .easing-in_out_expo:before { content: "\e90e"; } .easing-in_circ:before { content: "\e90f"; } .easing-out_circ:before { content: "\e910"; } .easing-in_out_circ:before { content: "\e911"; } .easing-in_back:before { content: "\e918"; } .easing-out_back:before { content: "\e919"; } .easing-in_out_back:before { content: "\e91a"; } .easing-in_elastic:before { content: "\e91b"; } .easing-out_elastic:before { content: "\e91c"; } .easing-in_out_elastic:before { content: "\e91d"; } .easing-in_bounce:before { content: "\e91e"; } .easing-out_bounce:before { content: "\e91f"; } .easing-in_out_bounce:before { content: "\e920"; } ================================================ FILE: plugins/animation_utils/src/scripts/updateManifest.mjs ================================================ // @ts-check import indentString from 'indent-string'; import path from 'path'; import fs from 'fs'; import eol from 'eol'; import * as url from 'url'; // @ts-ignore const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); const PACKAGE_JSON_PATH = path.join(__dirname, '../package.json'); const PLUGINS_MANIFEST_PATH = path.join(__dirname, '..', '..', '..', '..', 'plugins.json'); const pluginsString = fs.readFileSync(PLUGINS_MANIFEST_PATH, { encoding: 'utf8' }); const pluginsObj = JSON.parse(pluginsString); const packageJsonString = fs.readFileSync(PACKAGE_JSON_PATH, { encoding: 'utf8' }); const { version, blockbenchConfig } = JSON.parse(packageJsonString); // console.log({ version, blockbenchConfig }); const newAnimationUtilsManifest = Object.assign( {}, pluginsObj.animation_utils, { version }, blockbenchConfig, ); const newAnimationUtilsManifestString = indentString( JSON.stringify(newAnimationUtilsManifest, null, '\t'), 1, { indent: '\t' } ) .trimStart(); const newPluginsString = pluginsString.replace(/("animation_utils":\s*)({[\s\S.]*?})/, `$1${newAnimationUtilsManifestString}`); fs.writeFileSync(PLUGINS_MANIFEST_PATH, eol.lf(newPluginsString)); // console.log('manifest', manifest); // console.log(`Wrote manifest to ${PACKAGE_MANIFEST_PATH}.`); ================================================ FILE: plugins/animation_utils/src/tests/easing.test.ts ================================================ import { reverseEasing } from '../ts/easing'; describe('easing', () => { describe('reverseEasing', () => { it('should return the easing parameter if it is falsy', () => { expect(reverseEasing(undefined)).toEqual(undefined); expect(reverseEasing(null)).toEqual(null); }); it('should not change direction of non-directional easings', () => { expect(reverseEasing("linear")).toEqual("linear"); expect(reverseEasing("easeInOutBack")).toEqual("easeInOutBack"); }); it('should change easeIn to easeOut and vice versa', () => { expect(reverseEasing("easeInBack")).toEqual("easeOutBack"); expect(reverseEasing("easeOutBack")).toEqual("easeInBack"); }); }); }); ================================================ FILE: plugins/animation_utils/src/ts/animationUi.ts ================================================ import uniq from 'lodash/uniq'; import {addMonkeypatch} from './utils'; import {EASING_OPTIONS, EASING_DEFAULT, getEasingArgDefault, parseEasingArg, GeckolibKeyframe, isArgsEasing} from './easing'; const easingRegExp = /^ease(InOut|In|Out)?([\w]+)$/; export const loadAnimationUI = () => { Blockbench.on('display_animation_frame', displayAnimationFrameCallback); Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.on('render_frame', renderFrameCallback) addMonkeypatch(window, null, "updateKeyframeEasing", updateKeyframeEasing); addMonkeypatch(window, null, "updateKeyframeEasingArg", updateKeyframeEasingArg); }; export const unloadAnimationUI = () => { Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback); Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.removeListener('render_frame', renderFrameCallback); }; export const displayAnimationFrameCallback = (/*...args*/) => { // const keyframe = $('#keyframe'); // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here }; export function renderFrameCallback() { if (Format.id !== "animated_entity_model") return Timeline.keyframes.forEach((kf: GeckolibKeyframe) => { if (kf.interpolation != "linear" && kf.easing != undefined) { kf.easing = undefined kf.easingArgs = undefined window.updateKeyframeSelection(); } if (kf.interpolation === "step") { kf.interpolation = "linear" if (kf.data_points.length == 1) addDataPoint() window.updateKeyframeSelection(); } updateKeyframeIcon(kf) }) const addPrePostButton = document.querySelector('#keyframe_type_label > div'); if (addPrePostButton) addPrePostButton.hidden = true; } export function updateKeyframeEasing(value) { Undo.initEdit({keyframes: Timeline.selected}) // var axis = $(obj).attr('axis'); // const value = $(obj).val(); // console.log('updateKeyframeEasing value:', value, 'obj:', obj); if (value === "-") return; Timeline.selected.forEach((kf: GeckolibKeyframe) => { kf.easing = value; kf.easingArgs = undefined; kf.interpolation = 'linear'; }) window.updateKeyframeSelection(); // Ensure easingArg display is updated // Animator.preview(); Undo.finishEdit('edit keyframe easing') } export function updateKeyframeEasingArg(obj) { Undo.initEdit({keyframes: Timeline.selected}) if ($(obj).val() === "-") return; // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); Timeline.selected.forEach((kf: GeckolibKeyframe) => { const value = parseEasingArg(kf, ($(obj).val() as string).trim()); kf.easingArgs = [value]; // obj.value = value; }) Undo.finishEdit('edit keyframe easing argument') } export const updateKeyframeSelectionCallback = (/*...args*/) => { $('#keyframe_bar_easing').remove() $('#keyframe_bar_easing_type').remove() $('#keyframe_bar_easing_arg1').remove() let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars let channel: boolean | string | number = false; Timeline.selected.forEach((kf) => { if (channel === false) { channel = kf.channel } else if (channel !== kf.channel) { multi_channel = true } }) Timeline.keyframes.forEach((kf: GeckolibKeyframe) => { updateKeyframe(kf) }) const getMultiSelectValue = (selector, defaultValue, conflictValue) => { const selectorFunction = typeof selector === 'function' ? selector : x => (x[selector] === undefined ? defaultValue : x[selector]); if (Timeline.selected.length > 1) { const uniqSelected = uniq(Timeline.selected.map(selectorFunction)); if (uniqSelected.length === 1) { return uniqSelected[0]; } else { return conflictValue; } } else { return selectorFunction(Timeline.selected[0]) || defaultValue; } }; const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => { // Dear god I miss lodash if (!acc.has(kf.animator)) acc.set(kf.animator, {}); const animatorChannels = acc.get(kf.animator); if (!animatorChannels[kf.channel]) animatorChannels[kf.channel] = []; animatorChannels[kf.channel].push(kf); animatorChannels[kf.channel].sort((a, b) => { if (a.time < b.time) return -1; if (a.time > b.time) return 1; return 0; }); return acc; }, new Map()); const isFirstInChannel = (kf: _Keyframe) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1; if (Timeline.selected.length && Format.id === "animated_entity_model") { if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) { const displayedEasing = getMultiSelectValue('easing', EASING_DEFAULT, 'null'); const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => { const easingTypeToTypeId = type => { let finalEasingType = "In"; if (type === "out") { finalEasingType = "Out"; } else if (type === "inout") { finalEasingType = "InOut"; } return finalEasingType; }; let finalEasing = 'ease'; if (inputEasingOrType === "in" || inputEasingOrType === "out" || inputEasingOrType === "inout") { const finalEasingType = easingTypeToTypeId(inputEasingOrType) finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1); } else if (inputEasingOrType === "linear" || inputEasingOrType == "step") { finalEasing = inputEasingOrType; } else { const finalEasingType = easingTypeToTypeId(easingType); finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1); } return finalEasing; }; const addEasingTypeIcons = (bar, easingType, title) => { const div = document.createElement("div"); div.innerHTML = getIcon(easingType); div.id = "kf_easing_type_" + easingType; div.setAttribute("style", "stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px"); div.setAttribute("title", title); div.onclick = () => { const selectedEasing = $(".selected_kf_easing"); const selectedEasingType = $(".selected_kf_easing_type"); const keySelectedEasing = selectedEasing.attr("id").substring(15); const keySelectedEasingType = selectedEasingType.length <= 0 ? "in" : selectedEasingType.attr("id").substring(15); const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing); const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType); if (finalEasing != currentEasing) { // console.log("Changed from " + currentEasing + " to " + finalEasing); updateKeyframeEasing(finalEasing); } }; bar.appendChild(div); }; const keyframe = document.getElementById('panel_keyframe'); let easingBar: HTMLElement = document.createElement('div'); keyframe.appendChild(easingBar); easingBar.outerHTML = `

`; easingBar = document.getElementById('keyframe_bar_easing'); addEasingTypeIcons(easingBar, "linear", "Switch to Linear easing"); addEasingTypeIcons(easingBar, "step", "Switch to Step easing"); addEasingTypeIcons(easingBar, "sine", "Switch to Sine easing"); addEasingTypeIcons(easingBar, "quad", "Switch to Quadratic easing"); addEasingTypeIcons(easingBar, "cubic", "Switch to Cubic easing"); addEasingTypeIcons(easingBar, "quart", "Switch to Quartic easing"); addEasingTypeIcons(easingBar, "quint", "Switch to Quntic easing"); addEasingTypeIcons(easingBar, "expo", "Switch to Exponential easing"); addEasingTypeIcons(easingBar, "circ", "Switch to Circle easing"); addEasingTypeIcons(easingBar, "back", "Switch to Back easing"); addEasingTypeIcons(easingBar, "elastic", "Switch to Elastic easing"); addEasingTypeIcons(easingBar, "bounce", "Switch to Bounce easing"); const keyEasing = getEasingInterpolation(displayedEasing); const keyEasingElement = document.getElementById("kf_easing_type_" + keyEasing); keyEasingElement.style.stroke = "var(--color-accent)"; keyEasingElement.classList.add('selected_kf_easing'); if (!(keyEasing === "linear" || keyEasing == "step")) { let easingTypeBar: HTMLElement = document.createElement('div'); keyframe.appendChild(easingTypeBar); easingTypeBar.outerHTML = `
`; easingTypeBar = document.getElementById('keyframe_bar_easing_type'); addEasingTypeIcons(easingTypeBar, "in", "Switch to In easing type"); addEasingTypeIcons(easingTypeBar, "out", "Switch to Out easing type"); addEasingTypeIcons(easingTypeBar, "inout", "Switch to In/Out easing type"); const keyEasingType = getEasingType(displayedEasing); const keyEasingTypeElement = document.getElementById("kf_easing_type_" + keyEasingType); keyEasingTypeElement.style.stroke = "var(--color-accent)"; keyEasingTypeElement.classList.add('selected_kf_easing_type'); } if (keyEasing !== "linear") document.getElementById("panel_keyframe").querySelector('div.tool.widget.bar_select bb-select').innerHTML = "GeckoLib"; const getEasingArgLabel = (kf: GeckolibKeyframe) => { switch(kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: return 'Overshoot'; case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return 'Bounciness'; case EASING_OPTIONS.step: return 'Steps'; default: return 'N/A'; } }; const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null); if (Timeline.selected.every((kf: GeckolibKeyframe) => isArgsEasing(kf.easing)) && easingArgLabel !== null) { const argDefault = getMultiSelectValue(getEasingArgDefault, null, null); const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]); let scaleBar: HTMLElement = document.createElement('div'); keyframe.appendChild(scaleBar); scaleBar.outerHTML = `
`; scaleBar = document.getElementById('keyframe_bar_easing_arg1'); } // console.log('easingBar:', easingBar, 'keyframe:', keyframe); } } }; const getEasingInterpolation = (name: string) => { const matches = name.match(easingRegExp); if (matches) { return matches[2].toLowerCase(); } return name; }; const getEasingType = (name: string) => { const matches = name.match(easingRegExp); if (matches) { return matches[1].toLowerCase(); } return "in"; }; const updateKeyframe = (kf: GeckolibKeyframe) => { if (kf.data_points.length != 1 && kf.interpolation !== "linear") { removeLastDataPoint() } } const updateKeyframeIcon = (kf: GeckolibKeyframe) => { // @ts-expect-error This is needed because this plugin uses an outdated version of blockbench-types that doesn't have kf.uuid const element = document.getElementById(kf.uuid); if (element && element.children && kf.easing) element.children[0].className = 'easing-' + kf.easing.split(/\.?(?=[A-Z])/).join('_').toLowerCase().replace("ease_", "") } const addDataPoint = () => { Undo.initEdit({keyframes: Timeline.selected}) Timeline.selected.forEach(kf => { // @ts-expect-error needed because .channels doesn't exist in dev env if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) { kf.data_points.push(new KeyframeDataPoint(kf)) kf.data_points.last().extend(kf.data_points[0]) } }) Animator.preview() Undo.finishEdit('Add keyframe data point') } const removeLastDataPoint = () => { Undo.initEdit({keyframes: Timeline.selected}) Timeline.selected.forEach(kf => { if (kf.data_points.length >= 2) { kf.data_points.remove(kf.data_points.last()); } }) Animator.preview() Undo.finishEdit('Remove keyframe data point') } const getIcon = (name: string) => { switch(name) { case "back": return ''; case "bounce": return ''; case "circ": return ''; case "cubic": return ''; case "elastic": return ''; case "expo": case "in": return ''; case "inout": return ''; case "out": return ''; case "quad": return ''; case "quart": return ''; case "quint": return ''; case "sine": return ''; case "step": return ''; default: // linear return ''; } }; ================================================ FILE: plugins/animation_utils/src/ts/codec.ts ================================================ import armorTemplate from '../resources/armorTemplate.json'; import {isEmpty, isValidPath} from './utils'; import { GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, PROPERTY_MODID, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE, SETTING_REMEMBER_EXPORT_LOCATIONS } from "./constants"; const codec = Codecs.bedrock; // This gets automatically applied by Blockbench, we don't need to do anything with it export const format = new ModelFormat({ id: GECKOLIB_MODEL_ID, name: "GeckoLib Animated Model", category: "minecraft", description: "Animated Model for Java mods using GeckoLib", icon: "view_in_ar", rotate_cubes: true, box_uv: true, optional_box_uv: true, single_texture: true, bone_rig: true, centered_grid: true, animated_textures: true, select_texture_for_particles: true, animation_files: true, locators: true, codec: Codecs.project, display_mode: false, animation_mode: true, }) // Override the new project panel to allow customisation format.new = function() { if (newProject(this)) return openProjectSettingsDialog(); } /** * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item */ export function openProjectSettingsDialog() { if (Project instanceof ModelProject) return createProjectSettingsDialog(Project, createProjectSettingsForm(Project)); } /** * Internal function for determining the placeholder value for the model_identifier form element in dialog windows */ function getObjectIdPlaceholder(formResult?: {[key: string]: FormResultValue}) { const name = formResult?.['name'] as string; const modelType = formResult?.[PROPERTY_MODEL_TYPE] as string; if (!name && !modelType) return 'my_entity'; const invalidPathChar = new RegExp('[^_\\-/.a-z0-9]+', 'g') const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g') if (name) return name.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidPathChar, ""); switch (GeckoModelType[modelType]) { case GeckoModelType.ENTITY: return 'my_entity' case GeckoModelType.BLOCK: return 'my_block'; case GeckoModelType.ITEM: return 'my_item'; case GeckoModelType.ARMOR: return 'my_armor'; case GeckoModelType.OBJECT: return 'my_object'; default: return 'my_entity'; } } /** * Create the Project Settings dialog form for use in both new projects and editing existing ones */ function createProjectSettingsForm(Project: ModelProject) { const form = {format: {type: 'info', label: 'data.format', text: Format.name||'unknown', description: Format.description} as DialogFormElement} const properties = ModelProject['properties']; const modelType = properties[PROPERTY_MODEL_TYPE]; if (modelType) { form[PROPERTY_MODEL_TYPE] = { label: modelType.label, description: modelType.description, default: GeckoModelType.ENTITY.toUpperCase(), value: GeckoModelType[Project[PROPERTY_MODEL_TYPE].toUpperCase()].toUpperCase(), placeholder: modelType.placeholder, type: 'select', options: typeof modelType.options == 'function' ? modelType.options() : modelType.options, } } for (const key in properties) { const property = properties[key]; if (property.exposed === false || !Condition(property.condition)) continue; const entry = form[property.name] = { label: property.label, description: property.description, value: Project[property.name], placeholder: property.placeholder, type: property.type } if (property.name === 'name') { entry.label = 'Project Name' entry.placeholder = 'My Project' entry.description = 'The name of the Blockbench project' } else if (property.name === 'model_identifier') { entry.label = 'Object ID' entry.description = 'The registered id of the object this model represents, for exporting purposes' entry.placeholder = getObjectIdPlaceholder() } switch (property.type) { case 'boolean': entry.type = 'checkbox' break; case 'string': entry.type = 'text'; break; default: if (property.options) { entry['options'] = typeof property.options == 'function' ? property.options() : property.options; entry.type = 'select'; } break; } } if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name']) delete form['name']; form['uv_mode'] = { label: 'dialog.project.default_uv_mode', description: 'dialog.project.default_uv_mode.description', type: 'select', condition: Format.optional_box_uv, options: { face_uv: 'dialog.project.uv_mode.face_uv', box_uv: 'dialog.project.uv_mode.box_uv', }, value: Project.box_uv ? 'box_uv' : 'face_uv', }; form['texture_size'] = { label: 'dialog.project.texture_size', type: 'vector', dimensions: 2, value: [Project.texture_width, Project.texture_height], min: 1 }; return form; } /** * Create the 'new project' popup dialogue for GeckoLib projects. *

* The contents of this is mostly a copy of project.js "project_window" action declaration (Copyright Blockbench)
* Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility * @return false if the user clicks cancel, otherwise true */ function createProjectSettingsDialog(Project: ModelProject, form: {[formElement: string]: '_' | DialogFormElement}) { const dialog = new Dialog({ id: 'project', title: 'dialog.project.title', width: 500, form, onConfirm: function(formResult) { let save; const box_uv = formResult['uv_mode'] == 'box_uv'; const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity); const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity); if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) { // Adjust UV Mapping if resolution changed if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) { save = Undo.initEdit({elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true} as UndoAspects) Cube.all.forEach(cube => { for (const key in cube.faces) { const uv = cube.faces[key].uv; uv[0] *= texture_width / Project.texture_width; uv[2] *= texture_width / Project.texture_width; uv[1] *= texture_height / Project.texture_height; uv[3] *= texture_height / Project.texture_height; } }) Mesh.all.forEach(mesh => { for (const key in mesh.faces) { const uv = mesh.faces[key].uv; for (const vkey in uv) { uv[vkey][0] *= texture_width / Project.texture_width; uv[vkey][1] *= texture_height / Project.texture_height; } } }) } // Convert UV mode per element if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) { if (!save) save = Undo.initEdit({elements: Cube.all, uv_only: true, uv_mode: true} as UndoAspects); Cube.all.forEach(cube => cube.setUVMode(box_uv)); } if (!save) save = Undo.initEdit({uv_mode: true}); Project.texture_width = texture_width; Project.texture_height = texture_height; if (Format.optional_box_uv) Project.box_uv = box_uv; Canvas.updateAllUVs(); updateSelection(); } const properties = ModelProject['properties']; for (const key in properties) { properties[key].merge(Project, formResult); } Project.name = Project.name.trim(); Project.model_identifier = Project.model_identifier.trim(); if (save) Undo.finishEdit('Change project UV settings'); Blockbench.dispatchEvent('update_project_settings', formResult); BARS.updateConditions(); if (Project.EditSession) { const metadata = { texture_width: Project.texture_width, texture_height: Project.texture_height, box_uv: Project.box_uv }; for (const key in properties) { properties[key].copy(Project, metadata); } Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata)); } const modelType = GeckoModelType[formResult[PROPERTY_MODEL_TYPE]] Project[PROPERTY_MODEL_TYPE] = modelType; if (modelType == GeckoModelType.ITEM) Project.parent = 'builtin/entity'; if (Project.name === Format.name || Project.name === '') Project.name = "GeckoLib " + Project[PROPERTY_MODEL_TYPE]; switch (modelType) { case GeckoModelType.ARMOR: if (Outliner.root.length === 0) { Codecs.project.parse(armorTemplate, null); } else { alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.') return false; } break; default: break; } Format.display_mode = modelType === GeckoModelType.ITEM || settings[SETTING_ALWAYS_SHOW_DISPLAY].value; dialog.hide(); }, onFormChange(formResult) { try { document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult) }// eslint-disable-next-line no-empty catch (ex) {} }, }) dialog.show() return true; } /** * Export the item display json *

* Only called for GeckoLib projects */ export function buildDisplaySettingsJson(options = {}) { if (!Project) return; const modelProperties: any = {} if (options['comment'] || settings.credit.value) modelProperties.credit = settings.credit.value if (options['parent'] || Project.parent != '') modelProperties.parent = Project.parent if (options['ambientocclusion'] || Project.ambientocclusion === false) modelProperties.ambientocclusion = false if (Project.texture_width !== 16 || Project.texture_height !== 16) modelProperties.texture_size = [Project.texture_width, Project.texture_height] if (options['front_gui_light'] || Project.front_gui_light) modelProperties.gui_light = 'front'; if (options['overrides'] || Project.overrides) modelProperties.overrides = Project.overrides; if (options['display'] || !isEmpty(Project.display_settings)) { const nonDefaultDisplays = {} for (const slot in DisplayMode.slots) { const perspective = DisplayMode.slots[slot] // eslint-disable-next-line no-prototype-builtins if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) { const display: any = Project.display_settings[perspective].export(); if (display) nonDefaultDisplays[perspective] = display } } if (!isEmpty(nonDefaultDisplays)) modelProperties.display = nonDefaultDisplays } if (options['textures'] || !isEmpty(Project.textures)) { for (const texture of Project.textures) { if (texture.particle || (settings[SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) { let name = texture.name; if (name.indexOf(".png") > 0) name = name.substring(0, name.indexOf(".png")) if (!isValidPath(name)) { name = name.toLowerCase().replace(" ", "_") if (!isValidPath(name)) continue; } name = (Project[PROPERTY_MODEL_TYPE] == GeckoModelType.BLOCK ? "block/" : "item/") + name; if (Project[PROPERTY_MODID]) name = Project[PROPERTY_MODID] + ":" + name modelProperties.textures = {'particle': name}; break } } } Blockbench.export({ resource_id: 'model', type: Codecs.java_block.name, extensions: ['json'], name: Project.model_identifier ? (Project.model_identifier + ".json") : codec.fileName().replace(".geo", ""), startpath: Project[PROPERTY_FILEPATH_CACHE].display, content: JSON.stringify(modelProperties, null, 2), }, file_path => { const oldPath = Project[PROPERTY_FILEPATH_CACHE].display; Project[PROPERTY_FILEPATH_CACHE].display = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].display) Project.saved = false; }); return this; } export default codec; ================================================ FILE: plugins/animation_utils/src/ts/constants.ts ================================================ /** * GeckoLib plugin model format ID. Used to identify model types generated from this plugin */ export const GECKOLIB_MODEL_ID = "animated_entity_model" // Setting name constants export const SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture'; export const SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display'; export const SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations'; export const SETTING_DEFAULT_MODID = 'geckolib_default_modid'; export const BAKE_IN_BEZIER_KEYFRAMES = "geckolib_bake_in_bezier_keyframes"; // Property name constants export const PROPERTY_MODID = 'geckolib_modid'; export const PROPERTY_MODEL_TYPE = 'geckolib_model_type'; export const PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache'; /** * Available GeckoLib model types */ export enum GeckoModelType { ENTITY = 'Entity', BLOCK = 'Block', ITEM = 'Item', ARMOR = 'Armor', OBJECT = 'Object' } /** * Statically defined type for the filepath cache property, for ease of use */ export type GeckoFilepathCache = {model?: string, animation?: string, display?: string} ================================================ FILE: plugins/animation_utils/src/ts/easing.ts ================================================ // The MIT license notice below applies to the function findIntervalBorderIndex /* The MIT License (MIT) Copyright (c) 2015 Boris Chumichev 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. /** * * Utilizes bisection method to search an interval to which * point belongs to, then returns an index of left or right * border of the interval * * @param {Number} point * @param {Array} intervals * @param {Boolean} useRightBorder * @returns {Number} */ function findIntervalBorderIndex(point: number, intervals: number[], useRightBorder: boolean) { //If point is beyond given intervals if (point < intervals[0]) return 0 if (point > intervals[intervals.length - 1]) return intervals.length - 1 //If point is inside interval //Start searching on a full range of intervals let indexOfNumberToCompare = 0; let leftBorderIndex = 0; let rightBorderIndex = intervals.length - 1 //Reduce searching range till it find an interval point belongs to using binary search while (rightBorderIndex - leftBorderIndex !== 1) { indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2) point >= intervals[indexOfNumberToCompare] ? leftBorderIndex = indexOfNumberToCompare : rightBorderIndex = indexOfNumberToCompare } return useRightBorder ? rightBorderIndex : leftBorderIndex } function stepRange(steps: number, stop = 1) { if (steps < 2) throw new Error("steps must be > 2, got:" + steps); const stepLength = stop / steps; return Array.from({length: steps}, (_, i) => i * stepLength); } type EasingFunction = (t: number) => number; type EasingDirection = (easing: EasingFunction) => EasingFunction; // The MIT license notice below applies to the Easing class /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ class Easing { /** * A stepping function, returns 1 for any positive value of `n`. */ static step0(n: number) { return n > 0 ? 1 : 0; } /** * A stepping function, returns 1 if `n` is greater than or equal to 1. */ static step1(n: number) { return n >= 1 ? 1 : 0; } /** * A linear function, `f(t) = t`. Position correlates to elapsed time one to * one. * * http://cubic-bezier.com/#0,0,1,1 */ static linear(t: number) { return t; } /** * A simple inertial interaction, similar to an object slowly accelerating to * speed. * * http://cubic-bezier.com/#.42,0,1,1 */ // static ease(t) { // if (!ease) { // ease = Easing.bezier(0.42, 0, 1, 1); // } // return ease(t); // } /** * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed * time. * * http://easings.net/#easeInQuad */ static quad(t: number) { return t * t; } /** * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed * time. * * http://easings.net/#easeInCubic */ static cubic(t: number) { return t * t * t; } /** * A power function. Position is equal to the Nth power of elapsed time. * * n = 4: http://easings.net/#easeInQuart * n = 5: http://easings.net/#easeInQuint */ static poly(n: number) { return (t: number) => Math.pow(t, n); } /** * A sinusoidal function. * * http://easings.net/#easeInSine */ static sin(t: number) { return 1 - Math.cos((t * Math.PI) / 2); } /** * A circular function. * * http://easings.net/#easeInCirc */ static circle(t: number) { return 1 - Math.sqrt(1 - t * t); } /** * An exponential function. * * http://easings.net/#easeInExpo */ static exp(t: number) { return Math.pow(2, 10 * (t - 1)); } /** * A simple elastic interaction, similar to a spring oscillating back and * forth. * * Default bounciness is 1, which overshoots a little bit once. 0 bounciness * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N * times. * * http://easings.net/#easeInElastic */ static elastic(bounciness = 1) { const p = bounciness * Math.PI; return (t: number) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p); } /** * Use with `Animated.parallel()` to create a simple effect where the object * animates back slightly as the animation starts. * * Wolfram Plot: * * - http://tiny.cc/back_default (s = 1.70158, default) */ static back(s = 1.70158) { return (t: number) => t * t * ((s + 1) * t - s); } /** * Provides a simple bouncing effect. * * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up * using min instead of ternaries * http://easings.net/#easeInBounce */ static bounce(k = 0.5) { const q = (x: number) => (121 / 16) * x * x; const w = (x: number) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k; const r = (x: number) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k; const t = (x: number) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k; return (x: number) => Math.min(q(x), w(x), r(x), t(x)); } /** * Provides a cubic bezier curve, equivalent to CSS Transitions' * `transition-timing-function`. * * A useful tool to visualize cubic bezier curves can be found at * http://cubic-bezier.com/ */ // static bezier(x1, y1, x2, y2) { // const _bezier = require('./bezier'); // return _bezier(x1, y1, x2, y2); // } /** * Runs an easing function forwards. */ static in(easing: EasingFunction) { return easing; } /** * Runs an easing function backwards. */ static out(easing: EasingFunction) { return (t: number) => 1 - easing(1 - t); } /** * Makes any easing function symmetrical. The easing function will run * forwards for half of the duration, then backwards for the rest of the * duration. */ static inOut(easing: EasingFunction) { return (t: number) => { if (t < 0.5) { return easing(t * 2) / 2; } return 1 - easing((1 - t) * 2) / 2; }; } } const quart = Easing.poly(4); const quint = Easing.poly(5); const back = (direction: EasingDirection, scalar: number, t: number) => direction(Easing.back(1.70158 * scalar))(t); const elastic = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.elastic(bounciness))(t); const bounce = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.bounce(bounciness))(t); export const easingFunctions = { linear: Easing.linear, step(steps, x) { const intervals = stepRange(steps); return intervals[findIntervalBorderIndex(x, intervals, false)]; }, easeInQuad: Easing.in(Easing.quad), easeOutQuad: Easing.out(Easing.quad), easeInOutQuad: Easing.inOut(Easing.quad), easeInCubic: Easing.in(Easing.cubic), easeOutCubic: Easing.out(Easing.cubic), easeInOutCubic: Easing.inOut(Easing.cubic), easeInQuart: Easing.in(quart), easeOutQuart: Easing.out(quart), easeInOutQuart: Easing.inOut(quart), easeInQuint: Easing.in(quint), easeOutQuint: Easing.out(quint), easeInOutQuint: Easing.inOut(quint), easeInSine: Easing.in(Easing.sin), easeOutSine: Easing.out(Easing.sin), easeInOutSine: Easing.inOut(Easing.sin), easeInExpo: Easing.in(Easing.exp), easeOutExpo: Easing.out(Easing.exp), easeInOutExpo: Easing.inOut(Easing.exp), easeInCirc: Easing.in(Easing.circle), easeOutCirc: Easing.out(Easing.circle), easeInOutCirc: Easing.inOut(Easing.circle), easeInBack: back.bind(null, Easing.in), easeOutBack: back.bind(null, Easing.out), easeInOutBack: back.bind(null, Easing.inOut), easeInElastic: elastic.bind(null, Easing.in), easeOutElastic: elastic.bind(null, Easing.out), easeInOutElastic: elastic.bind(null, Easing.inOut), easeInBounce: bounce.bind(null, Easing.in), easeOutBounce: bounce.bind(null, Easing.out), easeInOutBounce: bounce.bind(null, Easing.inOut), }; export type EasingKey = keyof typeof easingFunctions; // Object with the same keys as easingFunctions and values of the stringified key names export const EASING_OPTIONS = Object.freeze(Object.fromEntries( Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]])) ) as { [Property in EasingKey]: string }); export const EASING_DEFAULT = 'linear'; export interface EasingProperties { easing?: EasingKey | null; easingArgs?: number[]; } export type GeckolibKeyframe = _Keyframe & EasingProperties; export const getEasingArgDefault = (kf: GeckolibKeyframe): number => { switch (kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: return 1; case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return 0.5; case EASING_OPTIONS.step: return 5; default: return null; } }; export const parseEasingArg = (kf: GeckolibKeyframe, value: string) => { switch(kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return parseFloat(value); case EASING_OPTIONS.step: return Math.max(parseInt(value, 10), 2); default: return parseInt(value, 10); } }; export function reverseEasing(easing?: EasingKey): EasingKey { if (!easing) return easing; if (easing.startsWith("easeInOut")) return easing; if (easing.startsWith("easeIn")) return easing.replace("easeIn", "easeOut") as EasingKey; if (easing.startsWith("easeOut")) return easing.replace("easeOut", "easeIn") as EasingKey; return easing; } export const isArgsEasing = (easing = "") => easing.includes("Back") || easing.includes("Elastic") || easing.includes("Bounce") || easing === EASING_OPTIONS.step; ================================================ FILE: plugins/animation_utils/src/ts/events.ts ================================================ import { addCodecCallback, addEventListener, addMonkeypatch, hasModelDisplaySettings, isGeckoLibModel, Monkeypatches, onlyIfGeckoLib, removeCodecCallback, removeEventListener, removeMonkeypatches } from "./utils"; import {GeckolibBoneAnimator} from "./keyframe"; import { BAKE_IN_BEZIER_KEYFRAMES, GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_REMEMBER_EXPORT_LOCATIONS } from "./constants"; import {openProjectSettingsDialog} from "./codec"; import {GeckolibKeyframe} from "./easing"; export function addEventListeners() { addCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse)) addCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile)) addEventListener('select_mode', onlyIfGeckoLib(onModeSelect)); addEventListener('select_project', onlyIfGeckoLib(onProjectSelect)); addEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged)); addEventListener('save_project', onlyIfGeckoLib(onProjectSave)); addMonkeypatch(Animator, null, "buildFile", monkeypatchAnimatorBuildFile); addMonkeypatch(Animator, null, "loadFile", monkeypatchAnimatorLoadFile); addMonkeypatch(Blockbench, null, "export", monkeypatchBlockbenchExport); addMonkeypatch(BarItems, 'project_window', "click", monkeypatchProjectWindowClick); } export function removeEventListeners() { removeCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse)) removeCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile)) removeEventListener('select_mode', onlyIfGeckoLib(onModeSelect)); removeEventListener('select_project', onlyIfGeckoLib(onProjectSelect)); removeEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged)); removeMonkeypatches(); } /** * When an existing GeckoLib project is being read from file */ function onProjectParse(e: any) { onSettingsChanged(); // Because the project hasn't had its model properties applied at this stage Format.display_mode = (e.model[PROPERTY_MODEL_TYPE] && e.model[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM) || settings[SETTING_ALWAYS_SHOW_DISPLAY].value; } /** * When the Blockbench project is being saved *

* Only called for GeckoLib projects */ function onProjectSave(e: {model: object, options: any }) { if (!settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value) e.model[PROPERTY_FILEPATH_CACHE] = {} } /** * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to *

* Only called for GeckoLib projects */ function onSettingsChanged() { Modes.selected.select(); Format.display_mode = hasModelDisplaySettings(); if (Project instanceof ModelProject && Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) { Project.parent = 'builtin/entity'; Project.saved = false; } } /** * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs *

* Only called for GeckoLib projects */ function onProjectSelect() { onSettingsChanged() } /** * When selecting edit/paint/display/animate/etc *

* Only called for GeckoLib projects */ function onModeSelect(e: any) { // Offset the display emulator to account for GeckoLib's +0.51 manual offset // This is a legacy patch as Blockbench no longer does this internally if (e.mode.id == 'display') (Project as ModelProject).model_3d.position.y = 0; } /** * When the model geometry is being compiled for export *

* Only called for GeckoLib projects */ function onBedrockCompile(e: any) { // Remove display transforms from non-bedrock geometry e.model["minecraft:geometry"]?.forEach((geo: Map) => delete geo["item_display_transforms"]) // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established switch (e.model.format_version) { case "1.14.0": case "1.21.0": case "1.21.20": e.model.format_version = "1.12.0" break; default: break; } } /** * When the project settings window is being opened, either via a new project or the File -> Project... menu item *

* The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchProjectWindowClick() { if (isGeckoLibModel()) { openProjectSettingsDialog(); } else { Monkeypatches.get(BarItems).click(); } } /** * When any file is being exported to disk by Blockbench *

* The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchBlockbenchExport(options, cb) { if (!isGeckoLibModel()) { Monkeypatches.get(Blockbench).export(options, cb); return; } if (Project instanceof ModelProject) { if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON const fileName = Project.model_identifier && Project.model_identifier + ".animation"; options.startpath = Project[PROPERTY_FILEPATH_CACHE].animation; const parentCallback = cb; cb = file_path => { if (parentCallback) parentCallback(file_path); const oldPath = Project[PROPERTY_FILEPATH_CACHE].animation; Project[PROPERTY_FILEPATH_CACHE].animation = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].animation) Project.saved = false; } if (fileName) options.name = fileName; } else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo const fileName = Project.model_identifier && Project.model_identifier + ".geo"; options.startpath = Project[PROPERTY_FILEPATH_CACHE].model; const parentWriter = options.custom_writer; const parentCallback = cb; if (parentWriter) { options.custom_writer = (content, filePath, callback) => { parentWriter(content, filePath, callback); callback(filePath) } } cb = file_path => { if (parentCallback) parentCallback(file_path); const oldPath = Project[PROPERTY_FILEPATH_CACHE].model; Project[PROPERTY_FILEPATH_CACHE].model = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].model) Project.saved = false; } if (fileName) options.name = fileName; } } Monkeypatches.get(Blockbench).export(options, cb); } /** * When the animation file is being loaded into the project *

* The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchAnimatorLoadFile(file, exportingAnims) { // eslint-disable-next-line no-undef const json = file.json || autoParseJSON(file.content); const path = file.path; const new_animations = []; function geoLoopToBbLoop(jsonLoop) { if (jsonLoop) { if (typeof jsonLoop === 'boolean') return jsonLoop ? 'loop' : 'once' if (typeof jsonLoop === 'string') { if (jsonLoop === "hold_on_last_frame") return 'hold' if (jsonLoop === "loop" || jsonLoop === "true") return 'loop' } } return 'once' } function getKeyframeDataPoints(source: any) { if (source instanceof Array) return [{x: source[0], y: source[1], z: source[2],}] if (['number', 'string'].includes(typeof source)) return [{x: source, y: source, z: source}] if (typeof source == 'object') { if (source.vector) return getKeyframeDataPoints(source.vector); const points = []; if (source.pre) points.push(getKeyframeDataPoints(source.pre)[0]) if (source.post) points.push(getKeyframeDataPoints(source.post)[0]) return points; } } if (json && typeof json.animations === 'object') { for (const animName in json.animations) { if (exportingAnims && !exportingAnims.includes(animName)) continue; //Animation const animData = json.animations[animName] const animation = new Blockbench.Animation({ name: animName, path, loop: geoLoopToBbLoop(animData.loop), override: animData.override_previous_animation, anim_time_update: (typeof animData.anim_time_update == 'string' ? animData.anim_time_update.replace(/;(?!$)/, ';\n') : animData.anim_time_update), blend_weight: (typeof animData.blend_weight == 'string' ? animData.blend_weight.replace(/;(?!$)/, ';\n') : animData.blend_weight), length: animData.animation_length }).add() //Bones if (animData.bones) { for (const boneName in animData.bones) { const bone = animData.bones[boneName] const lowercase_bone_name = boneName.toLowerCase(); const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name) const uuid = group ? group.uuid : guid(); let ga : GeneralAnimator; // eslint-disable-line @typescript-eslint/no-unused-vars const boneAnimator = new GeckolibBoneAnimator(uuid, animation, boneName); animation.animators[uuid] = boneAnimator; //Channels for (const channel in bone) { if (Animator.possible_channels[channel]) { if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel].easing, easingArgs: bone[channel].easingArgs, data_points: getKeyframeDataPoints(bone[channel]), }) } else if (typeof bone[channel] === 'object' && bone[channel].post) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel].easing == "bezier" ? undefined : bone[channel].easing, easingArgs: bone[channel].easingArgs, interpolation: bone[channel].easing == "bezier" ? "bezier" : bone[channel].lerp_mode, data_points: getKeyframeDataPoints(bone[channel]), bezier_right_time: bone[channel].right_time, bezier_left_time: bone[channel].left_time, bezier_left_value: bone[channel].left, bezier_right_value: bone[channel].right }); } else if (typeof bone[channel] === 'object') { for (const timestamp in bone[channel]) { boneAnimator.addKeyframe({ time: parseFloat(timestamp), channel, easing: bone[channel][timestamp].easing == "bezier" ? undefined : bone[channel][timestamp].easing, easingArgs: bone[channel][timestamp].easingArgs, interpolation: bone[channel][timestamp].easing == "bezier" ? "bezier" : bone[channel][timestamp].lerp_mode, data_points: getKeyframeDataPoints(bone[channel][timestamp]), bezier_right_time: bone[channel][timestamp].right_time, bezier_left_time: bone[channel][timestamp].left_time, bezier_left_value: bone[channel][timestamp].left, bezier_right_value: bone[channel][timestamp].right }); } } } } } } if (animData.sound_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.sound_effects) { const sounds = animData.sound_effects[timestamp]; animation.animators.effects.addKeyframe({ channel: 'sound', time: parseFloat(timestamp), data_points: sounds instanceof Array ? sounds : [sounds] }) } } if (animData.particle_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.particle_effects) { let particles = animData.particle_effects[timestamp]; if (!(particles instanceof Array)) particles = [particles]; particles.forEach(particle => { if (particle) particle.script = particle.pre_effect_script; }) animation.animators.effects.addKeyframe({ channel: 'particle', time: parseFloat(timestamp), data_points: particles }) } } if (animData.timeline) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.timeline) { const entry = animData.timeline[timestamp]; const script = entry instanceof Array ? entry.join('\n') : entry; animation.animators.effects.addKeyframe({ channel: 'timeline', time: parseFloat(timestamp), data_points: [{script}] }) } } animation.calculateSnappingFromKeyframes(); if (!Blockbench.Animation.selected && Animator.open) animation.select() new_animations.push(animation) } } return new_animations } /** * When the animations JSON is being compiled for export *

* Makes sure bezier keyframes get exported correctly rather than being baked. */ function monkeypatchAnimatorBuildFile() { const bezierKeys:GeckolibKeyframe[] = []; if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) { let animation; this.animations.forEach(a => { if (a.name == arguments[1][0]) animation = a; return; }); if (animation) { for (const uuid in animation.animators) { const animator = animation.animators[uuid]; if (!animator.keyframes.length && !animator.rotation_global) continue; if (animator.type == 'bone') { for (const channel in Animator.possible_channels) { if (!animator[channel]?.length) continue; const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time); sorted_keyframes.forEach((kf: GeckolibKeyframe) => { if (kf.interpolation == "bezier") { bezierKeys[bezierKeys.length] = kf; kf.interpolation = "geckolib_bezier"; } }); } } } } } const result = Monkeypatches.get(Animator).buildFile.apply(this, arguments); if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) { result.geckolib_format_version = 2 bezierKeys.forEach((kf) => { kf.interpolation = "bezier"; kf.easing = undefined; }); } return result; } ================================================ FILE: plugins/animation_utils/src/ts/index.ts ================================================ import semverCoerce from 'semver/functions/coerce'; import semverSatisfies from 'semver/functions/satisfies'; import packageJson from '../package.json'; import { loadAnimationUI, unloadAnimationUI } from './animationUi'; import {hasModelDisplaySettings, isEmpty, isGeckoLibModel, isValidNamespace, make} from './utils'; import { loadKeyframeOverrides, unloadKeyframeOverrides } from './keyframe'; import codec, {buildDisplaySettingsJson, format} from './codec'; import { GeckoFilepathCache, GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, PROPERTY_MODID, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE, BAKE_IN_BEZIER_KEYFRAMES, SETTING_DEFAULT_MODID, SETTING_REMEMBER_EXPORT_LOCATIONS, } from "./constants"; import {addEventListeners, removeEventListeners} from "./events"; const { version, blockbenchConfig } = packageJson; const SUPPORTED_BB_VERSION_RANGE = `${blockbenchConfig.min_version} - ${blockbenchConfig.max_version}`; // eslint-disable-next-line @typescript-eslint/no-var-requires const css = require('../resources/easing_keyframes.css').toString(); if (!semverSatisfies(semverCoerce(Blockbench.version), SUPPORTED_BB_VERSION_RANGE)) alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`); // Register the plugin and define what it adds (function () { let pluginSettings: Setting[]; let pluginProperties: Property[]; let pluginMenuItems: { action: Action, menuCategory: string }[]; BBPlugin.register("animation_utils", Object.assign( {}, blockbenchConfig as typeof blockbenchConfig & { variant: 'both' }, { name: blockbenchConfig.title, version, await_loading: true, onload() { Blockbench.addCSS(css); addEventListeners(); loadAnimationUI(); loadKeyframeOverrides(); pluginSettings = createPluginSettings(); pluginProperties = createPluginProperties(); pluginMenuItems = createPluginMenuItems(); for (const menuItem of pluginMenuItems as { action: Action, menuCategory: string }[]) { MenuBar.addAction(menuItem.action, menuItem.menuCategory); } console.log("Loaded GeckoLib plugin") }, onunload() { for (const setting of pluginSettings) { setting.delete(); } for (const property of pluginProperties) { property.delete(); } for (const menuItem of pluginMenuItems) { menuItem.action.delete(); } unloadKeyframeOverrides(); unloadAnimationUI(); removeEventListeners() format.delete(); console.clear(); }, } )); })(); /** * Create and return the plugin's settings. *

* These are found in the Settings panel in the plugin info window */ function createPluginSettings(): Setting[] { return [ new Setting(SETTING_AUTO_PARTICLE_TEXTURE, { value: true, category: "export", name: "Auto-compute block/item particle texture", description: "Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json" }), new Setting(BAKE_IN_BEZIER_KEYFRAMES, { value: false, category: "export", name: "Bake in bezier keyframes", description: "When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier." }), new Setting(SETTING_ALWAYS_SHOW_DISPLAY, { value: false, category: "edit", name: "Always show display tab", description: "Force the Display tab to always show, even when not an Item type model" }), new Setting(SETTING_REMEMBER_EXPORT_LOCATIONS, { value: true, category: "export", name: "Remember file export locations", description: "Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file." }), make( new Setting(SETTING_DEFAULT_MODID, { // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore type: 'text', value: "", category: "export", name: "Default Mod ID", description: "Default Mod ID for models (if applicable)" }), setting => { setting.onChange = function() { const invalidNamespaceChar = new RegExp('[^_\\-.a-z0-9]+', 'g') const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g') this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidNamespaceChar, "") return {}; } } ) ]; } /** * Create and return the plugin's properties. *

* These are metadata values stored in the project, usually used in project settings windows */ function createPluginProperties(): Property[] { return [ make( new Property(ModelProject, "string", PROPERTY_MODID, { label: "Mod ID", condition: { formats: [GECKOLIB_MODEL_ID] }, values: [], merge_validation: isValidNamespace }), property => { property['placeholder'] = 'my_modid'; property['description'] = 'The modid of the mod this model is for'; property.getDefault = function() { return settings[SETTING_DEFAULT_MODID].value; }; } ), make( new Property(ModelProject, "enum", PROPERTY_MODEL_TYPE, { label: "Model Type", condition: { formats: [GECKOLIB_MODEL_ID] }, exposed: false, options: GeckoModelType, values: Object.values(GeckoModelType) }), property => { property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure'; } ), make( new Property(ModelProject, "instance", PROPERTY_FILEPATH_CACHE, { label: "GeckoLib Filepath Cache", condition: { formats: [GECKOLIB_MODEL_ID] }, exposed: false, values: [] }), property => { property.default = {} as GeckoFilepathCache; } ) ]; } /** * Create and return the plugin's menu items *

* These are added to Blockbench's menu bar or submenus */ function createPluginMenuItems(): { action: Action, menuCategory: string }[] { return [ { action: new Action("export_geckolib_model", { name: "Export GeckoLib Model", icon: "archive", description: "Export your model geometry as a model for GeckoLib.", category: "file", condition: () => isGeckoLibModel(), click: function () { codec.export(); }, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_display", { name: "Export GeckoLib Display Settings", icon: "icon-bb_interface", description: "Export your item/block display settings for GeckoLib.", category: "file", condition: () => isGeckoLibModel() && hasModelDisplaySettings(), click: buildDisplaySettingsJson, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_animations", { name: "Export GeckoLib Animations", icon: "movie", description: "Export your model animations for GeckoLib.", category: "file", condition: () => isGeckoLibModel() && !isEmpty(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object', click: e => (BarItems['export_animation_file'] as Action).trigger(e), }), menuCategory: 'file.export' } ]; } ================================================ FILE: plugins/animation_utils/src/ts/keyframe.ts ================================================ import groupBy from 'lodash/groupBy'; import mapValues from 'lodash/mapValues'; import {addMonkeypatch, Monkeypatches} from './utils'; import { EASING_DEFAULT, easingFunctions, type EasingKey, EasingProperties, GeckolibKeyframe, getEasingArgDefault, isArgsEasing, reverseEasing } from './easing'; import Keyframe = Blockbench.Keyframe; export function loadKeyframeOverrides() { addMonkeypatch(Keyframe, "prototype", "getLerp", keyframeGetLerp); addMonkeypatch(Keyframe, "prototype", "compileBedrockKeyframe", keyframeCompileBedrock); addMonkeypatch(Keyframe, "prototype", "getUndoCopy", keyframeGetUndoCopy); addMonkeypatch(Keyframe, "prototype", "extend", keyframeExtend); addMonkeypatch(BarItems.reverse_keyframes, null, "click", onReverseKeyframes); } export function unloadKeyframeOverrides() { //No-op for now since monkeypatches are unloaded automatically } interface GeckolibKeyframeOptions extends KeyframeOptions { easing: EasingKey easingArgs: number[] | null | undefined } // This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch export class GeckolibBoneAnimator extends BoneAnimator { public addKeyframe(data: GeckolibKeyframeOptions, uuid?: string): _Keyframe { const keyframe = super.addKeyframe(data, uuid); if (data.bezier_left_time) keyframe.bezier_left_time = data.bezier_left_time; if (data.bezier_right_time) keyframe.bezier_right_time = data.bezier_right_time; if (data.bezier_right_value) keyframe.bezier_right_value = data.bezier_right_value; if (data.bezier_left_value) keyframe.bezier_left_value = data.bezier_left_value; return keyframe; } } function lerp(start: number, stop: number, amt: number) { return amt * (stop - start) + start; } // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars function keyframeGetLerp(other, axis, amount, allow_expression) { const easing = other.easing || EASING_DEFAULT; if (Format.id !== "animated_entity_model") { return Monkeypatches.get(Keyframe).getLerp.apply(this, arguments); } let easingFunc = easingFunctions[easing]; if (isArgsEasing(easing)) { const arg1 = Array.isArray(other.easingArgs) && other.easingArgs.length > 0 ? other.easingArgs[0] : getEasingArgDefault(other); // console.log(`keyframeGetLerp arg1: ${arg1}`); easingFunc = easingFunc.bind(null, arg1); } const easedAmount = easingFunc(amount); const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1); const stop = other.calc(axis); const result = lerp(start, stop, easedAmount); // console.log('keyframeGetLerp easing:', easing, 'arguments:', arguments, 'start:', start, 'stop:', stop, 'amount:', amount, 'easedAmount:', easedAmount, 'result:', result); if (Number.isNaN(result)) { throw new Error('batman'); } return result; } function geckolibGetArray(data_point: number = 0) { const {easing, easingArgs, getArray} = this; let result = getArray.apply(this, [data_point]); if (this.interpolation == "geckolib_bezier") { result = {vector: result, easing: "bezier", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time}; } else if (Format.id === "animated_entity_model") { if (this.data_points.length != 1) result = {pre: result, post: getArray.apply(this, [1]), easing}; else result = {vector: result, easing}; if (isArgsEasing(easing)) result.easingArgs = easingArgs; } return result; } function keyframeCompileBedrock() { if (Format.id !== "animated_entity_model" || !this.transform) { return Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments); } if (this.interpolation == 'catmullrom') { const previous = this.getPreviousKeyframe.apply(this) const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom') return { pre: include_pre ? geckolibGetArray.call(this,[0]) : undefined, post: geckolibGetArray.call(this,[include_pre ? 1 : 0]), lerp_mode: this.interpolation, } } else if (this.data_points.length == 1) { return geckolibGetArray.call(this) } else { return geckolibGetArray.call(this,[0]) } } function keyframeGetUndoCopy() { const {easing, easingArgs} = this; const result = Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments); if (Format.id === "animated_entity_model") { Object.assign(result, {easing}); if (isArgsEasing(easing)) result.easingArgs = easingArgs; } // console.log('keyframeGetUndoCopy arguments:', arguments, 'this:', this, 'result:', result); return result; } function keyframeExtend(dataIn) { const data = Object.assign({}, dataIn); // console.log('keyframeExtend 1 arguments:', arguments); if (Format.id === "animated_entity_model") { if (typeof data.values === 'object') { if (data.values.easing !== undefined) { Merge.string(this, data.values, 'easing'); } if (Array.isArray(data.values.easingArgs)) { this.easingArgs = data.values.easingArgs; } if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) { // Convert data to format expected by KeyframeExtendOriginal data.values = data.values.vector; } } else { if (data.easing !== undefined) { Merge.string(this, data, 'easing'); } if (Array.isArray(data.easingArgs)) { this.easingArgs = data.easingArgs; } } } const result = Monkeypatches.get(Keyframe).extend.apply(this, arguments); // console.log('keyframeExtend 2 arguments:', arguments, 'this:', this, 'result:', result); return result; } function onReverseKeyframes() { Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments); // console.log('@@@ onReverseKeyframes selected:', Timeline.selected); // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead Undo.initEdit({keyframes: Timeline.selected}) const kfByAnimator = groupBy(Timeline.selected, kf => kf.animator.uuid); const kfByAnimatorAndChannel = mapValues( kfByAnimator, keyframesForAnimator => groupBy(keyframesForAnimator, kf => kf.channel) ); Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => { const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid]; Object.keys(animatorChannelGroups).forEach(channel => { const channelKeyframes = animatorChannelGroups[channel]; // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time); // Reverse easing direction const easingData: EasingProperties[] = channelKeyframes.map((kf: GeckolibKeyframe) => ({ easing: reverseEasing(kf.easing), easingArgs: kf.easingArgs })); // console.log('@@@ onReverseKeyframes PRE animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes, 'easingData:', easingData); // Shift easing data to the right by one keyframe channelKeyframes.forEach((kf: GeckolibKeyframe, i: number) => { if (i == 0) { kf.easing = undefined; kf.easingArgs = undefined; return; } const newEasingData = easingData[i - 1]; kf.easing = newEasingData.easing; kf.easingArgs = newEasingData.easingArgs; }); // console.log('@@@ onReverseKeyframes POST animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes); }); }); // console.log('@@@ kfByAnimator:', kfByAnimator, "\nkfByAnimatorAndChannel:", kfByAnimatorAndChannel); Undo.finishEdit('Reverse keyframe easing') updateKeyframeSelection(); Animator.preview(); } ================================================ FILE: plugins/animation_utils/src/ts/utils.ts ================================================ import {GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY} from "./constants"; const VALID_NAMESPACE_PATTERN = new RegExp('^[_\\-.a-z0-9]+$') const VALID_PATH_PATTERN = new RegExp('^[_\\-/.a-z0-9]+$') export const Monkeypatches = new Map(); /** * Add what is effectively an override of another javascript function in a target object. *

* The patched function should call the original first and operate on the result to ensure compatibility *

* * @param symbol The target object * @param path The property of the target to access, or null to access the root target itself * @param functionKey The name of the function to replace * @param newFunction The function to patch in to replace the target */ export const addMonkeypatch = (symbol, path, functionKey, newFunction) => { const pathAccessor = path ? symbol[path] : symbol; if (!Monkeypatches.get(symbol)) Monkeypatches.set(symbol, { _pathAccessor: pathAccessor }); Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey]; pathAccessor[functionKey] = newFunction; }; /** * Remove all previously added monkeypatches, reverting their operation to prior to the patch */ export const removeMonkeypatches = () => { Monkeypatches.forEach(symbol => { Object.keys(symbol).forEach(functionKey => { if (functionKey.startsWith('_')) return; symbol._pathAccessor[functionKey] = symbol[functionKey]; }); }); Monkeypatches.clear(); } /** * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety */ export const onlyIfGeckoLib = (callback: (data: object) => void) => { return e => { if (isGeckoLibModel()) callback(e) } } /** * Add an event listener to Blockbench's event callback system. *

* This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ export const addEventListener = (eventName: EventName, callback: (data: object) => void) => { Blockbench.on(eventName, callback) } /** * Remove a previously registered event listener from Blockbench's event callback system. *

* All registered event listeners should be removed when the plugin or codec is unloaded */ export const removeEventListener = (eventName: EventName, callback: (data: object) => void) => { Blockbench.removeListener(eventName, callback) } /** * Add a callback to a codec to be called after the task has been completed *

* This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ export const addCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => { codec.on(taskName, callback); } /** * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable */ export function make(obj: T, consumer: (obj2: T) => void): T { consumer(obj); return obj; } /** * Remove a previously added codec task completion callback *

* All registered coded callbacks should be removed when the plugin or codec is unloaded */ export const removeCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => { codec.removeListener(taskName, callback); } /** * Whether a given string is a valid ResourceLocation path for Minecraft */ export const isValidPath = (path: string) => { return VALID_PATH_PATTERN.test(path) } /** * Whether a given string is a valid ResourceLocation namespace for Minecraft */ export const isValidNamespace = (namespace: string) => { return VALID_NAMESPACE_PATTERN.test(namespace) } /** * Whether a map-like object has no defined keys or values */ export const isEmpty = (object = {}) => Object.keys(object).length === 0; /** * Whether the currently focussed model is a GeckoLib model */ export const isGeckoLibModel = () => Format.id === GECKOLIB_MODEL_ID; /** * Whether the current project is a GeckoLib model that has or uses item render perspective transforms */ export const hasModelDisplaySettings = () => isGeckoLibModel() && Project && ((Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM || !isEmpty(Project.display_settings)) || settings[SETTING_ALWAYS_SHOW_DISPLAY].value); ================================================ FILE: plugins/animation_utils/src/tsconfig.json ================================================ { "compilerOptions": { "outDir": "'../../plugins", // "noImplicitAny": true, "module": "es6", "target": "ES2017", "allowJs": true, "resolveJsonModule": true, "allowSyntheticDefaultImports": true, "skipLibCheck": true, "moduleResolution": "node", // "typeRoots": ["./node_modules/@types", "./node_modules/blockbench-types"] } } ================================================ FILE: plugins/animation_utils/src/types/blockbench-types.d.ts ================================================ /// ================================================ FILE: plugins/animation_utils/src/webpack.config.js ================================================ const PathModule = require('path') module.exports = { mode: 'development', devtool: false, entry: './ts/index.ts', module: { rules: [ { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/, }, { test: /\.css$/, use: [ 'to-string-loader', 'css-loader' ] }, ], }, resolve: { extensions: ['.tsx', '.ts', '.js'], }, output: { filename: 'animation_utils.js', path: PathModule.resolve(__dirname, '..') } } ================================================ FILE: plugins/animator.js ================================================ (function() { var button; var start; var expor; Plugin.register('animator', { title: 'Java Item Model Animator', author: 'Command Master', description: `Takes two java item models and outputs a zip with a resourcepack and a datapack to make a clear transaction between them in the players hand (the plugin can also work for other animations but the datapack have to be coded manually).`, about: `The animation is activated using "/scoreboard players set @s animation 0". To use click Filter -> Save starting model the save the first model, and then click on File -> Export -> Export animation to download the ZIP file of the animation`, tags: ["Minecraft: Java Edition"], icon: 'compare', version: '1.0.1', variant: 'both', onload() { types = ['thirdperson_righthand', 'thirdperson_lefthand', 'firstperson_righthand', 'firstperson_lefthand', 'gui', 'head', 'ground', 'fixed']; button = new Action('save_start', { name: 'Save Starting Model', description: 'Saves the current model as the starting model for the animation', icon: 'filter_cetner_focus', condition: {formats: ['java_block']}, click: function() { start = JSON.parse(JSON.stringify(Codecs.java_block.compile({raw: true}))); } }); MenuBar.addAction(button, 'filter'); expor = new Action('export_animation', { name: 'Export Java Item Animation', description: 'Exports the animation to a zip', icon: 'compare', condition: {formats: ['java_block']}, click: function() { if (!start) { Blockbench.showQuickMessage('You didn\'t configured a starting model', 2000); } else new Dialog({ id: 'generate_animation', title: 'Animation Generator', form: { ticks: {label: 'Time in ticks of the animation (20 ticks = 1 second)', type: 'number', value: 20, step: 1, min: 3, max: 1000} }, onConfirm: function(formData) { generate_animation(start, Codecs.java_block.compile({raw: true}),+formData.ticks); this.hide() } }).show() } }); MenuBar.addAction(expor, 'file.export'); }, onunload() { MenuBar.removeAction('file.export.export_animation') button.delete(); } }); function line(y1, x1, y2, x2) { var m = (y2-y1)/(x2-x1); return `${m}x+${y1-m*x1}`; } function generate_linear_arr(start, end, time) { var linear = []; for (var i = 0; i < start.length; i++) { linear.push(line(start[i], 0, end[i], time-1)); } return linear; } function generate_linear(start, end, time) { var linear = {}; for (var key of Object.keys(start)) { linear[key] = generate_linear_arr(start[key], end[key], time); } return linear; } function generate_element_linear(start, end, time) { var linear = JSON.parse(JSON.stringify(start)); linear['from'] = generate_linear_arr(start['from'], end['from'], time); linear['to'] = generate_linear_arr(start['to'], end['to'], time); return linear; } function calculate_string(string, x) { var match = string.match(/(.+)x\+(.+)/); if (match) { var a = parseFloat(match[1]); var b = parseFloat(match[2]); return a*x+b; } else { return string; } } function calculate_model(current, x) { if (typeof current == 'string') { return calculate_string(current, x); } else if (current instanceof Array) { for (var i = 0; i < current.length; i++) { current[i] = calculate_model(current[i], x); } return current; } else if (current instanceof Object) { for (var key of Object.keys(current)) { current[key] = calculate_model(current[key], x); } return current; } else { return current; } } function generate_animation(start, end, models) { start = JSON.parse(JSON.stringify(start)); end = JSON.parse(JSON.stringify(end)); start['display'] = start['display']?start['display']:{}; end['display'] = end['display']?end['display']:{}; for (var i = 0; i < types.length; i++) { start['display'][types[i]] = Object.assign({ rotation: [0, 0, 0], translation: [0, 0, 0], scale: [1, 1, 1] }, start['display'][types[i]]); end['display'][types[i]] = Object.assign({ rotation: [0, 0, 0], translation: [0, 0, 0], scale: [1, 1, 1] }, start['display'][end[i]]); } start['display']['firstperson_righthand']['translation'][1] += 10; end['display']['firstperson_righthand']['translation'][1] += 10; start['display']['firstperson_lefthand']['translation'][1] += 10; end['display']['firstperson_lefthand']['translation'][1] += 10; var linear = JSON.parse(JSON.stringify(start)); var zip = JSZip(); zip.file("resourcepack/pack.mcmeta", `{ "pack": { "pack_format": 5, "description": "This is an animated resource pack generated using Command Master's generator." } }`); zip.file("datapack/pack.mcmeta", `{ "pack": { "pack_format": 5, "description": "This is a datapack for an animation generated using Command Master's generator." } }`); zip.file('datapack/data/minecraft/tags/functions/load.json', `{ "replace": false, "values": [ "anim:load" ] }`); zip.file('datapack/data/minecraft/tags/functions/tick.json', `{ "replace": false, "values": [ "anim:tick" ] }`); zip.file('datapack/data/anim/functions/load.mcfunction', "scoreboard objectives add animation dummy"); if (start.hasOwnProperty('display')) { linear['display'] = {}; for (var key of Object.keys(start['display'])) { linear['display'][key] = generate_linear(start['display'][key], end['display'][key], models); } } if (start.hasOwnProperty('elements')) { linear['elements'] = []; for (var i = 0; i < start['elements'].length; i++) { linear['elements'].push(generate_element_linear(start['elements'][i], end['elements'][i], models)); } } var overrides = []; var tick = ''; for (var i = 0; i < models; i++) { var model = JSON.parse(JSON.stringify(linear)); zip.file(`resourcepack/assets/minecraft/models/item/model${i}.json`, JSON.stringify(calculate_model(model, i))); overrides.push({'predicate':{'custom_model_data': i+1}, 'model': `item/model${i}`}); tick += `replaceitem entity @p[scores={animation=${i+1}}] weapon.mainhand minecraft:knowledge_book{CustomModelData:${i+1},AttributeModifiers:[{AttributeName:"generic.attackSpeed",Name:"generic.attackSpeed",Amount:-1000000,Operation:0,UUIDLeast:255057,UUIDMost:170750}]} `; } zip.file('resourcepack/assets/minecraft/models/item/knowledge_book.json', JSON.stringify({"parent": "item/generated","textures": {"layer0":"item/knowledge_book"},"overrides": overrides})); tick += 'scoreboard players add @a animation 1'; zip.file('datapack/data/anim/functions/tick.mcfunction', tick); zip.generateAsync({type: 'blob'}).then(content => { Blockbench.export({ type: 'Zip Archive', extensions: ['zip'], name: 'animation', startpath: Project.export_path, content: content, savetype: 'zip' }) }); } })(); ================================================ FILE: plugins/arcaniax_block_exporter.js ================================================ (function() { var geometry_name; var geometry_name_fancy; var bbMinSize = 0; var bbMaxOffset = 8; var bbMaxSize = 16; var color; var folderLocation; let options = {}; let collision = [16, 16, 16]; let collisionOffset = [0, 0, 0]; const fs = require('fs'); var preview; // SETS UP THE PREVIEW FOR THE COLLISION function setupPreview(){ if (preview!=null){ scene.remove(preview); } var minY = 0.001; var offsetX = Math.max(Math.min(collisionOffset[0], bbMaxOffset),-bbMaxOffset); var offsetY = Math.max(Math.min(collisionOffset[1], bbMaxSize), bbMinSize); var offsetZ = Math.max(Math.min(collisionOffset[2], bbMaxOffset),-bbMaxOffset); var x = Math.max(Math.min(collision[0],bbMaxSize-Math.abs(offsetX*2)),bbMinSize); var y = Math.max(Math.min(collision[1],bbMaxSize-offsetY),bbMinSize); var z = Math.max(Math.min(collision[2],bbMaxSize-Math.abs(offsetZ*2)),bbMinSize); const geo = new THREE.BoxBufferGeometry( x, y, z); const object = new THREE.Mesh( geo, new THREE.MeshBasicMaterial( 0x69db6d ) ); object.position.x += offsetX; object.position.y = y/2 + minY + offsetY; object.position.z += offsetZ; const box = new THREE.BoxHelper( object, 0x69db6d ); scene.add( box ); preview = box; } // ESTIMATES BOUNDING BOX function estimateBoundingBox(){ const max = {x:-Infinity,y:-Infinity,z:-Infinity}; const min = {x:Infinity,y:Infinity,z:Infinity}; const size = {x:-Infinity,y:-Infinity,z:-Infinity}; Object.values(Canvas.meshes).map(mesh=>{ const bh = new THREE.BoxHelper(mesh,new THREE.MeshBasicMaterial()) bh.geometry.computeBoundingBox(); max.x = Math.max(max.x,bh.geometry.boundingBox.max.x); max.y = Math.max(max.y,bh.geometry.boundingBox.max.y); max.z = Math.max(max.z,bh.geometry.boundingBox.max.z); min.x = Math.min(min.x,bh.geometry.boundingBox.min.x); min.y = Math.min(min.y,bh.geometry.boundingBox.min.y); min.z = Math.min(min.z,bh.geometry.boundingBox.min.z); }); max.x = Math.min(max.x,8); max.y = Math.min(max.y,16); max.z = Math.min(max.z,8); min.x = Math.max(min.x,-8); min.y = Math.max(min.y,0); min.z = Math.max(min.z,-8); size.x = Math.abs(max.x-min.x); size.y = (max.y-Math.max(min.y, 0)); size.z = Math.abs(max.z-min.z); collision[0] = Math.max(Math.min(size.x, bbMaxSize),bbMinSize).toFixed(1); collision[1] = Math.max(Math.min(size.y, bbMaxSize),bbMinSize).toFixed(1); collision[2] = Math.max(Math.min(size.z, bbMaxSize),bbMinSize).toFixed(1); collisionOffset[0] = Math.max(Math.min((max.x+min.x)/2, bbMaxSize),-bbMaxSize).toFixed(1); collisionOffset[1] = Math.max(Math.min(min.y, bbMaxSize),bbMinSize).toFixed(1); collisionOffset[2] = Math.max(Math.min((max.z+min.z)/2, bbMaxSize),-bbMaxSize).toFixed(1); } // HIDES THE PREVIEW FOR THE COLLISION function hidePreview(){ if (preview!=null){ scene.remove(preview); } preview = null; } function getDialog(){ estimateBoundingBox(); geometry_name = Project.geometry_name; if (geometry_name!=null&&geometry_name!=""){ geometry_name_fancy = geometry_name.replace(/_/g, ' '); geometry_name_fancy = geometry_name_fancy[0].toUpperCase() + geometry_name_fancy.slice(1); } var dialog = new Dialog({ id: 'bedrock_block_export', title: 'Bedrock Block Exporter', form: { id: {label: 'Identifier', type: 'input', value: "project_name:" + geometry_name, placeholder: "project_name:block_name"}, file_name: {label: 'File name', type: 'input', value: geometry_name, placeholder: "File name"}, name: {label: 'Name', type: 'input', value: geometry_name_fancy, placeholder: "Block name"}, alpha: {label: 'Texture options', type: 'select', options: {opaque: 'Opaque', alpha_test: 'Alpha Test (Transparent)', blend: 'Blend (Translucent)', double_sided: 'Double Sided (Mirrored)'}, default:'Opaque'}, collision_settings: {label: 'Collision Settings', type: 'checkbox', value: false}, collision: {label: 'Size', type: 'vector', value: collision, min:0, max:16, step:0.5, condition: (formData) => formData.collision_settings}, collisionOffset: {label: 'Offset', type: 'vector', value: collisionOffset, min:-16, max:16.0, step:0.5, condition: (formData) => formData.collision_settings}, entity_collision: {label: 'Entity Collision', type: 'checkbox', value: true, condition: (formData) => formData.collision_settings}, export_loc: {label: 'Export Location', value: folderLocation, type: 'folder'} }, onConfirm: function(formData) { hidePreview(); if (typeof formData.export_loc != 'undefined'){ folderLocation = formData.export_loc; exportBlock(formData); } this.hide(); }, onCancel: function(formData) { hidePreview(); this.hide(); } }); dialog.updateFormConditions = function() { Dialog.prototype.updateFormConditions.call(dialog); collision = dialog.getFormResult().collision; collisionOffset = dialog.getFormResult().collisionOffset; setupPreview(); } return dialog; } function exportBlock(formData){ makeFolder(folderLocation); var bp = PathModule.join(folderLocation, formData.name + " BP"); var rp = PathModule.join(folderLocation, formData.name + " RP"); var blockBehaviors = PathModule.join(bp, "blocks"); var lang = PathModule.join(rp, "texts"); var textures = PathModule.join(rp, "textures"); var models = PathModule.join(rp, "models"); var blockModels = PathModule.join(rp, "models", "blocks"); var blockTextures = PathModule.join(rp, "textures", "blocks"); makeFolder(bp); makeFolder(rp); makeFolder(blockBehaviors); makeFolder(lang); makeFolder(textures); makeFolder(blockTextures); makeFolder(models); makeFolder(blockModels); createManifests(bp, rp, formData); createBehaviorFile(blockBehaviors, formData); saveModel(blockModels, formData); saveTexture(blockTextures, formData); addTranslation(lang, formData); addTextureMapping(textures, formData); Blockbench.showQuickMessage('Block was exported successfully!', 5000); } function makeFolder(dir){ if (!fs.existsSync(dir)){ fs.mkdirSync(dir); } } function saveModel(dir, formData){ fs.writeFile(PathModule.join(dir, formData.file_name, ".geo.json"), Format.codec.compile(), onError); } function createManifests(bp, rp, formData){ fs.writeFile(PathModule.join(bp, "manifest.json"), getBehaviorManifest(formData), onError); fs.writeFile(PathModule.join(rp, "manifest.json"), getResourceManifest(formData), onError); } function addTranslation(dir, formData){ var translationPrefix = "tile." + formData.id + ".name="; var translation = translationPrefix + formData.name; fs.writeFile(PathModule.join(dir, "en_US.lang"), translation, onError); fs.writeFile(PathModule.join(dir, "languages.lang"), getDefaultLanguages(), onError); } function getDefaultLanguages(){ return `["en_US"]`; } function addTextureMapping(dir, formData){ fs.writeFile(PathModule.join(dir, "terrain_texture.json"), getTerrainTextureFormat(formData) , onError); } function saveTexture(dir, formData){ if (textures[0]){ var base64 = textures[0].getBase64(); var base64Data = base64.replace(/^data:image\/png;base64,/, ""); fs.writeFile(PathModule.join(dir, formData.file_name, ".png"), base64Data, 'base64', onError); } } function createBehaviorFile(dir, formData){ fs.writeFile(PathModule.join(dir, formData.file_name, '.behavior.json'), getBehaviorFormat(formData), onError); } // UNUSED // function checkFolders(dir){ // var bp = (dir, "behavior_packs"); // var rp = PathModule.join(dir, "resource_packs"); // if (fs.existsSync(bp)&&fs.existsSync(rp)) { // if (hasDirectory(rp)){ // if (hasDirectory(bp)){ // return true; // } // } // } // return false; // } // UNUSED // function hasDirectory(dir){ // var bool = false; // fs.readdirSync(dir).forEach(file => { // if (fs.lstatSync(PathModule.join(dir, file)).isDirectory() ){ // bool = true; // } // }); // return bool; // } // UNUSED // function getFirstDirectory(dir){ // var returnFile = ""; // fs.readdirSync(dir).forEach(file => { // if (fs.lstatSync(PathModule.join(dir, file)).isDirectory() ){ // returnFile = file; // } // }); // return PathModule.join(dir, returnFile); // } function getResourceManifest(formData){ var name = formData.name; var uuid1 = generateUUID(); var uuid2 = generateUUID(); var json = `{ "format_version": 2, "header": { "description": "` + name + ` Resource Pack", "name": "` + name + ` RP", "uuid": "` + uuid1 + `", "version": [1, 0, 0], "min_engine_version": [1, 14, 0] }, "modules": [{ "description": "` + name + ` Resource Pack", "type": "resources", "uuid": "` + uuid2 + `", "version": [1, 0, 0] }] }`; return json; } function getBehaviorManifest(formData){ var name = formData.name; var uuid1 = generateUUID(); var uuid2 = generateUUID(); var json = `{ "format_version": 1, "header": { "description": "` + name + ` Behavior Pack", "name": "` + name + ` BP", "uuid": "` + uuid1 + `", "version": [1, 0, 0] }, "modules": [{ "description": "${name} Behavior Pack", "version": [ 1, 0, 0 ], "uuid": "` + uuid2 + `", "type": "data" }] }`; return json; } function getTerrainTextureFormat(formData){ var file_name = formData.file_name; var json = `{ "resource_pack_name": "vanilla", "texture_name": "atlas.terrain", "padding": 8, "num_mip_levels": 4, "texture_data": { "` + file_name + `": { "textures": "textures/blocks/` + file_name + `" } } }`; return json; } function generateUUID() { // Public Domain/MIT var d = new Date().getTime();//Timestamp var d2 = (performance && performance.now && (performance.now()*1000)) || 0;//Time in microseconds since page-load or 0 if unsupported return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16;//random number between 0 and 16 if(d > 0){//Use timestamp until depleted r = (d + r)%16 | 0; d = Math.floor(d/16); } else {//Use microseconds since page-load if supported r = (d2 + r)%16 | 0; d2 = Math.floor(d2/16); } return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); }); } function getBehaviorFormat(formData){ var alpha = ""; var offset_entity = ""; var size_entity = ""; var offset_pick = ""; var size_pick = ""; alpha = formData.alpha; if (!formData.entity_collision){ offset_entity = "0, 0, 0"; size_entity = "0, 0, 0"; } else{ offset_entity = getOffset(); size_entity = getSize(); } offset_pick = getOffset(); size_pick = getSize(); return getBehaviorRaw(formData, alpha, offset_entity, size_entity, offset_pick, size_pick); } function getOffset(){ var x = Math.max(Math.min(collisionOffset[0], bbMaxOffset),-bbMaxOffset); var y = Math.max(Math.min(collisionOffset[1], bbMaxSize), bbMinSize); var z = Math.max(Math.min(collisionOffset[2], bbMaxOffset),-bbMaxOffset); x = x - Math.max(Math.min(collision[0],bbMaxSize-Math.abs(x*2)),bbMinSize)/2; z = z - Math.max(Math.min(collision[2],bbMaxSize-Math.abs(z*2)),bbMinSize)/2; return x + ", " + y + ", " + z; } function getSize(){ var offsetX = Math.max(Math.min(collisionOffset[0], bbMaxOffset),-bbMaxOffset); var offsetY = Math.max(Math.min(collisionOffset[1], bbMaxSize), bbMinSize); var offsetZ = Math.max(Math.min(collisionOffset[2], bbMaxOffset),-bbMaxOffset); var x = Math.max(Math.min(collision[0],bbMaxSize-Math.abs(offsetX*2)),bbMinSize); var y = Math.max(Math.min(collision[1],bbMaxSize-offsetY),bbMinSize); var z = Math.max(Math.min(collision[2],bbMaxSize-Math.abs(offsetZ*2)),bbMinSize); return x + ", " + y + ", " + z; } function getBehaviorRaw(formData, alpha, offset_entity, size_entity, offset_pick, size_pick){ var json = `{ "format_version": "1.16.100", "minecraft:block": { "description": { "identifier": "${formData.id}" }, "components": { "minecraft:destroy_time": 4.0, "minecraft:friction": 0.6, "minecraft:block_light_emission": 0.0, "minecraft:block_light_absorption": 0.0, "minecraft:entity_collision": { "origin": [${offset_entity}], "size": [${size_entity}] }, "minecraft:pick_collision": { "origin": [${offset_pick}], "size": [${size_pick}] }, "minecraft:geometry": "geometry.${formData.file_name}", "minecraft:material_instances" : { "*" : { "texture": "${formData.file_name}", "render_method": "${alpha}" } } } } }`; return json; } function onError(err) { if (err) { console.log('File Writing Error: ', err); } } var export_action; Plugin.register('arcaniax_block_exporter', { title: 'Bedrock Block Exporter', icon: 'icon-format_block', author: 'Arcaniax', description: 'Helps making new Bedrock blocks (requires experimental mode)', version: '0.1.1', variant: 'both', onload() { export_action = new Action({ id: 'block_exporter', name: 'Bedrock Block Exporter', icon: 'icon-format_block', category: 'filter', click: function(ev) { getDialog().show(); $('#blackout').hide(0); setupPreview(); } }); MenuBar.addAction(export_action, 'filter'); }, onunload() { this.onuninstall(); }, onuninstall() { export_action.delete(); } }) })() ================================================ FILE: plugins/armor_stand_animator.js ================================================ // TODO Make into custom model format, allow multiple armor stands in one animation // Credit to Misode for this (I did some, you can view the wizardry he pulled over here (https://github.com/misode/vscode-nbt/blob/master/src/common/Snbt.ts)) window.SNBT = (function () { function SNBT() {} SNBT.stringify = function (type, data) { switch (type) { case "compound": return Object.keys(data).length === 0 ? "{}": "{" + Object.entries(data).map(function (_a) { let key = _a[0], value = _a[1]; return (key + ": " + SNBT.stringify(value.type, value.value)); }).join(',') + "}"; case "list": return data.value.length === 0 ? "[]": SNBT.isCompact(data.type) ? "[" + SNBT.stringifyEntries(data.type, data.value, ", ") + "]" : "[" + SNBT.stringifyEntries(data.type, data.value, ',') + "]"; case "floatList": return "[" + SNBT.stringifyEntries("float", data, ", ") + "]"; case "string": return "\"" + data.replace(/(\\|")/g, "\\$1") + "\""; case "byte": return data + "b"; case "double": return data + "d"; case "float": return data + "f"; case "short": return data + "s"; case "int": return "" + data; case "long": return SNBT.stringifyLong(data) + "L"; default: return "null"; } }; SNBT.stringifyLong = function (value) { SNBT.dataView.setInt32(0, Number(value[0])); SNBT.dataView.setInt32(4, Number(value[1])); return "" + SNBT.dataView.getBigInt64(0); }; SNBT.stringifyEntries = function (type, values, join) { return values.map(function (v) { return ("" + SNBT.stringify(type, v)); }).join(join); }; SNBT.isCompact = function (type) { return type === 'byte' || type === 'double' || type === 'float' || type === 'short' || type === 'int' || type === 'long'; }; SNBT.bytes = new Uint8Array(8); SNBT.dataView = new DataView(SNBT.bytes.buffer); return SNBT; }()); function roundKeyframeTime(time) { return Number((Math.ceil(time.toFixed(2) / 0.05) * 0.05).toFixed(2)); } function getNextKey(dict, currentKey) { let keys = Object.keys(dict); return keys[keys.indexOf(String(currentKey)) + 1]; } function getRootBoneNameDifferentiator(boneName, numberCheck) { // Try to find an existing armor stand root bone let primaryArmorStandBone = Outliner.root.find(q => (q.name === (numberCheck === 0 ? boneName : `${boneName}${numberCheck}`))); // If it didn't exist, return the name (and the differentiator if it wasn't 0) as a string if (!primaryArmorStandBone) { return numberCheck === 0 ? boneName : `${boneName}${numberCheck}`; } else { // Otherwise, check the next number return getRootBoneNameDifferentiator(boneName, numberCheck + 1); } } function generatePackFromAnimation(animationContents, animationName, configData, loopMode) { let zip = new JSZip(); // Load in config data and filter invalid characters let packName = configData.packName.replace(/[^a-z0-9_.]/g, ""); animationName = animationName.replace(/[^a-zA-Z0-9_.]/g, '_'); let timerObjectiveName = `${animationName}.timer`; let isPausedObjectiveName = `${animationName}.is_paused`; // Set the working DIR depending on whether or not we're generating a pack namespace or a full pack let workingDir; if (configData.generationMode === "namespace") { workingDir = `${packName}/functions`; } else if (configData.generationMode === "data_pack") { // Generate the extra files needed for it to be a pack zip.file(`pack.mcmeta`, `{ "pack": { "pack_format": 7, "description": "Armor Stand Animation: ${packName}" } }` ); zip.file(`data/minecraft/tags/functions/load.json`, `{ "values": [ "${packName}:init" ] }` ); workingDir = `data/${packName}/functions`; } // If playback control is enabled (pause/play), generate each function if (configData.playbackControl) { // Just invert the timer score and mark it as paused zip.file(`${workingDir}/pause.mcfunction`, `scoreboard players operation @s ${timerObjectiveName} *= #-1 ${isPausedObjectiveName}\nscoreboard players set @s ${isPausedObjectiveName} 1`); // Re-invert the timer score, and begin the search at the correct frame resumeCommands = `scoreboard players operation @s ${timerObjectiveName} *= #-1 ${isPausedObjectiveName}`; Object.keys(animationContents).slice().reverse().forEach( item => resumeCommands += `\nexecute if score @s ${isPausedObjectiveName} matches 1 if score @s ${timerObjectiveName} matches ${item} run function ${packName}:search/${item}` ); zip.file(`${workingDir}/resume.mcfunction`, resumeCommands); } // Stop the animation by setting it into an invalid frame number zip.file(`${workingDir}/stop.mcfunction`, `scoreboard players set @s ${timerObjectiveName} -2147483646`); // Add the necessary timer objective, plus is paused objective and -1 constant if playback control is enabled initCommands = `scoreboard objectives add ${timerObjectiveName} dummy`; if (configData.playbackControl) { initCommands += `\nscoreboard players set #-1 ${isPausedObjectiveName} -1\nscoreboard objectives add ${isPausedObjectiveName} dummy`; } zip.file(`${workingDir}/init.mcfunction`, initCommands); // Armor stand creation function zip.file(`${workingDir}/create.mcfunction`, `summon minecraft:armor_stand ~ ~ ~ {Tags:["${configData.entityTag}"], NoBasePlate:1b, ShowArms:1b, Pose:{LeftArm:[0f, 0f, 0f], RightArm:[0f, 0f, 0f], LeftLeg:[0f, 0f, 0f], RightLeg:[0f, 0f, 0f]}}`); // This is needed since we need to create the start function if this is the first frame, and it can't be hardcoded since the start frame doesn't have to be frame 1 let isFirstFrame = true; // Iterate through each keyframe in the data for ([keyframeTime, keyframeContents] of Object.entries(animationContents)) { // Used to calculate how long we should wait let nextKeyframeTime = getNextKey(animationContents, keyframeTime); let differenceBetweenNextAndCurrentKeyframe = Number(nextKeyframeTime) - Number(keyframeTime); // Generate commands for this keyframe let commands = []; // Set to true if the armor stand moves that frame. Marks if we need to include "at @s" in the execute command let includePositionalContext = false; if ("pos" in keyframeContents) { includePositionalContext = true; commands.push(`teleport @s ~${keyframeContents.pos.map(q => q * configData.blockUnitScale).join(" ~")}`); } if ("rot" in keyframeContents) { let outputNbt = {}; let boneNameToKey = { head: "Head", leftArm: "LeftArm", rightArm: "RightArm", body: "Body", leftLeg: "LeftLeg", rightLeg: "RightLeg" }; // For every limb and its rotation, generate the NBT for ([boneName, boneRotation] of Object.entries(keyframeContents.rot)) { if (boneName !== "main") { outputNbt.Pose ??= {type: "compound", value: {}}; outputNbt.Pose.value[boneNameToKey[boneName]] = {type: "floatList", value: boneRotation}; } else { outputNbt.Rotation = {type: "floatList", value: boneRotation}; } } commands.push(`data merge entity @s ${window.SNBT.stringify("compound", outputNbt)}`); } // Make sure there are some commands to add if (commands.length === 0) { continue; } // Create the start function if (isFirstFrame) { zip.file(`${workingDir}/start.mcfunction`, `data merge entity @s {Pose:{Head:[0f, 0f, 0f], LeftArm:[0f, 0f, 0f], RightArm:[0f, 0f, 0f], LeftLeg:[0f, 0f, 0f], RightLeg:[0f, 0f, 0f]}}\nscoreboard players set @s ${timerObjectiveName} ${keyframeTime}\nschedule function ${packName}:search/${keyframeTime} ${differenceBetweenNextAndCurrentKeyframe}t append`); isFirstFrame = false; } // Generates the functions needed for each frame (2 functions per frame, scheduling each other) searchCommands = `execute as @e[tag=${configData.entityTag},scores={${timerObjectiveName}=${keyframeTime}}]${includePositionalContext ? " at @s" : ""} run function ${packName}:frames/${keyframeTime}`; if (configData.playbackControl) { searchCommands += `\nscoreboard players set @s ${isPausedObjectiveName} 0`; } zip.file(`${workingDir}/search/${keyframeTime}.mcfunction`, searchCommands); // This check is needed because otherwise the last frame will have something like "scoreboard players set ....timer undefined " and "schedule function ... NaNt append". It also lets us add the loop code. if (nextKeyframeTime) { zip.file(`${workingDir}/frames/${keyframeTime}.mcfunction`, `${commands.join("\n")}\nscoreboard players set @s ${timerObjectiveName} ${nextKeyframeTime}\nschedule function ${packName}:search/${nextKeyframeTime} ${differenceBetweenNextAndCurrentKeyframe}t append`); } else { let extraCommands = []; if (loopMode === "loop") { extraCommands.push(`scoreboard players set @s ${timerObjectiveName} -2147483648`, `schedule function ${packName}:delay_for_loop 1t`); zip.file(`${workingDir}/delay_for_loop.mcfunction`, `scoreboard players set @e[tag=${configData.entityTag},scores={${timerObjectiveName}=-2147483648}] instrument1.timer 0\nfunction ${packName}:search/0`); } // "once" and "hold" loop modes are ignored since the animation stops on its own zip.file(`${workingDir}/frames/${keyframeTime}.mcfunction`, `${commands.join("\n")}\n${extraCommands.join("\n")}`); } } // Export the completed data pack zip.generateAsync({type: "blob"}).then(content => { Blockbench.export({ startpath: Project.export_path, type: "Zip Archive", extensions: ["zip"], name: animationName, content: content, savetype: "zip" }); }); } (function() { Plugin.register("armor_stand_animator", { title: "Armor Stand Animator", author: "DoubleFelix", description: "Provides an interface to animate armor stands which is converted to a data pack", tags: ["Minecraft: Java Edition"], icon: "fa-forward", version: "1.1.0", variant: "both", onload() { // Both actions are globals createArmorStandAction = new Action("create_armor_stand", { name: "Create Armor Stand Model", description: "Creates an armor stand model, complete with bones and textures", icon: "person_add", click: function() { new Dialog("createArmorStandOptions", { title: "Create Armor Stand Model", form: { includeBasePlate: {type: "checkbox", label: "Include Base Plate", value: false}, armorStandName: {type: "text", label: "Armor Stand Name", value: getRootBoneNameDifferentiator("armor_stand", 0)}, }, onConfirm: function(formData) { // Set UV width and height Project.texture_width = 48; Project.texture_height = 25; // Returns undefined if it couldn't find the texture let armorStandTexture = Texture.all.find(q => (q.name === "armor_stand")); // If a texture with that name does not exist, create it if (!armorStandTexture) { armorStandTexture = new Texture({ name: "armor_stand", mode: "bitmap", source: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAZCAMAAAE3eG3dAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABCUExURQAAAMKdYriUX5+ETcagZ7SQWn5iN6+PVZZ0QWdQLKKCUamJWHNeOYeHh4CAgKioqLCwsJ2dnaOjo3h4eJKSkgAAAEcA5fkAAAAWdFJOU////////////////////////////wAB0sDkAAAACXBIWXMAAA7AAAAOwAFq1okJAAACBklEQVQoU32T7ZakIAxECYi0M6PS9OT9X3VvBe3t/bM5GsHKRyWB5G7ZPTXPOXvKPvZu6XyOcXawXMAeS8kVk70PtzR6H+dIDeSW5D++HwePW0tmvo/B42aEcC+5hHEqTZ8pqWWzXGvJxqa6y30nQFGAHgK1BKsRomh8nqfSjwG7BS/3xVazUBGXYJYL64WCCC59IUEm2JSNN1QmoYg1qO0EP8+pKT03qDRRp/Dez6ndWyuZ8tWa/Rz9HFPjgfHMgShtxL/kL12ohorfAIXs1/ofoQ7VZIUSKAm9XACbBlhqrlatVfYTkLoLu+p0/zKAb6WLEV2P5t5yItLDPca9T33VAYpLp9H9NTUexnSEulMyHZk6WlJSgaTPYTF86SBv6i45GFpXq6R1sPDQHBX6PDlTGi1Yf3YdvGWp0a4pUb6GiRfybuotnBLRus+XbNfME15zNZFb0uOxbtu2wmuWxTuVLWWxBbVc3Z5CzwsZOI0IGHhYSt7OYXlJUnRl0cXioK8Niiirc1srW+Z3mcfw7Os+qv+X+v2DHTeIoluJGnZaKOHsHp9rYfQfDrmJ0qq6w4Gu65oj++damOxkyKzDMZp3DIx4mdP+uRam3tCdxyz6yvCaNhru63MtDLNVA0iiJm/91AV7wgOr38+1MDrfMrc0QS2S6OeBvH45zccu9V4LgwWG2/YHQJY6amRT2pAAAAAASUVORK5CYII=", width: 48, height: 25 }); armorStandTexture.add(); armorStandTexture.load(); } let armorStand = new Group({name: formData.armorStandName, origin: [0, 0, 0], isOpen: true}).init(); let headBone = new Group({name: "head_bone", origin: [0, 21.5, 0], isOpen: true}).addTo(armorStand).init(); let headCube = new Cube({name: "head", from: [-1, 23, -1], to: [1, 29, 1], uv_offset: [0, 1]}).addTo(headBone).init(); let leftArmBone = new Group({name: "left_arm_bone", origin: [6.25, 21.25, 0], isOpen: true}).addTo(armorStand).init(); let leftArmCube = new Cube({name: "left_arm", from: [5, 11, -1], to: [7, 23, 1], uv_offset: [40, 10]}).addTo(leftArmBone).init(); let rightArmBone = new Group({name: "right_arm_bone", origin: [-6.25, 21.25, 0], isOpen: true}).addTo(armorStand).init(); let rightArmCube = new Cube({name: "right_arm", from: [-7, 11, -1], to: [-5, 23, 1], uv_offset: [40, 10]}).addTo(rightArmBone).init(); let bodyBone = new Group({name: "body_bone", origin: [0, 23.5, 0], isOpen: true}).addTo(armorStand).init(); let leftRibCube = new Cube({name: "left_rib", from: [1, 13, -1], to: [3, 20, 1], uv_offset: [0, 1]}).addTo(bodyBone).init(); let rightRibCube = new Cube({name: "right_rib", from: [-3, 13, -1], to: [-1, 20, 1], uv_offset: [0, 1]}).addTo(bodyBone).init(); let collarCube = new Cube({name: "collar", from: [-6, 20, -1.5], to: [6, 23, 1.5], uv_offset: [9, 5]}).addTo(bodyBone).init(); let hipCube = new Cube({name: "hip", from: [-4, 11, -1], to: [4, 13, 1], uv_offset: [14, 0]}).addTo(bodyBone).init(); let leftLegBone = new Group({name: "left_leg_bone", origin: [2, 12, 0], isOpen: true}).addTo(armorStand).init(); let leftLegCube = new Cube({name: "left_leg", from: [1, 0.5, -1], to: [3, 11, 1], uv_offset: [0, 11]}).addTo(leftLegBone).init(); let rightLegBone = new Group({name: "right_leg_bone", origin: [-2, 12, 0], isOpen: true}).addTo(armorStand).init(); let rightLegCube = new Cube({name: "right_leg", from: [-3, 0.5, -1], to: [-1, 11, 1], uv_offset: [0, 11]}).addTo(rightLegBone).init(); let cubesToApplyTexturesTo = [headCube, leftArmCube, rightArmCube, leftRibCube, rightRibCube, collarCube, hipCube, leftLegCube, rightLegCube]; if (formData.includeBasePlate) { let plate = new Cube({name: "plate", from: [-6, 0, -6], to: [6, 1, 6], uv_offset: [0, 12]}).addTo(armorStand).init(); cubesToApplyTexturesTo.push(plate); } for (let cube of cubesToApplyTexturesTo) { cube.applyTexture(armorStandTexture, true); } this.hide(); } }).show(); // TODO new texture and new model // Hardcoded positions and sizes } }); exportAnimationAction = new Action("export_animation", { name: "Export Armor Stand Animation", description: "Exports the animation to a data pack", icon: "file_download", click: function() { let startTime = new Date(); // Fetch the selected animation by checking which one has the selected property let selectedAnimation = Animator.animations.find(q => (q.selected === true)); // Set the start delay to 0 if it wasn't defined by the user let animationStartDelay = selectedAnimation.startDelay; animationStartDelay = typeof animationStartDelay === "number" ? animationStartDelay : 0; // If no animation is selected, show an error if (selectedAnimation === undefined) { Blockbench.showQuickMessage("You must select an animation to export", 2000); return; } // Check snapping values and their validity let waitingForSnappingWarning = false; let shouldReturn = false; if (selectedAnimation.snapping > 20 || selectedAnimation.snapping % 10 !== 0) { waitingForSnappingWarning = true; Blockbench.showMessageBox({ title: "Warning", message: "The snapping value of this animation is 10 or 20. All keyframe times will be rounded up to the nearest 50th millisecond. Do you wish to continue?", icon: "warning", buttons: ["Yes", "No"], confirm: 0, cancel: 1, }, function (buttonIndex) { if (buttonIndex === 0) { waitingForSnappingWarning = false; } else if (buttonIndex === 1) { shouldReturn = true; } }); // Returning where the "shouldReturn = true;" is will cause it to exit the callback function, not this one. if (shouldReturn) { return; } } // Wrapper function for the warning check done below function makeAnimation() { // Bind all the bone objects to variables let bones = Object.values(selectedAnimation.animators); let parentBone = bones.find(q => (q.name === "armor_stand")); let headBone = bones.find(q => (q.name === "head_bone")); let leftArmBone = bones.find(q => (q.name === "left_arm_bone")); let rightArmBone = bones.find(q => (q.name === "right_arm_bone")); let bodyBone = bones.find(q => (q.name === "body_bone")); let leftLegBone = bones.find(q => (q.name === "left_leg_bone")); let rightLegBone = bones.find(q => (q.name === "right_leg_bone")); // Remove the animation. prefix (it is added by blockbench by default) if it exists animationName = selectedAnimation.name.startsWith("animation.") ? selectedAnimation.name.slice(10) : selectedAnimation.name; new Dialog("exportAnimationOptions", { title: "Export Animation", form: { // Default value is 16 units to 1 block, minimum value is 64 units to 1 block blockUnitScale: {type: "number", label: "Block/Unit Ratio", value: 0.0625, min: 0.015625, max: 16, step: 0.1}, // How frames are turned into tick times. A time scale of 0.5 will make the exported animation play at half speed. timeScale: {type: "number", label: "Time Scale", value: 1, min: 0.1, max: 100, step: 0.1}, // The name of the pack namespace, and the data pack folder (if generateMode is data_pack) packName: {type: "text", label: "Pack Name", value: animationName, height: 30}, // The tag that the entity should have. Should be unique per animation. entityTag: {type: "text", label: "Entity Tag", value: animationName, height: 30}, // Whether or not the behavior for pausing and resuming the animation should be added to the data pack playbackControl: {type: "checkbox", label: "Enable Pause/Play Control", value: true}, // Whether or not the animation should be exported as a data pack or namespace (useful for integrating into one pack) generationMode: {type: "select", label: "Generation Mode", options: {data_pack: "Complete Data Pack", namespace: "Data Pack Namespace"}} }, onConfirm: function(formData) { // Loop through each bone and construct JSON data sorted by keyframe, then by rotation or position, then by bone let animationContent = {}; for ([boneObj, boneName] of [ [parentBone, "main"], [headBone, "head"], [leftArmBone, "leftArm"], [rightArmBone, "rightArm"], [bodyBone, "body"], [leftLegBone, "leftLeg"], [rightLegBone, "rightLeg"] ]) { // Show warning if the user modifies the position of any non-parent bone if (boneObj.position.length > 0 && boneName !== "main") { let positionWarning = Blockbench.showToastNotification({ text: "The animation includes a keyframe which modifies the position of a bone that is not \"armor_stand\". Positional animations for armor stand limbs are not supported and will not be included in the exported animation.", icon: "error", expire: 10000, click: function() { positionWarning.delete(); } }); } // Show warning if the user modifies the scale of the armor stand in any way if (boneObj.scale.length > 0) { let scaleWarning = Blockbench.showToastNotification({ text: "The animation includes a keyframe which modifies the scale of a bone. Scale animations are not supported and will not be included in the exported animation.", icon: "error", expire: 10000, click: function() { scaleWarning.delete(); } }); } let shouldDisplayXZRotationWarning = false; if (boneName === "main") { // Functionality is essentially the same when using .entries, but we need index for position calculation for ([index, keyframe] of boneObj.position.entries()) { let keyframeData = keyframe.data_points[0]; // Round the keyframe timer up to the nearest increment of 0.05, multiply it by 20 to turn it into ticks, and implement the starting delay keyframeTime = (roundKeyframeTime(keyframe.time) + animationStartDelay) * 20 * formData.timeScale; animationContent[keyframeTime] ??= {}; // If we couldn't find a previous keyframe, then set the positions to 0 so the below calculation doesn't change the current keyframe let previousKeyframe = boneObj.position[index - 1]; let previousKeyframeData = previousKeyframe ? previousKeyframe.data_points[0] : {x: 0, y: 0, z: 0}; animationContent[keyframeTime].pos = [(keyframeData.x - previousKeyframeData.x).toString(), (keyframeData.y - previousKeyframeData.y).toString(), (keyframeData.z - previousKeyframeData.z).toString()]; } // Handle armor stand base rotation for (keyframe of boneObj.rotation) { let keyframeData = keyframe.data_points[0]; if (!shouldDisplayXZRotationWarning && (keyframeData.x != 0 || keyframeData.z != 0)) { shouldDisplayXZRotationWarning = true; } keyframeTime = (roundKeyframeTime(keyframe.time) + animationStartDelay) * 20 * formData.timeScale; animationContent[keyframeTime] ??= {}; animationContent[keyframeTime].rot ??= {}; animationContent[keyframeTime].rot.main = [keyframeData.y.toString()]; } } else { for (keyframe of boneObj.rotation) { let keyframeData = keyframe.data_points[0]; keyframeTime = (roundKeyframeTime(keyframe.time) + animationStartDelay) * 20 * formData.timeScale; animationContent[keyframeTime] ??= {}; animationContent[keyframeTime].rot ??= {}; // Invert X and Z rotation since minecraft is weird animationContent[keyframeTime].rot[boneName] = [(keyframeData.x * -1).toString(), keyframeData.y.toString(), (keyframeData.z * -1).toString()]; } } // Display a warning if the user tries to modify any non-Y axis of the main armor stand bone if (shouldDisplayXZRotationWarning) { let rotationWarning = Blockbench.showToastNotification({ text: "The animation includes a keyframe which modifies the X or Z rotation of the \"armor_stand\" bone. Rotations for the \"armor_stand\" bone on the X and Z axis are not supported and will not be included in the exported animation.", icon: "error", expire: 10000, click: function() { rotationWarning.delete(); } }); } } this.hide(); generatePackFromAnimation(animationContent, animationName, formData, selectedAnimation.loop, startTime) } }).show(); } // Repeatedly poll to see if the snapping warning is gone, and if it is, then generate the animation. function checkSnappingWarningCompletion() { if (waitingForSnappingWarning) { setTimeout(checkSnappingWarningCompletion, 250); } else { makeAnimation(); } } checkSnappingWarningCompletion(); Blockbench.setStatusBarText(`Animation exported in ${(new Date() - startTime) / 100} seconds`); } }); MenuBar.addAction(createArmorStandAction, "filter"); MenuBar.addAction(exportAnimationAction, "filter"); }, onunload() { createArmorStandAction.delete(); exportAnimationAction.delete(); } }); })(); ================================================ FILE: plugins/asset_browser/about.md ================================================

Asset browser is a browser that lets you view, modify, export, and compare the Minecraft vanilla assets. Both Java edition and Bedrock edition are supported, as well as their respective snapshots and beta versions.

View Assets Mode:

  • Used for viewing the assets from a specific game version.
  • Shows all the assets for the selected version.

Compare Assets Mode:

  • Used to compare two game versions to see what files have been added, changed, or removed.
  • Only shows relevant files, not all files.
================================================ FILE: plugins/asset_browser/asset_browser.js ================================================ const crypto = require("node:crypto") const zlib = require("node:zlib") let fs, dialog, action, storage, loader, styles, cacheDir const id = "asset_browser" const name = "Asset Browser" const icon = "folder_zip" const description = "Browse the Minecraft assets from within Blockbench." const links = { website: { text: "By Ewan Howell", link: "https://ewanhowell.com/", icon: "language", colour: "#33E38E" }, discord: { text: "Discord Server", link: "https://discord.ewanhowell.com/", icon: "fab.fa-discord", colour: "#727FFF" } } const manifest = { latest: {}, types: { release: "Java Release", snapshot: "Java Snapshot", bedrock: "Bedrock Release", "bedrock-preview": "Bedrock Preview" }, versions: [] } const customIcons = { creeper: '', forge: '', neoforge: '', fabric: '' } let loadedJars = {} const ignoredExtensions = ["class", "nbt", "mcassetsroot", "mf", "sf", "dsa", "rsa", "jfc", "xml", "md", "toml", "itransformationservice", "hex", "jar"] const ignoredExtensionsRoot = ["txt", "cfg"] const ignoredExtensionsRegex = new RegExp(`\\.(${ignoredExtensions.join("|")})$|(?:^|\/)[^\/\\.]+$|(?:^|\/)\\.`, "i") const ignoredExtensionsRootRegex = new RegExp(`^[^\\/]+\\.(?:${ignoredExtensionsRoot.join("|")})$`, "i") const javaBlock = { oneOf: new Set(["parent", "elements"]), items: new Set(["parent", "textures", "elements", "ambientocclusion", "gui_light", "display", "groups", "texture_size", "overrides"]) } const item_parents = [ "item/generated", "minecraft:item/generated", "item/handheld", "minecraft:item/handheld", "item/handheld_rod", "minecraft:item/handheld_rod", "builtin/generated", "minecraft:builtin/generated" ] const titleCase = str => str.replace(/_|-/g, " ").replace(/\w\S*/g, str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()) const shaCheck = async (path, sha) => crypto.createHash("sha1").update(await fs.promises.readFile(path)).digest("hex") === sha const save = () => localStorage.setItem(id, JSON.stringify(storage)) Plugin.register(id, { title: name, icon: "icon.png", author: "Ewan Howell", description, tags: ["Minecraft", "Assets", "Browser"], version: "1.2.2", min_version: "5.0.0", variant: "desktop", creation_date: "2025-05-30", website: "https://ewanhowell.com/plugins/asset-browser/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/asset-browser", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Asset Browser]", has_changelog: true, onload() { fs = require("fs", { message: "This permission is required to access your downloaded Minecraft versions, cache versions you open that aren’t already downloaded, and export assets to folders.", optional: false }) if (!fs) { throw new Error("fs access denied") } cacheDir = PathModule.join(SystemInfo.user_data_directory, "minecraft_assets_cache") if (!fs.existsSync(cacheDir)) { fs.mkdirSync(cacheDir, { recursive: true }) } storage = JSON.parse(localStorage.getItem(id) ?? "{}") storage.recents ??= [] storage.recentComparisons ??= [] loadSidebar() let directory if (SystemInfo.platform === "win32") { directory = PathModule.join(SystemInfo.appdata_directory, ".minecraft") } else if (SystemInfo.platform === "darwin") { directory = PathModule.join(SystemInfo.home_directory, "Library", "Application Support", "minecraft") } else { directory = PathModule.join(SystemInfo.home_directory, ".minecraft") } new Setting("ewan_minecraft_directory", { value: directory, category: "defaults", type: "click", name: "Ewan's Plugins - Minecraft Directory", description: "The location of your .minecraft folder", icon: "folder_open", click() { const dir = Blockbench.pickDirectory({ title: "Select your .minecraft folder", startpath: settings.ewan_minecraft_directory.value }) if (dir) { settings.ewan_minecraft_directory.value = dir Settings.saveLocalStorages() } } }) dialog = new Dialog({ id, title: name, width: 816, resizable: true, buttons: [], lines: [``], component: { data: { type: storage.type ?? "release", manifest, selectedVersions: Object.fromEntries(Object.keys(manifest.types).map(k => [k, null])), version: null, versionSearch: "", recentVersions: storage.recents, downloadedVersions: [], objects: storage.objects, jar: null, loadingMessage: null, path: [], tree: {}, textureObserver: null, lastInteracted: null, shiftStartItem: null, selected: [], savedFolders: storage.savedFolders, sidebarVisible: true, navigationHistory: [], navigationFuture: [], breadcrumbsOverflowing: false, breadcrumbsResizeObserver: null, validSavedFolders: [], activeSavedFolder: null, displayType: storage.display ?? "grid", lastArrowKeyPress: 0, typeFindText: "", typeFindLastKey: 0, typeFindStart: 0, sort: "name", sortDirection: "forwards", currentFolderData: {}, searchOpen: false, searchText: "", searchTimeout: null, filesMessage: null, itemCount: 0, ready: Promise.withResolvers(), lastOpenFormat: null, progressDone: 0, progressTotal: 0, exporting: false, mode: "assets", compareType: storage.compareType ?? "release", compareSelectedVersions: Object.fromEntries(Object.keys(manifest.types).map(k => [k, null])), compareVersion: null, recentComparisons: storage.recentComparisons, suggestedComparisons: [] }, components: { "animated-texture": animatedTexureComponent(), "lazy-scroller": lazyScrollerComponent() }, watch: { loadingMessage(val) { if (!val && this.jar) { this.getValidSavedFolders() } this.$nextTick(() => { if (!val && this.jar) { this.setupBreadcrumbs() } }) }, savedFolders() { this.getValidSavedFolders() } }, beforeDestroy() { this.breadcrumbsResizeObserver.disconnect() }, computed: { currentFolderContents() { this.currentFolderData = {} let current const searchText = this.searchText.trim().toLowerCase() if (this.searchOpen && searchText) { current = {} const currentFolder = this.path.join("/") + "/" const folders = new Set for (const k of Object.keys(this.jar.files)) { folders.add(PathModule.dirname(k)) if (k.startsWith(currentFolder) || currentFolder === "/") { let relativePath = k if (currentFolder !== "/") { relativePath = k.slice(currentFolder.length) } if (relativePath.toLowerCase().includes(searchText)) { current[relativePath] = k this.$set(this.currentFolderData, relativePath, { label: this.getFileLabel(relativePath.split("/"), relativePath, k), dimensions: this.getImageDimensions(k) }) } } } for (const folder of folders) { if (folder === ".") continue if (folder.startsWith(currentFolder) || currentFolder === "/") { let relativePath = folder if (currentFolder !== "/") { relativePath = folder.slice(currentFolder.length) } if (relativePath.toLowerCase().includes(searchText)) { let content = this.tree for (const part of folder.split("/")) { content = content[part] } current[relativePath] = content this.$set(this.currentFolderData, relativePath, { label: this.getFileLabel(relativePath.split("/"), relativePath, content) }) } } } } else { current = this.tree for (const part of this.path) { current = current[part] } for (const [k, v] of Object.entries(current)) { this.$set(this.currentFolderData, k, { label: this.getFileLabel(this.path, k, v), dimensions: typeof v === "object" ? undefined : this.getImageDimensions(v) }) } } this.filesMessage = null this.itemCount = Object.keys(current).length if (this.itemCount > 4000) { this.filesMessage = "Too many results, try narrowing your search" return [] } else if (!this.itemCount) { this.filesMessage = "No results" return [] } let entries if (this.searchOpen && searchText && this.sort === "name") { entries = Object.entries(current).sort(([ka, va], [kb, vb]) => { ka = ka.toLowerCase() kb = kb.toLowerCase() const isFolderA = typeof va === "object" const isFolderB = typeof vb === "object" const extA = PathModule.extname(ka) const extB = PathModule.extname(kb) const baseA = PathModule.basename(ka, PathModule.extname(ka)) const baseB = PathModule.basename(kb, PathModule.extname(kb)) if (baseA === searchText && baseB === searchText) { if (isFolderA !== isFolderB) return isFolderA ? 1 : -1 return naturalSorter(ka, kb) } if (baseA === searchText) return -1 if (baseB === searchText) return 1 const aIndex = ka.lastIndexOf(searchText) const bIndex = kb.lastIndexOf(searchText) const slashCount = (ka.slice(aIndex + searchText.length).match(/\//g)?.length ?? 0) - (kb.slice(bIndex + searchText.length).match(/\//g)?.length ?? 0) if (slashCount !== 0) { return slashCount } const aBefore = ka.slice(0, aIndex).lastIndexOf("/") const aAfter = ka.slice(aIndex + searchText.length).indexOf("/") const aSection = PathModule.basename(ka.slice( aBefore === -1 ? 0 : aBefore + 1, aIndex + searchText.length + (aAfter === -1 ? Infinity : aAfter) ), extA) const bBefore = kb.slice(0, bIndex).lastIndexOf("/") const bAfter = kb.slice(bIndex + searchText.length).indexOf("/") const bSection = PathModule.basename(kb.slice( bBefore === -1 ? 0 : bBefore + 1, bIndex + searchText.length + (bAfter === -1 ? Infinity : bAfter) ), extB) if (aSection.startsWith(searchText)) { if (bSection.startsWith(searchText)) { const beforeSlashCount = (ka.slice(0, aIndex).match(/\//g)?.length ?? 0) - (kb.slice(0, bIndex).match(/\//g)?.length ?? 0) if (beforeSlashCount !== 0) return beforeSlashCount return naturalSorter(aSection, bSection) } return -1 } if (bSection.startsWith(searchText)) return 1 return naturalSorter(aSection, bSection) }) if (this.sortDirection === "backwards") { entries.reverse() } } else { entries = Object.entries(current).sort(([ka, va], [kb, vb]) => { ka = ka.toLowerCase() kb = kb.toLowerCase() const isFolderA = typeof va === "object" || ka.endsWith(".zip") const isFolderB = typeof vb === "object" || kb.endsWith(".zip") if (this.sort === "size") { if (isFolderA && !isFolderB) return 1 if (isFolderB && !isFolderA) return -1 } else { if (isFolderA && !isFolderB) return -1 if (isFolderB && !isFolderA) return 1 } if (this.sort === "size") { const dimsA = this.currentFolderData[ka].dimensions const dimsB = this.currentFolderData[kb].dimensions if (dimsA && !dimsB) return -1 if (dimsB && !dimsA) return 1 if (dimsA && dimsB) { const areaA = dimsA[0] * dimsA[1] const areaB = dimsB[0] * dimsB[1] if (areaA !== areaB) { return this.sortDirection === "forwards" ? areaB - areaA : areaA - areaB } } } else if (this.sort === "type") { const labelA = this.currentFolderData[ka].label const labelB = this.currentFolderData[kb].label if (labelA && !labelB) return -1 if (labelB && !labelA) return 1 if (labelA && labelB) { const sort = this.sortDirection === "forwards" ? naturalSorter(labelA, labelB) : naturalSorter(labelB, labelA) if (sort) return sort } } return this.sortDirection === "forwards" ? naturalSorter(ka, kb) : naturalSorter(kb, ka) }) } this.lastInteracted = entries[0]?.[0] this.selected = [] return entries } }, methods: { updateVersion() { if (this.selectedVersions[this.type]) { this.version = this.selectedVersions[this.type] storage.type = this.type save() } if (this.compareSelectedVersions[this.compareType]) { this.compareVersion = this.compareSelectedVersions[this.compareType] storage.compareType = this.compareType save() } }, async loadVersion(path = []) { if (this.mode === "assets") { this.loadingMessage = `Loading ${this.version}…` } else { this.loadingMessage = `Loading ${this.compareVersion} and ${this.version}…` } this.path = path this.navigationHistory = [[]] this.navigationFuture = [] this.searchOpen = false this.searchText = "" this.progressDone = 0 this.progressTotal = 0 if (this.mode === "assets") { this.jar = await getVersionJar(this.version) } else { this.jar = await getVersionComparison(this.compareVersion, this.version) } if (!Object.keys(this.jar.files).length) { this.jar = null this.loadingMessage = null Blockbench.showQuickMessage("Unable to load version. It may be corrupted") return } if (this.mode === "assets" && this.objects) { for (const [k, v] of Object.entries(await getVersionObjects(this, this.version))) { if (k.endsWith(".png") || k.endsWith(".jpg") || k.endsWith(".jpeg")) { v.content = await fs.promises.readFile(v.path) const img = new Image img.src = "data:image/png;base64," + v.content.toString("base64") v.image = img } this.$set(this.jar.files, k, v) } } if (!this.jar.optifineLoaded && this.version.includes("OptiFine")) { const folderName = this.version.replace("-OptiFine", "") const libraryFile = PathModule.join(settings.ewan_minecraft_directory.value, "libraries", "optifine", "OptiFine", folderName, `OptiFine-${folderName}.jar`) if (await exists(libraryFile)) { const zip = parseZip(await fs.promises.readFile(libraryFile).then(e => e.buffer)) for (const [k, v] of Object.entries(zip.files)) { this.$set(this.jar.files, k, v) } this.jar.optifineLoaded = true } } this.tree = {} for (let [path, value] of Object.entries(this.jar.files)) { const parts = path.split("/") if (parts[0] === "optifine") continue let current = this.tree const zip = parts.some(e => e.endsWith(".zip")) for (const [index, part] of parts.entries()) { if (!current[part]) { current[part] = index === parts.length - 1 ? path : {} } current = current[part] } } if (this.tree.resource_pack?.textures?.["flipbook_textures.json"]) { this.jar.flipbook = JSON.parse(this.jar.files[this.tree.resource_pack.textures["flipbook_textures.json"]].content.toString().replace(/\/\/.*$/gm, "")) this.jar.flipbook.push({ flipbook_texture: "textures/flame_atlas" }) } if (this.mode === "assets") { if (storage.recents.includes(this.version)) { storage.recents.splice(storage.recents.indexOf(this.version), 1) } storage.recents.unshift(this.version) if (storage.length > 20) { storage.recents.length = 20 } } else { const index = storage.recentComparisons.findIndex(e => e[0] === this.compareVersion && e[1] === this.version) if (index !== -1) { storage.recentComparisons.splice(index, 1) } storage.recentComparisons.unshift([this.compareVersion, this.version]) if (storage.length > 20) { storage.recentComparisons.length = 20 } } save() this.loadingMessage = null }, hasAnimation(file) { if (this.jar.files[file].animation === false) return if (this.jar.files[file].animation) return true if (this.jar.flipbook) { const split = file.split("/") if (split[0] === "resource_pack") { const texture = split.slice(1).join("/").slice(0, -4) const anim = this.jar.flipbook.find(e => e.flipbook_texture === texture) if (anim) { this.jar.files[file].animation = { animation: { frametime: anim.ticks_per_frame, interpolate: anim.blend_frames ?? true, frames: anim.frames } } return true } } this.jar.files[file].animation = false return } const mcmeta = this.jar.files[file + ".mcmeta"] if (mcmeta) { try { const data = JSON.parse(mcmeta.content) if (data.animation) { this.jar.files[file].animation = data return true } } catch {} this.jar.files[file].animation = false } }, select(file, value, event) { if (event.currentTarget.dataset.lastClick) { if (Date.now() - Number(event.currentTarget.dataset.lastClick) < 500) { if (typeof value === "object") { return this.openFolder(this.path.concat(file)) } else { return this.openFiles() } } } event.currentTarget.dataset.lastClick = Date.now() const keys = this.currentFolderContents.map(entry => entry[0]) if (!event.shiftKey) { this.shiftStartItem = null } if (event.shiftKey) { if (!this.shiftStartItem) { this.shiftStartItem = this.lastInteracted } const start = keys.indexOf(this.shiftStartItem) const selected = this.selected.includes(this.shiftStartItem) const end = keys.indexOf(file) const range = keys.slice(Math.min(start, end), Math.max(start, end) + 1) if (event.ctrlKey || event.metaKey) { if (selected) { this.selected = Array.from(new Set(this.selected.concat(range))) } else { this.selected = this.selected.filter(e => !range.includes(e)) } } else { this.selected = range } } else if (event.ctrlKey || event.metaKey) { const index = this.selected.indexOf(file) if (index !== -1) { this.selected.splice(index, 1) } else { this.selected.push(file) } } else { this.selected = [file] } this.lastInteracted = file }, async getFileContent(file) { const data = this.jar.files[file] ?? this.jar.zips?.[file] if (!data) return if (!data.content) { data.content = await fs.promises.readFile(data.path) } return data.content }, getFileContentSync(file) { const data = this.jar.files[file] ?? this.jar.zips?.[file] if (!data) return if (!data.content) { data.content = fs.readFileSync(data.path) } return data.content }, async openFilesCheck() { if (this.selected.length <= 16) return true if (!await confirm("Open files", `You are about to open ${this.selected.length.toLocaleString()} files. Are you sure you want to continue?`)) return if (this.selected.length > 128) { if (!await confirm("Open files", `Are you really sure? ${this.selected.length.toLocaleString()} files is a lot. Are you absolutely sure you want to continue?`)) return } return true }, async openFiles() { if (!(await this.openFilesCheck())) return const files = this.selected.map(e => { const path = this.path.concat(e).join("/") return ({ name: e, path }) }) let closeDialog const blockbenchOpen = [] await Promise.all(files.map(async file => { const content = await this.getFileContent(file.path) if (!content) return if (file.name.endsWith(".png")) { Codecs.image.load([{ content: "data:image/png;base64," + content.toString("base64") }], name) closeDialog = true } else if (file.name.endsWith(".zip")) { await this.loadZip(file.path) this.openFolder(this.path.concat(file.name)) } else if (await this.blockbenchOpenable(file.path)) { try { blockbenchOpen.push({ content: JSON.parse(content), name: file.name, path: this.path.concat(file.name).join("/"), type: this.jar.files[file.path].formatType ?? "json" }) if (this.jar.files[file.path].formatType) { closeDialog = true } } catch { blockbenchOpen.push({ content: content.toString(), name: file.name, path: this.path.concat(file.name).join("/") }) } } else { this.openExternally(file.path) } })) if (closeDialog) { dialog.close() } if (blockbenchOpen.length) { for (const file of blockbenchOpen) { if (file.type === "java") { await this.loadJavaBlockItemModel(file, blockbenchOpen.length) } else if (file.type === "bedrock") { loadModelFile({ content: JSON.stringify(file.content), path: `${Date.now()}${osfs}${file.name}` }, { externalDataLoader: data => { if (typeof data === "string") { return this.getFileContentSync(`resource_pack/${data}`) } const files = Object.keys(this.jar.files).filter(e => e.startsWith(`resource_pack/${data.dir}`)).filter(data.filter) for (const file of files) { const content = this.getFileContentSync(file).toString() const output = data.find(content) if (output) { if (data.return === "find") { return output } else { return content } } } } }) } else { const extension = PathModule.extname(file.name) || ".txt" const parent = this new Dialog({ id: id + "_text_viewer", title: file.name, width: 816, resizable: true, buttons: [], lines: [`

Icons can be from any of the following sources:

Icon Source Formatting
Google Material Icons icon_name
Font Awesome Free fa-icon-name
Blockbench icon-icon_name
`], onConfirm: result => { this.$set(folder, 1, result.name.trim() || null) this.$set(folder, 2, result.icon.trim().toLowerCase().replaceAll(" ", "_") || null) save() } }).show() } }, "_", { id: "move_up", name: "Move Up", icon: "arrow_upward", condition: this.validSavedFolders[0] !== folder, click: () => { storage.savedFolders.splice(storage.savedFolders.indexOf(folder), 1) storage.savedFolders.splice(storage.savedFolders.indexOf(this.validSavedFolders[this.validSavedFolders.indexOf(folder) - 1]), 0, folder) save() } }, { id: "move_down", name: "Move Down", icon: "arrow_downward", condition: this.validSavedFolders[this.validSavedFolders.length - 1] !== folder, click: () => { storage.savedFolders.splice(storage.savedFolders.indexOf(folder), 1) storage.savedFolders.splice(storage.savedFolders.indexOf(this.validSavedFolders[this.validSavedFolders.indexOf(folder) + 1]) + 1, 0, folder) save() } }, "_", { id: "unpin_from_sidebar", name: "Unpin from Sidebar", icon: "push_pin", click: () => { storage.savedFolders.splice(storage.savedFolders.indexOf(folder), 1) save() } }, "_", { id: "reset", name: "Reset Sidebar", icon: "replay", click: () => { loadSidebar(true) } } ], { onClose: () => this.activeSavedFolder = null }).open(event) }, sidebarContextMenu(event) { new Menu(`${id}_context_menu`, [ { id: "reset", name: "Reset Sidebar", icon: "replay", click: () => { loadSidebar(true) } } ]).show(event) }, folderContextMenu(event) { new Menu(`${id}_context_menu`, [ { id: "export_selection", name: "Export Selection", icon: "fa-file-export", condition: this.selected.length, click: () => this.exportFiles(this.selected) }, { id: "export_folder", name: "Export Folder", icon: "fa-file-export", click: () => this.exportFiles(this.currentFolderContents.map(e => e[0])) } ]).open(event) }, getFileIcon(file, value) { if (file.includes(".lang") || value.startsWith("assets/minecraft/lang/")) return "translate" if (file.endsWith(".json") || file === "pack.mcmeta") return "data_object" if (file.endsWith(".fsh") || file.endsWith(".vsh") || file.endsWith(".glsl")) return "ev_shadow" if (file.includes(".mcmeta")) return "theaters" if (file.includes(".tga")) return "image" if (file.endsWith(".ogg") || file.endsWith(".fsb") || file.endsWith(".mus")) return "volume_up" if (file.includes(".zip")) return "folder_zip" if (file.includes(".properties")) return "list_alt" if (file.includes(".txt")) return "description" return "draft" }, getFolderIcon(path, custom) { if (custom) { return Blockbench.getIconNode(custom).outerHTML } if (!Array.isArray(path)) { path = [path] } let icon for (let i = path.length - 1; i >= 0; i--) { const part = path[i] if (part === "textures") icon = "image" else if (part === "models" || part === "blocks" || part === "block") icon = "deployed_code" else if (part === "items" || part === "item") icon = "swords" else if (part === "sounds") icon = "volume_up" else if (part === "shaders") icon = "ev_shadow" else if (part === "lang") icon = "translate" else if (part === "texts") icon = "text_fields" else if (part === "particles" || part === "particle") icon = "auto_awesome" else if (part === "atlases" || part === "map") icon = "map" else if (part === "font") icon = "font_download" else if (part === "post_effect") icon = "desktop_windows" else if (part === "resourcepacks") icon = "folder_zip" else if (part === "equipment") icon = "checkroom" else if (part === "blockstates") icon = "view_in_ar" else if (part === "entities" || part === "entity" || part === "mob") icon = "creeper" else if (part === "painting") icon = "brush" else if (part === "gui" || part === "ui") icon = "call_to_action" else if (part === "environment") icon = "light_mode" else if (part === "colormap" || part === "color_palettes") icon = "palette" else if (part === "misc") icon = "help" else if (part === "trims") icon = "fa-gem" else if (part === "effect" || part === "mob_effect") icon = "auto_fix" else if (part === "optifine" || part === "mob_effect") icon = "icon-format_optifine" else if (part === "persona_thumbnails") icon = "groups" else if (part === "animations") icon = "sync" else if (part === "animation_controllers") icon = "rule_settings" else if (part === "render_controllers") icon = "visibility" else if (part === "fogs") icon = "foggy" else if (part === "attachables") icon = "electrical_services" else if (part === "ctm") icon = "extension" else if (part === "added") icon = "add" else if (part === "changed") icon = "edit" else if (part === "removed") icon = "delete" else if (part === "waypoint_style") icon = "flag" if (icon) break } if (icon in customIcons) return customIcons[icon] return Blockbench.getIconNode(icon ?? "folder").outerHTML }, openFolder(path) { if (JSON.stringify(path) !== JSON.stringify(this.path)) { path = path.flatMap(e => e.split("/")) this.changeFolder(path) this.navigationHistory.push(path.slice()) this.navigationFuture = [] } }, changeFolder(path) { this.searchOpen = false this.searchText = "" this.path = path.slice() this.getValidSavedFolders() if (this.$refs.files) { this.$refs.files.$el.scrollTop = 0 } this.$nextTick(() => { this.checkBreadcrumbsOverflow() this.$refs.files.onResize() }) }, navigationSearch(item) { this.searchOpen = true this.searchText = item.search this.path = item.path.slice() }, navigationBack() { this.navigationFuture.push(this.navigationHistory.pop()) const prev = this.navigationHistory[this.navigationHistory.length - 1] if (Array.isArray(prev)) { this.changeFolder(prev) } else { this.navigationSearch(prev) } }, navigationForward() { this.navigationHistory.push(this.navigationFuture.pop()) const next = this.navigationHistory[this.navigationHistory.length - 1] if (Array.isArray(next)) { this.changeFolder(next) } else { this.navigationSearch(next) } }, toggleObjects() { this.objects = !this.objects storage.objects = this.objects if (!this.objects) { loadedJars = {} } save() }, setupBreadcrumbs() { if (!this.breadcrumbsResizeObserver) { this.breadcrumbsResizeObserver = new ResizeObserver(() => { this.checkBreadcrumbsOverflow() }) } this.breadcrumbsResizeObserver.observe(this.$refs.breadcrumbs) this.checkBreadcrumbsOverflow() if (!this.$refs.breadcrumbs.dataset.scrollListenerAdded) { this.$refs.breadcrumbs.addEventListener("scroll", this.handleBreadcrumbsScroll) this.$refs.breadcrumbs.dataset.scrollListenerAdded = true } }, checkBreadcrumbsOverflow() { if (this.$refs.breadcrumbs) { this.breadcrumbsOverflowing = this.$refs.breadcrumbs.scrollWidth > this.$refs.breadcrumbs.clientWidth this.$refs.breadcrumbs.scrollLeft = this.$refs.breadcrumbs.scrollWidth } }, handleBreadcrumbsScroll() { if (this.$refs.breadcrumbs.scrollLeft) { this.breadcrumbsOverflowing = this.$refs.breadcrumbs.scrollWidth > this.$refs.breadcrumbs.clientWidth } else { this.breadcrumbsOverflowing = false } }, async loadZip(file) { const content = await this.getFileContent(file) const zip = parseZip(content.buffer, false) const parts = file.split("/") let current = this.tree for (let i = 0; i < parts.length - 1; i++) { current = current[parts[i]] } const lastPart = parts[parts.length - 1] this.$set(current, lastPart, {}) current = current[lastPart] for (const [key, zipFile] of Object.entries(zip.files)) { const fullPath = `${file}/${key}` this.$set(this.jar.files, fullPath, zipFile) const subParts = key.split("/") let subCurrent = current for (const [index, subPart] of subParts.entries()) { if (!subCurrent[subPart]) { this.$set(subCurrent, subPart, index === subParts.length - 1 ? fullPath : {}) } subCurrent = subCurrent[subPart] } } this.jar.zips ??= {} this.jar.zips[file] = this.jar.files[file] delete this.jar.files[file] return current }, async getValidSavedFolders() { let start = this.tree if (this.mode === "compare" && this.path.length) { start = start[this.path[0]] } this.validSavedFolders = (await Promise.all(this.savedFolders.map(async folder => { let current = start for (const segment of folder[0]) { if (typeof current === "string" && current.endsWith(".zip")) { current = await this.loadZip(current) } else if (typeof current === "object" && typeof current[segment] === "string" && segment.endsWith(".zip")) { current[segment] = await this.loadZip(current[segment]) } if (!current || typeof current !== "object" || !(segment in current)) { return null } current = current[segment] } return folder }))).filter(Boolean) }, async keydownHandler(event) { if (this.$refs.browserSearch === document.activeElement) return if (this.jar && !this.loadingMessage) { if ((event.ctrlKey || event.metaKey) && event.key === "a") { this.selected = this.currentFolderContents.map(e => e[0]) } else if (event.key === "Escape") { event.stopPropagation() this.selected = [] } else if (event.key === "Enter") { event.stopPropagation() const [selected, selectionType] = await this.getDetailedSelection() if (selectionType !== "folder") { this.openFiles() } else if (selected.length === 1) { this.path.push(selected[0].name) } } else if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(event.key)) { if (!this.selected.length || this.selected.length > 1) { this.selected = [this.lastInteracted] } else if (this.selected.length === 1) { const container = this.$refs.files.$refs.container const index = this.currentFolderContents.findIndex(e => e[0] === this.selected[0]) if (event.key === "ArrowLeft") { if (index > 0) { this.selected = [this.currentFolderContents[index - 1][0]] } } else if (event.key === "ArrowRight") { if (index < this.currentFolderContents.length - 1) { this.selected = [this.currentFolderContents[index + 1][0]] } } else if (event.key === "ArrowUp" || event.key === "ArrowDown") { const styles = getComputedStyle(container) const gap = parseInt(styles.rowGap) let itemsPerRow = 1 if (this.displayType === "grid") { itemsPerRow = Math.max(1, Math.floor((container.clientWidth - parseInt(styles.padding) * 2 + gap) / (container.children[1].offsetWidth + gap))) } if (event.key === "ArrowUp") { if (index >= itemsPerRow) { this.selected = [this.currentFolderContents[index - itemsPerRow][0]] } } else if (event.key === "ArrowDown") { if (index + itemsPerRow < this.currentFolderContents.length) { this.selected = [this.currentFolderContents[index + itemsPerRow][0]] } } } const selectedElement = container.children[this.currentFolderContents.findIndex(e => e[0] === this.selected[0]) + 1] const containerRect = this.$refs.files.$el.getBoundingClientRect() const elementRect = selectedElement.getBoundingClientRect() if (elementRect.top < containerRect.top || elementRect.bottom > containerRect.bottom) { const scrollTo = this.displayType === "grid" ? selectedElement : selectedElement.children[0] scrollTo.scrollIntoView({ behavior: Date.now() - this.lastArrowKeyPress > 250 ? "smooth" : undefined, block: "nearest" }) } } this.lastArrowKeyPress = Date.now() } if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) { if (Date.now() - this.typeFindLastKey > 1000) { this.typeFindText = event.key.toLowerCase() } else { this.typeFindText += event.key.toLowerCase() } this.typeFindLastKey = Date.now() const index = this.currentFolderContents.findIndex(e => e[0].toLowerCase().startsWith(this.typeFindText)) if (index !== -1) { this.selected = [this.currentFolderContents[index][0]] const container = this.$refs.files.$refs.container let scrollTo, currentItems, newItems const compare = Date.now() this.typeFindStart = compare do { currentItems = container.children.length if (container.children[index + 1]) { scrollTo = this.displayType === "grid" ? container.children[index + 1] : container.children[index + 1].children[0] } else { this.$refs.files.loadMore() await this.$nextTick() } newItems = container.children.length } while (!scrollTo && currentItems !== newItems && this.typeFindStart === compare) scrollTo?.scrollIntoView({ block: "center" }) } } } }, switchDisplay(type) { this.displayType = type storage.display = type save() this.$refs.files.$el.scrollTop = 0 this.$nextTick(() => this.$refs.files.onScroll()) }, getFileLabel(folder, file, value) { if (this.mode === "compare" && this.path.length) { folder = folder.slice(1) } const path = folder.concat(file).join("/") file = PathModule.basename(path) const ext = file.includes(".") ? file.split(".").pop() : null switch (path) { case "assets": return "Resource Pack Assets" case "data": return "Data Pack Assets" case "doc": return "Documentation" case "pack.png": return "Pack Icon" case "pack.mcmeta": return "Pack Metadata" case "version.json": return "Version Information" case "assets/icons": case "assets/minecraft/icons": return "System Icons" case "assets/icons/snapshot": return "Snapshot Icons" case "assets/minecraft": return "Minecraft Assets" case "assets/realms": return "Realms Assets" case "assets/minecraft/atlases": return "Atlas Definitions" case "assets/minecraft/equipment": return "Equipment Definitions" case "assets/minecraft/font": return "Font Definitions" case "assets/minecraft/items": return "Item Definitions" case "assets/minecraft/particles": case "resource_pack/particles": return "Particle Definitions" case "assets/minecraft/post_effect": return "Post-Processing Effects" case "assets/minecraft/resourcepacks": return "Built-in Resource Packs" case "assets/minecraft/sounds": return "Sound Files" case "assets/minecraft/sounds.json": case "resource_pack/sounds_client.json": return "Sound Definitions" case "assets/minecraft/shaders/core": return "Core Shaders" case "assets/minecraft/shaders/include": return "Include Shaders" case "assets/minecraft/shaders/post": return "Post Shaders" case "assets/minecraft/shaders/program": return "Program Shaders" case "assets/minecraft/optifine/ctm": return "Connected Textures" case "assets/minecraft/optifine/bettergrass.properties": return "Better Grass Properties" case "assets/minecraft/optifine/natural.properties": return "Natural Textures Properties" case "assets/minecraft/texts/credits.json": return "Credits" case "assets/minecraft/texts/splashes.txt": return "Splash Texts" case "assets/minecraft/texts/postcredits.txt": return "Post Credits Text" case "assets/minecraft/texts/end.txt": return "End Poem" case "assets/minecraft/textures/environment": return "Sky & Weather" case "assets/minecraft/textures/entity/enderdragon": return "Ender Dragon" case "assets/minecraft/textures/entity/enderman": return "Enderman" case "assets/minecraft/models/block": return "Block Models" case "assets/minecraft/models/item": return "Item Models" case "assets/minecraft/resourcepacks/programmer_art.zip": return "Programmer Art Resource Pack" case "assets/minecraft/resourcepacks/high_contrast.zip": return "High Contrast Resource Pack" case "assets/minecraft/lang/en_us.json": case "assets/minecraft/lang/en_us.lang": case "assets/minecraft/optifine/lang/en_us.lang": return "English (US)" case "assets/minecraft/lang/deprecated.json": return "Deprecated Language Keys" case "behaviour_pack": return "Behaviour Pack Assets" case "resource_pack": return "Resource Pack Assets" case "resource_pack/blocks.json": return "Block Definitions" case "resource_pack/biomes_client.json": return "Biome Definitions" case "resource_pack/textures/flipbook_textures.json": return "Texture Animation Definitions" case "resource_pack/textures/item_texture.json": return "Item Texture Definitions" case "resource_pack/textures/terrain_texture.json": return "Block Texture Definitions" case "resource_pack/entity": return "Entity Definitions" case "resource_pack/models/entity": case "resource_pack/models/mobs.json": return "Entity Models" case "resource_pack/texts/languages.json": return "Languages" case "resource_pack/texts/language_names.json": return "Language Names" case "resource_pack/texts/ja_JP": return "Japanese Assets" case "resource_pack/texts/zh_TW": return "Chinese (Traditional) Assets" } switch (PathModule.dirname(path)) { case "assets/minecraft/atlases": return "Atlas Definition" case "assets/minecraft/blockstates": return "Blockstate" case "assets/minecraft/equipment": return "Equipment Definition" case "assets/minecraft/items": return "Item Definition" case "assets/minecraft/particles": return "Particle Definition" case "assets/minecraft/models/block": return "Block Model" case "assets/minecraft/models/item": return "Item Model" case "assets/minecraft/models/item": return "Item Model" case "assets/minecraft/shaders/core": case "assets/minecraft/shaders/program": case "assets/minecraft/shaders/post": if (ext === "json") return "Shader Program Definition" case "doc/images": return "Template" case "resource_pack/models/entity": return "Entity Model" case "resource_pack/entity": return "Entity Definition" case "resource_pack/animations": return "Animation" case "resource_pack/animation_controllers": return "Animation Controller" case "assets/minecraft/lang": case "assets/minecraft/optifine/lang": if (this.jar.files["pack.mcmeta"]) { let content = this.jar.files["pack.mcmeta"].content if (!content) { content = fs.readFileSync(this.jar.files["pack.mcmeta"].path) this.jar.files["pack.mcmeta"].content = content } const data = JSON.parse(content) const lang = data.language?.[PathModule.basename(file, PathModule.extname(file))] if (lang) { return `${lang.name} (${lang.region})` } } return "Language File" case "resource_pack/texts": if (this.jar.files["resource_pack/texts/language_names.json"]) { let content = this.jar.files["resource_pack/texts/language_names.json"].content if (!content) { content = fs.readFileSync(this.jar.files["resource_pack/texts/language_names.json"].path) this.jar.files["resource_pack/texts/language_names.json"].content = content } const data = JSON.parse(content) const id = PathModule.basename(file, PathModule.extname(file)) const lang = data.find(e => e[0] === id) if (lang) { return lang[1] } } } switch (file) { case "lang": return "Language Files" case "gui": case "ui": return "User Interface" case "equipment": return "Equipment" case "fish": return "Fish" case "sheep": return "Sheep" case "wolf": return "Wolves" case "hud": return "Heads Up Display" case "documentation": return "Documentation" case "metadata": return "Metadata" case "manifest.json": return "Pack Metadata" case "misc": return "Miscellaneous" case "ambient": return "Ambient" case "fire": return "Fire" case "music": return "Music" case "game": return "Game" case "menu": return "Menu" } switch (ext) { case "png": return "Texture" case "jpg": return "Texture" case "tga": return "Texture" case "mcmeta": return "Texture Metadata" case "json": return "JSON File" case "txt": return "Text File" case "properties": return "Properties File" case "lang": return "Language File" case "ogg": case "fsb": return "Sound File" case "vsh": return "Vertex Shader" case "fsh": return "Fragment Shader" case "glsl": return "Shader" case "icns": return "Icon" } if (typeof value === "object") { let label = titleCase(file) if (!label.endsWith("s")) { label += "s" } label = label.replaceAll("Json", "JSON") .replaceAll("Entitys", "Entities") .replaceAll("Bodys", "Bodies") return label } }, getImageDimensions(file) { const data = this.jar.files[file] if (data.image?.width) { return [data.image.width, data.image.height] } }, changeSort(type) { if (this.sort === type) { this.sortDirection = this.sortDirection === "forwards" ? "backwards" : "forwards" } else { this.sort = type this.sortDirection = "forwards" } this.$refs.files.$el.scrollTop = 0 }, openSearch() { this.searchOpen = !this.searchOpen this.makeSearch() if (this.searchOpen) { setTimeout(() => { this.$refs.browserSearch.focus() }, 0) } }, makeSearch() { clearTimeout(this.searchTimeout) this.searchTimeout = setTimeout(() => { const searchText = this.searchOpen ? this.searchText.trim().toLowerCase() : "" const prev = this.navigationHistory[this.navigationHistory.length - 1] if (searchText) { if (!Array.isArray(prev) && prev.search === searchText) return this.navigationHistory.push({ search: searchText, path: this.path.slice() }) } else { if (Array.isArray(prev) && prev.join("/") === this.path.join("/")) return this.navigationHistory.push(this.path.slice()) } this.navigationFuture = [] }, 1000) }, truncate(file) { if (this.displayType === "grid" && file.length > 32) { if (this.searchOpen && this.searchText) { file = "…" + file.slice(-31) } else { file = file.slice(0, 31) + "…" } } return file.replace(/(_|\.|\/)/g, '$1​') }, changeMode(mode) { this.mode = mode if (this.objects && mode === "compare") { loadedJars = {} } }, openSavedFolder(folder) { if (this.mode === "assets" || !this.path.length) { this.openFolder(folder) } else { this.openFolder([this.path[0], ...folder]) } }, textureComparison(file) { const red = [238, 85, 102, 255] const green = [84, 255, 135, 255] const blue = [85, 136, 255, 255] const width = Math.max(file.oldFile.image.width, file.image.width) const height = Math.max(file.oldFile.image.height, file.image.height) const buff = new Uint8ClampedArray(width * height * 4) const w1 = file.oldFile.image.width const w2 = file.image.width const h1 = file.oldFile.image.height const h2 = file.image.height const length = width * height * 4 const tolerance = 0 for (let i = 0; i < length; i += 4) { const x = i / 4 % width const y = Math.floor(i / 4 / width) if (x >= w1 && y >= h2 || x >= w2 && y >= h1) continue else if (x >= w2 && x <= w1 || y >= h2 && y <= h1) { const a = Math.floor((x + y) % 8 / 4) const b = Math.lerp(0.7, 1, a) buff.set([red[0] * b, red[1] * b, red[2] * b, red[3]], i) } else if (y >= h1 && y <= h2 || x >= w1 && x <= w2) { const a = Math.floor((x + y) % 8 / 4) const b = Math.lerp(0.7, 1, a) buff.set([green[0] * b, green[1] * b, green[2] * b, green[3]], i) } else { const i1 = (x + y * w1) * 4 const i2 = (x + y * w2) * 4 if (Math.max(Math.abs(file.oldFile.pixels[i1] - file.pixels[i2]), Math.abs(file.oldFile.pixels[i1 + 1] - file.pixels[i2 + 1]), Math.abs(file.oldFile.pixels[i1 + 2] - file.pixels[i2 + 2]), Math.abs(file.oldFile.pixels[i1 + 3] - file.pixels[i2 + 3])) < tolerance) { buff.set(pixels.slice(i1, i1 + 3), i) buff[i + 3] = file.oldFile.pixels[i1 + 3] / 4 } else if (file.oldFile.pixels[i1 + 3] === 0 && file.pixels[i2 + 3] !== 0) buff.set(green, i) else if (file.oldFile.pixels[i1 + 3] !== 0 && file.pixels[i2 + 3] === 0) buff.set(red, i) else if (file.oldFile.pixels[i1] === file.pixels[i2] && file.oldFile.pixels[i1 + 1] === file.pixels[i2 + 1] && file.oldFile.pixels[i1 + 2] === file.pixels[i2 + 2] && file.oldFile.pixels[i1 + 3] === file.pixels[i2 + 3]) { buff.set(file.oldFile.pixels.slice(i1, i1 + 3), i) buff[i + 3] = file.oldFile.pixels[i1 + 3] / 4 } else buff.set(blue, i) } } new Dialog({ id: id + "_texture_comparison", title: `${this.compareVersion} vs ${this.version} - ${file.path}`, width: 816, buttons: [], lines: [` ================================================ FILE: plugins/azurelib_utils/azurelib_utils.js ================================================ /*! For license information please see azurelib_utils.js.LICENSE.txt */ (()=>{var t={2:(t,e,n)=>{var r=n(2199),i=n(4664),o=n(5950);t.exports=function(t){return r(t,o,i)}},79:(t,e,n)=>{var r=n(3702),i=n(80),o=n(4739),a=n(8655),u=n(1175);function s(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(6025),i=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0||(n==e.length-1?e.pop():i.call(e,n,1),--this.size,0))}},104:(t,e,n)=>{var r=n(3661);function i(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(i.Cache||r),n}i.Cache=r,t.exports=i},144:(t,e,n)=>{const r=n(3908);t.exports=(t,e,n=!1)=>{if(t instanceof r)return t;try{return new r(t,e)}catch(t){if(!n)return null;throw t}}},179:(t,e,n)=>{var r=n(4932),i=n(9999),o=n(9931),a=n(1769),u=n(1791),s=n(3138),c=n(8816),l=n(3349),f=c(function(t,e){var n={};if(null==t)return n;var c=!1;e=r(e,function(e){return e=a(e,t),c||(c=e.length>1),e}),u(t,l(t),n),c&&(n=i(n,7,s));for(var f=e.length;f--;)o(n,e[f]);return n});t.exports=f},181:t=>{t.exports=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}},259:t=>{"use strict";t.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let t=this.head;t;t=t.next)yield t.value}}},289:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).get(t)}},294:t=>{t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},346:t=>{t.exports=function(t){return null!=t&&"object"==typeof t}},361:t=>{var e=/^(?:0|[1-9]\d*)$/;t.exports=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&e.test(t))&&t>-1&&t%1==0&&t{t.exports=function(t,e){return null==t?void 0:t[e]}},560:(t,e,n)=>{const r=n(3908);t.exports=(t,e,n)=>new r(t,n).compare(new r(e,n))},659:(t,e,n)=>{var r=n(1873),i=Object.prototype,o=i.hasOwnProperty,a=i.toString,u=r?r.toStringTag:void 0;t.exports=function(t){var e=o.call(t,u),n=t[u];try{t[u]=void 0;var r=!0}catch(t){}var i=a.call(t);return r&&(e?t[u]=n:delete t[u]),i}},695:(t,e,n)=>{var r=n(8096),i=n(2428),o=n(6449),a=n(3656),u=n(361),s=n(7167),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=o(t),l=!n&&i(t),f=!n&&!l&&a(t),p=!n&&!l&&!f&&s(t),h=n||l||f||p,d=h?r(t.length,String):[],v=d.length;for(var g in t)!e&&!c.call(t,g)||h&&("length"==g||f&&("offset"==g||"parent"==g)||p&&("buffer"==g||"byteLength"==g||"byteOffset"==g)||u(g,v))||d.push(g);return d}},938:t=>{t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},945:(t,e,n)=>{var r=n(79),i=n(8223),o=n(3661);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!i||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new o(a)}return n.set(t,e),this.size=n.size,this}},1033:t=>{t.exports=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}},1042:(t,e,n)=>{var r=n(6110)(Object,"create");t.exports=r},1123:t=>{const e=/^[0-9]+$/,n=(t,n)=>{const r=e.test(t),i=e.test(n);return r&&i&&(t=+t,n=+n),t===n?0:r&&!i?-1:i&&!r?1:tn(e,t)}},1175:(t,e,n)=>{var r=n(6025);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},1331:(t,e,n)=>{var r=n(2552),i=n(8879),o=n(346),a=Function.prototype,u=Object.prototype,s=a.toString,c=u.hasOwnProperty,l=s.call(Object);t.exports=function(t){if(!o(t)||"[object Object]"!=r(t))return!1;var e=i(t);if(null===e)return!0;var n=c.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&s.call(n)==l}},1420:(t,e,n)=>{var r=n(79);t.exports=function(){this.__data__=new r,this.size=0}},1549:(t,e,n)=>{var r=n(2032),i=n(3862),o=n(6721),a=n(2749),u=n(5749);function s(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(6449),i=n(8586),o=n(1802),a=n(3222);t.exports=function(t,e){return r(t)?t:i(t,e)?[t]:o(a(t))}},1791:(t,e,n)=>{var r=n(6547),i=n(3360);t.exports=function(t,e,n,o){var a=!n;n||(n={});for(var u=-1,s=e.length;++u{var r=n(2224),i=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,a=r(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(i,function(t,n,r,i){e.push(r?i.replace(o,"$1"):n||t)}),e});t.exports=a},1811:t=>{var e=Date.now;t.exports=function(t){var n=0,r=0;return function(){var i=e(),o=16-(i-r);if(r=i,o>0){if(++n>=800)return arguments[0]}else n=0;return t.apply(void 0,arguments)}}},1873:(t,e,n)=>{var r=n(9325).Symbol;t.exports=r},1882:(t,e,n)=>{var r=n(2552),i=n(3805);t.exports=function(t){if(!i(t))return!1;var e=r(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1961:(t,e,n)=>{var r=n(9653);t.exports=function(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}},2032:(t,e,n)=>{var r=n(1042);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},2111:(t,e,n)=>{const r=n(4641),i=n(3999),o=n(5580),a=n(4089),u=n(7059),s=n(5200);t.exports=(t,e,n,c)=>{switch(e){case"===":return"object"==typeof t&&(t=t.version),"object"==typeof n&&(n=n.version),t===n;case"!==":return"object"==typeof t&&(t=t.version),"object"==typeof n&&(n=n.version),t!==n;case"":case"=":case"==":return r(t,n,c);case"!=":return i(t,n,c);case">":return o(t,n,c);case">=":return a(t,n,c);case"<":return u(t,n,c);case"<=":return s(t,n,c);default:throw new TypeError(`Invalid operator: ${e}`)}}},2199:(t,e,n)=>{var r=n(4528),i=n(6449);t.exports=function(t,e,n){var o=e(t);return i(t)?o:r(o,n(t))}},2224:(t,e,n)=>{var r=n(104);t.exports=function(t){var e=r(t,function(t){return 500===n.size&&n.clear(),t}),n=e.cache;return e}},2271:(t,e,n)=>{var r=n(1791),i=n(4664);t.exports=function(t,e){return r(t,i(t),e)}},2428:(t,e,n)=>{var r=n(7534),i=n(346),o=Object.prototype,a=o.hasOwnProperty,u=o.propertyIsEnumerable,s=r(function(){return arguments}())?r:function(t){return i(t)&&a.call(t,"callee")&&!u.call(t,"callee")};t.exports=s},2543:function(t,e,n){var r;t=n.nmd(t),function(){var i,o="Expected a function",a="__lodash_hash_undefined__",u="__lodash_placeholder__",s=32,c=128,l=1/0,f=9007199254740991,p=NaN,h=4294967295,d=[["ary",c],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",s],["partialRight",64],["rearg",256]],v="[object Arguments]",g="[object Array]",m="[object Boolean]",y="[object Date]",_="[object Error]",b="[object Function]",x="[object GeneratorFunction]",A="[object Map]",w="[object Number]",E="[object Object]",j="[object Promise]",O="[object RegExp]",I="[object Set]",$="[object String]",k="[object Symbol]",R="[object WeakMap]",L="[object ArrayBuffer]",N="[object DataView]",z="[object Float32Array]",S="[object Float64Array]",T="[object Int8Array]",C="[object Int16Array]",B="[object Int32Array]",M="[object Uint8Array]",P="[object Uint8ClampedArray]",F="[object Uint16Array]",D="[object Uint32Array]",U=/\b__p \+= '';/g,G=/\b(__p \+=) '' \+/g,W=/(__e\(.*?\)|\b__t\)) \+\n'';/g,K=/&(?:amp|lt|gt|quot|#39);/g,X=/[&<>"']/g,q=RegExp(K.source),V=RegExp(X.source),H=/<%-([\s\S]+?)%>/g,J=/<%([\s\S]+?)%>/g,Z=/<%=([\s\S]+?)%>/g,Q=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Y=/^\w*$/,tt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,et=/[\\^$.*+?()[\]{}|]/g,nt=RegExp(et.source),rt=/^\s+/,it=/\s/,ot=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,at=/\{\n\/\* \[wrapped with (.+)\] \*/,ut=/,? & /,st=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ct=/[()=,{}\[\]\/\s]/,lt=/\\(\\)?/g,ft=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,pt=/\w*$/,ht=/^[-+]0x[0-9a-f]+$/i,dt=/^0b[01]+$/i,vt=/^\[object .+?Constructor\]$/,gt=/^0o[0-7]+$/i,mt=/^(?:0|[1-9]\d*)$/,yt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,_t=/($^)/,bt=/['\n\r\u2028\u2029\\]/g,xt="\\ud800-\\udfff",At="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",wt="\\u2700-\\u27bf",Et="a-z\\xdf-\\xf6\\xf8-\\xff",jt="A-Z\\xc0-\\xd6\\xd8-\\xde",Ot="\\ufe0e\\ufe0f",It="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",$t="["+xt+"]",kt="["+It+"]",Rt="["+At+"]",Lt="\\d+",Nt="["+wt+"]",zt="["+Et+"]",St="[^"+xt+It+Lt+wt+Et+jt+"]",Tt="\\ud83c[\\udffb-\\udfff]",Ct="[^"+xt+"]",Bt="(?:\\ud83c[\\udde6-\\uddff]){2}",Mt="[\\ud800-\\udbff][\\udc00-\\udfff]",Pt="["+jt+"]",Ft="\\u200d",Dt="(?:"+zt+"|"+St+")",Ut="(?:"+Pt+"|"+St+")",Gt="(?:['’](?:d|ll|m|re|s|t|ve))?",Wt="(?:['’](?:D|LL|M|RE|S|T|VE))?",Kt="(?:"+Rt+"|"+Tt+")?",Xt="["+Ot+"]?",qt=Xt+Kt+"(?:"+Ft+"(?:"+[Ct,Bt,Mt].join("|")+")"+Xt+Kt+")*",Vt="(?:"+[Nt,Bt,Mt].join("|")+")"+qt,Ht="(?:"+[Ct+Rt+"?",Rt,Bt,Mt,$t].join("|")+")",Jt=RegExp("['’]","g"),Zt=RegExp(Rt,"g"),Qt=RegExp(Tt+"(?="+Tt+")|"+Ht+qt,"g"),Yt=RegExp([Pt+"?"+zt+"+"+Gt+"(?="+[kt,Pt,"$"].join("|")+")",Ut+"+"+Wt+"(?="+[kt,Pt+Dt,"$"].join("|")+")",Pt+"?"+Dt+"+"+Gt,Pt+"+"+Wt,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Lt,Vt].join("|"),"g"),te=RegExp("["+Ft+xt+At+Ot+"]"),ee=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ne=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],re=-1,ie={};ie[z]=ie[S]=ie[T]=ie[C]=ie[B]=ie[M]=ie[P]=ie[F]=ie[D]=!0,ie[v]=ie[g]=ie[L]=ie[m]=ie[N]=ie[y]=ie[_]=ie[b]=ie[A]=ie[w]=ie[E]=ie[O]=ie[I]=ie[$]=ie[R]=!1;var oe={};oe[v]=oe[g]=oe[L]=oe[N]=oe[m]=oe[y]=oe[z]=oe[S]=oe[T]=oe[C]=oe[B]=oe[A]=oe[w]=oe[E]=oe[O]=oe[I]=oe[$]=oe[k]=oe[M]=oe[P]=oe[F]=oe[D]=!0,oe[_]=oe[b]=oe[R]=!1;var ae={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ue=parseFloat,se=parseInt,ce="object"==typeof global&&global&&global.Object===Object&&global,le="object"==typeof self&&self&&self.Object===Object&&self,fe=ce||le||Function("return this")(),pe=e&&!e.nodeType&&e,he=pe&&t&&!t.nodeType&&t,de=he&&he.exports===pe,ve=de&&ce.process,ge=function(){try{return he&&he.require&&he.require("util").types||ve&&ve.binding&&ve.binding("util")}catch(t){}}(),me=ge&&ge.isArrayBuffer,ye=ge&&ge.isDate,_e=ge&&ge.isMap,be=ge&&ge.isRegExp,xe=ge&&ge.isSet,Ae=ge&&ge.isTypedArray;function we(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function Ee(t,e,n,r){for(var i=-1,o=null==t?0:t.length;++i-1}function Re(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function Ye(t,e){for(var n=t.length;n--&&Pe(e,t[n],0)>-1;);return n}var tn=We({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"}),en=We({"&":"&","<":"<",">":">",'"':""","'":"'"});function nn(t){return"\\"+ae[t]}function rn(t){return te.test(t)}function on(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function an(t,e){return function(n){return t(e(n))}}function un(t,e){for(var n=-1,r=t.length,i=0,o=[];++n",""":'"',"'":"'"}),dn=function t(e){var n,r=(e=null==e?fe:dn.defaults(fe.Object(),e,dn.pick(fe,ne))).Array,it=e.Date,xt=e.Error,At=e.Function,wt=e.Math,Et=e.Object,jt=e.RegExp,Ot=e.String,It=e.TypeError,$t=r.prototype,kt=At.prototype,Rt=Et.prototype,Lt=e["__core-js_shared__"],Nt=kt.toString,zt=Rt.hasOwnProperty,St=0,Tt=(n=/[^.]+$/.exec(Lt&&Lt.keys&&Lt.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ct=Rt.toString,Bt=Nt.call(Et),Mt=fe._,Pt=jt("^"+Nt.call(zt).replace(et,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ft=de?e.Buffer:i,Dt=e.Symbol,Ut=e.Uint8Array,Gt=Ft?Ft.allocUnsafe:i,Wt=an(Et.getPrototypeOf,Et),Kt=Et.create,Xt=Rt.propertyIsEnumerable,qt=$t.splice,Vt=Dt?Dt.isConcatSpreadable:i,Ht=Dt?Dt.iterator:i,Qt=Dt?Dt.toStringTag:i,te=function(){try{var t=so(Et,"defineProperty");return t({},"",{}),t}catch(t){}}(),ae=e.clearTimeout!==fe.clearTimeout&&e.clearTimeout,ce=it&&it.now!==fe.Date.now&&it.now,le=e.setTimeout!==fe.setTimeout&&e.setTimeout,pe=wt.ceil,he=wt.floor,ve=Et.getOwnPropertySymbols,ge=Ft?Ft.isBuffer:i,Ce=e.isFinite,We=$t.join,vn=an(Et.keys,Et),gn=wt.max,mn=wt.min,yn=it.now,_n=e.parseInt,bn=wt.random,xn=$t.reverse,An=so(e,"DataView"),wn=so(e,"Map"),En=so(e,"Promise"),jn=so(e,"Set"),On=so(e,"WeakMap"),In=so(Et,"create"),$n=On&&new On,kn={},Rn=Bo(An),Ln=Bo(wn),Nn=Bo(En),zn=Bo(jn),Sn=Bo(On),Tn=Dt?Dt.prototype:i,Cn=Tn?Tn.valueOf:i,Bn=Tn?Tn.toString:i;function Mn(t){if(tu(t)&&!Ga(t)&&!(t instanceof Un)){if(t instanceof Dn)return t;if(zt.call(t,"__wrapped__"))return Mo(t)}return new Dn(t)}var Pn=function(){function t(){}return function(e){if(!Ya(e))return{};if(Kt)return Kt(e);t.prototype=e;var n=new t;return t.prototype=i,n}}();function Fn(){}function Dn(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=i}function Un(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=h,this.__views__=[]}function Gn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function ar(t,e,n,r,o,a){var u,s=1&e,c=2&e,l=4&e;if(n&&(u=o?n(t,r,o,a):n(t)),u!==i)return u;if(!Ya(t))return t;var f=Ga(t);if(f){if(u=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&zt.call(t,"index")&&(n.index=t.index,n.input=t.input),n}(t),!s)return Oi(t,u)}else{var p=fo(t),h=p==b||p==x;if(qa(t))return bi(t,s);if(p==E||p==v||h&&!o){if(u=c||h?{}:ho(t),!s)return c?function(t,e){return Ii(t,lo(t),e)}(t,function(t,e){return t&&Ii(e,Lu(e),t)}(u,t)):function(t,e){return Ii(t,co(t),e)}(t,nr(u,t))}else{if(!oe[p])return o?t:{};u=function(t,e,n){var r,i=t.constructor;switch(e){case L:return xi(t);case m:case y:return new i(+t);case N:return function(t,e){var n=e?xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case z:case S:case T:case C:case B:case M:case P:case F:case D:return Ai(t,n);case A:return new i;case w:case $:return new i(t);case O:return function(t){var e=new t.constructor(t.source,pt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case I:return new i;case k:return r=t,Cn?Et(Cn.call(r)):{}}}(t,p,s)}}a||(a=new qn);var d=a.get(t);if(d)return d;a.set(t,u),ou(t)?t.forEach(function(r){u.add(ar(r,e,n,r,t,a))}):eu(t)&&t.forEach(function(r,i){u.set(i,ar(r,e,n,i,t,a))});var g=f?i:(l?c?eo:to:c?Lu:Ru)(t);return je(g||t,function(r,i){g&&(r=t[i=r]),Yn(u,i,ar(r,e,n,i,t,a))}),u}function ur(t,e,n){var r=n.length;if(null==t)return!r;for(t=Et(t);r--;){var o=n[r],a=e[o],u=t[o];if(u===i&&!(o in t)||!a(u))return!1}return!0}function sr(t,e,n){if("function"!=typeof t)throw new It(o);return $o(function(){t.apply(i,n)},e)}function cr(t,e,n,r){var i=-1,o=ke,a=!0,u=t.length,s=[],c=e.length;if(!u)return s;n&&(e=Le(e,He(n))),r?(o=Re,a=!1):e.length>=200&&(o=Ze,a=!1,e=new Xn(e));t:for(;++i-1},Wn.prototype.set=function(t,e){var n=this.__data__,r=tr(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Kn.prototype.clear=function(){this.size=0,this.__data__={hash:new Gn,map:new(wn||Wn),string:new Gn}},Kn.prototype.delete=function(t){var e=ao(this,t).delete(t);return this.size-=e?1:0,e},Kn.prototype.get=function(t){return ao(this,t).get(t)},Kn.prototype.has=function(t){return ao(this,t).has(t)},Kn.prototype.set=function(t,e){var n=ao(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Xn.prototype.add=Xn.prototype.push=function(t){return this.__data__.set(t,a),this},Xn.prototype.has=function(t){return this.__data__.has(t)},qn.prototype.clear=function(){this.__data__=new Wn,this.size=0},qn.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},qn.prototype.get=function(t){return this.__data__.get(t)},qn.prototype.has=function(t){return this.__data__.has(t)},qn.prototype.set=function(t,e){var n=this.__data__;if(n instanceof Wn){var r=n.__data__;if(!wn||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new Kn(r)}return n.set(t,e),this.size=n.size,this};var lr=Ri(yr),fr=Ri(_r,!0);function pr(t,e){var n=!0;return lr(t,function(t,r,i){return n=!!e(t,r,i)}),n}function hr(t,e,n){for(var r=-1,o=t.length;++r0&&n(u)?e>1?vr(u,e-1,n,r,i):Ne(i,u):r||(i[i.length]=u)}return i}var gr=Li(),mr=Li(!0);function yr(t,e){return t&&gr(t,e,Ru)}function _r(t,e){return t&&mr(t,e,Ru)}function br(t,e){return $e(e,function(e){return Ja(t[e])})}function xr(t,e){for(var n=0,r=(e=gi(e,t)).length;null!=t&&ne}function jr(t,e){return null!=t&&zt.call(t,e)}function Or(t,e){return null!=t&&e in Et(t)}function Ir(t,e,n){for(var o=n?Re:ke,a=t[0].length,u=t.length,s=u,c=r(u),l=1/0,f=[];s--;){var p=t[s];s&&e&&(p=Le(p,He(e))),l=mn(p.length,l),c[s]=!n&&(e||a>=120&&p.length>=120)?new Xn(s&&p):i}p=t[0];var h=-1,d=c[0];t:for(;++h=u?s:s*("desc"==n[r]?-1:1)}return t.index-e.index}(t,e,n)});e--;)t[e]=t[e].value;return t}(i)}function Ur(t,e,n){for(var r=-1,i=e.length,o={};++r-1;)u!==t&&qt.call(u,s,1),qt.call(t,s,1);return t}function Wr(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==o){var o=i;go(i)?qt.call(t,i,1):si(t,i)}}return t}function Kr(t,e){return t+he(bn()*(e-t+1))}function Xr(t,e){var n="";if(!t||e<1||e>f)return n;do{e%2&&(n+=t),(e=he(e/2))&&(t+=t)}while(e);return n}function qr(t,e){return ko(Eo(t,e,ns),t+"")}function Vr(t){return Hn(Pu(t))}function Hr(t,e){var n=Pu(t);return No(n,or(e,0,n.length))}function Jr(t,e,n,r){if(!Ya(t))return t;for(var o=-1,a=(e=gi(e,t)).length,u=a-1,s=t;null!=s&&++oo?0:o+e),(n=n>o?o:n)<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var a=r(o);++i>>1,a=t[o];null!==a&&!uu(a)&&(n?a<=e:a=200){var c=e?null:Xi(t);if(c)return sn(c);a=!1,i=Ze,s=new Xn}else s=e?[]:u;t:for(;++r=r?t:ti(t,e,n)}var _i=ae||function(t){return fe.clearTimeout(t)};function bi(t,e){if(e)return t.slice();var n=t.length,r=Gt?Gt(n):new t.constructor(n);return t.copy(r),r}function xi(t){var e=new t.constructor(t.byteLength);return new Ut(e).set(new Ut(t)),e}function Ai(t,e){var n=e?xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function wi(t,e){if(t!==e){var n=t!==i,r=null===t,o=t==t,a=uu(t),u=e!==i,s=null===e,c=e==e,l=uu(e);if(!s&&!l&&!a&&t>e||a&&u&&c&&!s&&!l||r&&u&&c||!n&&c||!o)return 1;if(!r&&!a&&!l&&t1?n[o-1]:i,u=o>2?n[2]:i;for(a=t.length>3&&"function"==typeof a?(o--,a):i,u&&mo(n[0],n[1],u)&&(a=o<3?i:a,o=1),e=Et(e);++r-1?o[a?e[u]:u]:i}}function Ci(t){return Yi(function(e){var n=e.length,r=n,a=Dn.prototype.thru;for(t&&e.reverse();r--;){var u=e[r];if("function"!=typeof u)throw new It(o);if(a&&!s&&"wrapper"==ro(u))var s=new Dn([],!0)}for(r=s?r:n;++r1&&b.reverse(),h&&f<_&&(b.length=f),this&&this!==fe&&this instanceof c&&(O=y||Si(O)),O.apply(j,b)}}function Mi(t,e){return function(n,r){return function(t,e,n,r){return yr(t,function(t,i,o){e(r,n(t),i,o)}),r}(n,t,e(r),{})}}function Pi(t,e){return function(n,r){var o;if(n===i&&r===i)return e;if(n!==i&&(o=n),r!==i){if(o===i)return r;"string"==typeof n||"string"==typeof r?(n=ai(n),r=ai(r)):(n=oi(n),r=oi(r)),o=t(n,r)}return o}}function Fi(t){return Yi(function(e){return e=Le(e,He(oo())),qr(function(n){var r=this;return t(e,function(t){return we(t,r,n)})})})}function Di(t,e){var n=(e=e===i?" ":ai(e)).length;if(n<2)return n?Xr(e,t):e;var r=Xr(e,pe(t/ln(e)));return rn(e)?yi(fn(r),0,t).join(""):r.slice(0,t)}function Ui(t){return function(e,n,o){return o&&"number"!=typeof o&&mo(e,n,o)&&(n=o=i),e=pu(e),n===i?(n=e,e=0):n=pu(n),function(t,e,n,i){for(var o=-1,a=gn(pe((e-t)/(n||1)),0),u=r(a);a--;)u[i?a:++o]=t,t+=n;return u}(e,n,o=o===i?es))return!1;var l=a.get(t),f=a.get(e);if(l&&f)return l==e&&f==t;var p=-1,h=!0,d=2&n?new Xn:i;for(a.set(t,e),a.set(e,t);++p-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(ot,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return je(d,function(n){var r="_."+n[0];e&n[1]&&!ke(t,r)&&t.push(r)}),t.sort()}(function(t){var e=t.match(at);return e?e[1].split(ut):[]}(r),n)))}function Lo(t){var e=0,n=0;return function(){var r=yn(),o=16-(r-n);if(n=r,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(i,arguments)}}function No(t,e){var n=-1,r=t.length,o=r-1;for(e=e===i?r:e;++n1?t[e-1]:i;return n="function"==typeof n?(t.pop(),n):i,ia(t,n)});function fa(t){var e=Mn(t);return e.__chain__=!0,e}function pa(t,e){return e(t)}var ha=Yi(function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,o=function(e){return ir(e,t)};return!(e>1||this.__actions__.length)&&r instanceof Un&&go(n)?((r=r.slice(n,+n+(e?1:0))).__actions__.push({func:pa,args:[o],thisArg:i}),new Dn(r,this.__chain__).thru(function(t){return e&&!t.length&&t.push(i),t})):this.thru(o)}),da=$i(function(t,e,n){zt.call(t,n)?++t[n]:rr(t,n,1)}),va=Ti(Uo),ga=Ti(Go);function ma(t,e){return(Ga(t)?je:lr)(t,oo(e,3))}function ya(t,e){return(Ga(t)?Oe:fr)(t,oo(e,3))}var _a=$i(function(t,e,n){zt.call(t,n)?t[n].push(e):rr(t,n,[e])}),ba=qr(function(t,e,n){var i=-1,o="function"==typeof e,a=Ka(t)?r(t.length):[];return lr(t,function(t){a[++i]=o?we(e,t,n):$r(t,e,n)}),a}),xa=$i(function(t,e,n){rr(t,n,e)});function Aa(t,e){return(Ga(t)?Le:Cr)(t,oo(e,3))}var wa=$i(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]}),Ea=qr(function(t,e){if(null==t)return[];var n=e.length;return n>1&&mo(t,e[0],e[1])?e=[]:n>2&&mo(e[0],e[1],e[2])&&(e=[e[0]]),Dr(t,vr(e,1),[])}),ja=ce||function(){return fe.Date.now()};function Oa(t,e,n){return e=n?i:e,e=t&&null==e?t.length:e,Vi(t,c,i,i,i,i,e)}function Ia(t,e){var n;if("function"!=typeof e)throw new It(o);return t=hu(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=i),n}}var $a=qr(function(t,e,n){var r=1;if(n.length){var i=un(n,io($a));r|=s}return Vi(t,r,e,n,i)}),ka=qr(function(t,e,n){var r=3;if(n.length){var i=un(n,io(ka));r|=s}return Vi(e,r,t,n,i)});function Ra(t,e,n){var r,a,u,s,c,l,f=0,p=!1,h=!1,d=!0;if("function"!=typeof t)throw new It(o);function v(e){var n=r,o=a;return r=a=i,f=e,s=t.apply(o,n)}function g(t){var n=t-l;return l===i||n>=e||n<0||h&&t-f>=u}function m(){var t=ja();if(g(t))return y(t);c=$o(m,function(t){var n=e-(t-l);return h?mn(n,u-(t-f)):n}(t))}function y(t){return c=i,d&&r?v(t):(r=a=i,s)}function _(){var t=ja(),n=g(t);if(r=arguments,a=this,l=t,n){if(c===i)return function(t){return f=t,c=$o(m,e),p?v(t):s}(l);if(h)return _i(c),c=$o(m,e),v(l)}return c===i&&(c=$o(m,e)),s}return e=vu(e)||0,Ya(n)&&(p=!!n.leading,u=(h="maxWait"in n)?gn(vu(n.maxWait)||0,e):u,d="trailing"in n?!!n.trailing:d),_.cancel=function(){c!==i&&_i(c),f=0,r=l=a=c=i},_.flush=function(){return c===i?s:y(ja())},_}var La=qr(function(t,e){return sr(t,1,e)}),Na=qr(function(t,e,n){return sr(t,vu(e)||0,n)});function za(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new It(o);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(za.Cache||Kn),n}function Sa(t){if("function"!=typeof t)throw new It(o);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}za.Cache=Kn;var Ta=mi(function(t,e){var n=(e=1==e.length&&Ga(e[0])?Le(e[0],He(oo())):Le(vr(e,1),He(oo()))).length;return qr(function(r){for(var i=-1,o=mn(r.length,n);++i=e}),Ua=kr(function(){return arguments}())?kr:function(t){return tu(t)&&zt.call(t,"callee")&&!Xt.call(t,"callee")},Ga=r.isArray,Wa=me?He(me):function(t){return tu(t)&&wr(t)==L};function Ka(t){return null!=t&&Qa(t.length)&&!Ja(t)}function Xa(t){return tu(t)&&Ka(t)}var qa=ge||vs,Va=ye?He(ye):function(t){return tu(t)&&wr(t)==y};function Ha(t){if(!tu(t))return!1;var e=wr(t);return e==_||"[object DOMException]"==e||"string"==typeof t.message&&"string"==typeof t.name&&!ru(t)}function Ja(t){if(!Ya(t))return!1;var e=wr(t);return e==b||e==x||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Za(t){return"number"==typeof t&&t==hu(t)}function Qa(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=f}function Ya(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function tu(t){return null!=t&&"object"==typeof t}var eu=_e?He(_e):function(t){return tu(t)&&fo(t)==A};function nu(t){return"number"==typeof t||tu(t)&&wr(t)==w}function ru(t){if(!tu(t)||wr(t)!=E)return!1;var e=Wt(t);if(null===e)return!0;var n=zt.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&Nt.call(n)==Bt}var iu=be?He(be):function(t){return tu(t)&&wr(t)==O},ou=xe?He(xe):function(t){return tu(t)&&fo(t)==I};function au(t){return"string"==typeof t||!Ga(t)&&tu(t)&&wr(t)==$}function uu(t){return"symbol"==typeof t||tu(t)&&wr(t)==k}var su=Ae?He(Ae):function(t){return tu(t)&&Qa(t.length)&&!!ie[wr(t)]},cu=Gi(Tr),lu=Gi(function(t,e){return t<=e});function fu(t){if(!t)return[];if(Ka(t))return au(t)?fn(t):Oi(t);if(Ht&&t[Ht])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[Ht]());var e=fo(t);return(e==A?on:e==I?sn:Pu)(t)}function pu(t){return t?(t=vu(t))===l||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function hu(t){var e=pu(t),n=e%1;return e==e?n?e-n:e:0}function du(t){return t?or(hu(t),0,h):0}function vu(t){if("number"==typeof t)return t;if(uu(t))return p;if(Ya(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Ya(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=Ve(t);var n=dt.test(t);return n||gt.test(t)?se(t.slice(2),n?2:8):ht.test(t)?p:+t}function gu(t){return Ii(t,Lu(t))}function mu(t){return null==t?"":ai(t)}var yu=ki(function(t,e){if(xo(e)||Ka(e))Ii(e,Ru(e),t);else for(var n in e)zt.call(e,n)&&Yn(t,n,e[n])}),_u=ki(function(t,e){Ii(e,Lu(e),t)}),bu=ki(function(t,e,n,r){Ii(e,Lu(e),t,r)}),xu=ki(function(t,e,n,r){Ii(e,Ru(e),t,r)}),Au=Yi(ir),wu=qr(function(t,e){t=Et(t);var n=-1,r=e.length,o=r>2?e[2]:i;for(o&&mo(e[0],e[1],o)&&(r=1);++n1),e}),Ii(t,eo(t),n),r&&(n=ar(n,7,Zi));for(var i=e.length;i--;)si(n,e[i]);return n}),Tu=Yi(function(t,e){return null==t?{}:function(t,e){return Ur(t,e,function(e,n){return Ou(t,n)})}(t,e)});function Cu(t,e){if(null==t)return{};var n=Le(eo(t),function(t){return[t]});return e=oo(e),Ur(t,n,function(t,n){return e(t,n[0])})}var Bu=qi(Ru),Mu=qi(Lu);function Pu(t){return null==t?[]:Je(t,Ru(t))}var Fu=zi(function(t,e,n){return e=e.toLowerCase(),t+(n?Du(e):e)});function Du(t){return Hu(mu(t).toLowerCase())}function Uu(t){return(t=mu(t))&&t.replace(yt,tn).replace(Zt,"")}var Gu=zi(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),Wu=zi(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),Ku=Ni("toLowerCase"),Xu=zi(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}),qu=zi(function(t,e,n){return t+(n?" ":"")+Hu(e)}),Vu=zi(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),Hu=Ni("toUpperCase");function Ju(t,e,n){return t=mu(t),(e=n?i:e)===i?function(t){return ee.test(t)}(t)?function(t){return t.match(Yt)||[]}(t):function(t){return t.match(st)||[]}(t):t.match(e)||[]}var Zu=qr(function(t,e){try{return we(t,i,e)}catch(t){return Ha(t)?t:new xt(t)}}),Qu=Yi(function(t,e){return je(e,function(e){e=Co(e),rr(t,e,$a(t[e],t))}),t});function Yu(t){return function(){return t}}var ts=Ci(),es=Ci(!0);function ns(t){return t}function rs(t){return zr("function"==typeof t?t:ar(t,1))}var is=qr(function(t,e){return function(n){return $r(n,t,e)}}),os=qr(function(t,e){return function(n){return $r(t,n,e)}});function as(t,e,n){var r=Ru(e),i=br(e,r);null!=n||Ya(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=br(e,Ru(e)));var o=!(Ya(n)&&"chain"in n&&!n.chain),a=Ja(t);return je(i,function(n){var r=e[n];t[n]=r,a&&(t.prototype[n]=function(){var e=this.__chain__;if(o||e){var n=t(this.__wrapped__);return(n.__actions__=Oi(this.__actions__)).push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,Ne([this.value()],arguments))})}),t}function us(){}var ss=Fi(Le),cs=Fi(Ie),ls=Fi(Te);function fs(t){return yo(t)?Ge(Co(t)):function(t){return function(e){return xr(e,t)}}(t)}var ps=Ui(),hs=Ui(!0);function ds(){return[]}function vs(){return!1}var gs,ms=Pi(function(t,e){return t+e},0),ys=Ki("ceil"),_s=Pi(function(t,e){return t/e},1),bs=Ki("floor"),xs=Pi(function(t,e){return t*e},1),As=Ki("round"),ws=Pi(function(t,e){return t-e},0);return Mn.after=function(t,e){if("function"!=typeof e)throw new It(o);return t=hu(t),function(){if(--t<1)return e.apply(this,arguments)}},Mn.ary=Oa,Mn.assign=yu,Mn.assignIn=_u,Mn.assignInWith=bu,Mn.assignWith=xu,Mn.at=Au,Mn.before=Ia,Mn.bind=$a,Mn.bindAll=Qu,Mn.bindKey=ka,Mn.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Ga(t)?t:[t]},Mn.chain=fa,Mn.chunk=function(t,e,n){e=(n?mo(t,e,n):e===i)?1:gn(hu(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var a=0,u=0,s=r(pe(o/e));ao?0:o+n),(r=r===i||r>o?o:hu(r))<0&&(r+=o),r=n>r?0:du(r);n>>0)?(t=mu(t))&&("string"==typeof e||null!=e&&!iu(e))&&!(e=ai(e))&&rn(t)?yi(fn(t),0,n):t.split(e,n):[]},Mn.spread=function(t,e){if("function"!=typeof t)throw new It(o);return e=null==e?0:gn(hu(e),0),qr(function(n){var r=n[e],i=yi(n,0,e);return r&&Ne(i,r),we(t,this,i)})},Mn.tail=function(t){var e=null==t?0:t.length;return e?ti(t,1,e):[]},Mn.take=function(t,e,n){return t&&t.length?ti(t,0,(e=n||e===i?1:hu(e))<0?0:e):[]},Mn.takeRight=function(t,e,n){var r=null==t?0:t.length;return r?ti(t,(e=r-(e=n||e===i?1:hu(e)))<0?0:e,r):[]},Mn.takeRightWhile=function(t,e){return t&&t.length?li(t,oo(e,3),!1,!0):[]},Mn.takeWhile=function(t,e){return t&&t.length?li(t,oo(e,3)):[]},Mn.tap=function(t,e){return e(t),t},Mn.throttle=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new It(o);return Ya(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),Ra(t,e,{leading:r,maxWait:e,trailing:i})},Mn.thru=pa,Mn.toArray=fu,Mn.toPairs=Bu,Mn.toPairsIn=Mu,Mn.toPath=function(t){return Ga(t)?Le(t,Co):uu(t)?[t]:Oi(To(mu(t)))},Mn.toPlainObject=gu,Mn.transform=function(t,e,n){var r=Ga(t),i=r||qa(t)||su(t);if(e=oo(e,4),null==n){var o=t&&t.constructor;n=i?r?new o:[]:Ya(t)&&Ja(o)?Pn(Wt(t)):{}}return(i?je:yr)(t,function(t,r,i){return e(n,t,r,i)}),n},Mn.unary=function(t){return Oa(t,1)},Mn.union=ta,Mn.unionBy=ea,Mn.unionWith=na,Mn.uniq=function(t){return t&&t.length?ui(t):[]},Mn.uniqBy=function(t,e){return t&&t.length?ui(t,oo(e,2)):[]},Mn.uniqWith=function(t,e){return e="function"==typeof e?e:i,t&&t.length?ui(t,i,e):[]},Mn.unset=function(t,e){return null==t||si(t,e)},Mn.unzip=ra,Mn.unzipWith=ia,Mn.update=function(t,e,n){return null==t?t:ci(t,e,vi(n))},Mn.updateWith=function(t,e,n,r){return r="function"==typeof r?r:i,null==t?t:ci(t,e,vi(n),r)},Mn.values=Pu,Mn.valuesIn=function(t){return null==t?[]:Je(t,Lu(t))},Mn.without=oa,Mn.words=Ju,Mn.wrap=function(t,e){return Ca(vi(e),t)},Mn.xor=aa,Mn.xorBy=ua,Mn.xorWith=sa,Mn.zip=ca,Mn.zipObject=function(t,e){return hi(t||[],e||[],Yn)},Mn.zipObjectDeep=function(t,e){return hi(t||[],e||[],Jr)},Mn.zipWith=la,Mn.entries=Bu,Mn.entriesIn=Mu,Mn.extend=_u,Mn.extendWith=bu,as(Mn,Mn),Mn.add=ms,Mn.attempt=Zu,Mn.camelCase=Fu,Mn.capitalize=Du,Mn.ceil=ys,Mn.clamp=function(t,e,n){return n===i&&(n=e,e=i),n!==i&&(n=(n=vu(n))==n?n:0),e!==i&&(e=(e=vu(e))==e?e:0),or(vu(t),e,n)},Mn.clone=function(t){return ar(t,4)},Mn.cloneDeep=function(t){return ar(t,5)},Mn.cloneDeepWith=function(t,e){return ar(t,5,e="function"==typeof e?e:i)},Mn.cloneWith=function(t,e){return ar(t,4,e="function"==typeof e?e:i)},Mn.conformsTo=function(t,e){return null==e||ur(t,e,Ru(e))},Mn.deburr=Uu,Mn.defaultTo=function(t,e){return null==t||t!=t?e:t},Mn.divide=_s,Mn.endsWith=function(t,e,n){t=mu(t),e=ai(e);var r=t.length,o=n=n===i?r:or(hu(n),0,r);return(n-=e.length)>=0&&t.slice(n,o)==e},Mn.eq=Pa,Mn.escape=function(t){return(t=mu(t))&&V.test(t)?t.replace(X,en):t},Mn.escapeRegExp=function(t){return(t=mu(t))&&nt.test(t)?t.replace(et,"\\$&"):t},Mn.every=function(t,e,n){var r=Ga(t)?Ie:pr;return n&&mo(t,e,n)&&(e=i),r(t,oo(e,3))},Mn.find=va,Mn.findIndex=Uo,Mn.findKey=function(t,e){return Be(t,oo(e,3),yr)},Mn.findLast=ga,Mn.findLastIndex=Go,Mn.findLastKey=function(t,e){return Be(t,oo(e,3),_r)},Mn.floor=bs,Mn.forEach=ma,Mn.forEachRight=ya,Mn.forIn=function(t,e){return null==t?t:gr(t,oo(e,3),Lu)},Mn.forInRight=function(t,e){return null==t?t:mr(t,oo(e,3),Lu)},Mn.forOwn=function(t,e){return t&&yr(t,oo(e,3))},Mn.forOwnRight=function(t,e){return t&&_r(t,oo(e,3))},Mn.get=ju,Mn.gt=Fa,Mn.gte=Da,Mn.has=function(t,e){return null!=t&&po(t,e,jr)},Mn.hasIn=Ou,Mn.head=Ko,Mn.identity=ns,Mn.includes=function(t,e,n,r){t=Ka(t)?t:Pu(t),n=n&&!r?hu(n):0;var i=t.length;return n<0&&(n=gn(i+n,0)),au(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&Pe(t,e,n)>-1},Mn.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:hu(n);return i<0&&(i=gn(r+i,0)),Pe(t,e,i)},Mn.inRange=function(t,e,n){return e=pu(e),n===i?(n=e,e=0):n=pu(n),function(t,e,n){return t>=mn(e,n)&&t=-9007199254740991&&t<=f},Mn.isSet=ou,Mn.isString=au,Mn.isSymbol=uu,Mn.isTypedArray=su,Mn.isUndefined=function(t){return t===i},Mn.isWeakMap=function(t){return tu(t)&&fo(t)==R},Mn.isWeakSet=function(t){return tu(t)&&"[object WeakSet]"==wr(t)},Mn.join=function(t,e){return null==t?"":We.call(t,e)},Mn.kebabCase=Gu,Mn.last=Ho,Mn.lastIndexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=r;return n!==i&&(o=(o=hu(n))<0?gn(r+o,0):mn(o,r-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,o):Me(t,De,o,!0)},Mn.lowerCase=Wu,Mn.lowerFirst=Ku,Mn.lt=cu,Mn.lte=lu,Mn.max=function(t){return t&&t.length?hr(t,ns,Er):i},Mn.maxBy=function(t,e){return t&&t.length?hr(t,oo(e,2),Er):i},Mn.mean=function(t){return Ue(t,ns)},Mn.meanBy=function(t,e){return Ue(t,oo(e,2))},Mn.min=function(t){return t&&t.length?hr(t,ns,Tr):i},Mn.minBy=function(t,e){return t&&t.length?hr(t,oo(e,2),Tr):i},Mn.stubArray=ds,Mn.stubFalse=vs,Mn.stubObject=function(){return{}},Mn.stubString=function(){return""},Mn.stubTrue=function(){return!0},Mn.multiply=xs,Mn.nth=function(t,e){return t&&t.length?Fr(t,hu(e)):i},Mn.noConflict=function(){return fe._===this&&(fe._=Mt),this},Mn.noop=us,Mn.now=ja,Mn.pad=function(t,e,n){t=mu(t);var r=(e=hu(e))?ln(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return Di(he(i),n)+t+Di(pe(i),n)},Mn.padEnd=function(t,e,n){t=mu(t);var r=(e=hu(e))?ln(t):0;return e&&re){var r=t;t=e,e=r}if(n||t%1||e%1){var o=bn();return mn(t+o*(e-t+ue("1e-"+((o+"").length-1))),e)}return Kr(t,e)},Mn.reduce=function(t,e,n){var r=Ga(t)?ze:Ke,i=arguments.length<3;return r(t,oo(e,4),n,i,lr)},Mn.reduceRight=function(t,e,n){var r=Ga(t)?Se:Ke,i=arguments.length<3;return r(t,oo(e,4),n,i,fr)},Mn.repeat=function(t,e,n){return e=(n?mo(t,e,n):e===i)?1:hu(e),Xr(mu(t),e)},Mn.replace=function(){var t=arguments,e=mu(t[0]);return t.length<3?e:e.replace(t[1],t[2])},Mn.result=function(t,e,n){var r=-1,o=(e=gi(e,t)).length;for(o||(o=1,t=i);++rf)return[];var n=h,r=mn(t,h);e=oo(e),t-=h;for(var i=qe(r,e);++n=a)return t;var s=n-ln(r);if(s<1)return r;var c=u?yi(u,0,s).join(""):t.slice(0,s);if(o===i)return c+r;if(u&&(s+=c.length-s),iu(o)){if(t.slice(s).search(o)){var l,f=c;for(o.global||(o=jt(o.source,mu(pt.exec(o))+"g")),o.lastIndex=0;l=o.exec(f);)var p=l.index;c=c.slice(0,p===i?s:p)}}else if(t.indexOf(ai(o),s)!=s){var h=c.lastIndexOf(o);h>-1&&(c=c.slice(0,h))}return c+r},Mn.unescape=function(t){return(t=mu(t))&&q.test(t)?t.replace(K,hn):t},Mn.uniqueId=function(t){var e=++St;return mu(t)+e},Mn.upperCase=Vu,Mn.upperFirst=Hu,Mn.each=ma,Mn.eachRight=ya,Mn.first=Ko,as(Mn,(gs={},yr(Mn,function(t,e){zt.call(Mn.prototype,e)||(gs[e]=t)}),gs),{chain:!1}),Mn.VERSION="4.17.21",je(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){Mn[t].placeholder=Mn}),je(["drop","take"],function(t,e){Un.prototype[t]=function(n){n=n===i?1:gn(hu(n),0);var r=this.__filtered__&&!e?new Un(this):this.clone();return r.__filtered__?r.__takeCount__=mn(n,r.__takeCount__):r.__views__.push({size:mn(n,h),type:t+(r.__dir__<0?"Right":"")}),r},Un.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),je(["filter","map","takeWhile"],function(t,e){var n=e+1,r=1==n||3==n;Un.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:oo(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),je(["head","last"],function(t,e){var n="take"+(e?"Right":"");Un.prototype[t]=function(){return this[n](1).value()[0]}}),je(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");Un.prototype[t]=function(){return this.__filtered__?new Un(this):this[n](1)}}),Un.prototype.compact=function(){return this.filter(ns)},Un.prototype.find=function(t){return this.filter(t).head()},Un.prototype.findLast=function(t){return this.reverse().find(t)},Un.prototype.invokeMap=qr(function(t,e){return"function"==typeof t?new Un(this):this.map(function(n){return $r(n,t,e)})}),Un.prototype.reject=function(t){return this.filter(Sa(oo(t)))},Un.prototype.slice=function(t,e){t=hu(t);var n=this;return n.__filtered__&&(t>0||e<0)?new Un(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==i&&(n=(e=hu(e))<0?n.dropRight(-e):n.take(e-t)),n)},Un.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Un.prototype.toArray=function(){return this.take(h)},yr(Un.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),o=Mn[r?"take"+("last"==e?"Right":""):e],a=r||/^find/.test(e);o&&(Mn.prototype[e]=function(){var e=this.__wrapped__,u=r?[1]:arguments,s=e instanceof Un,c=u[0],l=s||Ga(e),f=function(t){var e=o.apply(Mn,Ne([t],u));return r&&p?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(s=l=!1);var p=this.__chain__,h=!!this.__actions__.length,d=a&&!p,v=s&&!h;if(!a&&l){e=v?e:new Un(this);var g=t.apply(e,u);return g.__actions__.push({func:pa,args:[f],thisArg:i}),new Dn(g,p)}return d&&v?t.apply(this,u):(g=this.thru(f),d?r?g.value()[0]:g.value():g)})}),je(["pop","push","shift","sort","splice","unshift"],function(t){var e=$t[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);Mn.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(Ga(i)?i:[],t)}return this[n](function(n){return e.apply(Ga(n)?n:[],t)})}}),yr(Un.prototype,function(t,e){var n=Mn[e];if(n){var r=n.name+"";zt.call(kn,r)||(kn[r]=[]),kn[r].push({name:e,func:n})}}),kn[Bi(i,2).name]=[{name:"wrapper",func:i}],Un.prototype.clone=function(){var t=new Un(this.__wrapped__);return t.__actions__=Oi(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Oi(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Oi(this.__views__),t},Un.prototype.reverse=function(){if(this.__filtered__){var t=new Un(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},Un.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=Ga(t),r=e<0,i=n?t.length:0,o=function(t,e,n){for(var r=-1,i=n.length;++r=this.__values__.length;return{done:t,value:t?i:this.__values__[this.__index__++]}},Mn.prototype.plant=function(t){for(var e,n=this;n instanceof Fn;){var r=Mo(n);r.__index__=0,r.__values__=i,e?o.__wrapped__=r:e=r;var o=r;n=n.__wrapped__}return o.__wrapped__=t,e},Mn.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof Un){var e=t;return this.__actions__.length&&(e=new Un(this)),(e=e.reverse()).__actions__.push({func:pa,args:[Yo],thisArg:i}),new Dn(e,this.__chain__)}return this.thru(Yo)},Mn.prototype.toJSON=Mn.prototype.valueOf=Mn.prototype.value=function(){return fi(this.__wrapped__,this.__actions__)},Mn.prototype.first=Mn.prototype.head,Ht&&(Mn.prototype[Ht]=function(){return this}),Mn}();fe._=dn,(r=function(){return dn}.call(e,n,e,t))===i||(t.exports=r)}.call(this)},2552:(t,e,n)=>{var r=n(1873),i=n(659),o=n(9350),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?i(t):o(t)}},2651:(t,e,n)=>{var r=n(4218);t.exports=function(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}},2749:(t,e,n)=>{var r=n(1042),i=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:i.call(e,t)}},2804:(t,e,n)=>{var r=n(6110)(n(9325),"Promise");t.exports=r},2865:(t,e,n)=>{var r=n(9570),i=n(1811)(r);t.exports=i},2903:(t,e,n)=>{var r=n(3805),i=n(5527),o=n(181),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return o(t);var e=i(t),n=[];for(var u in t)("constructor"!=u||!e&&a.call(t,u))&&n.push(u);return n}},2949:(t,e,n)=>{var r=n(2651);t.exports=function(t,e){var n=r(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this}},3007:t=>{t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++n{var r=n(1549),i=n(79),o=n(8223);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},3120:(t,e,n)=>{var r=n(4528),i=n(5891);t.exports=function t(e,n,o,a,u){var s=-1,c=e.length;for(o||(o=i),u||(u=[]);++s0&&o(l)?n>1?t(l,n-1,o,a,u):r(u,l):a||(u[u.length]=l)}return u}},3138:(t,e,n)=>{var r=n(1331);t.exports=function(t){return r(t)?void 0:t}},3199:(t,e,n)=>{var r=n(6110)(n(9325),"DataView");t.exports=r},3201:t=>{var e=/\w*$/;t.exports=function(t){var n=new t.constructor(t.source,e.exec(t));return n.lastIndex=t.lastIndex,n}},3222:(t,e,n)=>{var r=n(7556);t.exports=function(t){return null==t?"":r(t)}},3243:(t,e,n)=>{var r=n(6110),i=function(){try{var t=r(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=i},3290:(t,e,n)=>{t=n.nmd(t);var r=n(9325),i=e&&!e.nodeType&&e,o=i&&t&&!t.nodeType&&t,a=o&&o.exports===i?r.Buffer:void 0,u=a?a.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var n=t.length,r=u?u(n):new t.constructor(n);return t.copy(r),r}},3345:t=>{t.exports=function(){return[]}},3349:(t,e,n)=>{var r=n(2199),i=n(6375),o=n(7241);t.exports=function(t){return r(t,o,i)}},3360:(t,e,n)=>{var r=n(3243);t.exports=function(t,e,n){"__proto__"==e&&r?r(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},3488:t=>{t.exports=function(t){return t}},3605:t=>{t.exports=function(t){return this.__data__.get(t)}},3650:(t,e,n)=>{var r=n(4335)(Object.keys,Object);t.exports=r},3656:(t,e,n)=>{t=n.nmd(t);var r=n(9325),i=n(9935),o=e&&!e.nodeType&&e,a=o&&t&&!t.nodeType&&t,u=a&&a.exports===o?r.Buffer:void 0,s=(u?u.isBuffer:void 0)||i;t.exports=s},3661:(t,e,n)=>{var r=n(3040),i=n(7670),o=n(289),a=n(4509),u=n(2949);function s(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{t.exports=function(){this.__data__=[],this.size=0}},3729:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n{var r=n(1873),i=r?r.prototype:void 0,o=i?i.valueOf:void 0;t.exports=function(t){return o?Object(o.call(t)):{}}},3805:t=>{t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},3838:(t,e,n)=>{var r=n(1791),i=n(7241);t.exports=function(t,e){return t&&r(e,i(e),t)}},3862:t=>{t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},3904:(t,e,n)=>{const r=Symbol("SemVer ANY");class i{static get ANY(){return r}constructor(t,e){if(e=o(e),t instanceof i){if(t.loose===!!e.loose)return t;t=t.value}t=t.trim().split(/\s+/).join(" "),c("comparator",t,e),this.options=e,this.loose=!!e.loose,this.parse(t),this.semver===r?this.value="":this.value=this.operator+this.semver.version,c("comp",this)}parse(t){const e=this.options.loose?a[u.COMPARATORLOOSE]:a[u.COMPARATOR],n=t.match(e);if(!n)throw new TypeError(`Invalid comparator: ${t}`);this.operator=void 0!==n[1]?n[1]:"","="===this.operator&&(this.operator=""),n[2]?this.semver=new l(n[2],this.options.loose):this.semver=r}toString(){return this.value}test(t){if(c("Comparator.test",t,this.options.loose),this.semver===r||t===r)return!0;if("string"==typeof t)try{t=new l(t,this.options)}catch(t){return!1}return s(t,this.operator,this.semver,this.options)}intersects(t,e){if(!(t instanceof i))throw new TypeError("a Comparator is required");return""===this.operator?""===this.value||new f(t.value,e).test(this.value):""===t.operator?""===t.value||new f(this.value,e).test(t.semver):!((e=o(e)).includePrerelease&&("<0.0.0-0"===this.value||"<0.0.0-0"===t.value)||!e.includePrerelease&&(this.value.startsWith("<0.0.0")||t.value.startsWith("<0.0.0"))||(!this.operator.startsWith(">")||!t.operator.startsWith(">"))&&(!this.operator.startsWith("<")||!t.operator.startsWith("<"))&&(this.semver.version!==t.semver.version||!this.operator.includes("=")||!t.operator.includes("="))&&!(s(this.semver,"<",t.semver,e)&&this.operator.startsWith(">")&&t.operator.startsWith("<"))&&!(s(this.semver,">",t.semver,e)&&this.operator.startsWith("<")&&t.operator.startsWith(">")))}}t.exports=i;const o=n(8587),{safeRe:a,t:u}=n(9718),s=n(2111),c=n(7272),l=n(3908),f=n(8311)},3908:(t,e,n)=>{const r=n(7272),{MAX_LENGTH:i,MAX_SAFE_INTEGER:o}=n(6874),{safeRe:a,t:u}=n(9718),s=n(8587),{compareIdentifiers:c}=n(1123);class l{constructor(t,e){if(e=s(e),t instanceof l){if(t.loose===!!e.loose&&t.includePrerelease===!!e.includePrerelease)return t;t=t.version}else if("string"!=typeof t)throw new TypeError(`Invalid version. Must be a string. Got type "${typeof t}".`);if(t.length>i)throw new TypeError(`version is longer than ${i} characters`);r("SemVer",t,e),this.options=e,this.loose=!!e.loose,this.includePrerelease=!!e.includePrerelease;const n=t.trim().match(e.loose?a[u.LOOSE]:a[u.FULL]);if(!n)throw new TypeError(`Invalid Version: ${t}`);if(this.raw=t,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>o||this.major<0)throw new TypeError("Invalid major version");if(this.minor>o||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>o||this.patch<0)throw new TypeError("Invalid patch version");n[4]?this.prerelease=n[4].split(".").map(t=>{if(/^[0-9]+$/.test(t)){const e=+t;if(e>=0&&e=0;)"number"==typeof this.prerelease[r]&&(this.prerelease[r]++,r=-2);if(-1===r){if(e===this.prerelease.join(".")&&!1===n)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(t)}}if(e){let r=[e,t];!1===n&&(r=[e]),0===c(this.prerelease[0],e)?isNaN(this.prerelease[1])&&(this.prerelease=r):this.prerelease=r}break}default:throw new Error(`invalid increment argument: ${t}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}t.exports=l},3999:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>0!==r(t,e,n)},4089:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)>=0},4218:t=>{t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},4335:t=>{t.exports=function(t,e){return function(n){return t(e(n))}}},4394:(t,e,n)=>{var r=n(2552),i=n(346);t.exports=function(t){return"symbol"==typeof t||i(t)&&"[object Symbol]"==r(t)}},4509:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).has(t)}},4528:t=>{t.exports=function(t,e){for(var n=-1,r=e.length,i=t.length;++n{const r=n(560);t.exports=(t,e,n)=>0===r(t,e,n)},4664:(t,e,n)=>{var r=n(9770),i=n(3345),o=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,u=a?function(t){return null==t?[]:(t=Object(t),r(a(t),function(e){return o.call(t,e)}))}:i;t.exports=u},4733:(t,e,n)=>{var r=n(1791),i=n(5950);t.exports=function(t,e){return t&&r(e,i(e),t)}},4739:(t,e,n)=>{var r=n(6025);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},4840:t=>{var e="object"==typeof global&&global&&global.Object===Object&&global;t.exports=e},4894:(t,e,n)=>{var r=n(1882),i=n(294);t.exports=function(t){return null!=t&&i(t.length)&&!r(t)}},4901:(t,e,n)=>{var r=n(2552),i=n(294),o=n(346),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return o(t)&&i(t.length)&&!!a[r(t)]}},4932:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,i=Array(r);++n{var r=n(1882),i=n(7296),o=n(3805),a=n(7473),u=/^\[object .+?Constructor\]$/,s=Function.prototype,c=Object.prototype,l=s.toString,f=c.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!o(t)||i(t))&&(r(t)?p:u).test(a(t))}},5160:t=>{t.exports=function(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var o=Array(i);++r{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)<=0},5288:t=>{t.exports=function(t,e){return t===e||t!=t&&e!=e}},5481:(t,e,n)=>{var r=n(9325)["__core-js_shared__"];t.exports=r},5527:t=>{var e=Object.prototype;t.exports=function(t){var n=t&&t.constructor;return t===("function"==typeof n&&n.prototype||e)}},5529:(t,e,n)=>{var r=n(9344),i=n(8879),o=n(5527);t.exports=function(t){return"function"!=typeof t.constructor||o(t)?{}:r(i(t))}},5580:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)>0},5749:(t,e,n)=>{var r=n(1042);t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?"__lodash_hash_undefined__":e,this}},5861:(t,e,n)=>{var r=n(3199),i=n(8223),o=n(2804),a=n(6545),u=n(8303),s=n(2552),c=n(7473),l="[object Map]",f="[object Promise]",p="[object Set]",h="[object WeakMap]",d="[object DataView]",v=c(r),g=c(i),m=c(o),y=c(a),_=c(u),b=s;(r&&b(new r(new ArrayBuffer(1)))!=d||i&&b(new i)!=l||o&&b(o.resolve())!=f||a&&b(new a)!=p||u&&b(new u)!=h)&&(b=function(t){var e=s(t),n="[object Object]"==e?t.constructor:void 0,r=n?c(n):"";if(r)switch(r){case v:return d;case g:return l;case m:return f;case y:return p;case _:return h}return e}),t.exports=b},5891:(t,e,n)=>{var r=n(1873),i=n(2428),o=n(6449),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return o(t)||i(t)||!!(a&&t&&t[a])}},5950:(t,e,n)=>{var r=n(695),i=n(8984),o=n(4894);t.exports=function(t){return o(t)?r(t):i(t)}},5970:(t,e,n)=>{var r=n(3120);t.exports=function(t){return null!=t&&t.length?r(t,1):[]}},6009:(t,e,n)=>{t=n.nmd(t);var r=n(4840),i=e&&!e.nodeType&&e,o=i&&t&&!t.nodeType&&t,a=o&&o.exports===i&&r.process,u=function(){try{return o&&o.require&&o.require("util").types||a&&a.binding&&a.binding("util")}catch(t){}}();t.exports=u},6025:(t,e,n)=>{var r=n(5288);t.exports=function(t,e){for(var n=t.length;n--;)if(r(t[n][0],e))return n;return-1}},6038:(t,e,n)=>{var r=n(5861),i=n(346);t.exports=function(t){return i(t)&&"[object Set]"==r(t)}},6110:(t,e,n)=>{var r=n(5083),i=n(392);t.exports=function(t,e){var n=i(t,e);return r(n)?n:void 0}},6169:(t,e,n)=>{var r=n(9653);t.exports=function(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}},6170:(t,e,n)=>{const r=n(3908),i=n(144),{safeRe:o,t:a}=n(9718);t.exports=(t,e)=>{if(t instanceof r)return t;if("number"==typeof t&&(t=String(t)),"string"!=typeof t)return null;let n=null;if((e=e||{}).rtl){let e;for(;(e=o[a.COERCERTL].exec(t))&&(!n||n.index+n[0].length!==t.length);)n&&e.index+e[0].length===n.index+n[0].length||(n=e),o[a.COERCERTL].lastIndex=e.index+e[1].length+e[2].length;o[a.COERCERTL].lastIndex=-1}else n=t.match(o[a.COERCE]);return null===n?null:i(`${n[2]}.${n[3]||"0"}.${n[4]||"0"}`,e)}},6189:t=>{var e=Object.prototype.hasOwnProperty;t.exports=function(t){var n=t.length,r=new t.constructor(n);return n&&"string"==typeof t[0]&&e.call(t,"index")&&(r.index=t.index,r.input=t.input),r}},6375:(t,e,n)=>{var r=n(4528),i=n(8879),o=n(4664),a=n(3345),u=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)r(e,o(t)),t=i(t);return e}:a;t.exports=u},6449:t=>{var e=Array.isArray;t.exports=e},6545:(t,e,n)=>{var r=n(6110)(n(9325),"Set");t.exports=r},6547:(t,e,n)=>{var r=n(3360),i=n(5288),o=Object.prototype.hasOwnProperty;t.exports=function(t,e,n){var a=t[e];o.call(t,e)&&i(a,n)&&(void 0!==n||e in t)||r(t,e,n)}},6721:(t,e,n)=>{var r=n(1042),i=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;if(r){var n=e[t];return"__lodash_hash_undefined__"===n?void 0:n}return i.call(e,t)?e[t]:void 0}},6757:(t,e,n)=>{var r=n(1033),i=Math.max;t.exports=function(t,e,n){return e=i(void 0===e?t.length-1:e,0),function(){for(var o=arguments,a=-1,u=i(o.length-e,0),s=Array(u);++a{const e=Number.MAX_SAFE_INTEGER||9007199254740991;t.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:16,MAX_SAFE_BUILD_LENGTH:250,MAX_SAFE_INTEGER:e,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:"2.0.0",FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}},7059:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)<0},7167:(t,e,n)=>{var r=n(4901),i=n(7301),o=n(6009),a=o&&o.isTypedArray,u=a?i(a):r;t.exports=u},7199:(t,e,n)=>{var r=n(9653),i=n(6169),o=n(3201),a=n(3736),u=n(1961);t.exports=function(t,e,n){var s=t.constructor;switch(e){case"[object ArrayBuffer]":return r(t);case"[object Boolean]":case"[object Date]":return new s(+t);case"[object DataView]":return i(t,n);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return u(t,n);case"[object Map]":case"[object Set]":return new s;case"[object Number]":case"[object String]":return new s(t);case"[object RegExp]":return o(t);case"[object Symbol]":return a(t)}}},7217:(t,e,n)=>{var r=n(79),i=n(1420),o=n(938),a=n(3605),u=n(9817),s=n(945);function c(t){var e=this.__data__=new r(t);this.size=e.size}c.prototype.clear=i,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=u,c.prototype.set=s,t.exports=c},7241:(t,e,n)=>{var r=n(695),i=n(2903),o=n(4894);t.exports=function(t){return o(t)?r(t,!0):i(t)}},7272:t=>{const e="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};t.exports=e},7296:(t,e,n)=>{var r,i=n(5481),o=(r=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!o&&o in t}},7301:t=>{t.exports=function(t){return function(e){return t(e)}}},7334:t=>{t.exports=function(t){return function(){return t}}},7422:(t,e,n)=>{var r=n(1769),i=n(7797);t.exports=function(t,e){for(var n=0,o=(e=r(e,t)).length;null!=t&&n{var e=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return e.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},7534:(t,e,n)=>{var r=n(2552),i=n(346);t.exports=function(t){return i(t)&&"[object Arguments]"==r(t)}},7556:(t,e,n)=>{var r=n(1873),i=n(4932),o=n(6449),a=n(4394),u=r?r.prototype:void 0,s=u?u.toString:void 0;t.exports=function t(e){if("string"==typeof e)return e;if(o(e))return i(e,t)+"";if(a(e))return s?s.call(e):"";var n=e+"";return"0"==n&&1/e==-1/0?"-0":n}},7638:(t,e,n)=>{const r=n(8311);t.exports=(t,e,n)=>{try{e=new r(e,n)}catch(t){return!1}return e.test(t)}},7670:(t,e,n)=>{var r=n(2651);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},7730:(t,e,n)=>{var r=n(9172),i=n(7301),o=n(6009),a=o&&o.isMap,u=a?i(a):r;t.exports=u},7797:(t,e,n)=>{var r=n(4394);t.exports=function(t){if("string"==typeof t||r(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}},7828:(t,e,n)=>{var r=n(9325).Uint8Array;t.exports=r},8090:t=>{t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},8096:t=>{t.exports=function(t,e){for(var n=-1,r=Array(t);++n{var r=n(6110)(n(9325),"Map");t.exports=r},8303:(t,e,n)=>{var r=n(6110)(n(9325),"WeakMap");t.exports=r},8311:(t,e,n)=>{class r{constructor(t,e){if(e=o(e),t instanceof r)return t.loose===!!e.loose&&t.includePrerelease===!!e.includePrerelease?t:new r(t.raw,e);if(t instanceof a)return this.raw=t.value,this.set=[[t]],this.format(),this;if(this.options=e,this.loose=!!e.loose,this.includePrerelease=!!e.includePrerelease,this.raw=t.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(t=>this.parseRange(t.trim())).filter(t=>t.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){const t=this.set[0];if(this.set=this.set.filter(t=>!g(t[0])),0===this.set.length)this.set=[t];else if(this.set.length>1)for(const t of this.set)if(1===t.length&&m(t[0])){this.set=[t];break}}this.format()}format(){return this.range=this.set.map(t=>t.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(t){const e=((this.options.includePrerelease&&d)|(this.options.loose&&v))+":"+t,n=i.get(e);if(n)return n;const r=this.options.loose,o=r?c[l.HYPHENRANGELOOSE]:c[l.HYPHENRANGE];t=t.replace(o,k(this.options.includePrerelease)),u("hyphen replace",t),t=t.replace(c[l.COMPARATORTRIM],f),u("comparator trim",t),t=t.replace(c[l.TILDETRIM],p),u("tilde trim",t),t=t.replace(c[l.CARETTRIM],h),u("caret trim",t);let s=t.split(" ").map(t=>_(t,this.options)).join(" ").split(/\s+/).map(t=>$(t,this.options));r&&(s=s.filter(t=>(u("loose invalid filter",t,this.options),!!t.match(c[l.COMPARATORLOOSE])))),u("range list",s);const m=new Map,y=s.map(t=>new a(t,this.options));for(const t of y){if(g(t))return[t];m.set(t.value,t)}m.size>1&&m.has("")&&m.delete("");const b=[...m.values()];return i.set(e,b),b}intersects(t,e){if(!(t instanceof r))throw new TypeError("a Range is required");return this.set.some(n=>y(n,e)&&t.set.some(t=>y(t,e)&&n.every(n=>t.every(t=>n.intersects(t,e)))))}test(t){if(!t)return!1;if("string"==typeof t)try{t=new s(t,this.options)}catch(t){return!1}for(let e=0;e"<0.0.0-0"===t.value,m=t=>""===t.value,y=(t,e)=>{let n=!0;const r=t.slice();let i=r.pop();for(;n&&r.length;)n=r.every(t=>i.intersects(t,e)),i=r.pop();return n},_=(t,e)=>(u("comp",t,e),t=w(t,e),u("caret",t),t=x(t,e),u("tildes",t),t=j(t,e),u("xrange",t),t=I(t,e),u("stars",t),t),b=t=>!t||"x"===t.toLowerCase()||"*"===t,x=(t,e)=>t.trim().split(/\s+/).map(t=>A(t,e)).join(" "),A=(t,e)=>{const n=e.loose?c[l.TILDELOOSE]:c[l.TILDE];return t.replace(n,(e,n,r,i,o)=>{let a;return u("tilde",t,e,n,r,i,o),b(n)?a="":b(r)?a=`>=${n}.0.0 <${+n+1}.0.0-0`:b(i)?a=`>=${n}.${r}.0 <${n}.${+r+1}.0-0`:o?(u("replaceTilde pr",o),a=`>=${n}.${r}.${i}-${o} <${n}.${+r+1}.0-0`):a=`>=${n}.${r}.${i} <${n}.${+r+1}.0-0`,u("tilde return",a),a})},w=(t,e)=>t.trim().split(/\s+/).map(t=>E(t,e)).join(" "),E=(t,e)=>{u("caret",t,e);const n=e.loose?c[l.CARETLOOSE]:c[l.CARET],r=e.includePrerelease?"-0":"";return t.replace(n,(e,n,i,o,a)=>{let s;return u("caret",t,e,n,i,o,a),b(n)?s="":b(i)?s=`>=${n}.0.0${r} <${+n+1}.0.0-0`:b(o)?s="0"===n?`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:a?(u("replaceCaret pr",a),s="0"===n?"0"===i?`>=${n}.${i}.${o}-${a} <${n}.${i}.${+o+1}-0`:`>=${n}.${i}.${o}-${a} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${o}-${a} <${+n+1}.0.0-0`):(u("no pr"),s="0"===n?"0"===i?`>=${n}.${i}.${o}${r} <${n}.${i}.${+o+1}-0`:`>=${n}.${i}.${o}${r} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${o} <${+n+1}.0.0-0`),u("caret return",s),s})},j=(t,e)=>(u("replaceXRanges",t,e),t.split(/\s+/).map(t=>O(t,e)).join(" ")),O=(t,e)=>{t=t.trim();const n=e.loose?c[l.XRANGELOOSE]:c[l.XRANGE];return t.replace(n,(n,r,i,o,a,s)=>{u("xRange",t,n,r,i,o,a,s);const c=b(i),l=c||b(o),f=l||b(a),p=f;return"="===r&&p&&(r=""),s=e.includePrerelease?"-0":"",c?n=">"===r||"<"===r?"<0.0.0-0":"*":r&&p?(l&&(o=0),a=0,">"===r?(r=">=",l?(i=+i+1,o=0,a=0):(o=+o+1,a=0)):"<="===r&&(r="<",l?i=+i+1:o=+o+1),"<"===r&&(s="-0"),n=`${r+i}.${o}.${a}${s}`):l?n=`>=${i}.0.0${s} <${+i+1}.0.0-0`:f&&(n=`>=${i}.${o}.0${s} <${i}.${+o+1}.0-0`),u("xRange return",n),n})},I=(t,e)=>(u("replaceStars",t,e),t.trim().replace(c[l.STAR],"")),$=(t,e)=>(u("replaceGTE0",t,e),t.trim().replace(c[e.includePrerelease?l.GTE0PRE:l.GTE0],"")),k=t=>(e,n,r,i,o,a,u,s,c,l,f,p,h)=>`${n=b(r)?"":b(i)?`>=${r}.0.0${t?"-0":""}`:b(o)?`>=${r}.${i}.0${t?"-0":""}`:a?`>=${n}`:`>=${n}${t?"-0":""}`} ${s=b(c)?"":b(l)?`<${+c+1}.0.0-0`:b(f)?`<${c}.${+l+1}.0-0`:p?`<=${c}.${l}.${f}-${p}`:t?`<${c}.${l}.${+f+1}-0`:`<=${s}`}`.trim(),R=(t,e,n)=>{for(let n=0;n0){const r=t[n].semver;if(r.major===e.major&&r.minor===e.minor&&r.patch===e.patch)return!0}return!1}return!0}},8440:(t,e,n)=>{var r=n(6038),i=n(7301),o=n(6009),a=o&&o.isSet,u=a?i(a):r;t.exports=u},8586:(t,e,n)=>{var r=n(6449),i=n(4394),o=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!i(t))||a.test(t)||!o.test(t)||null!=e&&t in Object(e)}},8587:t=>{const e=Object.freeze({loose:!0}),n=Object.freeze({});t.exports=t=>t?"object"!=typeof t?e:t:n},8655:(t,e,n)=>{var r=n(6025);t.exports=function(t){return r(this.__data__,t)>-1}},8799:(t,e,n)=>{"use strict";function r(t){var e=this;if(e instanceof r||(e=new r),e.tail=null,e.head=null,e.length=0,t&&"function"==typeof t.forEach)t.forEach(function(t){e.push(t)});else if(arguments.length>0)for(var n=0,i=arguments.length;n1)n=e;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");r=this.head.next,n=this.head.value}for(var i=0;null!==r;i++)n=t(n,r.value,i),r=r.next;return n},r.prototype.reduceReverse=function(t,e){var n,r=this.tail;if(arguments.length>1)n=e;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");r=this.tail.prev,n=this.tail.value}for(var i=this.length-1;null!==r;i--)n=t(n,r.value,i),r=r.prev;return n},r.prototype.toArray=function(){for(var t=new Array(this.length),e=0,n=this.head;null!==n;e++)t[e]=n.value,n=n.next;return t},r.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,n=this.tail;null!==n;e++)t[e]=n.value,n=n.prev;return t},r.prototype.slice=function(t,e){(e=e||this.length)<0&&(e+=this.length),(t=t||0)<0&&(t+=this.length);var n=new r;if(ethis.length&&(e=this.length);for(var i=0,o=this.head;null!==o&&ithis.length&&(e=this.length);for(var i=this.length,o=this.tail;null!==o&&i>e;i--)o=o.prev;for(;null!==o&&i>t;i--,o=o.prev)n.push(o.value);return n},r.prototype.splice=function(t,e,...n){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var r=0,o=this.head;null!==o&&r{var r=n(5970),i=n(6757),o=n(2865);t.exports=function(t){return o(i(t,void 0,r),t+"")}},8879:(t,e,n)=>{var r=n(4335)(Object.getPrototypeOf,Object);t.exports=r},8948:(t,e,n)=>{var r=n(1791),i=n(6375);t.exports=function(t,e){return r(t,i(t),e)}},8969:(t,e,n)=>{var r=n(7422),i=n(5160);t.exports=function(t,e){return e.length<2?t:r(t,i(e,0,-1))}},8984:(t,e,n)=>{var r=n(5527),i=n(3650),o=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=[];for(var n in Object(t))o.call(t,n)&&"constructor"!=n&&e.push(n);return e}},9172:(t,e,n)=>{var r=n(5861),i=n(346);t.exports=function(t){return i(t)&&"[object Map]"==r(t)}},9325:(t,e,n)=>{var r=n(4840),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},9344:(t,e,n)=>{var r=n(3805),i=Object.create,o=function(){function t(){}return function(e){if(!r(e))return{};if(i)return i(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();t.exports=o},9350:t=>{var e=Object.prototype.toString;t.exports=function(t){return e.call(t)}},9570:(t,e,n)=>{var r=n(7334),i=n(3243),o=n(3488),a=i?function(t,e){return i(t,"toString",{configurable:!0,enumerable:!1,value:r(e),writable:!0})}:o;t.exports=a},9653:(t,e,n)=>{var r=n(7828);t.exports=function(t){var e=new t.constructor(t.byteLength);return new r(e).set(new r(t)),e}},9718:(t,e,n)=>{const{MAX_SAFE_COMPONENT_LENGTH:r,MAX_SAFE_BUILD_LENGTH:i,MAX_LENGTH:o}=n(6874),a=n(7272),u=(e=t.exports={}).re=[],s=e.safeRe=[],c=e.src=[],l=e.t={};let f=0;const p="[a-zA-Z0-9-]",h=[["\\s",1],["\\d",o],[p,i]],d=(t,e,n)=>{const r=(t=>{for(const[e,n]of h)t=t.split(`${e}*`).join(`${e}{0,${n}}`).split(`${e}+`).join(`${e}{1,${n}}`);return t})(e),i=f++;a(t,i,e),l[t]=i,c[i]=e,u[i]=new RegExp(e,n?"g":void 0),s[i]=new RegExp(r,n?"g":void 0)};d("NUMERICIDENTIFIER","0|[1-9]\\d*"),d("NUMERICIDENTIFIERLOOSE","\\d+"),d("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${p}*`),d("MAINVERSION",`(${c[l.NUMERICIDENTIFIER]})\\.(${c[l.NUMERICIDENTIFIER]})\\.(${c[l.NUMERICIDENTIFIER]})`),d("MAINVERSIONLOOSE",`(${c[l.NUMERICIDENTIFIERLOOSE]})\\.(${c[l.NUMERICIDENTIFIERLOOSE]})\\.(${c[l.NUMERICIDENTIFIERLOOSE]})`),d("PRERELEASEIDENTIFIER",`(?:${c[l.NUMERICIDENTIFIER]}|${c[l.NONNUMERICIDENTIFIER]})`),d("PRERELEASEIDENTIFIERLOOSE",`(?:${c[l.NUMERICIDENTIFIERLOOSE]}|${c[l.NONNUMERICIDENTIFIER]})`),d("PRERELEASE",`(?:-(${c[l.PRERELEASEIDENTIFIER]}(?:\\.${c[l.PRERELEASEIDENTIFIER]})*))`),d("PRERELEASELOOSE",`(?:-?(${c[l.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${c[l.PRERELEASEIDENTIFIERLOOSE]})*))`),d("BUILDIDENTIFIER",`${p}+`),d("BUILD",`(?:\\+(${c[l.BUILDIDENTIFIER]}(?:\\.${c[l.BUILDIDENTIFIER]})*))`),d("FULLPLAIN",`v?${c[l.MAINVERSION]}${c[l.PRERELEASE]}?${c[l.BUILD]}?`),d("FULL",`^${c[l.FULLPLAIN]}$`),d("LOOSEPLAIN",`[v=\\s]*${c[l.MAINVERSIONLOOSE]}${c[l.PRERELEASELOOSE]}?${c[l.BUILD]}?`),d("LOOSE",`^${c[l.LOOSEPLAIN]}$`),d("GTLT","((?:<|>)?=?)"),d("XRANGEIDENTIFIERLOOSE",`${c[l.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),d("XRANGEIDENTIFIER",`${c[l.NUMERICIDENTIFIER]}|x|X|\\*`),d("XRANGEPLAIN",`[v=\\s]*(${c[l.XRANGEIDENTIFIER]})(?:\\.(${c[l.XRANGEIDENTIFIER]})(?:\\.(${c[l.XRANGEIDENTIFIER]})(?:${c[l.PRERELEASE]})?${c[l.BUILD]}?)?)?`),d("XRANGEPLAINLOOSE",`[v=\\s]*(${c[l.XRANGEIDENTIFIERLOOSE]})(?:\\.(${c[l.XRANGEIDENTIFIERLOOSE]})(?:\\.(${c[l.XRANGEIDENTIFIERLOOSE]})(?:${c[l.PRERELEASELOOSE]})?${c[l.BUILD]}?)?)?`),d("XRANGE",`^${c[l.GTLT]}\\s*${c[l.XRANGEPLAIN]}$`),d("XRANGELOOSE",`^${c[l.GTLT]}\\s*${c[l.XRANGEPLAINLOOSE]}$`),d("COERCE",`(^|[^\\d])(\\d{1,${r}})(?:\\.(\\d{1,${r}}))?(?:\\.(\\d{1,${r}}))?(?:$|[^\\d])`),d("COERCERTL",c[l.COERCE],!0),d("LONETILDE","(?:~>?)"),d("TILDETRIM",`(\\s*)${c[l.LONETILDE]}\\s+`,!0),e.tildeTrimReplace="$1~",d("TILDE",`^${c[l.LONETILDE]}${c[l.XRANGEPLAIN]}$`),d("TILDELOOSE",`^${c[l.LONETILDE]}${c[l.XRANGEPLAINLOOSE]}$`),d("LONECARET","(?:\\^)"),d("CARETTRIM",`(\\s*)${c[l.LONECARET]}\\s+`,!0),e.caretTrimReplace="$1^",d("CARET",`^${c[l.LONECARET]}${c[l.XRANGEPLAIN]}$`),d("CARETLOOSE",`^${c[l.LONECARET]}${c[l.XRANGEPLAINLOOSE]}$`),d("COMPARATORLOOSE",`^${c[l.GTLT]}\\s*(${c[l.LOOSEPLAIN]})$|^$`),d("COMPARATOR",`^${c[l.GTLT]}\\s*(${c[l.FULLPLAIN]})$|^$`),d("COMPARATORTRIM",`(\\s*)${c[l.GTLT]}\\s*(${c[l.LOOSEPLAIN]}|${c[l.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace="$1$2$3",d("HYPHENRANGE",`^\\s*(${c[l.XRANGEPLAIN]})\\s+-\\s+(${c[l.XRANGEPLAIN]})\\s*$`),d("HYPHENRANGELOOSE",`^\\s*(${c[l.XRANGEPLAINLOOSE]})\\s+-\\s+(${c[l.XRANGEPLAINLOOSE]})\\s*$`),d("STAR","(<|>)?=?\\s*\\*"),d("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),d("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")},9749:(t,e,n)=>{"use strict";const r=n(8799),i=Symbol("max"),o=Symbol("length"),a=Symbol("lengthCalculator"),u=Symbol("allowStale"),s=Symbol("maxAge"),c=Symbol("dispose"),l=Symbol("noDisposeOnSet"),f=Symbol("lruList"),p=Symbol("cache"),h=Symbol("updateAgeOnGet"),d=()=>1,v=(t,e,n)=>{const r=t[p].get(e);if(r){const e=r.value;if(g(t,e)){if(y(t,r),!t[u])return}else n&&(t[h]&&(r.value.now=Date.now()),t[f].unshiftNode(r));return e.value}},g=(t,e)=>{if(!e||!e.maxAge&&!t[s])return!1;const n=Date.now()-e.now;return e.maxAge?n>e.maxAge:t[s]&&n>t[s]},m=t=>{if(t[o]>t[i])for(let e=t[f].tail;t[o]>t[i]&&null!==e;){const n=e.prev;y(t,e),e=n}},y=(t,e)=>{if(e){const n=e.value;t[c]&&t[c](n.key,n.value),t[o]-=n.length,t[p].delete(n.key),t[f].removeNode(e)}};class _{constructor(t,e,n,r,i){this.key=t,this.value=e,this.length=n,this.now=r,this.maxAge=i||0}}const b=(t,e,n,r)=>{let i=n.value;g(t,i)&&(y(t,n),t[u]||(i=void 0)),i&&e.call(r,i.value,i.key,t)};t.exports=class{constructor(t){if("number"==typeof t&&(t={max:t}),t||(t={}),t.max&&("number"!=typeof t.max||t.max<0))throw new TypeError("max must be a non-negative number");this[i]=t.max||1/0;const e=t.length||d;if(this[a]="function"!=typeof e?d:e,this[u]=t.stale||!1,t.maxAge&&"number"!=typeof t.maxAge)throw new TypeError("maxAge must be a number");this[s]=t.maxAge||0,this[c]=t.dispose,this[l]=t.noDisposeOnSet||!1,this[h]=t.updateAgeOnGet||!1,this.reset()}set max(t){if("number"!=typeof t||t<0)throw new TypeError("max must be a non-negative number");this[i]=t||1/0,m(this)}get max(){return this[i]}set allowStale(t){this[u]=!!t}get allowStale(){return this[u]}set maxAge(t){if("number"!=typeof t)throw new TypeError("maxAge must be a non-negative number");this[s]=t,m(this)}get maxAge(){return this[s]}set lengthCalculator(t){"function"!=typeof t&&(t=d),t!==this[a]&&(this[a]=t,this[o]=0,this[f].forEach(t=>{t.length=this[a](t.value,t.key),this[o]+=t.length})),m(this)}get lengthCalculator(){return this[a]}get length(){return this[o]}get itemCount(){return this[f].length}rforEach(t,e){e=e||this;for(let n=this[f].tail;null!==n;){const r=n.prev;b(this,t,n,e),n=r}}forEach(t,e){e=e||this;for(let n=this[f].head;null!==n;){const r=n.next;b(this,t,n,e),n=r}}keys(){return this[f].toArray().map(t=>t.key)}values(){return this[f].toArray().map(t=>t.value)}reset(){this[c]&&this[f]&&this[f].length&&this[f].forEach(t=>this[c](t.key,t.value)),this[p]=new Map,this[f]=new r,this[o]=0}dump(){return this[f].map(t=>!g(this,t)&&{k:t.key,v:t.value,e:t.now+(t.maxAge||0)}).toArray().filter(t=>t)}dumpLru(){return this[f]}set(t,e,n){if((n=n||this[s])&&"number"!=typeof n)throw new TypeError("maxAge must be a number");const r=n?Date.now():0,u=this[a](e,t);if(this[p].has(t)){if(u>this[i])return y(this,this[p].get(t)),!1;const a=this[p].get(t).value;return this[c]&&(this[l]||this[c](t,a.value)),a.now=r,a.maxAge=n,a.value=e,this[o]+=u-a.length,a.length=u,this.get(t),m(this),!0}const h=new _(t,e,u,r,n);return h.length>this[i]?(this[c]&&this[c](t,e),!1):(this[o]+=h.length,this[f].unshift(h),this[p].set(t,this[f].head),m(this),!0)}has(t){if(!this[p].has(t))return!1;const e=this[p].get(t).value;return!g(this,e)}get(t){return v(this,t,!0)}peek(t){return v(this,t,!1)}pop(){const t=this[f].tail;return t?(y(this,t),t.value):null}del(t){y(this,this[p].get(t))}load(t){this.reset();const e=Date.now();for(let n=t.length-1;n>=0;n--){const r=t[n],i=r.e||0;if(0===i)this.set(r.k,r.v);else{const t=i-e;t>0&&this.set(r.k,r.v,t)}}}prune(){this[p].forEach((t,e)=>v(this,e,!1))}}},9770:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,i=0,o=[];++n{t.exports=function(t){return this.__data__.has(t)}},9896:t=>{"use strict";t.exports=require("fs")},9931:(t,e,n)=>{var r=n(1769),i=n(8090),o=n(8969),a=n(7797);t.exports=function(t,e){return e=r(e,t),null==(t=o(t,e))||delete t[a(i(e))]}},9935:t=>{t.exports=function(){return!1}},9999:(t,e,n)=>{var r=n(7217),i=n(3729),o=n(6547),a=n(4733),u=n(3838),s=n(3290),c=n(3007),l=n(2271),f=n(8948),p=n(2),h=n(3349),d=n(5861),v=n(6189),g=n(7199),m=n(5529),y=n(6449),_=n(3656),b=n(7730),x=n(3805),A=n(8440),w=n(5950),E=n(7241),j="[object Arguments]",O="[object Function]",I="[object Object]",$={};$[j]=$["[object Array]"]=$["[object ArrayBuffer]"]=$["[object DataView]"]=$["[object Boolean]"]=$["[object Date]"]=$["[object Float32Array]"]=$["[object Float64Array]"]=$["[object Int8Array]"]=$["[object Int16Array]"]=$["[object Int32Array]"]=$["[object Map]"]=$["[object Number]"]=$[I]=$["[object RegExp]"]=$["[object Set]"]=$["[object String]"]=$["[object Symbol]"]=$["[object Uint8Array]"]=$["[object Uint8ClampedArray]"]=$["[object Uint16Array]"]=$["[object Uint32Array]"]=!0,$["[object Error]"]=$[O]=$["[object WeakMap]"]=!1,t.exports=function t(e,n,k,R,L,N){var z,S=1&n,T=2&n,C=4&n;if(k&&(z=L?k(e,R,L,N):k(e)),void 0!==z)return z;if(!x(e))return e;var B=y(e);if(B){if(z=v(e),!S)return c(e,z)}else{var M=d(e),P=M==O||"[object GeneratorFunction]"==M;if(_(e))return s(e,S);if(M==I||M==j||P&&!L){if(z=T||P?{}:m(e),!S)return T?f(e,u(z,e)):l(e,a(z,e))}else{if(!$[M])return L?e:{};z=g(e,M,S)}}N||(N=new r);var F=N.get(e);if(F)return F;N.set(e,z),A(e)?e.forEach(function(r){z.add(t(r,n,k,r,e,N))}):b(e)&&e.forEach(function(r,i){z.set(i,t(r,n,k,i,e,N))});var D=B?void 0:(C?T?h:p:T?E:w)(e);return i(D||e,function(r,i){D&&(r=e[i=r]),o(z,i,t(r,n,k,i,e,N))}),z}}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var o=e[r]={id:r,loaded:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),(()=>{"use strict";var t=n(6170),e=n.n(t),r=n(7638),i=n.n(r);const o=JSON.parse('{"rE":"2.1.2","Ug":{"title":"AzureLib Animator","author":"AzureDoom","icon":"azureicon.png","description":"Create models, textures, and animations for AzureLib-powered mods using Bedrock-style tools.","min_version":"4.8.0","max_version":"15.0.0","new_repository_format":"true","await_loading":true,"variant":"both","creation_date":"2023-04-04","contributes":{"formats":["azure_model"]},"has_changelog":true,"website":"https://wiki.azuredoom.com/","tags":["Minecraft: Java Edition"]}}');var a=n(2543);const u="linear";function s(t){return t?.includes("Back")||t?.includes("Elastic")||t?.includes("Bounce")||"step"===t}function c(t){return s(t)?t?.includes("Back")?1.70158:t?.includes("Elastic")||t?.includes("Bounce")?1:"step"===t?4:1:1}function l(t,e){const n=parseFloat(e);return isNaN(n)?c(t.easing):Math.max(-9999,Math.min(9999,n))}const f=Math.PI,p=1.70158,h=1.525*p,d=p+1,v=2*f/3,g=2*f/4.5,m=t=>{const e=7.5625,n=2.75;return t<1/n?e*t*t:t<2/n?e*(t-=1.5/n)*t+.75:t<2.5/n?e*(t-=2.25/n)*t+.9375:e*(t-=2.625/n)*t+.984375},y={linear:t=>t,step:(t,e=4)=>Math.floor((0,a.clamp)(t*e,0,e-1))/(e-1),easeInSine:t=>1-Math.cos(t*f/2),easeOutSine:t=>Math.sin(t*f/2),easeInOutSine:t=>-(Math.cos(f*t)-1)/2,easeInQuad:t=>t*t,easeOutQuad:t=>1-(1-t)*(1-t),easeInOutQuad:t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,easeInCubic:t=>t*t*t,easeOutCubic:t=>1-Math.pow(1-t,3),easeInOutCubic:t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,easeInQuart:t=>t*t*t*t,easeOutQuart:t=>1-Math.pow(1-t,4),easeInOutQuart:t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>1-Math.pow(1-t,5),easeInOutQuint:t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,easeInExpo:t=>0===t?0:Math.pow(2,10*t-10),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>0===t?0:1===t?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,easeInCirc:t=>1-Math.sqrt(1-Math.pow(t,2)),easeOutCirc:t=>Math.sqrt(1-Math.pow(t-1,2)),easeInOutCirc:t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,easeInBack:(t,e=p)=>d*t*t*t-e*t*t,easeOutBack:(t,e=p)=>1+d*Math.pow(t-1,3)+e*Math.pow(t-1,2),easeInOutBack:(t,e=p)=>t<.5?Math.pow(2*t,2)*(7.189819*t-h)/2:(Math.pow(2*t-2,2)*((h+1)*(2*t-2)+h)+2)/2,easeInElastic:(t,e=1)=>0===t?0:1===t?1:-Math.pow(2,10*t-10)*Math.sin((10*t-10.75)*v*e),easeOutElastic:(t,e=1)=>0===t?0:1===t?1:Math.pow(2,-10*t)*Math.sin((10*t-.75)*v*e)+1,easeInOutElastic:(t,e=1)=>0===t?0:1===t?1:t<.5?-Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*g*e)/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*g*e)/2+1,easeInBounce:t=>1-m(1-t),easeOutBounce:m,easeInOutBounce:t=>t<.5?(1-m(1-2*t))/2:(1+m(2*t-1))/2};let _=!1;function b(){_||(Blockbench.on("display_animation_frame",N),Blockbench.on("update_keyframe_selection",w),window._azureApplyEasing=I,window._azureApplyEasingArg=k,window._azureToggleCatmullrom=L,window._azureSetInterpolation=R,function(){if(!BarItems.keyframe_interpolation)return;const t=BarItems.keyframe_interpolation.condition;BarItems.keyframe_interpolation.condition=function(...e){return"azure_model"!==Format?.id&&("function"!=typeof t||t.apply(this,e))}}(),_=!0,console.log("[AzureLib] Animation UI initialised"))}function x(){_&&(Blockbench.removeListener("display_animation_frame",N),Blockbench.removeListener("update_keyframe_selection",w),delete window._azureApplyEasing,delete window._azureApplyEasingArg,delete window._azureToggleCatmullrom,S(),_=!1)}const A=["azl_bar_catmullrom","azl_bar_easing","azl_bar_easing_azure","azl_bar_easing_type","azl_bar_easing_arg"];function w(){if(S(),"azure_model"!==Format?.id)return;const t=document.querySelector("#keyframe_type_label > div");t&&(t.hidden=!0);const e=Timeline.selected;if(!e||!e.length)return;const n=function(t){const e=new Map;for(const n of t){e.has(n.animator)||e.set(n.animator,{});const t=e.get(n.animator);t[n.channel]||(t[n.channel]=[]),t[n.channel].push(n),t[n.channel].sort((t,e)=>t.time-e.time)}return e}(Timeline.keyframes);if(!e.every(t=>t.animator instanceof BoneAnimator&&!(t=>(n.get(t.animator)?.[t.channel]||[]).indexOf(t)<1)(t)))return;const r=document.getElementById("panel_keyframe");r&&(function(t,e){const n=T(e,t=>{const e=t.interpolation;return e&&"linear"!==e?e:null},null,"(mixed)"),r=z("azl_bar_catmullrom",t),i=document.createElement("p");i.style.cssText="min-width:100%;margin:4px 0 2px 0;padding: 0 0 0 10px;color:var(--color-text);",i.textContent="Interpolation",r.appendChild(i);for(const{id:t,label:e,title:i}of E){const o=n===t,a=document.createElement("button");a.id="azl_btn_interp_"+(t??"azure"),a.className="dark_bordered",a.textContent=e,a.title=i,a.style.cssText="padding:2px 10px;margin:1px;cursor:pointer;"+(o?"color:var(--color-accent);border-color:var(--color-accent);":""),a.onclick=()=>window._azureSetInterpolation(t),r.appendChild(a)}}(r,e),function(t,e){const n=e.every(t=>!!t.interpolation&&"linear"!==t.interpolation),r=T(e,t=>t.easing,u,"(mixed)"),i=function(t){if(!t||"linear"===t)return"linear";if("step"===t)return"step";const e=String(t).match(/^ease(?:InOut|In|Out)([\w]+)$/i);return e?e[1].toLowerCase():t.toLowerCase()}(r),o=function(t){const e=String(t).match(/^ease(InOut|In|Out)/i);if(!e)return"in";const n=e[1].toLowerCase();return"inout"===n?"inout":n}(r),a=z("azl_bar_easing",t),l=document.createElement("p");l.style.cssText="min-width:100%;margin:4px 0 2px 0;padding: 0 0 0 10px;color:var(--color-text);",l.textContent="AzureLib Easings",a.appendChild(l);const f=z("azl_bar_easing_azure",t);f.style.flexWrap="wrap";for(const{id:t,label:e}of j){const r=!n&&t===i,a=B[t]||"",u=document.createElement("button");u.id=`azl_kf_easing_${t}`,u.className="dark_bordered",u.title=`Switch to ${e} easing`,u.style.cssText=`\n padding: 2px 6px;\n margin: 1px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 3px;\n ${r?"color:var(--color-accent);border-color:var(--color-accent);":""}\n `,u.innerHTML=`${a}${e}`,u.onclick=()=>{I(C(t,o))},f.appendChild(u)}if(!n&&"linear"!==i&&"step"!==i){const e=z("azl_bar_easing_type",t),n=document.createElement("p");n.style.cssText="min-width:100%;margin:4px 0 2px 0;padding:0;color:var(--color-text);",n.textContent="Type",e.appendChild(n);for(const{id:t,label:n}of O){const r=t===o,a=document.createElement("button");a.id=`azl_kf_type_${t}`,a.className="dark_bordered",a.textContent=n,a.style.cssText=`\n padding: 2px 10px;\n margin: 1px;\n cursor: pointer;\n ${r?"color:var(--color-accent);border-color:var(--color-accent);":""}\n `,a.onclick=()=>{I(C(i,t))},e.appendChild(a)}}if(e.every(t=>s(t.easing))){const n=(p=e[0].easing)?p.includes("Back")?"Overshoot":p.includes("Elastic")||p.includes("Bounce")?"Bounciness":"step"===p?"Steps":"Arg":"Arg",r=c(e[0].easing),i=T(e,t=>Array.isArray(t.easingArgs)&&t.easingArgs.length?t.easingArgs[0]:r,r,r);z("azl_bar_easing_arg",t).innerHTML=`\n

${n}

\n `}var p}(r,e))}const E=[{id:null,label:"Azure Easing",title:"Use AzureLib custom easing (see section below)"},{id:"catmullrom",label:"Smooth",title:"Bedrock catmullrom spline (BB: Smooth)"},{id:"bezier",label:"Bezier",title:"Bezier curve interpolation (BB: Bezier)"},{id:"step",label:"Step",title:"Discrete step / hold (BB: Step)"}],j=[{id:"linear",label:"Linear"},{id:"step",label:"Step"},{id:"sine",label:"Sine"},{id:"quad",label:"Quad"},{id:"cubic",label:"Cubic"},{id:"quart",label:"Quart"},{id:"quint",label:"Quint"},{id:"expo",label:"Expo"},{id:"circ",label:"Circ"},{id:"back",label:"Back"},{id:"elastic",label:"Elastic"},{id:"bounce",label:"Bounce"}],O=[{id:"in",label:"In"},{id:"out",label:"Out"},{id:"inout",label:"In/Out"}];function I(t){t&&"-"!==t&&(Undo.initEdit({keyframes:Timeline.selected}),Timeline.selected.forEach(e=>{e.easing=t,e.interpolation&&"linear"!==e.interpolation&&(e.interpolation="linear")}),Undo.finishEdit("Set keyframe easing"),w())}function k(t){const e=$(t).val();""!==e&&"-"!==e&&(Undo.initEdit({keyframes:Timeline.selected}),Timeline.selected.forEach(t=>{t.easingArgs=[l(t,String(e).trim())]}),Undo.finishEdit("Set keyframe easing argument"))}function R(t){Undo.initEdit({keyframes:Timeline.selected}),Timeline.selected.forEach(e=>{null==t?e.interpolation="linear":(e.interpolation=t,e.easing=u,e.easingArgs=void 0)}),Undo.finishEdit("Set keyframe interpolation"),w()}function L(t){R(!1===t?null:"catmullrom")}function N(){}function z(t,e){const n=document.createElement("div");return n.id=t,n.className="bar flex",n.style.flexWrap="wrap",n.style.alignItems="center",n.style.gap="2px",n.style.marginTop="4px",e.appendChild(n),n}function S(){A.forEach(t=>document.getElementById(t)?.remove());const t=document.querySelector("#keyframe_type_label > div");t&&(t.hidden=!1)}function T(t,e,n,r){const i="function"==typeof e?e:t=>t[e];if(0===t.length)return n;if(1===t.length)return i(t[0])??n;const o=(0,a.uniq)(t.map(i));return 1===o.length?o[0]:r}function C(t,e){return"linear"===t?"linear":"step"===t?"step":`ease${"inout"===e?"InOut":"out"===e?"Out":"In"}${t.charAt(0).toUpperCase()}${t.slice(1)}`}const B={linear:'',step:'',sine:'',quad:'',cubic:'',quart:'',quint:'',expo:'',circ:'',back:'',elastic:'',bounce:''},M=new Map,P=t=>t?.includes("Back")||t?.includes("Elastic")||t?.includes("Bounce")||"step"===t;function F(t){const e=["(","[","{"],n=[")","]","}"];if("number"==typeof t)return-t;if(""===t||"0"===t)return t;if(!isNaN(parseFloat(t))&&isFinite(t))return(-parseFloat(t)).toString();let r,i=!0,o=0,a="";for(let u of t){if(!o){let t;if("-"===u&&"*"!==r&&"/"!==r){i||r||(a+="+"),i=!1;continue}if("+"===u&&"*"!==r&&"/"!==r){a+="-",i=!1;continue}"?:".includes(u)?(i=!0,t=u):i?(a+="-",i=!1):"+-*/&|".includes(u)&&(t=u),r=t||r}e.includes(u)&&o++,n.includes(u)&&o--,a+=u}return a}let D=null,U=null,G=!1;function W(){G||(function(){if(!D){D={getLerp:Keyframe.prototype.getLerp,compileBedrockKeyframe:Keyframe.prototype.compileBedrockKeyframe,getUndoCopy:Keyframe.prototype.getUndoCopy,extend:Keyframe.prototype.extend};try{U=BarItems.reverse_keyframes?.condition||null}catch{U=null}}}(),Keyframe.prototype._azurePatched||(Keyframe.prototype.getLerp=q,Keyframe.prototype.compileBedrockKeyframe=V,Keyframe.prototype.getUndoCopy=H,Keyframe.prototype.extend=J,Keyframe.prototype._azurePatched=!0),BarItems.reverse_keyframes&&!BarItems.reverse_keyframes._azurePatched&&(U||(U=BarItems.reverse_keyframes.condition),BarItems.reverse_keyframes.condition=Z,BarItems.reverse_keyframes._azurePatched=!0),Blockbench.on("interpolate_keyframes",X),G=!0)}function K(){if(G&&D)try{Keyframe.prototype._azurePatched&&(Keyframe.prototype.getLerp=D.getLerp,Keyframe.prototype.compileBedrockKeyframe=D.compileBedrockKeyframe,Keyframe.prototype.getUndoCopy=D.getUndoCopy,Keyframe.prototype.extend=D.extend,delete Keyframe.prototype._azurePatched),BarItems.reverse_keyframes?._azurePatched&&U&&(BarItems.reverse_keyframes.condition=U,delete BarItems.reverse_keyframes._azurePatched);try{Blockbench.removeListener("interpolate_keyframes",X)}catch{}}finally{G=!1}}function X(t){if("azure_model"!==Format?.id)return;const e=t&&t.keyframe_before,n=t&&t.keyframe_after;if(!e||!n)return;const r=t=>!t||"linear"===t;if(!r(e.interpolation)||!r(n.interpolation))return;if(e.has_expressions||n.has_expressions)return;const i=n.easing||u,o=y[i]||y.linear;let a;if(P(i)){const e=Array.isArray(n.easingArgs)&&n.easingArgs.length?n.easingArgs[0]:c(i);a=o(t.t,e)}else a=o(t.t);if("number"!=typeof a||Number.isNaN(a))return;const s=e.data_points.length>1?1:0;return{value:["x","y","z"].map(t=>{const r=e.calc(t,s);return r+(n.calc(t,0)-r)*a})}}function q(t,e,n){if("azure_model"!==Format?.id)return D.getLerp.apply(this,arguments);if("catmullrom"===t.interpolation||"bezier"===t.interpolation||"step"===t.interpolation)return D.getLerp.apply(this,arguments);const r=t.easing||u;if(!(r!==u||t.easingArgs&&t.easingArgs.length))return D.getLerp.apply(this,arguments);let i=y[r]||y.linear;if(P(r)){const e=Array.isArray(t.easingArgs)&&t.easingArgs.length?t.easingArgs[0]:c(r);i=i.bind(null,e)}const o=i(n),a=function(t,e,n){return t+(e-t)*n}(this.calc(e),t.calc(e),o);if(Number.isNaN(a))throw new Error("[AzureLib] Invalid easing result");return a}function V(){if("azure_model"!==Format?.id)return D.compileBedrockKeyframe.apply(this,arguments);const t=D.compileBedrockKeyframe.apply(this,arguments),e=t=>Array.isArray(t)?[...t]:t;if("catmullrom"===this.interpolation){const n="catmullrom";return t&&"object"==typeof t?{...void 0!==t.pre?{pre:e(t.pre)}:{},post:e(t.post||t),lerp_mode:n}:{post:e(t),lerp_mode:n}}if("bezier"===this.interpolation)return t&&"object"==typeof t?{...void 0!==t.pre?{pre:e(t.pre)}:{},...void 0!==t.post?{post:e(t.post)}:{}}:t;const n=this.getPreviousKeyframe?.();if(1===this.data_points.length&&n&&"step"===n.interpolation)return t&&"object"==typeof t?{...void 0!==t.pre?{pre:e(t.pre)}:{},...void 0!==t.post?{post:e(t.post)}:{}}:t;if(t&&"object"==typeof t&&!Array.isArray(t)&&(void 0!==t.pre||void 0!==t.post)){const n={...void 0!==t.pre?{pre:e(t.pre)}:{},...void 0!==t.post?{post:e(t.post)}:{},...void 0!==t.lerp_mode?{lerp_mode:t.lerp_mode}:{}};return this.easing&&this.easing!==u&&(n.easing=this.easing),P(this.easing)&&Array.isArray(this.easingArgs)&&this.easingArgs.length&&(n.easingArgs=[...this.easingArgs]),n}return(t=>{if(t&&"object"==typeof t&&!Array.isArray(t)){const e={...t};return void 0===e.easing&&void 0!==this.easing&&(e.easing=this.easing),void 0===e.easingArgs&&P(this.easing)&&Array.isArray(this.easingArgs)&&this.easingArgs.length&&(e.easingArgs=[...this.easingArgs]),e}const n={vector:e(t)};return this.easing&&this.easing!==u&&(n.easing=this.easing),P(this.easing)&&Array.isArray(this.easingArgs)&&this.easingArgs.length&&(n.easingArgs=[...this.easingArgs]),n.easing||n.easingArgs?n:n.vector})(t)}function H(){const t=D.getUndoCopy.apply(this,arguments);return"azure_model"===Format?.id&&(t.easing=this.easing,t.interpolation=this.interpolation,P(this.easing)&&(t.easingArgs=this.easingArgs?[...this.easingArgs]:void 0)),t}function J(t){const e=Object.assign({},t);if("azure_model"!==Format?.id)return D.extend.apply(this,[e]);const n=(t,e=[0,0,0])=>Array.isArray(t)?[void 0!==t[0]?t[0]:e[0],void 0!==t[1]?t[1]:e[1],void 0!==t[2]?t[2]:e[2]]:[...e],r=t=>{if(Array.isArray(t))return{vector:n(t)};if(t&&"object"==typeof t){const e={};if(void 0!==t.easing&&(e.easing=t.easing),void 0!==t.interpolation&&(e.interpolation=t.interpolation),Array.isArray(t.easingArgs)&&(e.easingArgs=[...t.easingArgs]),Array.isArray(t.vector))return e.vector=n(t.vector),e;if("x"in t&&"y"in t&&"z"in t)return e.vector=n([t.x,t.y,t.z]),e}return{vector:null}},i=r(e.values),o=r(e.pre),a=r(e.post),u=i.easing??e.easing??a.easing;void 0!==u&&(this.easing=u);const s=new Set(["catmullrom","bezier","step"]);let c=e.interpolation??a.interpolation;void 0!==e.lerp_mode&&"linear"!==e.lerp_mode&&(c=e.lerp_mode),void 0!==c&&s.has(c)?this.interpolation=c:this.interpolation="linear";const l=i.easingArgs??e.easingArgs??a.easingArgs;void 0!==l&&(this.easingArgs=[...l]);const f=Object.assign({},e);["values","pre","post"].forEach(t=>{f[t]&&"object"==typeof f[t]&&!Array.isArray(f[t])&&delete f[t]});const p=D.extend.apply(this,[f]),h=t=>(Array.isArray(this.data_points)||(this.data_points=[]),this.data_points[t]||(this.data_points[t]={}),this.data_points[t]),d=t=>{if("string"!=typeof t)return t;const e=Number(t);return isNaN(e)?t:e},v=(t,e)=>{e&&(t.x=d(e[0]),t.y=d(e[1]),t.z=d(e[2]),delete t.vector)};return o.vector&&a.vector?(v(h(0),o.vector),v(h(1),a.vector)):o.vector?v(h(0),o.vector):!o.vector&&a.vector&&"catmullrom"===this.interpolation?v(h(0),a.vector):i.vector?v(h(0),i.vector):a.vector&&v(h(0),a.vector),p}function Z(){if(Z._inAzureCall)return!1;try{return Z._inAzureCall=!0,U&&"function"==typeof U?U.call(BarItems.reverse_keyframes)&&"azure_model"!==Format?.id:!1}finally{Z._inAzureCall=!1}}const Q=JSON.parse('{"meta":{"format_version":"3.2","model_format":"azure_model","box_uv":true},"name":"CustomArmor","geo_name":"CustomArmor","resolution":{"width":64,"height":64},"elements":[{"name":"dontTouch","from":[-4,24,-4],"to":[4,32,4],"autouv":1,"color":0,"export":false,"locked":true,"origin":[0,0,0],"uuid":"9675593e-b27d-b70e-e1ea-1fc29f46a294"},{"name":"dontTouch","from":[-4,12,-2],"to":[4,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[0,24,0],"uuid":"fa43156a-2a62-948c-082f-483d525f6d1f"},{"name":"dontTouch","from":[4,12,-2],"to":[8,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"aa51170c-8b32-fb62-71f1-58ac0b7785a8"},{"name":"dontTouch","from":[-8,12,-2],"to":[-4,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"bf2c2539-20e3-cfcc-94c0-491734019889"},{"name":"dontTouch","from":[-4,0,-2],"to":[0,12,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"17b9bae0-356a-9bba-fad9-4672e2671191"},{"name":"dontTouch","from":[0,0,-2],"to":[4,12,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"7b31bac4-dc40-2b93-1204-7bbdcfe7d924"},{"name":"dontTouch","from":[-4,12,-2],"to":[4,16,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[0,12,0],"uuid":"aa51250c-8b32-fb62-71f1-58ac0b7785a8"}],"outliner":[{"name":"bipedHead","uuid":"d340b6fa-56aa-9c0f-3560-7a067643b77d","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":["9675593e-b27d-b70e-e1ea-1fc29f46a294",{"name":"armorHead","uuid":"6ab88dea-c816-d2bb-6be9-05ed7838da97","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":[]}]},{"name":"bipedBody","uuid":"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":["fa43156a-2a62-948c-082f-483d525f6d1f",{"name":"armorBody","uuid":"282fcdbb-8ea9-4a13-4154-f2ed20d696c8","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":[]}]},{"name":"bipedRightArm","uuid":"d8113cc7-7e10-0930-259e-b8e4211ce9da","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[5,22,0],"children":["aa51170c-8b32-fb62-71f1-58ac0b7785a8",{"name":"armorRightArm","uuid":"c5300e23-fd2f-b56c-3552-45d6650e11c6","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[5,22,0],"children":[]}]},{"name":"bipedLeftArm","uuid":"3b8901e8-3420-0834-51eb-76d64ff2ae8f","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-5,22,0],"children":["bf2c2539-20e3-cfcc-94c0-491734019889",{"name":"armorLeftArm","uuid":"b0d41a53-f4ce-53c1-f899-5a2048c90ac2","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-5,22,0],"children":[]}]},{"name":"bipedWaist","uuid":"d8125cc7-7e10-0930-259e-b8e4211ce9da","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,12,0],"children":["aa51250c-8b32-fb62-71f1-58ac0b7785a8",{"name":"armorWaist","uuid":"c9000e23-fd2f-b56c-3552-45d6650e11c6","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,12,0],"children":[]}]},{"name":"bipedLeftLeg","uuid":"37231be7-a8ef-22ca-7fea-40aed58003bb","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":["17b9bae0-356a-9bba-fad9-4672e2671191",{"name":"armorLeftLeg","uuid":"e4b19746-2d17-1f56-befe-00718165ae50","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":[]},{"name":"armorLeftBoot","uuid":"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":[]}]},{"name":"bipedRightLeg","uuid":"45c031a5-b6be-e0a7-5454-b45d07f28429","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":["7b31bac4-dc40-2b93-1204-7bbdcfe7d924",{"name":"armorRightLeg","uuid":"60238f18-e74b-c863-cb45-2e2f162221bd","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":[]},{"name":"armorRightBoot","uuid":"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":[]}]}],"textures":[]}'),Y="Forge 1.12 - 1.16";var tt;tt=[Y,"Fabric 1.15 - 1.16"],Object.fromEntries(tt.map(t=>[t,t]));const et="AZURE_ENTITY",nt="AZURE_ARMOR",rt={[et]:"Entity/Block/Item",[nt]:"Armor"},it=Object.freeze({formatVersion:2,modSDK:Y,objectType:et,entityType:"Entity/Block/Item",javaPackage:"com.example.mod",animFileNamespace:"modid",animFilePath:"animations/animation.json"}),ot=Object.assign({},it);function at(){Modes.selected.select(),ot.objectType===nt?0===Outliner.root.length?(Codecs.project.parse(Q),console.log("[AzureLib] Loaded armor template.")):alert("Cannot apply Armor Template — please select Armor type in an empty project."):ot.objectType===et&&(Project.parent="builtin/entity")}const ut=ot;var st=n(179),ct=n.n(st);const lt="azure_animation",ft="1.8.0",pt=new Map;function ht(t){return!(!t||"object"!=typeof t||Array.isArray(t)||void 0===t.lerp_mode&&void 0===t.pre&&void 0===t.post)}function dt(t){if(Array.isArray(t))return t;if(t&&"object"==typeof t){if(Array.isArray(t.vector))return t.vector;if(t.vector&&"object"==typeof t.vector&&Array.isArray(t.vector.vector))return t.vector.vector}return null}function vt(t){return String(t).replace(/^(-?\d+)\.0+$/,"$1")}function gt(t){return Array.isArray(t)&&t.length?t.filter(t=>t&&"object"==typeof t).map(t=>({file_id:String(t.file_id||"").trim(),animations:Array.isArray(t.animations)?t.animations.map(t=>String(t||"").trim()).filter(Boolean):[]})).filter(t=>t.file_id&&t.animations.length):[]}function mt(t){return gt(t).map(t=>({file_id:t.file_id,animations:[...t.animations]}))}function yt(t){return mt(pt.get(t||"")||[])}function _t(t,e){const n=t||"",r=gt(e);r.length?pt.set(n,r):pt.delete(n)}function bt(t,e){const n=mt(e);return n.length?t.includes=n:delete t.includes,t}function xt(t){const e={};"loop"===t.loop?e.loop=!0:"hold"===t.loop?e.loop="hold_on_last_frame":t.loop&&(e.loop=t.loop),t.override&&(e.override_previous_animation=!0),t.anim_time_update&&(e.anim_time_update=t.anim_time_update.replace(/;\n/g,";")),t.blend_weight&&(e.blend_weight=t.blend_weight.replace(/;\n/g,";")),t.length&&(e.animation_length=Math.round(1e6*t.length)/1e6);const n={},r=t.animators.effects,i=Object.values(t.animators).filter(t=>t instanceof BoneAnimator);for(const t of i){const e=t.name,r={};for(const e of["position","rotation","scale"]){const n=t.keyframes.filter(t=>t.channel===e);if(n.length)if(n.sort((t,e)=>t.time-e.time),1===n.length){const t=n[0],i={vector:jt(t,e,!0)},o=t.easing;o&&o!==u&&(i.easing=o),s(o)&&Array.isArray(t.easingArgs)&&t.easingArgs.length&&(i.easingArgs=[...t.easingArgs]),r[e]=i}else{const t={};for(const r of n)t[vt($t(r.time))]=At(r,e,n);r[e]=t}}Object.keys(r).length&&(n[e]=r)}if(Object.keys(n).length&&(e.bones=n),r&&Array.isArray(r.keyframes)&&r.keyframes.length){const t={},n={},i={};for(const e of r.keyframes){const r=vt($t(e.time));if("sound"===e.channel){const n=(e.data_points||[]).map(t=>"string"==typeof t?{effect:t}:{...t}).filter(t=>t.effect);1===n.length?t[r]=n[0]:n.length>1&&(t[r]=n)}else if("particle"===e.channel){const t=(e.data_points||[]).map(t=>{const e={};return t.effect&&(e.effect=t.effect),void 0!==t.locator&&(e.locator=t.locator),void 0!==t.script&&(e.script=t.script),Object.keys(e).length?e:null}).filter(Boolean);1===t.length?n[r]=t[0]:t.length>1&&(n[r]=t)}else if("timeline"===e.channel){const t=e.data_points?.[0]?.script||"";t&&(i[r]=t)}}Object.keys(t).length&&(e.sound_effects=t),Object.keys(n).length&&(e.particle_effects=n),Object.keys(i).length&&(e.timeline=i)}return e}function At(t,e,n){const r=jt(t,e,!0),i=t.interpolation;if("catmullrom"===i){const n={post:r,lerp_mode:"catmullrom"},i=Ot(t,e);return i&&(n.pre=i),n}if("bezier"===i){const n=Ot(t,e);return n?{pre:n,post:r}:{post:r}}if("step"===i){const i=It(t,n),o=Ot(t,e)||(i?jt(i,e,!0):null);return o?{pre:o,post:r}:{post:r}}const o=It(t,n);if(o&&"step"===o.interpolation){const n={pre:Ot(t,e)||jt(o,e,!0),post:r};return t.easing&&t.easing!==u&&(n.easing=t.easing),s(t.easing)&&Array.isArray(t.easingArgs)&&t.easingArgs.length&&(n.easingArgs=[...t.easingArgs]),n}const a=t.easing,c=r.some(t=>"string"==typeof t&&isNaN(Number(t))),l=a&&a!==u&&!c,f=l&&s(a)&&Array.isArray(t.easingArgs)&&t.easingArgs.length,p={vector:r};return l&&(p.easing=a),f&&(p.easingArgs=[...t.easingArgs]),p}function wt(t){return"string"==typeof(t=Et(t))?F(t):"number"==typeof t?0===t?0:-t:t}function Et(t){if(null==t)return 0;if("string"==typeof t){const e=t.trim();if(""===e)return 0;const n=Number(e);return Number.isNaN(n)?t:n}return t}function jt(t,e,n){const r=t.data_points?.[t.data_points.length>1?1:0]||t.data_points?.[0];if(!r)return[0,0,0];let i=Et(r.x),o=Et(r.y),a=Et(r.z);return n&&Blockbench.isNewerThan("4.99")&&("rotation"===e?(i=wt(i),o=wt(o)):"position"===e&&(i=wt(i))),[kt(i),kt(o),kt(a)]}function Ot(t,e){if(!t.data_points||t.data_points.length<2)return null;const n=t.data_points[0];let r=Et(n.x),i=Et(n.y),o=Et(n.z);return Blockbench.isNewerThan("4.99")&&("rotation"===e?(r=wt(r),i=wt(i)):"position"===e&&(r=wt(r))),[kt(r),kt(i),kt(o)]}function It(t,e){const n=e.indexOf(t);return n>0?e[n-1]:null}function $t(t){return Math.round(1e6*t)/1e6}function kt(t){return"number"==typeof t?Math.round(1e5*t)/1e5:t}function Rt(t,e,n){const r=new Animation({name:t,path:n,saved_name:t,loop:!0===e.loop?"loop":"hold_on_last_frame"===e.loop?"hold":e.loop||"once",override:!!e.override_previous_animation,anim_time_update:"string"==typeof e.anim_time_update?e.anim_time_update.replace(/;(?!$)/,";\n"):e.anim_time_update||"",blend_weight:"string"==typeof e.blend_weight?e.blend_weight.replace(/;(?!$)/,";\n"):e.blend_weight||"",length:Number(e.animation_length||0)}).add();if(e.sound_effects||e.particle_effects||e.timeline||e.instructions){const t=function(t){return t.animators.effects||(t.animators.effects=new EffectAnimator(t)),t.animators.effects}(r);!function(t,e){if(e.sound_effects)for(const n in e.sound_effects){let r=e.sound_effects[n];Array.isArray(r)||(r=[r]);const i=r.filter(Boolean).map(t=>"string"==typeof t?{effect:t}:{...t});t.addKeyframe({channel:"sound",time:parseFloat(n),data_points:i})}if(e.particle_effects)for(const n in e.particle_effects){let r=e.particle_effects[n];Array.isArray(r)||(r=[r]);const i=r.filter(Boolean).map(t=>{const e={...t};return e.pre_effect_script&&!e.script&&(e.script=e.pre_effect_script),e});t.addKeyframe({channel:"particle",time:parseFloat(n),data_points:i})}const n=e.timeline||e.instructions;if(n)for(const e in n){const r=n[e],i=Array.isArray(r)?r.join("\n"):r;t.addKeyframe({channel:"timeline",time:parseFloat(e),data_points:[{script:i}]})}}(t,e)}if(e.bones)for(const t in e.bones){const n=e.bones[t],i=Group.all.find(e=>e.name.toLowerCase()===t.toLowerCase()),o=i?i.uuid:guid(),a=new BoneAnimator(o,r,t);r.animators[o]=a;for(const t in n)Animator.possible_channels[t]&&Lt(a,t,n[t])}return r.calculateSnappingFromKeyframes?.(),!Animation.selected&&Animator.open&&r.select(),r}function Lt(t,e,n){if(!n)return;const r=(n,r)=>{const i=function(t,e){if(Array.isArray(t)){const n=St(zt(t),e);return{easing:u,easingArgs:void 0,interpolation:void 0,uniform:!1,data_points:[{x:n[0],y:n[1],z:n[2]}]}}if(!t||"object"!=typeof t)return null;if((n=t)&&"object"==typeof n&&!Array.isArray(n)&&(void 0!==n.vector||void 0!==n.easing)&&!ht(t)){const n=St(zt(dt(t.vector||t)||[0,0,0]),e);return{easing:t.easing||u,easingArgs:Array.isArray(t.easingArgs)&&t.easingArgs.length?t.easingArgs:void 0,interpolation:void 0,uniform:!1,data_points:[{x:n[0],y:n[1],z:n[2]}]}}var n;if(ht(t)){const n=t.lerp_mode,r="catmullrom"===n?"catmullrom":"linear"===n?void 0:void 0!==t.pre||void 0!==t.post?"bezier":void 0,i=[],o=dt(t.post),a=dt(t.pre);if(a){const t=St(zt(a),e);i.push({x:t[0],y:t[1],z:t[2]})}const s=o?St(zt(o),e):[0,0,0];return i.push({x:s[0],y:s[1],z:s[2]}),{easing:u,easingArgs:void 0,interpolation:r,uniform:!1,data_points:i.length?i:[{x:0,y:0,z:0}]}}const r=Nt(t.x??0),i=Nt(t.y??0),o=Nt(t.z??0);return{easing:u,easingArgs:void 0,interpolation:void 0,uniform:!1,data_points:[{x:r,y:i,z:o}]}}(r,e);i&&t.addKeyframe({time:n,channel:e,easing:i.easing,easingArgs:i.easingArgs,interpolation:i.interpolation,uniform:i.uniform,data_points:i.data_points})};if(Array.isArray(n)||void 0!==n.vector&&Object.keys(n).length<=3){const t=dt(n)||n;if(Array.isArray(t))return void r(0,t)}if(void 0!==n.lerp_mode||void 0!==n.pre||void 0!==n.post||void 0!==n.vector&&"object"!=typeof n.vector)r(0,n);else for(const t in n)r(parseFloat(t),n[t])}function Nt(t){if("string"!=typeof t)return t;const e=Number(t);return isNaN(e)?t:e}function zt(t){return t.map(Nt)}function St(t,e){if(!Blockbench.isNewerThan("4.99"))return t;const n=[...t];return"rotation"===e?(n[0]=F(n[0]),n[1]=F(n[1])):"position"===e&&(n[0]=F(n[0])),n}function Tt(t){return JSON.stringify(t,null,"\t").replace(/\[\s*([\s\S]*?)\s*\]/g,(t,e)=>{const n=e.trim();return n?/[{\[\]]/.test(n)?t:"["+n.split(/,\s*/).map(t=>t.trim()).join(", ")+"]":"[]"})}new Set(["linear","catmullrom"]);const Ct="undefined"!=typeof isApp&&isApp?n(9896):null;function Bt(t){if(!Ct||!t)return null;try{if(!Ct.existsSync(t))return null;const e=Ct.readFileSync(t,"utf-8"),n="function"==typeof autoParseJSON?autoParseJSON(e,!1):JSON.parse(e);return n&&"object"==typeof n.animations?n:null}catch(t){return null}}let Mt=null;function Pt(){return Mt||("undefined"==typeof AnimationCodec?(console.warn("[AzureLib] AnimationCodec API is unavailable in this Blockbench version."),null):(Mt=new AnimationCodec(lt,{multiple_per_file:!0,pickFile(){Blockbench.import({resource_id:"azure_animation",type:"AzureLib Animation",extensions:["json"],readtype:"text",multiple:!0},async t=>{if(t&&t.length)for(const e of t)await this.importFile(e)})},importFile(t,e){let n;try{n="function"==typeof autoParseJSON?autoParseJSON(t.content,!1):JSON.parse(t.content)}catch(t){return console.error("[AzureLib] Failed to parse animation file:",t),Blockbench.showQuickMessage("[AzureLib] Failed to parse animation file."),[]}return t.json=n,this.loadFile(t,null,e)},loadFile(t,e,n){const r=t?.json||("function"==typeof autoParseJSON?autoParseJSON(t.content,!1):JSON.parse(t.content));if(!r||"object"!=typeof r.animations)return Blockbench.showQuickMessage("[AzureLib] No animations found in file."),[];const i=t.path||"";_t(i,r.includes||[]);const o=[];for(const[t,n]of Object.entries(r.animations)){if(Array.isArray(e)&&e.length&&!e.includes(t))continue;const r=Rt(t,n,i);r.saved=!0,o.push(r)}return!n&&o.length&&(Animation.selected=o[0]),o},compileFile(t=Animation.all){const e=Array.isArray(t)?t:Animation.all,n=e.length&&e[0].path||"",r=bt({format_version:ft,animations:{}},yt(n));for(const t of e)t?.name&&(r.animations[t.name]=xt(t));return r},write:(t,e)=>Tt(t),saveAnimation(t,e){const n=()=>bt({format_version:ft,animations:{[t.name]:xt(t)}},yt(t.path));if(!isApp||!t.path||e)return void Blockbench.export({resource_id:"azure_animation",type:"AzureLib Animation",extensions:["json"],name:(Project?.geometry_name||Project?.name||"animation")+".animation",startpath:t.path,content:Tt(n())},e=>{const n=t.path||"";_t(e,yt(n)),e!==n&&n&&pt.delete(n),t.path=e,t.saved=!0,t.saved_name=t.name});let r=n();const i=Bt(t.path);if(i){const e=r.animations[t.name];r=i,t.saved_name&&t.saved_name!==t.name&&delete r.animations[t.saved_name],r.animations[t.name]=e,bt(r,yt(t.path));const n=Object.keys(r.animations),o=Animation.all.filter(e=>e.path===t.path).map(t=>t.name);let a=!1,u=0;for(const t of o){const e=n.indexOf(t);-1!==e&&(e{t[e]=r.animations[e]}),r.animations=t}}Blockbench.writeFile(t.path,{content:Tt(r)},e=>{t.saved=!0,t.saved_name=t.name,t.path=e})},exportFile(t,e){const n=t||"",r=Animation.all.filter(t=>(t.path||"")===n);if(!e&&isApp&&t&&Ct&&Ct.existsSync(t))return void r.forEach(t=>{t.saved||t.save()});const i=Tt(this.compileFile(r));Blockbench.export({resource_id:"azure_animation",type:"AzureLib Animation",extensions:["json"],name:(Project?.geometry_name||Project?.name||"animation")+".animation",startpath:t,content:i},t=>{const e=n||"",i=yt(e);_t(t,i),t!==e&&e&&pt.delete(e),r.forEach(e=>{e.path=t,e.saved=!0,e.saved_name=e.name})})},deleteAnimationFromFile(t){if(!Ct||!t.path)return;const e=Bt(t.path);e&&e.animations?.[t.name]&&(delete e.animations[t.name],bt(e,yt(t.path)),Blockbench.writeFile(t.path,{content:Tt(e)}))}}),Mt))}let Ft=null;const Dt=globalThis.invertMolang||F;let Ut=!1,Gt=!1,Wt=null;function Kt(){return globalThis.Codecs?.bedrock||null}function Xt(){if(Gt)return;Gt=!0;const t=globalThis.Codecs?.project,e=globalThis.Codecs?.bedrock,n=Wt||("undefined"!=typeof ModelFormat&&globalThis.Codecs?.project?(Wt=new ModelFormat({id:"azure_model",name:"AzureLib Animated Model",category:"minecraft",description:"Animated model for Java mods using AzureLib.",icon:"view_in_ar",rotate_cubes:!0,box_uv:!0,optional_box_uv:!0,single_texture:!0,bone_rig:!0,centered_grid:!0,animated_textures:!0,select_texture_for_particles:!0,animation_mode:!0,animation_files:!0,animation_codec:void 0,locators:!0,codec:globalThis.Codecs?.project||null,display_mode:!0,onActivation(){}}),Wt):(console.warn("[AzureLib] ModelFormat or Codecs.project unavailable"),null));t&&e&&n?(t.on("compile",Vt),t.on("parse",Ht),e.on("compile",Jt),function(){const t=Pt();if(t){if(!Ft){Ft=new Action("azl_edit_animation_includes",{name:"Edit Animation Includes",description:"Edit AzureLib animation include entries for the current animation file",icon:"playlist_add",category:"animation",condition:()=>"azure_model"===Format?.id&&Animator.open,click:()=>function(){const t=function(){const t=Animation?.selected;if(t)return t.path||"";const e=[...new Set(Animation.all.map(t=>t.path||""))];return 1===e.length?e[0]:""}(),e=yt(t),n=(r=t,Animation.all.filter(t=>(t.path||"")===(r||"")&&t.name).map(t=>t.name).sort((t,e)=>t.localeCompare(e)));var r;const i=t||"Unsaved animation file",o=new Dialog({id:"azl_animation_includes_editor",title:"Edit Animation Includes",width:760,component:{data:()=>({targetPath:t,fileLabel:i,rows:e.length?e.map(t=>({file_id:t.file_id,animations_text:t.animations.join(", ")})):[{file_id:"",animations_text:""}],animationNames:n,exampleAnimationNames:n.join(", ")}),methods:{addRow(){this.rows.push({file_id:"",animations_text:""})},removeRow(t){this.rows.splice(t,1),this.rows.length||this.addRow()}},template:'\n
\n
\n

Editing file: {{ fileLabel }}

\n

\n These entries are saved at the top level of the animation JSON as includes.\n

\n

\n Animations currently in this file: {{ exampleAnimationNames }}\n

\n
\n\n
\n Include Entries\n \n Add Include\n \n
\n \n
\n \n
\n
Include {{ index + 1 }}
\n \n Remove\n \n
\n \n
\n \n \n \n
\n
\n
\n \n '},onConfirm(){const e=gt((o.content_vue?.rows||[]).map(t=>({file_id:t.file_id,animations:String(t.animations_text||"").split(",").map(t=>t.trim()).filter(Boolean)}))),n=function(t){const e=new Map,n=[];return t.forEach((t,r)=>{(t.animations||[]).forEach(t=>{const i=String(t||"").trim();if(!i)return;const o=e.get(i);void 0!==o?n.push({name:i,firstIndex:o,secondIndex:r}):e.set(i,r)})}),n}(e);if(n.length){const t=n.slice(0,6).map(t=>`${t.name} (entries ${t.firstIndex+1} and ${t.secondIndex+1})`).join("\n");return"function"==typeof Blockbench.showMessageBox?Blockbench.showMessageBox({title:"Duplicate Included Animations",message:"Each included animation name must be unique across all include entries.\n\n"+t+(n.length>6?`\n…and ${n.length-6} more.`:"")}):Blockbench.showQuickMessage("Duplicate included animation names detected.",2400),!1}_t(t,e),Blockbench.showQuickMessage(e.length?`Saved ${e.length} animation include${1===e.length?"":"s"}.`:"Cleared animation includes.",2e3)}});o.show()}()});try{MenuBar.menus?.animation?.addAction(Ft)}catch(t){}}Formats?.azure_animation||(Formats.azure_animation={id:lt,name:"Azure Animation",animation_codec:t}),console.log("[AzureLib] Azure animation codec registered")}else console.warn("[AzureLib] AnimationCodec API is unavailable in this Blockbench version. Animation import/export will not work. Please update Blockbench.")}(),n.animation_codec=Pt()||void 0,W(),b(),Blockbench.on("close_project",qt),Blockbench.on("new_project",qt),console.log("[AzureLib] Azure codec registered (AnimationCodec-backed)")):console.warn("[AzureLib] Required codec APIs are unavailable")}function qt(){Object.assign(ut,it),Ut=!1,console.log("[AzureLib] Settings reset to defaults")}function Vt(t){"azure_model"===Format?.id&&("AZURE_ITEM_BLOCK"===ut.objectType&&(ut.objectType="AZURE_ENTITY",ut.entityType="Entity/Block/Item"),t.model.azurelibSettings=ut)}function Ht(t){const e=t.model||{},n=e?.meta?.model_format||e?.model_format;if("azure_model"!==n)return;const r=e.azurelibSettings;if(r&&"object"==typeof r){const t="AZURE_ITEM_BLOCK"===r.objectType;Object.assign(ut,ct()(r,["formatVersion"])),t&&(ut.objectType="AZURE_ENTITY",ut.entityType="Entity/Block/Item",console.warn("[AzureLib] Converted deprecated AZURE_ITEM_BLOCK -> AZURE_ENTITY")),at(),t&&!Ut&&(Ut=!0,Blockbench.showMessageBox({title:"AzureLib Conversion",message:'This project used an older "Block/Item" type.\n\nIt has been updated to the unified "Entity/Block/Item" type (AZURE_ENTITY).',buttons:["OK"]}))}else"azure_model"!==n||e.azurelibSettings||console.debug("[AzureLib] Azure model detected but no settings loaded yet.");if(Blockbench.isNewerThan("4.99")&&e.animations){console.log("[AzureLib] Applying legacy animation inversion fix for Blockbench 5.0+");for(const[,t]of Object.entries(e.animations))for(const e of Object.values(t.bones||{}))for(const[t,n]of Object.entries(e))if("rotation"===t||"position"===t)for(const e of Object.values(n))e?.vector&&("rotation"===t?(e.vector[0]=Dt(e.vector[0]),e.vector[1]=Dt(e.vector[1])):"position"===t&&(e.vector[0]=Dt(e.vector[0])))}}function Jt(t){if("azure_model"!==Format?.id)return;const e=t.model?.["minecraft:geometry"];e&&e.forEach(t=>{delete t.item_display_transforms})}function Zt(t={},e){const n=(e,n)=>void 0===t[e]?n:t[e],r={},i=Kt();if(n("comment",settings.credit.value)&&(r.credit=settings.credit.value),r.parent="builtin/entity",n("ambientocclusion",!1===Project.ambientocclusion)&&(r.ambientocclusion=!1),16===Project.texture_width&&16===Project.texture_height||(r.texture_size=[Project.texture_width,Project.texture_height]),n("front_gui_light",Project.front_gui_light)&&(r.gui_light="front"),n("overrides",Project.overrides)&&(r.overrides=Project.overrides),n("display",Object.keys(Project.display_settings).length>=1)){const t={};for(const e in DisplayMode.slots){const n=DisplayMode.slots[e];DisplayMode.slots.hasOwnProperty(e)&&Project.display_settings[n]?.export&&(t[n]=Project.display_settings[n].export())}if(Object.keys(t).length){r.display=t;for(const[,e]of Object.entries(t))Array.isArray(e?.translation)&&(e.translation=[e.translation[0],Math.round(100*(Number(e.translation[1]||0)-8))/100,e.translation[2]])}}if(Project.textures&&n("textures",Object.keys(Project.textures).length>=1))for(const t of Object.values(Project.textures))if(t.particle||1===Object.keys(Project.textures).length){const e=t.name.replace(".png","");if(/^[-._a-z0-9/]+$/.test(e)){r.textures={particle:e};break}}const o=JSON.stringify(r,null,2),a=ut.itemModelPath;return Blockbench.export({resource_id:"model",type:Codecs.java_block.name,extensions:["json"],name:(i?.fileName?.()||"model.geo").replace(".geo",".item"),startpath:a,content:o},t=>{ut.itemModelPath=t}),this}function Qt(){Blockbench.import({resource_id:"model",type:"json",extensions:["json"],readtype:"text",multiple:!1},t=>{if(!t?.[0])return;let e;try{e=JSON.parse(t[0].content)}catch{return Blockbench.showQuickMessage("[AzureLib] Invalid JSON file.")}if("builtin/entity"!==e.parent||"object"!=typeof e.display)return Blockbench.showQuickMessage("[AzureLib] Not a valid AzureLib display file.");Project.display_settings={};for(const[t,n]of Object.entries(e.display)){if(!DisplayMode.slots.includes(t))continue;const e=Array.isArray(n.rotation)?n.rotation.slice():[0,0,0],r=Array.isArray(n.translation)?n.translation.slice():[0,0,0],i=Array.isArray(n.scale)?n.scale.slice():[1,1,1];r[1]=Math.round(100*(Number(r[1]||0)+8))/100;const o=new DisplaySlot(t);Object.assign(o,{rotation:e,translation:r,scale:i}),Project.display_settings[t]=o}Project.saved=!1,DisplayMode.vue.$forceUpdate(),DisplayMode.updateDisplayBase(),Blockbench.showQuickMessage("[AzureLib] Display settings imported.")})}const Yt=Kt(),{rE:te,Ug:ee}=o,ne=`${ee.min_version} - ${ee.max_version}`;i()(e()(Blockbench.version),ne)||alert(`AzureLib Animator supports Blockbench ${ne}. Update for best results.`),function(){let t,e,n,r;Plugin.register("azurelib_utils",{...ee,version:te,await_loading:!0,onload(){Xt(),b(),W(),console.log("[AzureLib] Animator loaded"),Blockbench.on("ready",()=>{setTimeout(()=>{Keyframe.prototype._azurePatched||(console.log("[AzureLib] Reattaching keyframe overrides after ready()"),W())},0)}),Blockbench.on("new_project",()=>{"azure_model"===Format?.id&&setTimeout(()=>{try{Interface.dialog?.close()}catch{}new Dialog({id:"azurelib_model_settings",title:"AzureLib Model Settings",width:540,lines:[`AzureLib Animator v${te}`,"

Select your model type to begin.

"],form:{objectType:{label:"Object Type",type:"select",default:ut.objectType,options:rt}},onConfirm(t){Object.assign(ut,t),at()}}).show()},150)}),t=new Action({id:"export_AzureLib_model",name:"Export AzureLib .geo Model",icon:"archive",description:"Export your .geo model for AzureLib.",category:"file",condition:()=>"azure_model"===Format.id,click:()=>Yt.export()}),MenuBar.addAction(t,"file.export"),e=new Action({id:"export_AzureLib_display",name:"Export AzureLib Display Settings",icon:"icon-bb_interface",category:"file",description:"Export display settings for AzureLib.",condition:()=>"azure_model"===Format.id,click:Zt}),MenuBar.addAction(e,"file.export"),n=new Action({id:"import_AzureLib_display",name:"Import AzureLib Display Settings",icon:"icon-bow",category:"file",condition:()=>"azure_model"===Format.id,click:Qt}),MenuBar.addAction(n,"file.import"),r=new Action("azurelib_settings",{name:"AzureLib Model Settings",description:"Change model type",icon:"info",condition:()=>"azure_model"===Format.id,click:()=>{const t=new Dialog({id:"project",title:"AzureLib Model Settings",width:540,lines:[`AzureLib Animator v${te}`],form:{objectType:{label:"Object Type",type:"select",default:ut.objectType,options:rt}},onConfirm:e=>{Object.assign(ut,e),at(),t.hide()}});t.show()}}),MenuBar.addAction(r,"file.1")},onunload(){t.delete(),e.delete(),n.delete(),r.delete(),K(),x(),function(){if(!Gt)return;Gt=!1;const t=globalThis.Codecs?.project,e=globalThis.Codecs?.bedrock;t?.events?.compile?.remove?.(Vt),t?.events?.parse?.remove?.(Ht),e?.events?.compile?.remove?.(Jt),x(),K(),function(){Ft?.delete(),Ft=null;try{delete Formats?.azure_animation}catch{}Mt&&AnimationCodec?.codecs&&delete AnimationCodec.codecs[lt],Mt=null,console.log("[AzureLib] Azure animation codec unregistered")}(),Wt&&(Wt.animation_codec=void 0),console.log("[AzureLib] Azure codec unregistered")}(),M.forEach(t=>{Object.keys(t).forEach(e=>{e.startsWith("_")||(t._target[e]=t[e])})}),M.clear(),console.log("[AzureLib] Animator unloaded.")}})}()})()})(); ================================================ FILE: plugins/azurelib_utils/azurelib_utils.js.LICENSE.txt ================================================ /** * @license * Lodash * Copyright OpenJS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ ================================================ FILE: plugins/azurelib_utils/changelog.json ================================================ { "1.0.6": { "title": "1.0.6", "date": "2024-03-27", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Updates about.md for supported versions", "Updates about.md for NeoForge 1.20.4 vs 1.20.1 dependencies", "Adds bvanseg as maintainer for any bug fixes/upcoming rewrites.", "Bumps version to 1.0.6" ] }, { "title": "Fixes", "list": [ "Fixes builtin/entity not being added to display exports." ] } ] }, "1.0.7": { "title": "1.0.7", "date": "2024-05-21", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Makes builtin/entity always be part of the display export for AzureLib Projects", "Enables animated texture support for format" ] } ] }, "1.0.8": { "title": "1.0.8", "date": "2024-06-01", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Disables some logging that isn't needed.", "Now include a license with plugin info, sourced MIT" ] }, { "title": "Fixes", "list": [ "Fixes issue with easing and keyframes." ] } ] }, "1.0.9": { "title": "1.0.9", "date": "2024-06-03", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Fixes some plugin meta data inconsistencies, thanks to ewanhowell5195" ] }, { "title": "Fixes", "list": [ "Fixes crash if setting steps to 0 or nothing then clicking away, as per the issue #513" ] } ] }, "1.0.10": { "title": "1.0.10", "date": "2024-09-28", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Auto convert bedrock format into format that works properly", "Remove item display transforms from geo file exported for azure_models", "Tweaked ArmorTemplate Names/pivots" ] } ] }, "1.0.11": { "title": "1.0.11", "date": "2025-10-15", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Adds particle field support for item disply exports", "Bump support for 5.x version of Blockbench", "Adds new armorWaist bone to Armor template" ] }, { "title": "Fixes", "list": [ "Fixes wiki links" ] } ] }, "1.0.12": { "title": "1.0.12", "date": "2025-10-15", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Adds popup for model type on new project creation.", "Adds new import option to import item display settings to the display tab" ] }, { "title": "Fixes", "list": [ "Fixes animation keyframe invert from 5.x changes", "Fixes the project object type not saving properly, causing armor to always save as entity", "Fixes the output offset of item display settings." ] } ] }, "2.0.0": { "title": "2.0.0", "date": "2026-01-06", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Rewrote most of the internal code to make future maintance easier." ] }, { "title": "Fixes", "list": [ "Fixes animation keyframe export on easings and effect keyframes" ] } ] }, "2.1.0": { "title": "2.1.0", "date": "2026-04-15", "author": "AzureDoom", "categories": [ { "title": "Changes", "list": [ "Now support both Azurelib Easings and Bedrock easings in 1 project, allowing you to mix them", "Updates plugin to use the new AnimationCodec system from blockbench to help with future animation issues", "Adds support for animation includes as per https://moddedmc.wiki/en/project/azurelib/latest/docs/misc/animating/animation_includes" ] }, { "title": "Fixes", "list": [ "Fixes animation keyframe export due to BB 5.1 changes" ] } ] }, "2.1.1": { "title": "2.1.1", "date": "2026-04-27", "author": "AzureDoom", "categories": [ { "title": "Fixes", "list": [ "Fixes an issue that was preventing Azurelib easings from exporting.", "Fixes an issue with exporting display setting not being correct and incorrectly modifying the UI rendering as well.", "Fixes an issue that was preventing Azurelib easings as importing correctly.", "Fixes easings not being selected correctly when reimporting or opening old projects" ] } ] }, "2.1.2": { "title": "2.1.2", "date": "2026-05-18", "author": "AzureDoom", "categories": [ { "title": "Fixes", "list": [ "Fix blank keyframe axes exporting as newline strings." ] } ] } } ================================================ FILE: plugins/azurelib_utils/members.yml ================================================ maintainers: - AzureDoom - bvanseg - Collinvh ================================================ FILE: plugins/backup_viewer/about.md ================================================

This plugin adds a a backup tab to the start screen that allows you to quickly and easily see your project backups.

Usage

On the Recent Models view on the start screen, a new Backup tab will be added. Select this tab to view your backups. Both grid view and list view are available

================================================ FILE: plugins/backup_viewer/backup_viewer.js ================================================ let loaded, styles, oldTemplate const workScreenElement = document.getElementById("work_screen") Plugin.register("backup_viewer", { title: "Backup Viewer", icon: "icon.png", author: "Ewan Howell", description: "View the project backups from the Blockbench start screen.", tags: ["Backups", "Start screen", "Blockbench"], version: "2.1.0", min_version: "5.0.0", variant: "desktop", creation_date: "2022-12-28", has_changelog: true, website: "https://ewanhowell.com/plugins/backup-viewer/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/backup-viewer", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Backup Viewer]", onload() { const backupPath = SystemInfo.user_data_directory + osfs + "backups" fs = require("fs", { readonly: true, scope: backupPath, message: "This permission is required to read your backups directory.", optional: false }) if (!fs) { throw new Error("fs access denied") } const backups = [] function getBackups() { backups.length = 0 const backupFilePaths = fs.readdirSync(backupPath) for (const file of backupFilePaths) { const path = PathModule.join(backupPath, file) const stats = fs.statSync(path) backups.push({ id: file, path, name: file.replace(/backup_\d+\.\d+\.\d+_\d+\.\d+_?/, "").replace(/\.bbmodel$/, "") || 'no name', date: stats.mtime.toLocaleDateString(), time: stats.mtime.toLocaleTimeString().replace(/:\d+ /, " "), size: `${separateThousands(Math.round(stats.size / 1024))} KB`, timestamp: stats.mtime.getTime() }) } backups.sort((a, b) => b.timestamp - a.timestamp) } getBackups() styles = Blockbench.addCSS(` #start-screen-recent-tabs { display: flex; gap: 10px; padding-bottom: 5px; margin-top: -5px; h2 { cursor: pointer; padding: 0 10px; margin-top: -3px; &:hover { color: var(--color-light); } } .selected { border-bottom: 3px solid var(--color-accent); } } .recent-project-list .backup .icon_wrapper { padding-left: 22px; height: 22px; margin: 0 !important; } .recent-project-list .backup .recent_project_date { display: grid; grid-template-columns: 76px 56px 60px; gap: 16px; :last-child { text-align: right; } } .recent_list_grid .backup { padding: 10px 20px 12px 20px; height: initial !important; &:hover * { color: var(--color-light); } } .recent_list_grid .backup .recent_project_date { font-size: 14px; display: flex; gap: 8px; &::before { display: none; } :last-child { flex: 1; text-align: right; } } `) StartScreen.vue.$destroy() StartScreen.vue.$data.recentsView = "recents" StartScreen.vue.$data.backups = backups StartScreen.vue.$options.methods.openBackup = backup => Blockbench.read([backup.path], {}, files => { loadModelFile(files[0]) }) StartScreen.vue.$options.methods.getBackups = getBackups oldTemplate = StartScreen.vue.$options.template const newTemplate = oldTemplate.replace( `

${tl('mode.start.recent')}

`, `

${tl("mode.start.recent")}

Backups

` ).replace( `
{{ '['+tl('generic.redacted')+']' }}
`, `
{{ '['+tl('generic.redacted')+']' }}
  • {{ backup.name }} {{ backup.date }} {{ backup.time }} {{ backup.size }}
  • {{ backup.name }}

    {{ backup.date }} {{ backup.time }} {{ backup.size }}
` ) StartScreen.vue = new Vue({ el: "#start_screen", components: StartScreen.vue.$options.components, data: { ...StartScreen.vue.$data }, methods: StartScreen.vue.$options.methods, computed: StartScreen.vue.$options.computed, mounted: StartScreen.vue.$options.mounted, template: newTemplate }) if (workScreenElement.style.display === "grid") { document.getElementById("start_screen").style.display = "none" } loaded = true }, onunload() { if (loaded) { StartScreen.vue.$destroy() delete StartScreen.vue.$data.recentsView delete StartScreen.vue.$data.backups delete StartScreen.vue.$options.methods.openBackup delete StartScreen.vue.$options.methods.getBackups StartScreen.vue = new Vue({ el: "#start_screen", components: StartScreen.vue.$options.components, data: { ...StartScreen.vue.$data }, methods: StartScreen.vue.$options.methods, computed: StartScreen.vue.$options.computed, mounted: StartScreen.vue.$options.mounted, template: oldTemplate }) if (workScreenElement.style.display === "grid") { document.getElementById("start_screen").style.display = "none" } styles.delete() } } }) ================================================ FILE: plugins/backup_viewer/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2022-12-28", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "2.0.0": { "title": "2.0.0", "date": "2025-03-01", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Updated for Blockbench v4.12" ] }, { "title": "Technical Changes", "list": [ "The plugin has been completely rewritten" ] }, { "title": "Bug fixes", "list": [ "The backup list no longer disappears after changing tabs" ] } ] }, "2.1.0": { "title": "2.1.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] } ] } } ================================================ FILE: plugins/baked_ambient_occlusion/LICENSE.MD ================================================ MIT License Copyright (c) 2025 Kai Salmon 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. ================================================ FILE: plugins/baked_ambient_occlusion/README.md ================================================ # Mr Salmon's Baked Ambient Occlusion for Blockbench Generate instant shaded textures for your models, with one click! Ambient occlusion works by working out how much light can reach each pixel on the model: areas in crevices and divots receive less light than those at the edge of the model. By exaggerating this effect, you can create depth, as crevices also often pick up dirt, becoming even darker, and the edges of hard objects (like rocks, wood, metal, etc.) often get worn, becoming even lighter. *Before* ![](https://github.com/kaisalmon/MrsSalmonsBlockbenchBakedAmbientOcclusion/blob/main/examples/BenchFlat.gif) *After* ![](https://github.com/kaisalmon/MrsSalmonsBlockbenchBakedAmbientOcclusion/blob/main/examples/Bench.gif) ## Building and installing. To install clone the repo, and run `npm install` and then `npm build`. This will create a file at `dist\blockbench-baked-ao.js`. In Blockbench, you can then go to plugins, and select "load from file", and select the file you just created. ## Using the plugin Select your mesh, and go to Tools > Bake Ambient Occlusion image ## Settings image ### **Highlight Color** Color used for areas with high ambient lighting ### **Highlight Opacity** Opacity of the highlight color overlay ### **Highlight Gamma** Gamma correction for highlight areas (lower = more contrast) ### **Shadow Color** Color used for occluded/shadowed areas ### **Shadow Opacity** Opacity of the shadow color overlay ### **Shadow Gamma** Gamma correction for shadow areas (higher = softer shadows) ### **Samples per pixel** Number of samples per pixel (higher = better quality, slower). 100 recommended for uniform sampling, 1000 for random sampling. ### **Sample Method** Method for sampling ambient occlusion rays. Random is slightly more accurate but noisier, uniform is smoother for less samples but is more prone to artifacts. ### **Ambient Occlusion Radius** Radius for ambient occlusion effect (Bigger is better for larger models or higher-resolution textures) ### **Simulate Ground Plane** Simulate a ground plane, adding shadows at the base of the model ### **Retain Texture Transparency** Preserve the original transparency of textures ### **Sample Texture Transparency** Consider texture transparency when calculating occlusion (slower but more accurate) # Credit and Acknowledgments Code by Kai Salmon. Massive performance gains were achieved by using [ThreeJS Bounding Volume Heiarachies ](https://github.com/gkjohnson/three-mesh-bvh) by Garrett Johnson. ================================================ FILE: plugins/baked_ambient_occlusion/about.md ================================================ # Mr Salmon's Baked Ambient Occlusion Generate instant shaded textures for your models with one click! ![Preview](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/examples/Promo.gif?raw=true) This plugin bakes ambient occlusion directly onto your mesh textures by calculating how much ambient light can reach each pixel on the model. Ambient, in this context, means "equally from-all directions". Areas in crevices and divots receive less light than those at the edges, creating natural depth and shading effects. Pixels on the sharp edge of models recieve more light, so are highlighted. To use this plugin, select a mesh and go to `Tools > Bake Ambient Occlusion`. Configure your settings in the dialog and click `Confirm` to start the baking process. ## How Ambient Occlusion Works Ambient occlusion works by casting rays from each pixel on your model's surface to determine how much ambient light can reach that point. Areas that are occluded by nearby geometry (like crevices, corners, and recessed areas) receive less light and appear darker, while exposed edges and surfaces remain bright. By exaggerating this effect, you can even simulate how dirt accumulates in crevices and how edges of hard materials like rocks, wood, and metal get worn and lightened over time. ## Settings Reference ### Colors and Opacity ![Color Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/colors.gif?raw=true) ![AO Strength](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/ao_strength.gif?raw=true) **Highlight Color & Opacity**: Sets the color and transparency used for well-lit, exposed areas of your model. These areas typically represent worn edges or surfaces that receive full ambient lighting. **Shadow Color & Opacity**: Sets the color and transparency used for occluded, shadowed areas. These areas represent crevices, corners, and recessed surfaces where dirt and grime would naturally accumulate. ### Gamma Correction ![Gamma Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/gamma.gif?raw=true) **Highlight Gamma**: Controls the contrast and falloff of highlight areas. Lower values create more dramatic contrast with sharper transitions, while higher values create softer, more gradual highlights. **Shadow Gamma**: Controls the contrast and falloff of shadow areas. Higher values create softer, more subtle shadows, while lower values create harder, more defined shadows. ### AO Strength and Quality **Samples per pixel**: Determines the quality and accuracy of the ambient occlusion calculation. Higher values produce smoother, more accurate results but take longer to process. Recommended values: - 100-500 samples for quick previews, or when using uniform sampling. - 1000+ samples for final quality results **Sample Method**: Choose between sampling methods: - **Random**: Slightly more accurate but can be noisier, especially with fewer samples. Of course, noise can be desirable! - **Uniform**: Produces smoother results with fewer samples but may show artifacts in some cases, especailly with low samples. ### Occlusion Radius ![Radius Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/radius.gif?raw=true) **Ambient Occlusion Radius (Pixels)**: Controls how far the occlusion effect extends from each surface. Larger values create larger shadows that affect more distant geometry, while smaller values create tighter, more localized effects. Use larger values for bigger models or higher-resolution textures. ### Ground Plane Simulation ![Ground Plane](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/ground_plane.gif?raw=true) **Simulate Ground Plane**: Allows the ground beneath your model to occlude light. This creates natural contact shadows at the base of your model, making it appear more grounded. ### Transparency Handling ![Transparency Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/transparency.gif?raw=true) **Retain Texture Transparency**: Preserves the original alpha channel of your textures. When enabled, the ambient occlusion effect will respect existing transparent areas and not overwrite them completely. **Sample Texture Transparency**: Makes the occlusion calculation consider the transparency of textures when casting rays. Semi-transparent areas will allow some light to pass through rather than casting complete shadows. This produces more accurate results in models with a lot of transparent pixels but increases processing time significantly. ## Usage Tips ### Getting Started 1. Select the mesh you want to process (only one mesh at a time is supported) 2. Go to `Tools > Bake Ambient Occlusion` 3. Adjust settings based on your model size and desired effect 4. Click `Confirm` to start baking ### Recommended Settings - **For quick previews**: 100-200 samples, uniform sampling - **For final results**: 1000+ samples, random sampling - **For large models**: Increase ambient occlusion radius to 12-16 - **For detailed textures**: Use higher sample counts and enable texture transparency sampling ## Credit and Acknowledgments Plugin by Kai Salmon. Massive performance gains were achieved by using [ThreeJS Bounding Volume Hierarchies ](https://github.com/gkjohnson/three-mesh-bvh) by Garrett Johnson. ## Source code and Contributions You can contribute to the code and report any issues on [github](https://github.com/kaisalmon/MrsSalmonsBlockbenchBakedAmbientOcclusion/blob/main/about.md). ================================================ FILE: plugins/baked_ambient_occlusion/baked_ambient_occlusion.js ================================================ /*! For license information please see baked_ambient_occlusion.js.LICENSE.txt */ !function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var s=e();for(var i in s)("object"==typeof exports?exports:t)[i]=s[i]}}(this,()=>(()=>{"use strict";const t="182",e=2300,s=2301,i=2302,r="srgb",n="srgb-linear",a="linear",o="srgb";function h(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array;const l={};function c(...t){const e="THREE."+t.shift();console.warn(e,...t)}function u(...t){const e="THREE."+t.shift();console.error(e,...t)}function d(...t){const e=t.join(" ");e in l||(l[e]=!0,c(...t))}class p{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const s=this._listeners;void 0===s[t]&&(s[t]=[]),-1===s[t].indexOf(e)&&s[t].push(e)}hasEventListener(t,e){const s=this._listeners;return void 0!==s&&void 0!==s[t]&&-1!==s[t].indexOf(e)}removeEventListener(t,e){const s=this._listeners;if(void 0===s)return;const i=s[t];if(void 0!==i){const t=i.indexOf(e);-1!==t&&i.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const s=e[t.type];if(void 0!==s){t.target=this;const e=s.slice(0);for(let s=0,i=e.length;s>8&255]+m[t>>16&255]+m[t>>24&255]+"-"+m[255&e]+m[e>>8&255]+"-"+m[e>>16&15|64]+m[e>>24&255]+"-"+m[63&s|128]+m[s>>8&255]+"-"+m[s>>16&255]+m[s>>24&255]+m[255&i]+m[i>>8&255]+m[i>>16&255]+m[i>>24&255]).toLowerCase()}function f(t,e,s){return Math.max(e,Math.min(s,t))}function x(t,e,s){return(1-s)*t+s*e}function g(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function b(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}Math.PI,Math.PI;class w{constructor(t=0,e=0){w.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,s=this.y,i=t.elements;return this.x=i[0]*e+i[3]*s+i[6],this.y=i[1]*e+i[4]*s+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=f(this.x,t.x,e.x),this.y=f(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=f(this.x,t,e),this.y=f(this.y,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(f(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(f(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y;return e*e+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const s=Math.cos(e),i=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*s-n*i+t.x,this.y=r*i+n*s+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class _{constructor(t=0,e=0,s=0,i=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=s,this._w=i}static slerpFlat(t,e,s,i,r,n,a){let o=s[i+0],h=s[i+1],l=s[i+2],c=s[i+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(a<=0)return t[e+0]=o,t[e+1]=h,t[e+2]=l,void(t[e+3]=c);if(a>=1)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=m);if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const s=Math.acos(t),i=Math.sin(s);e=Math.sin(e*s)/i,o=o*e+u*(a=Math.sin(a*s)/i),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,s,i,r,n){const a=s[i],o=s[i+1],h=s[i+2],l=s[i+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,s,i){return this._x=t,this._y=e,this._z=s,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const s=t._x,i=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(s/2),l=a(i/2),u=a(r/2),d=o(s/2),p=o(i/2),m=o(r/2);switch(n){case"XYZ":this._x=d*l*u+h*p*m,this._y=h*p*u-d*l*m,this._z=h*l*m+d*p*u,this._w=h*l*u-d*p*m;break;case"YXZ":this._x=d*l*u+h*p*m,this._y=h*p*u-d*l*m,this._z=h*l*m-d*p*u,this._w=h*l*u+d*p*m;break;case"ZXY":this._x=d*l*u-h*p*m,this._y=h*p*u+d*l*m,this._z=h*l*m+d*p*u,this._w=h*l*u-d*p*m;break;case"ZYX":this._x=d*l*u-h*p*m,this._y=h*p*u+d*l*m,this._z=h*l*m-d*p*u,this._w=h*l*u+d*p*m;break;case"YZX":this._x=d*l*u+h*p*m,this._y=h*p*u+d*l*m,this._z=h*l*m-d*p*u,this._w=h*l*u-d*p*m;break;case"XZY":this._x=d*l*u-h*p*m,this._y=h*p*u-d*l*m,this._z=h*l*m+d*p*u,this._w=h*l*u+d*p*m;break;default:c("Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const s=e/2,i=Math.sin(s);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(s),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,s=e[0],i=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=s+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-i)*t}else if(s>a&&s>c){const t=2*Math.sqrt(1+s-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(i+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-s-c);this._w=(r-h)/t,this._x=(i+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-s-a);this._w=(n-i)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let s=t.dot(e)+1;return s<1e-8?(s=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=s):(this._x=0,this._y=-t.z,this._z=t.y,this._w=s)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=s),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(f(this.dot(t),-1,1)))}rotateTowards(t,e){const s=this.angleTo(t);if(0===s)return this;const i=Math.min(1,e/s);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const s=t._x,i=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=s*l+n*a+i*h-r*o,this._y=i*l+n*o+r*a-s*h,this._z=r*l+n*h+s*o-i*a,this._w=n*l-s*a-i*o-r*h,this._onChangeCallback(),this}slerp(t,e){if(e<=0)return this;if(e>=1)return this.copy(t);let s=t._x,i=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(s=-s,i=-i,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+s*e,this._y=this._y*o+i*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+s*e,this._y=this._y*o+i*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,s){return this.copy(t).slerp(e,s)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),s=Math.random(),i=Math.sqrt(1-s),r=Math.sqrt(s);return this.set(i*Math.sin(t),i*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class M{constructor(t=0,e=0,s=0){M.prototype.isVector3=!0,this.x=t,this.y=e,this.z=s}set(t,e,s){return void 0===s&&(s=this.z),this.x=t,this.y=e,this.z=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(S.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(S.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*s+r[6]*i,this.y=r[1]*e+r[4]*s+r[7]*i,this.z=r[2]*e+r[5]*s+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=t.elements,n=1/(r[3]*e+r[7]*s+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*s+r[8]*i+r[12])*n,this.y=(r[1]*e+r[5]*s+r[9]*i+r[13])*n,this.z=(r[2]*e+r[6]*s+r[10]*i+r[14])*n,this}applyQuaternion(t){const e=this.x,s=this.y,i=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*i-a*s),l=2*(a*e-r*i),c=2*(r*s-n*e);return this.x=e+o*h+n*c-a*l,this.y=s+o*l+a*h-r*c,this.z=i+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*s+r[8]*i,this.y=r[1]*e+r[5]*s+r[9]*i,this.z=r[2]*e+r[6]*s+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=f(this.x,t.x,e.x),this.y=f(this.y,t.y,e.y),this.z=f(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=f(this.x,t,e),this.y=f(this.y,t,e),this.z=f(this.z,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(f(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this.z=t.z+(e.z-t.z)*s,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const s=t.x,i=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=i*o-r*a,this.y=r*n-s*o,this.z=s*a-i*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const s=t.dot(this)/e;return this.copy(t).multiplyScalar(s)}projectOnPlane(t){return z.copy(this).projectOnVector(t),this.sub(z)}reflect(t){return this.sub(z.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(f(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y,i=this.z-t.z;return e*e+s*s+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,s){const i=Math.sin(e)*t;return this.x=i*Math.sin(s),this.y=Math.cos(e)*t,this.z=i*Math.cos(s),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,s){return this.x=t*Math.sin(e),this.y=s,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),s=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=s,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,s=Math.sqrt(1-e*e);return this.x=s*Math.cos(t),this.y=e,this.z=s*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const z=new M,S=new _;class A{constructor(t,e,s,i,r,n,a,o,h){A.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,a,o,h)}set(t,e,s,i,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=i,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=s,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],this}extractBasis(t,e,s){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),s.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],a=s[3],o=s[6],h=s[1],l=s[4],c=s[7],u=s[2],d=s[5],p=s[8],m=i[0],y=i[3],f=i[6],x=i[1],g=i[4],b=i[7],w=i[2],_=i[5],M=i[8];return r[0]=n*m+a*x+o*w,r[3]=n*y+a*g+o*_,r[6]=n*f+a*b+o*M,r[1]=h*m+l*x+c*w,r[4]=h*y+l*g+c*_,r[7]=h*f+l*b+c*M,r[2]=u*m+d*x+p*w,r[5]=u*y+d*g+p*_,r[8]=u*f+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-s*r*l+s*a*o+i*r*h-i*n*o}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+s*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(i*h-l*s)*m,t[2]=(a*s-i*n)*m,t[3]=u*m,t[4]=(l*e-i*o)*m,t[5]=(i*r-a*e)*m,t[6]=d*m,t[7]=(s*o-h*e)*m,t[8]=(n*e-s*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,s,i,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(s*o,s*h,-s*(o*n+h*a)+n+t,-i*h,i*o,-i*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(v.makeScale(t,e)),this}rotate(t){return this.premultiply(v.makeRotation(-t)),this}translate(t,e){return this.premultiply(v.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,s,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<9;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<9;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const v=new A,T=(new A).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),B=(new A).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function k(){const t={enabled:!0,workingColorSpace:n,spaces:{},convert:function(t,e,s){return!1!==this.enabled&&e!==s&&e&&s?(this.spaces[e].transfer===o&&(t.r=C(t.r),t.g=C(t.g),t.b=C(t.b)),this.spaces[e].primaries!==this.spaces[s].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[s].fromXYZ)),this.spaces[s].transfer===o&&(t.r=V(t.r),t.g=V(t.g),t.b=V(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?a:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,s){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[s].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,s){return d("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(e,s)},toWorkingColorSpace:function(e,s){return d("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(e,s)}},e=[.64,.33,.3,.6,.15,.06],s=[.2126,.7152,.0722],i=[.3127,.329];return t.define({[n]:{primaries:e,whitePoint:i,transfer:a,toXYZ:T,fromXYZ:B,luminanceCoefficients:s,workingColorSpaceConfig:{unpackColorSpace:r},outputColorSpaceConfig:{drawingBufferColorSpace:r}},[r]:{primaries:e,whitePoint:i,transfer:o,toXYZ:T,fromXYZ:B,luminanceCoefficients:s,outputColorSpaceConfig:{drawingBufferColorSpace:r}}}),t}const P=k();function C(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function V(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let F;class I{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let s;if(t instanceof HTMLCanvasElement)s=t;else{void 0===F&&(F=h("canvas")),F.width=t.width,F.height=t.height;const e=F.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),s=F}return s.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=h("canvas");e.width=t.width,e.height=t.height;const s=e.getContext("2d");s.drawImage(t,0,0,t.width,t.height);const i=s.getImageData(0,0,t.width,t.height),r=i.data;for(let t=0;t1),this.pmremVersion=0}get width(){return this.source.getSize(q).x}get height(){return this.source.getSize(q).y}get depth(){return this.source.getSize(q).z}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const s=t[e];if(void 0===s){c(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const i=this[e];void 0!==i?i&&s&&i.isVector2&&s.isVector2||i&&s&&i.isVector3&&s.isVector3||i&&s&&i.isMatrix3&&s.isMatrix3?i.copy(s):this[e]=s:c(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const s={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(s.userData=this.userData),e||(t.textures[this.uuid]=s),s}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(300!==this.mapping)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case 1e3:t.x=t.x-Math.floor(t.x);break;case 1001:t.x=t.x<0?0:1;break;case 1002:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case 1e3:t.y=t.y-Math.floor(t.y);break;case 1001:t.y=t.y<0?0:1;break;case 1002:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}R.DEFAULT_IMAGE=null,R.DEFAULT_MAPPING=300,R.DEFAULT_ANISOTROPY=1;class W{constructor(t=0,e=0,s=0,i=1){W.prototype.isVector4=!0,this.x=t,this.y=e,this.z=s,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,s,i){return this.x=t,this.y=e,this.z=s,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*s+n[8]*i+n[12]*r,this.y=n[1]*e+n[5]*s+n[9]*i+n[13]*r,this.z=n[2]*e+n[6]*s+n[10]*i+n[14]*r,this.w=n[3]*e+n[7]*s+n[11]*i+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,s,i,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],f=o[10];if(Math.abs(l-u)o&&t>x?tx?o=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,j),j.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,s;return t.normal.x>0?(e=t.normal.x*this.min.x,s=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,s=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,s+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,s+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,s+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,s+=t.normal.z*this.min.z),e<=-t.constant&&s>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Q),K.subVectors(this.max,Q),Y.subVectors(t.a,Q),X.subVectors(t.b,Q),G.subVectors(t.c,Q),Z.subVectors(X,Y),J.subVectors(G,X),$.subVectors(Y,G);let e=[0,-Z.z,Z.y,0,-J.z,J.y,0,-$.z,$.y,Z.z,0,-Z.x,J.z,0,-J.x,$.z,0,-$.x,-Z.y,Z.x,0,-J.y,J.x,0,-$.y,$.x,0];return!!st(e,Y,X,G,K)&&(e=[1,0,0,0,1,0,0,0,1],!!st(e,Y,X,G,K)&&(tt.crossVectors(Z,J),e=[tt.x,tt.y,tt.z],st(e,Y,X,G,K)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,j).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(j).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(L[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),L[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),L[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),L[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),L[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),L[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),L[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),L[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(L)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const L=[new M,new M,new M,new M,new M,new M,new M,new M],j=new M,H=new D,Y=new M,X=new M,G=new M,Z=new M,J=new M,$=new M,Q=new M,K=new M,tt=new M,et=new M;function st(t,e,s,i,r){for(let n=0,a=t.length-3;n<=a;n+=3){et.fromArray(t,n);const a=r.x*Math.abs(et.x)+r.y*Math.abs(et.y)+r.z*Math.abs(et.z),o=e.dot(et),h=s.dot(et),l=i.dot(et);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const it=new D,rt=new M,nt=new M;class at{constructor(t=new M,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const s=this.center;void 0!==e?s.copy(e):it.setFromPoints(t).getCenter(s);let i=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;rt.subVectors(t,this.center);const e=rt.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),s=.5*(t-this.radius);this.center.addScaledVector(rt,s/t),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(nt.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(rt.copy(t.center).add(nt)),this.expandByPoint(rt.copy(t.center).sub(nt))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}class ot{constructor(t,e,s,i,r,n,a,o,h,l,c,u,d,p,m,y){ot.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,s,i,r,n,a,o,h,l,c,u,d,p,m,y){const f=this.elements;return f[0]=t,f[4]=e,f[8]=s,f[12]=i,f[1]=r,f[5]=n,f[9]=a,f[13]=o,f[2]=h,f[6]=l,f[10]=c,f[14]=u,f[3]=d,f[7]=p,f[11]=m,f[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ot).fromArray(this.elements)}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],e[9]=s[9],e[10]=s[10],e[11]=s[11],e[12]=s[12],e[13]=s[13],e[14]=s[14],e[15]=s[15],this}copyPosition(t){const e=this.elements,s=t.elements;return e[12]=s[12],e[13]=s[13],e[14]=s[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,s){return 0===this.determinant()?(t.set(1,0,0),e.set(0,1,0),s.set(0,0,1),this):(t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),s.setFromMatrixColumn(this,2),this)}makeBasis(t,e,s){return this.set(t.x,e.x,s.x,0,t.y,e.y,s.y,0,t.z,e.z,s.z,0,0,0,0,1),this}extractRotation(t){if(0===t.determinant())return this.identity();const e=this.elements,s=t.elements,i=1/ht.setFromMatrixColumn(t,0).length(),r=1/ht.setFromMatrixColumn(t,1).length(),n=1/ht.setFromMatrixColumn(t,2).length();return e[0]=s[0]*i,e[1]=s[1]*i,e[2]=s[2]*i,e[3]=0,e[4]=s[4]*r,e[5]=s[5]*r,e[6]=s[6]*r,e[7]=0,e[8]=s[8]*n,e[9]=s[9]*n,e[10]=s[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,s=t.x,i=t.y,r=t.z,n=Math.cos(s),a=Math.sin(s),o=Math.cos(i),h=Math.sin(i),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,s=n*c,i=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=s+i*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=i+s*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,s=o*c,i=h*l,r=h*c;e[0]=t+r*a,e[4]=i*a-s,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=s*a-i,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,s=o*c,i=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=i+s*a,e[1]=s+i*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,s=n*c,i=a*l,r=a*c;e[0]=o*l,e[4]=i*h-s,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=s*h-i,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,s=n*h,i=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=i*c+s,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=s*c+i,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,s=n*h,i=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=s*c-i,e[2]=i*c-s,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(ct,t,ut)}lookAt(t,e,s){const i=this.elements;return mt.subVectors(t,e),0===mt.lengthSq()&&(mt.z=1),mt.normalize(),dt.crossVectors(s,mt),0===dt.lengthSq()&&(1===Math.abs(s.z)?mt.x+=1e-4:mt.z+=1e-4,mt.normalize(),dt.crossVectors(s,mt)),dt.normalize(),pt.crossVectors(mt,dt),i[0]=dt.x,i[4]=pt.x,i[8]=mt.x,i[1]=dt.y,i[5]=pt.y,i[9]=mt.y,i[2]=dt.z,i[6]=pt.z,i[10]=mt.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],a=s[4],o=s[8],h=s[12],l=s[1],c=s[5],u=s[9],d=s[13],p=s[2],m=s[6],y=s[10],f=s[14],x=s[3],g=s[7],b=s[11],w=s[15],_=i[0],M=i[4],z=i[8],S=i[12],A=i[1],v=i[5],T=i[9],B=i[13],k=i[2],P=i[6],C=i[10],V=i[14],F=i[3],I=i[7],E=i[11],U=i[15];return r[0]=n*_+a*A+o*k+h*F,r[4]=n*M+a*v+o*P+h*I,r[8]=n*z+a*T+o*C+h*E,r[12]=n*S+a*B+o*V+h*U,r[1]=l*_+c*A+u*k+d*F,r[5]=l*M+c*v+u*P+d*I,r[9]=l*z+c*T+u*C+d*E,r[13]=l*S+c*B+u*V+d*U,r[2]=p*_+m*A+y*k+f*F,r[6]=p*M+m*v+y*P+f*I,r[10]=p*z+m*T+y*C+f*E,r[14]=p*S+m*B+y*V+f*U,r[3]=x*_+g*A+b*k+w*F,r[7]=x*M+g*v+b*P+w*I,r[11]=x*z+g*T+b*C+w*E,r[15]=x*S+g*B+b*V+w*U,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[4],i=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14],p=t[3],m=t[7],y=t[11],f=t[15],x=o*d-h*u,g=a*d-h*c,b=a*u-o*c,w=n*d-h*l,_=n*u-o*l,M=n*c-a*l;return e*(m*x-y*g+f*b)-s*(p*x-y*w+f*_)+i*(p*g-m*w+f*M)-r*(p*b-m*_+y*M)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,s){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=s),this}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],f=t[15],x=c*y*h-m*u*h+m*o*d-a*y*d-c*o*f+a*u*f,g=p*u*h-l*y*h-p*o*d+n*y*d+l*o*f-n*u*f,b=l*m*h-p*c*h+p*a*d-n*m*d-l*a*f+n*c*f,w=p*c*o-l*m*o-p*a*u+n*m*u+l*a*y-n*c*y,_=e*x+s*g+i*b+r*w;if(0===_)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/_;return t[0]=x*M,t[1]=(m*u*r-c*y*r-m*i*d+s*y*d+c*i*f-s*u*f)*M,t[2]=(a*y*r-m*o*r+m*i*h-s*y*h-a*i*f+s*o*f)*M,t[3]=(c*o*r-a*u*r-c*i*h+s*u*h+a*i*d-s*o*d)*M,t[4]=g*M,t[5]=(l*y*r-p*u*r+p*i*d-e*y*d-l*i*f+e*u*f)*M,t[6]=(p*o*r-n*y*r-p*i*h+e*y*h+n*i*f-e*o*f)*M,t[7]=(n*u*r-l*o*r+l*i*h-e*u*h-n*i*d+e*o*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*s*d+e*m*d+l*s*f-e*c*f)*M,t[10]=(n*m*r-p*a*r+p*s*h-e*m*h-n*s*f+e*a*f)*M,t[11]=(l*a*r-n*c*r-l*s*h+e*c*h+n*s*d-e*a*d)*M,t[12]=w*M,t[13]=(l*m*i-p*c*i+p*s*u-e*m*u-l*s*y+e*c*y)*M,t[14]=(p*a*i-n*m*i-p*s*o+e*m*o+n*s*y-e*a*y)*M,t[15]=(n*c*i-l*a*i+l*s*o-e*c*o-n*s*u+e*a*u)*M,this}scale(t){const e=this.elements,s=t.x,i=t.y,r=t.z;return e[0]*=s,e[4]*=i,e[8]*=r,e[1]*=s,e[5]*=i,e[9]*=r,e[2]*=s,e[6]*=i,e[10]*=r,e[3]*=s,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],s=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,s,i))}makeTranslation(t,e,s){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,s,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),s=Math.sin(t);return this.set(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const s=Math.cos(e),i=Math.sin(e),r=1-s,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+s,h*a-i*o,h*o+i*a,0,h*a+i*o,l*a+s,l*o-i*n,0,h*o-i*a,l*o+i*n,r*o*o+s,0,0,0,0,1),this}makeScale(t,e,s){return this.set(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1),this}makeShear(t,e,s,i,r,n){return this.set(1,s,r,0,t,1,n,0,e,i,1,0,0,0,0,1),this}compose(t,e,s){const i=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,f=a*c,x=o*h,g=o*l,b=o*c,w=s.x,_=s.y,M=s.z;return i[0]=(1-(m+f))*w,i[1]=(d+b)*w,i[2]=(p-g)*w,i[3]=0,i[4]=(d-b)*_,i[5]=(1-(u+f))*_,i[6]=(y+x)*_,i[7]=0,i[8]=(p+g)*M,i[9]=(y-x)*M,i[10]=(1-(u+m))*M,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,s){const i=this.elements;if(t.x=i[12],t.y=i[13],t.z=i[14],0===this.determinant())return s.set(1,1,1),e.identity(),this;let r=ht.set(i[0],i[1],i[2]).length();const n=ht.set(i[4],i[5],i[6]).length(),a=ht.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),lt.copy(this);const o=1/r,h=1/n,l=1/a;return lt.elements[0]*=o,lt.elements[1]*=o,lt.elements[2]*=o,lt.elements[4]*=h,lt.elements[5]*=h,lt.elements[6]*=h,lt.elements[8]*=l,lt.elements[9]*=l,lt.elements[10]*=l,e.setFromRotationMatrix(lt),s.x=r,s.y=n,s.z=a,this}makePerspective(t,e,s,i,r,n,a=2e3,o=!1){const h=this.elements,l=2*r/(e-t),c=2*r/(s-i),u=(e+t)/(e-t),d=(s+i)/(s-i);let p,m;if(o)p=r/(n-r),m=n*r/(n-r);else if(2e3===a)p=-(n+r)/(n-r),m=-2*n*r/(n-r);else{if(2001!==a)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);p=-n/(n-r),m=-n*r/(n-r)}return h[0]=l,h[4]=0,h[8]=u,h[12]=0,h[1]=0,h[5]=c,h[9]=d,h[13]=0,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=-1,h[15]=0,this}makeOrthographic(t,e,s,i,r,n,a=2e3,o=!1){const h=this.elements,l=2/(e-t),c=2/(s-i),u=-(e+t)/(e-t),d=-(s+i)/(s-i);let p,m;if(o)p=1/(n-r),m=n/(n-r);else if(2e3===a)p=-2/(n-r),m=-(n+r)/(n-r);else{if(2001!==a)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=-1/(n-r),m=-r/(n-r)}return h[0]=l,h[4]=0,h[8]=0,h[12]=u,h[1]=0,h[5]=c,h[9]=0,h[13]=d,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=0,h[15]=1,this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<16;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<16;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t[e+9]=s[9],t[e+10]=s[10],t[e+11]=s[11],t[e+12]=s[12],t[e+13]=s[13],t[e+14]=s[14],t[e+15]=s[15],t}}const ht=new M,lt=new ot,ct=new M(0,0,0),ut=new M(1,1,1),dt=new M,pt=new M,mt=new M,yt=new ot,ft=new _;class xt{constructor(t=0,e=0,s=0,i=xt.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=s,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,s,i=this._order){return this._x=t,this._y=e,this._z=s,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,s=!0){const i=t.elements,r=i[0],n=i[4],a=i[8],o=i[1],h=i[5],l=i[9],u=i[2],d=i[6],p=i[10];switch(e){case"XYZ":this._y=Math.asin(f(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,p),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(d,h),this._z=0);break;case"YXZ":this._x=Math.asin(-f(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,p),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(f(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,p),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-f(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(f(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(a,p));break;case"XZY":this._z=Math.asin(-f(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(d,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,p),this._y=0);break;default:c("Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===s&&this._onChangeCallback(),this}setFromQuaternion(t,e,s){return yt.makeRotationFromQuaternion(t),this.setFromRotationMatrix(yt,e,s)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return ft.setFromEuler(this),this.setFromQuaternion(ft,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}xt.DEFAULT_ORDER="XYZ";class gt{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(t=>({...t})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(t),i.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(i.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(i.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(i.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(i.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const s=e.shapes;if(Array.isArray(s))for(let e=0,i=s.length;e0){i.children=[];for(let e=0;e0){i.animations=[];for(let e=0;e0&&(s.geometries=e),i.length>0&&(s.materials=i),r.length>0&&(s.textures=r),a.length>0&&(s.images=a),o.length>0&&(s.shapes=o),h.length>0&&(s.skeletons=h),l.length>0&&(s.animations=l),c.length>0&&(s.nodes=c)}return s.object=i,s;function n(t){const e=[];for(const s in t){const i=t[s];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,s,i,r){Et.subVectors(i,e),Ut.subVectors(s,e),Nt.subVectors(t,e);const n=Et.dot(Et),a=Et.dot(Ut),o=Et.dot(Nt),h=Ut.dot(Ut),l=Ut.dot(Nt),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,s,i){return null!==this.getBarycoord(t,e,s,i,Ot)&&Ot.x>=0&&Ot.y>=0&&Ot.x+Ot.y<=1}static getInterpolation(t,e,s,i,r,n,a,o){return null===this.getBarycoord(t,e,s,i,Ot)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Ot.x),o.addScaledVector(n,Ot.y),o.addScaledVector(a,Ot.z),o)}static getInterpolatedAttribute(t,e,s,i,r,n){return Ht.setScalar(0),Yt.setScalar(0),Xt.setScalar(0),Ht.fromBufferAttribute(t,e),Yt.fromBufferAttribute(t,s),Xt.fromBufferAttribute(t,i),n.setScalar(0),n.addScaledVector(Ht,r.x),n.addScaledVector(Yt,r.y),n.addScaledVector(Xt,r.z),n}static isFrontFacing(t,e,s,i){return Et.subVectors(s,e),Ut.subVectors(t,e),Et.cross(Ut).dot(i)<0}set(t,e,s){return this.a.copy(t),this.b.copy(e),this.c.copy(s),this}setFromPointsAndIndices(t,e,s,i){return this.a.copy(t[e]),this.b.copy(t[s]),this.c.copy(t[i]),this}setFromAttributeAndIndices(t,e,s,i){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,s),this.c.fromBufferAttribute(t,i),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Et.subVectors(this.c,this.b),Ut.subVectors(this.a,this.b),.5*Et.cross(Ut).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Gt.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Gt.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,s,i,r){return Gt.getInterpolation(t,this.a,this.b,this.c,e,s,i,r)}containsPoint(t){return Gt.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Gt.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const s=this.a,i=this.b,r=this.c;let n,a;qt.subVectors(i,s),Rt.subVectors(r,s),Dt.subVectors(t,s);const o=qt.dot(Dt),h=Rt.dot(Dt);if(o<=0&&h<=0)return e.copy(s);Lt.subVectors(t,i);const l=qt.dot(Lt),c=Rt.dot(Lt);if(l>=0&&c<=l)return e.copy(i);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(s).addScaledVector(qt,n);jt.subVectors(t,r);const d=qt.dot(jt),p=Rt.dot(jt);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(s).addScaledVector(Rt,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return Wt.subVectors(r,i),a=(c-l)/(c-l+(d-p)),e.copy(i).addScaledVector(Wt,a);const f=1/(y+m+u);return n=m*f,a=u*f,e.copy(s).addScaledVector(qt,n).addScaledVector(Rt,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Zt={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Jt={h:0,s:0,l:0},$t={h:0,s:0,l:0};function Qt(t,e,s){return s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+6*(e-t)*(2/3-s):t}class Kt{constructor(t,e,s){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,s)}set(t,e,s){if(void 0===e&&void 0===s){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,s);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=r){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,P.colorSpaceToWorking(this,e),this}setRGB(t,e,s,i=P.workingColorSpace){return this.r=t,this.g=e,this.b=s,P.colorSpaceToWorking(this,i),this}setHSL(t,e,s,i=P.workingColorSpace){if(t=(t%(r=1)+r)%r,e=f(e,0,1),s=f(s,0,1),0===e)this.r=this.g=this.b=s;else{const i=s<=.5?s*(1+e):s+e-s*e,r=2*s-i;this.r=Qt(r,i,t+1/3),this.g=Qt(r,i,t),this.b=Qt(r,i,t-1/3)}var r;return P.colorSpaceToWorking(this,i),this}setStyle(t,e=r){function s(e){void 0!==e&&parseFloat(e)<1&&c("Color: Alpha component of "+t+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=i[1],a=i[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return s(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return s(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return s(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:c("Color: Unknown color model "+t)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(t)){const s=i[1],r=s.length;if(3===r)return this.setRGB(parseInt(s.charAt(0),16)/15,parseInt(s.charAt(1),16)/15,parseInt(s.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(s,16),e);c("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=r){const s=Zt[t.toLowerCase()];return void 0!==s?this.setHex(s,e):c("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=C(t.r),this.g=C(t.g),this.b=C(t.b),this}copyLinearToSRGB(t){return this.r=V(t.r),this.g=V(t.g),this.b=V(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=r){return P.workingToColorSpace(te.copy(this),t),65536*Math.round(f(255*te.r,0,255))+256*Math.round(f(255*te.g,0,255))+Math.round(f(255*te.b,0,255))}getHexString(t=r){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=P.workingColorSpace){P.workingToColorSpace(te.copy(this),e);const s=te.r,i=te.g,r=te.b,n=Math.max(s,i,r),a=Math.min(s,i,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case s:o=(i-r)/t+(i1?null:e.copy(t.start).addScaledVector(s,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),s=this.distanceToPoint(t.end);return e<0&&s>0||s<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const s=e||oe.getNormalMatrix(t),i=this.coplanarPoint(ne).applyMatrix4(t),r=this.normal.applyMatrix3(s).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}function le(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}class ce{constructor(t,e,s,i){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=void 0!==i?i:new e.constructor(s),this.sampleValues=e,this.valueSize=s,this.settings=null,this.DefaultSettings_={}}evaluate(t){const e=this.parameterPositions;let s=this._cachedIndex,i=e[s],r=e[s-1];t:{e:{let n;s:{i:if(!(t=r)){const a=e[1];t=r)break e}n=s,s=0;break s}break t}for(;s>>1;te;)--n;if(++n,0!==r||n!==i){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=s.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(u("KeyframeTrack: Invalid value size in track.",this),t=!1);const s=this.times,i=this.values,r=s.length;0===r&&(u("KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const i=s[e];if("number"==typeof i&&isNaN(i)){u("KeyframeTrack: Time is not a valid number.",this,e,i),t=!1;break}if(null!==n&&n>i){u("KeyframeTrack: Out of order keys.",this,e,i,n),t=!1;break}n=i}if(void 0!==i&&(a=i,ArrayBuffer.isView(a)&&!(a instanceof DataView)))for(let e=0,s=i.length;e!==s;++e){const s=i[e];if(isNaN(s)){u("KeyframeTrack: Value is not a valid number.",this,e,s),t=!1;break}}var a;return t}optimize(){const t=this.times.slice(),e=this.values.slice(),s=this.getValueSize(),r=this.getInterpolation()===i,n=t.length-1;let a=1;for(let i=1;i0){t[a]=t[n];for(let t=n*s,i=a*s,r=0;r!==s;++r)e[i+r]=e[t+r];++a}return a!==t.length?(this.times=t.slice(0,a),this.values=e.slice(0,a*s)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),s=new(0,this.constructor)(this.name,t,e);return s.createInterpolant=this.createInterpolant,s}}me.prototype.ValueTypeName="",me.prototype.TimeBufferType=Float32Array,me.prototype.ValueBufferType=Float32Array,me.prototype.DefaultInterpolation=s;class ye extends me{constructor(t,e,s){super(t,e,s)}}ye.prototype.ValueTypeName="bool",ye.prototype.ValueBufferType=Array,ye.prototype.DefaultInterpolation=e,ye.prototype.InterpolantFactoryMethodLinear=void 0,ye.prototype.InterpolantFactoryMethodSmooth=void 0;(class extends me{constructor(t,e,s,i){super(t,e,s,i)}}).prototype.ValueTypeName="color";(class extends me{constructor(t,e,s,i){super(t,e,s,i)}}).prototype.ValueTypeName="number";class fe extends ce{constructor(t,e,s,i){super(t,e,s,i)}interpolate_(t,e,s,i){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(s-e)/(i-e);let h=t*a;for(let t=h+a;h!==t;h+=4)_.slerpFlat(r,0,n,h-a,n,h,o);return r}}class xe extends me{constructor(t,e,s,i){super(t,e,s,i)}InterpolantFactoryMethodLinear(t){return new fe(this.times,this.values,this.getValueSize(),t)}}xe.prototype.ValueTypeName="quaternion",xe.prototype.InterpolantFactoryMethodSmooth=void 0;class ge extends me{constructor(t,e,s){super(t,e,s)}}ge.prototype.ValueTypeName="string",ge.prototype.ValueBufferType=Array,ge.prototype.DefaultInterpolation=e,ge.prototype.InterpolantFactoryMethodLinear=void 0,ge.prototype.InterpolantFactoryMethodSmooth=void 0;(class extends me{constructor(t,e,s,i){super(t,e,s,i)}}).prototype.ValueTypeName="vector";Error,new WeakMap,new WeakMap;const be="\\[\\]\\.:\\/",we=new RegExp("["+be+"]","g"),_e="[^"+be+"]",Me="[^"+be.replace("\\.","")+"]",ze=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",_e)+/(WCOD+)?/.source.replace("WCOD",Me)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",_e)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",_e)+"$"),Se=["material","materials","bones","map"];class Ae{constructor(t,e,s){this.path=e,this.parsedPath=s||Ae.parseTrackName(e),this.node=Ae.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,s){return t&&t.isAnimationObjectGroup?new Ae.Composite(t,e,s):new Ae(t,e,s)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(we,"")}static parseTrackName(t){const e=ze.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const s={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},i=s.nodeName&&s.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){const t=s.nodeName.substring(i+1);-1!==Se.indexOf(t)&&(s.nodeName=s.nodeName.substring(0,i),s.objectName=t)}if(null===s.propertyName||0===s.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return s}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const s=t.skeleton.getBoneByName(e);if(void 0!==s)return s}if(t.children){const s=function(t){for(let i=0;i1&&(n=1,r=f((e-t)/c,0,1))}}return e.copy(a).add(Be.multiplyScalar(r)),s.copy(o).add(ke.multiplyScalar(n)),e.sub(s),e.dot(e)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?c("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);const Ie=1.25,Ee=65535,Ue=Math.pow(2,-24),Ne=Symbol("SKIP_GENERATION");function Oe(t){return function(t){return t.index?t.index.count:t.attributes.position.count}(t)/3}function qe(t,e){const s=Oe(t),i=e||t.drawRange,r=i.start/3,n=(i.start+i.count)/3,a=Math.max(0,r),o=Math.min(s,n)-a;return[{offset:Math.floor(a),count:Math.floor(o)}]}function Re(t,e){if(!t.groups||!t.groups.length)return qe(t,e);const s=[],i=new Set,r=e||t.drawRange,n=r.start/3,a=(r.start+r.count)/3;for(const e of t.groups){const t=e.start/3,s=(e.start+e.count)/3;i.add(Math.max(n,t)),i.add(Math.min(a,s))}const o=Array.from(i.values()).sort((t,e)=>t-e);for(let t=0;th&&(h=x),em&&(m=e);const g=t[i+2],b=t[i+3],w=g-b,_=g+b;wl&&(l=_),gy&&(y=g);const M=t[i+4],z=t[i+5],S=M-z,A=M+z;Sc&&(c=A),Mf&&(f=M)}i[0]=n,i[1]=a,i[2]=o,i[3]=h,i[4]=l,i[5]=c,r[0]=u,r[1]=d,r[2]=p,r[3]=m,r[4]=y,r[5]=f}function De(t,e,s){return s.min.x=e[t],s.min.y=e[t+1],s.min.z=e[t+2],s.max.x=e[t+3],s.max.y=e[t+4],s.max.z=e[t+5],s}function Le(t){let e=-1,s=-1/0;for(let i=0;i<3;i++){const r=t[i+3]-t[i];r>s&&(s=r,e=i)}return e}function je(t,e){e.set(t)}function He(t,e,s){let i,r;for(let n=0;n<3;n++){const a=n+3;i=t[n],r=e[n],s[n]=ir?i:r}}function Ye(t,e,s){for(let i=0;i<3;i++){const r=e[t+2*i],n=e[t+2*i+1],a=r-n,o=r+n;as[i+3]&&(s[i+3]=o)}}function Xe(t){const e=t[3]-t[0],s=t[4]-t[1],i=t[5]-t[2];return 2*(e*s+s*i+i*e)}const Ge=(t,e)=>t.candidate-e.candidate,Ze=new Array(32).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),Je=new Float32Array(6);class $e{constructor(){this.boundingData=new Float32Array(6)}}function Qe(t,e,s,i,r,n){let a=i,o=i+r-1;const h=n.pos,l=2*n.axis;for(;;){for(;a<=o&&s[6*a+l]=h;)o--;if(!(a=h;)o--;if(!(aus)throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return hs[s+6]=a/4,a=ms(a,r),hs[s+7]=n,a}}function ys(t,e){const s=t.geometry;e.indirect&&(t._indirectBuffer=function(t,e){const s=(t.index?t.index.count:t.attributes.position.count)/3,i=s>65536,r=i?4:2,n=e?new SharedArrayBuffer(s*r):new ArrayBuffer(s*r),a=i?new Uint32Array(n):new Uint16Array(n);for(let t=0,e=a.length;tt.offset-e.offset),r=i[i.length-1];r.count=Math.min(s-r.offset,r.count);let n=0;return i.forEach(({count:t})=>n+=t),s!==n}(s,e.range)&&!e.verbose&&console.warn('MeshBVH: Provided geometry contains groups or a range that do not fully span the vertex contents while using the "indirect" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),t._indirectBuffer||function(t,e){if(!t.index){const s=t.attributes.position.count,i=function(t,e=ArrayBuffer){return t>65535?new Uint32Array(new e(4*t)):new Uint16Array(new e(2*t))}(s,e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer);t.setIndex(new re(i,1));for(let t=0;tm&&(m=n),c>m&&(m=c);const y=(m-u)/2,f=2*t;h[s+f+0]=u+y,h[s+f+1]=y+(Math.abs(u)+y)*Ue}}return h}(s),n=e.indirect?qe(s,e.range):Re(s,e.range);t._roots=n.map(s=>{const n=function(t,e,s,i,r){const{maxDepth:n,verbose:a,maxLeafTris:o,strategy:h,onProgress:l,indirect:c}=r,u=t._indirectBuffer,d=t.geometry,p=d.index?d.index.array:null,m=c?Ke:Qe,y=Oe(d),f=new Float32Array(6);let x=!1;const g=new $e;return We(e,s,i,g.boundingData,f),function t(s,i,r,l=null,c=0){if(!x&&c>=n&&(x=!0,a&&(console.warn(`MeshBVH: Max depth of ${n} reached when generating BVH. Consider increasing maxDepth.`),console.warn(d))),r<=o||c>=n)return b(i+r),s.offset=i,s.count=r,s;const y=function(t,e,s,i,r,n){let a=-1,o=0;if(0===n)a=Le(e),-1!==a&&(o=(e[a]+e[a+3])/2);else if(1===n)a=Le(t),-1!==a&&(o=function(t,e,s,i){let r=0;for(let n=e,a=e+s;n=n.candidate?Ye(i,s,n.rightCacheBounds):(Ye(i,s,n.leftCacheBounds),n.count++)}}for(let s=0;s=32&&(r=31);const n=Ze[r];n.count++,Ye(e,s,n.bounds)}const e=Ze[31];je(e.bounds,e.rightCacheBounds);for(let t=30;t>=0;t--){const e=Ze[t],s=Ze[t+1];He(e.bounds,s.rightCacheBounds,e.rightCacheBounds)}let d=0;for(let e=0;e<31;e++){const s=Ze[e],i=s.count,l=s.bounds,c=Ze[e+1].rightCacheBounds;0!==i&&(0===d?je(l,Je):He(l,Je,Je)),d+=i;let u=0,p=0;0!==d&&(u=Xe(Je)/n);const m=r-d;0!==m&&(p=Xe(c)/n);const y=1+Ie*(u*d+p*m);yi?n:i}this.min=s,this.max=i}setFromPoints(t,e){let s=1/0,i=-1/0;for(let r=0,n=e.length;ri?a:i}this.min=s,this.max=i}isSeparated(t){return this.min>t.max||t.min>this.max}}fs.prototype.setFromBox=function(){const t=new M;return function(e,s){const i=s.min,r=s.max;let n=1/0,a=-1/0;for(let s=0;s<=1;s++)for(let o=0;o<=1;o++)for(let h=0;h<=1;h++){t.x=i.x*s+r.x*(1-s),t.y=i.y*o+r.y*(1-o),t.z=i.z*h+r.z*(1-h);const l=e.dot(t);n=Math.min(l,n),a=Math.max(l,a)}this.min=n,this.max=a}}(),new fs;const xs=function(){const t=new M,e=new M,s=new M;return function(i,r,n){const a=i.start,o=t,h=r.start,l=e;s.subVectors(a,h),t.subVectors(i.end,i.start),e.subVectors(r.end,r.start);const c=s.dot(l),u=l.dot(o),d=l.dot(l),p=s.dot(o),m=o.dot(o)*d-u*u;let y,f;y=0!==m?(c*u-p*d)/m:0,f=(c+y*u)/d,n.x=y,n.y=f}}(),gs=function(){const t=new w,e=new M,s=new M;return function(i,r,n,a){xs(i,r,t);let o=t.x,h=t.y;if(o>=0&&o<=1&&h>=0&&h<=1)return i.at(o,n),void r.at(h,a);if(o>=0&&o<=1)return h<0?r.at(0,a):r.at(1,a),void i.closestPointToPoint(a,!0,n);if(h>=0&&h<=1)return o<0?i.at(0,n):i.at(1,n),void r.closestPointToPoint(n,!0,a);{let t,l;t=o<0?i.start:i.end,l=h<0?r.start:r.end;const c=e,u=s;return i.closestPointToPoint(l,!0,e),r.closestPointToPoint(t,!0,s),c.distanceToSquared(l)<=u.distanceToSquared(t)?(n.copy(c),void a.copy(l)):(n.copy(t),void a.copy(u))}}}(),bs=function(){const t=new M,e=new M,s=new he,i=new Fe;return function(r,n){const{radius:a,center:o}=r,{a:h,b:l,c}=n;if(i.start=h,i.end=l,i.closestPointToPoint(o,!0,t).distanceTo(o)<=a)return!0;if(i.start=h,i.end=c,i.closestPointToPoint(o,!0,t).distanceTo(o)<=a)return!0;if(i.start=l,i.end=c,i.closestPointToPoint(o,!0,t).distanceTo(o)<=a)return!0;const u=n.getPlane(s);if(Math.abs(u.distanceToPoint(o))<=a){const t=u.projectPoint(o,e);if(n.containsPoint(t))return!0}return!1}}();function ws(t){return Math.abs(t)<1e-15}class _s extends Gt{constructor(...t){super(...t),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map(()=>new M),this.satBounds=new Array(4).fill().map(()=>new fs),this.points=[this.a,this.b,this.c],this.sphere=new at,this.plane=new he,this.needsUpdate=!0}intersectsSphere(t){return bs(t,this)}update(){const t=this.a,e=this.b,s=this.c,i=this.points,r=this.satAxes,n=this.satBounds,a=r[0],o=n[0];this.getNormal(a),o.setFromPoints(a,i);const h=r[1],l=n[1];h.subVectors(t,e),l.setFromPoints(h,i);const c=r[2],u=n[2];c.subVectors(e,s),u.setFromPoints(c,i);const d=r[3],p=n[3];d.subVectors(s,t),p.setFromPoints(d,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(a,t),this.needsUpdate=!1}}_s.prototype.closestPointToSegment=function(){const t=new M,e=new M,s=new Fe;return function(i,r=null,n=null){const{start:a,end:o}=i,h=this.points;let l,c=1/0;for(let a=0;a<3;a++){const o=(a+1)%3;s.start.copy(h[a]),s.end.copy(h[o]),gs(s,i,t,e),l=t.distanceToSquared(e),l=2){(1===n?s.start:s.end).copy(p),r=2;break}if(r++,2===r&&-1===n)break}}return r}return function(a,c=null,p=!1){this.needsUpdate&&this.update(),a.isExtendedTriangle?a.needsUpdate&&a.update():(t.copy(a),t.update(),a=t);const y=this.plane,f=a.plane;if(Math.abs(y.normal.dot(f.normal))>1-1e-10){const t=this.satBounds,o=this.satAxes;s[0]=a.a,s[1]=a.b,s[2]=a.c;for(let e=0;e<4;e++){const r=t[e],n=o[e];if(i.setFromPoints(n,s),r.isSeparated(i))return!1}const h=a.satBounds,l=a.satAxes;e[0]=this.a,e[1]=this.b,e[2]=this.c;for(let t=0;t<4;t++){const s=h[t],r=l[t];if(i.setFromPoints(r,e),s.isSeparated(i))return!1}for(let t=0;t<4;t++){const a=o[t];for(let t=0;t<4;t++){const o=l[t];if(n.crossVectors(a,o),i.setFromPoints(n,e),r.setFromPoints(n,s),i.isSeparated(r))return!1}}return c&&(p||console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),c.start.set(0,0,0),c.end.set(0,0,0)),!0}{const t=m(this,f,u);if(1===t&&a.containsPoint(u.end))return c&&(c.start.copy(u.end),c.end.copy(u.end)),!0;if(2!==t)return!1;const e=m(a,y,d);if(1===e&&this.containsPoint(d.end))return c&&(c.start.copy(d.end),c.end.copy(d.end)),!0;if(2!==e)return!1;if(u.delta(o),d.delta(h),o.dot(h)<0){let t=d.start;d.start=d.end,d.end=t}const s=u.start.dot(o),i=u.end.dot(o),r=d.start.dot(o),n=d.end.dot(o);return(s===n||r===i||i0?c.start.copy(u.start):c.start.copy(d.start),l.subVectors(u.end,d.end),l.dot(o)<0?c.end.copy(u.end):c.end.copy(d.end)),!0)}}}(),_s.prototype.distanceToPoint=function(){const t=new M;return function(e){return this.closestPointToPoint(e,t),e.distanceTo(t)}}(),_s.prototype.distanceToTriangle=function(){const t=new M,e=new M,s=["a","b","c"],i=new Fe,r=new Fe;return function(n,a=null,o=null){const h=a||o?i:null;if(this.intersectsTriangle(n,h))return(a||o)&&(a&&h.getCenter(a),o&&h.getCenter(o)),0;let l=1/0;for(let e=0;e<3;e++){let i;const r=s[e],h=n[r];this.closestPointToPoint(h,t),i=h.distanceToSquared(t),inew M),this.satAxes=new Array(3).fill().map(()=>new M),this.satBounds=new Array(3).fill().map(()=>new fs),this.alignedSatBounds=new Array(3).fill().map(()=>new fs),this.needsUpdate=!1,t&&this.min.copy(t),e&&this.max.copy(e),s&&this.matrix.copy(s)}set(t,e,s){this.min.copy(t),this.max.copy(e),this.matrix.copy(s),this.needsUpdate=!0}copy(t){this.min.copy(t.min),this.max.copy(t.max),this.matrix.copy(t.matrix),this.needsUpdate=!0}}Ms.prototype.update=function(){const t=this.matrix,e=this.min,s=this.max,i=this.points;for(let r=0;r<=1;r++)for(let n=0;n<=1;n++)for(let a=0;a<=1;a++){const o=i[1*r|2*n|4*a];o.x=r?s.x:e.x,o.y=n?s.y:e.y,o.z=a?s.z:e.z,o.applyMatrix4(t)}const r=this.satBounds,n=this.satAxes,a=i[0];for(let t=0;t<3;t++){const e=n[t],s=r[t],o=i[1<new Fe),s=new Array(12).fill().map(()=>new Fe),i=new M,r=new M;return function(n,a=0,o=null,h=null){if(this.needsUpdate&&this.update(),this.intersectsBox(n))return(o||h)&&(n.getCenter(r),this.closestPointToPoint(r,i),n.closestPointToPoint(i,r),o&&o.copy(i),h&&h.copy(r)),0;const l=a*a,c=n.min,u=n.max,d=this.points;let p=1/0;for(let t=0;t<8;t++){const e=d[t];r.copy(e).clamp(c,u);const s=e.distanceToSquared(r);if(snew _s)}}const As=new Ss,vs=new class{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const t=[];let e=null;this.setBuffer=s=>{e&&t.push(e),e=s,this.float32Array=new Float32Array(s),this.uint16Array=new Uint16Array(s),this.uint32Array=new Uint32Array(s)},this.clearBuffer=()=>{e=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,0!==t.length&&this.setBuffer(t.pop())}}};let Ts,Bs;const ks=[],Ps=new zs(()=>new D);function Cs(t,e,s,i,r,n){Ts=Ps.getPrimitive(),Bs=Ps.getPrimitive(),ks.push(Ts,Bs),vs.setBuffer(t._roots[e]);const a=Vs(0,t.geometry,s,i,r,n);vs.clearBuffer(),Ps.releasePrimitive(Ts),Ps.releasePrimitive(Bs),ks.pop(),ks.pop();const o=ks.length;return o>0&&(Bs=ks[o-1],Ts=ks[o-2]),a}function Vs(t,e,s,i,r=null,n=0,a=0){const{float32Array:o,uint16Array:h,uint32Array:l}=vs;let c=2*t;if(ts(c,h)){const u=es(t,l),d=ss(c,h);return De(t,o,Ts),i(u,d,!1,a,n+t,Ts)}{const p=is(t),m=rs(t,l);let y,f,x,g,b=p,w=m;if(r&&(x=Ts,g=Bs,De(b,o,x),De(w,o,g),y=r(x),f=r(g),f=169,Us=new M,Ns=new M,Os=new M,qs=new w,Rs=new w,Ws=new w,Ds=new M,Ls=new M,js=new M,Hs=new M;function Ys(t,e,s,i,r,n,a){const o=3*i;let h=o+0,l=o+1,c=o+2;const u=t.index;t.index&&(h=u.getX(h),l=u.getX(l),c=u.getX(c));const{position:d,normal:p,uv:m,uv1:y}=t.attributes,f=function(t,e,s,i,r,n,a,o,h,l,c){Us.fromBufferAttribute(e,n),Ns.fromBufferAttribute(e,a),Os.fromBufferAttribute(e,o);const u=function(t,e,s,i,r,n,a,o){let h;if(h=1===n?t.intersectTriangle(i,s,e,!0,r):t.intersectTriangle(e,s,i,2!==n,r),null===h)return null;const l=t.origin.distanceTo(r);return lo?null:{distance:l,point:r.clone()}}(t,Us,Ns,Os,Hs,h,l,c);if(u){const e=new M;Gt.getBarycoord(Hs,Us,Ns,Os,e),i&&(qs.fromBufferAttribute(i,n),Rs.fromBufferAttribute(i,a),Ws.fromBufferAttribute(i,o),u.uv=Gt.getInterpolation(Hs,Us,Ns,Os,qs,Rs,Ws,new w)),r&&(qs.fromBufferAttribute(r,n),Rs.fromBufferAttribute(r,a),Ws.fromBufferAttribute(r,o),u.uv1=Gt.getInterpolation(Hs,Us,Ns,Os,qs,Rs,Ws,new w)),s&&(Ds.fromBufferAttribute(s,n),Ls.fromBufferAttribute(s,a),js.fromBufferAttribute(s,o),u.normal=Gt.getInterpolation(Hs,Us,Ns,Os,Ds,Ls,js,new M),u.normal.dot(t.direction)>0&&u.normal.multiplyScalar(-1));const h={a:n,b:a,c:o,normal:new M,materialIndex:0};Gt.getNormal(Us,Ns,Os,h.normal),u.face=h,u.faceIndex=n,Es&&(u.barycoord=e)}return u}(s,d,p,m,y,h,l,c,e,n,a);return f?(f.faceIndex=i,r&&r.push(f),f):null}function Xs(t,e,s,i){const r=t.a,n=t.b,a=t.c;let o=e,h=e+1,l=e+2;s&&(o=s.getX(o),h=s.getX(h),l=s.getX(l)),r.x=i.getX(o),r.y=i.getY(o),r.z=i.getZ(o),n.x=i.getX(h),n.y=i.getY(h),n.z=i.getZ(h),a.x=i.getX(l),a.y=i.getY(l),a.z=i.getZ(l)}function Gs(t,e,s,i,r,n,a){const{geometry:o}=s,{index:h}=o,l=o.attributes.position;for(let s=t,o=e+t;su&&(u=a),od&&(d=o),hp&&(p=h)}return(h[t+0]!==s||h[t+1]!==n||h[t+2]!==c||h[t+3]!==u||h[t+4]!==d||h[t+5]!==p)&&(h[t+0]=s,h[t+1]=n,h[t+2]=c,h[t+3]=u,h[t+4]=d,h[t+5]=p,!0)}{const i=t+8,r=a[t+6],o=i+s,l=r+s;let c=n,d=!1,p=!1;e?c||(d=e.has(o),p=e.has(l),c=!d&&!p):(d=!0,p=!0);const m=c||p;let y=!1;(c||d)&&(y=u(i,s,c));let f=!1;m&&(f=u(r,s,c));const x=y||f;if(x)for(let e=0;e<3;e++){const s=i+e,n=r+e,a=h[s],o=h[s+3],l=h[n],c=h[n+3];h[t+e]=ac?o:c}return x}}}function Js(t,e,s,i,r){let n,a,o,h,l,c;const u=1/s.direction.x,d=1/s.direction.y,p=1/s.direction.z,m=s.origin.x,y=s.origin.y,f=s.origin.z;let x=e[t],g=e[t+3],b=e[t+1],w=e[t+3+1],_=e[t+2],M=e[t+3+2];return u>=0?(n=(x-m)*u,a=(g-m)*u):(n=(g-m)*u,a=(x-m)*u),d>=0?(o=(b-y)*d,h=(w-y)*d):(o=(w-y)*d,h=(b-y)*d),!(n>h||o>a)&&((o>n||isNaN(n))&&(n=o),(h=0?(l=(_-f)*p,c=(M-f)*p):(l=(M-f)*p,c=(_-f)*p),!(n>c||l>a)&&((l>n||n!=n)&&(n=l),(c=i))}function $s(t,e,s,i,r,n,a){vs.setBuffer(t._roots[e]),Qs(0,t,s,i,r,n,a),vs.clearBuffer()}function Qs(t,e,s,i,r,n,a){const{float32Array:o,uint16Array:h,uint32Array:l}=vs,c=2*t;if(ts(c,h))!function(t,e,s,i,r,n,a,o){const{geometry:h,_indirectBuffer:l}=t;for(let t=i,l=i+r;t=0;let u,d;c?(u=is(t),d=rs(t,h)):(u=rs(t,h),d=is(t));const p=Js(u,a,i,r,n)?ei(u,e,s,i,r,n):null;if(p){const t=p.point[l];if(c?t<=a[d+o]:t>=a[d+o+3])return p}const m=Js(d,a,i,r,n)?ei(d,e,s,i,r,n):null;return p&&m?p.distance<=m.distance?p:m:p||m||null}}const si=new D,ii=new _s,ri=new _s,ni=new ot,ai=new Ms,oi=new Ms;function hi(t,e,s,i){vs.setBuffer(t._roots[e]);const r=li(0,t,s,i);return vs.clearBuffer(),r}function li(t,e,s,i,r=null){const{float32Array:n,uint16Array:a,uint32Array:o}=vs;let h=2*t;if(null===r&&(s.boundingBox||s.computeBoundingBox(),ai.set(s.boundingBox.min,s.boundingBox.max,i),r=ai),!ts(h,a)){const a=t+8,h=o[t+6];return De(a,n,si),r.intersectsBox(si)&&li(a,e,s,i,r)?!0:(De(h,n,si),!(!r.intersectsBox(si)||!li(h,e,s,i,r)))}{const r=e.geometry,l=r.index,c=r.attributes.position,u=s.index,d=s.attributes.position,p=es(t,o),m=ss(h,a);if(ni.copy(i).invert(),s.boundsTree)return De(t,n,oi),oi.matrix.copy(ni),oi.needsUpdate=!0,s.boundsTree.shapecast({intersectsBounds:t=>oi.intersectsBox(t),intersectsTriangle:t=>{t.a.applyMatrix4(i),t.b.applyMatrix4(i),t.c.applyMatrix4(i),t.needsUpdate=!0;for(let e=3*p,s=3*(m+p);eui.distanceToBox(t),intersectsBounds:(t,e,s)=>s{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:t=>di.distanceToBox(t),intersectsBounds:(t,e,s)=>s{for(let a=e,o=e+r;ad&&(d=a),op&&(p=o),hm&&(m=h)}}return(h[s+0]!==n||h[s+1]!==l||h[s+2]!==u||h[s+3]!==d||h[s+4]!==p||h[s+5]!==m)&&(h[s+0]=n,h[s+1]=l,h[s+2]=u,h[s+3]=d,h[s+4]=p,h[s+5]=m,!0)}{const t=s+8,i=a[s+6],r=t+n,o=i+n;let c=l,d=!1,p=!1;e?c||(d=e.has(r),p=e.has(o),c=!d&&!p):(d=!0,p=!0);const m=c||p;let y=!1;(c||d)&&(y=u(t,n,c));let f=!1;m&&(f=u(i,n,c));const x=y||f;if(x)for(let e=0;e<3;e++){const r=t+e,n=i+e,a=h[r],o=h[r+3],l=h[n],c=h[n+3];h[s+e]=ac?o:c}return x}}}function wi(t,e,s,i,r,n,a){vs.setBuffer(t._roots[e]),_i(0,t,s,i,r,n,a),vs.clearBuffer()}function _i(t,e,s,i,r,n,a){const{float32Array:o,uint16Array:h,uint32Array:l}=vs,c=2*t;if(ts(c,h))!function(t,e,s,i,r,n,a,o){const{geometry:h,_indirectBuffer:l}=t;for(let t=i,c=i+r;t=0;let u,d;c?(u=is(t),d=rs(t,h)):(u=rs(t,h),d=is(t));const p=Js(u,a,i,r,n)?Si(u,e,s,i,r,n):null;if(p){const t=p.point[l];if(c?t<=a[d+o]:t>=a[d+o+3])return p}const m=Js(d,a,i,r,n)?Si(d,e,s,i,r,n):null;return p&&m?p.distance<=m.distance?p:m:p||m||null}}const Ai=new D,vi=new _s,Ti=new _s,Bi=new ot,ki=new Ms,Pi=new Ms;function Ci(t,e,s,i){vs.setBuffer(t._roots[e]);const r=Vi(0,t,s,i);return vs.clearBuffer(),r}function Vi(t,e,s,i,r=null){const{float32Array:n,uint16Array:a,uint32Array:o}=vs;let h=2*t;if(null===r&&(s.boundingBox||s.computeBoundingBox(),ki.set(s.boundingBox.min,s.boundingBox.max,i),r=ki),!ts(h,a)){const a=t+8,h=o[t+6];return De(a,n,Ai),r.intersectsBox(Ai)&&Vi(a,e,s,i,r)?!0:(De(h,n,Ai),!(!r.intersectsBox(Ai)||!Vi(h,e,s,i,r)))}{const r=e.geometry,l=r.index,c=r.attributes.position,u=s.index,d=s.attributes.position,p=es(t,o),m=ss(h,a);if(Bi.copy(i).invert(),s.boundsTree)return De(t,n,Pi),Pi.matrix.copy(Bi),Pi.needsUpdate=!0,s.boundsTree.shapecast({intersectsBounds:t=>Pi.intersectsBox(t),intersectsTriangle:t=>{t.a.applyMatrix4(i),t.b.applyMatrix4(i),t.c.applyMatrix4(i),t.needsUpdate=!0;for(let s=p,i=m+p;sIi.distanceToBox(t),intersectsBounds:(t,e,s)=>s{if(e.boundsTree){const o=e.boundsTree;return o.shapecast({boundsTraverseOrder:t=>Ei.distanceToBox(t),intersectsBounds:(t,e,s)=>s{for(let _=e,M=e+a;_new D),ji=new D,Hi=new D,Yi=new D,Xi=new D;let Gi=!1;function Zi(t,e,s,i,r,n=0,a=0,o=0,h=0,l=null,c=!1){let u,d;c?(u=Di,d=Wi):(u=Wi,d=Di);const p=u.float32Array,m=u.uint32Array,y=u.uint16Array,f=d.float32Array,x=d.uint32Array,g=d.uint16Array,b=2*e,w=ts(2*t,y),_=ts(b,g);let M=!1;if(_&&w)M=c?r(es(e,x),ss(2*e,g),es(t,m),ss(2*t,y),h,a+e,o,n+t):r(es(t,m),ss(2*t,y),es(e,x),ss(2*e,g),o,n+t,h,a+e);else if(_){const l=Li.getPrimitive();De(e,f,l),l.applyMatrix4(s);const u=is(t),d=rs(t,m);De(u,p,ji),De(d,p,Hi);const y=l.intersectsBox(ji),x=l.intersectsBox(Hi);M=y&&Zi(e,u,i,s,r,a,n,h,o+1,l,!c)||x&&Zi(e,d,i,s,r,a,n,h,o+1,l,!c),Li.releasePrimitive(l)}else{const u=is(e),d=rs(e,x);De(u,f,Yi),De(d,f,Xi);const y=l.intersectsBox(Yi),g=l.intersectsBox(Xi);if(y&&g)M=Zi(t,u,s,i,r,n,a,o,h+1,l,c)||Zi(t,d,s,i,r,n,a,o,h+1,l,c);else if(y)if(w)M=Zi(t,u,s,i,r,n,a,o,h+1,l,c);else{const e=Li.getPrimitive();e.copy(Yi).applyMatrix4(s);const l=is(t),d=rs(t,m);De(l,p,ji),De(d,p,Hi);const y=e.intersectsBox(ji),f=e.intersectsBox(Hi);M=y&&Zi(u,l,i,s,r,a,n,h,o+1,e,!c)||f&&Zi(u,d,i,s,r,a,n,h,o+1,e,!c),Li.releasePrimitive(e)}else if(g)if(w)M=Zi(t,d,s,i,r,n,a,o,h+1,l,c);else{const e=Li.getPrimitive();e.copy(Xi).applyMatrix4(s);const l=is(t),u=rs(t,m);De(l,p,ji),De(u,p,Hi);const y=e.intersectsBox(ji),f=e.intersectsBox(Hi);M=y&&Zi(d,l,i,s,r,a,n,h,o+1,e,!c)||f&&Zi(d,u,i,s,r,a,n,h,o+1,e,!c),Li.releasePrimitive(e)}}return M}const Ji=new Ms,$i=new D,Qi={strategy:0,maxDepth:40,maxLeafTris:10,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,indirect:!1,verbose:!0,range:null};class Ki{static serialize(t,e={}){e={cloneBuffers:!0,...e};const s=t.geometry,i=t._roots,r=t._indirectBuffer,n=s.getIndex();let a;return a=e.cloneBuffers?{roots:i.map(t=>t.slice()),index:n?n.array.slice():null,indirectBuffer:r?r.slice():null}:{roots:i,index:n?n.array:null,indirectBuffer:r},a}static deserialize(t,e,s={}){s={setIndex:!0,indirect:Boolean(t.indirectBuffer),...s};const{index:i,roots:r,indirectBuffer:n}=t,a=new Ki(e,{...s,[Ne]:!0});if(a._roots=r,a._indirectBuffer=n||null,s.setIndex){const s=e.getIndex();if(null===s){const s=new re(t.index,1,!1);e.setIndex(s)}else s.array!==i&&(s.array.set(i),s.needsUpdate=!0)}return a}get indirect(){return!!this._indirectBuffer}constructor(t,e={}){if(!t.isBufferGeometry)throw new Error("MeshBVH: Only BufferGeometries are supported.");if(t.index&&t.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.");if((e=Object.assign({...Qi,[Ne]:!1},e)).useSharedArrayBuffer&&"undefined"==typeof SharedArrayBuffer)throw new Error("MeshBVH: SharedArrayBuffer is not available.");this.geometry=t,this._roots=null,this._indirectBuffer=null,e[Ne]||(ys(this,e),!t.boundingBox&&e.setBoundingBox&&(t.boundingBox=this.getBoundingBox(new D))),this.resolveTriangleIndex=e.indirect?t=>this._indirectBuffer[t]:t=>t}refit(t=null){return(this.indirect?bi:Zs)(this,t)}traverse(t,e=0){const s=this._roots[e],i=new Uint32Array(s),r=new Uint16Array(s);!function e(n,a=0){const o=2*n,h=r[o+15]===Ee;if(h){const e=i[n+6],l=r[o+14];t(a,h,new Float32Array(s,4*n,6),e,l)}else{const r=n+8,o=i[n+6],l=i[n+7];t(a,h,new Float32Array(s,4*n,6),l)||(e(r,a+1),e(o,a+1))}}(0)}raycast(t,e=0,s=0,i=1/0){const r=this._roots,n=this.geometry,a=[],o=e.isMaterial,h=Array.isArray(e),l=n.groups,c=o?e.side:e,u=this.indirect?wi:$s;for(let n=0,o=r.length;n!!t(i,r,n,o,h)||s(i,r,this,a,n,o,e)}else n||(n=a?(t,i,r,n)=>s(t,i,this,a,r,n,e):(t,e,s)=>s);let o=!1,h=0;const l=this._roots;for(let t=0,e=l.length;t{const e=this.resolveTriangleIndex(t);Xs(n,3*e,a,o)}:t=>{Xs(n,3*t,a,o)},l=As.getPrimitive(),c=t.geometry.index,u=t.geometry.attributes.position,d=t.indirect?e=>{const s=t.resolveTriangleIndex(e);Xs(l,3*s,c,u)}:t=>{Xs(l,3*t,c,u)};if(r){const t=(t,s,i,a,o,c,u,p)=>{for(let m=i,y=i+a;mJi.intersectsBox(t),intersectsTriangle:t=>Ji.intersectsTriangle(t)})}intersectsSphere(t){return this.shapecast({intersectsBounds:e=>t.intersectsBox(e),intersectsTriangle:e=>e.intersectsSphere(t)})}closestPointToGeometry(t,e,s={},i={},r=0,n=1/0){return(this.indirect?Ri:xi)(this,t,e,s,i,r,n)}closestPointToPoint(t,e={},s=0,i=1/0){return function(t,e,s={},i=0,r=1/0){const n=i*i,a=r*r;let o=1/0,h=null;if(t.shapecast({boundsTraverseOrder:t=>(Fs.copy(e).clamp(t.min,t.max),Fs.distanceToSquared(e)),intersectsBounds:(t,e,s)=>s{t.closestPointToPoint(e,Fs);const i=e.distanceToSquared(Fs);return i{De(0,new Float32Array(e),$i),t.union($i)}),t}}let tr;function er(t){return`#${Math.round(t.r).toString(16).padStart(2,"0")}${Math.round(t.g).toString(16).padStart(2,"0")}${Math.round(t.b).toString(16).padStart(2,"0")}`}function sr(t,e){return{r:parseInt(t.slice(1,3),16),g:parseInt(t.slice(3,5),16),b:parseInt(t.slice(5,7),16),a:e}}function ir(){if(0===Mesh.selected.length)return void Blockbench.showToastNotification({text:"No meshes selected"});if(Mesh.selected.length>1)return void Blockbench.showToastNotification({text:"Multiple meshes selected"});const t=function(){const t=localStorage.getItem("blockbench_baked_ao_settings"),e={sampleMethod:"random",highlightColor:{r:231,g:230,b:184,a:.3},shadowColor:{r:36,g:11,b:55,a:.5},samples:1e3,aoShadowSize:32,aoHighlightSize:8,retainTextureTransparency:!1,sampleTextureTransparency:!1,shadowGamma:1,highlightGamma:.5,simulateGroundPlane:!0};if(t)try{return{...e,...JSON.parse(t)}}catch(t){console.warn("Failed to parse saved AO settings, using defaults")}return e}();new Dialog("ambient_occlusion_config",{title:"Ambient Occlusion Settings",form:{highlight_color:{label:"Highlight Color",type:"color",value:er(t.highlightColor),description:"Color used for areas with high ambient lighting"},highlight_alpha:{label:"Highlight Opacity",type:"range",min:0,max:1,step:.01,value:t.highlightColor.a,description:"Opacity of the highlight color overlay"},highlight_gamma:{label:"Highlight Softness",type:"range",min:.2,max:2,step:.1,value:t.highlightGamma,description:"Gamma correction for highlight areas (lower = more contrast)"},ao_highlight_size:{label:"Highlight Size",type:"number",min:1,max:64,step:1,value:t.aoHighlightSize,description:"Ray distance for highlight detection (rays going into the surface)"},shadow_color:{label:"Shadow Color",type:"color",value:er(t.shadowColor),description:"Color used for occluded/shadowed areas"},shadow_alpha:{label:"Shadow Opacity",type:"range",min:0,max:1,step:.01,value:t.shadowColor.a,description:"Opacity of the shadow color overlay"},shadow_gamma:{label:"Shadow Softness",type:"range",min:.2,max:2,step:.1,value:t.shadowGamma,description:"Gamma correction for shadow areas (higher = softer shadows)"},ao_shadow_size:{label:"Shadow Size",type:"number",min:1,max:64,step:1,value:t.aoShadowSize,description:"Ray distance for shadow detection (rays going away from the surface)"},samples:{label:"Samples per pixel",type:"number",min:10,max:1e4,step:100,value:t.samples,description:"Number of samples per pixel (higher = better quality, slower). 100 recommended for uniform sampling, 1000 for random sampling."},sample_method:{label:"Sample Method",type:"inline_select",options:{random:"Random",uniform:"Uniform"},value:t.sampleMethod,description:"Method for sampling ambient occlusion rays. Random is slightly more accurate but noisier, uniform is smoother for less samples but is more prone to artifacts."},simulate_ground_plane:{label:"Simulate Ground Plane",type:"checkbox",value:t.simulateGroundPlane,description:"Simulate a ground plane, adding shadows at the base of the model"},retain_texture_transparency:{label:"Retain Texture Transparency",type:"checkbox",value:t.retainTextureTransparency,description:"Preserve the original transparency of textures"},sample_texture_transparency:{label:"Sample Texture Transparency",type:"checkbox",value:t.sampleTextureTransparency,description:"Consider texture transparency when calculating occlusion (slower but more accurate)"}},onConfirm:async function(t){const e={onProgress:t=>{Blockbench.setProgress(t),r.progress_bar.setProgress(t);const e=performance.now()-s,i=r.object.querySelector(".dialog_title");if(i)if(e>3e3||t>.2){const s=function(t){const e=Math.floor(t/1e3),s=Math.floor(e/60),i=e%60,r=s%60,n=Math.floor(s/60);return n>0?`${n}h ${r}m ${i}s`:r>0?`${r}m ${i}s`:`${i}s`}(e/t-e);i.textContent=`Baking Ambient Occlusion (~ ${s} remaining)`}else i.textContent="Baking Ambient Occlusion"},highlightColor:sr("#"+t.highlight_color.toHex(),t.highlight_alpha),shadowColor:sr("#"+t.shadow_color.toHex(),t.shadow_alpha),samples:t.samples,aoShadowSize:t.ao_shadow_size,aoHighlightSize:t.ao_highlight_size,retainTextureTransparency:t.retain_texture_transparency,sampleTextureTransparency:t.sample_texture_transparency,shadowGamma:t.shadow_gamma,highlightGamma:t.highlight_gamma,simulateGroundPlane:t.simulate_ground_plane,sampleMethod:t.sample_method};!function(t){localStorage.setItem("blockbench_baked_ao_settings",JSON.stringify(t))}({highlightColor:e.highlightColor,shadowColor:e.shadowColor,samples:e.samples,aoShadowSize:e.aoShadowSize,aoHighlightSize:e.aoHighlightSize,retainTextureTransparency:e.retainTextureTransparency,sampleTextureTransparency:e.sampleTextureTransparency,shadowGamma:e.shadowGamma,highlightGamma:e.highlightGamma,simulateGroundPlane:e.simulateGroundPlane,sampleMethod:e.sampleMethod});const s=performance.now(),i={cancelled:!1},r=new Dialog("bake_ambient_occlusion_loading",{title:"Baking Ambient Occlusion",progress_bar:{progress:0},cancel_on_click_outside:!1,singleButton:!0,buttons:["Cancel"],onCancel:function(){i.cancelled=!0}});r.show();try{await async function(t,e){let s=!1,i=!1,r=0,n=0;performance.mark("startAO");for(const a of Mesh.selected){let o=!1,h=0;a.forAllFaces(t=>{t.isSelected()&&(o=!0),h++});const l=await rr(a,o,t,e);s=s||l.anyMissing,i=i||l.anyWithTextures,r+=l.totalPixelsProcessed,n+=l.totalFacesProcessed}performance.mark("endAO");const a=performance.measure("AO Processing Time","startAO","endAO");console.log(`AO Processing Time: ${a.duration}ms`),i?s&&Blockbench.showToastNotification({text:"Some faces are missing textures"}):Blockbench.showToastNotification({text:"No textures found on selected meshes"})}(e,i)}finally{r.hide(),Blockbench.setProgress(0)}},buttons:["Confirm","Restore Defaults","Cancel"],onButton(t,e){1===t&&(localStorage.removeItem("blockbench_baked_ao_settings"),ir())}}).show()}async function rr(t,e,s,i){let r=!1,n=!1,a=0,o=0;const h=[];t.forAllFaces(t=>h.push(t));const l=new Map;for(const t of h){const s=t.getTexture();s?e&&!t.isSelected()||(n=!0,l.has(s)||l.set(s,[]),l.get(s).push(t)):r=!0}const[c]=function(t){if(!(t.mesh&&t.mesh instanceof THREE.Mesh))throw console.log(t),new Error("Invalid mesh object");const e=t.mesh.geometry;if(!e||!e.attributes||!e.attributes.position)throw console.log(e),new Error("Mesh does not have valid geometry attributes");const s=e.attributes.position;let i=-1/0,r=1/0;for(let t=0;ti&&(i=e),e{Object.keys(s[t]).forEach(e=>{const i=s[t][e],r=parseInt(t,10),n=parseInt(e,10);if(!0===i)for(let t=0;tsetTimeout(t,0)),o.cancelled)throw new Error("Job cancelled")}l++,a?.onProgress?.(l/e.length)}let c=0;return t.edit(t=>{const e=t.getContext("2d");for(const[t,s]of h){const[i,r]=t.split(",").map(t=>parseInt(t,10));let[n,o,h,l]=s.color;a.retainTextureTransparency&&(l*=e.getImageData(i,r,1,1).data[3]/255),e.fillStyle=`rgba(${n}, ${o}, ${h}, ${l})`,e.fillRect(i,r,1,1),c++}}),{pixelsProcessed:c,facesProcessed:e.length}}Plugin.register("baked_ambient_occlusion",{title:"Mr Salmon's Baked Ambient Occlusion",author:"Kai Salmon",description:"Baked Ambient Occlusion, creating instant shading",icon:"icon.png",version:"1.0.0",min_version:"4.8.0",variant:"both",repository:"https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion",has_changelog:!1,tags:["Texture","Shading"],onload(){tr=new Action("bake_ambient_occlusion",{name:"Bake Ambient Occlusion",description:"Perform ambient occlusion baking on selected meshes",icon:"cake",click:function(){ir()}}),MenuBar.addAction(tr,"filter")},onunload(){tr.delete()}});const ar={origin:new THREE.Vector3,direction:new THREE.Vector3,normal:new THREE.Vector3};function or(t,e,s,i,r,n,a,o,h){const[l,c,u]=t,[d,p,m]=s.getNormal(!0);ar.normal.set(d,p,m);let y=0,f=0;const x=o.samples;for(let t=0;t=0?o.aoShadowSize:o.aoHighlightSize,i=new THREE.Raycaster(ar.origin,e,.001,s),d=n.raycastFirst(i.ray,THREE.DoubleSide,.001,s);if(d){const t=d.face.normal;if(ar.direction.dot(t)>0&&(f+=1),o.sampleTextureTransparency){const t=a.faceIndexToBlockbenchFace.get(d.faceIndex);if(t){const[e,s]=t.localToUV(d.point),i=t.getTexture();y+=i?i.ctx.getImageData(e,s,1,1).data[3]/255:1}else y+=1}else y+=1}else r&&i.intersectObject(r).length>0&&(y+=1)}let g=1-y/x;const b=f/x;let w,_;return g<.5?(w=2*(.5-g),w=Math.pow(w,o.shadowGamma),_=o.shadowColor):(w=2*(g-.5),w=Math.pow(w,o.highlightGamma),_=o.highlightColor),[[_.r,_.g,_.b,_.a*w],b]}function hr(t){const e={},s=Math.PI*(3-Math.sqrt(5));for(let i=0;i; } let button: Action; (Plugin as any).register('baked_ambient_occlusion', { "title": "Mr Salmon's Baked Ambient Occlusion", "author": "Kai Salmon", "description": "Baked Ambient Occlusion, creating instant shading", "icon": "icon.png", "version": "1.0.0", "min_version": "4.8.0", "variant": "both", "repository": "https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion", "has_changelog": false, "tags": [ "Texture", "Shading" ], onload(): void { button = new Action('bake_ambient_occlusion', { name: 'Bake Ambient Occlusion', description: 'Perform ambient occlusion baking on selected meshes', icon: 'cake', click: function (): void { showAmbientOcclusionDialog(); } }); MenuBar.addAction(button, 'filter'); }, onunload(): void { button.delete(); } }); /** * Convert RGB color object to hex string for color picker */ function colorToHex(color: Color): string { const r = Math.round(color.r).toString(16).padStart(2, '0'); const g = Math.round(color.g).toString(16).padStart(2, '0'); const b = Math.round(color.b).toString(16).padStart(2, '0'); return `#${r}${g}${b}`; } /** * Convert hex string to RGB color object */ function hexToColor(hex: string, alpha: number): Color { const r = parseInt(hex.slice(1, 3), 16); const g = parseInt(hex.slice(3, 5), 16); const b = parseInt(hex.slice(5, 7), 16); return { r, g, b, a: alpha }; } function showAmbientOcclusionDialog(): void { if (Mesh.selected.length === 0) { Blockbench.showToastNotification({ text: 'No meshes selected', }); return; } if (Mesh.selected.length > 1) { Blockbench.showToastNotification({ text: 'Multiple meshes selected', }); return; } // Load saved settings or use defaults const savedSettings = getPluginSettings(); const dialog = new Dialog('ambient_occlusion_config', { title: 'Ambient Occlusion Settings', // width: 400, form: { highlight_color: { label: 'Highlight Color', type: 'color', value: colorToHex(savedSettings.highlightColor), description: 'Color used for areas with high ambient lighting' }, highlight_alpha: { label: 'Highlight Opacity', type: 'range', min: 0, max: 1, step: 0.01, value: savedSettings.highlightColor.a, description: 'Opacity of the highlight color overlay' }, highlight_gamma: { label: 'Highlight Softness', type: 'range', min: 0.2, max: 2.0, step: 0.1, value: savedSettings.highlightGamma, description: 'Gamma correction for highlight areas (lower = more contrast)' }, ao_highlight_size: { label: 'Highlight Size', type: 'number', min: 1, max: 64, step: 1, value: savedSettings.aoHighlightSize, description: 'Ray distance for highlight detection (rays going into the surface)' }, shadow_color: { label: 'Shadow Color', type: 'color', value: colorToHex(savedSettings.shadowColor), description: 'Color used for occluded/shadowed areas' }, shadow_alpha: { label: 'Shadow Opacity', type: 'range', min: 0, max: 1, step: 0.01, value: savedSettings.shadowColor.a, description: 'Opacity of the shadow color overlay' }, shadow_gamma: { label: 'Shadow Softness', type: 'range', min: 0.2, max: 2.0, step: 0.1, value: savedSettings.shadowGamma, description: 'Gamma correction for shadow areas (higher = softer shadows)' }, ao_shadow_size: { label: 'Shadow Size', type: 'number', min: 1, max: 64, step: 1, value: savedSettings.aoShadowSize, description: 'Ray distance for shadow detection (rays going away from the surface)' }, samples: { label: 'Samples per pixel', type: 'number', min: 10, max: 10000, step: 100, value: savedSettings.samples, description: 'Number of samples per pixel (higher = better quality, slower). 100 recommended for uniform sampling, 1000 for random sampling.' }, sample_method: { label: 'Sample Method', type: 'inline_select', options: { 'random': 'Random', 'uniform': 'Uniform', }, value: savedSettings.sampleMethod, description: 'Method for sampling ambient occlusion rays. Random is slightly more accurate but noisier, uniform is smoother for less samples but is more prone to artifacts.' }, simulate_ground_plane: { label: 'Simulate Ground Plane', type: 'checkbox', value: savedSettings.simulateGroundPlane, description: 'Simulate a ground plane, adding shadows at the base of the model' }, retain_texture_transparency: { label: 'Retain Texture Transparency', type: 'checkbox', value: savedSettings.retainTextureTransparency, description: 'Preserve the original transparency of textures' }, sample_texture_transparency: { label: 'Sample Texture Transparency', type: 'checkbox', value: savedSettings.sampleTextureTransparency, description: 'Consider texture transparency when calculating occlusion (slower but more accurate)' }, }, onConfirm: async function (formResult: any) { const options: BakeAmbientOcclusionOptions = { onProgress: (progress: number) => { Blockbench.setProgress(progress) loadingDialog.progress_bar!.setProgress(progress); const elapsedMs = performance.now() - startTime; const dialogObject: Element = (loadingDialog as any).object; const titleElem = dialogObject.querySelector('.dialog_title'); if (titleElem) { if (elapsedMs > 3000 || progress > 0.2) { const estimatedTotalMs = elapsedMs / progress; const estimatedRemainingMs = estimatedTotalMs - elapsedMs; const formattedTime = formatMsToReadableTime(estimatedRemainingMs); titleElem.textContent = `Baking Ambient Occlusion (~ ${formattedTime} remaining)`; } else { titleElem.textContent = `Baking Ambient Occlusion`; } } }, highlightColor: hexToColor('#' + formResult.highlight_color.toHex(), formResult.highlight_alpha), shadowColor: hexToColor('#' + formResult.shadow_color.toHex(), formResult.shadow_alpha), samples: formResult.samples, aoShadowSize: formResult.ao_shadow_size, aoHighlightSize: formResult.ao_highlight_size, retainTextureTransparency: formResult.retain_texture_transparency, sampleTextureTransparency: formResult.sample_texture_transparency, shadowGamma: formResult.shadow_gamma, highlightGamma: formResult.highlight_gamma, simulateGroundPlane: formResult.simulate_ground_plane, sampleMethod: formResult.sample_method }; // Save settings for next session savePluginSettings({ highlightColor: options.highlightColor, shadowColor: options.shadowColor, samples: options.samples, aoShadowSize: options.aoShadowSize, aoHighlightSize: options.aoHighlightSize, retainTextureTransparency: options.retainTextureTransparency, sampleTextureTransparency: options.sampleTextureTransparency, shadowGamma: options.shadowGamma, highlightGamma: options.highlightGamma, simulateGroundPlane: options.simulateGroundPlane, sampleMethod: options.sampleMethod }); const startTime = performance.now(); const jobController = { cancelled: false } const loadingDialog = new Dialog('bake_ambient_occlusion_loading', { title: 'Baking Ambient Occlusion', progress_bar: { progress: 0, }, cancel_on_click_outside: false, singleButton: true, buttons: ['Cancel'], onCancel: function () { jobController.cancelled = true; } }); loadingDialog.show(); try { await bakeAmbientOcclusion(options, jobController); } finally { loadingDialog.hide(); Blockbench.setProgress(0); } }, buttons: ['Confirm', 'Restore Defaults', 'Cancel'], onButton(button_index: number, e: Event): void { if (button_index === 1) { localStorage.removeItem('blockbench_baked_ao_settings'); showAmbientOcclusionDialog(); } }, }); dialog.show(); } interface BakeAmbientOcclusionOptions { sampleMethod: 'random' | 'uniform'; onProgress?: (progress: number) => void; highlightColor: Color; shadowColor: Color; samples: number; aoShadowSize: number; aoHighlightSize: number; retainTextureTransparency: boolean; sampleTextureTransparency: boolean; shadowGamma: number; highlightGamma: number; simulateGroundPlane: boolean; } interface JobController { cancelled: boolean; } async function bakeAmbientOcclusion(opts: BakeAmbientOcclusionOptions, jobController: JobController): Promise { let anyMissing: boolean = false; let anyWithTextures: boolean = false; let pixelCount: number = 0; let faceCount: number = 0; performance.mark("startAO"); for (const mesh of Mesh.selected) { let hasSelectedFaces: boolean = false; let facesInMesh = 0; mesh.forAllFaces((face: MeshFace) => { if (face.isSelected()) { hasSelectedFaces = true; } facesInMesh++; }); // Process each face const result = await processMeshFaces(mesh, hasSelectedFaces, opts, jobController); anyMissing = anyMissing || result.anyMissing; anyWithTextures = anyWithTextures || result.anyWithTextures; pixelCount += result.totalPixelsProcessed; faceCount += result.totalFacesProcessed; } performance.mark("endAO"); const measure: PerformanceMeasure = performance.measure("AO Processing Time", "startAO", "endAO"); console.log(`AO Processing Time: ${measure.duration}ms`); if (!anyWithTextures) { Blockbench.showToastNotification({ text: 'No textures found on selected meshes', }); } else if (anyMissing) { Blockbench.showToastNotification({ text: 'Some faces are missing textures', }); } } function buildFaceMapping(mesh: Mesh): FaceMapping { // NOTE: This code duplicates some esoteric logic in from within Blockbench const faceIndexToBlockbenchFace = new Map(); let currentFaceIndex = 0; for (let key in mesh.faces) { const face = mesh.faces[key]; const vertices = face.vertices; if (vertices.length < 3) continue; if (vertices.length === 3) { faceIndexToBlockbenchFace.set(currentFaceIndex, face); currentFaceIndex += 1; } else if (vertices.length === 4) { faceIndexToBlockbenchFace.set(currentFaceIndex, face); faceIndexToBlockbenchFace.set(currentFaceIndex + 1, face); currentFaceIndex += 2; } } return { faceIndexToBlockbenchFace }; } interface ProcessMeshFacesResult { anyMissing: boolean; anyWithTextures: boolean; totalPixelsProcessed: number; totalFacesProcessed: number; } async function processMeshFaces(mesh: Mesh, hasSelectedFaces: boolean, opts: BakeAmbientOcclusionOptions, jobController: JobController): Promise { let anyMissing: boolean = false; let anyWithTextures: boolean = false; let totalPixelsProcessed: number = 0; let totalFacesProcessed = 0; const faces: MeshFace[] = []; mesh.forAllFaces((face: MeshFace) => faces.push(face)); // Group faces by texture const facesByTexture: Map = new Map(); for (const face of faces) { const tex: Texture | undefined = face.getTexture(); if (!tex) { anyMissing = true; continue; } if (hasSelectedFaces && !face.isSelected()) continue; anyWithTextures = true; if (!facesByTexture.has(tex)) { facesByTexture.set(tex, []); } facesByTexture.get(tex)!.push(face); } const [lowestY]: [number, number] = getHighestAndLowestY(mesh); const groundPlane: THREE.Mesh | null = opts.simulateGroundPlane ? createGroundPlane(lowestY) : null; const geometry: THREE.BufferGeometry = (mesh.mesh as THREE.Mesh).geometry; const geometryBackup = geometry.clone(); // Backup as BVH mutates the geometry in a way that causes bugs in Blockbench const bvh: MeshBVH = new MeshBVH(geometry, { indirect: true, maxDepth: 1000, maxLeafTris: 1, }); const faceMapping = buildFaceMapping(mesh); try { for (const [texture, textureFaces] of facesByTexture) { const { pixelsProcessed, facesProcessed } = await processTextureWithFaces( texture, textureFaces, mesh, groundPlane, bvh, faceMapping, opts, jobController ); totalPixelsProcessed += pixelsProcessed; totalFacesProcessed += facesProcessed; } return { anyMissing, anyWithTextures, totalPixelsProcessed, totalFacesProcessed }; } finally { (mesh.mesh as THREE.Mesh).geometry = geometryBackup; } } function createGroundPlane(lowestY: number) { const groundPlane: THREE.Mesh = new THREE.Mesh( new THREE.PlaneGeometry(1000, 1000), new THREE.MeshBasicMaterial({ color: 0x000000, side: THREE.FrontSide, transparent: true, opacity: 0.5 }) ); groundPlane.rotation.set(-Math.PI / 2, 0, 0); // Rotate to be horizontal groundPlane.position.setY(lowestY - 1); groundPlane.updateMatrix(); groundPlane.updateWorldMatrix(false, false); return groundPlane; } async function processTextureWithFaces( texture: Texture, faces: MeshFace[], mesh: Mesh, groundPlane: THREE.Mesh | null, bvh: MeshBVH, faceMapping: FaceMapping, opts: BakeAmbientOcclusionOptions, jobController: JobController ): Promise<{ pixelsProcessed: number; facesProcessed: number; }> { const bestResults: Map = new Map(); let facesProcessed: number = 0; for (const face of faces) { const occupationMatrix: Record> = face.getOccupationMatrix(); const texture = face.getTexture(); if (!texture) continue; const pixelDensityU = texture.width / texture.uv_width; const pixelDensityV = texture.height / texture.uv_height; if (pixelDensityU !== pixelDensityV) { throw new Error(`Non-uniform pixel density detected for texture ${texture.name}`); } const pixelCoords: [number, number][] = []; Object.keys(occupationMatrix).forEach((uStr: string) => { Object.keys(occupationMatrix[uStr]).forEach((vStr: string) => { const value: boolean = occupationMatrix[uStr][vStr]; const u = parseInt(uStr, 10); const v = parseInt(vStr, 10); if (value === true) { for (let x = 0; x < pixelDensityU; x++) { for (let y = 0; y < pixelDensityV; y++) { pixelCoords.push([Math.floor(u * pixelDensityU + x), Math.floor(v * pixelDensityV + y)]); } } } }); }); let i = 0; // Process pixels for this face for (const [u, v] of pixelCoords) { const key: string = `${u},${v}`; // Get x,y,z in 3d space of the face at this u,v let { x, y, z } = face.UVToLocal([(u + 0.5) / pixelDensityU, (v + 0.5) / pixelDensityV]); const result = calculateAmbientOcclusion([x, y, z], [u, v], face, mesh, groundPlane, bvh, faceMapping, opts, generateFibonacciSpherePoints(opts.samples)); if (result) { const [color, backfaceRatio] = result; // Check if this is the best result for this pixel so far const existing = bestResults.get(key); if (!existing || backfaceRatio < existing.backfaceRatio) { bestResults.set(key, { color: color, backfaceRatio: backfaceRatio }); } } i++; if (i % 32 === 0) { // Yield to allow UI updates await new Promise(resolve => setTimeout(resolve, 0)); } if (jobController.cancelled) { throw new Error('Job cancelled'); } } facesProcessed++; opts?.onProgress?.(facesProcessed / faces.length); } let processedPixels: number = 0; texture.edit((htmlCanvasElement: HTMLCanvasElement) => { const ctx: CanvasRenderingContext2D = htmlCanvasElement.getContext('2d')!; for (const [pixelKey, result] of bestResults) { const [u, v] = pixelKey.split(',').map(x => parseInt(x, 10)); let [r, g, b, a] = result.color; if (opts.retainTextureTransparency) { const srcAlpha = ctx.getImageData(u, v, 1, 1).data[3]; a *= srcAlpha / 255; } ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; ctx.fillRect(u, v, 1, 1); processedPixels++; } }); return { pixelsProcessed: processedPixels, facesProcessed: faces.length }; } const vectorPool: VectorPool = { origin: new THREE.Vector3(), direction: new THREE.Vector3(), normal: new THREE.Vector3() }; function calculateAmbientOcclusion( position: [number, number, number], uv: [number, number], face: MeshFace, mesh: Mesh, groundPlane: THREE.Mesh | null, bvh: MeshBVH, faceMapping: FaceMapping, opts: BakeAmbientOcclusionOptions, spherePoints: Record, ): [[number, number, number, number], number] | null { const [x, y, z]: [number, number, number] = position; const [normalX, normalY, normalZ]: [number, number, number] = face.getNormal(true); vectorPool.normal.set(normalX, normalY, normalZ); let occlusion: number = 0; let backfaceHits: number = 0; const rayCount: number = opts.samples; for (let i: number = 0; i < rayCount; i++) { let direction: THREE.Vector3; vectorPool.origin.set(x, y, z) .addScaledVector(vectorPool.normal, 0.5); if (opts.sampleMethod === 'random') { vectorPool.origin.x += (Math.random() - 0.5) * 0.5 vectorPool.origin.y += (Math.random() - 0.5) * 0.5; vectorPool.origin.z += (Math.random() - 0.5) * 0.5; vectorPool.direction.set( (Math.random() - 0.5) * 2, (Math.random() - 0.5) * 2, (Math.random() - 0.5) * 2 ).normalize(); direction = vectorPool.direction; } else { direction = spherePoints[i]; } const rayDot = direction.dot(vectorPool.normal); const radius = rayDot >= 0 ? opts.aoShadowSize : opts.aoHighlightSize; const raycaster: THREE.Raycaster = new THREE.Raycaster(vectorPool.origin, direction, 0.001, radius); const hit = bvh.raycastFirst(raycaster.ray, THREE.DoubleSide, 0.001, radius); if (hit) { const faceNormal = hit.face!.normal!; const dot = vectorPool.direction.dot(faceNormal); if (dot > 0) { backfaceHits += 1; } if (!opts.sampleTextureTransparency) { occlusion += 1; } else { // Use the optimized face lookup instead of the expensive linear search const blockbenchFace = faceMapping.faceIndexToBlockbenchFace.get(hit.faceIndex!); if (blockbenchFace) { const [hitU, hitV] = blockbenchFace.localToUV(hit.point!); const texture: Texture | undefined = blockbenchFace.getTexture(); if (texture) { const pixelColor: ImageData = texture.ctx.getImageData(hitU, hitV, 1, 1); occlusion += pixelColor.data[3] / 255; } else { occlusion += 1; } } else { // Fallback to 1 if face not found (shouldn't happen with proper mapping) occlusion += 1; } } } else { // Check if the ray intersects the ground plane const groundPlaneHit = groundPlane && raycaster.intersectObject(groundPlane).length > 0; if (groundPlaneHit) { occlusion += 1; } } } let occlusionFactor: number = 1 - occlusion / rayCount; const backfaceRatio = backfaceHits / rayCount; let t: number; let color: Color; if (occlusionFactor < 0.5) { t = (0.5 - occlusionFactor) * 2; t = Math.pow(t, opts.shadowGamma); color = opts.shadowColor; } else { t = (occlusionFactor - 0.5) * 2; t = Math.pow(t, opts.highlightGamma); color = opts.highlightColor; } return [ [color.r, color.g, color.b, color.a * t], backfaceRatio ]; } /** * Get the highest and lowest Y coordinates of all vertices in a mesh * @param mesh - The mesh to analyze * @returns [lowestY, highestY] */ function getHighestAndLowestY(mesh: Mesh): [number, number] { if (!mesh.mesh || !(mesh.mesh instanceof THREE.Mesh)) { console.log(mesh); throw new Error('Invalid mesh object'); } const geometry = mesh.mesh.geometry; if (!geometry || !geometry.attributes || !geometry.attributes.position) { console.log(geometry); throw new Error('Mesh does not have valid geometry attributes'); } const positionAttribute: THREE.BufferAttribute = geometry.attributes.position as THREE.BufferAttribute; let highestY: number = -Infinity; let lowestY: number = Infinity; for (let i: number = 0; i < positionAttribute.count; i++) { const y: number = positionAttribute.getY(i); if (y > highestY) highestY = y; if (y < lowestY) lowestY = y; } return [lowestY, highestY]; } function formatMsToReadableTime(estimatedRemainingMs: number) { const totalSeconds = Math.floor(estimatedRemainingMs / 1000); const totalMinutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; const minutes = totalMinutes % 60; const hours = Math.floor(totalMinutes / 60); if (hours > 0) { return `${hours}h ${minutes}m ${seconds}s`; } if (minutes > 0) { return `${minutes}m ${seconds}s`; } return `${seconds}s`; } function generateFibonacciSpherePoints(n: number): Record { const points: Record = {}; const phi = Math.PI * (3 - Math.sqrt(5)); // Golden angle in radians for (let i = 0; i < n; i++) { const y = 1 - (i / (n - 1)) * 2; // y goes from 1 to -1 const radius = Math.sqrt(1 - y * y); // Radius at y const theta = phi * i; // Golden angle increment points[i] = new THREE.Vector3( radius * Math.cos(theta), y, radius * Math.sin(theta) ); } return points; } function getPluginSettings(): BakeAmbientOcclusionOptions { const savedSettings = localStorage.getItem('blockbench_baked_ao_settings'); const defaultSettings = { sampleMethod: 'random' as 'random' | 'uniform', highlightColor: { r: 231, g: 230, b: 184, a: 0.3 }, shadowColor: { r: 36, g: 11, b: 55, a: 0.5 }, samples: 1000, aoShadowSize: 32, aoHighlightSize: 8, retainTextureTransparency: false, sampleTextureTransparency: false, shadowGamma: 1.0, highlightGamma: 0.5, simulateGroundPlane: true }; if (savedSettings) { try { return { ...defaultSettings, ...JSON.parse(savedSettings) }; } catch (e) { console.warn('Failed to parse saved AO settings, using defaults'); } } return defaultSettings; } function savePluginSettings(options: Partial): void { localStorage.setItem('blockbench_baked_ao_settings', JSON.stringify(options)); } ================================================ FILE: plugins/baked_ambient_occlusion/src/types.d.ts ================================================ declare namespace Blockbench { type Mesh = import('blockbench-types').Mesh; type Texture = import('blockbench-types').Texture; type MeshFace = import('blockbench-types').MeshFace; } ================================================ FILE: plugins/baked_ambient_occlusion/tsconfig.json ================================================ { "compilerOptions": { "target": "ES2020", "module": "ESNext", "moduleResolution": "node", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "declaration": false, "outDir": "dist", "rootDir": "src", "resolveJsonModule": true, "allowSyntheticDefaultImports": true, "lib": ["ES2020", "DOM"], "types": ["blockbench-types"] }, "include": [ "src/**/*" ], "exclude": [ "node_modules", "dist" ] } ================================================ FILE: plugins/baked_ambient_occlusion/webpack.config.js ================================================ const path = require('path'); module.exports = { entry: './src/index.ts', module: { rules: [ { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/, }, ], }, resolve: { extensions: ['.tsx', '.ts', '.js'], }, output: { filename: 'baked_ambient_occlusion.js', path: path.resolve(__dirname, 'dist'), library: { type: 'umd', }, globalObject: 'this', }, externals: { // These are provided by Blockbench globally 'blockbench': 'Blockbench', }, optimization: { minimize: true, }, }; ================================================ FILE: plugins/bakery.js ================================================ /// (function() { var bake_action; Plugin.register('bakery', { title: 'Bakery', icon: 'storefront', author: 'JannisX11', description: 'Bakes complex animations into simple linear keyframes', version: '1.1.1', min_version: '3.7.0', variant: 'both', onload() { bake_action = new Action('bake_animations', { name: 'Bake Animations', icon: 'storefront', category: 'animation', condition: {modes: ['animate']}, click: function(ev) { if (Timeline.selected.length === 0) { Blockbench.showMessage('No keyframes selected', 'center') return; } new Dialog({ id: 'bake_animations', title: 'Bake Animations', icon: 'storefront', form: { rate: {label: 'Rate', type: 'number', value: 1}, spherical_interpolation: {label: 'Spherical Interpolation', type: 'checkbox', value: false}, }, onConfirm: function(formData) { this.hide() let target_keyframes = Timeline.selected.slice(); let keyframes = Timeline.selected.slice(); Undo.initEdit({keyframes}); let animators = []; Timeline.selected.forEach(kf => animators.safePush(kf.animator)); let channels = ['rotation', 'position', 'scale']; animators.forEach(animator => { let mesh = animator.getGroup().mesh; channels.forEach(channel => { if (!animator[channel]) return; let kfs = animator[channel].filter(kf => target_keyframes.includes(kf)); if (kfs.length < 2) return; kfs.sort((a, b) => a.time - b.time); let [min, max] = [kfs[0].time, kfs.last().time]; let step = 1/Animation.selected.snapping*formData.rate || 0.1; let new_keyframes = []; for (let time = min; time <= max; time += step) { Timeline.time = time; let keyframe = kfs.find(kf => Math.epsilon(kf.time, time, 0.006)); if (!keyframe) { keyframe = new Keyframe({ channel, time }, null, animator); if (channel == 'rotation' && formData.spherical_interpolation) { let before = kfs.findLast(kf => kf.time < time); let after = kfs.find(kf => kf.time > time); if (before && after) { let quat_before = before.getFixed(0, true); let quat_after = after.getFixed(0, true); let t = Math.getLerp(before.time, after.time, time); let slerp = quat_before.slerp(quat_after, t); let euler = new THREE.Euler().setFromQuaternion(slerp, mesh.rotation.order); if (Blockbench.isNewerThan('4.99')) { keyframe.set('x', Math.trimDeg( ( Math.radToDeg(euler.x - mesh.fix_rotation.x)) )); keyframe.set('y', Math.trimDeg( ( Math.radToDeg(euler.y - mesh.fix_rotation.y)) )); keyframe.set('z', Math.trimDeg( ( Math.radToDeg(euler.z - mesh.fix_rotation.z)) )); } else { keyframe.set('x', Math.trimDeg( (-Math.radToDeg(euler.x - mesh.fix_rotation.x)) )); keyframe.set('y', Math.trimDeg( (-Math.radToDeg(euler.y - mesh.fix_rotation.y)) )); keyframe.set('z', Math.trimDeg( ( Math.radToDeg(euler.z - mesh.fix_rotation.z)) )); } } } else { animator.fillValues(keyframe, null, true, false); } new_keyframes.push(keyframe); } } new_keyframes.forEach(kf => { animator[channel].push(kf); keyframes.push(kf); kf.animator = animator; }) target_keyframes.push(...new_keyframes); }) }) target_keyframes.forEach(kf => { if (!channels.includes(kf.channel)) return; Timeline.time = kf.time; kf.animator.fillValues(kf, null, false); kf.interpolation = 'linear'; }); TickUpdates.keyframes = true; Animator.preview(); Undo.finishEdit('bake keyframes'); } }).show() } }) MenuBar.addAction(bake_action, 'animation') }, onunload() { bake_action.delete() } }); })() ================================================ FILE: plugins/bamo/bamo.js ================================================ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&": /*!********************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js& ***! \********************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/OptionArrays.js */ "./src/util/OptionArrays.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ data: function data() { return { step: "start", rotationTypes: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.rotationTypes, soundOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.soundOptions, materialOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.materialOptions, transparencyOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.transparencyOptions, tabOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.tabOptions, particleOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.particleOptions, customTypeOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.customTypeOptions, parentData: this.$parent.$data }; }, methods: { Textures: function Textures() { return Texture.all; }, createJSON: function createJSON() { this.$parent.createJSON(); }, changePage: function changePage(event, page) { if (this.parentData.properties.displayName == "") { this.parentData.error = "name"; } else { if (this.step == "types" && page == "physical" || this.step == "physical" && page == "types") { if (this.parentData.properties.types.block) { page = "variant"; } else { page = "custom"; } } this.parentData.error = ""; this.step = page; } }, toggleType: function toggleType(event, type) { if (this.parentData.properties.types.custom && type == "custom") { this.parentData.properties.types.block = false; this.parentData.properties.types.stair = false; this.parentData.properties.types.slab = false; this.parentData.properties.types.wall = false; return; } if (this.parentData.properties.types.block && type == "block") { this.parentData.properties.types.custom = false; return; } }, reset: function reset(event) { this.parentData.error = ""; this.step = "start"; } } }); /***/ }), /***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&": /*!***************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=script&lang=js& ***! \***************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ "./node_modules/core-js/modules/es.function.name.js"); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ "./node_modules/core-js/modules/es.array.for-each.js"); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ "./node_modules/core-js/modules/web.dom-collections.for-each.js"); /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var core_js_modules_es_object_keys_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.object.keys.js */ "./node_modules/core-js/modules/es.object.keys.js"); /* harmony import */ var core_js_modules_es_object_keys_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_keys_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ "./node_modules/core-js/modules/es.regexp.exec.js"); /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ "./node_modules/core-js/modules/es.string.split.js"); /* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ "./node_modules/core-js/modules/es.array.slice.js"); /* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ "./node_modules/core-js/modules/es.string.replace.js"); /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.date.to-string.js */ "./node_modules/core-js/modules/es.date.to-string.js"); /* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ "./node_modules/core-js/modules/es.regexp.to-string.js"); /* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ "./node_modules/core-js/modules/es.symbol.js"); /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ "./node_modules/core-js/modules/es.symbol.description.js"); /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_12__); /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ "./node_modules/core-js/modules/es.symbol.iterator.js"); /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_13__); /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ "./node_modules/core-js/modules/es.array.iterator.js"); /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_14__); /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ "./node_modules/core-js/modules/es.string.iterator.js"); /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_15__); /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ "./node_modules/core-js/modules/web.dom-collections.iterator.js"); /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_16__); /* harmony import */ var _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../util/OptionArrays.js */ "./src/util/OptionArrays.js"); /* harmony import */ var _util_GenStates_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../util/GenStates.js */ "./src/util/GenStates.js"); /* harmony import */ var _util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../util/GenDataFiles.js */ "./src/util/GenDataFiles.js"); /* harmony import */ var _util_Utils_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../util/Utils.js */ "./src/util/Utils.js"); /* harmony import */ var _util_Settings_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../util/Settings.js */ "./src/util/Settings.js"); /* harmony import */ var _BamoAdvancedProperties_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./BamoAdvancedProperties.vue */ "./src/components/BamoAdvancedProperties.vue"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ components: { BamoAdvancedProperties: _BamoAdvancedProperties_vue__WEBPACK_IMPORTED_MODULE_22__["default"] }, data: function data() { return { step: "start", error: "", rotationTypes: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.rotationTypes, soundOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.soundOptions, materialOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.materialOptions, transparencyOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.transparencyOptions, tabOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.tabOptions, particleOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.particleOptions, customTypeOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.customTypeOptions, properties: _util_Settings_js__WEBPACK_IMPORTED_MODULE_21__.BAMO_SETTINGS_DEFAULT, lastID: "", swap: false }; }, methods: { updateValues: function updateValues() { if (Project.uuid != this.lastID) { this.properties = _util_Settings_js__WEBPACK_IMPORTED_MODULE_21__["default"][Project.uuid]; this.lastID = Project.uuid; this.swap = true; this.reset(null); } // Initialize the textures if not done so yet if (this.properties.variant["default"].all == "") { this.properties.variant["default"].all = Texture.all[0].name; this.properties.variant.stair.top = Texture.all[0].name; this.properties.variant.stair.bottom = Texture.all[0].name; this.properties.variant.stair.side = Texture.all[0].name; this.properties.variant.slab.top = Texture.all[0].name; this.properties.variant.slab.bottom = Texture.all[0].name; this.properties.variant.slab.side = Texture.all[0].name; this.properties.variant.wall.wall = Texture.all[0].name; } }, Textures: function Textures() { return Texture.all; }, changePage: function changePage(event, page) { if (this.properties.displayName == "") { this.error = "name"; } else { if (this.step == "types" && page == "physical" || this.step == "physical" && page == "types") { if (this.properties.types.block) { page = "variant"; } } this.error = ""; this.step = page; } }, toggleType: function toggleType(event, type) { if (this.properties.types.custom && type == "custom") { this.properties.types.block = false; this.properties.types.stair = false; this.properties.types.slab = false; this.properties.types.wall = false; return; } if (this.properties.types.block && type == "block") { this.properties.types.custom = false; return; } }, reset: function reset(event) { this.error = ""; this.step = "start"; }, createJSON: function createJSON(event) { var _this = this; // Ensure a name is set if (this.properties.displayName == "") { this.error = "name"; return; } // Ensure a particle texture is set var part = false; Texture.all.forEach(function (tx) { if (tx.particle == true) { part = true; } }); if (part == false) { Blockbench.showMessageBox({ buttons: ["Ok"], title: "Error", message: "Please ensure you have set a particle texture" }); return; } var zip = new JSZip(); // Trim invalid chars from the name var packName = (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(this.properties.displayName); // Define folder locations var objFolder = settings.minecraftFolder.value + "\\bamopacks\\" + packName + "\\objects\\"; var blockstatesFolder = settings.minecraftFolder.value + "\\bamopacks\\" + packName + "\\assets\\" + this.properties.namespace + "\\blockstates\\"; var blockModelsFolder = settings.minecraftFolder.value + "\\bamopacks\\" + packName + "\\assets\\" + this.properties.namespace + "\\models\\block\\"; var itemModelsFolder = settings.minecraftFolder.value + "\\bamopacks\\" + packName + "\\assets\\" + this.properties.namespace + "\\models\\item\\"; var dataFolder = settings.minecraftFolder.value + "\\bamopacks\\" + packName + "\\data\\"; var blockTextureFolderVersion = this.properties.version == "1.20.1" ? "block" : "blocks"; var blockTexturesFolder = settings.minecraftFolder.value + "\\bamopacks\\" + packName + "\\assets\\" + this.properties.namespace + "\\textures\\" + blockTextureFolderVersion + "\\"; // Create the folders if they dont exist var folderList = [objFolder, blockstatesFolder, blockModelsFolder, itemModelsFolder, blockTexturesFolder, dataFolder]; var fs = __webpack_require__(/*! fs */ "fs"); folderList.forEach(function (folder) { if (!fs.existsSync(folder)) { fs.mkdirSync(folder, { recursive: true }); } }); // Create mcmeta file // Format ID is 15 for 1.20.1, 8 for 1.18.2, and 6 for 1.16.5 var formatID = this.properties.version == "1.20.1" ? 15 : this.properties.version == "1.18.2" ? 8 : 6; var mcmetaData = { "pack": { "pack_format": formatID, "description": "Resource Pack for BAMO test files" } }; fs.writeFile(settings.minecraftFolder.value + "\\bamopacks\\" + packName + "\\pack.mcmeta", JSON.stringify(mcmetaData), "utf8", function (err) { if (err != null) { console.log("Error generating mcmeta file:", err); } }); zip.file("pack.mcmeta", JSON.stringify(mcmetaData)); // Generate block name from the displayname var blockName = (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(this.properties.displayName); //generate the list of blocks to be exported var blockList = []; var codecData = Format.codec.compile(); // Custom Block if (this.properties.types.custom) { // Pull the model data from the codec var modelData = JSON.parse(codecData); modelData["parent"] = "block/block"; var stateData = ""; // Create blockstates data if (this.properties.rotType == "y_axis") { stateData = JSON.stringify({ "variants": { "facing=north": { "model": this.properties.namespace + ":block/" + blockName }, "facing=east": { "model": this.properties.namespace + ":block/" + blockName, "y": 90 }, "facing=south": { "model": this.properties.namespace + ":block/" + blockName, "y": 180 }, "facing=west": { "model": this.properties.namespace + ":block/" + blockName, "y": 270 } } }); } else { stateData = JSON.stringify({ "variants": { "": { "model": this.properties.namespace + ":block/" + blockName } } }); } var textureData = {}; // Setup texture dict ns = this.properties.namespace; Object.keys(modelData.textures).forEach(function (key) { var comp; var partCheck; if (_typeof(modelData.textures[key]) === 'object') { comp = modelData.textures[key]["id"]; partCheck = modelData.textures[key].particle; } else if (typeof modelData.textures[key] === 'string') { comp = key; partCheck = key == "particle"; } Texture.all.forEach(function (tx) { if (tx.id == comp || partCheck && tx.particle == true) { if (tx.namespace == "") { textureData[key] = ns + ":" + blockTextureFolderVersion + "/" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name.split(".")[0]); } else { textureData[key] = tx.namespace + ":" + tx.folder + "/" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name.split(".")[0]); } } }); }); // Looting file var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, blockName); var lootTags = dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\" + blockName + ".json"; fs.mkdirSync(dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\", { recursive: true }); fs.writeFile(lootTags, lootData, "utf8", function (err) { if (err != null) { console.log("Error found when writing custom block looting file:", err); } }); zip.file("data/" + this.properties.namespace + "/loot_tables/blocks/" + blockName + ".json", lootData); // Stonecutting Table Recipes (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, blockName, dataFolder, zip); modelData.textures = textureData; var boxList = []; modelData.elements.forEach(function (model) { boxList.push([model["from"], model["to"]]); }); blockList.push({ "name": blockName, "types": [], "model": modelData, "state": stateData, "hitbox": boxList }); } // Regular Block if (this.properties.types.block) { var modelData = {}; modelData["credit"] = codecData["credit"]; modelData["parent"] = "block/cube_all"; modelData["textures"] = { "all": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant["default"].all, this.properties.namespace), "particle": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)("particle", this.properties.namespace) }; // Looting file var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, blockName); var lootTags = dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\" + blockName + ".json"; fs.mkdirSync(dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\", { recursive: true }); fs.writeFile(lootTags, lootData, "utf8", function (err) { if (err != null) { console.log("Error found when writing wall tags:", err); } }); zip.file("data/" + this.properties.namespace + "/loot_tables/blocks/" + blockName + ".json", lootData); // Stonecutting Table Recipes (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, blockName, dataFolder, zip); var state = JSON.stringify({ "variants": { "": { "model": this.properties.namespace + ":block/" + blockName } } }); var typeList = []; if (this.properties.types.stair) typeList.push("stairs"); if (this.properties.types.slab) typeList.push("slab"); if (this.properties.types.wall) typeList.push("wall"); blockList.push({ "name": blockName, "types": typeList, "state": state, "model": modelData, "hitbox": [] }); } // Stair Block if (this.properties.types.stair) { var name = blockName + "_stairs"; var modelData = {}; modelData["credit"] = codecData["credit"]; modelData["parent"] = "minecraft:block/stairs"; modelData["textures"] = { "top": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.stair.top, this.properties.namespace), "bottom": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.stair.bottom, this.properties.namespace), "side": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.stair.side, this.properties.namespace), "particle": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)("particle", this.properties.namespace) }; // Looting file var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, name); var lootTags = dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\" + name + ".json"; fs.mkdirSync(dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\", { recursive: true }); fs.writeFile(lootTags, lootData, "utf8", function (err) { if (err != null) { console.log("Error found when writing wall tags:", err); } }); zip.file("data/" + this.properties.namespace + "/loot_tables/blocks/" + name + ".json", lootData); // Stonecutting Table Recipes (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, name, dataFolder, zip); // Write state var state = (0,_util_GenStates_js__WEBPACK_IMPORTED_MODULE_18__.genStairState)(this.properties.namespace, "block/" + name, "block/" + name + "_outer", "block/" + name + "_inner"); fs.writeFile(blockstatesFolder + "\\" + name + ".json", state, "utf8", function (err) { if (err != null) { console.log("Error generating blockstate:", err); } }); zip.file("assets/" + this.properties.namespace + "/blockstates/" + name + ".json", state); // write the 4 stair models // Base fs.writeFile(blockModelsFolder + "\\" + name + ".json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + ".json", JSON.stringify(modelData)); // Item fs.writeFile(itemModelsFolder + "\\" + name + ".json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing item model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/item/" + name + ".json", JSON.stringify(modelData)); // Inner modelData["parent"] = "minecraft:block/inner_stairs"; fs.writeFile(blockModelsFolder + "\\" + name + "_inner.json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + "_inner.json", JSON.stringify(modelData)); // Outer modelData["parent"] = "minecraft:block/outer_stairs"; fs.writeFile(blockModelsFolder + "\\" + name + "_outer.json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + "_outer.json", JSON.stringify(modelData)); } if (this.properties.types.slab) { var name = blockName + "_slab"; var modelData = {}; modelData["credit"] = codecData["credit"]; modelData["parent"] = "minecraft:block/slab"; modelData["textures"] = { "top": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.slab.top, this.properties.namespace), "bottom": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.slab.bottom, this.properties.namespace), "side": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.slab.side, this.properties.namespace), "particle": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)("particle", this.properties.namespace) }; // Looting file var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, name); var lootTags = dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\" + name + ".json"; fs.mkdirSync(dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\", { recursive: true }); fs.writeFile(lootTags, lootData, "utf8", function (err) { if (err != null) { console.log("Error found when writing wall tags:", err); } }); zip.file("data/" + this.properties.namespace + "/loot_tables/blocks/" + name + ".json", lootData); // Stonecutting Table Recipes (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, name, dataFolder, zip); // Write State var state = { "variants": { "type=bottom": { "model": this.properties.namespace + ":block/" + name }, "type=double": { "model": this.properties.namespace + ":block/" + blockName }, "type=top": { "model": this.properties.namespace + ":block/" + name + "_top" } } }; fs.writeFile(blockstatesFolder + "\\" + name + ".json", JSON.stringify(state), "utf8", function (err) { if (err != null) { console.log("Error generating blockstate:", err); } }); zip.file("assets/" + this.properties.namespace + "/blockstates/" + name + ".json", JSON.stringify(state)); // Write the 3 slab models // Base fs.writeFile(blockModelsFolder + "\\" + name + ".json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + ".json", JSON.stringify(modelData)); // Item fs.writeFile(itemModelsFolder + "\\" + name + ".json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing item model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/item/" + name + ".json", JSON.stringify(modelData)); // Top modelData["parent"] = "minecraft:block/slab_top"; fs.writeFile(blockModelsFolder + "\\" + name + "_top.json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + "_top.json", JSON.stringify(modelData)); } if (this.properties.types.wall) { var name = blockName + "_wall"; var modelData = {}; modelData["credit"] = codecData["credit"]; modelData["parent"] = "minecraft:block/template_wall_post"; modelData["textures"] = { "wall": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.wall.wall, this.properties.namespace), "particle": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)("particle", this.properties.namespace) }; // Looting file var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, name); var lootTags = dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\" + name + ".json"; fs.mkdirSync(dataFolder + this.properties.namespace + "\\loot_tables\\blocks\\", { recursive: true }); fs.writeFile(lootTags, lootData, "utf8", function (err) { if (err != null) { console.log("Error found when writing wall tags:", err); } }); zip.file("data/" + this.properties.namespace + "/loot_tables/blocks/" + name + ".json", lootData); // Stonecutting Table Recipes (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, name, dataFolder, zip); // Write State var state = (0,_util_GenStates_js__WEBPACK_IMPORTED_MODULE_18__.genWallState)(this.properties.namespace, "block/" + name + "_post", "block/" + name + "_side", "block/" + name + "_side_tall"); fs.writeFile(blockstatesFolder + "\\" + name + ".json", state, "utf8", function (err) { if (err != null) { console.log("Error generating blockstate:", err); } }); zip.file("assets/" + this.properties.namespace + "/blockstates/" + name + ".json", state); // Write the 4 wall models // Base fs.writeFile(blockModelsFolder + "\\" + name + "_post.json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + "_post.json", JSON.stringify(modelData)); // Item modelData["parent"] = "minecraft:block/wall_inventory"; fs.writeFile(itemModelsFolder + "\\" + name + ".json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing item model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/item/" + name + ".json", JSON.stringify(modelData)); // Side modelData["parent"] = "minecraft:block/template_wall_side"; fs.writeFile(blockModelsFolder + "\\" + name + "_side.json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + "_side.json", JSON.stringify(modelData)); // Side Tall modelData["parent"] = "minecraft:block/template_wall_side_tall"; fs.writeFile(blockModelsFolder + "\\" + name + "_side_tall.json", JSON.stringify(modelData), "utf8", function (err) { if (err != null) { console.log("Error Found writing item model data:", err); } }); zip.file("assets/" + this.properties.namespace + "/models/block/" + name + "_side_tall.json", JSON.stringify(modelData)); // Deal with the tags var wallTags = dataFolder + "minecraft\\tags\\blocks\\walls.json"; var tagVal = this.properties.namespace + ":" + name; fs.mkdirSync(dataFolder + "minecraft\\tags\\blocks\\", { recursive: true }); var tagData = { "replace": false, "values": [tagVal] }; fs.writeFile(wallTags, JSON.stringify(tagData), "utf8", function (err) { if (err != null) { console.log("Error found when writing wall tags:", err); } }); zip.file("data/minecraft/tags/blocks/walls.json", JSON.stringify(tagData)); } var modelData = JSON.parse(codecData); var ns = this.properties.namespace; var animated = this.properties.animated; // Copy texture files Texture.all.forEach(function (tx) { var image; if (tx.namespace != "minecraft") { if (tx.img.currentSrc.slice(0, 4) == "data") { image = nativeImage.createFromDataURL(tx.img.currentSrc).toPNG(); } else if (tx.img.currentSrc.slice(0, 4) == "file") { image = nativeImage.createFromPath(tx.source.replace(/\?\d+$/, '')).toPNG(); } fs.writeFile(blockTexturesFolder + "\\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name), image, function (err) { if (err != null) { console.log("Error Found writing texture data:", err); } }); zip.file("assets/" + ns + "/textures/" + blockTextureFolderVersion + "/" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name), image); if (animated) { fs.writeFile(blockTexturesFolder + "\\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name) + ".mcmeta", '{"animation" : {}}', function (err) { if (err != null) { console.log("Error Found writing animation data:", err); } }); zip.file("assets/" + ns + "/textures/" + blockTextureFolderVersion + "/" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name) + ".mcmeta", '{"animation" : {}}'); } } }); /*console.log("Block List:") console.log(blockList)*/ blockList.forEach(function (block) { // Generate Mining file var mineableData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genMineableTag)(_this.properties.namespace, block["name"], block["types"]); var mineableTags = dataFolder + "minecraft\\tags\\blocks\\mineable\\pickaxe.json"; fs.mkdirSync(dataFolder + "minecraft\\tags\\blocks\\mineable", { recursive: true }); fs.writeFile(mineableTags, mineableData, "utf8", function (err) { if (err != null) { console.log("Error found when writing wall tags:", err); } }); zip.file("data/minecraft/tags/blocks/mineable/pickaxe.json", mineableData); // Write state file fs.writeFile(blockstatesFolder + "\\" + block["name"] + ".json", block["state"], "utf8", function (err) { if (err != null) { console.log("Error generating blockstate:", err); } }); zip.file("assets/" + _this.properties.namespace + "/blockstates/" + block["name"] + ".json", block["state"]); // Write model files fs.writeFile(blockModelsFolder + "\\" + block["name"] + ".json", JSON.stringify(block["model"]), "utf8", function (err) { if (err != null) { console.log("Error Found writing block model data:", err); } }); zip.file("assets/" + _this.properties.namespace + "/models/block/" + block["name"] + ".json", JSON.stringify(block["model"])); fs.writeFile(itemModelsFolder + "\\" + block["name"] + ".json", JSON.stringify(block["model"]), "utf8", function (err) { if (err != null) { console.log("Error Found writing item model data:", err); } }); zip.file("assets/" + _this.properties.namespace + "/models/item/" + block["name"] + ".json", JSON.stringify(block["model"])); // Write block properties file var data = { "displayName": _this.properties.displayName.replace(/[^a-zA-Z\d\s._]/g, ''), "typeList": block["types"], "material": _this.properties.material, "blastRes": _this.properties.blastRes, "slip": _this.properties.slip, "gravity": _this.properties.gravity, "rotType": _this.properties.rotType, "sounds": _this.properties.sounds, "lum": _this.properties.lum, "maxStack": _this.properties.maxStack, "fireproof": _this.properties.fireproof, "creativeTab": _this.properties.creativeTab, "transparency": _this.properties.transparency, "hitbox": block["hitbox"], "hitboxBuffer": _this.properties.bufferedHitbox ? _this.properties.hitboxBuffer.toString() : "", "blockType": _this.properties.types.customType, "particleType": _this.properties.particles ? _this.properties.particleType : "", "particlePos": [_this.properties.particlePos.x / 16.0, _this.properties.particlePos.y / 16.0, _this.properties.particlePos.z / 16.0], "particleSpread": [_this.properties.particleSpread.x / 8.0, _this.properties.particleSpread.y / 8.0, _this.properties.particleSpread.z / 8.0], "particleVel": [_this.properties.particleVel.x, _this.properties.particleVel.y, _this.properties.particleVel.z], "nameGenType": "3.3" // Allows for names where " " is replaced with "_" to coexist with the older "" system }; fs.writeFile(objFolder + "\\" + block["name"] + ".json", JSON.stringify(data), "utf8", function (err) { if (err != null) { console.log("Error writing block properties:", err); } }); zip.file("objects/" + block["name"] + ".json", JSON.stringify(data)); /*console.log("Object File Contents:") console.log(data)*/ }); zip.generateAsync({ type: "nodebuffer" }).then(function (content) { fs.writeFile(settings.minecraftFolder.value + "\\bamopacks\\" + packName + ".zip", content, function (err) {}); }); fs.rm(settings.minecraftFolder.value + "\\bamopacks\\" + packName, { recursive: true }, function (err) {}); console.log("BAMO data saved in folder at location " + settings.minecraftFolder.value + "\\bamopacks\\" + packName); var e = open_interface; e.hide(); } }, watch: { properties: { handler: function handler(val) { if (this.swap == false) { Project.saved = false; } else { this.swap = false; } }, deep: true } } }); /***/ }), /***/ "./src/util/Codec.js": /*!***************************!*\ !*** ./src/util/Codec.js ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ "loadCodec": () => (/* binding */ loadCodec), /* harmony export */ "unloadCodec": () => (/* binding */ unloadCodec) /* harmony export */ }); /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ "./node_modules/core-js/modules/es.object.assign.js"); /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ "./node_modules/core-js/modules/es.function.name.js"); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ "./node_modules/core-js/modules/es.regexp.exec.js"); /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ "./node_modules/core-js/modules/es.string.replace.js"); /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ "./node_modules/core-js/modules/es.array.concat.js"); /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ "./node_modules/core-js/modules/es.array.includes.js"); /* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.find.js */ "./node_modules/core-js/modules/es.array.find.js"); /* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ "./node_modules/core-js/modules/es.array.for-each.js"); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ "./node_modules/core-js/modules/es.symbol.js"); /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ "./node_modules/core-js/modules/es.symbol.description.js"); /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ "./node_modules/core-js/modules/es.symbol.iterator.js"); /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ "./node_modules/core-js/modules/es.array.iterator.js"); /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_12__); /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ "./node_modules/core-js/modules/es.string.iterator.js"); /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13__); /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ "./node_modules/core-js/modules/web.dom-collections.iterator.js"); /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_14__); /* harmony import */ var _Settings__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Settings */ "./src/util/Settings.js"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function loadCodec() { Codecs.project.on('compile', onProjectCompile); Codecs.project.on('parse', onProjectParse); Blockbench.on('close_project', onCloseProject); } function unloadCodec() { Codecs.project.events.compile.remove(onProjectCompile); Codecs.project.events.parse.remove(onProjectParse); format["delete"](); } function onProjectCompile(e) { if (format.id !== "bamo_model") return; e.model.bamoSettings = _Settings__WEBPACK_IMPORTED_MODULE_15__["default"][Project.uuid]; } function onProjectParse(e) { if (format.id !== "bamo_model") return; if (e.model && _typeof(e.model.bamoSettings) === 'object') { var placeholder = Object.assign({}, _Settings__WEBPACK_IMPORTED_MODULE_15__.BAMO_SETTINGS_DEFAULT); _Settings__WEBPACK_IMPORTED_MODULE_15__["default"][Project.uuid] = Object.assign(placeholder, e.model.bamoSettings); } else { _Settings__WEBPACK_IMPORTED_MODULE_15__["default"][Project.uuid] = Object.assign({}, _Settings__WEBPACK_IMPORTED_MODULE_15__.BAMO_SETTINGS_DEFAULT); _Settings__WEBPACK_IMPORTED_MODULE_15__["default"][Project.uuid].displayName = Project.name; } console.log(_Settings__WEBPACK_IMPORTED_MODULE_15__["default"][Project.uuid]); } function onCloseProject() { if (format.id !== "bamo_model") return; delete _Settings__WEBPACK_IMPORTED_MODULE_15__["default"][Project.uuid]; } var codec = Codecs.java_block; var format = new ModelFormat({ id: "bamo_model", name: "BAMO model", category: "minecraft", description: "A format for storing models to be exported for the BAMO mod", icon: "view_in_ar", target: 'Minecraft: Java Edition', format_page: { content: [{ type: 'h3', text: tl('mode.start.format.informations') }, { text: "* ".concat(tl('format.java_block.info.rotation'), "\n\t\t\t\t\t* ").concat(tl('format.java_block.info.size'), "\n\t\t\t\t\t* ").concat(tl('format.java_block.info.animation')).replace(/\t+/g, '') }] }, render_sides: function render_sides() { if (Modes.display && ['thirdperson_righthand', 'thirdperson_lefthand', 'head'].includes(display_slot)) { return 'double'; } else { return 'front'; } }, model_identifier: false, parent_model_id: true, vertex_color_ambient_occlusion: true, rotate_cubes: true, rotation_limit: true, optional_box_uv: true, uv_rotation: true, java_face_properties: true, animated_textures: true, select_texture_for_particles: true, display_mode: true, texture_folder: true, cube_size_limiter: { coordinate_limits: [-16, 32], test: function test(cube) { var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var from = values.from || cube.from; var to = values.to || cube.to; var inflate = values.inflate == undefined ? cube.inflate : values.inflate; return undefined !== from.find(function (v, i) { return to[i] + inflate > 32 || to[i] + inflate < -16 || from[i] - inflate > 32 || from[i] - inflate < -16; }); }, move: function move(cube) { var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var from = values.from || cube.from; var to = values.to || cube.to; var inflate = values.inflate == undefined ? cube.inflate : values.inflate; [0, 1, 2].forEach(function (ax) { var overlap = to[ax] + inflate - 32; if (overlap > 0) { //If positive site overlaps from[ax] -= overlap; to[ax] -= overlap; if (16 + from[ax] - inflate < 0) { from[ax] = -16 + inflate; } } else { overlap = from[ax] - inflate + 16; if (overlap < 0) { from[ax] -= overlap; to[ax] -= overlap; if (to[ax] + inflate > 32) { to[ax] = 32 - inflate; } } } }); }, clamp: function clamp(cube) { var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var from = values.from || cube.from; var to = values.to || cube.to; var inflate = values.inflate == undefined ? cube.inflate : values.inflate; [0, 1, 2].forEach(function (ax) { from[ax] = Math.clamp(from[ax] - inflate, -16, 32) + inflate; to[ax] = Math.clamp(to[ax] + inflate, -16, 32) - inflate; }); } }, codec: codec }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (codec); /***/ }), /***/ "./src/util/GenDataFiles.js": /*!**********************************!*\ !*** ./src/util/GenDataFiles.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "genLootTable": () => (/* binding */ genLootTable), /* harmony export */ "genMineableTag": () => (/* binding */ genMineableTag), /* harmony export */ "genStonecuttingRecipe": () => (/* binding */ genStonecuttingRecipe), /* harmony export */ "genStonecuttingRecipes": () => (/* binding */ genStonecuttingRecipes), /* harmony export */ "genStonecuttingReverseRecipe": () => (/* binding */ genStonecuttingReverseRecipe) /* harmony export */ }); /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ "./node_modules/core-js/modules/es.array.concat.js"); /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ "./node_modules/core-js/modules/es.array.for-each.js"); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ "./node_modules/core-js/modules/web.dom-collections.for-each.js"); /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__); function genLootTable(namespace, block) { return "{\n \"type\": \"minecraft:block\",\n \"pools\": [\n {\n \"rolls\": 1,\n \"entries\": [\n {\n \"type\": \"minecraft:item\",\n \"name\": \"".concat(namespace, ":").concat(block, "\"\n }\n ],\n \"conditions\": []\n }\n ]\n}"); } function genMineableTag(namespace, block, variants) { if (variants.length == 0) { return "{\n \"replace\": false,\n \"values\": [\n \"".concat(namespace, ":").concat(block, "\"\n ]\n}"); } else { var tagValues = ["".concat(namespace, ":").concat(block)]; variants.forEach(function (v) { tagValues.push("".concat(namespace, ":").concat(block, "_").concat(v)); }); var data = { "replace": false, "values": tagValues }; return JSON.stringify(data); } } function genStonecuttingRecipes(properties, blockName, dataFolder, zip) { console.log(properties); if (properties.genScRecipe) { var stData = genStonecuttingRecipe(properties.namespace, blockName); var stDir = dataFolder + properties.namespace + "\\recipes\\"; fs.mkdirSync(stDir, { recursive: true }); fs.writeFile(stDir + blockName + ".json", stData, "utf8", function (err) { if (err != null) { console.log("Error found when writing custom block stonecutting recipe:", err); } }); zip.file("data/" + properties.namespace + "/recipes/" + blockName + ".json", stData); } if (properties.genReversableScRecipe) { var stData = genStonecuttingReverseRecipe(properties.namespace, blockName); var stDir = dataFolder + properties.namespace + "\\recipes\\"; fs.mkdirSync(stDir, { recursive: true }); fs.writeFile(stDir + blockName + "_rv.json", stData, "utf8", function (err) { if (err != null) { console.log("Error found when writing custom block stonecutting recipe:", err); } }); zip.file("data/" + properties.namespace + "/recipes/" + blockName + "_rv.json", stData); } } function genStonecuttingRecipe(namespace, block) { return "\n {\n \"type\": \"minecraft:stonecutting\",\n \"ingredient\": {\n \"item\": \"bamo:bamo_crate\"\n },\n \"result\": \"".concat(namespace, ":").concat(block, "\",\n \"count\": 1\n }"); } function genStonecuttingReverseRecipe(namespace, block) { return "\n {\n \"type\": \"minecraft:stonecutting\",\n \"ingredient\": {\n \"item\": \"".concat(namespace, ":").concat(block, "\"\n },\n \"result\": \"bamo:bamo_crate\",\n \"count\": 1\n }"); } /***/ }), /***/ "./src/util/GenStates.js": /*!*******************************!*\ !*** ./src/util/GenStates.js ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "genStairState": () => (/* binding */ genStairState), /* harmony export */ "genWallState": () => (/* binding */ genWallState) /* harmony export */ }); /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ "./node_modules/core-js/modules/es.array.concat.js"); /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__); function genStairState(namespace, model, outer, inner) { return "\n {\n \"variants\": {\n \"facing=east,half=bottom,shape=straight\": { \"model\": \"".concat(namespace, ":").concat(model, "\" },\n \"facing=west,half=bottom,shape=straight\": { \"model\": \"").concat(namespace, ":").concat(model, "\", \"y\": 180, \"uvlock\": true },\n \"facing=south,half=bottom,shape=straight\": { \"model\": \"").concat(namespace, ":").concat(model, "\", \"y\": 90, \"uvlock\": true },\n \"facing=north,half=bottom,shape=straight\": { \"model\": \"").concat(namespace, ":").concat(model, "\", \"y\": 270, \"uvlock\": true },\n\n \"facing=east,half=top,shape=straight\": { \"model\": \"").concat(namespace, ":").concat(model, "\", \"x\": 180, \"uvlock\": true },\n \"facing=west,half=top,shape=straight\": { \"model\": \"").concat(namespace, ":").concat(model, "\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n \"facing=south,half=top,shape=straight\": { \"model\": \"").concat(namespace, ":").concat(model, "\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n \"facing=north,half=top,shape=straight\": { \"model\": \"").concat(namespace, ":").concat(model, "\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n \n \"facing=east,half=bottom,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\" },\n \"facing=west,half=bottom,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"y\": 180, \"uvlock\": true },\n \"facing=south,half=bottom,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"y\": 90, \"uvlock\": true },\n \"facing=north,half=bottom,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"y\": 270, \"uvlock\": true },\n\n \"facing=east,half=bottom,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"y\": 270, \"uvlock\": true },\n \"facing=west,half=bottom,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"y\": 90, \"uvlock\": true },\n \"facing=south,half=bottom,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\" },\n \"facing=north,half=bottom,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"y\": 180, \"uvlock\": true },\n\n \"facing=east,half=bottom,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\" },\n \"facing=west,half=bottom,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"y\": 180, \"uvlock\": true },\n \"facing=south,half=bottom,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"y\": 90, \"uvlock\": true },\n \"facing=north,half=bottom,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"y\": 270, \"uvlock\": true },\n\n \"facing=east,half=bottom,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"y\": 270, \"uvlock\": true },\n \"facing=west,half=bottom,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"y\": 90, \"uvlock\": true },\n \"facing=south,half=bottom,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\" },\n \"facing=north,half=bottom,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"y\": 180, \"uvlock\": true },\n \n \"facing=east,half=top,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"uvlock\": true },\n \"facing=west,half=top,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n \"facing=south,half=top,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n \"facing=north,half=top,shape=outer_left\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n\n \"facing=east,half=top,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n \"facing=west,half=top,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n \"facing=south,half=top,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n \"facing=north,half=top,shape=outer_right\": { \"model\": \"").concat(namespace, ":").concat(outer, "\", \"x\": 180, \"uvlock\": true },\n\n \"facing=east,half=top,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"uvlock\": true },\n \"facing=west,half=top,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n \"facing=south,half=top,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n \"facing=north,half=top,shape=inner_left\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n\n \"facing=east,half=top,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n \"facing=west,half=top,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n \"facing=south,half=top,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n \"facing=north,half=top,shape=inner_right\": { \"model\": \"").concat(namespace, ":").concat(inner, "\", \"x\": 180, \"uvlock\": true }\n }\n }"); } function genWallState(namespace, post, side, tall) { return "{\n \"multipart\":[\n {\"when\":{\"up\":\"true\"},\"apply\":{\"model\":\"".concat(namespace, ":").concat(post, "\"}},\n {\"when\":{\"north\":\"low\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(side, "\",\"uvlock\":true}},\n {\"when\":{\"east\":\"low\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(side, "\",\"y\":90,\"uvlock\":true}},\n {\"when\":{\"south\":\"low\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(side, "\",\"y\":180,\"uvlock\":true}},\n {\"when\":{\"west\":\"low\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(side, "\",\"y\":270,\"uvlock\":true}},\n {\"when\":{\"north\":\"tall\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(tall, "\",\"uvlock\":true}},\n {\"when\":{\"east\":\"tall\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(tall, "\",\"y\":90,\"uvlock\":true}},\n {\"when\":{\"south\":\"tall\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(tall, "\",\"y\":180,\"uvlock\":true}},\n {\"when\":{\"west\":\"tall\"},\"apply\":{\"model\":\"").concat(namespace, ":").concat(tall, "\",\"y\":270,\"uvlock\":true}}\n ]\n }"); } /***/ }), /***/ "./src/util/OptionArrays.js": /*!**********************************!*\ !*** ./src/util/OptionArrays.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "customTypeOptions": () => (/* binding */ customTypeOptions), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ "materialOptions": () => (/* binding */ materialOptions), /* harmony export */ "particleOptions": () => (/* binding */ particleOptions), /* harmony export */ "rotationTypes": () => (/* binding */ rotationTypes), /* harmony export */ "soundOptions": () => (/* binding */ soundOptions), /* harmony export */ "tabOptions": () => (/* binding */ tabOptions), /* harmony export */ "transparencyOptions": () => (/* binding */ transparencyOptions) /* harmony export */ }); var rotationTypes = ["default", //"axis", //"y_axis_player", "y_axis" //"all_player", //"all", ]; var soundOptions = ["Grass", "Glass", "Gravel", "Honey", "Metal", "Sand", "Snow", "Stone", "Wool", "Wood", "Ancient Debris", "Anvil", "Bamboo", "Bamboo Sapling", "Basalt", "Bone Brick", "Chain", "Coral Block", "Crop", "Fungus", "Gilded Blackstone", "Hard Crop", "Ladder", "Lantern", "Lily Pad", "Lodestone", "Netherite Block", "Netherrack", "Nether Bricks", "Nether Gold Ore", "Nether Ore", "Nether Sprouts", "Nether Wart", "Nylium", "Roots", "Scaffolding", "Shroomlight", "Slime Block", "Soul Sand", "Stem", "Sweet Berry Bush", "Twisting Vines", "Vine", "Wart Block", "Weeping Vines", "Wet Grass"]; var materialOptions = ["Dirt", "Air", "Bamboo", "Bamboo Sapling", "Barrier", "Bubble Column", "Buildable Glass", "Cactus", "Cake", "Clay", "Coral", "Cloth Decoration", "Decoration", "Egg", "Explosive", "Fire", "Glass", "Grass", "Heavy Metal", "Ice", "Ice Solid", "Lava", "Leaves", "Metal", "Nether Wood", "Piston", "Plant", "Portal", "Replaceable Plant", "Replaceable Fireproof Plant", "Replaceable Water Plant", "Sand", "Shulker Shell", "Snow", "Sponge", "Stone", "Structural Air", "Top Snow", "Vegetable", "Water", "Water Plant", "Web", "Wood", "Wool"]; var transparencyOptions = ["Solid", "Translucent", "Cutout", "Cutout (Mipped)"]; var tabOptions = ["Building Blocks", "Brewing", "Combat", "Food", "Decorations", "Misc", "Redstone", "Tools", "Transportation"]; var particleOptions = ["Ambient Entity Effect", "Angry Villager", "Ash", "Bubble", "Bubble Pop", "Campfire Smoke", "Cloud", "Composter", "Crimson Spore", "Crit", "Damage Indicator", "Dolphin", "Dripping Dripstone Lava", "Dripping Dripstone Water", "Dripping Honey", "Dripping Lava", "Dripping Obsidian Tear", "Dripping Water", "Elder Guardian", "Electric Spark", "Enchant", "Enchanted Hit", "End Rod", "Entity Effect", "Explosion", "Falling Dripstone Lava", "Falling Dripstone Water", "Falling Honey", "Falling Lava", "Falling Nectar", "Falling Obsidian Tear", "Falling Spore Blossom", "Falling Water", "Firework", "Fishing", "Flame", "Flash", "Glow", "Glow Squid Ink", "Happy Villager", "Heart", "Slime Item", "Snowball item", "Landing Honey", "Landing Lava", "Landing Obsidian Tear", "Lava", "Mycelium", "Nautilus", "Note", "Rain", "Reverse Portal", "Scrape", "Small Flame", "Snowflake", "Soul", "Soulfire Flame", "Spore Blossom Air", "Sweep Attack", "Totem of Undying", "Undewater", "Warped Spore", "Wax off", "Wax On", "White Ash", "Witch"]; var customTypeOptions = ["Default", "Flower"]; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ rotationTypes: rotationTypes, soundOptions: soundOptions, materialOptions: materialOptions, transparencyOptions: transparencyOptions, tabOptions: tabOptions, customTypeOptions: customTypeOptions }); /***/ }), /***/ "./src/util/Settings.js": /*!******************************!*\ !*** ./src/util/Settings.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "BAMO_SETTINGS_DEFAULT": () => (/* binding */ BAMO_SETTINGS_DEFAULT), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var core_js_modules_es_object_freeze_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.object.freeze.js */ "./node_modules/core-js/modules/es.object.freeze.js"); /* harmony import */ var core_js_modules_es_object_freeze_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_freeze_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ "./node_modules/core-js/modules/es.object.assign.js"); /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_1__); var BAMO_SETTINGS_DEFAULT = { displayName: "", namespace: "bamo", version: "1.20.1", typeList: [], material: "Dirt", blastRes: 6, slip: 0.6, gravity: false, rotType: "default", sounds: "Grass", lum: 0, maxStack: 64, fireproof: true, creativeTab: "Building Blocks", transparency: "Solid", blockType: "Default", types: { custom: true, customType: "Default", block: false, stair: false, slab: false, wall: false }, variant: { "default": { all: "" }, stair: { top: "", bottom: "", side: "", particle: "" }, slab: { top: "", bottom: "", side: "", particle: "" }, wall: { wall: "", particle: "" } }, particles: false, particleType: "Rain", particlePos: { x: 8, y: 8, z: 8 }, particleSpread: { x: 1, y: 1, z: 1 }, particleVel: { x: 0.1, y: 0.1, z: 0.1 }, bufferedHitbox: true, hitboxBuffer: 0.5, genScRecipe: true, genReversableScRecipe: true, animated: false }; Object.freeze(BAMO_SETTINGS_DEFAULT); var bamoSettings = {}; bamoSettings[""] = Object.assign({}, BAMO_SETTINGS_DEFAULT); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (bamoSettings); /***/ }), /***/ "./src/util/Utils.js": /*!***************************!*\ !*** ./src/util/Utils.js ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "cleanFileName": () => (/* binding */ cleanFileName), /* harmony export */ "dictFromTexture": () => (/* binding */ dictFromTexture) /* harmony export */ }); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ "./node_modules/core-js/modules/es.array.for-each.js"); /* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ "./node_modules/core-js/modules/web.dom-collections.for-each.js"); /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ "./node_modules/core-js/modules/es.function.name.js"); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ "./node_modules/core-js/modules/es.regexp.exec.js"); /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ "./node_modules/core-js/modules/es.string.split.js"); /* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ "./node_modules/core-js/modules/es.string.replace.js"); /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_6__); function dictFromTexture(image, ns, name) { var ret = ""; Texture.all.forEach(function (tx) { if (tx.name == image || image == "particle" && tx.particle == true) { if (tx.namespace == "") { ret = ns + ":blocks/" + name + "_" + cleanFileName(tx.name.split(".")[0]); } else { ret = tx.namespace + ":" + tx.folder + "/" + cleanFileName(tx.name.split(".")[0]); } } }); return ret; } function cleanFileName(name) { return name.replace(/[^a-zA-Z\d\s._]/g, '').replace(/\s+/g, "_").toLowerCase(); } /***/ }), /***/ "./node_modules/core-js/internals/a-callable.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/a-callable.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js"); var $TypeError = TypeError; // `Assert: IsCallable(argument) is true` module.exports = function (argument) { if (isCallable(argument)) return argument; throw $TypeError(tryToString(argument) + ' is not a function'); }; /***/ }), /***/ "./node_modules/core-js/internals/a-constructor.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/a-constructor.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js"); var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js"); var $TypeError = TypeError; // `Assert: IsConstructor(argument) is true` module.exports = function (argument) { if (isConstructor(argument)) return argument; throw $TypeError(tryToString(argument) + ' is not a constructor'); }; /***/ }), /***/ "./node_modules/core-js/internals/a-possible-prototype.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/a-possible-prototype.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var $String = String; var $TypeError = TypeError; module.exports = function (argument) { if (typeof argument == 'object' || isCallable(argument)) return argument; throw $TypeError("Can't set " + $String(argument) + ' as a prototype'); }; /***/ }), /***/ "./node_modules/core-js/internals/add-to-unscopables.js": /*!**************************************************************!*\ !*** ./node_modules/core-js/internals/add-to-unscopables.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); var UNSCOPABLES = wellKnownSymbol('unscopables'); var ArrayPrototype = Array.prototype; // Array.prototype[@@unscopables] // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables if (ArrayPrototype[UNSCOPABLES] == undefined) { defineProperty(ArrayPrototype, UNSCOPABLES, { configurable: true, value: create(null) }); } // add a key to Array.prototype[@@unscopables] module.exports = function (key) { ArrayPrototype[UNSCOPABLES][key] = true; }; /***/ }), /***/ "./node_modules/core-js/internals/advance-string-index.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/advance-string-index.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var charAt = (__webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt); // `AdvanceStringIndex` abstract operation // https://tc39.es/ecma262/#sec-advancestringindex module.exports = function (S, index, unicode) { return index + (unicode ? charAt(S, index).length : 1); }; /***/ }), /***/ "./node_modules/core-js/internals/an-object.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/an-object.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var $String = String; var $TypeError = TypeError; // `Assert: Type(argument) is Object` module.exports = function (argument) { if (isObject(argument)) return argument; throw $TypeError($String(argument) + ' is not an object'); }; /***/ }), /***/ "./node_modules/core-js/internals/array-buffer-non-extensible.js": /*!***********************************************************************!*\ !*** ./node_modules/core-js/internals/array-buffer-non-extensible.js ***! \***********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = fails(function () { if (typeof ArrayBuffer == 'function') { var buffer = new ArrayBuffer(8); // eslint-disable-next-line es-x/no-object-isextensible, es-x/no-object-defineproperty -- safe if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 }); } }); /***/ }), /***/ "./node_modules/core-js/internals/array-for-each.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/array-for-each.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $forEach = (__webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach); var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js"); var STRICT_METHOD = arrayMethodIsStrict('forEach'); // `Array.prototype.forEach` method implementation // https://tc39.es/ecma262/#sec-array.prototype.foreach module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) { return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); // eslint-disable-next-line es-x/no-array-prototype-foreach -- safe } : [].forEach; /***/ }), /***/ "./node_modules/core-js/internals/array-includes.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/array-includes.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js"); var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "./node_modules/core-js/internals/length-of-array-like.js"); // `Array.prototype.{ indexOf, includes }` methods implementation var createMethod = function (IS_INCLUDES) { return function ($this, el, fromIndex) { var O = toIndexedObject($this); var length = lengthOfArrayLike(O); var index = toAbsoluteIndex(fromIndex, length); var value; // Array#includes uses SameValueZero equality algorithm // eslint-disable-next-line no-self-compare -- NaN check if (IS_INCLUDES && el != el) while (length > index) { value = O[index++]; // eslint-disable-next-line no-self-compare -- NaN check if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not } else for (;length > index; index++) { if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; } return !IS_INCLUDES && -1; }; }; module.exports = { // `Array.prototype.includes` method // https://tc39.es/ecma262/#sec-array.prototype.includes includes: createMethod(true), // `Array.prototype.indexOf` method // https://tc39.es/ecma262/#sec-array.prototype.indexof indexOf: createMethod(false) }; /***/ }), /***/ "./node_modules/core-js/internals/array-iteration.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/array-iteration.js ***! \***********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "./node_modules/core-js/internals/length-of-array-like.js"); var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js"); var push = uncurryThis([].push); // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation var createMethod = function (TYPE) { var IS_MAP = TYPE == 1; var IS_FILTER = TYPE == 2; var IS_SOME = TYPE == 3; var IS_EVERY = TYPE == 4; var IS_FIND_INDEX = TYPE == 6; var IS_FILTER_REJECT = TYPE == 7; var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; return function ($this, callbackfn, that, specificCreate) { var O = toObject($this); var self = IndexedObject(O); var boundFunction = bind(callbackfn, that); var length = lengthOfArrayLike(self); var index = 0; var create = specificCreate || arraySpeciesCreate; var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; var value, result; for (;length > index; index++) if (NO_HOLES || index in self) { value = self[index]; result = boundFunction(value, index, O); if (TYPE) { if (IS_MAP) target[index] = result; // map else if (result) switch (TYPE) { case 3: return true; // some case 5: return value; // find case 6: return index; // findIndex case 2: push(target, value); // filter } else switch (TYPE) { case 4: return false; // every case 7: push(target, value); // filterReject } } } return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; }; }; module.exports = { // `Array.prototype.forEach` method // https://tc39.es/ecma262/#sec-array.prototype.foreach forEach: createMethod(0), // `Array.prototype.map` method // https://tc39.es/ecma262/#sec-array.prototype.map map: createMethod(1), // `Array.prototype.filter` method // https://tc39.es/ecma262/#sec-array.prototype.filter filter: createMethod(2), // `Array.prototype.some` method // https://tc39.es/ecma262/#sec-array.prototype.some some: createMethod(3), // `Array.prototype.every` method // https://tc39.es/ecma262/#sec-array.prototype.every every: createMethod(4), // `Array.prototype.find` method // https://tc39.es/ecma262/#sec-array.prototype.find find: createMethod(5), // `Array.prototype.findIndex` method // https://tc39.es/ecma262/#sec-array.prototype.findIndex findIndex: createMethod(6), // `Array.prototype.filterReject` method // https://github.com/tc39/proposal-array-filtering filterReject: createMethod(7) }; /***/ }), /***/ "./node_modules/core-js/internals/array-method-has-species-support.js": /*!****************************************************************************!*\ !*** ./node_modules/core-js/internals/array-method-has-species-support.js ***! \****************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js"); var SPECIES = wellKnownSymbol('species'); module.exports = function (METHOD_NAME) { // We can't use this feature detection in V8 since it causes // deoptimization and serious performance degradation // https://github.com/zloirock/core-js/issues/677 return V8_VERSION >= 51 || !fails(function () { var array = []; var constructor = array.constructor = {}; constructor[SPECIES] = function () { return { foo: 1 }; }; return array[METHOD_NAME](Boolean).foo !== 1; }); }; /***/ }), /***/ "./node_modules/core-js/internals/array-method-is-strict.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/array-method-is-strict.js ***! \******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = function (METHOD_NAME, argument) { var method = [][METHOD_NAME]; return !!method && fails(function () { // eslint-disable-next-line no-useless-call -- required for testing method.call(null, argument || function () { return 1; }, 1); }); }; /***/ }), /***/ "./node_modules/core-js/internals/array-slice-simple.js": /*!**************************************************************!*\ !*** ./node_modules/core-js/internals/array-slice-simple.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js"); var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "./node_modules/core-js/internals/length-of-array-like.js"); var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js"); var $Array = Array; var max = Math.max; module.exports = function (O, start, end) { var length = lengthOfArrayLike(O); var k = toAbsoluteIndex(start, length); var fin = toAbsoluteIndex(end === undefined ? length : end, length); var result = $Array(max(fin - k, 0)); for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]); result.length = n; return result; }; /***/ }), /***/ "./node_modules/core-js/internals/array-slice.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/array-slice.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); module.exports = uncurryThis([].slice); /***/ }), /***/ "./node_modules/core-js/internals/array-species-constructor.js": /*!*********************************************************************!*\ !*** ./node_modules/core-js/internals/array-species-constructor.js ***! \*********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var SPECIES = wellKnownSymbol('species'); var $Array = Array; // a part of `ArraySpeciesCreate` abstract operation // https://tc39.es/ecma262/#sec-arrayspeciescreate module.exports = function (originalArray) { var C; if (isArray(originalArray)) { C = originalArray.constructor; // cross-realm fallback if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined; else if (isObject(C)) { C = C[SPECIES]; if (C === null) C = undefined; } } return C === undefined ? $Array : C; }; /***/ }), /***/ "./node_modules/core-js/internals/array-species-create.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/array-species-create.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arraySpeciesConstructor = __webpack_require__(/*! ../internals/array-species-constructor */ "./node_modules/core-js/internals/array-species-constructor.js"); // `ArraySpeciesCreate` abstract operation // https://tc39.es/ecma262/#sec-arrayspeciescreate module.exports = function (originalArray, length) { return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); }; /***/ }), /***/ "./node_modules/core-js/internals/classof-raw.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/classof-raw.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var toString = uncurryThis({}.toString); var stringSlice = uncurryThis(''.slice); module.exports = function (it) { return stringSlice(toString(it), 8, -1); }; /***/ }), /***/ "./node_modules/core-js/internals/classof.js": /*!***************************************************!*\ !*** ./node_modules/core-js/internals/classof.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var $Object = Object; // ES3 wrong here var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; // fallback for IE11 Script Access Denied error var tryGet = function (it, key) { try { return it[key]; } catch (error) { /* empty */ } }; // getting tag from ES6+ `Object.prototype.toString` module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { var O, tag, result; return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag // builtinTag case : CORRECT_ARGUMENTS ? classofRaw(O) // ES3 arguments fallback : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; }; /***/ }), /***/ "./node_modules/core-js/internals/copy-constructor-properties.js": /*!***********************************************************************!*\ !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***! \***********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js"); var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); module.exports = function (target, source, exceptions) { var keys = ownKeys(source); var defineProperty = definePropertyModule.f; var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { defineProperty(target, key, getOwnPropertyDescriptor(source, key)); } } }; /***/ }), /***/ "./node_modules/core-js/internals/correct-prototype-getter.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***! \********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = !fails(function () { function F() { /* empty */ } F.prototype.constructor = null; // eslint-disable-next-line es-x/no-object-getprototypeof -- required for testing return Object.getPrototypeOf(new F()) !== F.prototype; }); /***/ }), /***/ "./node_modules/core-js/internals/create-iterator-constructor.js": /*!***********************************************************************!*\ !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***! \***********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var IteratorPrototype = (__webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js").IteratorPrototype); var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var returnThis = function () { return this; }; module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { var TO_STRING_TAG = NAME + ' Iterator'; IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) }); setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); Iterators[TO_STRING_TAG] = returnThis; return IteratorConstructor; }; /***/ }), /***/ "./node_modules/core-js/internals/create-non-enumerable-property.js": /*!**************************************************************************!*\ !*** ./node_modules/core-js/internals/create-non-enumerable-property.js ***! \**************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); module.exports = DESCRIPTORS ? function (object, key, value) { return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); } : function (object, key, value) { object[key] = value; return object; }; /***/ }), /***/ "./node_modules/core-js/internals/create-property-descriptor.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/internals/create-property-descriptor.js ***! \**********************************************************************/ /***/ ((module) => { module.exports = function (bitmap, value) { return { enumerable: !(bitmap & 1), configurable: !(bitmap & 2), writable: !(bitmap & 4), value: value }; }; /***/ }), /***/ "./node_modules/core-js/internals/create-property.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/create-property.js ***! \***********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); module.exports = function (object, key, value) { var propertyKey = toPropertyKey(key); if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); else object[propertyKey] = value; }; /***/ }), /***/ "./node_modules/core-js/internals/define-built-in.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/define-built-in.js ***! \***********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var makeBuiltIn = __webpack_require__(/*! ../internals/make-built-in */ "./node_modules/core-js/internals/make-built-in.js"); var defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ "./node_modules/core-js/internals/define-global-property.js"); module.exports = function (O, key, value, options) { if (!options) options = {}; var simple = options.enumerable; var name = options.name !== undefined ? options.name : key; if (isCallable(value)) makeBuiltIn(value, name, options); if (options.global) { if (simple) O[key] = value; else defineGlobalProperty(key, value); } else { if (!options.unsafe) delete O[key]; else if (O[key]) simple = true; if (simple) O[key] = value; else createNonEnumerableProperty(O, key, value); } return O; }; /***/ }), /***/ "./node_modules/core-js/internals/define-global-property.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/define-global-property.js ***! \******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); // eslint-disable-next-line es-x/no-object-defineproperty -- safe var defineProperty = Object.defineProperty; module.exports = function (key, value) { try { defineProperty(global, key, { value: value, configurable: true, writable: true }); } catch (error) { global[key] = value; } return value; }; /***/ }), /***/ "./node_modules/core-js/internals/define-iterator.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/define-iterator.js ***! \***********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var FunctionName = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js"); var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js"); var PROPER_FUNCTION_NAME = FunctionName.PROPER; var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; var IteratorPrototype = IteratorsCore.IteratorPrototype; var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; var ITERATOR = wellKnownSymbol('iterator'); var KEYS = 'keys'; var VALUES = 'values'; var ENTRIES = 'entries'; var returnThis = function () { return this; }; module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { createIteratorConstructor(IteratorConstructor, NAME, next); var getIterationMethod = function (KIND) { if (KIND === DEFAULT && defaultIterator) return defaultIterator; if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; switch (KIND) { case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; } return function () { return new IteratorConstructor(this); }; }; var TO_STRING_TAG = NAME + ' Iterator'; var INCORRECT_VALUES_NAME = false; var IterablePrototype = Iterable.prototype; var nativeIterator = IterablePrototype[ITERATOR] || IterablePrototype['@@iterator'] || DEFAULT && IterablePrototype[DEFAULT]; var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; var CurrentIteratorPrototype, methods, KEY; // fix native if (anyNativeIterator) { CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { if (setPrototypeOf) { setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis); } } // Set @@toStringTag to native iterators setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; } } // fix Array.prototype.{ values, @@iterator }.name in V8 / FF if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { createNonEnumerableProperty(IterablePrototype, 'name', VALUES); } else { INCORRECT_VALUES_NAME = true; defaultIterator = function values() { return call(nativeIterator, this); }; } } // export additional methods if (DEFAULT) { methods = { values: getIterationMethod(VALUES), keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), entries: getIterationMethod(ENTRIES) }; if (FORCED) for (KEY in methods) { if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { defineBuiltIn(IterablePrototype, KEY, methods[KEY]); } } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); } // define iterator if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); } Iterators[NAME] = defaultIterator; return methods; }; /***/ }), /***/ "./node_modules/core-js/internals/define-well-known-symbol.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/define-well-known-symbol.js ***! \********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js"); var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); module.exports = function (NAME) { var Symbol = path.Symbol || (path.Symbol = {}); if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, { value: wrappedWellKnownSymbolModule.f(NAME) }); }; /***/ }), /***/ "./node_modules/core-js/internals/descriptors.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/descriptors.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); // Detect IE8's incomplete defineProperty implementation module.exports = !fails(function () { // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; }); /***/ }), /***/ "./node_modules/core-js/internals/document-create-element.js": /*!*******************************************************************!*\ !*** ./node_modules/core-js/internals/document-create-element.js ***! \*******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var document = global.document; // typeof document.createElement is 'object' in old IE var EXISTS = isObject(document) && isObject(document.createElement); module.exports = function (it) { return EXISTS ? document.createElement(it) : {}; }; /***/ }), /***/ "./node_modules/core-js/internals/does-not-exceed-safe-integer.js": /*!************************************************************************!*\ !*** ./node_modules/core-js/internals/does-not-exceed-safe-integer.js ***! \************************************************************************/ /***/ ((module) => { var $TypeError = TypeError; var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 module.exports = function (it) { if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded'); return it; }; /***/ }), /***/ "./node_modules/core-js/internals/dom-iterables.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/dom-iterables.js ***! \*********************************************************/ /***/ ((module) => { // iterable DOM collections // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods module.exports = { CSSRuleList: 0, CSSStyleDeclaration: 0, CSSValueList: 0, ClientRectList: 0, DOMRectList: 0, DOMStringList: 0, DOMTokenList: 1, DataTransferItemList: 0, FileList: 0, HTMLAllCollection: 0, HTMLCollection: 0, HTMLFormElement: 0, HTMLSelectElement: 0, MediaList: 0, MimeTypeArray: 0, NamedNodeMap: 0, NodeList: 1, PaintRequestList: 0, Plugin: 0, PluginArray: 0, SVGLengthList: 0, SVGNumberList: 0, SVGPathSegList: 0, SVGPointList: 0, SVGStringList: 0, SVGTransformList: 0, SourceBufferList: 0, StyleSheetList: 0, TextTrackCueList: 0, TextTrackList: 0, TouchList: 0 }; /***/ }), /***/ "./node_modules/core-js/internals/dom-token-list-prototype.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/dom-token-list-prototype.js ***! \********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList` var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); var classList = documentCreateElement('span').classList; var DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype; module.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype; /***/ }), /***/ "./node_modules/core-js/internals/engine-user-agent.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/engine-user-agent.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); module.exports = getBuiltIn('navigator', 'userAgent') || ''; /***/ }), /***/ "./node_modules/core-js/internals/engine-v8-version.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/engine-v8-version.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js"); var process = global.process; var Deno = global.Deno; var versions = process && process.versions || Deno && Deno.version; var v8 = versions && versions.v8; var match, version; if (v8) { match = v8.split('.'); // in old Chrome, versions of V8 isn't V8 = Chrome / 10 // but their correct versions are not interesting for us version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); } // BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` // so check `userAgent` even if `.v8` exists, but 0 if (!version && userAgent) { match = userAgent.match(/Edge\/(\d+)/); if (!match || match[1] >= 74) { match = userAgent.match(/Chrome\/(\d+)/); if (match) version = +match[1]; } } module.exports = version; /***/ }), /***/ "./node_modules/core-js/internals/enum-bug-keys.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/enum-bug-keys.js ***! \*********************************************************/ /***/ ((module) => { // IE8- don't enum bug keys module.exports = [ 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf' ]; /***/ }), /***/ "./node_modules/core-js/internals/export.js": /*!**************************************************!*\ !*** ./node_modules/core-js/internals/export.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ "./node_modules/core-js/internals/define-global-property.js"); var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js"); var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js"); /* options.target - name of the target object options.global - target is the global object options.stat - export as static methods of target options.proto - export as prototype methods of target options.real - real prototype method for the `pure` version options.forced - export even if the native feature is available options.bind - bind methods to the target, required for the `pure` version options.wrap - wrap constructors to preventing global pollution, required for the `pure` version options.unsafe - use the simple assignment of property instead of delete + defineProperty options.sham - add a flag to not completely full polyfills options.enumerable - export as enumerable property options.dontCallGetSet - prevent calling a getter on target options.name - the .name of the function if it does not match the key */ module.exports = function (options, source) { var TARGET = options.target; var GLOBAL = options.global; var STATIC = options.stat; var FORCED, target, key, targetProperty, sourceProperty, descriptor; if (GLOBAL) { target = global; } else if (STATIC) { target = global[TARGET] || defineGlobalProperty(TARGET, {}); } else { target = (global[TARGET] || {}).prototype; } if (target) for (key in source) { sourceProperty = source[key]; if (options.dontCallGetSet) { descriptor = getOwnPropertyDescriptor(target, key); targetProperty = descriptor && descriptor.value; } else targetProperty = target[key]; FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); // contained in target if (!FORCED && targetProperty !== undefined) { if (typeof sourceProperty == typeof targetProperty) continue; copyConstructorProperties(sourceProperty, targetProperty); } // add a flag to not completely full polyfills if (options.sham || (targetProperty && targetProperty.sham)) { createNonEnumerableProperty(sourceProperty, 'sham', true); } defineBuiltIn(target, key, sourceProperty, options); } }; /***/ }), /***/ "./node_modules/core-js/internals/fails.js": /*!*************************************************!*\ !*** ./node_modules/core-js/internals/fails.js ***! \*************************************************/ /***/ ((module) => { module.exports = function (exec) { try { return !!exec(); } catch (error) { return true; } }; /***/ }), /***/ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js": /*!******************************************************************************!*\ !*** ./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js ***! \******************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // TODO: Remove from `core-js@4` since it's moved to entry points __webpack_require__(/*! ../modules/es.regexp.exec */ "./node_modules/core-js/modules/es.regexp.exec.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var SPECIES = wellKnownSymbol('species'); var RegExpPrototype = RegExp.prototype; module.exports = function (KEY, exec, FORCED, SHAM) { var SYMBOL = wellKnownSymbol(KEY); var DELEGATES_TO_SYMBOL = !fails(function () { // String methods call symbol-named RegEp methods var O = {}; O[SYMBOL] = function () { return 7; }; return ''[KEY](O) != 7; }); var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () { // Symbol-named RegExp methods call .exec var execCalled = false; var re = /a/; if (KEY === 'split') { // We can't use real regex here since it causes deoptimization // and serious performance degradation in V8 // https://github.com/zloirock/core-js/issues/306 re = {}; // RegExp[@@split] doesn't call the regex's exec method, but first creates // a new one. We need to return the patched regex when creating the new one. re.constructor = {}; re.constructor[SPECIES] = function () { return re; }; re.flags = ''; re[SYMBOL] = /./[SYMBOL]; } re.exec = function () { execCalled = true; return null; }; re[SYMBOL](''); return !execCalled; }); if ( !DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || FORCED ) { var uncurriedNativeRegExpMethod = uncurryThis(/./[SYMBOL]); var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) { var uncurriedNativeMethod = uncurryThis(nativeMethod); var $exec = regexp.exec; if ($exec === regexpExec || $exec === RegExpPrototype.exec) { if (DELEGATES_TO_SYMBOL && !forceStringMethod) { // The native String method already delegates to @@method (this // polyfilled function), leasing to infinite recursion. // We avoid it by directly calling the native @@method method. return { done: true, value: uncurriedNativeRegExpMethod(regexp, str, arg2) }; } return { done: true, value: uncurriedNativeMethod(str, regexp, arg2) }; } return { done: false }; }); defineBuiltIn(String.prototype, KEY, methods[0]); defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]); } if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true); }; /***/ }), /***/ "./node_modules/core-js/internals/freezing.js": /*!****************************************************!*\ !*** ./node_modules/core-js/internals/freezing.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = !fails(function () { // eslint-disable-next-line es-x/no-object-isextensible, es-x/no-object-preventextensions -- required for testing return Object.isExtensible(Object.preventExtensions({})); }); /***/ }), /***/ "./node_modules/core-js/internals/function-apply.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/function-apply.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); var FunctionPrototype = Function.prototype; var apply = FunctionPrototype.apply; var call = FunctionPrototype.call; // eslint-disable-next-line es-x/no-reflect -- safe module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () { return call.apply(apply, arguments); }); /***/ }), /***/ "./node_modules/core-js/internals/function-bind-context.js": /*!*****************************************************************!*\ !*** ./node_modules/core-js/internals/function-bind-context.js ***! \*****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js"); var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); var bind = uncurryThis(uncurryThis.bind); // optional / simple context binding module.exports = function (fn, that) { aCallable(fn); return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { return fn.apply(that, arguments); }; }; /***/ }), /***/ "./node_modules/core-js/internals/function-bind-native.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/function-bind-native.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); module.exports = !fails(function () { // eslint-disable-next-line es-x/no-function-prototype-bind -- safe var test = (function () { /* empty */ }).bind(); // eslint-disable-next-line no-prototype-builtins -- safe return typeof test != 'function' || test.hasOwnProperty('prototype'); }); /***/ }), /***/ "./node_modules/core-js/internals/function-call.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/function-call.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); var call = Function.prototype.call; module.exports = NATIVE_BIND ? call.bind(call) : function () { return call.apply(call, arguments); }; /***/ }), /***/ "./node_modules/core-js/internals/function-name.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/function-name.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var FunctionPrototype = Function.prototype; // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; var EXISTS = hasOwn(FunctionPrototype, 'name'); // additional protection from minified / mangled / dropped function names var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); module.exports = { EXISTS: EXISTS, PROPER: PROPER, CONFIGURABLE: CONFIGURABLE }; /***/ }), /***/ "./node_modules/core-js/internals/function-uncurry-this.js": /*!*****************************************************************!*\ !*** ./node_modules/core-js/internals/function-uncurry-this.js ***! \*****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); var FunctionPrototype = Function.prototype; var bind = FunctionPrototype.bind; var call = FunctionPrototype.call; var uncurryThis = NATIVE_BIND && bind.bind(call, call); module.exports = NATIVE_BIND ? function (fn) { return fn && uncurryThis(fn); } : function (fn) { return fn && function () { return call.apply(fn, arguments); }; }; /***/ }), /***/ "./node_modules/core-js/internals/get-built-in.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/get-built-in.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var aFunction = function (argument) { return isCallable(argument) ? argument : undefined; }; module.exports = function (namespace, method) { return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; }; /***/ }), /***/ "./node_modules/core-js/internals/get-method.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/get-method.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js"); // `GetMethod` abstract operation // https://tc39.es/ecma262/#sec-getmethod module.exports = function (V, P) { var func = V[P]; return func == null ? undefined : aCallable(func); }; /***/ }), /***/ "./node_modules/core-js/internals/get-substitution.js": /*!************************************************************!*\ !*** ./node_modules/core-js/internals/get-substitution.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var floor = Math.floor; var charAt = uncurryThis(''.charAt); var replace = uncurryThis(''.replace); var stringSlice = uncurryThis(''.slice); var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g; var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g; // `GetSubstitution` abstract operation // https://tc39.es/ecma262/#sec-getsubstitution module.exports = function (matched, str, position, captures, namedCaptures, replacement) { var tailPos = position + matched.length; var m = captures.length; var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; if (namedCaptures !== undefined) { namedCaptures = toObject(namedCaptures); symbols = SUBSTITUTION_SYMBOLS; } return replace(replacement, symbols, function (match, ch) { var capture; switch (charAt(ch, 0)) { case '$': return '$'; case '&': return matched; case '`': return stringSlice(str, 0, position); case "'": return stringSlice(str, tailPos); case '<': capture = namedCaptures[stringSlice(ch, 1, -1)]; break; default: // \d\d? var n = +ch; if (n === 0) return match; if (n > m) { var f = floor(n / 10); if (f === 0) return match; if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1); return match; } capture = captures[n - 1]; } return capture === undefined ? '' : capture; }); }; /***/ }), /***/ "./node_modules/core-js/internals/global.js": /*!**************************************************!*\ !*** ./node_modules/core-js/internals/global.js ***! \**************************************************/ /***/ ((module) => { var check = function (it) { return it && it.Math == Math && it; }; // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 module.exports = // eslint-disable-next-line es-x/no-global-this -- safe check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || // eslint-disable-next-line no-restricted-globals -- safe check(typeof self == 'object' && self) || check(typeof global == 'object' && global) || // eslint-disable-next-line no-new-func -- fallback (function () { return this; })() || Function('return this')(); /***/ }), /***/ "./node_modules/core-js/internals/has-own-property.js": /*!************************************************************!*\ !*** ./node_modules/core-js/internals/has-own-property.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var hasOwnProperty = uncurryThis({}.hasOwnProperty); // `HasOwnProperty` abstract operation // https://tc39.es/ecma262/#sec-hasownproperty // eslint-disable-next-line es-x/no-object-hasown -- safe module.exports = Object.hasOwn || function hasOwn(it, key) { return hasOwnProperty(toObject(it), key); }; /***/ }), /***/ "./node_modules/core-js/internals/hidden-keys.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/hidden-keys.js ***! \*******************************************************/ /***/ ((module) => { module.exports = {}; /***/ }), /***/ "./node_modules/core-js/internals/html.js": /*!************************************************!*\ !*** ./node_modules/core-js/internals/html.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); module.exports = getBuiltIn('document', 'documentElement'); /***/ }), /***/ "./node_modules/core-js/internals/ie8-dom-define.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/ie8-dom-define.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); // Thanks to IE8 for its funny defineProperty module.exports = !DESCRIPTORS && !fails(function () { // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing return Object.defineProperty(createElement('div'), 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /***/ "./node_modules/core-js/internals/indexed-object.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/indexed-object.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var $Object = Object; var split = uncurryThis(''.split); // fallback for non-array-like ES3 and non-enumerable old V8 strings module.exports = fails(function () { // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 // eslint-disable-next-line no-prototype-builtins -- safe return !$Object('z').propertyIsEnumerable(0); }) ? function (it) { return classof(it) == 'String' ? split(it, '') : $Object(it); } : $Object; /***/ }), /***/ "./node_modules/core-js/internals/inspect-source.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/inspect-source.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); var functionToString = uncurryThis(Function.toString); // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper if (!isCallable(store.inspectSource)) { store.inspectSource = function (it) { return functionToString(it); }; } module.exports = store.inspectSource; /***/ }), /***/ "./node_modules/core-js/internals/internal-metadata.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/internal-metadata.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js"); var getOwnPropertyNamesExternalModule = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/core-js/internals/object-get-own-property-names-external.js"); var isExtensible = __webpack_require__(/*! ../internals/object-is-extensible */ "./node_modules/core-js/internals/object-is-extensible.js"); var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js"); var REQUIRED = false; var METADATA = uid('meta'); var id = 0; var setMetadata = function (it) { defineProperty(it, METADATA, { value: { objectID: 'O' + id++, // object ID weakData: {} // weak collections IDs } }); }; var fastKey = function (it, create) { // return a primitive with prefix if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; if (!hasOwn(it, METADATA)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return 'F'; // not necessary to add metadata if (!create) return 'E'; // add missing metadata setMetadata(it); // return object ID } return it[METADATA].objectID; }; var getWeakData = function (it, create) { if (!hasOwn(it, METADATA)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return true; // not necessary to add metadata if (!create) return false; // add missing metadata setMetadata(it); // return the store of weak collections IDs } return it[METADATA].weakData; }; // add metadata on freeze-family methods calling var onFreeze = function (it) { if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it); return it; }; var enable = function () { meta.enable = function () { /* empty */ }; REQUIRED = true; var getOwnPropertyNames = getOwnPropertyNamesModule.f; var splice = uncurryThis([].splice); var test = {}; test[METADATA] = 1; // prevent exposing of metadata key if (getOwnPropertyNames(test).length) { getOwnPropertyNamesModule.f = function (it) { var result = getOwnPropertyNames(it); for (var i = 0, length = result.length; i < length; i++) { if (result[i] === METADATA) { splice(result, i, 1); break; } } return result; }; $({ target: 'Object', stat: true, forced: true }, { getOwnPropertyNames: getOwnPropertyNamesExternalModule.f }); } }; var meta = module.exports = { enable: enable, fastKey: fastKey, getWeakData: getWeakData, onFreeze: onFreeze }; hiddenKeys[METADATA] = true; /***/ }), /***/ "./node_modules/core-js/internals/internal-state.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/internal-state.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/core-js/internals/native-weak-map.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var shared = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; var TypeError = global.TypeError; var WeakMap = global.WeakMap; var set, get, has; var enforce = function (it) { return has(it) ? get(it) : set(it, {}); }; var getterFor = function (TYPE) { return function (it) { var state; if (!isObject(it) || (state = get(it)).type !== TYPE) { throw TypeError('Incompatible receiver, ' + TYPE + ' required'); } return state; }; }; if (NATIVE_WEAK_MAP || shared.state) { var store = shared.state || (shared.state = new WeakMap()); var wmget = uncurryThis(store.get); var wmhas = uncurryThis(store.has); var wmset = uncurryThis(store.set); set = function (it, metadata) { if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); metadata.facade = it; wmset(store, it, metadata); return metadata; }; get = function (it) { return wmget(store, it) || {}; }; has = function (it) { return wmhas(store, it); }; } else { var STATE = sharedKey('state'); hiddenKeys[STATE] = true; set = function (it, metadata) { if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); metadata.facade = it; createNonEnumerableProperty(it, STATE, metadata); return metadata; }; get = function (it) { return hasOwn(it, STATE) ? it[STATE] : {}; }; has = function (it) { return hasOwn(it, STATE); }; } module.exports = { set: set, get: get, has: has, enforce: enforce, getterFor: getterFor }; /***/ }), /***/ "./node_modules/core-js/internals/is-array.js": /*!****************************************************!*\ !*** ./node_modules/core-js/internals/is-array.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); // `IsArray` abstract operation // https://tc39.es/ecma262/#sec-isarray // eslint-disable-next-line es-x/no-array-isarray -- safe module.exports = Array.isArray || function isArray(argument) { return classof(argument) == 'Array'; }; /***/ }), /***/ "./node_modules/core-js/internals/is-callable.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/is-callable.js ***! \*******************************************************/ /***/ ((module) => { // `IsCallable` abstract operation // https://tc39.es/ecma262/#sec-iscallable module.exports = function (argument) { return typeof argument == 'function'; }; /***/ }), /***/ "./node_modules/core-js/internals/is-constructor.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/is-constructor.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); var noop = function () { /* empty */ }; var empty = []; var construct = getBuiltIn('Reflect', 'construct'); var constructorRegExp = /^\s*(?:class|function)\b/; var exec = uncurryThis(constructorRegExp.exec); var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); var isConstructorModern = function isConstructor(argument) { if (!isCallable(argument)) return false; try { construct(noop, empty, argument); return true; } catch (error) { return false; } }; var isConstructorLegacy = function isConstructor(argument) { if (!isCallable(argument)) return false; switch (classof(argument)) { case 'AsyncFunction': case 'GeneratorFunction': case 'AsyncGeneratorFunction': return false; } try { // we can't check .prototype since constructors produced by .bind haven't it // `Function#toString` throws on some built-it function in some legacy engines // (for example, `DOMQuad` and similar in FF41-) return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); } catch (error) { return true; } }; isConstructorLegacy.sham = true; // `IsConstructor` abstract operation // https://tc39.es/ecma262/#sec-isconstructor module.exports = !construct || fails(function () { var called; return isConstructorModern(isConstructorModern.call) || !isConstructorModern(Object) || !isConstructorModern(function () { called = true; }) || called; }) ? isConstructorLegacy : isConstructorModern; /***/ }), /***/ "./node_modules/core-js/internals/is-forced.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/is-forced.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var replacement = /#|\.prototype\./; var isForced = function (feature, detection) { var value = data[normalize(feature)]; return value == POLYFILL ? true : value == NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection; }; var normalize = isForced.normalize = function (string) { return String(string).replace(replacement, '.').toLowerCase(); }; var data = isForced.data = {}; var NATIVE = isForced.NATIVE = 'N'; var POLYFILL = isForced.POLYFILL = 'P'; module.exports = isForced; /***/ }), /***/ "./node_modules/core-js/internals/is-object.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/is-object.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); module.exports = function (it) { return typeof it == 'object' ? it !== null : isCallable(it); }; /***/ }), /***/ "./node_modules/core-js/internals/is-pure.js": /*!***************************************************!*\ !*** ./node_modules/core-js/internals/is-pure.js ***! \***************************************************/ /***/ ((module) => { module.exports = false; /***/ }), /***/ "./node_modules/core-js/internals/is-regexp.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/is-regexp.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var MATCH = wellKnownSymbol('match'); // `IsRegExp` abstract operation // https://tc39.es/ecma262/#sec-isregexp module.exports = function (it) { var isRegExp; return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp'); }; /***/ }), /***/ "./node_modules/core-js/internals/is-symbol.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/is-symbol.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js"); var $Object = Object; module.exports = USE_SYMBOL_AS_UID ? function (it) { return typeof it == 'symbol'; } : function (it) { var $Symbol = getBuiltIn('Symbol'); return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); }; /***/ }), /***/ "./node_modules/core-js/internals/iterators-core.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/internals/iterators-core.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var ITERATOR = wellKnownSymbol('iterator'); var BUGGY_SAFARI_ITERATORS = false; // `%IteratorPrototype%` object // https://tc39.es/ecma262/#sec-%iteratorprototype%-object var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; /* eslint-disable es-x/no-array-prototype-keys -- safe */ if ([].keys) { arrayIterator = [].keys(); // Safari 8 has buggy iterators w/o `next` if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; else { PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; } } var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { var test = {}; // FF44- legacy iterators case return IteratorPrototype[ITERATOR].call(test) !== test; }); if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); // `%IteratorPrototype%[@@iterator]()` method // https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator if (!isCallable(IteratorPrototype[ITERATOR])) { defineBuiltIn(IteratorPrototype, ITERATOR, function () { return this; }); } module.exports = { IteratorPrototype: IteratorPrototype, BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS }; /***/ }), /***/ "./node_modules/core-js/internals/iterators.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/iterators.js ***! \*****************************************************/ /***/ ((module) => { module.exports = {}; /***/ }), /***/ "./node_modules/core-js/internals/length-of-array-like.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/length-of-array-like.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); // `LengthOfArrayLike` abstract operation // https://tc39.es/ecma262/#sec-lengthofarraylike module.exports = function (obj) { return toLength(obj.length); }; /***/ }), /***/ "./node_modules/core-js/internals/make-built-in.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/make-built-in.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").CONFIGURABLE); var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var enforceInternalState = InternalStateModule.enforce; var getInternalState = InternalStateModule.get; // eslint-disable-next-line es-x/no-object-defineproperty -- safe var defineProperty = Object.defineProperty; var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; }); var TEMPLATE = String(String).split('String'); var makeBuiltIn = module.exports = function (value, name, options) { if (String(name).slice(0, 7) === 'Symbol(') { name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']'; } if (options && options.getter) name = 'get ' + name; if (options && options.setter) name = 'set ' + name; if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { defineProperty(value, 'name', { value: name, configurable: true }); } if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { defineProperty(value, 'length', { value: options.arity }); } try { if (options && hasOwn(options, 'constructor') && options.constructor) { if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable } else if (value.prototype) value.prototype = undefined; } catch (error) { /* empty */ } var state = enforceInternalState(value); if (!hasOwn(state, 'source')) { state.source = TEMPLATE.join(typeof name == 'string' ? name : ''); } return value; }; // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative // eslint-disable-next-line no-extend-native -- required Function.prototype.toString = makeBuiltIn(function toString() { return isCallable(this) && getInternalState(this).source || inspectSource(this); }, 'toString'); /***/ }), /***/ "./node_modules/core-js/internals/math-trunc.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/math-trunc.js ***! \******************************************************/ /***/ ((module) => { var ceil = Math.ceil; var floor = Math.floor; // `Math.trunc` method // https://tc39.es/ecma262/#sec-math.trunc // eslint-disable-next-line es-x/no-math-trunc -- safe module.exports = Math.trunc || function trunc(x) { var n = +x; return (n > 0 ? floor : ceil)(n); }; /***/ }), /***/ "./node_modules/core-js/internals/native-symbol-registry.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/native-symbol-registry.js ***! \******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); /* eslint-disable es-x/no-symbol -- safe */ module.exports = NATIVE_SYMBOL && !!Symbol['for'] && !!Symbol.keyFor; /***/ }), /***/ "./node_modules/core-js/internals/native-symbol.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/native-symbol.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* eslint-disable es-x/no-symbol -- required for testing */ var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); // eslint-disable-next-line es-x/no-object-getownpropertysymbols -- required for testing module.exports = !!Object.getOwnPropertySymbols && !fails(function () { var symbol = Symbol(); // Chrome 38 Symbol has incorrect toString conversion // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances return !String(symbol) || !(Object(symbol) instanceof Symbol) || // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances !Symbol.sham && V8_VERSION && V8_VERSION < 41; }); /***/ }), /***/ "./node_modules/core-js/internals/native-weak-map.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/native-weak-map.js ***! \***********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); var WeakMap = global.WeakMap; module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap)); /***/ }), /***/ "./node_modules/core-js/internals/object-assign.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/object-assign.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); // eslint-disable-next-line es-x/no-object-assign -- safe var $assign = Object.assign; // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing var defineProperty = Object.defineProperty; var concat = uncurryThis([].concat); // `Object.assign` method // https://tc39.es/ecma262/#sec-object.assign module.exports = !$assign || fails(function () { // should have correct order of operations (Edge bug) if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', { enumerable: true, get: function () { defineProperty(this, 'b', { value: 3, enumerable: false }); } }), { b: 2 })).b !== 1) return true; // should work with symbols and should have deterministic property order (V8 bug) var A = {}; var B = {}; // eslint-disable-next-line es-x/no-symbol -- safe var symbol = Symbol(); var alphabet = 'abcdefghijklmnopqrst'; A[symbol] = 7; alphabet.split('').forEach(function (chr) { B[chr] = chr; }); return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet; }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length` var T = toObject(target); var argumentsLength = arguments.length; var index = 1; var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; var propertyIsEnumerable = propertyIsEnumerableModule.f; while (argumentsLength > index) { var S = IndexedObject(arguments[index++]); var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S); var length = keys.length; var j = 0; var key; while (length > j) { key = keys[j++]; if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key]; } } return T; } : $assign; /***/ }), /***/ "./node_modules/core-js/internals/object-create.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/object-create.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* global ActiveXObject -- old IE, WSH */ var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var definePropertiesModule = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js"); var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js"); var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); var GT = '>'; var LT = '<'; var PROTOTYPE = 'prototype'; var SCRIPT = 'script'; var IE_PROTO = sharedKey('IE_PROTO'); var EmptyConstructor = function () { /* empty */ }; var scriptTag = function (content) { return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; }; // Create object with fake `null` prototype: use ActiveX Object with cleared prototype var NullProtoObjectViaActiveX = function (activeXDocument) { activeXDocument.write(scriptTag('')); activeXDocument.close(); var temp = activeXDocument.parentWindow.Object; activeXDocument = null; // avoid memory leak return temp; }; // Create object with fake `null` prototype: use iframe Object with cleared prototype var NullProtoObjectViaIFrame = function () { // Thrash, waste and sodomy: IE GC bug var iframe = documentCreateElement('iframe'); var JS = 'java' + SCRIPT + ':'; var iframeDocument; iframe.style.display = 'none'; html.appendChild(iframe); // https://github.com/zloirock/core-js/issues/475 iframe.src = String(JS); iframeDocument = iframe.contentWindow.document; iframeDocument.open(); iframeDocument.write(scriptTag('document.F=Object')); iframeDocument.close(); return iframeDocument.F; }; // Check for document.domain and active x support // No need to use active x approach when document.domain is not set // see https://github.com/es-shims/es5-shim/issues/150 // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 // avoid IE GC bug var activeXDocument; var NullProtoObject = function () { try { activeXDocument = new ActiveXObject('htmlfile'); } catch (error) { /* ignore */ } NullProtoObject = typeof document != 'undefined' ? document.domain && activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) // old IE : NullProtoObjectViaIFrame() : NullProtoObjectViaActiveX(activeXDocument); // WSH var length = enumBugKeys.length; while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; return NullProtoObject(); }; hiddenKeys[IE_PROTO] = true; // `Object.create` method // https://tc39.es/ecma262/#sec-object.create // eslint-disable-next-line es-x/no-object-create -- safe module.exports = Object.create || function create(O, Properties) { var result; if (O !== null) { EmptyConstructor[PROTOTYPE] = anObject(O); result = new EmptyConstructor(); EmptyConstructor[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill result[IE_PROTO] = O; } else result = NullProtoObject(); return Properties === undefined ? result : definePropertiesModule.f(result, Properties); }; /***/ }), /***/ "./node_modules/core-js/internals/object-define-properties.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/object-define-properties.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(/*! ../internals/v8-prototype-define-bug */ "./node_modules/core-js/internals/v8-prototype-define-bug.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); // `Object.defineProperties` method // https://tc39.es/ecma262/#sec-object.defineproperties // eslint-disable-next-line es-x/no-object-defineproperties -- safe exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); var props = toIndexedObject(Properties); var keys = objectKeys(Properties); var length = keys.length; var index = 0; var key; while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); return O; }; /***/ }), /***/ "./node_modules/core-js/internals/object-define-property.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/object-define-property.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(/*! ../internals/v8-prototype-define-bug */ "./node_modules/core-js/internals/v8-prototype-define-bug.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js"); var $TypeError = TypeError; // eslint-disable-next-line es-x/no-object-defineproperty -- safe var $defineProperty = Object.defineProperty; // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var ENUMERABLE = 'enumerable'; var CONFIGURABLE = 'configurable'; var WRITABLE = 'writable'; // `Object.defineProperty` method // https://tc39.es/ecma262/#sec-object.defineproperty exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { anObject(O); P = toPropertyKey(P); anObject(Attributes); if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { var current = $getOwnPropertyDescriptor(O, P); if (current && current[WRITABLE]) { O[P] = Attributes.value; Attributes = { configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], writable: false }; } } return $defineProperty(O, P, Attributes); } : $defineProperty : function defineProperty(O, P, Attributes) { anObject(O); P = toPropertyKey(P); anObject(Attributes); if (IE8_DOM_DEFINE) try { return $defineProperty(O, P, Attributes); } catch (error) { /* empty */ } if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported'); if ('value' in Attributes) O[P] = Attributes.value; return O; }; /***/ }), /***/ "./node_modules/core-js/internals/object-get-own-property-descriptor.js": /*!******************************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***! \******************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // `Object.getOwnPropertyDescriptor` method // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { O = toIndexedObject(O); P = toPropertyKey(P); if (IE8_DOM_DEFINE) try { return $getOwnPropertyDescriptor(O, P); } catch (error) { /* empty */ } if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); }; /***/ }), /***/ "./node_modules/core-js/internals/object-get-own-property-names-external.js": /*!**********************************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-own-property-names-external.js ***! \**********************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* eslint-disable es-x/no-object-getownpropertynames -- safe */ var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var $getOwnPropertyNames = (__webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f); var arraySlice = __webpack_require__(/*! ../internals/array-slice-simple */ "./node_modules/core-js/internals/array-slice-simple.js"); var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; var getWindowNames = function (it) { try { return $getOwnPropertyNames(it); } catch (error) { return arraySlice(windowNames); } }; // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window module.exports.f = function getOwnPropertyNames(it) { return windowNames && classof(it) == 'Window' ? getWindowNames(it) : $getOwnPropertyNames(toIndexedObject(it)); }; /***/ }), /***/ "./node_modules/core-js/internals/object-get-own-property-names.js": /*!*************************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***! \*************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); var hiddenKeys = enumBugKeys.concat('length', 'prototype'); // `Object.getOwnPropertyNames` method // https://tc39.es/ecma262/#sec-object.getownpropertynames // eslint-disable-next-line es-x/no-object-getownpropertynames -- safe exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return internalObjectKeys(O, hiddenKeys); }; /***/ }), /***/ "./node_modules/core-js/internals/object-get-own-property-symbols.js": /*!***************************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***! \***************************************************************************/ /***/ ((__unused_webpack_module, exports) => { // eslint-disable-next-line es-x/no-object-getownpropertysymbols -- safe exports.f = Object.getOwnPropertySymbols; /***/ }), /***/ "./node_modules/core-js/internals/object-get-prototype-of.js": /*!*******************************************************************!*\ !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***! \*******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js"); var IE_PROTO = sharedKey('IE_PROTO'); var $Object = Object; var ObjectPrototype = $Object.prototype; // `Object.getPrototypeOf` method // https://tc39.es/ecma262/#sec-object.getprototypeof // eslint-disable-next-line es-x/no-object-getprototypeof -- safe module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { var object = toObject(O); if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; var constructor = object.constructor; if (isCallable(constructor) && object instanceof constructor) { return constructor.prototype; } return object instanceof $Object ? ObjectPrototype : null; }; /***/ }), /***/ "./node_modules/core-js/internals/object-is-extensible.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/object-is-extensible.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var ARRAY_BUFFER_NON_EXTENSIBLE = __webpack_require__(/*! ../internals/array-buffer-non-extensible */ "./node_modules/core-js/internals/array-buffer-non-extensible.js"); // eslint-disable-next-line es-x/no-object-isextensible -- safe var $isExtensible = Object.isExtensible; var FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); }); // `Object.isExtensible` method // https://tc39.es/ecma262/#sec-object.isextensible module.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) { if (!isObject(it)) return false; if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') return false; return $isExtensible ? $isExtensible(it) : true; } : $isExtensible; /***/ }), /***/ "./node_modules/core-js/internals/object-is-prototype-of.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/object-is-prototype-of.js ***! \******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); module.exports = uncurryThis({}.isPrototypeOf); /***/ }), /***/ "./node_modules/core-js/internals/object-keys-internal.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/object-keys-internal.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var indexOf = (__webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").indexOf); var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); var push = uncurryThis([].push); module.exports = function (object, names) { var O = toIndexedObject(object); var i = 0; var result = []; var key; for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); // Don't enum bug & hidden keys while (names.length > i) if (hasOwn(O, key = names[i++])) { ~indexOf(result, key) || push(result, key); } return result; }; /***/ }), /***/ "./node_modules/core-js/internals/object-keys.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/object-keys.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); // `Object.keys` method // https://tc39.es/ecma262/#sec-object.keys // eslint-disable-next-line es-x/no-object-keys -- safe module.exports = Object.keys || function keys(O) { return internalObjectKeys(O, enumBugKeys); }; /***/ }), /***/ "./node_modules/core-js/internals/object-property-is-enumerable.js": /*!*************************************************************************!*\ !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***! \*************************************************************************/ /***/ ((__unused_webpack_module, exports) => { "use strict"; var $propertyIsEnumerable = {}.propertyIsEnumerable; // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // Nashorn ~ JDK8 bug var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); // `Object.prototype.propertyIsEnumerable` method implementation // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { var descriptor = getOwnPropertyDescriptor(this, V); return !!descriptor && descriptor.enumerable; } : $propertyIsEnumerable; /***/ }), /***/ "./node_modules/core-js/internals/object-set-prototype-of.js": /*!*******************************************************************!*\ !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***! \*******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* eslint-disable no-proto -- safe */ var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "./node_modules/core-js/internals/a-possible-prototype.js"); // `Object.setPrototypeOf` method // https://tc39.es/ecma262/#sec-object.setprototypeof // Works with __proto__ only. Old v8 can't work with null proto objects. // eslint-disable-next-line es-x/no-object-setprototypeof -- safe module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { var CORRECT_SETTER = false; var test = {}; var setter; try { // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); setter(test, []); CORRECT_SETTER = test instanceof Array; } catch (error) { /* empty */ } return function setPrototypeOf(O, proto) { anObject(O); aPossiblePrototype(proto); if (CORRECT_SETTER) setter(O, proto); else O.__proto__ = proto; return O; }; }() : undefined); /***/ }), /***/ "./node_modules/core-js/internals/object-to-string.js": /*!************************************************************!*\ !*** ./node_modules/core-js/internals/object-to-string.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); // `Object.prototype.toString` method implementation // https://tc39.es/ecma262/#sec-object.prototype.tostring module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { return '[object ' + classof(this) + ']'; }; /***/ }), /***/ "./node_modules/core-js/internals/ordinary-to-primitive.js": /*!*****************************************************************!*\ !*** ./node_modules/core-js/internals/ordinary-to-primitive.js ***! \*****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var $TypeError = TypeError; // `OrdinaryToPrimitive` abstract operation // https://tc39.es/ecma262/#sec-ordinarytoprimitive module.exports = function (input, pref) { var fn, val; if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; throw $TypeError("Can't convert object to primitive value"); }; /***/ }), /***/ "./node_modules/core-js/internals/own-keys.js": /*!****************************************************!*\ !*** ./node_modules/core-js/internals/own-keys.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js"); var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var concat = uncurryThis([].concat); // all object keys, includes non-enumerable and symbols module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { var keys = getOwnPropertyNamesModule.f(anObject(it)); var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; }; /***/ }), /***/ "./node_modules/core-js/internals/path.js": /*!************************************************!*\ !*** ./node_modules/core-js/internals/path.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); module.exports = global; /***/ }), /***/ "./node_modules/core-js/internals/regexp-exec-abstract.js": /*!****************************************************************!*\ !*** ./node_modules/core-js/internals/regexp-exec-abstract.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js"); var $TypeError = TypeError; // `RegExpExec` abstract operation // https://tc39.es/ecma262/#sec-regexpexec module.exports = function (R, S) { var exec = R.exec; if (isCallable(exec)) { var result = call(exec, R, S); if (result !== null) anObject(result); return result; } if (classof(R) === 'RegExp') return call(regexpExec, R, S); throw $TypeError('RegExp#exec called on incompatible receiver'); }; /***/ }), /***/ "./node_modules/core-js/internals/regexp-exec.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/internals/regexp-exec.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; /* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */ /* eslint-disable regexp/no-useless-quantifier -- testing */ var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var regexpFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js"); var stickyHelpers = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ "./node_modules/core-js/internals/regexp-sticky-helpers.js"); var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var getInternalState = (__webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js").get); var UNSUPPORTED_DOT_ALL = __webpack_require__(/*! ../internals/regexp-unsupported-dot-all */ "./node_modules/core-js/internals/regexp-unsupported-dot-all.js"); var UNSUPPORTED_NCG = __webpack_require__(/*! ../internals/regexp-unsupported-ncg */ "./node_modules/core-js/internals/regexp-unsupported-ncg.js"); var nativeReplace = shared('native-string-replace', String.prototype.replace); var nativeExec = RegExp.prototype.exec; var patchedExec = nativeExec; var charAt = uncurryThis(''.charAt); var indexOf = uncurryThis(''.indexOf); var replace = uncurryThis(''.replace); var stringSlice = uncurryThis(''.slice); var UPDATES_LAST_INDEX_WRONG = (function () { var re1 = /a/; var re2 = /b*/g; call(nativeExec, re1, 'a'); call(nativeExec, re2, 'a'); return re1.lastIndex !== 0 || re2.lastIndex !== 0; })(); var UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET; // nonparticipating capturing group, copied from es5-shim's String#split patch. var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG; if (PATCH) { patchedExec = function exec(string) { var re = this; var state = getInternalState(re); var str = toString(string); var raw = state.raw; var result, reCopy, lastIndex, match, i, object, group; if (raw) { raw.lastIndex = re.lastIndex; result = call(patchedExec, raw, str); re.lastIndex = raw.lastIndex; return result; } var groups = state.groups; var sticky = UNSUPPORTED_Y && re.sticky; var flags = call(regexpFlags, re); var source = re.source; var charsAdded = 0; var strCopy = str; if (sticky) { flags = replace(flags, 'y', ''); if (indexOf(flags, 'g') === -1) { flags += 'g'; } strCopy = stringSlice(str, re.lastIndex); // Support anchored sticky behavior. if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\n')) { source = '(?: ' + source + ')'; strCopy = ' ' + strCopy; charsAdded++; } // ^(? + rx + ) is needed, in combination with some str slicing, to // simulate the 'y' flag. reCopy = new RegExp('^(?:' + source + ')', flags); } if (NPCG_INCLUDED) { reCopy = new RegExp('^' + source + '$(?!\\s)', flags); } if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; match = call(nativeExec, sticky ? reCopy : re, strCopy); if (sticky) { if (match) { match.input = stringSlice(match.input, charsAdded); match[0] = stringSlice(match[0], charsAdded); match.index = re.lastIndex; re.lastIndex += match[0].length; } else re.lastIndex = 0; } else if (UPDATES_LAST_INDEX_WRONG && match) { re.lastIndex = re.global ? match.index + match[0].length : lastIndex; } if (NPCG_INCLUDED && match && match.length > 1) { // Fix browsers whose `exec` methods don't consistently return `undefined` // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ call(nativeReplace, match[0], reCopy, function () { for (i = 1; i < arguments.length - 2; i++) { if (arguments[i] === undefined) match[i] = undefined; } }); } if (match && groups) { match.groups = object = create(null); for (i = 0; i < groups.length; i++) { group = groups[i]; object[group[0]] = match[group[1]]; } } return match; }; } module.exports = patchedExec; /***/ }), /***/ "./node_modules/core-js/internals/regexp-flags.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/regexp-flags.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); // `RegExp.prototype.flags` getter implementation // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags module.exports = function () { var that = anObject(this); var result = ''; if (that.hasIndices) result += 'd'; if (that.global) result += 'g'; if (that.ignoreCase) result += 'i'; if (that.multiline) result += 'm'; if (that.dotAll) result += 's'; if (that.unicode) result += 'u'; if (that.sticky) result += 'y'; return result; }; /***/ }), /***/ "./node_modules/core-js/internals/regexp-get-flags.js": /*!************************************************************!*\ !*** ./node_modules/core-js/internals/regexp-get-flags.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); var regExpFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js"); var RegExpPrototype = RegExp.prototype; module.exports = function (R) { var flags = R.flags; return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R) ? call(regExpFlags, R) : flags; }; /***/ }), /***/ "./node_modules/core-js/internals/regexp-sticky-helpers.js": /*!*****************************************************************!*\ !*** ./node_modules/core-js/internals/regexp-sticky-helpers.js ***! \*****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); // babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError var $RegExp = global.RegExp; var UNSUPPORTED_Y = fails(function () { var re = $RegExp('a', 'y'); re.lastIndex = 2; return re.exec('abcd') != null; }); // UC Browser bug // https://github.com/zloirock/core-js/issues/1008 var MISSED_STICKY = UNSUPPORTED_Y || fails(function () { return !$RegExp('a', 'y').sticky; }); var BROKEN_CARET = UNSUPPORTED_Y || fails(function () { // https://bugzilla.mozilla.org/show_bug.cgi?id=773687 var re = $RegExp('^r', 'gy'); re.lastIndex = 2; return re.exec('str') != null; }); module.exports = { BROKEN_CARET: BROKEN_CARET, MISSED_STICKY: MISSED_STICKY, UNSUPPORTED_Y: UNSUPPORTED_Y }; /***/ }), /***/ "./node_modules/core-js/internals/regexp-unsupported-dot-all.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/internals/regexp-unsupported-dot-all.js ***! \**********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); // babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError var $RegExp = global.RegExp; module.exports = fails(function () { var re = $RegExp('.', 's'); return !(re.dotAll && re.exec('\n') && re.flags === 's'); }); /***/ }), /***/ "./node_modules/core-js/internals/regexp-unsupported-ncg.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/regexp-unsupported-ncg.js ***! \******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); // babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError var $RegExp = global.RegExp; module.exports = fails(function () { var re = $RegExp('(?b)', 'g'); return re.exec('b').groups.a !== 'b' || 'b'.replace(re, '$c') !== 'bc'; }); /***/ }), /***/ "./node_modules/core-js/internals/require-object-coercible.js": /*!********************************************************************!*\ !*** ./node_modules/core-js/internals/require-object-coercible.js ***! \********************************************************************/ /***/ ((module) => { var $TypeError = TypeError; // `RequireObjectCoercible` abstract operation // https://tc39.es/ecma262/#sec-requireobjectcoercible module.exports = function (it) { if (it == undefined) throw $TypeError("Can't call method on " + it); return it; }; /***/ }), /***/ "./node_modules/core-js/internals/set-to-string-tag.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/set-to-string-tag.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); module.exports = function (target, TAG, STATIC) { if (target && !STATIC) target = target.prototype; if (target && !hasOwn(target, TO_STRING_TAG)) { defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG }); } }; /***/ }), /***/ "./node_modules/core-js/internals/shared-key.js": /*!******************************************************!*\ !*** ./node_modules/core-js/internals/shared-key.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); var keys = shared('keys'); module.exports = function (key) { return keys[key] || (keys[key] = uid(key)); }; /***/ }), /***/ "./node_modules/core-js/internals/shared-store.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/shared-store.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ "./node_modules/core-js/internals/define-global-property.js"); var SHARED = '__core-js_shared__'; var store = global[SHARED] || defineGlobalProperty(SHARED, {}); module.exports = store; /***/ }), /***/ "./node_modules/core-js/internals/shared.js": /*!**************************************************!*\ !*** ./node_modules/core-js/internals/shared.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); (module.exports = function (key, value) { return store[key] || (store[key] = value !== undefined ? value : {}); })('versions', []).push({ version: '3.22.8', mode: IS_PURE ? 'pure' : 'global', copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)', license: 'https://github.com/zloirock/core-js/blob/v3.22.8/LICENSE', source: 'https://github.com/zloirock/core-js' }); /***/ }), /***/ "./node_modules/core-js/internals/species-constructor.js": /*!***************************************************************!*\ !*** ./node_modules/core-js/internals/species-constructor.js ***! \***************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "./node_modules/core-js/internals/a-constructor.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var SPECIES = wellKnownSymbol('species'); // `SpeciesConstructor` abstract operation // https://tc39.es/ecma262/#sec-speciesconstructor module.exports = function (O, defaultConstructor) { var C = anObject(O).constructor; var S; return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S); }; /***/ }), /***/ "./node_modules/core-js/internals/string-multibyte.js": /*!************************************************************!*\ !*** ./node_modules/core-js/internals/string-multibyte.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "./node_modules/core-js/internals/to-integer-or-infinity.js"); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); var charAt = uncurryThis(''.charAt); var charCodeAt = uncurryThis(''.charCodeAt); var stringSlice = uncurryThis(''.slice); var createMethod = function (CONVERT_TO_STRING) { return function ($this, pos) { var S = toString(requireObjectCoercible($this)); var position = toIntegerOrInfinity(pos); var size = S.length; var first, second; if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; first = charCodeAt(S, position); return first < 0xD800 || first > 0xDBFF || position + 1 === size || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF ? CONVERT_TO_STRING ? charAt(S, position) : first : CONVERT_TO_STRING ? stringSlice(S, position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; }; }; module.exports = { // `String.prototype.codePointAt` method // https://tc39.es/ecma262/#sec-string.prototype.codepointat codeAt: createMethod(false), // `String.prototype.at` method // https://github.com/mathiasbynens/String.prototype.at charAt: createMethod(true) }; /***/ }), /***/ "./node_modules/core-js/internals/symbol-define-to-primitive.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/internals/symbol-define-to-primitive.js ***! \**********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); module.exports = function () { var Symbol = getBuiltIn('Symbol'); var SymbolPrototype = Symbol && Symbol.prototype; var valueOf = SymbolPrototype && SymbolPrototype.valueOf; var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); if (SymbolPrototype && !SymbolPrototype[TO_PRIMITIVE]) { // `Symbol.prototype[@@toPrimitive]` method // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive // eslint-disable-next-line no-unused-vars -- required for .length defineBuiltIn(SymbolPrototype, TO_PRIMITIVE, function (hint) { return call(valueOf, this); }, { arity: 1 }); } }; /***/ }), /***/ "./node_modules/core-js/internals/to-absolute-index.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/to-absolute-index.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "./node_modules/core-js/internals/to-integer-or-infinity.js"); var max = Math.max; var min = Math.min; // Helper for a popular repeating case of the spec: // Let integer be ? ToInteger(index). // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). module.exports = function (index, length) { var integer = toIntegerOrInfinity(index); return integer < 0 ? max(integer + length, 0) : min(integer, length); }; /***/ }), /***/ "./node_modules/core-js/internals/to-indexed-object.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/to-indexed-object.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // toObject with fallback for non-array-like ES3 strings var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); module.exports = function (it) { return IndexedObject(requireObjectCoercible(it)); }; /***/ }), /***/ "./node_modules/core-js/internals/to-integer-or-infinity.js": /*!******************************************************************!*\ !*** ./node_modules/core-js/internals/to-integer-or-infinity.js ***! \******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var trunc = __webpack_require__(/*! ../internals/math-trunc */ "./node_modules/core-js/internals/math-trunc.js"); // `ToIntegerOrInfinity` abstract operation // https://tc39.es/ecma262/#sec-tointegerorinfinity module.exports = function (argument) { var number = +argument; // eslint-disable-next-line no-self-compare -- NaN check return number !== number || number === 0 ? 0 : trunc(number); }; /***/ }), /***/ "./node_modules/core-js/internals/to-length.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/to-length.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "./node_modules/core-js/internals/to-integer-or-infinity.js"); var min = Math.min; // `ToLength` abstract operation // https://tc39.es/ecma262/#sec-tolength module.exports = function (argument) { return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 }; /***/ }), /***/ "./node_modules/core-js/internals/to-object.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/to-object.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); var $Object = Object; // `ToObject` abstract operation // https://tc39.es/ecma262/#sec-toobject module.exports = function (argument) { return $Object(requireObjectCoercible(argument)); }; /***/ }), /***/ "./node_modules/core-js/internals/to-primitive.js": /*!********************************************************!*\ !*** ./node_modules/core-js/internals/to-primitive.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js"); var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "./node_modules/core-js/internals/ordinary-to-primitive.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var $TypeError = TypeError; var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); // `ToPrimitive` abstract operation // https://tc39.es/ecma262/#sec-toprimitive module.exports = function (input, pref) { if (!isObject(input) || isSymbol(input)) return input; var exoticToPrim = getMethod(input, TO_PRIMITIVE); var result; if (exoticToPrim) { if (pref === undefined) pref = 'default'; result = call(exoticToPrim, input, pref); if (!isObject(result) || isSymbol(result)) return result; throw $TypeError("Can't convert object to primitive value"); } if (pref === undefined) pref = 'number'; return ordinaryToPrimitive(input, pref); }; /***/ }), /***/ "./node_modules/core-js/internals/to-property-key.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/internals/to-property-key.js ***! \***********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); // `ToPropertyKey` abstract operation // https://tc39.es/ecma262/#sec-topropertykey module.exports = function (argument) { var key = toPrimitive(argument, 'string'); return isSymbol(key) ? key : key + ''; }; /***/ }), /***/ "./node_modules/core-js/internals/to-string-tag-support.js": /*!*****************************************************************!*\ !*** ./node_modules/core-js/internals/to-string-tag-support.js ***! \*****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var test = {}; test[TO_STRING_TAG] = 'z'; module.exports = String(test) === '[object z]'; /***/ }), /***/ "./node_modules/core-js/internals/to-string.js": /*!*****************************************************!*\ !*** ./node_modules/core-js/internals/to-string.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); var $String = String; module.exports = function (argument) { if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); return $String(argument); }; /***/ }), /***/ "./node_modules/core-js/internals/try-to-string.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/internals/try-to-string.js ***! \*********************************************************/ /***/ ((module) => { var $String = String; module.exports = function (argument) { try { return $String(argument); } catch (error) { return 'Object'; } }; /***/ }), /***/ "./node_modules/core-js/internals/uid.js": /*!***********************************************!*\ !*** ./node_modules/core-js/internals/uid.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var id = 0; var postfix = Math.random(); var toString = uncurryThis(1.0.toString); module.exports = function (key) { return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); }; /***/ }), /***/ "./node_modules/core-js/internals/use-symbol-as-uid.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/use-symbol-as-uid.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* eslint-disable es-x/no-symbol -- required for testing */ var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); module.exports = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == 'symbol'; /***/ }), /***/ "./node_modules/core-js/internals/v8-prototype-define-bug.js": /*!*******************************************************************!*\ !*** ./node_modules/core-js/internals/v8-prototype-define-bug.js ***! \*******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); // V8 ~ Chrome 36- // https://bugs.chromium.org/p/v8/issues/detail?id=3334 module.exports = DESCRIPTORS && fails(function () { // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing return Object.defineProperty(function () { /* empty */ }, 'prototype', { value: 42, writable: false }).prototype != 42; }); /***/ }), /***/ "./node_modules/core-js/internals/well-known-symbol-wrapped.js": /*!*********************************************************************!*\ !*** ./node_modules/core-js/internals/well-known-symbol-wrapped.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); exports.f = wellKnownSymbol; /***/ }), /***/ "./node_modules/core-js/internals/well-known-symbol.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/internals/well-known-symbol.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js"); var WellKnownSymbolsStore = shared('wks'); var Symbol = global.Symbol; var symbolFor = Symbol && Symbol['for']; var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; module.exports = function (name) { if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { var description = 'Symbol.' + name; if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { WellKnownSymbolsStore[name] = Symbol[name]; } else if (USE_SYMBOL_AS_UID && symbolFor) { WellKnownSymbolsStore[name] = symbolFor(description); } else { WellKnownSymbolsStore[name] = createWellKnownSymbol(description); } } return WellKnownSymbolsStore[name]; }; /***/ }), /***/ "./node_modules/core-js/modules/es.array.concat.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.concat.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "./node_modules/core-js/internals/length-of-array-like.js"); var doesNotExceedSafeInteger = __webpack_require__(/*! ../internals/does-not-exceed-safe-integer */ "./node_modules/core-js/internals/does-not-exceed-safe-integer.js"); var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js"); var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js"); var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js"); var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); // We can't use this feature detection in V8 since it causes // deoptimization and serious performance degradation // https://github.com/zloirock/core-js/issues/679 var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () { var array = []; array[IS_CONCAT_SPREADABLE] = false; return array.concat()[0] !== array; }); var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat'); var isConcatSpreadable = function (O) { if (!isObject(O)) return false; var spreadable = O[IS_CONCAT_SPREADABLE]; return spreadable !== undefined ? !!spreadable : isArray(O); }; var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; // `Array.prototype.concat` method // https://tc39.es/ecma262/#sec-array.prototype.concat // with adding support of @@isConcatSpreadable and @@species $({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { // eslint-disable-next-line no-unused-vars -- required for `.length` concat: function concat(arg) { var O = toObject(this); var A = arraySpeciesCreate(O, 0); var n = 0; var i, k, length, len, E; for (i = -1, length = arguments.length; i < length; i++) { E = i === -1 ? O : arguments[i]; if (isConcatSpreadable(E)) { len = lengthOfArrayLike(E); doesNotExceedSafeInteger(n + len); for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]); } else { doesNotExceedSafeInteger(n + 1); createProperty(A, n++, E); } } A.length = n; return A; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.array.find.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es.array.find.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var $find = (__webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").find); var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js"); var FIND = 'find'; var SKIPS_HOLES = true; // Shouldn't skip holes if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); // `Array.prototype.find` method // https://tc39.es/ecma262/#sec-array.prototype.find $({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { find: function find(callbackfn /* , that = undefined */) { return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); } }); // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables addToUnscopables(FIND); /***/ }), /***/ "./node_modules/core-js/modules/es.array.for-each.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.for-each.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var forEach = __webpack_require__(/*! ../internals/array-for-each */ "./node_modules/core-js/internals/array-for-each.js"); // `Array.prototype.forEach` method // https://tc39.es/ecma262/#sec-array.prototype.foreach // eslint-disable-next-line es-x/no-array-prototype-foreach -- safe $({ target: 'Array', proto: true, forced: [].forEach != forEach }, { forEach: forEach }); /***/ }), /***/ "./node_modules/core-js/modules/es.array.includes.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.includes.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var $includes = (__webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").includes); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js"); // FF99+ bug var BROKEN_ON_SPARSE = fails(function () { return !Array(1).includes(); }); // `Array.prototype.includes` method // https://tc39.es/ecma262/#sec-array.prototype.includes $({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, { includes: function includes(el /* , fromIndex = 0 */) { return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); } }); // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables addToUnscopables('includes'); /***/ }), /***/ "./node_modules/core-js/modules/es.array.iterator.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.iterator.js ***! \***********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var ARRAY_ITERATOR = 'Array Iterator'; var setInternalState = InternalStateModule.set; var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); // `Array.prototype.entries` method // https://tc39.es/ecma262/#sec-array.prototype.entries // `Array.prototype.keys` method // https://tc39.es/ecma262/#sec-array.prototype.keys // `Array.prototype.values` method // https://tc39.es/ecma262/#sec-array.prototype.values // `Array.prototype[@@iterator]` method // https://tc39.es/ecma262/#sec-array.prototype-@@iterator // `CreateArrayIterator` internal method // https://tc39.es/ecma262/#sec-createarrayiterator module.exports = defineIterator(Array, 'Array', function (iterated, kind) { setInternalState(this, { type: ARRAY_ITERATOR, target: toIndexedObject(iterated), // target index: 0, // next index kind: kind // kind }); // `%ArrayIteratorPrototype%.next` method // https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next }, function () { var state = getInternalState(this); var target = state.target; var kind = state.kind; var index = state.index++; if (!target || index >= target.length) { state.target = undefined; return { value: undefined, done: true }; } if (kind == 'keys') return { value: index, done: false }; if (kind == 'values') return { value: target[index], done: false }; return { value: [index, target[index]], done: false }; }, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% // https://tc39.es/ecma262/#sec-createunmappedargumentsobject // https://tc39.es/ecma262/#sec-createmappedargumentsobject var values = Iterators.Arguments = Iterators.Array; // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables addToUnscopables('keys'); addToUnscopables('values'); addToUnscopables('entries'); // V8 ~ Chrome 45- bug if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try { defineProperty(values, 'name', { value: 'values' }); } catch (error) { /* empty */ } /***/ }), /***/ "./node_modules/core-js/modules/es.array.slice.js": /*!********************************************************!*\ !*** ./node_modules/core-js/modules/es.array.slice.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js"); var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "./node_modules/core-js/internals/length-of-array-like.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js"); var un$Slice = __webpack_require__(/*! ../internals/array-slice */ "./node_modules/core-js/internals/array-slice.js"); var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice'); var SPECIES = wellKnownSymbol('species'); var $Array = Array; var max = Math.max; // `Array.prototype.slice` method // https://tc39.es/ecma262/#sec-array.prototype.slice // fallback for not array-like ES3 strings and DOM objects $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, { slice: function slice(start, end) { var O = toIndexedObject(this); var length = lengthOfArrayLike(O); var k = toAbsoluteIndex(start, length); var fin = toAbsoluteIndex(end === undefined ? length : end, length); // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible var Constructor, result, n; if (isArray(O)) { Constructor = O.constructor; // cross-realm fallback if (isConstructor(Constructor) && (Constructor === $Array || isArray(Constructor.prototype))) { Constructor = undefined; } else if (isObject(Constructor)) { Constructor = Constructor[SPECIES]; if (Constructor === null) Constructor = undefined; } if (Constructor === $Array || Constructor === undefined) { return un$Slice(O, k, fin); } } result = new (Constructor === undefined ? $Array : Constructor)(max(fin - k, 0)); for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]); result.length = n; return result; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.date.to-string.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.date.to-string.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { // TODO: Remove from `core-js@4` var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var DatePrototype = Date.prototype; var INVALID_DATE = 'Invalid Date'; var TO_STRING = 'toString'; var un$DateToString = uncurryThis(DatePrototype[TO_STRING]); var getTime = uncurryThis(DatePrototype.getTime); // `Date.prototype.toString` method // https://tc39.es/ecma262/#sec-date.prototype.tostring if (String(new Date(NaN)) != INVALID_DATE) { defineBuiltIn(DatePrototype, TO_STRING, function toString() { var value = getTime(this); // eslint-disable-next-line no-self-compare -- NaN check return value === value ? un$DateToString(this) : INVALID_DATE; }); } /***/ }), /***/ "./node_modules/core-js/modules/es.function.name.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es.function.name.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var FUNCTION_NAME_EXISTS = (__webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").EXISTS); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); var FunctionPrototype = Function.prototype; var functionToString = uncurryThis(FunctionPrototype.toString); var nameRE = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/; var regExpExec = uncurryThis(nameRE.exec); var NAME = 'name'; // Function instances `.name` property // https://tc39.es/ecma262/#sec-function-instances-name if (DESCRIPTORS && !FUNCTION_NAME_EXISTS) { defineProperty(FunctionPrototype, NAME, { configurable: true, get: function () { try { return regExpExec(nameRE, functionToString(this))[1]; } catch (error) { return ''; } } }); } /***/ }), /***/ "./node_modules/core-js/modules/es.json.stringify.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.json.stringify.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js/internals/function-apply.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "./node_modules/core-js/internals/array-slice.js"); var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); var $stringify = getBuiltIn('JSON', 'stringify'); var exec = uncurryThis(/./.exec); var charAt = uncurryThis(''.charAt); var charCodeAt = uncurryThis(''.charCodeAt); var replace = uncurryThis(''.replace); var numberToString = uncurryThis(1.0.toString); var tester = /[\uD800-\uDFFF]/g; var low = /^[\uD800-\uDBFF]$/; var hi = /^[\uDC00-\uDFFF]$/; var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () { var symbol = getBuiltIn('Symbol')(); // MS Edge converts symbol values to JSON as {} return $stringify([symbol]) != '[null]' // WebKit converts symbol values to JSON as null || $stringify({ a: symbol }) != '{}' // V8 throws on boxed symbols || $stringify(Object(symbol)) != '{}'; }); // https://github.com/tc39/proposal-well-formed-stringify var ILL_FORMED_UNICODE = fails(function () { return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"' || $stringify('\uDEAD') !== '"\\udead"'; }); var stringifyWithSymbolsFix = function (it, replacer) { var args = arraySlice(arguments); var $replacer = replacer; if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined if (!isArray(replacer)) replacer = function (key, value) { if (isCallable($replacer)) value = call($replacer, this, key, value); if (!isSymbol(value)) return value; }; args[1] = replacer; return apply($stringify, null, args); }; var fixIllFormed = function (match, offset, string) { var prev = charAt(string, offset - 1); var next = charAt(string, offset + 1); if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) { return '\\u' + numberToString(charCodeAt(match, 0), 16); } return match; }; if ($stringify) { // `JSON.stringify` method // https://tc39.es/ecma262/#sec-json.stringify $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, { // eslint-disable-next-line no-unused-vars -- required for `.length` stringify: function stringify(it, replacer, space) { var args = arraySlice(arguments); var result = apply(WRONG_SYMBOLS_CONVERSION ? stringifyWithSymbolsFix : $stringify, null, args); return ILL_FORMED_UNICODE && typeof result == 'string' ? replace(result, tester, fixIllFormed) : result; } }); } /***/ }), /***/ "./node_modules/core-js/modules/es.object.assign.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es.object.assign.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var assign = __webpack_require__(/*! ../internals/object-assign */ "./node_modules/core-js/internals/object-assign.js"); // `Object.assign` method // https://tc39.es/ecma262/#sec-object.assign // eslint-disable-next-line es-x/no-object-assign -- required for testing $({ target: 'Object', stat: true, arity: 2, forced: Object.assign !== assign }, { assign: assign }); /***/ }), /***/ "./node_modules/core-js/modules/es.object.freeze.js": /*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es.object.freeze.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); var onFreeze = (__webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js").onFreeze); // eslint-disable-next-line es-x/no-object-freeze -- safe var $freeze = Object.freeze; var FAILS_ON_PRIMITIVES = fails(function () { $freeze(1); }); // `Object.freeze` method // https://tc39.es/ecma262/#sec-object.freeze $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, { freeze: function freeze(it) { return $freeze && isObject(it) ? $freeze(onFreeze(it)) : it; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.object.get-own-property-symbols.js": /*!****************************************************************************!*\ !*** ./node_modules/core-js/modules/es.object.get-own-property-symbols.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); // V8 ~ Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives // https://bugs.chromium.org/p/v8/issues/detail?id=3443 var FORCED = !NATIVE_SYMBOL || fails(function () { getOwnPropertySymbolsModule.f(1); }); // `Object.getOwnPropertySymbols` method // https://tc39.es/ecma262/#sec-object.getownpropertysymbols $({ target: 'Object', stat: true, forced: FORCED }, { getOwnPropertySymbols: function getOwnPropertySymbols(it) { var $getOwnPropertySymbols = getOwnPropertySymbolsModule.f; return $getOwnPropertySymbols ? $getOwnPropertySymbols(toObject(it)) : []; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.object.keys.js": /*!********************************************************!*\ !*** ./node_modules/core-js/modules/es.object.keys.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); var nativeKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); }); // `Object.keys` method // https://tc39.es/ecma262/#sec-object.keys $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { keys: function keys(it) { return nativeKeys(toObject(it)); } }); /***/ }), /***/ "./node_modules/core-js/modules/es.object.to-string.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es.object.to-string.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var toString = __webpack_require__(/*! ../internals/object-to-string */ "./node_modules/core-js/internals/object-to-string.js"); // `Object.prototype.toString` method // https://tc39.es/ecma262/#sec-object.prototype.tostring if (!TO_STRING_TAG_SUPPORT) { defineBuiltIn(Object.prototype, 'toString', toString, { unsafe: true }); } /***/ }), /***/ "./node_modules/core-js/modules/es.regexp.exec.js": /*!********************************************************!*\ !*** ./node_modules/core-js/modules/es.regexp.exec.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var exec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js"); // `RegExp.prototype.exec` method // https://tc39.es/ecma262/#sec-regexp.prototype.exec $({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, { exec: exec }); /***/ }), /***/ "./node_modules/core-js/modules/es.regexp.to-string.js": /*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es.regexp.to-string.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var PROPER_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").PROPER); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var $toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var getRegExpFlags = __webpack_require__(/*! ../internals/regexp-get-flags */ "./node_modules/core-js/internals/regexp-get-flags.js"); var TO_STRING = 'toString'; var RegExpPrototype = RegExp.prototype; var n$ToString = RegExpPrototype[TO_STRING]; var NOT_GENERIC = fails(function () { return n$ToString.call({ source: 'a', flags: 'b' }) != '/a/b'; }); // FF44- RegExp#toString has a wrong name var INCORRECT_NAME = PROPER_FUNCTION_NAME && n$ToString.name != TO_STRING; // `RegExp.prototype.toString` method // https://tc39.es/ecma262/#sec-regexp.prototype.tostring if (NOT_GENERIC || INCORRECT_NAME) { defineBuiltIn(RegExp.prototype, TO_STRING, function toString() { var R = anObject(this); var pattern = $toString(R.source); var flags = $toString(getRegExpFlags(R)); return '/' + pattern + '/' + flags; }, { unsafe: true }); } /***/ }), /***/ "./node_modules/core-js/modules/es.string.iterator.js": /*!************************************************************!*\ !*** ./node_modules/core-js/modules/es.string.iterator.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var charAt = (__webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js"); var STRING_ITERATOR = 'String Iterator'; var setInternalState = InternalStateModule.set; var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); // `String.prototype[@@iterator]` method // https://tc39.es/ecma262/#sec-string.prototype-@@iterator defineIterator(String, 'String', function (iterated) { setInternalState(this, { type: STRING_ITERATOR, string: toString(iterated), index: 0 }); // `%StringIteratorPrototype%.next` method // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next }, function next() { var state = getInternalState(this); var string = state.string; var index = state.index; var point; if (index >= string.length) return { value: undefined, done: true }; point = charAt(string, index); state.index += point.length; return { value: point, done: false }; }); /***/ }), /***/ "./node_modules/core-js/modules/es.string.replace.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.string.replace.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js/internals/function-apply.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "./node_modules/core-js/internals/to-integer-or-infinity.js"); var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js"); var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js"); var getSubstitution = __webpack_require__(/*! ../internals/get-substitution */ "./node_modules/core-js/internals/get-substitution.js"); var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var REPLACE = wellKnownSymbol('replace'); var max = Math.max; var min = Math.min; var concat = uncurryThis([].concat); var push = uncurryThis([].push); var stringIndexOf = uncurryThis(''.indexOf); var stringSlice = uncurryThis(''.slice); var maybeToString = function (it) { return it === undefined ? it : String(it); }; // IE <= 11 replaces $0 with the whole match, as if it was $& // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0 var REPLACE_KEEPS_$0 = (function () { // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing return 'a'.replace(/./, '$0') === '$0'; })(); // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () { if (/./[REPLACE]) { return /./[REPLACE]('a', '$0') === ''; } return false; })(); var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { var re = /./; re.exec = function () { var result = []; result.groups = { a: '7' }; return result; }; // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive return ''.replace(re, '$') !== '7'; }); // @@replace logic fixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) { var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0'; return [ // `String.prototype.replace` method // https://tc39.es/ecma262/#sec-string.prototype.replace function replace(searchValue, replaceValue) { var O = requireObjectCoercible(this); var replacer = searchValue == undefined ? undefined : getMethod(searchValue, REPLACE); return replacer ? call(replacer, searchValue, O, replaceValue) : call(nativeReplace, toString(O), searchValue, replaceValue); }, // `RegExp.prototype[@@replace]` method // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace function (string, replaceValue) { var rx = anObject(this); var S = toString(string); if ( typeof replaceValue == 'string' && stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 && stringIndexOf(replaceValue, '$<') === -1 ) { var res = maybeCallNative(nativeReplace, rx, S, replaceValue); if (res.done) return res.value; } var functionalReplace = isCallable(replaceValue); if (!functionalReplace) replaceValue = toString(replaceValue); var global = rx.global; if (global) { var fullUnicode = rx.unicode; rx.lastIndex = 0; } var results = []; while (true) { var result = regExpExec(rx, S); if (result === null) break; push(results, result); if (!global) break; var matchStr = toString(result[0]); if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); } var accumulatedResult = ''; var nextSourcePosition = 0; for (var i = 0; i < results.length; i++) { result = results[i]; var matched = toString(result[0]); var position = max(min(toIntegerOrInfinity(result.index), S.length), 0); var captures = []; // NOTE: This is equivalent to // captures = result.slice(1).map(maybeToString) // but for some reason `nativeSlice.call(result, 1, result.length)` (called in // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j])); var namedCaptures = result.groups; if (functionalReplace) { var replacerArgs = concat([matched], captures, position, S); if (namedCaptures !== undefined) push(replacerArgs, namedCaptures); var replacement = toString(apply(replaceValue, undefined, replacerArgs)); } else { replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); } if (position >= nextSourcePosition) { accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement; nextSourcePosition = position + matched.length; } } return accumulatedResult + stringSlice(S, nextSourcePosition); } ]; }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE); /***/ }), /***/ "./node_modules/core-js/modules/es.string.split.js": /*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es.string.split.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js/internals/function-apply.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js"); var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/core-js/internals/is-regexp.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js"); var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js"); var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js"); var arraySlice = __webpack_require__(/*! ../internals/array-slice-simple */ "./node_modules/core-js/internals/array-slice-simple.js"); var callRegExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js"); var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js"); var stickyHelpers = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ "./node_modules/core-js/internals/regexp-sticky-helpers.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y; var MAX_UINT32 = 0xFFFFFFFF; var min = Math.min; var $push = [].push; var exec = uncurryThis(/./.exec); var push = uncurryThis($push); var stringSlice = uncurryThis(''.slice); // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec // Weex JS has frozen built-in prototypes, so use try / catch wrapper var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () { // eslint-disable-next-line regexp/no-empty-group -- required for testing var re = /(?:)/; var originalExec = re.exec; re.exec = function () { return originalExec.apply(this, arguments); }; var result = 'ab'.split(re); return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b'; }); // @@split logic fixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) { var internalSplit; if ( 'abbc'.split(/(b)*/)[1] == 'c' || // eslint-disable-next-line regexp/no-empty-group -- required for testing 'test'.split(/(?:)/, -1).length != 4 || 'ab'.split(/(?:ab)*/).length != 2 || '.'.split(/(.?)(.?)/).length != 4 || // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing '.'.split(/()()/).length > 1 || ''.split(/.?/).length ) { // based on es5-shim implementation, need to rework it internalSplit = function (separator, limit) { var string = toString(requireObjectCoercible(this)); var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; if (lim === 0) return []; if (separator === undefined) return [string]; // If `separator` is not a regex, use native split if (!isRegExp(separator)) { return call(nativeSplit, string, separator, lim); } var output = []; var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : ''); var lastLastIndex = 0; // Make `global` and avoid `lastIndex` issues by working with a copy var separatorCopy = new RegExp(separator.source, flags + 'g'); var match, lastIndex, lastLength; while (match = call(regexpExec, separatorCopy, string)) { lastIndex = separatorCopy.lastIndex; if (lastIndex > lastLastIndex) { push(output, stringSlice(string, lastLastIndex, match.index)); if (match.length > 1 && match.index < string.length) apply($push, output, arraySlice(match, 1)); lastLength = match[0].length; lastLastIndex = lastIndex; if (output.length >= lim) break; } if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop } if (lastLastIndex === string.length) { if (lastLength || !exec(separatorCopy, '')) push(output, ''); } else push(output, stringSlice(string, lastLastIndex)); return output.length > lim ? arraySlice(output, 0, lim) : output; }; // Chakra, V8 } else if ('0'.split(undefined, 0).length) { internalSplit = function (separator, limit) { return separator === undefined && limit === 0 ? [] : call(nativeSplit, this, separator, limit); }; } else internalSplit = nativeSplit; return [ // `String.prototype.split` method // https://tc39.es/ecma262/#sec-string.prototype.split function split(separator, limit) { var O = requireObjectCoercible(this); var splitter = separator == undefined ? undefined : getMethod(separator, SPLIT); return splitter ? call(splitter, separator, O, limit) : call(internalSplit, toString(O), separator, limit); }, // `RegExp.prototype[@@split]` method // https://tc39.es/ecma262/#sec-regexp.prototype-@@split // // NOTE: This cannot be properly polyfilled in engines that don't support // the 'y' flag. function (string, limit) { var rx = anObject(this); var S = toString(string); var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit); if (res.done) return res.value; var C = speciesConstructor(rx, RegExp); var unicodeMatching = rx.unicode; var flags = (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '') + (rx.unicode ? 'u' : '') + (UNSUPPORTED_Y ? 'g' : 'y'); // ^(? + rx + ) is needed, in combination with some S slicing, to // simulate the 'y' flag. var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags); var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; if (lim === 0) return []; if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; var p = 0; var q = 0; var A = []; while (q < S.length) { splitter.lastIndex = UNSUPPORTED_Y ? 0 : q; var z = callRegExpExec(splitter, UNSUPPORTED_Y ? stringSlice(S, q) : S); var e; if ( z === null || (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p ) { q = advanceStringIndex(S, q, unicodeMatching); } else { push(A, stringSlice(S, p, q)); if (A.length === lim) return A; for (var i = 1; i <= z.length - 1; i++) { push(A, z[i]); if (A.length === lim) return A; } q = p = e; } } push(A, stringSlice(S, p)); return A; } ]; }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y); /***/ }), /***/ "./node_modules/core-js/modules/es.symbol.constructor.js": /*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es.symbol.constructor.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js"); var $toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); var nativeObjectCreate = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js"); var getOwnPropertyNamesExternal = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/core-js/internals/object-get-own-property-names-external.js"); var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js"); var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); var definePropertiesModule = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js"); var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js"); var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js"); var defineSymbolToPrimitive = __webpack_require__(/*! ../internals/symbol-define-to-primitive */ "./node_modules/core-js/internals/symbol-define-to-primitive.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); var $forEach = (__webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach); var HIDDEN = sharedKey('hidden'); var SYMBOL = 'Symbol'; var PROTOTYPE = 'prototype'; var setInternalState = InternalStateModule.set; var getInternalState = InternalStateModule.getterFor(SYMBOL); var ObjectPrototype = Object[PROTOTYPE]; var $Symbol = global.Symbol; var SymbolPrototype = $Symbol && $Symbol[PROTOTYPE]; var TypeError = global.TypeError; var QObject = global.QObject; var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; var nativeDefineProperty = definePropertyModule.f; var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; var nativePropertyIsEnumerable = propertyIsEnumerableModule.f; var push = uncurryThis([].push); var AllSymbols = shared('symbols'); var ObjectPrototypeSymbols = shared('op-symbols'); var WellKnownSymbolsStore = shared('wks'); // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 var setSymbolDescriptor = DESCRIPTORS && fails(function () { return nativeObjectCreate(nativeDefineProperty({}, 'a', { get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; } })).a != 7; }) ? function (O, P, Attributes) { var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P); if (ObjectPrototypeDescriptor) delete ObjectPrototype[P]; nativeDefineProperty(O, P, Attributes); if (ObjectPrototypeDescriptor && O !== ObjectPrototype) { nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor); } } : nativeDefineProperty; var wrap = function (tag, description) { var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype); setInternalState(symbol, { type: SYMBOL, tag: tag, description: description }); if (!DESCRIPTORS) symbol.description = description; return symbol; }; var $defineProperty = function defineProperty(O, P, Attributes) { if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes); anObject(O); var key = toPropertyKey(P); anObject(Attributes); if (hasOwn(AllSymbols, key)) { if (!Attributes.enumerable) { if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {})); O[HIDDEN][key] = true; } else { if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) }); } return setSymbolDescriptor(O, key, Attributes); } return nativeDefineProperty(O, key, Attributes); }; var $defineProperties = function defineProperties(O, Properties) { anObject(O); var properties = toIndexedObject(Properties); var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties)); $forEach(keys, function (key) { if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]); }); return O; }; var $create = function create(O, Properties) { return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties); }; var $propertyIsEnumerable = function propertyIsEnumerable(V) { var P = toPropertyKey(V); var enumerable = call(nativePropertyIsEnumerable, this, P); if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false; return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true; }; var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { var it = toIndexedObject(O); var key = toPropertyKey(P); if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return; var descriptor = nativeGetOwnPropertyDescriptor(it, key); if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) { descriptor.enumerable = true; } return descriptor; }; var $getOwnPropertyNames = function getOwnPropertyNames(O) { var names = nativeGetOwnPropertyNames(toIndexedObject(O)); var result = []; $forEach(names, function (key) { if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key); }); return result; }; var $getOwnPropertySymbols = function (O) { var IS_OBJECT_PROTOTYPE = O === ObjectPrototype; var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O)); var result = []; $forEach(names, function (key) { if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) { push(result, AllSymbols[key]); } }); return result; }; // `Symbol` constructor // https://tc39.es/ecma262/#sec-symbol-constructor if (!NATIVE_SYMBOL) { $Symbol = function Symbol() { if (isPrototypeOf(SymbolPrototype, this)) throw TypeError('Symbol is not a constructor'); var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); var tag = uid(description); var setter = function (value) { if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false; setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value)); }; if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); return wrap(tag, description); }; SymbolPrototype = $Symbol[PROTOTYPE]; defineBuiltIn(SymbolPrototype, 'toString', function toString() { return getInternalState(this).tag; }); defineBuiltIn($Symbol, 'withoutSetter', function (description) { return wrap(uid(description), description); }); propertyIsEnumerableModule.f = $propertyIsEnumerable; definePropertyModule.f = $defineProperty; definePropertiesModule.f = $defineProperties; getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor; getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames; getOwnPropertySymbolsModule.f = $getOwnPropertySymbols; wrappedWellKnownSymbolModule.f = function (name) { return wrap(wellKnownSymbol(name), name); }; if (DESCRIPTORS) { // https://github.com/tc39/proposal-Symbol-description nativeDefineProperty(SymbolPrototype, 'description', { configurable: true, get: function description() { return getInternalState(this).description; } }); if (!IS_PURE) { defineBuiltIn(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true }); } } } $({ global: true, constructor: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, { Symbol: $Symbol }); $forEach(objectKeys(WellKnownSymbolsStore), function (name) { defineWellKnownSymbol(name); }); $({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, { useSetter: function () { USE_SETTER = true; }, useSimple: function () { USE_SETTER = false; } }); $({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, { // `Object.create` method // https://tc39.es/ecma262/#sec-object.create create: $create, // `Object.defineProperty` method // https://tc39.es/ecma262/#sec-object.defineproperty defineProperty: $defineProperty, // `Object.defineProperties` method // https://tc39.es/ecma262/#sec-object.defineproperties defineProperties: $defineProperties, // `Object.getOwnPropertyDescriptor` method // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors getOwnPropertyDescriptor: $getOwnPropertyDescriptor }); $({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, { // `Object.getOwnPropertyNames` method // https://tc39.es/ecma262/#sec-object.getownpropertynames getOwnPropertyNames: $getOwnPropertyNames }); // `Symbol.prototype[@@toPrimitive]` method // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive defineSymbolToPrimitive(); // `Symbol.prototype[@@toStringTag]` property // https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag setToStringTag($Symbol, SYMBOL); hiddenKeys[HIDDEN] = true; /***/ }), /***/ "./node_modules/core-js/modules/es.symbol.description.js": /*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es.symbol.description.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // `Symbol.prototype.description` getter // https://tc39.es/ecma262/#sec-symbol.prototype.description var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js"); var NativeSymbol = global.Symbol; var SymbolPrototype = NativeSymbol && NativeSymbol.prototype; if (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) || // Safari 12 bug NativeSymbol().description !== undefined )) { var EmptyStringDescriptionStore = {}; // wrap Symbol constructor for correct work with undefined description var SymbolWrapper = function Symbol() { var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]); var result = isPrototypeOf(SymbolPrototype, this) ? new NativeSymbol(description) // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)' : description === undefined ? NativeSymbol() : NativeSymbol(description); if (description === '') EmptyStringDescriptionStore[result] = true; return result; }; copyConstructorProperties(SymbolWrapper, NativeSymbol); SymbolWrapper.prototype = SymbolPrototype; SymbolPrototype.constructor = SymbolWrapper; var NATIVE_SYMBOL = String(NativeSymbol('test')) == 'Symbol(test)'; var symbolToString = uncurryThis(SymbolPrototype.toString); var symbolValueOf = uncurryThis(SymbolPrototype.valueOf); var regexp = /^Symbol\((.*)\)[^)]+$/; var replace = uncurryThis(''.replace); var stringSlice = uncurryThis(''.slice); defineProperty(SymbolPrototype, 'description', { configurable: true, get: function description() { var symbol = symbolValueOf(this); var string = symbolToString(symbol); if (hasOwn(EmptyStringDescriptionStore, symbol)) return ''; var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1'); return desc === '' ? undefined : desc; } }); $({ global: true, constructor: true, forced: true }, { Symbol: SymbolWrapper }); } /***/ }), /***/ "./node_modules/core-js/modules/es.symbol.for.js": /*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es.symbol.for.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var NATIVE_SYMBOL_REGISTRY = __webpack_require__(/*! ../internals/native-symbol-registry */ "./node_modules/core-js/internals/native-symbol-registry.js"); var StringToSymbolRegistry = shared('string-to-symbol-registry'); var SymbolToStringRegistry = shared('symbol-to-string-registry'); // `Symbol.for` method // https://tc39.es/ecma262/#sec-symbol.for $({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, { 'for': function (key) { var string = toString(key); if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; var symbol = getBuiltIn('Symbol')(string); StringToSymbolRegistry[string] = symbol; SymbolToStringRegistry[symbol] = string; return symbol; } }); /***/ }), /***/ "./node_modules/core-js/modules/es.symbol.iterator.js": /*!************************************************************!*\ !*** ./node_modules/core-js/modules/es.symbol.iterator.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js"); // `Symbol.iterator` well-known symbol // https://tc39.es/ecma262/#sec-symbol.iterator defineWellKnownSymbol('iterator'); /***/ }), /***/ "./node_modules/core-js/modules/es.symbol.js": /*!***************************************************!*\ !*** ./node_modules/core-js/modules/es.symbol.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { // TODO: Remove this module from `core-js@4` since it's split to modules listed below __webpack_require__(/*! ../modules/es.symbol.constructor */ "./node_modules/core-js/modules/es.symbol.constructor.js"); __webpack_require__(/*! ../modules/es.symbol.for */ "./node_modules/core-js/modules/es.symbol.for.js"); __webpack_require__(/*! ../modules/es.symbol.key-for */ "./node_modules/core-js/modules/es.symbol.key-for.js"); __webpack_require__(/*! ../modules/es.json.stringify */ "./node_modules/core-js/modules/es.json.stringify.js"); __webpack_require__(/*! ../modules/es.object.get-own-property-symbols */ "./node_modules/core-js/modules/es.object.get-own-property-symbols.js"); /***/ }), /***/ "./node_modules/core-js/modules/es.symbol.key-for.js": /*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es.symbol.key-for.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js"); var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); var NATIVE_SYMBOL_REGISTRY = __webpack_require__(/*! ../internals/native-symbol-registry */ "./node_modules/core-js/internals/native-symbol-registry.js"); var SymbolToStringRegistry = shared('symbol-to-string-registry'); // `Symbol.keyFor` method // https://tc39.es/ecma262/#sec-symbol.keyfor $({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, { keyFor: function keyFor(sym) { if (!isSymbol(sym)) throw TypeError(tryToString(sym) + ' is not a symbol'); if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; } }); /***/ }), /***/ "./node_modules/core-js/modules/web.dom-collections.for-each.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/modules/web.dom-collections.for-each.js ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js"); var DOMTokenListPrototype = __webpack_require__(/*! ../internals/dom-token-list-prototype */ "./node_modules/core-js/internals/dom-token-list-prototype.js"); var forEach = __webpack_require__(/*! ../internals/array-for-each */ "./node_modules/core-js/internals/array-for-each.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var handlePrototype = function (CollectionPrototype) { // some Chrome versions have non-configurable methods on DOMTokenList if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try { createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach); } catch (error) { CollectionPrototype.forEach = forEach; } }; for (var COLLECTION_NAME in DOMIterables) { if (DOMIterables[COLLECTION_NAME]) { handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype); } } handlePrototype(DOMTokenListPrototype); /***/ }), /***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js": /*!**********************************************************************!*\ !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js"); var DOMTokenListPrototype = __webpack_require__(/*! ../internals/dom-token-list-prototype */ "./node_modules/core-js/internals/dom-token-list-prototype.js"); var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); var ITERATOR = wellKnownSymbol('iterator'); var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var ArrayValues = ArrayIteratorMethods.values; var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) { if (CollectionPrototype) { // some Chrome versions have non-configurable methods on DOMTokenList if (CollectionPrototype[ITERATOR] !== ArrayValues) try { createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues); } catch (error) { CollectionPrototype[ITERATOR] = ArrayValues; } if (!CollectionPrototype[TO_STRING_TAG]) { createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); } if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { // some Chrome versions have non-configurable methods on DOMTokenList if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); } catch (error) { CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; } } } }; for (var COLLECTION_NAME in DOMIterables) { handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype, COLLECTION_NAME); } handlePrototype(DOMTokenListPrototype, 'DOMTokenList'); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&": /*!**********************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& ***! \**********************************************************************************************************************************************************************************************************************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_bamo_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! -!../../node_modules/css-loader/dist/cjs.js!./bamo.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css"); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); ___CSS_LOADER_EXPORT___.i(_node_modules_css_loader_dist_cjs_js_bamo_css__WEBPACK_IMPORTED_MODULE_2__["default"]); // Module ___CSS_LOADER_EXPORT___.push([module.id, " ", "",{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css": /*!***********************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css ***! \***********************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, "\r\n#BAMO .dialog_content {\r\n margin: 0;\r\n} \r\n\r\n#BAMO .wizardWrapper {\r\n display: flex; \r\n flex-direction: row;\r\n height: 100%;\r\n} \r\n\r\n#BAMO .wizardPage {\r\n width: 100%; \r\n padding: 12px 20px;\r\n} \r\n\r\n#BAMO .headerLabel {\r\n font-size: 20px; \r\n display: inline-block\r\n} \r\n\r\n#BAMO .headerDescription {\r\n color: white;\r\n} \r\n\r\n#BAMO input[type='text'] {\r\n display: block; \r\n width: 100%; \r\n height: auto; \r\n padding: 4px 8px; \r\n border: 1px solid black;\r\n} \r\n\r\n#BAMO input[type='number']{\r\n display: inline-block; \r\n width: 50px; \r\n height: auto; \r\n border: 1px solid black; \r\n padding-left: 4px; \r\n margin-right: 8px; \r\n text-align: right;\r\n} \r\n\r\n#BAMO input[type='checkbox'] {\r\n padding-right: 8px;\r\n} \r\n\r\n#BAMO select {\r\n width: 100%; \r\n height: auto; \r\n padding: 4px 8px;\r\n border: 1px solid black; \r\n} \r\n\r\n#BAMOsideBar {\r\n border-right: 2px solid black;\r\n width: 175px;\r\n} \r\n\r\n#BAMOsideBar li {\r\n width: 100%; \r\n padding: 8px 20px; \r\n cursor: pointer;\r\n} \r\n\r\n#BAMOsideBar li.selected {\r\n width: 100%; \r\n padding: 8px 20px; \r\n border-right: 4px solid green; \r\n cursor: default;\r\n background-color: gray;\r\n} \r\n\r\n#BAMOsideBar li.sideBarHeader {\r\n width: 100%;\r\n padding: 2px 10px;\r\n font-size: 12px;\r\n cursor: default;\r\n}\r\n\r\nul.settingsList li {\r\n padding: 8px 0;\r\n}\r\n\t", "",{"version":3,"sources":["webpack://./src/components/bamo.css"],"names":[],"mappings":";AACA;IACI,SAAS;AACb;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,YAAY;AAChB;;AAEA;IACI,WAAW;IACX,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf;AACJ;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,cAAc;IACd,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,uBAAuB;AAC3B;;AAEA;IACI,qBAAqB;IACrB,WAAW;IACX,YAAY;IACZ,uBAAuB;IACvB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;AACrB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,uBAAuB;AAC3B;;AAEA;IACI,6BAA6B;IAC7B,YAAY;AAChB;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,eAAe;AACnB;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,6BAA6B;IAC7B,eAAe;IACf,sBAAsB;AAC1B;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,eAAe;AACnB;;AAEA;IACI,cAAc;AAClB","sourcesContent":["\r\n#BAMO .dialog_content {\r\n margin: 0;\r\n} \r\n\r\n#BAMO .wizardWrapper {\r\n display: flex; \r\n flex-direction: row;\r\n height: 100%;\r\n} \r\n\r\n#BAMO .wizardPage {\r\n width: 100%; \r\n padding: 12px 20px;\r\n} \r\n\r\n#BAMO .headerLabel {\r\n font-size: 20px; \r\n display: inline-block\r\n} \r\n\r\n#BAMO .headerDescription {\r\n color: white;\r\n} \r\n\r\n#BAMO input[type='text'] {\r\n display: block; \r\n width: 100%; \r\n height: auto; \r\n padding: 4px 8px; \r\n border: 1px solid black;\r\n} \r\n\r\n#BAMO input[type='number']{\r\n display: inline-block; \r\n width: 50px; \r\n height: auto; \r\n border: 1px solid black; \r\n padding-left: 4px; \r\n margin-right: 8px; \r\n text-align: right;\r\n} \r\n\r\n#BAMO input[type='checkbox'] {\r\n padding-right: 8px;\r\n} \r\n\r\n#BAMO select {\r\n width: 100%; \r\n height: auto; \r\n padding: 4px 8px;\r\n border: 1px solid black; \r\n} \r\n\r\n#BAMOsideBar {\r\n border-right: 2px solid black;\r\n width: 175px;\r\n} \r\n\r\n#BAMOsideBar li {\r\n width: 100%; \r\n padding: 8px 20px; \r\n cursor: pointer;\r\n} \r\n\r\n#BAMOsideBar li.selected {\r\n width: 100%; \r\n padding: 8px 20px; \r\n border-right: 4px solid green; \r\n cursor: default;\r\n background-color: gray;\r\n} \r\n\r\n#BAMOsideBar li.sideBarHeader {\r\n width: 100%;\r\n padding: 2px 10px;\r\n font-size: 12px;\r\n cursor: default;\r\n}\r\n\r\nul.settingsList li {\r\n padding: 8px 0;\r\n}\r\n\t"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/runtime/api.js": /*!*****************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/api.js ***! \*****************************************************/ /***/ ((module) => { "use strict"; /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": /*!************************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! \************************************************************/ /***/ ((module) => { "use strict"; module.exports = function (item) { var content = item[1]; var cssMapping = item[3]; if (!cssMapping) { return content; } if (typeof btoa === "function") { var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping)))); var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); var sourceMapping = "/*# ".concat(data, " */"); var sourceURLs = cssMapping.sources.map(function (source) { return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */"); }); return [content].concat(sourceURLs).concat([sourceMapping]).join("\n"); } return [content].join("\n"); }; /***/ }), /***/ "./node_modules/to-string-loader/src/to-string.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&": /*!***********************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/to-string-loader/src/to-string.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& ***! \***********************************************************************************************************************************************************************************************************************************************************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var result = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& */ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&"); if (result && result.__esModule) { result = result.default; } if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /***/ "./src/components/bamo.css": /*!*********************************!*\ !*** ./src/components/bamo.css ***! \*********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var result = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!./bamo.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css"); if (result && result.__esModule) { result = result.default; } if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /***/ "./src/components/BamoAdvancedProperties.vue": /*!***************************************************!*\ !*** ./src/components/BamoAdvancedProperties.vue ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& */ "./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&"); /* harmony import */ var _BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BamoAdvancedProperties.vue?vue&type=script&lang=js& */ "./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&"); /* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js"); function injectStyles (context) { var style0 = __webpack_require__(/*! ./BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& */ "./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&") if (style0.__inject__) style0.__inject__(context) } /* normalize component */ var component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])( _BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], _BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render, _BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns, false, injectStyles, "018d13b4", "0908dd08" ) component.options.__file = "src/components/BamoAdvancedProperties.vue" /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports); /***/ }), /***/ "./src/components/BamoBaseComponent.vue": /*!**********************************************!*\ !*** ./src/components/BamoBaseComponent.vue ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BamoBaseComponent.vue?vue&type=template&id=2d170b0b& */ "./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&"); /* harmony import */ var _BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BamoBaseComponent.vue?vue&type=script&lang=js& */ "./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&"); /* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js"); /* normalize component */ ; var component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])( _BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], _BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.render, _BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns, false, null, null, "48575ee9" ) component.options.__file = "src/components/BamoBaseComponent.vue" /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports); /***/ }), /***/ "./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&": /*!****************************************************************************!*\ !*** ./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js& ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoAdvancedProperties.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&": /*!***********************************************************************!*\ !*** ./src/components/BamoBaseComponent.vue?vue&type=script&lang=js& ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoBaseComponent.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&": /*!************************************************************************************************************!*\ !*** ./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& ***! \************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/to-string-loader/src/to-string.js!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& */ "./node_modules/to-string-loader/src/to-string.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&"); /* harmony import */ var _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__); /* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {}; /* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== "default") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__] /* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__); /***/ }), /***/ "./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&": /*!*****************************************************************************!*\ !*** ./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b& ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "render": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.render), /* harmony export */ "staticRenderFns": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns) /* harmony export */ }); /* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoBaseComponent.vue?vue&type=template&id=2d170b0b& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&"); /***/ }), /***/ "./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&": /*!*********************************************************************************************!*\ !*** ./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& ***! \*********************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "render": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render), /* harmony export */ "staticRenderFns": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns) /* harmony export */ }); /* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&"); /***/ }), /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&": /*!********************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b& ***! \********************************************************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "render": () => (/* binding */ render), /* harmony export */ "staticRenderFns": () => (/* binding */ staticRenderFns) /* harmony export */ }); var render = function () { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c("div", [_c("BamoAdvancedProperties")], 1) } var staticRenderFns = [] render._withStripped = true /***/ }), /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&": /*!*************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& ***! \*************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "render": () => (/* binding */ render), /* harmony export */ "staticRenderFns": () => (/* binding */ staticRenderFns) /* harmony export */ }); var render = function () { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c("div", { attrs: { id: "BAMO" } }, [ _c("div", { staticClass: "wizardWrapper" }, [ _c("ul", { attrs: { id: "BAMOsideBar" } }, [ _c( "li", { class: { selected: _vm.step == "start" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "start") }, }, }, [_vm._v("\r\n Start\r\n ")] ), _vm._v(" "), _c("li", { staticClass: "sideBarHeader" }, [_vm._v("Blocks")]), _vm._v(" "), _c( "li", { class: { selected: _vm.step == "types" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "types") }, }, }, [_vm._v("\r\n Block Types\r\n ")] ), _vm._v(" "), _vm.parentData.properties.types.custom ? _c( "li", { class: { selected: _vm.step == "custom" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "custom") }, }, }, [_vm._v("\r\n Custom Block\r\n ")] ) : _vm._e(), _vm._v(" "), _vm.parentData.properties.types.block ? _c( "li", { class: { selected: _vm.step == "variant" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "variant") }, }, }, [_vm._v("\r\n Variants\r\n ")] ) : _vm._e(), _vm._v(" "), _c("li", { staticClass: "sideBarHeader" }, [_vm._v("Properties")]), _vm._v(" "), _c( "li", { class: { selected: _vm.step == "physical" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "physical") }, }, }, [_vm._v("\r\n Physical\r\n ")] ), _vm._v(" "), _c( "li", { class: { selected: _vm.step == "advPhys" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "advPhys") }, }, }, [_vm._v("\r\n Adv Physical\r\n ")] ), _vm._v(" "), _c( "li", { class: { selected: _vm.step == "particles" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "particles") }, }, }, [_vm._v("\r\n Particles\r\n ")] ), _vm._v(" "), _c( "li", { class: { selected: _vm.step == "datapack" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "datapack") }, }, }, [_vm._v("\r\n Datapack\r\n ")] ), _vm._v(" "), _c( "li", { class: { selected: _vm.step == "other" }, on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "other") }, }, }, [_vm._v("\r\n Other\r\n ")] ), _vm._v(" "), false ? 0 : _vm._e(), _vm._v(" "), false ? 0 : _vm._e(), ]), _vm._v(" "), _vm.step == "start" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("BAMO Exporter")] ), _vm._v(" "), _c("p", { attrs: { align: "center" } }, [ _vm._v( 'Click "Export" at any time to export the model. Any unmodified properties will be set to the default values for a dirt block. Changes will persist until Blockbench is closed.' ), ]), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Display Name"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "The (unique) name of the block as will be seen in Minecraft" ), ]), _vm._v(" "), _vm.error == "name" ? _c("p", { staticStyle: { color: "red" } }, [ _vm._v("Block display name cannot be blank"), ]) : _vm._e(), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.displayName, expression: "$parent.$data.properties.displayName", }, ], staticClass: "dark_bordered", attrs: { type: "text", placeholder: "Name of the Block" }, domProps: { value: _vm.$parent.$data.properties.displayName }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.$parent.$data.properties, "displayName", $event.target.value ) }, }, }), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Minecraft Version"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v(" The version of minecraft to export for"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.version, expression: "$parent.$data.properties.version", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties, "version", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, [ _c("option", { attrs: { disabled: "", value: "" } }, [ _vm._v("Please select"), ]), _vm._v(" "), _c("option", [_vm._v("1.20.1")]), _vm._v(" "), _c("option", [_vm._v("1.18.2")]), _vm._v(" "), _c("option", [_vm._v("1.16.5")]), ] ), ]), ]), _c("br"), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "types") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "types" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Block Types")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.types.custom, expression: "$parent.$data.properties.types.custom", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.$parent.$data.properties.types.custom ) ? _vm._i( _vm.$parent.$data.properties.types.custom, null ) > -1 : _vm.$parent.$data.properties.types.custom, }, on: { change: [ function ($event) { var $$a = _vm.$parent.$data.properties.types.custom, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties.types, "custom", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties.types, "custom", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set( _vm.$parent.$data.properties.types, "custom", $$c ) } }, function ($event) { return _vm.toggleType($event, "custom") }, ], }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Custom Block"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Block with a custom model and hitbox"), ]), ]), _vm._v(" "), _vm.$parent.$data.properties.types.custom ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Custom Block Type"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.types.customType, expression: "$parent.$data.properties.types.customType", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.types, "customType", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.customTypeOptions, function (op) { return _c("option", { key: op }, [_vm._v(_vm._s(op))]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.types.block, expression: "$parent.$data.properties.types.block", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.$parent.$data.properties.types.block ) ? _vm._i(_vm.$parent.$data.properties.types.block, null) > -1 : _vm.$parent.$data.properties.types.block, }, on: { change: [ function ($event) { var $$a = _vm.$parent.$data.properties.types.block, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties.types, "block", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties.types, "block", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set( _vm.$parent.$data.properties.types, "block", $$c ) } }, function ($event) { return _vm.toggleType($event, "block") }, ], }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Standard Block"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("1x1 block with identical textures on all faces"), ]), ]), _vm._v(" "), _vm.$parent.$data.properties.types.block ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.default.all, expression: "$parent.$data.properties.variant.default.all", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.default, "all", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), ]), _c("br"), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "start") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "physical") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "custom" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Custom Block Properties")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.bufferedHitbox, expression: "$parent.$data.properties.bufferedHitbox", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.$parent.$data.properties.bufferedHitbox ) ? _vm._i( _vm.$parent.$data.properties.bufferedHitbox, null ) > -1 : _vm.$parent.$data.properties.bufferedHitbox, }, on: { change: function ($event) { var $$a = _vm.$parent.$data.properties.bufferedHitbox, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties, "bufferedHitbox", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties, "bufferedHitbox", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set( _vm.$parent.$data.properties, "bufferedHitbox", $$c ) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Simplified Hitbox"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "Reduces the hitbox of the block to a single box encompasing the entire block. Use this if your model has rotated blocks, is mostly planes, or who's hitbox is otherwise messy" ), ]), ]), _vm._v(" "), _vm.$parent.$data.properties.bufferedHitbox ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("input", { directives: [ { name: "model", rawName: "v-model.number", value: _vm.$parent.$data.properties.hitboxBuffer, expression: "$parent.$data.properties.hitboxBuffer", modifiers: { number: true }, }, ], staticClass: "dark_bordered", attrs: { type: "number", min: "0", max: "16", step: "0.1", }, domProps: { value: _vm.$parent.$data.properties.hitboxBuffer, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.$parent.$data.properties, "hitboxBuffer", _vm._n($event.target.value) ) }, blur: function ($event) { return _vm.$forceUpdate() }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Hitbox Buffer"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Closest distance of hitbox to model edge"), ]), ]) : _vm._e(), ]), _c("br"), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "start") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "physical") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "variant" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Variant Blocks")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.types.stair, expression: "$parent.$data.properties.types.stair", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.$parent.$data.properties.types.stair ) ? _vm._i(_vm.$parent.$data.properties.types.stair, null) > -1 : _vm.$parent.$data.properties.types.stair, }, on: { change: function ($event) { var $$a = _vm.$parent.$data.properties.types.stair, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties.types, "stair", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties.types, "stair", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set( _vm.$parent.$data.properties.types, "stair", $$c ) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Create Stair Block"), ]), ]), _vm._v(" "), _vm.$parent.$data.properties.types.stair ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Top Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.stair.top, expression: "$parent.$data.properties.variant.stair.top", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.stair, "top", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _vm.$parent.$data.properties.types.stair ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Bottom Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.stair.bottom, expression: "$parent.$data.properties.variant.stair.bottom", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.stair, "bottom", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _vm.$parent.$data.properties.types.stair ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Side Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.stair.side, expression: "$parent.$data.properties.variant.stair.side", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.stair, "side", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.types.slab, expression: "$parent.$data.properties.types.slab", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.$parent.$data.properties.types.slab ) ? _vm._i(_vm.$parent.$data.properties.types.slab, null) > -1 : _vm.$parent.$data.properties.types.slab, }, on: { change: function ($event) { var $$a = _vm.$parent.$data.properties.types.slab, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties.types, "slab", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties.types, "slab", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set( _vm.$parent.$data.properties.types, "slab", $$c ) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Create Slab Block"), ]), ]), _vm._v(" "), _vm.$parent.$data.properties.types.slab ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Top Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.slab.top, expression: "$parent.$data.properties.variant.slab.top", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.slab, "top", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _vm.$parent.$data.properties.types.slab ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Bottom Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.slab.bottom, expression: "$parent.$data.properties.variant.slab.bottom", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.slab, "bottom", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _vm.$parent.$data.properties.types.slab ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Side Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.slab.side, expression: "$parent.$data.properties.variant.slab.side", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.slab, "side", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.types.wall, expression: "$parent.$data.properties.types.wall", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.$parent.$data.properties.types.wall ) ? _vm._i(_vm.$parent.$data.properties.types.wall, null) > -1 : _vm.$parent.$data.properties.types.wall, }, on: { change: function ($event) { var $$a = _vm.$parent.$data.properties.types.wall, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties.types, "wall", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties.types, "wall", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set( _vm.$parent.$data.properties.types, "wall", $$c ) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Create Wall Block"), ]), ]), _vm._v(" "), _vm.$parent.$data.properties.types.wall ? _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Wall Texture"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.variant.wall.wall, expression: "$parent.$data.properties.variant.wall.wall", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties.variant.wall, "wall", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.Textures(), function (op) { return _c("option", { key: op }, [ _vm._v(_vm._s(op.name)), ]) }), 0 ), ]) : _vm._e(), ]), _c("br"), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "types") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "physical") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "physical" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Physical Properties")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("div", { staticClass: "headerLabel" }, [_vm._v("Material")]), _vm._v(" "), _vm._m(0), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.material, expression: "$parent.$data.properties.material", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties, "material", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.materialOptions, function (op) { return _c("option", { key: op }, [_vm._v(_vm._s(op))]) }), 0 ), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Block Sounds"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "Sets the sounds made when the custom block is stepped on/broken/etc to match the listed block" ), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.sounds, expression: "$parent.$data.properties.sounds", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties, "sounds", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.soundOptions, function (op) { return _c("option", { key: op }, [_vm._v(_vm._s(op))]) }), 0 ), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Transparency"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "The transparency style of the block. Models with partially transparent textures should be set to Cutout" ), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.transparency, expression: "$parent.$data.properties.transparency", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties, "transparency", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.transparencyOptions, function (tr) { return _c("option", { key: tr }, [_vm._v(_vm._s(tr))]) }), 0 ), ]), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.gravity, expression: "$parent.$data.properties.gravity", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray(_vm.$parent.$data.properties.gravity) ? _vm._i(_vm.$parent.$data.properties.gravity, null) > -1 : _vm.$parent.$data.properties.gravity, }, on: { change: function ($event) { var $$a = _vm.$parent.$data.properties.gravity, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties, "gravity", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties, "gravity", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set(_vm.$parent.$data.properties, "gravity", $$c) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [_vm._v("Gravity")]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "Determines if the block falls due to gravity (No effect for non-default custom blocks)" ), ]), ]), ]), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "types") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "advPhys") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "advPhys" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Advanced Physical Properties")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model.number", value: _vm.$parent.$data.properties.lum, expression: "$parent.$data.properties.lum", modifiers: { number: true }, }, ], staticClass: "dark_bordered", attrs: { type: "number", min: "0", max: "15" }, domProps: { value: _vm.$parent.$data.properties.lum }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.$parent.$data.properties, "lum", _vm._n($event.target.value) ) }, blur: function ($event) { return _vm.$forceUpdate() }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Luminance"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "The light level of the block. Ranges from 0 to 15. Torches default at 14" ), ]), ]), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model.number", value: _vm.$parent.$data.properties.blastRes, expression: "$parent.$data.properties.blastRes", modifiers: { number: true }, }, ], staticClass: "dark_bordered", attrs: { type: "number", min: "0" }, domProps: { value: _vm.$parent.$data.properties.blastRes }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.$parent.$data.properties, "blastRes", _vm._n($event.target.value) ) }, blur: function ($event) { return _vm.$forceUpdate() }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Blast Resistance"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "How resistant the block is to explosions. Most blocks fall between 0.1 and 9" ), ]), ]), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model.number", value: _vm.$parent.$data.properties.slip, expression: "$parent.$data.properties.slip", modifiers: { number: true }, }, ], staticClass: "dark_bordered", attrs: { type: "number", min: "0", step: "0.1" }, domProps: { value: _vm.$parent.$data.properties.slip }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.$parent.$data.properties, "slip", _vm._n($event.target.value) ) }, blur: function ($event) { return _vm.$forceUpdate() }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Slipperiness"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "How much you slide when crossing the block. Default is 0.6 and reaches 0.989 for blue ice" ), ]), ]), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.fireproof, expression: "$parent.$data.properties.fireproof", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.$parent.$data.properties.fireproof ) ? _vm._i(_vm.$parent.$data.properties.fireproof, null) > -1 : _vm.$parent.$data.properties.fireproof, }, on: { change: function ($event) { var $$a = _vm.$parent.$data.properties.fireproof, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.$parent.$data.properties, "fireproof", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.$parent.$data.properties, "fireproof", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set(_vm.$parent.$data.properties, "fireproof", $$c) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Fireproof"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Determines if the block will burn"), ]), ]), ]), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "physical") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "particles") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "particles" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Particles")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particles, expression: "parentData.properties.particles", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray(_vm.parentData.properties.particles) ? _vm._i(_vm.parentData.properties.particles, null) > -1 : _vm.parentData.properties.particles, }, on: { change: function ($event) { var $$a = _vm.parentData.properties.particles, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.parentData.properties, "particles", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.parentData.properties, "particles", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set(_vm.parentData.properties, "particles", $$c) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Emit Particles (WIP)"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "Enables particle emission. Still in active development" ), ]), ]), _vm._v(" "), _vm.parentData.properties.particles ? _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Particle"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Which particle will be emitted"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particleType, expression: "parentData.properties.particleType", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.parentData.properties, "particleType", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.particleOptions, function (op) { return _c("option", { key: op }, [_vm._v(_vm._s(op))]) }), 0 ), ]) : _vm._e(), _vm._v(" "), _vm.parentData.properties.particles ? _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Particle Spawn Position"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Spawn point of the particles (between 0 and 16)"), ]), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particlePos.x, expression: "parentData.properties.particlePos.x", }, ], attrs: { type: "number", min: "0", max: "16" }, domProps: { value: _vm.parentData.properties.particlePos.x, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particlePos, "x", $event.target.value ) }, }, }), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particlePos.y, expression: "parentData.properties.particlePos.y", }, ], attrs: { type: "number", min: "0", max: "16" }, domProps: { value: _vm.parentData.properties.particlePos.y, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particlePos, "y", $event.target.value ) }, }, }), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particlePos.z, expression: "parentData.properties.particlePos.z", }, ], attrs: { type: "number", min: "0", max: "16" }, domProps: { value: _vm.parentData.properties.particlePos.z, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particlePos, "z", $event.target.value ) }, }, }), ]) : _vm._e(), _vm._v(" "), _vm.parentData.properties.particles ? _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Particle Spread"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Spread of particles in blocks"), ]), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particleSpread.x, expression: "parentData.properties.particleSpread.x", }, ], attrs: { type: "number", min: "0" }, domProps: { value: _vm.parentData.properties.particleSpread.x, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particleSpread, "x", $event.target.value ) }, }, }), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particleSpread.y, expression: "parentData.properties.particleSpread.y", }, ], attrs: { type: "number", min: "0" }, domProps: { value: _vm.parentData.properties.particleSpread.y, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particleSpread, "y", $event.target.value ) }, }, }), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particleSpread.z, expression: "parentData.properties.particleSpread.z", }, ], attrs: { type: "number", min: "0" }, domProps: { value: _vm.parentData.properties.particleSpread.z, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particleSpread, "z", $event.target.value ) }, }, }), ]) : _vm._e(), _vm._v(" "), _vm.parentData.properties.particles ? _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Particle Velocity"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Velocity of particles in blocks per tick"), ]), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particleVel.x, expression: "parentData.properties.particleVel.x", }, ], attrs: { type: "number" }, domProps: { value: _vm.parentData.properties.particleVel.x, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particleVel, "x", $event.target.value ) }, }, }), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particleVel.y, expression: "parentData.properties.particleVel.y", }, ], attrs: { type: "number" }, domProps: { value: _vm.parentData.properties.particleVel.y, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particleVel, "y", $event.target.value ) }, }, }), _vm._v(" "), _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.particleVel.z, expression: "parentData.properties.particleVel.z", }, ], attrs: { type: "number" }, domProps: { value: _vm.parentData.properties.particleVel.z, }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.parentData.properties.particleVel, "z", $event.target.value ) }, }, }), ]) : _vm._e(), ]), _vm._v(" "), _c("br"), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "advPhys") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "datapack") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "datapack" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Datapack Properties")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.genScRecipe, expression: "parentData.properties.genScRecipe", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.parentData.properties.genScRecipe ) ? _vm._i(_vm.parentData.properties.genScRecipe, null) > -1 : _vm.parentData.properties.genScRecipe, }, on: { change: function ($event) { var $$a = _vm.parentData.properties.genScRecipe, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.parentData.properties, "genScRecipe", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.parentData.properties, "genScRecipe", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set(_vm.parentData.properties, "genScRecipe", $$c) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Generate Recipe"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Creates a recipe for creating this block"), ]), ]), _vm._v(" "), _c("li", { staticStyle: { "padding-left": "20px" } }, [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.genReversableScRecipe, expression: "parentData.properties.genReversableScRecipe", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray( _vm.parentData.properties.genReversableScRecipe ) ? _vm._i( _vm.parentData.properties.genReversableScRecipe, null ) > -1 : _vm.parentData.properties.genReversableScRecipe, }, on: { change: function ($event) { var $$a = _vm.parentData.properties.genReversableScRecipe, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.parentData.properties, "genReversableScRecipe", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.parentData.properties, "genReversableScRecipe", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set( _vm.parentData.properties, "genReversableScRecipe", $$c ) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Make recipe reverseable"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("Creates a recipe that reverse the above"), ]), ]), ]), _vm._v(" "), _c("br"), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "particles") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "other") }, }, }, [_vm._v("Continue")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "other" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("Other Properties")] ), _vm._v(" "), _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model.number", value: _vm.$parent.$data.properties.maxStack, expression: "$parent.$data.properties.maxStack", modifiers: { number: true }, }, ], staticClass: "dark_bordered", attrs: { type: "number", min: "0" }, domProps: { value: _vm.$parent.$data.properties.maxStack }, on: { input: function ($event) { if ($event.target.composing) { return } _vm.$set( _vm.$parent.$data.properties, "maxStack", _vm._n($event.target.value) ) }, blur: function ($event) { return _vm.$forceUpdate() }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Max Stack Size"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("The maximum number the block in a stack"), ]), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Creative Tab"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "Which tab on the creative inventory menu the block will be added to" ), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.creativeTab, expression: "$parent.$data.properties.creativeTab", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties, "creativeTab", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.tabOptions, function (op) { return _c("option", { key: op }, [_vm._v(_vm._s(op))]) }), 0 ), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Rotation Type"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v("if y_axis, faces the player when placed"), ]), _vm._v(" "), _c( "select", { directives: [ { name: "model", rawName: "v-model", value: _vm.$parent.$data.properties.rotType, expression: "$parent.$data.properties.rotType", }, ], staticClass: "dark_bordered", on: { change: function ($event) { var $$selectedVal = Array.prototype.filter .call($event.target.options, function (o) { return o.selected }) .map(function (o) { var val = "_value" in o ? o._value : o.value return val }) _vm.$set( _vm.$parent.$data.properties, "rotType", $event.target.multiple ? $$selectedVal : $$selectedVal[0] ) }, }, }, _vm._l(_vm.rotationTypes, function (op) { return _c("option", { key: op }, [_vm._v(_vm._s(op))]) }), 0 ), ]), _vm._v(" "), _c("li", [ _c("input", { directives: [ { name: "model", rawName: "v-model", value: _vm.parentData.properties.animated, expression: "parentData.properties.animated", }, ], attrs: { type: "checkbox" }, domProps: { checked: Array.isArray(_vm.parentData.properties.animated) ? _vm._i(_vm.parentData.properties.animated, null) > -1 : _vm.parentData.properties.animated, }, on: { change: function ($event) { var $$a = _vm.parentData.properties.animated, $$el = $event.target, $$c = $$el.checked ? true : false if (Array.isArray($$a)) { var $$v = null, $$i = _vm._i($$a, $$v) if ($$el.checked) { $$i < 0 && _vm.$set( _vm.parentData.properties, "animated", $$a.concat([$$v]) ) } else { $$i > -1 && _vm.$set( _vm.parentData.properties, "animated", $$a.slice(0, $$i).concat($$a.slice($$i + 1)) ) } } else { _vm.$set(_vm.parentData.properties, "animated", $$c) } }, }, }), _vm._v(" "), _c("div", { staticClass: "headerLabel" }, [ _vm._v("Animated Textures (WIP)"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [ _vm._v( "Enables texture animations. Currently only recommended for single texture models" ), ]), ]), ]), _vm._v(" "), _c("br"), _vm._v(" "), _c( "button", { on: { click: function ($event) { $event.preventDefault() return _vm.changePage($event, "datapack") }, }, }, [_vm._v("Previous")] ), _vm._v(" "), _c( "button", { staticStyle: { float: "right" }, on: { click: function ($event) { $event.preventDefault() return _vm.createJSON.apply(null, arguments) }, }, }, [_vm._v("Export")] ), ]) : _vm._e(), _vm._v(" "), _vm.step == "settings" ? _c("div", { staticClass: "wizardPage" }, [ _c( "h1", { staticStyle: { padding: "0", "text-align": "center" } }, [_vm._v("BAMO Export Settings")] ), _vm._v(" "), _vm._m(1), ]) : _vm._e(), ]), ]) } var staticRenderFns = [ function () { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c("p", { staticClass: "headerDescription" }, [ _vm._v( "Sets default properties to match those of the listed block. For a list of properties each block has, see the " ), _c( "a", { attrs: { href: "https://minecraft.fandom.com/wiki/Materials" } }, [_vm._v("Minecraft wiki")] ), ]) }, function () { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c("ul", { staticClass: "settingsList" }, [ _c("li", [ _c("div", { staticClass: "headerLabel" }, [_vm._v("Set Namespace")]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [_vm._v("WIP")]), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("Only export textures currently used"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [_vm._v("WIP")]), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [_vm._v("reuse model file")]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [_vm._v("WIP")]), ]), _vm._v(" "), _c("li", [ _c("div", { staticClass: "headerLabel" }, [ _vm._v("show warning if model with same name exists"), ]), _vm._v(" "), _c("p", { staticClass: "headerDescription" }, [_vm._v("WIP")]), _vm._v(" "), _c( "div", { staticClass: "headerLabel", staticStyle: { "padding-left": "40px" }, }, [_vm._v("Only do this if file is closed/new file loaded")] ), ]), ]) }, ] render._withStripped = true /***/ }), /***/ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js": /*!********************************************************************!*\ !*** ./node_modules/vue-loader/lib/runtime/componentNormalizer.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ normalizeComponent) /* harmony export */ }); /* globals __VUE_SSR_CONTEXT__ */ // IMPORTANT: Do NOT use ES2015 features in this file (except for modules). // This module is a runtime utility for cleaner component module output and will // be included in the final webpack user bundle. function normalizeComponent ( scriptExports, render, staticRenderFns, functionalTemplate, injectStyles, scopeId, moduleIdentifier, /* server only */ shadowMode /* vue-cli only */ ) { // Vue.extend constructor export interop var options = typeof scriptExports === 'function' ? scriptExports.options : scriptExports // render functions if (render) { options.render = render options.staticRenderFns = staticRenderFns options._compiled = true } // functional template if (functionalTemplate) { options.functional = true } // scopedId if (scopeId) { options._scopeId = 'data-v-' + scopeId } var hook if (moduleIdentifier) { // server build hook = function (context) { // 2.3 injection context = context || // cached call (this.$vnode && this.$vnode.ssrContext) || // stateful (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional // 2.2 with runInNewContext: true if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { context = __VUE_SSR_CONTEXT__ } // inject component styles if (injectStyles) { injectStyles.call(this, context) } // register component module identifier for async chunk inferrence if (context && context._registeredComponents) { context._registeredComponents.add(moduleIdentifier) } } // used by ssr in case component is cached and beforeCreate // never gets called options._ssrRegister = hook } else if (injectStyles) { hook = shadowMode ? function () { injectStyles.call( this, (options.functional ? this.parent : this).$root.$options.shadowRoot ) } : injectStyles } if (hook) { if (options.functional) { // for template-only hot-reload because in that case the render fn doesn't // go through the normalizer options._injectStyles = hook // register for functional component in vue file var originalRender = options.render options.render = function renderWithStyleInjection (h, context) { hook.call(context) return originalRender(h, context) } } else { // inject component registration as beforeCreate hook var existing = options.beforeCreate options.beforeCreate = existing ? [].concat(existing, hook) : [hook] } } return { exports: scriptExports, options: options } } /***/ }), /***/ "fs": /*!*********************!*\ !*** external "fs" ***! \*********************/ /***/ ((module) => { "use strict"; module.exports = require("fs"); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be in strict mode. (() => { "use strict"; /*!*********************!*\ !*** ./src/main.js ***! \*********************/ __webpack_require__.r(__webpack_exports__); /* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.date.to-string.js */ "./node_modules/core-js/modules/es.date.to-string.js"); /* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ "./node_modules/core-js/modules/es.regexp.to-string.js"); /* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ "./node_modules/core-js/modules/es.function.name.js"); /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ "./node_modules/core-js/modules/es.object.assign.js"); /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ "./node_modules/core-js/modules/es.symbol.js"); /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ "./node_modules/core-js/modules/es.symbol.description.js"); /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ "./node_modules/core-js/modules/es.symbol.iterator.js"); /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ "./node_modules/core-js/modules/es.array.iterator.js"); /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ "./node_modules/core-js/modules/es.string.iterator.js"); /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ "./node_modules/core-js/modules/web.dom-collections.iterator.js"); /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var _components_BamoBaseComponent_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/BamoBaseComponent.vue */ "./src/components/BamoBaseComponent.vue"); /* harmony import */ var _util_Codec__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./util/Codec */ "./src/util/Codec.js"); /* harmony import */ var _util_Settings__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util/Settings */ "./src/util/Settings.js"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } var css = (__webpack_require__(/*! ./components/bamo.css */ "./src/components/bamo.css").toString)(); var btn; var exportWindow; var cssData; var minecraftFolder; Plugin.register('bamo', { title: 'BAMO Exporter', author: 'Ryytikki', description: 'Create custom Minecraft blocks without having to write a single line of code when paired with the BAMO mod. https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on', website: "https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on", icon: 'icon.png', tags: ['Minecraft: Java Edition'], version: '0.5.1', variant: 'desktop', new_repository_format: true, onload: function onload() { (0,_util_Codec__WEBPACK_IMPORTED_MODULE_12__.loadCodec)(); // Setting that holds the resource pack folder location minecraftFolder = new Setting('minecraftFolder', { name: 'Minecraft Folder Location', description: 'Location of the Minecraft folder on your PC', category: 'export', type: 'text', value: '' }); // Export button in menu btn = new Action('bamo', { name: 'BAMO Exporter', description: 'Exports a block for the BAMO mod', icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAN6SURBVDhPJZJrTJtVGMd/b99CYUOgLTA6oKV1HWvHitwnGyZzW7INw5RIXBbjjJc598WpM+oXxz6a+JFETVzch8XEaGKcM9lCNIToqGDHTSiXAV2h5VZKW6illPb1fV/Pyck5Oec5z/O/PMKHv5yVtFotO7spIpENQMBYYSQ4HcBgMGAymViPhIlFo5ABnU5HPB5naWkJh8OBBo1ANBPDrCvBnm/GVWlnpmOUwnI9ceFf/n7kwWU8QH15NXvy84ilN9XENpuNdG4GjbPKxmzHEFXHqvhne5bJ2BOyCrIoOFhI5PISznonvpw1BEGg9dkGNt5dxpfwkyzcYfHyHMIZa4nkuPQR499+jiaZQ/2fzYy1PUIryuA0GvZ069l8aRlzn5OpE4O0nj2Ce8CPLkvkiMuEcOfjDmlsch67rZzW6krevvEDV187zvjcMjnZWoaGAghPCaRCcawXr5E99B2NLju37g1Qbd2HaCnK6xqZX6PWXsZMcJ1cXZqSIj0PBqbwr0ZIaTLUHSxDX5yP5/d7WCtMzAbWKTXkceH5GoSRL69Id3qG2N7ZJZNMYLlwk+CPN8nK3cvrZ+rZTWf45tdB9azQUs7Nhy0MjPupshQjZglSl+wdb5xr4PDTZYRHethv2kcoKjswtYgki3ffPUVR4V4WQjE240kCa1EanRWk0xLi1fbmrpXwFsOPg2rwuG8di0lPdCvBqKyDIM+2FgeSBF7fKhkpoyJ5MDBNtlZEtBbnd9UfKqdncEYOhWxZ3d88j1X+TY4KNXg2EGI5vKm+XTz1jCxeKcGlVVxVZrmR5KHwVBR99XStKkx5cQHd751XkfR5JnmrrVFd7okFxmQUD0emKeu8gXfah3D7+ouSYpmSRBElntjhVN0Bvvi+j9O1ZnrFFo4m+siI2QRWo/wx5uPNF5oYlJNMBGMIn3a2SO4JP++cP8rDUR819lI2EylO1Nj46q4bfa4GSdSxlUhSmJerAFbpXGlvVotqFPuUz57JRWS6DAdSBFc26Pf6Oeaykkhr6B2e4/orz6n79k6Kay8fp3dkHrd3AeHW++3S5JNVFdrtTzr5+ud+vAsh6ioN9HmXZS3a1ardP/VzssHOX7L/SpKGQxXqvdjWZO8KhqJ8dukk92UnzKUGtOkkxnMfYAyPEk2mZUeiaqMtrESotpWyv6iA/4vO8x8IAITQHDgPDwAAAABJRU5ErkJggg==', click: function click() { if (Project.name != undefined) { if (Texture.all.length == 0) { Blockbench.showMessageBox({ buttons: ["Ok"], title: "Error", message: "Please create a texture" }); return; } // If the bamoSettings for the file havent been generated, generate if (_typeof(_util_Settings__WEBPACK_IMPORTED_MODULE_13__["default"][Project.uuid]) !== 'object') { _util_Settings__WEBPACK_IMPORTED_MODULE_13__["default"][Project.uuid] = Object.assign({}, _util_Settings__WEBPACK_IMPORTED_MODULE_13__.BAMO_SETTINGS_DEFAULT); _util_Settings__WEBPACK_IMPORTED_MODULE_13__["default"][Project.uuid].displayName = Project.name; } if (Settings.get('minecraftFolder') != undefined && Settings.get('minecraftFolder') != '') { exportWindow.show(); exportWindow.content_vue.updateValues(); } else { Blockbench.showMessageBox({ buttons: ["Ok"], title: "Error", message: "You must set your Minecraft folder location under Settings->Export" }); } } else { Blockbench.showMessageBox({ buttons: ["Ok"], title: "Error", message: "Please ensure your file is saved before exporting. If you see this for a saved file, reload it and try again" }); } } }); MenuBar.addAction(btn, 'tools'); // Dialog that opens when you click the button1 // See the BamoComponent object for details exportWindow = new Dialog('BAMOExportWindow', { id: "BAMO", title: 'BAMO Exporter', component: _components_BamoBaseComponent_vue__WEBPACK_IMPORTED_MODULE_11__["default"], buttons: [], padding: !1, width: 720, height: 620 }); cssData = Blockbench.addCSS(css); }, onunload: function onunload() { btn["delete"](); minecraftFolder["delete"](); //cssData.delete(); (0,_util_Codec__WEBPACK_IMPORTED_MODULE_12__.unloadCodec)(); } }); })(); /******/ })() ; //# sourceMappingURL=bamo.js.map ================================================ FILE: plugins/bamo/src/.gitignore ================================================ node_modules ================================================ FILE: plugins/bamo/src/babel.config.js ================================================ module.exports = { presets: [ [ "@babel/preset-env", { useBuiltIns: "usage", corejs: 3, }, ], ], }; ================================================ FILE: plugins/bamo/src/package.json ================================================ { "name": "plugin", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@babel/core": "^7.18.2", "@babel/preset-env": "^7.18.2", "babel-loader": "^8.2.5", "css-loader": "^6.7.1", "to-string-loader": "^1.2.0", "webpack": "^5.75.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.9.2" }, "dependencies": { "blockbench-types": "^4.2.0", "core-js": "^3.22.8", "jszip": "^3.10.0", "vue": "^2.6.11", "vue-loader": "^15.9.6", "vue-router": "^3.5.4", "vue-template-compiler": "^2.6.12" } } ================================================ FILE: plugins/bamo/src/src/components/BamoAdvancedProperties.vue ================================================ ================================================ FILE: plugins/bamo/src/src/components/BamoAdvancedTemplate.html ================================================
  • Start
  • Blocks
  • Block Types
  • Custom Block
  • Variants
  • Properties
  • Physical
  • Adv Physical
  • Particles
  • Datapack
  • Other
  • Adv. Options
  • BAMO settings

BAMO Exporter

Click "Export" at any time to export the model. Any unmodified properties will be set to the default values for a dirt block. Changes will persist until Blockbench is closed.

  • Display Name

    The (unique) name of the block as will be seen in Minecraft

    Block display name cannot be blank

  • Minecraft Version

    The version of minecraft to export for


Block Types

  • Custom Block

    Block with a custom model and hitbox

  • Custom Block Type
  • Standard Block

    1x1 block with identical textures on all faces

  • Texture

Custom Block Properties

  • Simplified Hitbox

    Reduces the hitbox of the block to a single box encompasing the entire block. Use this if your model has rotated blocks, is mostly planes, or who's hitbox is otherwise messy

  • Hitbox Buffer

    Closest distance of hitbox to model edge


Variant Blocks

  • Create Stair Block
  • Top Texture
  • Bottom Texture
  • Side Texture
  • Create Slab Block
  • Top Texture
  • Bottom Texture
  • Side Texture
  • Create Wall Block
  • Wall Texture

Physical Properties

Advanced Physical Properties

  • Luminance

    The light level of the block. Ranges from 0 to 15. Torches default at 14

  • Blast Resistance

    How resistant the block is to explosions. Most blocks fall between 0.1 and 9

  • Slipperiness

    How much you slide when crossing the block. Default is 0.6 and reaches 0.989 for blue ice

  • Fireproof

    Determines if the block will burn

Particles

  • Emit Particles (WIP)

    Enables particle emission. Still in active development

  • Particle

    Which particle will be emitted

  • Particle Spawn Position

    Spawn point of the particles (between 0 and 16)

  • Particle Spread

    Spread of particles in blocks

  • Particle Velocity

    Velocity of particles in blocks per tick


Datapack Properties

  • Generate Recipe

    Creates a recipe for creating this block

  • Make recipe reverseable

    Creates a recipe that reverse the above


Other Properties

  • Max Stack Size

    The maximum number the block in a stack

  • Creative Tab

    Which tab on the creative inventory menu the block will be added to

  • Rotation Type

    if y_axis, faces the player when placed

  • Animated Textures (WIP)

    Enables texture animations. Currently only recommended for single texture models


BAMO Export Settings

  • Set Namespace

    WIP

  • Only export textures currently used

    WIP

  • reuse model file

    WIP

  • show warning if model with same name exists

    WIP

    Only do this if file is closed/new file loaded
================================================ FILE: plugins/bamo/src/src/components/BamoBaseComponent.vue ================================================ ================================================ FILE: plugins/bamo/src/src/components/ComponentTemplate.html ================================================ ================================================ FILE: plugins/bamo/src/src/components/bamo.css ================================================ #BAMO .dialog_content { margin: 0; } #BAMO .wizardWrapper { display: flex; flex-direction: row; height: 100%; } #BAMO .wizardPage { width: 100%; padding: 12px 20px; } #BAMO .headerLabel { font-size: 20px; display: inline-block } #BAMO .headerDescription { color: white; } #BAMO input[type='text'] { display: block; width: 100%; height: auto; padding: 4px 8px; border: 1px solid black; } #BAMO input[type='number']{ display: inline-block; width: 50px; height: auto; border: 1px solid black; padding-left: 4px; margin-right: 8px; text-align: right; } #BAMO input[type='checkbox'] { padding-right: 8px; } #BAMO select { width: 100%; height: auto; padding: 4px 8px; border: 1px solid black; } #BAMOsideBar { border-right: 2px solid black; width: 175px; } #BAMOsideBar li { width: 100%; padding: 8px 20px; cursor: pointer; } #BAMOsideBar li.selected { width: 100%; padding: 8px 20px; border-right: 4px solid green; cursor: default; background-color: gray; } #BAMOsideBar li.sideBarHeader { width: 100%; padding: 2px 10px; font-size: 12px; cursor: default; } ul.settingsList li { padding: 8px 0; } ================================================ FILE: plugins/bamo/src/src/main.js ================================================ import BamoBaseComponent from './components/BamoBaseComponent.vue'; import codec, { loadCodec, unloadCodec } from './util/Codec'; import bamoSettings, {BAMO_SETTINGS_DEFAULT} from './util/Settings'; const css = require('./components/bamo.css').toString(); let btn; let exportWindow; let cssData; let minecraftFolder; Plugin.register('bamo', { title: 'BAMO Exporter', author: 'Ryytikki', description: 'Create custom Minecraft blocks without having to write a single line of code when paired with the BAMO mod. https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on', website: "https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on", icon: 'icon.png', tags: ['Minecraft: Java Edition'], version: '0.5.1', variant: 'desktop', new_repository_format : true, onload() { loadCodec(); // Setting that holds the resource pack folder location minecraftFolder = new Setting('minecraftFolder', { name : 'Minecraft Folder Location', description: 'Location of the Minecraft folder on your PC', category: 'export', type: 'text', value: '' }); // Export button in menu btn = new Action('bamo', { name: 'BAMO Exporter', description: 'Exports a block for the BAMO mod', icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAN6SURBVDhPJZJrTJtVGMd/b99CYUOgLTA6oKV1HWvHitwnGyZzW7INw5RIXBbjjJc598WpM+oXxz6a+JFETVzch8XEaGKcM9lCNIToqGDHTSiXAV2h5VZKW6illPb1fV/Pyck5Oec5z/O/PMKHv5yVtFotO7spIpENQMBYYSQ4HcBgMGAymViPhIlFo5ABnU5HPB5naWkJh8OBBo1ANBPDrCvBnm/GVWlnpmOUwnI9ceFf/n7kwWU8QH15NXvy84ilN9XENpuNdG4GjbPKxmzHEFXHqvhne5bJ2BOyCrIoOFhI5PISznonvpw1BEGg9dkGNt5dxpfwkyzcYfHyHMIZa4nkuPQR499+jiaZQ/2fzYy1PUIryuA0GvZ069l8aRlzn5OpE4O0nj2Ce8CPLkvkiMuEcOfjDmlsch67rZzW6krevvEDV187zvjcMjnZWoaGAghPCaRCcawXr5E99B2NLju37g1Qbd2HaCnK6xqZX6PWXsZMcJ1cXZqSIj0PBqbwr0ZIaTLUHSxDX5yP5/d7WCtMzAbWKTXkceH5GoSRL69Id3qG2N7ZJZNMYLlwk+CPN8nK3cvrZ+rZTWf45tdB9azQUs7Nhy0MjPupshQjZglSl+wdb5xr4PDTZYRHethv2kcoKjswtYgki3ffPUVR4V4WQjE240kCa1EanRWk0xLi1fbmrpXwFsOPg2rwuG8di0lPdCvBqKyDIM+2FgeSBF7fKhkpoyJ5MDBNtlZEtBbnd9UfKqdncEYOhWxZ3d88j1X+TY4KNXg2EGI5vKm+XTz1jCxeKcGlVVxVZrmR5KHwVBR99XStKkx5cQHd751XkfR5JnmrrVFd7okFxmQUD0emKeu8gXfah3D7+ouSYpmSRBElntjhVN0Bvvi+j9O1ZnrFFo4m+siI2QRWo/wx5uPNF5oYlJNMBGMIn3a2SO4JP++cP8rDUR819lI2EylO1Nj46q4bfa4GSdSxlUhSmJerAFbpXGlvVotqFPuUz57JRWS6DAdSBFc26Pf6Oeaykkhr6B2e4/orz6n79k6Kay8fp3dkHrd3AeHW++3S5JNVFdrtTzr5+ud+vAsh6ioN9HmXZS3a1ardP/VzssHOX7L/SpKGQxXqvdjWZO8KhqJ8dukk92UnzKUGtOkkxnMfYAyPEk2mZUeiaqMtrESotpWyv6iA/4vO8x8IAITQHDgPDwAAAABJRU5ErkJggg==', click: function () { if (Project.name != undefined){ if (Texture.all.length == 0){ Blockbench.showMessageBox({buttons: ["Ok"], title: "Error", message: "Please create a texture"}); return; } // If the bamoSettings for the file havent been generated, generate if (typeof bamoSettings[Project.uuid] !== 'object'){ bamoSettings[Project.uuid] = Object.assign({}, BAMO_SETTINGS_DEFAULT); bamoSettings[Project.uuid].displayName = Project.name } if ((Settings.get('minecraftFolder') != undefined) && (Settings.get('minecraftFolder') != '')){ exportWindow.show(); exportWindow.content_vue.updateValues() }else{ Blockbench.showMessageBox({buttons: ["Ok"], title: "Error", message: "You must set your Minecraft folder location under Settings->Export"}); } }else{ Blockbench.showMessageBox({buttons: ["Ok"], title: "Error", message: "Please ensure your file is saved before exporting. If you see this for a saved file, reload it and try again"}); } } }); MenuBar.addAction(btn, 'tools'); // Dialog that opens when you click the button1 // See the BamoComponent object for details exportWindow = new Dialog('BAMOExportWindow', { id: "BAMO", title: 'BAMO Exporter', component: BamoBaseComponent, buttons: [], padding: !1, width: 720, height: 620, }); cssData = Blockbench.addCSS(css); }, onunload() { btn.delete(); minecraftFolder.delete(); //cssData.delete(); unloadCodec(); } }); ================================================ FILE: plugins/bamo/src/src/util/Codec.js ================================================ import bamoSettings, { BAMO_SETTINGS_DEFAULT } from "./Settings"; export function loadCodec(){ Codecs.project.on('compile', onProjectCompile); Codecs.project.on('parse', onProjectParse); Blockbench.on('close_project', onCloseProject); } export function unloadCodec(){ Codecs.project.events.compile.remove(onProjectCompile) Codecs.project.events.parse.remove(onProjectParse) format.delete(); } function onProjectCompile(e){ if (format.id !== "bamo_model") return; e.model.bamoSettings = bamoSettings[Project.uuid]; } function onProjectParse(e){ if (format.id !== "bamo_model") return; if (e.model && typeof e.model.bamoSettings === 'object'){ let placeholder = Object.assign({}, BAMO_SETTINGS_DEFAULT); bamoSettings[Project.uuid] = Object.assign(placeholder, e.model.bamoSettings); }else{ bamoSettings[Project.uuid] = Object.assign({}, BAMO_SETTINGS_DEFAULT); bamoSettings[Project.uuid].displayName = Project.name } console.log(bamoSettings[Project.uuid]); } function onCloseProject(){ if (format.id !== "bamo_model") return; delete bamoSettings[Project.uuid] } var codec = Codecs.java_block; var format = new ModelFormat({ id: "bamo_model", name: "BAMO model", category: "minecraft", description: "A format for storing models to be exported for the BAMO mod", icon: "view_in_ar", target: 'Minecraft: Java Edition', format_page: { content: [ {type: 'h3', text: tl('mode.start.format.informations')}, {text: `* ${tl('format.java_block.info.rotation')} * ${tl('format.java_block.info.size')} * ${tl('format.java_block.info.animation')}`.replace(/\t+/g, '') } ] }, render_sides() { if (Modes.display && ['thirdperson_righthand', 'thirdperson_lefthand', 'head'].includes(display_slot)) { return 'double'; } else { return 'front'; } }, model_identifier: false, parent_model_id: true, vertex_color_ambient_occlusion: true, rotate_cubes: true, rotation_limit: true, optional_box_uv: true, uv_rotation: true, java_face_properties: true, animated_textures: true, select_texture_for_particles: true, display_mode: true, texture_folder: true, cube_size_limiter: { coordinate_limits: [-16, 32], test(cube, values = 0) { let from = values.from || cube.from; let to = values.to || cube.to; let inflate = values.inflate == undefined ? cube.inflate : values.inflate; return undefined !== from.find((v, i) => { return ( to[i] + inflate > 32 || to[i] + inflate < -16 || from[i] - inflate > 32 || from[i] - inflate < -16 ) }) }, move(cube, values = 0) { let from = values.from || cube.from; let to = values.to || cube.to; let inflate = values.inflate == undefined ? cube.inflate : values.inflate; [0, 1, 2].forEach((ax) => { var overlap = to[ax] + inflate - 32 if (overlap > 0) { //If positive site overlaps from[ax] -= overlap to[ax] -= overlap if (16 + from[ax] - inflate < 0) { from[ax] = -16 + inflate } } else { overlap = from[ax] - inflate + 16 if (overlap < 0) { from[ax] -= overlap to[ax] -= overlap if (to[ax] + inflate > 32) { to[ax] = 32 - inflate } } } }) }, clamp(cube, values = 0) { let from = values.from || cube.from; let to = values.to || cube.to; let inflate = values.inflate == undefined ? cube.inflate : values.inflate; [0, 1, 2].forEach((ax) => { from[ax] = Math.clamp(from[ax] - inflate, -16, 32) + inflate; to[ax] = Math.clamp(to[ax] + inflate, -16, 32) - inflate; }) } }, codec: codec }); export default codec ================================================ FILE: plugins/bamo/src/src/util/GenDataFiles.js ================================================ export function genLootTable(namespace, block){ return `{ "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "${namespace}:${block}" } ], "conditions": [] } ] }` } export function genMineableTag(namespace, block, variants){ if (variants.length == 0){ return `{ "replace": false, "values": [ "${namespace}:${block}" ] }` }else{ var tagValues = [`${namespace}:${block}`] variants.forEach(function(v){ tagValues.push(`${namespace}:${block}_${v}`) }) var data = { "replace": false, "values": tagValues } return JSON.stringify(data) } } export function genStonecuttingRecipes(properties, blockName, dataFolder, zip){ console.log(properties) if (properties.genScRecipe){ var stData = genStonecuttingRecipe(properties.namespace, blockName) var stDir = dataFolder + properties.namespace + "\\recipes\\" fs.mkdirSync(stDir, {recursive: true}) fs.writeFile(stDir + blockName + ".json", stData, "utf8", err => {if (err != null) {console.log("Error found when writing custom block stonecutting recipe:", err)}}); zip.file("data/" + properties.namespace + "/recipes/" + blockName + ".json", stData) } if (properties.genReversableScRecipe){ var stData = genStonecuttingReverseRecipe(properties.namespace, blockName) var stDir = dataFolder + properties.namespace + "\\recipes\\" fs.mkdirSync(stDir, {recursive: true}) fs.writeFile(stDir + blockName + "_rv.json", stData, "utf8", err => {if (err != null) {console.log("Error found when writing custom block stonecutting recipe:", err)}}); zip.file("data/" + properties.namespace + "/recipes/" + blockName + "_rv.json", stData) } } export function genStonecuttingRecipe(namespace, block){ return ` { "type": "minecraft:stonecutting", "ingredient": { "item": "bamo:bamo_crate" }, "result": "${namespace}:${block}", "count": 1 }` } export function genStonecuttingReverseRecipe(namespace, block){ return ` { "type": "minecraft:stonecutting", "ingredient": { "item": "${namespace}:${block}" }, "result": "bamo:bamo_crate", "count": 1 }` } ================================================ FILE: plugins/bamo/src/src/util/GenStates.js ================================================ export function genStairState(namespace, model, outer, inner){ return ` { "variants": { "facing=east,half=bottom,shape=straight": { "model": "${namespace}:${model}" }, "facing=west,half=bottom,shape=straight": { "model": "${namespace}:${model}", "y": 180, "uvlock": true }, "facing=south,half=bottom,shape=straight": { "model": "${namespace}:${model}", "y": 90, "uvlock": true }, "facing=north,half=bottom,shape=straight": { "model": "${namespace}:${model}", "y": 270, "uvlock": true }, "facing=east,half=top,shape=straight": { "model": "${namespace}:${model}", "x": 180, "uvlock": true }, "facing=west,half=top,shape=straight": { "model": "${namespace}:${model}", "x": 180, "y": 180, "uvlock": true }, "facing=south,half=top,shape=straight": { "model": "${namespace}:${model}", "x": 180, "y": 90, "uvlock": true }, "facing=north,half=top,shape=straight": { "model": "${namespace}:${model}", "x": 180, "y": 270, "uvlock": true }, "facing=east,half=bottom,shape=outer_right": { "model": "${namespace}:${outer}" }, "facing=west,half=bottom,shape=outer_right": { "model": "${namespace}:${outer}", "y": 180, "uvlock": true }, "facing=south,half=bottom,shape=outer_right": { "model": "${namespace}:${outer}", "y": 90, "uvlock": true }, "facing=north,half=bottom,shape=outer_right": { "model": "${namespace}:${outer}", "y": 270, "uvlock": true }, "facing=east,half=bottom,shape=outer_left": { "model": "${namespace}:${outer}", "y": 270, "uvlock": true }, "facing=west,half=bottom,shape=outer_left": { "model": "${namespace}:${outer}", "y": 90, "uvlock": true }, "facing=south,half=bottom,shape=outer_left": { "model": "${namespace}:${outer}" }, "facing=north,half=bottom,shape=outer_left": { "model": "${namespace}:${outer}", "y": 180, "uvlock": true }, "facing=east,half=bottom,shape=inner_right": { "model": "${namespace}:${inner}" }, "facing=west,half=bottom,shape=inner_right": { "model": "${namespace}:${inner}", "y": 180, "uvlock": true }, "facing=south,half=bottom,shape=inner_right": { "model": "${namespace}:${inner}", "y": 90, "uvlock": true }, "facing=north,half=bottom,shape=inner_right": { "model": "${namespace}:${inner}", "y": 270, "uvlock": true }, "facing=east,half=bottom,shape=inner_left": { "model": "${namespace}:${inner}", "y": 270, "uvlock": true }, "facing=west,half=bottom,shape=inner_left": { "model": "${namespace}:${inner}", "y": 90, "uvlock": true }, "facing=south,half=bottom,shape=inner_left": { "model": "${namespace}:${inner}" }, "facing=north,half=bottom,shape=inner_left": { "model": "${namespace}:${inner}", "y": 180, "uvlock": true }, "facing=east,half=top,shape=outer_left": { "model": "${namespace}:${outer}", "x": 180, "uvlock": true }, "facing=west,half=top,shape=outer_left": { "model": "${namespace}:${outer}", "x": 180, "y": 180, "uvlock": true }, "facing=south,half=top,shape=outer_left": { "model": "${namespace}:${outer}", "x": 180, "y": 90, "uvlock": true }, "facing=north,half=top,shape=outer_left": { "model": "${namespace}:${outer}", "x": 180, "y": 270, "uvlock": true }, "facing=east,half=top,shape=outer_right": { "model": "${namespace}:${outer}", "x": 180, "y": 90, "uvlock": true }, "facing=west,half=top,shape=outer_right": { "model": "${namespace}:${outer}", "x": 180, "y": 270, "uvlock": true }, "facing=south,half=top,shape=outer_right": { "model": "${namespace}:${outer}", "x": 180, "y": 180, "uvlock": true }, "facing=north,half=top,shape=outer_right": { "model": "${namespace}:${outer}", "x": 180, "uvlock": true }, "facing=east,half=top,shape=inner_left": { "model": "${namespace}:${inner}", "x": 180, "uvlock": true }, "facing=west,half=top,shape=inner_left": { "model": "${namespace}:${inner}", "x": 180, "y": 180, "uvlock": true }, "facing=south,half=top,shape=inner_left": { "model": "${namespace}:${inner}", "x": 180, "y": 90, "uvlock": true }, "facing=north,half=top,shape=inner_left": { "model": "${namespace}:${inner}", "x": 180, "y": 270, "uvlock": true }, "facing=east,half=top,shape=inner_right": { "model": "${namespace}:${inner}", "x": 180, "y": 90, "uvlock": true }, "facing=west,half=top,shape=inner_right": { "model": "${namespace}:${inner}", "x": 180, "y": 270, "uvlock": true }, "facing=south,half=top,shape=inner_right": { "model": "${namespace}:${inner}", "x": 180, "y": 180, "uvlock": true }, "facing=north,half=top,shape=inner_right": { "model": "${namespace}:${inner}", "x": 180, "uvlock": true } } }` } export function genWallState(namespace, post, side, tall){ return `{ "multipart":[ {"when":{"up":"true"},"apply":{"model":"${namespace}:${post}"}}, {"when":{"north":"low"},"apply":{"model":"${namespace}:${side}","uvlock":true}}, {"when":{"east":"low"},"apply":{"model":"${namespace}:${side}","y":90,"uvlock":true}}, {"when":{"south":"low"},"apply":{"model":"${namespace}:${side}","y":180,"uvlock":true}}, {"when":{"west":"low"},"apply":{"model":"${namespace}:${side}","y":270,"uvlock":true}}, {"when":{"north":"tall"},"apply":{"model":"${namespace}:${tall}","uvlock":true}}, {"when":{"east":"tall"},"apply":{"model":"${namespace}:${tall}","y":90,"uvlock":true}}, {"when":{"south":"tall"},"apply":{"model":"${namespace}:${tall}","y":180,"uvlock":true}}, {"when":{"west":"tall"},"apply":{"model":"${namespace}:${tall}","y":270,"uvlock":true}} ] }` } ================================================ FILE: plugins/bamo/src/src/util/OptionArrays.js ================================================ export const rotationTypes = [ "default", //"axis", //"y_axis_player", "y_axis", //"all_player", //"all", ]; export const soundOptions = [ "Grass", "Glass", "Gravel", "Honey", "Metal", "Sand", "Snow", "Stone", "Wool", "Wood", "Ancient Debris", "Anvil", "Bamboo", "Bamboo Sapling", "Basalt", "Bone Brick", "Chain", "Coral Block", "Crop", "Fungus", "Gilded Blackstone", "Hard Crop", "Ladder", "Lantern", "Lily Pad", "Lodestone", "Netherite Block", "Netherrack", "Nether Bricks", "Nether Gold Ore", "Nether Ore", "Nether Sprouts", "Nether Wart", "Nylium", "Roots", "Scaffolding", "Shroomlight", "Slime Block", "Soul Sand", "Stem", "Sweet Berry Bush", "Twisting Vines", "Vine", "Wart Block", "Weeping Vines", "Wet Grass" ]; export const materialOptions = [ "Dirt", "Air", "Bamboo", "Bamboo Sapling", "Barrier", "Bubble Column", "Buildable Glass", "Cactus", "Cake", "Clay", "Coral", "Cloth Decoration", "Decoration", "Egg", "Explosive", "Fire", "Glass", "Grass", "Heavy Metal", "Ice", "Ice Solid", "Lava", "Leaves", "Metal", "Nether Wood", "Piston", "Plant", "Portal", "Replaceable Plant", "Replaceable Fireproof Plant", "Replaceable Water Plant", "Sand", "Shulker Shell", "Snow", "Sponge", "Stone", "Structural Air", "Top Snow", "Vegetable", "Water", "Water Plant", "Web", "Wood", "Wool" ]; export const transparencyOptions = [ "Solid", "Translucent", "Cutout", "Cutout (Mipped)" ]; export const tabOptions = [ "Building Blocks", "Brewing", "Combat", "Food", "Decorations", "Misc", "Redstone", "Tools", "Transportation" ]; export const particleOptions = [ "Ambient Entity Effect", "Angry Villager", "Ash", "Bubble", "Bubble Pop", "Campfire Smoke", "Cloud", "Composter", "Crimson Spore", "Crit", "Damage Indicator", "Dolphin", "Dripping Dripstone Lava", "Dripping Dripstone Water", "Dripping Honey", "Dripping Lava", "Dripping Obsidian Tear", "Dripping Water", "Elder Guardian", "Electric Spark", "Enchant", "Enchanted Hit", "End Rod", "Entity Effect", "Explosion", "Falling Dripstone Lava", "Falling Dripstone Water", "Falling Honey", "Falling Lava", "Falling Nectar", "Falling Obsidian Tear", "Falling Spore Blossom", "Falling Water", "Firework", "Fishing", "Flame", "Flash", "Glow", "Glow Squid Ink", "Happy Villager", "Heart", "Slime Item", "Snowball item", "Landing Honey", "Landing Lava", "Landing Obsidian Tear", "Lava", "Mycelium", "Nautilus", "Note", "Rain", "Reverse Portal", "Scrape", "Small Flame", "Snowflake", "Soul", "Soulfire Flame", "Spore Blossom Air", "Sweep Attack", "Totem of Undying", "Undewater", "Warped Spore", "Wax off", "Wax On", "White Ash", "Witch", ]; export const customTypeOptions = ["Default", "Flower"]; export default {rotationTypes, soundOptions, materialOptions, transparencyOptions, tabOptions, customTypeOptions}; ================================================ FILE: plugins/bamo/src/src/util/Settings.js ================================================ export const BAMO_SETTINGS_DEFAULT = { displayName: "", namespace: "bamo", version: "1.20.1", typeList: [], material: "Dirt", blastRes: 6, slip: 0.6, gravity: false, rotType: "default", sounds: "Grass", lum: 0, maxStack: 64, fireproof: true, creativeTab: "Building Blocks", transparency: "Solid", blockType: "Default", types: { custom: true, customType: "Default", block: false, stair: false, slab: false, wall: false, }, variant: { default:{ all: "", }, stair: { top: "", bottom: "", side: "", particle: "" }, slab: { top: "", bottom: "", side: "", particle: "" }, wall: { wall: "", particle: "" } }, particles: false, particleType: "Rain", particlePos: { x: 8, y: 8, z: 8 }, particleSpread:{ x: 1, y: 1, z: 1 }, particleVel: { x: 0.1, y: 0.1, z: 0.1 }, bufferedHitbox: true, hitboxBuffer: 0.5, genScRecipe: true, genReversableScRecipe: true, animated: false }; Object.freeze(BAMO_SETTINGS_DEFAULT); let bamoSettings = {} bamoSettings[""] = Object.assign({}, BAMO_SETTINGS_DEFAULT); export default bamoSettings ================================================ FILE: plugins/bamo/src/src/util/Utils.js ================================================ export function dictFromTexture(image, ns, name){ var ret = "" Texture.all.forEach(function(tx){ if ((tx.name == image) || (image == "particle" && tx.particle == true)){ if (tx.namespace == ""){ ret = ns + ":blocks/" + name + "_" + cleanFileName(tx.name.split(".")[0]) }else{ ret = tx.namespace + ":" + tx.folder + "/" + cleanFileName(tx.name.split(".")[0]) } } }) return ret } export function cleanFileName(name){ return name.replace(/[^a-zA-Z\d\s._]/g, '').replace(/\s+/g, "_").toLowerCase() } ================================================ FILE: plugins/bamo/src/webpack.config.js ================================================ const PathModule = require('path'); const { VueLoaderPlugin } = require("vue-loader"); const path = require("path"); module.exports = { mode: 'development', devtool: 'source-map', target: 'node', entry: './src/main.js', output: { filename: 'bamo.js', }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: "babel-loader", }, }, { test: /\.vue$/, loader: 'vue-loader', options: { optimizeSSR: false } }, { test: /\.css$/, use: ['to-string-loader', 'css-loader'], }, ], }, plugins: [ new VueLoaderPlugin(), ], resolve: { alias: { vue$: "vue/dist/vue.common.js", }, extensions: ["*", ".js", ".vue", ".json"], }, } ================================================ FILE: plugins/bbs_exporter/about.md ================================================ **BBS Model Ex/importer** is a plugin to export models in BBS model format, which can be imported by BBS Studio dedicated application, and BBS mod. ================================================ FILE: plugins/bbs_exporter/bbs_exporter.js ================================================ (function() { var exportAction, importAction; var lastOptions = {}; var sides = { north: "front", south: "back", west: "left", east: "right", up: "top", down: "bottom" }; var sidesInverse = { front: "north", back: "south", left: "west", right: "east", top: "up", bottom: "down" }; /* Model exporter code */ function areThereObjects(objects) { for (let i = 0; i < objects.length; i++) { if (objects[i].type === "group") { return true; } } return false; } function createHierarchy(objects) { var groups = {}; var createAnchor = !areThereObjects(objects); if (createAnchor) { var group = new Group(); group.children = objects; groups.anchor = createModelGroup(group, groups); } else { for (let i = 0; i < objects.length; i++) { var object = objects[i]; if (object.type === "group") { groups[object.name] = createModelGroup(object, groups); } } } return groups; } function createModelGroup(o, groups) { var group = {}; var cubes = []; var meshes = []; group.origin = o.origin.slice(); if (!o.rotation.allEqual(0)) { group.rotate = o.rotation.slice(); } if (typeof o.parent.name === "string") { group.parent = o.parent.name; } for (let i = 0; i < o.children.length; i++) { var object = o.children[i]; if (object.type === "group") { groups[object.name] = createModelGroup(object, groups); } else if (object.type === "cube") { cubes.push(createCube(object)); } else if (object.type === "mesh") { meshes.push(createMesh(object)); } } if (cubes.length > 0) { group.cubes = cubes; } if (meshes.length > 0) { group.meshes = meshes; } return group; } function createCube(c) { var cube = {}; var uvs = {}; cube.origin = c.origin.slice(); cube.from = c.from.slice(); cube.size = c.size(); if (c.inflate !== 0) { cube.offset = c.inflate; } if (!c.rotation.allEqual(0)) { cube.rotate = c.rotation.slice(); } Object.keys(CubeFace.opposite).forEach(key => { var face = c.faces[key]; if (face && face.texture !== null) { var uv = face.uv.slice(); if (face.rotation !== 0) { uv.push(face.rotation); } uvs[sides[key]] = uv; } }); if (Object.keys(uvs).length > 0) { cube.uvs = uvs; } return cube; } function createMesh(c) { var mesh = {}; var vertices = []; var uvs = []; var pushVertexKey = (k, f) => { var v = c.vertices[k]; var u = f.uv[k]; vertices.push(v[0]); vertices.push(v[1]); vertices.push(v[2]); uvs.push(u[0]); uvs.push(u[1]); }; mesh.origin = c.origin.slice(); if (!c.rotation.allEqual(0)) { mesh.rotate = c.rotation.slice(); } for (var key in c.faces) { var face = c.faces[key]; var vertexKeys = face.vertices; if (vertexKeys.length == 3) { for (var i = 0; i < vertexKeys.length; i++) { pushVertexKey(vertexKeys[i], face); } } else if (vertexKeys.length == 4) { /* Triangulate a quad */ var sorted = face.getSortedVertices(); pushVertexKey(sorted[0], face); pushVertexKey(sorted[1], face); pushVertexKey(sorted[2], face); pushVertexKey(sorted[0], face); pushVertexKey(sorted[2], face); pushVertexKey(sorted[3], face); } } mesh.vertices = vertices; mesh.uvs = uvs; return mesh; } /* Animation exporting code */ function createAnimation(a) { var animation = { groups: {} }; animation.duration = a.length; for (let key in a.animators) { var animator = a.animators[key]; var group = createAnimationGroup(animator); if (Object.keys(group).length > 0) { animation.groups[animator.name] = group; } } return animation; } function createAnimationGroup(a) { var group = {}; var translate = createAnimationKeyframes(a.position, "p"); var scale = createAnimationKeyframes(a.scale, "s"); var rotate = createAnimationKeyframes(a.rotation, "r"); if (translate.length > 0) group.translate = translate; if (scale.length > 0) group.scale = scale; if (rotate.length > 0) group.rotate = rotate; return group; } function createAnimationKeyframes(g, typeGroup) { if (!g) { return []; } var keyframes = []; for (let i = 0; i < g.length; i++) { var keyframe = g[i]; var data = keyframe.data_points[0]; var out = [ keyframe.time, keyframe.interpolation, getExpression(data, "x", typeGroup === "r" || typeGroup === "p"), getExpression(data, "y", typeGroup === "r"), getExpression(data, "z", false) ]; keyframes.push(out); } return keyframes; } function getExpression(data, component, invert) { var value = data[component] || 0; var parsed = parseFloat(value); var inverter = invert && Blockbench.isNewerThan('4.99') ? invertMolang : (v) => v; if (!isNaN(value) && !isNaN(parsed)) { return inverter(parsed); } if (typeof value === "string") { value = value.trim(); if (!value) { return 0; } } return inverter(value); } function compile() { function findTextureSize() { var c = Cube.all; var keys = Object.keys(sides); for (var i = 0; i < c.length; i++) { var cube = c[i]; for (var j = 0; j < keys.length; j++) { var face = cube.faces[keys[j]]; if (face) { var textureUuid = face.texture; for (var k = 0; k < Texture.all.length; k++) { var texture = Texture.all[k]; if (texture && texture.uuid == textureUuid) { return [texture.uv_width, texture.uv_height]; } } } } } return null; } var output = { version: "0.7.2", animations: {} }; if (lastOptions.model) { var texture = [Project.texture_width, Project.texture_height]; var textureSize = findTextureSize(); if (textureSize) { texture = textureSize; } output.model = { groups: createHierarchy(Outliner.root), texture: texture }; } if (lastOptions.animations) { Animation.all.forEach(animation => { output.animations[animation.name] = createAnimation(animation); }); } return output; } function compileFirstCubes() { var group = Group.selected; var cubes = []; if (group) { for (var child of group.children) { if (child.type === "cube") { cubes.push(createCube(child)); } } } return cubes; } /* Import */ function importBBS(json) { Undo.initEdit({ outliner: true, animations: [] }); try { if (json.model) importModel(json.model); if (json.animations) importAnimations(json.animations); } catch (e) { console.log(e); } Undo.finishEdit("Finished importing a BBS model"); Canvas.updateAll(); } function importAnimations(animations) { for (var key in animations) { var animationObject = animations[key]; var data = { name: key, length: animationObject.duration }; var animation = new Animation(data).add(); var groupKeys = Object.keys(animationObject.groups); groupKeys.forEach(k => importGroup(k, animationObject.groups[k], animation)); } } function importGroup(key, groupObject, animation) { var group = Group.all.find(o => o.name === key); if (!group) { return; } var animator = new BoneAnimator(group.uuid, animation, key); animation.animators[group.uuid] = animator; if (groupObject.translate) importChannel(animator, "position", groupObject.translate); if (groupObject.rotate) importChannel(animator, "rotation", groupObject.rotate); if (groupObject.scale) importChannel(animator, "scale", groupObject.scale); } function importChannel(animator, name, channel) { channel.forEach(kf => { animator.addKeyframe({ channel: name, time: kf[0], interpolation: kf[1], data_points: [{x: kf[2], y: kf[3], z: kf[4]}] }); }); } function importModel(model) { var texture = model.texture; var relations = {}; var groups = {}; Project.texture_width = texture[0]; Project.texture_height = texture[1]; for (var key in model.groups) { var groupObject = model.groups[key]; var data = { name: key }; if (groupObject.rotate) data.rotation = groupObject.rotate; if (groupObject.origin) data.origin = groupObject.origin; var group = new Group(data); group.init(); if (groupObject.parent) relations[key] = groupObject.parent; if (groupObject.cubes) groupObject.cubes.forEach(v => importCube(v, group)); if (groupObject.meshes) groupObject.meshes.forEach(v => importMesh(v, group)); groups[key] = group; } for (var key in relations) { groups[key].addTo(groups[relations[key]]); } } function importCube(cubeObject, group) { var cube = new Cube({ origin: cubeObject.origin || [0, 0, 0], from: cubeObject.from, to: [ cubeObject.from[0] + cubeObject.size[0], cubeObject.from[1] + cubeObject.size[1], cubeObject.from[2] + cubeObject.size[2] ], rotation: cubeObject.rotate || [0, 0, 0], inflate: cubeObject.offset || 0 }); Object.keys(cubeObject.uvs).forEach(key => { var uv = cubeObject.uvs[key]; var face = cube.faces[sidesInverse[key]]; face.uv = uv.slice(0, 4); if (uv.length >= 5) { face.rotation = uv[4]; } }); cube.init(); cube.addTo(group); } function importMesh(meshObject, group) { var vertices = {}; var faces = {}; for (var i = 0, c = meshObject.vertices.length / 9; i < c; i++) { var a1 = [ meshObject.vertices[i * 9], meshObject.vertices[i * 9 + 1], meshObject.vertices[i * 9 + 2] ]; var a2 = [ meshObject.vertices[i * 9 + 3], meshObject.vertices[i * 9 + 4], meshObject.vertices[i * 9 + 5] ]; var a3 = [ meshObject.vertices[i * 9 + 6], meshObject.vertices[i * 9 + 7], meshObject.vertices[i * 9 + 8] ]; var key1 = bbuid(6); var key2 = bbuid(6); var key3 = bbuid(6); vertices[key1] = a1; vertices[key2] = a2; vertices[key3] = a3; var face = { uv: {}, vertices: [key1, key2, key3] }; face.uv[key1] = [meshObject.uvs[i * 6], meshObject.uvs[i * 6 + 1]]; face.uv[key2] = [meshObject.uvs[i * 6 + 2], meshObject.uvs[i * 6 + 3]]; face.uv[key3] = [meshObject.uvs[i * 6 + 4], meshObject.uvs[i * 6 + 5]]; faces[bbuid(6)] = face; } var mesh = new Mesh({ origin: meshObject.origin || [0, 0, 0], rotation: meshObject.rotate || [0, 0, 0], vertices: vertices, faces: faces }); mesh.init(); mesh.addTo(group); } /* Bootstrap */ var bbsCodec = new Codec("bbs_model", { name: "BBS model", extension: "json", remember: false, load_filter: { type: "json", extensions: ["json"], condition: (file) => { return file && file.model && file.model.groups && file.model.texture; } }, load(content, file) { if (!Undo) { setupProject(Formats.free); } importBBS(content); }, compile(options) { return autoStringify(compile()); }, fileName() { var name = Project.name || "model"; return name.endsWith("bbs") ? name : name + ".bbs"; } }); var exportDialog = new Dialog({ id: "bbs_export_options", title: "BBS model exporter", form: { exportModel: { label: "Export model data", type: "checkbox", value: true }, exportAnimations: { label: "Export animations", type: "checkbox", value: true }, copyToBuffer: { label: "Copy to buffer", type: "checkbox", value: false }, copyOnlyFirst: { label: "Copy first selected group", description: "When enabled, copies to the buffer only cubes from the first found group. This option is ignored when Copy to buffer option is disabled!", type: "checkbox", value: false }, exportAsFolder: { label: "Export to folder", description: "When enabled, you can pick the folder where .bbs.json and the texture would be exported to.", type: "checkbox", value: false } }, onConfirm: function(formData) { this.hide(); lastOptions.model = formData.exportModel; lastOptions.animations = formData.exportAnimations; if (formData.exportAsFolder) { var folder = Blockbench.pickDirectory({ title: "Export destination..." }); if (folder) { Blockbench.writeFile(PathModule.join(folder, "model.bbs.json"), { content: autoStringify(compile()) }); Texture.all.forEach((t) => { if (t.error) { return; } var name = t.name.endsWith(".png") ? t.name : t.name + ".png"; Blockbench.writeFile(PathModule.join(folder, name), { content: t.source, savetype: 'image' }); }); } } else if (formData.copyToBuffer) { var data = {}; if (formData.copyOnlyFirst) { data = compileFirstCubes(); } else { data = compile(); } Clipbench.setText(autoStringify(data)); } else { bbsCodec.export(); } } }); Plugin.register("bbs_exporter", { title: "BBS Model Ex/importer", author: "McHorse", description: "Adds actions to export/import models in BBS format, which is used by BBS mod.", icon: "icon.png", version: "1.3.1", min_version: "4.8.0", variant: "both", has_changelog: true, onload() { exportAction = new Action("bbs_exporter", { name: "Export BBS model", category: "file", description: "Export model as a BBS (.bbs.json) model", icon: "fa-file-export", click() { exportDialog.show(); } }); importAction = new Action("bbs_importer", { name: "Import BBS model", category: "file", description: "Import a BBS model (.bbs.json) model", icon: "fa-file-import", click() { Blockbench.import({ extensions: ['bbs.json'], type: 'BBS model', readtype: 'text', }, (files) => { importBBS(JSON.parse(files[0].content)); }); } }); MenuBar.addAction(exportAction, "file.export"); MenuBar.addAction(importAction, "file.import"); }, onunload() { exportAction.delete(); importAction.delete(); } }); })(); ================================================ FILE: plugins/bbs_exporter/changelog.json ================================================ { "1.2.2": { "title": "1.2.2", "date": "2024-05-02", "author": "McHorse", "categories": [ { "title": "Bug fixes", "list": [ "Fixed cube faces not exporting in one texture formats" ] } ] }, "1.2.3": { "title": "1.2.3", "date": "2024-05-21", "author": "McHorse", "categories": [ { "title": "Enhancements", "list": [ "When exporting the model that has no groups, a single group called anchor will be added to successfully export the model without groups" ] } ] }, "1.2.4": { "title": "1.2.4", "date": "2024-12-11", "author": "McHorse", "categories": [ { "title": "Bug fixes", "list": [ "When exporting the model's UV is incorrectly picked from the project's texture size rather than from the active texture" ] } ] }, "1.3": { "title": "1.3", "date": "2025-01-18", "author": "McHorse", "categories": [ { "title": "Features", "list": [ "Added option \"Export to folder\" to exporter to automatically export not only the .bbs.json file, but texture(s) as well!", "Added load filter to ease importing .bbs.json models via drag-and-dropping or by opening file with Blockbench" ] }, { "title": "Bug fixes", "list": [ "Fixed wrong UV size being used when a texture has different UV size" ] } ] }, "1.3.1": { "title": "1.3.1", "date": "2025-10-14", "author": "McHorse", "categories": [ { "title": "Bug fixes", "list": [ "Adapted plugin to Blockbench 5.0" ] } ] } } ================================================ FILE: plugins/bedrock_block_transforms/bedrock_block_transforms.js ================================================ (function() { let action, style; BBPlugin.register('bedrock_block_transforms', { title: 'Bedrock Block Transformation Preview', author: 'JannisX11', version: '1.0.0', min_version: '4.9.0', icon: 'token', description: 'Edit and preview the Minecraft Bedrock Edition block transformation component', variant: 'both', tags: ['Minecraft: Bedrock Edition'], onload() { let dialog; function setupDialog() { let scale_object = new THREE.Object3D(); function updateTransformation(form_data) { let object = Project.model_3d; if (!form_data) { object.rotation.set(0, 0, 0); object.position.set(0, 0, 0); object.scale.set(1, 1, 1); return; } let rotation_pivot = new THREE.Vector3( (form_data.rotation_pivot[0] * 16), (form_data.rotation_pivot[1] * 16) + 8, (form_data.rotation_pivot[2] * 16), ); object.rotation.set( Math.degToRad(form_data.rotation[0]), Math.degToRad(form_data.rotation[1]), Math.degToRad(form_data.rotation[2]), 'ZYX' ) let rotated_rot_pivot = new THREE.Vector3().copy(rotation_pivot).applyEuler(object.rotation); object.position.set( form_data.translation[0] * 16 + rotation_pivot.x - rotated_rot_pivot.x, form_data.translation[1] * 16 + rotation_pivot.y - rotated_rot_pivot.y, form_data.translation[2] * 16 + rotation_pivot.z - rotated_rot_pivot.z, ) object.scale.set(1, 1, 1); if (!form_data.scale.allEqual(1)) { let scale_pivot = new THREE.Vector3( (form_data.scale_pivot[0] * 16), (form_data.scale_pivot[1] * 16) + 8, (form_data.scale_pivot[2] * 16), ); scale_object.scale.set( form_data.scale[0] || 0.00002, form_data.scale[1] || 0.00002, form_data.scale[2] || 0.00002, ); scale_object.position.x = scale_pivot.x - scale_pivot.x * form_data.scale[0]; scale_object.position.y = scale_pivot.y - scale_pivot.y * form_data.scale[1]; scale_object.position.z = scale_pivot.z - scale_pivot.z * form_data.scale[2]; } } function setupPreview() { for (let child of Project.model_3d.children.slice()) { scale_object.add(child); } Project.model_3d.add(scale_object); } function resetPreview() { Project.model_3d.position.set(0, 0, 0); Project.model_3d.rotation.set(0, 0, 0); Project.model_3d.scale.set(1, 1, 1); for (let child of scale_object.children.slice()) { Project.model_3d.add(child); } Project.model_3d.remove(scale_object); } json_output = ''; let last_form_data; dialog = new Dialog('bedrock_block_transforms', { title: 'Edit Block Transformation', cancel_on_click_outside: false, darken: false, form: { rotation: {label: 'Rotation', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 90, min: -270, max: 270}, translation: {label: 'Translation', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 1/16}, scale: {label: 'Scale', type: 'vector', dimensions: 3, value: [1, 1, 1 ], step: 1/20}, rotation_pivot: {label: 'Rotation Pivot', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 1/16}, scale_pivot: {label: 'Scale Pivot', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 1/16}, json: {type: 'textarea', share_text: true}, copy: {type: 'buttons', buttons: ['Copy'], click() { Clipbench.setText(json_output); Blockbench.showQuickMessage('Copied!') }} }, singleButton: true, resizable: 'x', onOpen() { if (!scale_object.parent) { setupPreview(); } updateTransformation(last_form_data); }, onFormChange(form_data) { updateTransformation(form_data); last_form_data = form_data; let json = { rotation: form_data.rotation.allEqual(0) ? undefined : form_data.rotation, translation: form_data.translation.allEqual(0) ? undefined : form_data.translation, scale: form_data.scale.allEqual(1) ? undefined : form_data.scale, rotation_pivot: form_data.rotation_pivot.allEqual(0) ? undefined : form_data.rotation_pivot, scale_pivot: form_data.scale_pivot.allEqual(0) ? undefined : form_data.scale_pivot, }; json_output = '"minecraft:transformation": ' + compileJSON(json); dialog.setFormValues({json: json_output}, false); }, onCancel() { resetPreview(); } }); } action = new Action('bedrock_block_transforms', { name: 'Edit Block Transformation', icon: 'token', condition: {formats: ['bedrock_block']}, click(event) { if (!dialog) setupDialog(); dialog.show(); } }) MenuBar.menus.tools.addAction(action); style = Blockbench.addCSS(` dialog#bedrock_block_transforms textarea { font-family: var(--font-code); } `) }, onunload() { if (action instanceof Action) action.delete(); style.delete(); } }) })() ================================================ FILE: plugins/block_multi_collisions/LICENSE.md ================================================ MIT License Copyright (c) 2025 Minato 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. ================================================ FILE: plugins/block_multi_collisions/about.md ================================================ # Block Multi-Collision Block Multi-Collision is a Blockbench plugin that allow you to create and preview multiple collision boxes for Minecraft Bedrock blocks using the `minecraft:collision_box` component for the block format `1.21.130+`. ## Overview - **Purpose**: Provide an in editor workflow to author one or more collision boxes for custom Bedrock blocks without manually editing JSON. - **Target**: Minecraft Bedrock Edition blocks using the `minecraft:collision_box` component, including the multi-box format introduced in recent versions. ## Features - Visual wireframe preview of up to 16 collision boxes directly in the Blockbench scene, each with its own size and offset. - Form controls to edit size and offset numerically, switch the active box by index, and keep boxes clamped to valid Bedrock collision bounds. - Auto-generation of collision boxes from visible cubes in the current model, speeding up setup for complex shapes. ## Workflow - Open the plugin via the “Setup Block Collisions” action, available when working in the Bedrock block format. - Adjust collision boxes using the numeric fields and navigation controls, previewing them in real time in the 3D viewport. - Copy the generated collision JSON and paste it into the block’s behavior JSON file in a Bedrock pack. ================================================ FILE: plugins/block_multi_collisions/block_multi_collisions.js ================================================ Blockbench.addCSS(` dialog#block_multi_collisions .result-code-container { background-color: #181b1f; border: 1px solid #101316; border-radius: 4px; padding: 12px; font-family: 'Courier New', 'Noto Sans Mono', monospace; font-size: 12px; line-height: 1.5; color: #d4d4d4; max-height: 130px; overflow-y: auto; overflow-x: auto; width: 100%; user-select: text; -webkit-user-select: text; -moz-user-select: text; -ms-user-select: text; cursor: text; } dialog#block_multi_collisions .hljs { background-color: transparent; user-select: text; -webkit-user-select: text; } dialog#block_multi_collisions .hljs-string { color: #ce9178; } dialog#block_multi_collisions .hljs-number { color: #b5cea8; } dialog#block_multi_collisions .hljs-attr { color: #9cdcfe; } dialog#block_multi_collisions .hljs-literal { color: #569cd6; } #collision_box_controls { display: grid; grid-template-rows: auto auto; row-gap: 6px; padding: 8px 0; margin: 4px 0; width: 80%; } #collision_box_controls i{ margin: unset; } #collision_box_controls_row1 { display: grid; grid-template-columns: 1fr 1fr; column-gap: 6px; align-items: center; } #collision_box_controls_row2 { display: grid; grid-template-columns: 1fr 1fr auto; column-gap: 6px; align-items: center; } #collision_box_controls .tool { display: inline-flex; align-items: center; justify-content: space-around; gap: 4px; padding: 4px 8px; height: 28px; font-size: 13px; border: none; border-radius: 3px; cursor: pointer; outline: none; white-space: nowrap; width: 100%; line-height: 1; transition: background 0.1s, filter 0.1s; background: var(--color-button); color: var(--color-text); } #collision_box_controls .tool:hover { filter: brightness(1.2); } #collision_box_controls .tool:active { filter: brightness(0.9); } #add_box_btn { background: var(--color-accent); } #remove_box_btn { background: var(--color-button); } #auto_cubes_btn { background: var(--color-button); } #copy_result_btn_inline { background: var(--color-button); } #copy_result_btn_inline.copied { background: #37cf95 !important; color: #18321e !important; } #box_count_display { color: var(--color-subtle_text); justify-self: end; white-space: nowrap; font-size: 12px; padding: 0 4px; } dialog#block_multi_collisions textarea { tab-size: 40px; } #collision_box_controls i { font-size: 18px; width: 18px; height: 18px; } `); (function () { function highlightJSON(jsonString) { jsonString = jsonString .replace(/&/g, '&') .replace(//g, '>'); return jsonString .replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*")(\s*:)/g, '$1$3') .replace(/:\s*("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*")/g, ': $1') .replace(/\b(-?\d+\\.?\\d*)\b/g, '$1') .replace(/\b(true|false|null)\b/g, '$1'); } function copyToClipboard(text) { return new Promise((resolve, reject) => { if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text).then(resolve).catch(err => fallbackCopy(text, resolve, reject)); } else { fallbackCopy(text, resolve, reject); } }); } function fallbackCopy(text, resolve, reject) { const textarea = document.createElement('textarea'); textarea.value = text; textarea.style.position = 'fixed'; textarea.style.left = '-999999px'; textarea.style.top = '-999999px'; document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { const ok = document.execCommand('copy'); document.body.removeChild(textarea); ok ? resolve() : reject(new Error('Copy command failed')); } catch (err) { document.body.removeChild(textarea); reject(err); } } function triggerCopyFeedback() { const btn = $('#copy_result_btn_inline'); const btnText = btn.find('span'); const btnIcon = btn.find('i'); btn.addClass('copied'); btnText.text('Copied!'); btnIcon.text('check'); setTimeout(() => { btn.removeClass('copied'); btnText.text('Copy'); btnIcon.text('content_copy'); }, 2000); } window.BlockCollisionManager = { collisionBoxes: [], colors: [0xffbd2e, 0xff5733, 0x33ff57, 0x3357ff, 0xff33f5, 0x33fff5, 0xffd700, 0xff1493], objects: [], currentBoxIndex: 0, previousBoxIndex: 0, controlsAdded: false, validateBox(size, offset) { const clampedSize = [ Math.max(0, Math.min(size[0], 16)), Math.max(0, Math.min(size[1], 24)), Math.max(0, Math.min(size[2], 16)) ]; const origin = [ offset[0] - clampedSize[0] / 2, offset[1], offset[2] - clampedSize[2] / 2 ]; const minOrigin = [-8, 0, -8]; const maxOrigin = [8, 24, 8]; for (let i = 0; i < 3; i++) { if (origin[i] < minOrigin[i]) offset[i] += minOrigin[i] - origin[i]; if (origin[i] + clampedSize[i] > maxOrigin[i]) offset[i] -= (origin[i] + clampedSize[i]) - maxOrigin[i]; } offset[0] = Math.max(-8, Math.min(8, offset[0])); offset[1] = Math.max(0, Math.min(24, offset[1])); offset[2] = Math.max(-8, Math.min(8, offset[2])); return { size: clampedSize, offset }; }, dialog: new Dialog({ id: 'block_multi_collisions', title: 'Block Multi-Collisions', width: 540, form: { box_index: { label: 'Box Index', type: 'number', value: 1, min: 1, step: 1 }, size_block: { label: 'Size (X, Y, Z)', type: 'vector', value: [16, 16, 16], max: 24, min: 0, dimensions: 3 }, offset_block: { label: 'Offset (X, Y, Z)', type: 'vector', value: [0, 0, 0] }, result: { type: 'textarea', height: 130, readonly: true } }, singleButton: true, keyboard_actions: { copy: { keybind: new Keybind({ key: 'c', ctrl: true }), run() { const textToCopy = $('dialog#block_multi_collisions textarea').val(); copyToClipboard(textToCopy) .then(() => { triggerCopyFeedback(); Blockbench.showQuickMessage('Copied to clipboard'); }) .catch(() => { Blockbench.showQuickMessage('Failed to copy', 1500); }); } } }, onFormChange(form) { const { size_block, offset_block, box_index } = form; const clampedIndex = Math.max(1, Math.min(box_index, window.BlockCollisionManager.collisionBoxes.length)); if (clampedIndex !== box_index) { setTimeout(() => { window.BlockCollisionManager.dialog.setFormValues({ box_index: clampedIndex }, false); }, 0); } const newIndex = clampedIndex - 1; if (newIndex !== window.BlockCollisionManager.previousBoxIndex) { window.BlockCollisionManager.previousBoxIndex = newIndex; window.BlockCollisionManager.currentBoxIndex = newIndex; window.BlockCollisionManager.loadBoxData(newIndex); return; } const validated = window.BlockCollisionManager.validateBox(size_block, offset_block); if (validated.size.toString() !== size_block.toString() || validated.offset.toString() !== offset_block.toString()) { setTimeout(() => { window.BlockCollisionManager.dialog.setFormValues({ size_block: validated.size, offset_block: validated.offset }, false); }, 0); } window.BlockCollisionManager.updateCurrentBox(validated.size, validated.offset); window.BlockCollisionManager.redrawAllBoxes(); window.BlockCollisionManager.updateResultOutput(); }, onOpen() { window.BlockCollisionManager.setupControls(); }, onConfirm() { window.BlockCollisionManager.clearAllBoxes(); this.hide(); } }), updateResultOutput() { const boxes = this.collisionBoxes; let result; if (boxes.length === 1 && boxes[0].size.allEqual(16) && boxes[0].offset.allEqual(0)) { result = `"minecraft:collision_box": true`; } else if (boxes.length === 1) { const box = boxes[0]; const value = compileJSON({ origin: [box.offset[0] - box.size[0] / 2, box.offset[1], box.offset[2] - box.size[2] / 2], size: box.size }); result = `"minecraft:collision_box": ${value}`; } else { const multi = boxes.map(box => ({ origin: [box.offset[0] - box.size[0] / 2, box.offset[1], box.offset[2] - box.size[2] / 2], size: box.size })); result = `"minecraft:collision_box": ${compileJSON(multi)}`; } const container = $('dialog#block_multi_collisions textarea'); const parent = container.parent(); container.val(result); const highlighted = highlightJSON(result); let codeBlock = parent.find('.result-code-container code'); if (!codeBlock.length) { container.hide(); parent.append(`
`); codeBlock = parent.find('.result-code-container code'); } codeBlock.html(highlighted); }, setupControls() { if (this.controlsAdded) return; const container = $('dialog#block_multi_collisions .dialog_content'); if (!container.length) return; $('#collision_box_controls').remove(); const html = `
Total: 1
`; container.append(html); $('#add_box_btn').off('click').on('click', e => { e.preventDefault(); e.stopPropagation(); window.BlockCollisionManager.addBox(); }); $('#remove_box_btn').off('click').on('click', e => { e.preventDefault(); e.stopPropagation(); window.BlockCollisionManager.removeBox(window.BlockCollisionManager.currentBoxIndex); }); $('#auto_cubes_btn').off('click').on('click', e => { e.preventDefault(); e.stopPropagation(); window.BlockCollisionManager.autoGenerateFromCubes(); }); $('#copy_result_btn_inline').on('click', function (e) { e.preventDefault(); e.stopPropagation(); const textToCopy = $('dialog#block_multi_collisions textarea').val(); copyToClipboard(textToCopy) .then(() => { triggerCopyFeedback(); }) .catch(err => { const btn = $(this); const btnText = btn.find('span'); btnText.text('Failed'); setTimeout(() => { btnText.text('Copy'); }, 2000); }); }); this.controlsAdded = true; this.updateBoxCount(); }, updateBoxCount() { $('#box_count_display').text(`Total: ${this.collisionBoxes.length}`); }, loadBoxData(index) { if (index < 0 || index >= this.collisionBoxes.length) return; const box = this.collisionBoxes[index]; this.dialog.setFormValues({ size_block: [...box.size], offset_block: [...box.offset], box_index: index + 1 }, false); this.previousBoxIndex = index; setTimeout(() => { this.redrawAllBoxes(); this.updateResultOutput(); }, 10); }, updateCurrentBox(size, offset) { const idx = this.currentBoxIndex; while (this.collisionBoxes.length <= idx) { this.collisionBoxes.push({ size: [16, 16, 16], offset: [0, 0, 0] }); } this.collisionBoxes[idx] = { size: [...size], offset: [...offset] }; }, autoGenerateFromCubes() { const all = Project.elements || []; if (all.length === 0) { Blockbench.showQuickMessage('No cubes found in the model'); return; } this.collisionBoxes = []; all.forEach(elm => { if (elm instanceof Cube && elm.visibility) { const sizeX = Math.abs(elm.to[0] - elm.from[0]); const sizeY = Math.abs(elm.to[1] - elm.from[1]); const sizeZ = Math.abs(elm.to[2] - elm.from[2]); const centerX = (elm.from[0] + elm.to[0]) / 2; const centerY = elm.from[1]; const centerZ = (elm.from[2] + elm.to[2]) / 2; const v = this.validateBox([sizeX, sizeY, sizeZ], [centerX, centerY, centerZ]); if (this.collisionBoxes.length < 16) { this.collisionBoxes.push({ size: v.size, offset: v.offset }); } } }); if (this.collisionBoxes.length === 0) { Blockbench.showQuickMessage('No valid cubes to convert'); return; } this.currentBoxIndex = 0; this.previousBoxIndex = 0; this.updateBoxCount(); this.loadBoxData(0); this.redrawAllBoxes(); this.updateResultOutput(); Blockbench.showQuickMessage(`Generated ${this.collisionBoxes.length} collision box`); }, redrawAllBoxes() { this.clearAllBoxes(); this.collisionBoxes.forEach((box, idx) => { const color = this.colors[idx % this.colors.length]; const obj = this.createBoxObject(box.size[0], box.size[1], box.size[2], color); obj.position.set(-box.offset[0], box.offset[1], box.offset[2]); this.objects.push(obj); scene.add(obj); }); }, addBox() { if (this.collisionBoxes.length === 16) return; this.collisionBoxes.push({ size: [16, 16, 16], offset: [0, 0, 0] }); this.currentBoxIndex = this.collisionBoxes.length - 1; this.updateBoxCount(); this.loadBoxData(this.currentBoxIndex); this.redrawAllBoxes(); this.updateResultOutput(); }, removeBox(index) { if (this.collisionBoxes.length <= 1) return; this.collisionBoxes.splice(index, 1); this.currentBoxIndex = Math.min(index, this.collisionBoxes.length - 1); this.updateBoxCount(); this.loadBoxData(this.currentBoxIndex); this.redrawAllBoxes(); this.updateResultOutput(); }, createBoxObject(w, h, d, color) { const geo = new THREE.BufferGeometry(); const mat = new THREE.LineBasicMaterial({ color }); const hw = w / 2, hh = h, hd = d / 2; const pos = [ hw, 0, hd, hw, hh, hd, hw, 0, -hd, hw, hh, -hd, -hw, 0, hd, -hw, hh, hd, -hw, 0, -hd, -hw, hh, -hd, hw, 0, hd, -hw, 0, hd, hw, 0, -hd, -hw, 0, -hd, hw, hh, hd, -hw, hh, hd, hw, hh, -hd, -hw, hh, -hd, hw, 0, hd, hw, 0, -hd, -hw, 0, hd, -hw, 0, -hd, hw, hh, hd, hw, hh, -hd, -hw, hh, hd, -hw, hh, -hd ]; geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(pos), 3)); return new THREE.LineSegments(geo, mat); }, clearAllBoxes() { this.objects.forEach(o => { scene.remove(o); if (o.geometry) o.geometry.dispose(); if (o.material) o.material.dispose(); }); this.objects = []; }, setupObject() { if (this.init) return; this.collisionBoxes = [{ size: [16, 16, 16], offset: [0, 0, 0] }]; this.currentBoxIndex = 0; this.previousBoxIndex = 0; this.init = true; } }; let action; Plugin.register('block_multi_collisions', { title: 'Block Multi-Collision Editor', icon: 'icon.svg', author: 'minato4743', description: 'This Plugin allow you to make and generate multiple collision boxes for Minecraft Bedrock blocks.', about: "

Block Multi-Collision

Create and preview multiple collision boxes for Minecraft Bedrock blocks using the minecraft:collision_box component for block format 1.21.130+.

Features

  • Visual wireframe preview of up to 16 collision boxes in the Blockbench viewport
  • Numeric controls for editing size and offset of each collision box
  • Auto-generation of collision boxes from visible cubes in your model
  • Real-time preview with proper clamping to valid Bedrock collision bounds

Usage

Setup Block CollisionsAction:

Opens the collision editor dialog

Navigate BoxesControls:

Use index selector to switch between collision boxes

Edit Size/OffsetFields:

Adjust X, Y, Z values numerically

Auto-GenerateButton:

Creates collision boxes from visible cubes

Copy JSONButton:

Copies generated collision component to clipboard

Ctrl+CShortcut:

Copies generated collision component to clipboard

Requirements

RequirementValue
Blockbench FormatBedrock Block
Minecraft Version1.21.130+

Output Format

The plugin generates JSON compatible with the minecraft:collision_box component. Paste the generated JSON into your block's behavior file under the components section.

", "tags": [ "Minecraft: Bedrock Edition", "Format: Bedrock Block" ], variant: 'both', version: '1.0.0', min_version: "4.12.6", onload() { action = new Action('open_block_collision_editor', { name: 'Setup Block Collisions', icon: 'view_comfy_alt', condition: _ => Format.id === 'bedrock_block', click: () => { window.BlockCollisionManager.setupObject(); window.BlockCollisionManager.dialog.show(); $('#blackout').hide(0); window.BlockCollisionManager.redrawAllBoxes(); window.BlockCollisionManager.updateResultOutput(); } }); MenuBar.addAction(action, 'filter'); }, onunload() { action.delete(); } }); })(); ================================================ FILE: plugins/block_multi_collisions/changelog.json ================================================ { "1.0.0": { "title": "v1.0.0", "author": "Minato", "date": "2025-12-28", "categories": [ { "title": "Changes", "list": [ "Initial release", "Visual wireframe preview of up to 16 collision boxes in 3D viewport", "Numeric controls for size/offset with automatic Bedrock bounds validation", "Box index navigation to edit multiple collision boxes", "Auto-generate collision boxes from visible model cubes", "Copy to clipboard with visual feedback" ] } ] } } ================================================ FILE: plugins/block_multi_collisions/members.yml ================================================ maintainers: - minecraftBedrockArabic # Minato (minato4743) ================================================ FILE: plugins/blockmodels-exporter.js ================================================ !function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){"use strict";var n=function(t){return t&&t.__esModule?t:{default:t}}(r(2));(()=>{let t=null;Plugin.register("blockmodels-exporter",{title:"Export to BlockModels.com",icon:"web",author:"TheDestruc7i0n",description:"Export models from Blockbench directly to BlockModels.com",version:"1.0.2",variant:"both",onload(){t=new Action("export-blockmodels",{name:"Export to BlockModels.com",icon:"web",click:()=>{"java_block"===Format.id?(0,n.default)(t=>{$.ajax({type:"POST",url:"https://blockmodels.com/api/submit",data:t,contentType:!1,processData:!1,xhr:function(){let t=$.ajaxSettings.xhr();return t.upload&&t.upload.addEventListener("progress",function(t){t.lengthComputable&&$("#blockmodels_upload_progress .progress_bar .progress_bar_inner").last().css("width",100*t.loaded/t.total+"%")},!1),t},success:t=>{t.error?alert(`An error occurred in uploading: ${t.error}`):(alert(`Model uploaded! https://blockmodels.com/model/${t.id}`),hideDialog()),window.blockmodels_confirming=!1},error:()=>{alert("An error occurred in uploading."),window.blockmodels_confirming=!1}})}):alert("This type of model is not supported yet!")}}),MenuBar.addAction(t,"filter")},onunload(){MenuBar.removeAction("filter.export-blockmodels"),$(".blockmodels_css").remove(),localStorage&&localStorage.getItem("blockmodels_api_key")&&localStorage.removeItem("blockmodels_api_key")}}),window.blockmodels_confirming=!1})()},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=a(r(3)),i=a(r(11));function a(t){return t&&t.__esModule?t:{default:t}}e.default=(t=>{const e=t=>{let e=document.createElement("canvas");return e.width=t.width,e.height=t.height,e.getContext("2d").drawImage(t,0,0),e.toDataURL("image/png").replace(/^data:image\/(png|jpg);base64,/,"")};(0,i.default)(async()=>{if(window.blockmodels_confirming)return void alert("Already uploading. Please wait.");window.blockmodels_confirming=!0;const r=$("[name=blockmodels__creation_title]").last().val(),i=$("[name=blockmodels__short]").last().val(),a=$("[name=blockmodels__long]").last().val(),s=$("[name=blockmodels__category]").last().val(),o=$("[name=blockmodels__minecraft_version]").last().val(),u=$("[name=blockmodels__api_key]").last().val();u&&localStorage&&localStorage.setItem("blockmodels_api_key",u);const l=JSON.parse(Codecs.java_block.compile());if(console.log("inputs: ",r,i,a,s,o,u,"bb","bb"),r&&i&&a&&s&&o&&u){const h=(()=>{const t=Blockbench.textures,r=new n.default;for(let n of t)if(!n.error){let t=n.img;const i=e(t);let a=n.name;r.file(a,i,{base64:!0})}return r})();(t=>{Screencam.cleanCanvas({width:512,height:512},e=>{e=e.replace(/^data:image\/(png|jpg);base64,/,""),t(e)})})(async e=>{h.file("imagelink.png",e,{base64:!0}),h.file("upload.json",JSON.stringify(l)),console.log("zipped file",h.files);let n=new FormData;n.append("uploadlink",!1),n.append("short",i),n.append("long",a),n.append("title",r),n.append("category",s),n.append("mcver",o),n.append("programused","bb"),n.append("source","bb"),n.append("api",u),n.append("files",await h.generateAsync({type:"blob"})),t(n)})}else alert("Please fill all fields."),window.blockmodels_confirming=!1})})},function(t,e,r){(function(e,r,n){var i;!function(e){t.exports=e()}(function(){return function t(e,r,n){function a(o,u){if(!r[o]){if(!e[o]){if(!u&&("function"==typeof i&&i))return i(o,!0);if(s)return s(o,!0);var l=new Error("Cannot find module '"+o+"'");throw l.code="MODULE_NOT_FOUND",l}var h=r[o]={exports:{}};e[o][0].call(h.exports,function(t){return a(e[o][1][t]||t)},h,h.exports,t,e,r,n)}return r[o].exports}for(var s="function"==typeof i&&i,o=0;o>2,o=(3&e)<<4|r>>4,u=1>6:64,l=2>4,r=(15&s)<<4|(o=a.indexOf(t.charAt(l++)))>>2,n=(3&o)<<6|(u=a.indexOf(t.charAt(l++))),c[h++]=e,64!==o&&(c[h++]=r),64!==u&&(c[h++]=n);return c}},{"./support":30,"./utils":32}],2:[function(t,e,r){"use strict";var n=t("./external"),i=t("./stream/DataWorker"),a=t("./stream/DataLengthProbe"),s=t("./stream/Crc32Probe");function o(t,e,r,n,i){this.compressedSize=t,this.uncompressedSize=e,this.crc32=r,this.compression=n,this.compressedContent=i}a=t("./stream/DataLengthProbe"),o.prototype={getContentWorker:function(){var t=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),e=this;return t.on("end",function(){if(this.streamInfo.data_length!==e.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),t},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(t,e,r){return t.pipe(new s).pipe(new a("uncompressedSize")).pipe(e.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",e)},e.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,e,r){"use strict";var n=t("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(t){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,e,r){"use strict";var n=t("./utils"),i=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e){return void 0!==t&&t.length?"string"!==n.getTypeOf(t)?function(t,e,r,n){var a=i,s=0+r;t^=-1;for(var o=0;o>>8^a[255&(t^e[o])];return-1^t}(0|e,t,t.length):function(t,e,r,n){var a=i,s=0+r;t^=-1;for(var o=0;o>>8^a[255&(t^e.charCodeAt(o))];return-1^t}(0|e,t,t.length):0}},{"./utils":32}],5:[function(t,e,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(t,e,r){"use strict";var n;n="undefined"!=typeof Promise?Promise:t("lie"),e.exports={Promise:n}},{lie:37}],7:[function(t,e,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,i=t("pako"),a=t("./utils"),s=t("./stream/GenericWorker"),o=n?"uint8array":"array";function u(t,e){s.call(this,"FlateWorker/"+t),this._pako=null,this._pakoAction=t,this._pakoOptions=e,this.meta={}}r.magic="\b\0",a.inherits(u,s),u.prototype.processChunk=function(t){this.meta=t.meta,null===this._pako&&this._createPako(),this._pako.push(a.transformTo(o,t.data),!1)},u.prototype.flush=function(){s.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},u.prototype.cleanUp=function(){s.prototype.cleanUp.call(this),this._pako=null},u.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(t){return new u("Deflate",t)},r.uncompressWorker=function(){return new u("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,e,r){"use strict";function n(t,e){var r,n="";for(r=0;r>>=8;return n}function i(t,e,r,i,s,h){var f,c,d=t.file,p=t.compression,m=h!==o.utf8encode,_=a.transformTo("string",h(d.name)),g=a.transformTo("string",o.utf8encode(d.name)),v=d.comment,b=a.transformTo("string",h(v)),y=a.transformTo("string",o.utf8encode(v)),w=g.length!==d.name.length,k=y.length!==v.length,x="",E="",A="",S=d.dir,C=d.date,z={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(z.crc32=t.crc32,z.compressedSize=t.compressedSize,z.uncompressedSize=t.uncompressedSize);var T=0;e&&(T|=8),m||!w&&!k||(T|=2048);var I=0,R=0;S&&(I|=16),"UNIX"===s?(R=798,I|=function(t,e){var r=t;return t||(r=S?16893:33204),(65535&r)<<16}(d.unixPermissions)):(R=20,I|=63&(d.dosPermissions||0)),f=C.getUTCHours(),f<<=6,f|=C.getUTCMinutes(),f<<=5,f|=C.getUTCSeconds()/2,c=C.getUTCFullYear()-1980,c<<=4,c|=C.getUTCMonth()+1,c<<=5,c|=C.getUTCDate(),w&&(x+="up"+n((E=n(1,1)+n(u(_),4)+g).length,2)+E),k&&(x+="uc"+n((A=n(1,1)+n(u(b),4)+y).length,2)+A);var B="";return B+="\n\0",B+=n(T,2),B+=p.magic,B+=n(f,2),B+=n(c,2),B+=n(z.crc32,4),B+=n(z.compressedSize,4),B+=n(z.uncompressedSize,4),B+=n(_.length,2),B+=n(x.length,2),{fileRecord:l.LOCAL_FILE_HEADER+B+_+x,dirRecord:l.CENTRAL_FILE_HEADER+n(R,2)+B+n(b.length,2)+"\0\0\0\0"+n(I,4)+n(i,4)+_+x+b}}var a=t("../utils"),s=t("../stream/GenericWorker"),o=t("../utf8"),u=t("../crc32"),l=t("../signature");function h(t,e,r,n){s.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}a.inherits(h,s),h.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,s.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-n-1))/r:100}}))},h.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=i(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},h.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=i(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:function(t){return l.DATA_DESCRIPTOR+n(t.crc32,4)+n(t.compressedSize,4)+n(t.uncompressedSize,4)}(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},h.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return n.transformTo("string",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},e.exports=i},{"../utils":32}],19:[function(t,e,r){"use strict";var n=t("./Uint8ArrayReader");function i(t){n.call(this,t)}t("../utils").inherits(i,n),i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=i},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,e,r){"use strict";var n=t("./DataReader");function i(t){n.call(this,t)}t("../utils").inherits(i,n),i.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},i.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},i.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=i},{"../utils":32,"./DataReader":18}],21:[function(t,e,r){"use strict";var n=t("./ArrayReader");function i(t){n.call(this,t)}t("../utils").inherits(i,n),i.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=i},{"../utils":32,"./ArrayReader":17}],22:[function(t,e,r){"use strict";var n=t("../utils"),i=t("../support"),a=t("./ArrayReader"),s=t("./StringReader"),o=t("./NodeBufferReader"),u=t("./Uint8ArrayReader");e.exports=function(t){var e=n.getTypeOf(t);return n.checkSupport(e),"string"!==e||i.uint8array?"nodebuffer"===e?new o(t):i.uint8array?new u(n.transformTo("uint8array",t)):new a(n.transformTo("array",t)):new s(t)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,e,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(t,e,r){"use strict";var n=t("./GenericWorker"),i=t("../utils");function a(t){n.call(this,"ConvertWorker to "+t),this.destType=t}i.inherits(a,n),a.prototype.processChunk=function(t){this.push({data:i.transformTo(this.destType,t.data),meta:t.meta})},e.exports=a},{"../utils":32,"./GenericWorker":28}],25:[function(t,e,r){"use strict";var n=t("./GenericWorker"),i=t("../crc32");function a(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(a,n),a.prototype.processChunk=function(t){this.streamInfo.crc32=i(t.data,this.streamInfo.crc32||0),this.push(t)},e.exports=a},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,e,r){"use strict";var n=t("../utils"),i=t("./GenericWorker");function a(t){i.call(this,"DataLengthProbe for "+t),this.propName=t,this.withStreamInfo(t,0)}n.inherits(a,i),a.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}i.prototype.processChunk.call(this,t)},e.exports=a},{"../utils":32,"./GenericWorker":28}],27:[function(t,e,r){"use strict";var n=t("../utils"),i=t("./GenericWorker");function a(t){i.call(this,"DataWorker");var e=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,t.then(function(t){e.dataIsReady=!0,e.data=t,e.max=t&&t.length||0,e.type=n.getTypeOf(t),e.isPaused||e._tickAndRepeat()},function(t){e.error(t)})}n.inherits(a,i),a.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},a.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},a.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},a.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var t=null,e=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,e);break;case"uint8array":t=this.data.subarray(this.index,e);break;case"array":case"nodebuffer":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},e.exports=a},{"../utils":32,"./GenericWorker":28}],28:[function(t,e,r){"use strict";function n(t){this.name=t||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(t){this.emit("data",t)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(t){this.emit("error",t)}return!0},error:function(t){return!this.isFinished&&(this.isPaused?this.generatedError=t:(this.isFinished=!0,this.emit("error",t),this.previous&&this.previous.error(t),this.cleanUp()),!0)},on:function(t,e){return this._listeners[t].push(e),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(t,e){if(this._listeners[t])for(var r=0;r "+t:t}},e.exports=n},{}],29:[function(t,r,n){"use strict";var i=t("../utils"),a=t("./ConvertWorker"),s=t("./GenericWorker"),o=t("../base64"),u=t("../support"),l=t("../external"),h=null;if(u.nodestream)try{h=t("../nodejs/NodejsStreamOutputAdapter")}catch(t){}function f(t,e,r){var n=e;switch(e){case"blob":case"arraybuffer":n="uint8array";break;case"base64":n="string"}try{this._internalType=n,this._outputType=e,this._mimeType=r,i.checkSupport(n),this._worker=t.pipe(new a(n)),t.lock()}catch(t){this._worker=new s("error"),this._worker.error(t)}}f.prototype={accumulate:function(t){return function(t,r){return new l.Promise(function(n,a){var s=[],u=t._internalType,l=t._outputType,h=t._mimeType;t.on("data",function(t,e){s.push(t),r&&r(e)}).on("error",function(t){s=[],a(t)}).on("end",function(){try{var t=function(t,e,r){switch(t){case"blob":return i.newBlob(i.transformTo("arraybuffer",e),r);case"base64":return o.encode(e);default:return i.transformTo(t,e)}}(l,function(t,r){var n,i=0,a=null,s=0;for(n=0;n>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e}(t)},r.utf8decode=function(t){return i.nodebuffer?n.transformTo("nodebuffer",t).toString("utf-8"):function(t){var e,r,i,a,s=t.length,u=new Array(2*s);for(e=r=0;e>10&1023,u[r++]=56320|1023&i)}return u.length!==r&&(u.subarray?u=u.subarray(0,r):u.length=r),n.applyFromCharCode(u)}(t=n.transformTo(i.uint8array?"uint8array":"array",t))},n.inherits(l,s),l.prototype.processChunk=function(t){var e=n.transformTo(i.uint8array?"uint8array":"array",t.data);if(this.leftOver&&this.leftOver.length){if(i.uint8array){var a=e;(e=new Uint8Array(a.length+this.leftOver.length)).set(this.leftOver,0),e.set(a,this.leftOver.length)}else e=this.leftOver.concat(e);this.leftOver=null}var s=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+o[t[r]]>e?r:e}(e),u=e;s!==e.length&&(i.uint8array?(u=e.subarray(0,s),this.leftOver=e.subarray(s,e.length)):(u=e.slice(0,s),this.leftOver=e.slice(s,e.length))),this.push({data:r.utf8decode(u),meta:t.meta})},l.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=l,n.inherits(h,s),h.prototype.processChunk=function(t){this.push({data:r.utf8encode(t.data),meta:t.meta})},r.Utf8EncodeWorker=h},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,e,r){"use strict";var n=t("./support"),i=t("./base64"),a=t("./nodejsUtils"),s=t("set-immediate-shim"),o=t("./external");function u(t){return t}function l(t,e){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==t&&(this.dosPermissions=63&this.externalFileAttributes),3==t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,n,i=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e},r.buf2binstring=function(t){return u(t,t.length)},r.binstring2buf=function(t){for(var e=new n.Buf8(t.length),r=0,i=e.length;r>10&1023,l[n++]=56320|1023&i)}return u(l,n)},r.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+s[t[r]]>e?r:e}},{"./common":41}],43:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){for(var i=65535&t|0,a=t>>>16&65535|0,s=0;0!==r;){for(r-=s=2e3>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e,r,i){var a=n,s=i+r;t^=-1;for(var o=i;o>>8^a[255&(t^e[o])];return-1^t}},{}],46:[function(t,e,r){"use strict";var n,i=t("../utils/common"),a=t("./trees"),s=t("./adler32"),o=t("./crc32"),u=t("./messages"),l=0,h=4,f=0,c=-2,d=-1,p=4,m=2,_=8,g=9,v=286,b=30,y=19,w=2*v+1,k=15,x=3,E=258,A=E+x+1,S=42,C=113,z=1,T=2,I=3,R=4;function B(t,e){return t.msg=u[e],e}function O(t){return(t<<1)-(4t.avail_out&&(r=t.avail_out),0!==r&&(i.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function U(t,e){a._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,D(t.strm)}function F(t,e){t.pending_buf[t.pending++]=e}function L(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function N(t,e){var r,n,i=t.max_chain_length,a=t.strstart,s=t.prev_length,o=t.nice_match,u=t.strstart>t.w_size-A?t.strstart-(t.w_size-A):0,l=t.window,h=t.w_mask,f=t.prev,c=t.strstart+E,d=l[a+s-1],p=l[a+s];t.prev_length>=t.good_match&&(i>>=2),o>t.lookahead&&(o=t.lookahead);do{if(l[(r=e)+s]===p&&l[r+s-1]===d&&l[r]===l[a]&&l[++r]===l[a+1]){a+=2,r++;do{}while(l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&au&&0!=--i);return s<=t.lookahead?s:t.lookahead}function M(t){var e,r,n,a,u,l,h,f,c,d,p=t.w_size;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=p+(p-A)){for(i.arraySet(t.window,t.window,p,p,0),t.match_start-=p,t.strstart-=p,t.block_start-=p,e=r=t.hash_size;n=t.head[--e],t.head[e]=p<=n?n-p:0,--r;);for(e=r=p;n=t.prev[--e],t.prev[e]=p<=n?n-p:0,--r;);a+=p}if(0===t.strm.avail_in)break;if(l=t.strm,h=t.window,f=t.strstart+t.lookahead,d=void 0,(c=a)<(d=l.avail_in)&&(d=c),r=0===d?0:(l.avail_in-=d,i.arraySet(h,l.input,l.next_in,d,f),1===l.state.wrap?l.adler=s(l.adler,h,d,f):2===l.state.wrap&&(l.adler=o(l.adler,h,d,f)),l.next_in+=d,l.total_in+=d,d),t.lookahead+=r,t.lookahead+t.insert>=x)for(u=t.strstart-t.insert,t.ins_h=t.window[u],t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x)if(n=a._tr_tally(t,t.strstart-t.match_start,t.match_length-x),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=x){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x&&t.match_length<=t.prev_length){for(i=t.strstart+t.lookahead-x,n=a._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-x),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=i&&(t.ins_h=(t.ins_h<t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(M(t),0===t.lookahead&&e===l)return z;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var n=t.block_start+r;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,U(t,!1),0===t.strm.avail_out))return z;if(t.strstart-t.block_start>=t.w_size-A&&(U(t,!1),0===t.strm.avail_out))return z}return t.insert=0,e===h?(U(t,!0),0===t.strm.avail_out?I:R):(t.strstart>t.block_start&&(U(t,!1),t.strm.avail_out),z)}),new W(4,4,8,4,j),new W(4,5,16,8,j),new W(4,6,32,32,j),new W(4,4,16,16,Z),new W(8,16,32,32,Z),new W(8,16,128,128,Z),new W(8,32,128,256,Z),new W(32,128,258,1024,Z),new W(32,258,258,4096,Z)],r.deflateInit=function(t,e){return K(t,e,_,15,8,0)},r.deflateInit2=K,r.deflateReset=G,r.deflateResetKeep=H,r.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?c:(t.state.gzhead=e,f):c},r.deflate=function(t,e){var r,i,s,u;if(!t||!t.state||5>8&255),F(i,i.gzhead.time>>16&255),F(i,i.gzhead.time>>24&255),F(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),F(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(F(i,255&i.gzhead.extra.length),F(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=o(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(F(i,0),F(i,0),F(i,0),F(i,0),F(i,0),F(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),F(i,3),i.status=C);else{var d=_+(i.w_bits-8<<4)<<8;d|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(d|=32),d+=31-d%31,i.status=C,L(i,d),0!==i.strstart&&(L(i,t.adler>>>16),L(i,65535&t.adler)),t.adler=1}if(69===i.status)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),D(t),s=i.pending,i.pending!==i.pending_buf_size));)F(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),D(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),D(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&D(t),i.pending+2<=i.pending_buf_size&&(F(i,255&t.adler),F(i,t.adler>>8&255),t.adler=0,i.status=C)):i.status=C),0!==i.pending){if(D(t),0===t.avail_out)return i.last_flush=-1,f}else if(0===t.avail_in&&O(e)<=O(r)&&e!==h)return B(t,-5);if(666===i.status&&0!==t.avail_in)return B(t,-5);if(0!==t.avail_in||0!==i.lookahead||e!==l&&666!==i.status){var p=2===i.strategy?function(t,e){for(var r;;){if(0===t.lookahead&&(M(t),0===t.lookahead)){if(e===l)return z;break}if(t.match_length=0,r=a._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(U(t,!1),0===t.strm.avail_out))return z}return t.insert=0,e===h?(U(t,!0),0===t.strm.avail_out?I:R):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?z:T}(i,e):3===i.strategy?function(t,e){for(var r,n,i,s,o=t.window;;){if(t.lookahead<=E){if(M(t),t.lookahead<=E&&e===l)return z;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=x&&0t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=x?(r=a._tr_tally(t,1,t.match_length-x),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=a._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(U(t,!1),0===t.strm.avail_out))return z}return t.insert=0,e===h?(U(t,!0),0===t.strm.avail_out?I:R):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?z:T}(i,e):n[i.level].func(i,e);if(p!==I&&p!==R||(i.status=666),p===z||p===I)return 0===t.avail_out&&(i.last_flush=-1),f;if(p===T&&(1===e?a._tr_align(i):5!==e&&(a._tr_stored_block(i,0,0,!1),3===e&&(P(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),D(t),0===t.avail_out))return i.last_flush=-1,f}return e!==h?f:i.wrap<=0?1:(2===i.wrap?(F(i,255&t.adler),F(i,t.adler>>8&255),F(i,t.adler>>16&255),F(i,t.adler>>24&255),F(i,255&t.total_in),F(i,t.total_in>>8&255),F(i,t.total_in>>16&255),F(i,t.total_in>>24&255)):(L(i,t.adler>>>16),L(i,65535&t.adler)),D(t),0=r.w_size&&(0===o&&(P(r.head),r.strstart=0,r.block_start=0,r.insert=0),d=new i.Buf8(r.w_size),i.arraySet(d,e,p-r.w_size,r.w_size,0),e=d,p=r.w_size),u=t.avail_in,l=t.next_in,h=t.input,t.avail_in=p,t.next_in=0,t.input=e,M(r);r.lookahead>=x;){for(n=r.strstart,a=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=b>>>24,p-=y,0==(y=b>>>16&255))S[a++]=65535&b;else{if(!(16&y)){if(0==(64&y)){b=m[(65535&b)+(d&(1<>>=y,p-=y),p<15&&(d+=A[n++]<>>=y=b>>>24,p-=y,!(16&(y=b>>>16&255))){if(0==(64&y)){b=_[(65535&b)+(d&(1<>>=y,p-=y,(y=a-s)>3,d&=(1<<(p-=w<<3))-1,t.next_in=n,t.next_out=a,t.avail_in=n>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function _(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=c,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new n.Buf32(d),e.distcode=e.distdyn=new n.Buf32(p),e.sane=1,e.back=-1,h):f}function g(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,_(t)):f}function v(t,e){var r,n;return t&&t.state?(n=t.state,e<0?(r=0,e=-e):(r=1+(e>>4),e<48&&(e&=15)),e&&(e<8||15=s.wsize?(n.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(i<(a=s.wsize-s.wnext)&&(a=i),n.arraySet(s.window,e,r-i,a,s.wnext),(i-=a)?(n.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=a,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=a(r.check,M,2,0),w=y=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&y)<<8)+(y>>8))%31){t.msg="incorrect header check",r.mode=30;break}if(8!=(15&y)){t.msg="unknown compression method",r.mode=30;break}if(w-=4,D=8+(15&(y>>>=4)),0===r.wbits)r.wbits=D;else if(D>r.wbits){t.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(M[0]=255&y,M[1]=y>>>8&255,r.check=a(r.check,M,2,0)),w=y=0,r.mode=3;case 3:for(;w<32;){if(0===v)break t;v--,y+=d[_++]<>>8&255,M[2]=y>>>16&255,M[3]=y>>>24&255,r.check=a(r.check,M,4,0)),w=y=0,r.mode=4;case 4:for(;w<16;){if(0===v)break t;v--,y+=d[_++]<>8),512&r.flags&&(M[0]=255&y,M[1]=y>>>8&255,r.check=a(r.check,M,2,0)),w=y=0,r.mode=5;case 5:if(1024&r.flags){for(;w<16;){if(0===v)break t;v--,y+=d[_++]<>>8&255,r.check=a(r.check,M,2,0)),w=y=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(v<(S=r.length)&&(S=v),S&&(r.head&&(D=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,d,_,S,D)),512&r.flags&&(r.check=a(r.check,d,S,_)),v-=S,_+=S,r.length-=S),r.length))break t;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===v)break t;for(S=0;D=d[_+S++],r.head&&D&&r.length<65536&&(r.head.name+=String.fromCharCode(D)),D&&S>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=12;break;case 10:for(;w<32;){if(0===v)break t;v--,y+=d[_++]<>>=7&w,w-=7&w,r.mode=27;break}for(;w<3;){if(0===v)break t;v--,y+=d[_++]<>>=1)){case 0:r.mode=14;break;case 1:if(x(r),r.mode=20,6!==e)break;y>>>=2,w-=2;break t;case 2:r.mode=17;break;case 3:t.msg="invalid block type",r.mode=30}y>>>=2,w-=2;break;case 14:for(y>>>=7&w,w-=7&w;w<32;){if(0===v)break t;v--,y+=d[_++]<>>16^65535)){t.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&y,w=y=0,r.mode=15,6===e)break t;case 15:r.mode=16;case 16:if(S=r.length){if(v>>=5,w-=5,r.ndist=1+(31&y),y>>>=5,w-=5,r.ncode=4+(15&y),y>>>=4,w-=4,286>>=3,w-=3}for(;r.have<19;)r.lens[j[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,F={bits:r.lenbits},U=o(0,r.lens,0,19,r.lencode,0,r.work,F),r.lenbits=F.bits,U){t.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,R=65535&N,!((T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<>>=T,w-=T,r.lens[r.have++]=R;else{if(16===R){for(L=T+2;w>>=T,w-=T,0===r.have){t.msg="invalid bit length repeat",r.mode=30;break}D=r.lens[r.have-1],S=3+(3&y),y>>>=2,w-=2}else if(17===R){for(L=T+3;w>>=T)),y>>>=3,w-=3}else{for(L=T+7;w>>=T)),y>>>=7,w-=7}if(r.have+S>r.nlen+r.ndist){t.msg="invalid bit length repeat",r.mode=30;break}for(;S--;)r.lens[r.have++]=D}}if(30===r.mode)break;if(0===r.lens[256]){t.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,F={bits:r.lenbits},U=o(u,r.lens,0,r.nlen,r.lencode,0,r.work,F),r.lenbits=F.bits,U){t.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,F={bits:r.distbits},U=o(l,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,F),r.distbits=F.bits,U){t.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===e)break t;case 20:r.mode=21;case 21:if(6<=v&&258<=b){t.next_out=g,t.avail_out=b,t.next_in=_,t.avail_in=v,r.hold=y,r.bits=w,s(t,A),g=t.next_out,p=t.output,b=t.avail_out,_=t.next_in,d=t.input,v=t.avail_in,y=r.hold,w=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;I=(N=r.lencode[y&(1<>>16&255,R=65535&N,!((T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<>B)])>>>16&255,R=65535&N,!(B+(T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<>>=B,w-=B,r.back+=B}if(y>>>=T,w-=T,r.back+=T,r.length=R,0===I){r.mode=26;break}if(32&I){r.back=-1,r.mode=12;break}if(64&I){t.msg="invalid literal/length code",r.mode=30;break}r.extra=15&I,r.mode=22;case 22:if(r.extra){for(L=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;I=(N=r.distcode[y&(1<>>16&255,R=65535&N,!((T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<>B)])>>>16&255,R=65535&N,!(B+(T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<>>=B,w-=B,r.back+=B}if(y>>>=T,w-=T,r.back+=T,64&I){t.msg="invalid distance code",r.mode=30;break}r.offset=R,r.extra=15&I,r.mode=24;case 24:if(r.extra){for(L=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===b)break t;if(S=A-b,r.offset>S){if((S=r.offset-S)>r.whave&&r.sane){t.msg="invalid distance too far back",r.mode=30;break}C=S>r.wnext?(S-=r.wnext,r.wsize-S):r.wnext-S,S>r.length&&(S=r.length),z=r.window}else z=p,C=g-r.offset,S=r.length;for(bv?(y=F[L+f[E]],O[P+f[E]]):(y=96,0),d=1<>T)+(p-=d)]=b<<24|y<<16|w|0,0!==p;);for(d=1<>=1;if(0!==d?(B&=d-1,B+=d):B=0,E++,0==--D[x]){if(x===S)break;x=e[r+f[E]]}if(C>>7)]}function O(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function P(t,e,r){t.bi_valid>c-r?(t.bi_buf|=e<>c-t.bi_valid,t.bi_valid+=r-c):(t.bi_buf|=e<>>=1,r<<=1,0<--e;);return r>>>1}function F(t,e,r){var n,i,a=new Array(f+1),s=0;for(n=1;n<=f;n++)a[n]=s=s+r[n-1]<<1;for(i=0;i<=e;i++){var o=t[2*i+1];0!==o&&(t[2*i]=U(a[o]++,o))}}function L(t){var e;for(e=0;e>1;1<=r;r--)j(t,a,r);for(i=u;r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],j(t,a,1),n=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=n,a[2*i]=a[2*r]+a[2*n],t.depth[i]=(t.depth[r]>=t.depth[n]?t.depth[r]:t.depth[n])+1,a[2*r+1]=a[2*n+1]=i,t.heap[1]=i++,j(t,a,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,n,i,a,s,o,u=e.dyn_tree,l=e.max_code,c=e.stat_desc.static_tree,d=e.stat_desc.has_stree,p=e.stat_desc.extra_bits,m=e.stat_desc.extra_base,_=e.stat_desc.max_length,g=0;for(a=0;a<=f;a++)t.bl_count[a]=0;for(u[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;r>=7;n>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e>>3,(a=t.static_len+3+7>>>3)<=i&&(i=a)):i=a=r+5,r+4<=i&&-1!==e?K(t,e,r,n):4===t.strategy||a===i?(P(t,2+(n?1:0),3),Z(t,w,k)):(P(t,4+(n?1:0),3),function(t,e,r,n){var i;for(P(t,e-257,5),P(t,r-1,5),P(t,n-4,4),i=0;i>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(E[r]+s+1)]++,t.dyn_dtree[2*B(e)]++),t.last_lit===t.lit_bufsize-1},r._tr_align=function(t){P(t,2,3),D(t,d,w),function(t){16===t.bi_valid?(O(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},{"../utils/common":41}],53:[function(t,e,r){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,e,r){"use strict";e.exports="function"==typeof n?n:function(){var t=[].slice.apply(arguments);t.splice(1,0,0),setTimeout.apply(null,t)}},{}]},{},[10])(10)})}).call(e,r(4).Buffer,r(0),r(8).setImmediate)},function(t,e,r){"use strict";(function(t){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ var n=r(5),i=r(6),a=r(7);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(t,e){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|t}function p(t,e){if(u.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return M(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return j(t).length;default:if(n)return M(t).length;e=(""+e).toLowerCase(),n=!0}}function m(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function _(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:g(t,e,r,n,i);if("number"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):g(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function g(t,e,r,n,i){var a,s=1,o=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,o/=2,u/=2,r/=2}function l(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var h=-1;for(a=r;ao&&(r=o-u),a=r;a>=0;a--){for(var f=!0,c=0;ci&&(n=i):n=i;var a=e.length;if(a%2!=0)throw new TypeError("Invalid hex string");n>a/2&&(n=a/2);for(var s=0;s>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function E(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function A(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:l>223?3:l>191?2:1;if(i+f<=r)switch(f){case 1:l<128&&(h=l);break;case 2:128==(192&(a=t[i+1]))&&(u=(31&l)<<6|63&a)>127&&(h=u);break;case 3:a=t[i+1],s=t[i+2],128==(192&a)&&128==(192&s)&&(u=(15&l)<<12|(63&a)<<6|63&s)>2047&&(u<55296||u>57343)&&(h=u);break;case 4:a=t[i+1],s=t[i+2],o=t[i+3],128==(192&a)&&128==(192&s)&&128==(192&o)&&(u=(15&l)<<18|(63&a)<<12|(63&s)<<6|63&o)>65535&&u<1114112&&(h=u)}null===h?(h=65533,f=1):h>65535&&(h-=65536,n.push(h>>>10&1023|55296),h=56320|1023&h),n.push(h),i+=f}return function(t){var e=t.length;if(e<=S)return String.fromCharCode.apply(String,t);var r="",n=0;for(;nthis.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return A(this,e,r);case"ascii":return C(this,e,r);case"latin1":case"binary":return z(this,e,r);case"base64":return E(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return I(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},u.prototype.equals=function(t){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===u.compare(this,t)},u.prototype.inspect=function(){var t="",r=e.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},u.prototype.compare=function(t,e,r,n,i){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,n>>>=0,i>>>=0,this===t)return 0;for(var a=i-n,s=r-e,o=Math.min(a,s),l=this.slice(n,i),h=t.slice(e,r),f=0;fi)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return v(this,t,e,r);case"utf8":case"utf-8":return b(this,t,e,r);case"ascii":return y(this,t,e,r);case"latin1":case"binary":return w(this,t,e,r);case"base64":return k(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return x(this,t,e,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function C(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",a=e;ar)throw new RangeError("Trying to access beyond buffer length")}function B(t,e,r,n,i,a){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function O(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,a=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function P(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,a=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function D(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function U(t,e,r,n,a){return a||D(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function F(t,e,r,n,a){return a||D(t,0,r,8),i.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){var r,n=this.length;if(t=~~t,e=void 0===e?n:~~e,t<0?(t+=n)<0&&(t=0):t>n&&(t=n),e<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(i*=256);)n+=this[t+--e]*i;return n},u.prototype.readUInt8=function(t,e){return e||R(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||R(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||R(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||R(t,e,this.length);for(var n=this[t],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||R(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},u.prototype.readInt8=function(t,e){return e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||R(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){e||R(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||R(t,4,this.length),i.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||R(t,4,this.length),i.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||R(t,8,this.length),i.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||R(t,8,this.length),i.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a=0&&(a*=256);)this[e+i]=t/a&255;return e+r},u.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):O(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):O(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):P(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=0,s=1,o=0;for(this[e]=255&t;++a>0)-o&255;return e+r},u.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=r-1,s=1,o=0;for(this[e+a]=255&t;--a>=0&&(s*=256);)t<0&&0===o&&0!==this[e+a+1]&&(o=1),this[e+a]=(t/s>>0)-o&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):O(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):O(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):P(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,r){return U(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return U(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return F(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return F(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(a=e;a55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function j(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(L,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Z(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}}).call(e,r(0))},function(t,e,r){"use strict";e.byteLength=function(t){var e=l(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,n=l(t),s=n[0],o=n[1],u=new a(function(t,e,r){return 3*(e+r)/4-r}(0,s,o)),h=0,f=o>0?s-4:s;for(r=0;r>16&255,u[h++]=e>>8&255,u[h++]=255&e;2===o&&(e=i[t.charCodeAt(r)]<<2|i[t.charCodeAt(r+1)]>>4,u[h++]=255&e);1===o&&(e=i[t.charCodeAt(r)]<<10|i[t.charCodeAt(r+1)]<<4|i[t.charCodeAt(r+2)]>>2,u[h++]=e>>8&255,u[h++]=255&e);return u},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,a=[],s=0,o=r-i;so?o:s+16383));1===i?(e=t[r-1],a.push(n[e>>2]+n[e<<4&63]+"==")):2===i&&(e=(t[r-2]<<8)+t[r-1],a.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"="));return a.join("")};for(var n=[],i=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,u=s.length;o0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function h(t){return n[t>>18&63]+n[t>>12&63]+n[t>>6&63]+n[63&t]}function f(t,e,r){for(var n,i=[],a=e;a>1,h=-7,f=r?i-1:0,c=r?-1:1,d=t[e+f];for(f+=c,a=d&(1<<-h)-1,d>>=-h,h+=o;h>0;a=256*a+t[e+f],f+=c,h-=8);for(s=a&(1<<-h)-1,a>>=-h,h+=n;h>0;s=256*s+t[e+f],f+=c,h-=8);if(0===a)a=1-l;else{if(a===u)return s?NaN:1/0*(d?-1:1);s+=Math.pow(2,n),a-=l}return(d?-1:1)*s*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var s,o,u,l=8*a-i-1,h=(1<>1,c=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:a-1,p=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,s=h):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?c/u:c*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=h?(o=0,s=h):s+f>=1?(o=(e*u-1)*Math.pow(2,i),s+=f):(o=e*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;t[r+d]=255&o,d+=p,o/=256,i-=8);for(s=s<0;t[r+d]=255&s,d+=p,s/=256,l-=8);t[r+d-p]|=128*m}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},function(t,e,r){(function(t){var n=void 0!==t&&t||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function a(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new a(i.call(setTimeout,n,arguments),clearTimeout)},e.setInterval=function(){return new a(i.call(setInterval,n,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(n,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},r(9),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(e,r(0))},function(t,e,r){(function(t,e){!function(t,r){"use strict";if(!t.setImmediate){var n,i=1,a={},s=!1,o=t.document,u=Object.getPrototypeOf&&Object.getPrototypeOf(t);u=u&&u.setTimeout?u:t,"[object process]"==={}.toString.call(t.process)?n=function(t){e.nextTick(function(){h(t)})}:function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=r,e}}()?function(){var e="setImmediate$"+Math.random()+"$",r=function(r){r.source===t&&"string"==typeof r.data&&0===r.data.indexOf(e)&&h(+r.data.slice(e.length))};t.addEventListener?t.addEventListener("message",r,!1):t.attachEvent("onmessage",r),n=function(r){t.postMessage(e+r,"*")}}():t.MessageChannel?function(){var t=new MessageChannel;t.port1.onmessage=function(t){h(t.data)},n=function(e){t.port2.postMessage(e)}}():o&&"onreadystatechange"in o.createElement("script")?function(){var t=o.documentElement;n=function(e){var r=o.createElement("script");r.onreadystatechange=function(){h(e),r.onreadystatechange=null,t.removeChild(r),r=null},t.appendChild(r)}}():n=function(t){setTimeout(h,0,t)},u.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),r=0;r1)for(var r=1;rnull))=>{$('`) function idToTitle(string) { let str = ''; const stringLength = string.length for (let i = 0; i < stringLength; i++) { const c = i == 0 ? string[i].toUpperCase(): string[i]; if (c.match(/[_\-\ ]/)) { i++; str += ' ' + (string[i] ?? '').toUpperCase(); continue; } else if (c.match(/\d/) && string[i - 1]?.match?.(/\D/)) { str += ' #'; } str += c; } return str; } /* Types */ const drawOpts = { // texture coordinates x: 0, y: 0, // texture coordinates px: 0, py: 0, /** @type {MouseEvent} */ event: null, // local localX: 0, localY: 0, // local. relative to the 'origin' gridX: 0, gridY: 0, // local. between [0-1] uvX: 0, uvY: 0, } /* API */ class BrushViewerOption { constructor(data) { this.id = data.id; this.src = data.src; this.condition = data.condition; this.node = Interface.createElement('div', {class: 'bvoption'}); this.node.title = idToTitle(this.id); this.image = new Image(); this.image.src = this.src; this.image.draggable = false; this.node.append(this.image); } select() { this.node.classList.add('selected'); } unselect() { this.node.classList.remove('selected'); } } const BrushViewer = { /** @type {BrushViewerOption[]} */ children: null, node: Interface.createElement('div', {class: 'brushviewer'}), optionsnode: Interface.createElement('div', {class: 'bvoptions'}), value: null, init() { this.children = Object.keys(Brushes).map(id => Brushes[id].brushview); this.node.append( Interface.createElement('p', {class: 'panel_toolbar_label'}, 'Tool Shape'), this.optionsnode ); this.val(this.children[0]); this.build(); }, val(item) { const selected = this.children.find(e => e.id === this.value); if (!item) return selected; selected?.unselect(); item.select() this.value = item.id; }, build() { this.optionsnode.innerText = ''; this.children.forEach(child => { child.node.onclick = () => { this.val(child); } this.optionsnode.append(child.node); }) }, add(item) { this.children.push(item); this.build(); this.val(this.children[0]); }, remove(key) { this.children.remove(this.children.find(e => e.id == key)); this.build(); this.val(this.children[0]); } } const MTMath = { rotatePoint(point, theta) { const x = point[0] * Math.cos(theta) - point[1] * Math.sin(theta); const y = point[0] * Math.sin(theta) + point[1] * Math.cos(theta); return [x, y]; }, rotatePointAroundTarget(point, target, theta) { let newPoint = point.map((a, i) => a - target[i]); newPoint = MTMath.rotatePoint(newPoint, theta); return newPoint.map((a, i) => a + target[i]); } } const dummyCanvas = document.createElement('canvas'); const dummyCtx = dummyCanvas.getContext('2d'); /** @type {{[id: string]: Brush}}*/ const Brushes = {} class Brush { constructor(data) { Brushes[data.id] = this; this.icon = data.icon; this.id = data.id; this.custom = data.custom; this.brushview = new BrushViewerOption({ id: this.id, src: this.icon }) this.brushview.node.title += ' - ' + this.constructor.name.replace('Brush', ' Based'); this.brushview.node.setAttribute('flag', this.constructor.flag) } /** * @param {typeof drawOpts} data * @returns {Number} */ get(data) { return 1; } } class MathBrush extends Brush { static flag = "functions"; constructor(data) { super(data); this.func = data.func; } /** * @param {typeof drawOpts} data * @returns {Number} */ get(data) { return this.func(data); } } class ImageBrush extends Brush { static flag = "image"; constructor(data) { super(data); this.image = new Image(); /** @type {Uint8ClampedArray} */ this.data = null; this.image.onload = () => { dummyCanvas.width = this.width; dummyCanvas.height = this.height; dummyCtx.drawImage(this.image, 0, 0, this.width, this.height); this.data = dummyCtx.getImageData(0,0, this.width, this.height).data; if (!data.save) return; this.custom = true; const base64 = dummyCanvas.toDataURL(); addBrush(this.id, base64); BrushViewer.add(this.brushview) } this.image.src = this.icon; } get width() { return Math.clamp(this.image.width, 0, 50); } get height() { return Math.clamp(this.image.height, 0, 50); } /** * @param {typeof drawOpts} data * @returns {Number} */ get({uvX, uvY}) { if (uvX < 0 || uvX > 1 || uvY < 0 || uvY > 1) return 0; const x = Math.floor(uvX * this.width); const y = Math.floor(uvY * this.height); const i = (x + y * this.width) * 4; const r = this.data[i + 0]; const g = this.data[i + 1]; const b = this.data[i + 2]; const a = this.data[i + 3]; const luminance = (0.2126*r + 0.7152*g + 0.0722*b) / 255; return luminance * (a / 255); } } /** @type {{[id: string]: Dynamic}}*/ const Dynamics = {} class Dynamic { /** * @param {String} id * @param {{ * onBefore: (data: typeof drawOpts) => void, * onAfter: (result_color: {a: number}, data: typeof drawOpts) => void, * settings: Object, * description: string, * }} data */ constructor(id, data) { Dynamics[id] = this; this.id = id; this.settings = data.settings; this.description = data.description; this.onBefore = data.onBefore; this.onAfter = data.onAfter; } get(settingKey) { return this.settings[settingKey][0]; } } // const radify = r => (r + TWO_PI) % TWO_PI; const diff = (a,b) => Math.abs(a - b); ;(function() { let rotation = 0; let lastEvent, lastPos; new Dynamic('follow_rotation', { description: 'Rotates The Brush following the cursor', onBefore(data) { if (lastEvent != data.event && lastPos) { const direction = [data.x, data.y].V2_subtract(lastPos); const facArcPart = Math.atan2(direction[0], direction[1]) + PI; const oppArcPart = TWO_PI - facArcPart; const closest = diff(facArcPart, rotation) < diff(oppArcPart, rotation) ? facArcPart: oppArcPart; rotation = closest; } lastEvent = data.event; lastPos = [data.x, data.y]; const p = [data.px, data.py]; const t = [data.x, data.y]; const newp = MTMath.rotatePointAroundTarget(p, t, rotation); data.px = Math.floor(newp[0]); data.py = Math.floor(newp[1]); } }) })(); ;(function() { let lastrotation = 0; let lastEvent; new Dynamic('randomized_rotation', { description: 'Rotates The Brush randomly', onBefore(data) { if (lastEvent != data.event) { lastrotation = floorTo(Math.random() * PI * 2, QUARTER_NINETY_DEGREES); } lastEvent = data.event; const p = [data.px, data.py]; const t = [data.x, data.y]; const newp = MTMath.rotatePointAroundTarget(p, t, lastrotation); data.px = Math.floor(newp[0]); data.py = Math.floor(newp[1]); } }) })(); new Dynamic('velocity_opacity', { description: 'Transparentizes Color based on movement velocity', settings: { minimum_opacity: [30, 0, 100], maximum_opacity: [100, 1, 100], }, onAfter(result, {event}) { result.a *= eventVelocity(event, 30, this.get('minimum_opacity')/100, this.get('maximum_opacity')/100); } }) new Dynamic('velocity_tapering', { description: 'Tapers The Stroke based on movement velocity', settings: { minimum_tapering: [10, 0, 100], maximum_tapering: [100, 1, 100], }, onAfter(result, {event, uvX, uvY}) { const factor = (0.9 - (eventVelocity(event, 25, this.get('minimum_tapering')/100, this.get('maximum_tapering')/100) - .1)) + .1; const radialFactor = Math.sqrt(radialGrad(uvX, uvY)) / Math.SQRT2; result.a = radialFactor < factor ? result.a: 0; } }) let lastStrokeStartEvent; ;(function() { let lastEvent, lastStrokeEvent; let indexOfSharpening = 1; new Dynamic('sharpen_start', { description: 'Sharpens The Stroke at its tail', settings: { sharpen_length: [25, 10, 100], }, onAfter(result, {event, uvX, uvY}) { if (lastEvent != event) { if (lastStrokeEvent != lastStrokeStartEvent) indexOfSharpening = 1; else if (indexOfSharpening < this.get('sharpen_length')) indexOfSharpening ++; } const factor = indexOfSharpening / this.get('sharpen_length'); const radialFactor = Math.sqrt(radialGrad(uvX, uvY)) / Math.SQRT2; result.a = radialFactor < factor ? result.a: 0; lastStrokeEvent = lastStrokeStartEvent; lastEvent = event; } }) })(); ;(function() { let lastEvent, lastStrokeEvent; let indexOfFading = 1; new Dynamic('fade_start', { description: 'fades The Stroke at its tail', settings: { fading_length: [25, 10, 250], }, onAfter(result, {event, uvX, uvY}) { if (lastEvent != event) { if (lastStrokeEvent != lastStrokeStartEvent) indexOfFading = 1; else if (indexOfFading < this.get('fading_length')) indexOfFading ++; } result.a *= indexOfFading / this.get('fading_length'); lastStrokeEvent = lastStrokeStartEvent; lastEvent = event; } }) })(); /* https://easings.net/#easeInOutSine */ function easeInOutSine(x) { return -0.5*Math.cos(PI * x) + 0.5; } const eventVelocity = (e, scalar = 30, min = 0, max = 0.9) => { const velocity = Math.sqrt(e.movementX**2 + e.movementY**2); return easeInOutSine(Math.clamp(velocity / scalar, min, max)); } const radialGrad = (x , y) => { Reusable.vec1.set(x, y, 0); Reusable.vec2.set(0.5, 0.5, 0); return Reusable.vec1.distanceToSquared(Reusable.vec2); } function floorTo(x, factor) { return Math.floor(x / factor) * factor; } new MathBrush({ id: 'circle', icon: "data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50' cy='50' r='50' fill='white' /%3E%3C/svg%3E", func: ({uvX, uvY}) => Math.sqrt(radialGrad(uvX, uvY)) >= .5 ? 0: 1 }) new MathBrush({ id: 'circle_outline', icon: "data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50' cy='50' r='46' fill='transparent' stroke-width='4px' stroke='white' /%3E%3C/svg%3E", func({uvX, uvY}) { const v = Math.sqrt(radialGrad(uvX, uvY)); return v >= .3 && v < .5 ? 1 : 0; } }) new MathBrush({ id: 'square', icon: "data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100' height='100' fill='white' /%3E%3C/svg%3E", func: ({uvX, uvY}) => uvX >= 0 && uvX <= 1 && uvY >= 0 && uvY <= 1 ? 1: 0 }) new MathBrush({ id: 'line', icon: "data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 0 50 l 100 0' stroke-width='4px' stroke='white' /%3E%3C/svg%3E", func: ({localY}) => localY == 0 || Math.abs(localY) == 0.5 }) new MathBrush({ id: 'line2', icon: "data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 50 0 l 0 100' stroke-width='4px' stroke='white' /%3E%3C/svg%3E", func: ({localX}) => localX == 0 || Math.abs(localX) == 0.5 }) new MathBrush({ id: 'line3', icon: "data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 0 0 l 100 100' stroke-width='4px' stroke='white' /%3E%3C/svg%3E", func: ({localX, localY}) => localX == localY }) new MathBrush({ id: 'line4', icon: "data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 0 100 l 100 -100' stroke-width='4px' stroke='white' /%3E%3C/svg%3E", func: ({localX, localY}) => -localX == localY }) new ImageBrush({ id: 'benchblock', // my favorite 😘 icon: 'assets/logo_cutout.svg' }) new ImageBrush({ id: 'choak', icon: 'data:image/png;base64,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' }) new ImageBrush({ id: 'bristles', icon: 'data:image/png;base64,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' }) new ImageBrush({ id: 'marker', icon: 'data:image/png;base64,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' }) const save = JSON.parse(localStorage.getItem('brp_settings') ?? '{}'); const savedata = save; function saveItem(name, value) { if (name) { savedata[name] = value; } localStorage.setItem('brp_settings', JSON.stringify(savedata)); } const requestStorage = ({success = null, fail = null}) => { const request = indexedDB.open("brush_plus_settings", 2); request.onerror = fail; request.onblocked = fail; request.onupgradeneeded = () => { const brushDB = request.result; if (!brushDB.objectStoreNames.contains('data')) { brushDB.createObjectStore('data', {keyPath: 'id'}); } } request.onsuccess = () => { if (!success) return; const brushDB = request.result; const transaction = brushDB.transaction("data", "readwrite"); const data = transaction.objectStore("data"); success(data); } } // Load Brushes requestStorage({ fail: console.warn, async success(data) { if (savedata.brushes) { // migration from localStorage to indexedDB for (const brushId in savedata.brushes) { let brushData = savedata.brushes[brushId]; if (isApp && !brushData.startsWith('data:image/')) { brushData = `data:image/${pathToExtension(brushData)};base64,` + fs.readFileSync(brushData, {encoding: 'base64'}); } await addBrush(brushId, brushData); } delete savedata.brushes; saveItem(); } const allBrushes = data.getAll(); allBrushes.onsuccess = () => allBrushes.result.forEach(datapoint => BrushViewer.add( new ImageBrush({...datapoint, custom: true}).brushview )); allBrushes.onerror = () => Blockbench.showMessageBox('Failed to load saved brushes!'); } }); const addBrush = (id, icon) => new Promise((resolve, reject) => requestStorage({ fail: reject, success(data) { const addRequest = data.add({id, icon}); addRequest.onsuccess = resolve; addRequest.onerror = reject; } })); const deleteBrush = (id) => new Promise((resolve, reject) => requestStorage({ fail: reject, success(data) { const addRequest = data.delete(id); addRequest.onsuccess = resolve; addRequest.onerror = reject; } })); const DynamicsCheckList = { structure: Object.entries(Dynamics), checked: [], node: Interface.createElement('div', { class: 'checklist' }), build() { this.structure.forEach(([key, dynamic]) => { const id = bbuid(6); const inode = Interface.createElement('div'); const checkbox = Interface.createElement('input', {id, type:'checkbox'}); inode.append( checkbox, Interface.createElement('label', {for: id, title: dynamic.description}, idToTitle(key)) ); if (dynamic.settings) { const editButton = Blockbench.getIconNode('edit'); const form = {} for (const settingKey in dynamic.settings) { const setting = dynamic.settings[settingKey]; form[settingKey] = {label: idToTitle(settingKey), type: Blockbench.isNewerThan('4.5.0-beta.1') ? 'range': 'number', value: setting[0]}; if (1 in setting) form[settingKey].min = setting[1]; if (2 in setting) form[settingKey].max = setting[2]; } const editDialog = new Dialog({ title: 'Edit Dynamic Settings', form, onConfirm(formData) { for (const settingKey in formData) { const newSettingValue = formData[settingKey]; dynamic.settings[settingKey][0] = newSettingValue; } } }) editButton.addEventListener('click', () => editDialog.show()) inode.append(editButton); } inode.addEventListener('input', () => { if (checkbox.checked) { this.checked.safePush(key); } else { this.checked.remove(key); } }) this.node.append(inode); }) } } DynamicsCheckList.build(); BrushViewer.init() /** * @param {String} message * @throws {Error} */ const showErrorInDialog = message => { Blockbench.showQuickMessage(message, 2000); throw new Error(message) } let brushp; BBPlugin.register('brush', { title: "Brush Plus", icon: "fa-brush", author: "Malik12tree", description: "Create/Use custom brushes with dynamic behavior!", version: "1.0.1", min_version: "4.4.0", variant: "both", tags: ["Paint", "Customization", "Interface"], onload() { Panels?.mtbrush_settings?.delete(); /* Utils */ const settingsMap = { size: BarItems.slider_brush_size, opacity: BarItems.slider_brush_opacity, softness: BarItems.slider_brush_softness, aspect: (save.aspect ?? 100) / 100, spacing: (save.spacing ?? 0) / 10, preservePixels: save.preservePixels ?? false, get brush() { return Brushes[BrushViewer.value]; } } /** * @param {keyof settingsMap} name */ function setting(name) { return settingsMap[name]?.value ?? settingsMap[name] ?? 0; } /* */ const customBrushDialog = new Dialog({ title: 'Custom Brush', form: { name: { type: 'text', label: 'Name', value: 'New Brush', }, file: { type: 'file', extensions: ['png', 'jpg', 'jpeg', 'bmp', 'tiff', 'tif', 'gif'], label: "Texture", readtype: "image", }, }, lines: ['Blockbench\'s maximum brush size is 50 meaning images with dimensions greater than 50x50 would lose detail.
Black/Transparent -> White/Opaque represents base opacity of the brush.
'], form_first: true, onConfirm({file, name}) { if (!name || name in Brushes) { showErrorInDialog('Please provide a unique name!'); } else if (!file) { showErrorInDialog('Please provide an image file!'); } BrushViewer.add( new ImageBrush({ id: name, icon: file, save: true }).brushview ); } }) new Panel ({ id: 'mtbrush_settings', name: 'Brush Settings', icon: 'fa-brush', condition: { modes: ['paint'], /* method: () => Toolbars.tools.selected && Toolbars.tools.selected.id == 'brushplus' */ }, default_position: { slot: 'right_bar', float_position: [0, 0], float_size: [300, 400], height: 400, }, component: { methods: { setAspect(event) { const x = event.target.value; this.aspect = x; settingsMap.aspect = x / 100; saveItem('aspect', x); }, setSpacing(event) { const x = event.target.value; this.spacing = x; settingsMap.spacing = 0.1 * x; saveItem('spacing', x); }, setPreservePixels(event) { const x = event.target.checked; this.preservePixels = x; settingsMap.preservePixels = x; saveItem('preservePixels', x); }, showPreservePixelsInfo() { Blockbench.showMessageBox({ title: 'Preserve Pixels ?', message: 'When enabled, overlapping pixels of opacity in the same stroke remain intact; resulting in a flat stroke color.
Blockbench\'s default brush uses this behavior.', }); }, addCustomBrush() { customBrushDialog.show(); }, removeCustomBrush() { const selected = BrushViewer.value; if (!Brushes[selected].custom) return; deleteBrush(selected) .then(() => { BrushViewer.remove(selected); BrushViewer.remove(selected); delete Brushes[selected]; Blockbench.showQuickMessage(`Succesfully removed '${selected}'!`, 2000) }) .catch(() => Blockbench.showQuickMessage('Failed to remove brush!', 2000)); } }, data() { return { aspect: save.aspect ?? 100, spacing: save.spacing ?? 0, preservePixels: save.preservePixels ?? false, } }, template: `
Add Custom Brush
Remove Custom Brush

Aspect

Spacing


Dynamics
` } }); $(BrushViewer.node).insertBefore(document.getElementById('mt-brushshape-target')); Panels.mtbrush_settings.node.querySelector('details').append(DynamicsCheckList.node); /* Intalized on load for better performness */ const drawOptions = { x: 0, y: 0, px: 0, py: 0, event: null, // Changable in dynamics // Calculated once on `Brush.get` if the paramater was destructed. get localX() { return this.px - this.x }, get localY() { return this.py - this.y }, get gridX() { return this.localX + this.radius }, get gridY() { return this.localY + this.radius }, get uvX() { return this.gridX / this.size }, get uvY() { return this.gridY / this.size }, size: 0, radius: 0, } const pointBefore = {x: 0, y: 0, z: 0} brushp?.delete?.(); const resultHolder = {a: 0} brushp = new Tool('brushplus', { name: 'Brush Plus', icon: 'fa-brush', category: 'tools', toolbar: 'brush', alt_tool: 'color_picker', cursor: 'crosshair', selectFace: true, transformerMode: 'hidden', paintTool: true, allowed_view_modes: ['textured'], keybind: new Keybind({key: 'b', shift: true}), modes: ['paint'], onCanvasClick(data) { Painter.startPaintToolCanvas(data, data.event); }, onSelect() { BarItems.brush_shape.set('square'); UVEditor.vue.brush_type = 'square'; Painter.updateNslideValues(); }, brush: { blend_modes: false, shapes: false, size: true, softness: true, opacity: true, offset_even_radius: true, floor_coordinates: true, //() => BarItems.slider_brush_softness.get() == 0, onStrokeStart(data) { lastStrokeStartEvent = data.event; pointBefore.x = mouse_pos.x; pointBefore.y = mouse_pos.y; }, changePixel(px, py, pxcolor, local_opacity, {color, texture, opacity, x, y, event}) { /* Aspect */ const height = setting('size') * setting('aspect'); const alocalY = Math.abs(py - y); if (alocalY * 2 > height) return pxcolor; /* Spacing */ const { vec1 } = Reusable; vec1.set(event.offsetX, event.offsetY, 0); const spacing = setting('spacing') * setting('size') ; const dstToBefore = vec1.distanceToSquared(pointBefore); if (dstToBefore != 0 && dstToBefore < spacing*spacing) return pxcolor; pointBefore.x = event.offsetX; pointBefore.y = event.offsetY; /* */ const size = setting('size'); const radius = size / 2; if (size % 2 == 0) { x -= 0.5; y -= 0.5; } drawOptions.x = x; drawOptions.y = y; drawOptions.px = px; drawOptions.py = py; drawOptions.event = event; drawOptions.size = size; drawOptions.radius = radius; DynamicsCheckList.checked.forEach(dynamic => Dynamics[dynamic]?.onBefore?.(drawOptions)); /* Apply Before Dynamics */ const brushfactor = setting('brush').get(drawOptions); let a = opacity * local_opacity * brushfactor; resultHolder.a = a; DynamicsCheckList.checked.forEach(dynamic => Dynamics[dynamic]?.onAfter?.(resultHolder, drawOptions)); /* Apply After Dynamics */ a = resultHolder.a; if (setting('preservePixels')) { let before = Painter.getAlphaMatrix(texture, px, py); Painter.setAlphaMatrix(texture, px, py, a); if (a > before) { a = (a - before) / (1 - before); } else if (before) { a = 0; } } if (!isFinite(a)) a = 0; const result_color = Painter.combineColors(pxcolor, color, a); if (Painter.lock_alpha) result_color.a = pxcolor.a; return result_color; } } }); Toolbars.tools.add(brushp); }, onunload(){ Panels?.mtbrush_settings?.delete(); brushp?.delete?.(); Toolbars.tools.children.forEach(tool => { if (tool.id === 'brushplus') tool.delete(); }) style.delete(); }, onuninstall() { localStorage.removeItem('brp_settings'); indexedDB.deleteDatabase('brush_plus_settings'); } }); })(); ================================================ FILE: plugins/brush_randomizer.js ================================================ (function () { var button; var options_dialog; var amount = 5; var stroke = false; var original_color; Plugin.register("brush_randomizer", { title: "Brush Color Randomizer", author: "Anniken(YT)", description: "Randomize the Brush Color with each stroke to give your artwork more variation", version: "1.0.0", icon: "brush", variant: "both", onload() { options_dialog = new Dialog("brush_randomizer_options", { title: "Brush Randomizer Options", form: { amount: { type: "number", label: "Amount (percent)", value: amount, step: 1, min: 1, max: 100, }, stroke: { type: "checkbox", label: "Randomize Stroke", value: stroke, }, }, onConfirm: function (values) { amount = values.amount; stroke = values.stroke; rel_to_original = values.rel_to_original; this.hide(); }, }); button = new Action("randomize_brush", { name: "Randomize Brush", icon: "shuffle", id: "randomize_brush", description: "Randomizes the brush color", click: function () { randomize_color(); }, }); options = new Action("randomize_brush_options", { name: "Randomize Brush Options", icon: "settings", id: "randomize_brush_options", description: "Opens Brush Randomizer options", click: function () { options_dialog.show(); }, }); toggle_stroke = new Action("toggle_randomize_brush_stroke", { name: "Toggle Random Brush Stroke", icon: "toggle_off", description: "Toggles randomizing the brush stroke", click: function () { stroke = !stroke; Blockbench.showToastNotification({ text: stroke ? "Toggled randomizing brush stroke on" : "Toggled randomizing brush stroke off", expire: 5000, icon: "info", }); }, }); MenuBar.addAction(toggle_stroke, "filter"); MenuBar.addAction(button, "filter"); MenuBar.addAction(options, "filter"); $(".preview").on("click", function (e) { // if the alt button is pressed, we don't want to randomize the color, instead set it to the original color if (e.altKey) { original_color = ColorPanel.get(); return; } if (stroke) { randomize_color(); } }); $(".sp-val").on("click", (e) => { original_color = ColorPanel.get(); }); function randomize_color() { if (original_color == null) { original_color = ColorPanel.get(); Blockbench.showToastNotification({ text: "Original color was 0, using current", expire: 5000, icon: "info", }); } var curr_color = original_color; var new_color = LightenDarkenColor( curr_color, getRandomArbitrary(amount * -1, amount) ); ColorPanel.set(new_color); } }, onunload() { button.delete(); options.delete(); toggle_stroke.delete(); $(".preview").off("click"); $(".sp-val").off("click"); }, }); })(); function LightenDarkenColor(col, percent) { var num = parseInt(col.replace("#", ""), 16), amt = Math.round(2.55 * percent), R = (num >> 16) + amt, B = ((num >> 8) & 0x00ff) + amt, G = (num & 0x0000ff) + amt; return ( "#" + ( 0x1000000 + (R < 255 ? (R < 1 ? 0 : R) : 255) * 0x10000 + (B < 255 ? (B < 1 ? 0 : B) : 255) * 0x100 + (G < 255 ? (G < 1 ? 0 : G) : 255) ) .toString(16) .slice(1) ); } function getRandomArbitrary(min, max) { return Math.random() * (max - min) + min; } ================================================ FILE: plugins/brush_tuna/about.md ================================================

About Brush Tuna

Brush Tuna overhauls the Brush Presets system, providing an improved interface, and several new features.

Features

  • Per-preset pen pressure configuration
  • Customizable pen pressure curves
  • Keybinds for quickly switching between presets using [ and ]
  • Improved preset list in Brush Presets menu
================================================ FILE: plugins/brush_tuna/brush_tuna.js ================================================ //?? ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ //?? │ [ brush_tuna v1.0.6 ] │ //?? │ │ //?? │ Brush Tuna overhauls the Brush Presets system, providing an improved interface, and several new features. │ //?? │ │ //?? │ Created by SnaveSutit & Embody Games │ //?? │ (snavesutit@gmail.com) [https://snavesutit.github.io/] │ //?? │ │ //?? │ [ SOURCE ] │ //?? │ https://github.com/SnaveSutit/brush-tuna │ //?? │ │ //?? │ [ LICENSE ] │ //?? │ MIT License │ //?? │ │ //?? │ Copyright (c) 2022 SnaveSutit │ //?? │ │ //?? │ 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. │ //?? │ │ //?? ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯ "use strict";(()=>{var af=Object.create;var Ln=Object.defineProperty;var lf=Object.getOwnPropertyDescriptor;var cf=Object.getOwnPropertyNames;var uf=Object.getPrototypeOf,ff=Object.prototype.hasOwnProperty;var df=(e,t,r)=>t in e?Ln(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var i=(e,t)=>Ln(e,"name",{value:t,configurable:!0});var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var Wt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),pf=(e,t)=>{for(var r in t)Ln(e,r,{get:t[r],enumerable:!0})},Va=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of cf(t))!ff.call(e,o)&&o!==r&&Ln(e,o,{get:()=>t[o],enumerable:!(n=lf(t,o))||n.enumerable});return e};var gs=(e,t,r)=>(r=e!=null?af(uf(e)):{},Va(t||!e||!e.__esModule?Ln(r,"default",{value:e,enumerable:!0}):r,e)),Ha=e=>Va(Ln({},"__esModule",{value:!0}),e);var ai=(e,t,r)=>(df(e,typeof t!="symbol"?t+"":t,r),r),bs=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)};var Tr=(e,t,r)=>(bs(e,t,"read from private field"),r?r.call(e):t.get(e)),fo=(e,t,r)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,r)},$s=(e,t,r,n)=>(bs(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);var za=(e,t,r)=>(bs(e,t,"access private method"),r);var c=w(()=>{"use strict"});var ys=Wt(Ft=>{"use strict";c();Object.defineProperty(Ft,"__esModule",{value:!0});Ft.prettyWarn=Ft.prettyError=Ft.prettyGroup=Ft.prettyGroupCollapsed=Ft.prettyLog=void 0;var _f="%c[%cBlockbench Patch Manager%c]%c ",hf=["color: #aaaaaa","color: #00aced;","color: #aaaaaa","color: white"];function po(e){return(t,r=!0)=>{let n=(r?_f:"")+"%c"+Object.keys(t).join("%c"),o=[...r?hf:[],...Object.values(t)];e(n,...o)}}i(po,"prettyLogFactory");Ft.prettyLog=po(console.log);Ft.prettyGroupCollapsed=po(console.groupCollapsed);Ft.prettyGroup=po(console.group);Ft.prettyError=po(console.error);Ft.prettyWarn=po(console.warn)});var xs=Wt(Fn=>{"use strict";c();Object.defineProperty(Fn,"__esModule",{value:!0});Fn.ERROR_MESSAGE=void 0;Fn.subscribable=Ua;var _o;(function(e){e.RecursivePublish="Subscribable callbacks cannot publish to the same subscribable, ignoring nested publish.",e.InvalidCount="Count must be a positive number.",e.NonIntegerCount="Count must be an integer."})(_o||(Fn.ERROR_MESSAGE=_o={}));function Ua(){let e=new Set,t=!1,r=i((l,f=!1)=>{let _={callback:l,once:f};return e.add(_),()=>e.delete(_)},"subscribe");return{subscribe:r,subscribeOnce:l=>r(l,!0),publish:i(l=>{if(t)throw new Error(_o.RecursivePublish);t=!0;try{for(let f of e)f.callback(l),f.once&&e.delete(f)}finally{t=!1}},"publish"),unsubscribe:i((l,f=1/0)=>{if(f<=0)throw new Error(_o.InvalidCount);if(Number.isFinite(f)&&!Number.isInteger(f))throw new Error(_o.NonIntegerCount);let _=0;for(let p of e)if(p.callback===l&&(e.delete(p),++_>=f))return!0;return _>0},"unsubscribe"),unsubscribeAll:()=>e.clear(),has:i(l=>{for(let f of e)if(f.callback===l)return!0;return!1},"has"),count:i(l=>{let f=0;for(let _ of e)_.callback===l&&f++;return f},"count"),get subscriberCount(){return e.size}}}i(Ua,"subscribable");Fn.default=Ua});var Ga=Wt(Yn=>{"use strict";c();Object.defineProperty(Yn,"__esModule",{value:!0});Yn.PatchRevertError=Yn.PatchApplyError=void 0;var li=class extends Error{constructor(t,r){super(`'${t}' failed to apply: ${r.message}`+(r.stack?` `+r.stack:""))}};i(li,"PatchApplyError");Yn.PatchApplyError=li;var ci=class extends Error{constructor(t,r){super(`'${t}' failed to revert: ${r.message}`+(r.stack?` `+r.stack:""))}};i(ci,"PatchRevertError");Yn.PatchRevertError=ci});var ws=Wt(kr=>{"use strict";c();var vf=kr&&kr.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(kr,"__esModule",{value:!0});kr.registerPatch=ho;kr.registerProjectPatch=mf;kr.registerPluginPatch=gf;kr.registerDeletableHandlerPatch=bf;kr.registerPropertyOverridePatch=$f;Es();var Xa=vf(xs()),Ka=Ga(),jn=ys();function ho(e){if(!BlockbenchPatchManager.validatePatchId(e.id))throw new Error(`Failed to register patch with invalid ID '${e.id}'. See previous warnings for more details.`);let t,r=!1,n={id:e.id,dependencies:e.dependencies,priority:e.priority??0,enabled:!0,isApplied(){return r},apply(){if(this.enabled){(0,jn.prettyLog)({"Applying ":"color: #55ff55;",[e.id]:"color: #ffff55;"});try{if(r)throw new Error(`Attempted to apply '${e.id}' while it was already applied.`);t=e.apply(),r=!0}catch(o){throw new Ka.PatchApplyError(e.id,o)}}},revert(){if(!(!this.enabled&&!r)){(0,jn.prettyLog)({"Reverting ":"color: #ff5555;",[e.id]:"color: #ffff55;"});try{if(!r)throw new Error(`Attempted to revert '${e.id}' before it was applied.`);e.revert(t),r=!1}catch(o){throw new Ka.PatchRevertError(e.id,o)}}}};return BlockbenchPatchManager.addPatch(n),n}i(ho,"registerPatch");function mf(e){let t=null,r;e.alwaysRevertOnProjectChange??=!1;let n=!1,o=i(a=>{n||Condition(e.condition,{project:a})&&((0,jn.prettyLog)({"Applying project patch ":"color: #55ff55;",[e.id]:"color: #ffff55;"}),t=e.apply(),n=!0)},"onPreSelectProject"),s=i(()=>{n&&((0,jn.prettyLog)({"Reverting project patch ":"color: #ff5555;",[e.id]:"color: #ffff55;"}),e.revert(t),t=null,n=!1)},"onUnselectProject");return r=ho({...e,apply:()=>{Blockbench.on("blockbench-patch-manager:pre_select_project",o),Blockbench.on("unselect_project",s)},revert:()=>{Blockbench.removeListener("blockbench-patch-manager:pre_select_project",o),Blockbench.removeListener("unselect_project",s)}}),r}i(mf,"registerProjectPatch");function gf(e){let t,r=i(({plugin:o})=>{Condition(e.condition,o)&&((0,jn.prettyLog)({"Applying plugin patch ":"color: #55ff55;",[e.id]:"color: #ffff55;"}),t=e.apply())},"onLoadedPlugin"),n=i(()=>{t!==void 0&&((0,jn.prettyLog)({"Reverting plugin patch ":"color: #ff5555;",[e.id]:"color: #ffff55;"}),e.revert(t),t=void 0)},"onUnloadedPlugin");return ho({...e,apply:()=>{Blockbench.on("loaded_plugin",r),Blockbench.on("unloaded_plugin",n)},revert:()=>{Blockbench.removeListener("loaded_plugin",r),Blockbench.removeListener("unloaded_plugin",n)}})}i(gf,"registerPluginPatch");function bf(e){let t=null,r=(0,Xa.default)(),n=(0,Xa.default)(),o={get:()=>t,onCreated:r.subscribe,onDeleted:n.subscribe};return ho({...e,apply:()=>(t=e.create(),r.publish(t),t),revert:s=>{s.delete(),t=null,n.publish(s)}}),o}i(bf,"registerDeletableHandlerPatch");function $f(e){if(!e.get&&!e.set)throw new Error("At least one of 'get' or 'set' must be provided in a PropertyOverridePatch.");ho({...e,apply:()=>{if(e.target==null)throw new Error("Cannot override property on undefined object.");let t;try{t=e.target[e.key]}catch{throw new Error(`Failed to get initial value of property '${String(e.key)}' for PropertyOverridePatch ${String(e.id)}.`)}let r=Object.getOwnPropertyDescriptor(e.target,e.key)??{value:t,writable:!0,configurable:!0};if(r.configurable===!1)throw new Error(`Cannot override property '${String(e.key)}' on object because it is not configurable.`);let n={configurable:!0,enumerable:r.enumerable};if(e.get){let o;e.condition&&e.getCondition?o=i(s=>Condition(e.condition,s)&&Condition(e.getCondition,s),"getCondition"):o=e.getCondition??e.condition,o?n.get=function(){return Condition(o,{target:this,value:t})?e.get.call(this,t):t}:n.get=function(){return e.get.call(this,t)}}if(e.set){let o;e.condition&&e.setCondition?o=i(s=>Condition(e.condition,s)&&Condition(e.setCondition,s),"setCondition"):o=e.setCondition??e.condition,o?n.set=function(s){Condition(o,{target:this,value:s})?t=e.set.call(this,s):t=s}:n.set=function(s){t=e.set.call(this,s)}}return Object.defineProperty(e.target,e.key,n),{originalDescriptor:r}},revert:({originalDescriptor:t})=>{Object.defineProperty(e.target,e.key,t)}})}i($f,"registerPropertyOverridePatch")});var Wa=Wt((Rp,yf)=>{yf.exports={name:"blockbench-patch-manager",version:"1.1.0",author:{name:"SnaveSutit",email:"snavesutit@gmail.com",url:"https://snavesutit.github.io"},repository:{type:"git",url:"git+https://github.com/SnaveSutit/blockbench-patch-manager.git"},files:["dist"],main:"./dist/index.js",types:"./dist/index.d.ts",scripts:{build:"tsc",dev:"tsc --watch",prepublishOnly:"bun run build"},exports:{".":{default:"./dist/index.js",types:"./dist/index.d.ts"}},peerDependencies:{typescript:"^5"},dependencies:{"blockbench-types":"^5.1.0-beta.1","simple-subpub":"^1.2.0",svelte:"^5.46.3","svelte-observable-store":"^1.0.1","svelte-preprocess":"^6.0.3","svelte-preprocess-esbuild":"^3.0.1"},devDependencies:{"@types/node":"^25.0.8",esbuild:"^0.27.2","eslint-plugin-check-file":"^3.3.1","eslint-plugin-svelte":"^3.14.0",jiti:"^2.6.1","svelte-eslint-parser":"^1.4.1",typescript:"^5.9.3","typescript-eslint":"^8.53.0"}}});var Es=Wt(ui=>{"use strict";c();var xf=ui&&ui.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ui,"__esModule",{value:!0});var Qt=ys(),wf=ws(),Qa=xf(Wa()),Ts=class{version=Qa.default.version;registered=new Map;installOrder=[];static upgrade(t){t.delete();let r=new Ts;r.installOrder=[...t.installOrder];for(let[n,o]of t.registered)r.registered.set(n,o);return r}constructor(){Blockbench.addListener("loaded_plugin",this.onLoadedPlugin),Blockbench.addListener("unloaded_plugin",this.onUnloadedPlugin),window.BlockbenchPatchManager=this,(0,wf.registerPropertyOverridePatch)({id:"blockbench-patch-manager:event-hook/pre-select-project",priority:-1/0,target:ModelProject.prototype,key:"loadEditorState",get(t){return function(){return Blockbench.dispatchEvent("blockbench-patch-manager:pre_select_project",this),t.apply(this)}}})}delete(){Blockbench.removeListener("loaded_plugin",this.onLoadedPlugin),Blockbench.removeListener("unloaded_plugin",this.onUnloadedPlugin);let t=this.registered.get("blockbench-patch-manager:event-hook/pre-select-project");t?(t.revert(),this.registered.delete(t.id)):(0,Qt.prettyWarn)({["Failed to find event hook patch when deleting PatchManager. This may cause issues if the plugin is reloaded without restarting Blockbench."]:"color: #ff5555;"})}onLoadedPlugin=({plugin:t})=>{(0,Qt.prettyLog)({[`Plugin '${t.name}' loaded, enabling its patches...`]:""}),this.setPluginPatchesEnabled(t,!0),this.updatePatches()};onUnloadedPlugin=({plugin:t})=>{(0,Qt.prettyLog)({[`Plugin '${t.name}' unloaded, disabling its patches...`]:""}),this.setPluginPatchesEnabled(t,!1),this.updatePatches()};addPatch(t){this.registered.has(t.id)&&((0,Qt.prettyWarn)({[`A Patch with the ID '${t.id}' is already registered! The old patch will be overwritten.`]:"color: #ff5555;"}),this.removePatch(t.id)),this.registered.set(t.id,t),this.installOrder.push(t.id),this.updatePatchApplicationOrder()}removePatch(t){let r=this.registered.get(t);if(!r){(0,Qt.prettyWarn)({[`Attempted to remove unknown patch '${t}'!`]:"color: #ff5555;"});return}if(r.isApplied())throw new Error(`Attempted to remove patch '${t}' while it is still applied! This indicates a patch has been improperly managed by a plugin developer.`);this.registered.delete(t);let n=this.installOrder.indexOf(t);n!==-1&&this.installOrder.splice(n,1)}checkPatchDependencies(t){if(t.dependencies===void 0)return!0;for(let r of t.dependencies){let n=this.registered.get(r);if(!n)return(0,Qt.prettyWarn)({[`Patch '${t.id}' depends on unknown patch '${r}'.`]:""}),!1;if(!n.isApplied())throw new Error(`Patch '${t.id}' depends on patch '${r}', but it is not applied. This is a bug!`)}return!0}updatePatches(){(0,Qt.prettyGroupCollapsed)({"Updating Patches...":"color: #aaaaaa;"});try{(0,Qt.prettyLog)({"Reverting patches...":"color: #ff5555; font-weight: bold;"});for(let t of this.installOrder.slice().reverse()){let r=this.registered.get(t);r.isApplied()&&r.revert()}(0,Qt.prettyLog)({"Applying enabled patches...":"color: #55ff55; font-weight: bold;"});for(let t of this.installOrder){let r=this.registered.get(t);if(!r.isApplied()&&r.enabled){if(!this.checkPatchDependencies(r)){(0,Qt.prettyWarn)({[`Skipping patch '${r.id}' due to missing dependencies.`]:""});continue}r.apply()}}}catch(t){throw console.groupEnd(),t}console.groupEnd()}getPatchOwner(t){let[r]=t.split(":");return Plugins.registered[r]}validatePatchId(t){let[r]=t.split(":");return r==="blockbench-patch-manager"||Plugins.registered[r]?!0:((0,Qt.prettyError)({[`Patch '${t}' depends on an unknown plugin '${r}' which is not installed.`]:""}),!1)}setPluginPatchesEnabled(t,r){for(let n of this.registered.values())this.getPatchOwner(n.id)?.id===t.id&&(n.enabled=r)}updatePatchApplicationOrder(){this.installOrder.sort((t,r)=>{let n=this.registered.get(t);return this.registered.get(r).priority-n.priority});for(let t of this.installOrder){let r=this.registered.get(t);if(r.dependencies!==void 0)for(let n of r.dependencies){let o=this.installOrder.indexOf(n);if(o===-1)throw new Error(`Patch '${t}' depends on unknown patch '${n}'`);let s=this.installOrder.indexOf(t);o>s&&(this.installOrder.splice(o,1),this.installOrder.splice(s,0,n))}}}},qr=Ts;i(qr,"PatchManager"),ai(qr,"latestVersion",Qa.default.version);window.BlockbenchPatchManager==null?new qr:VersionUtil.compare(window.BlockbenchPatchManager.version,"<",qr.latestVersion)&&(console.warn(`A newer version of Blockbench Patch Mangager (${qr.latestVersion}) is installed alongside an old version ${window.BlockbenchPatchManager.version}. Attempting to upgrade the old version...`),qr.upgrade(window.BlockbenchPatchManager))});var Ja=Wt(ks=>{"use strict";c();Object.defineProperty(ks,"__esModule",{value:!0});ks.overrideAccessors=Ef;var Za=xs(),vo=Symbol("accessors");function Ef(e){let{target:t,key:r,get:n,set:o,restoreOriginalValue:s=!1}=e;if(n==null&&o==null)throw new TypeError("At least one of get or set callbacks must be provided");if(t==null)throw new TypeError("Target is undefined");let a=t[r],l=Object.getOwnPropertyDescriptor(t,r)??{value:a,writable:!0,configurable:!0};if(l.configurable===!1)throw new Error(`Cannot redefine property: ${String(r)} as it is not configurable`);let f=i(()=>{t[vo]??=new Map;let x={onGet:(0,Za.subscribable)(),onSet:(0,Za.subscribable)()};return t[vo].set(r,x),x},"createEntry"),{onGet:_,onSet:p}=t[vo]?.get(r)??f(),v=t[r],d,b=v;n&&(d=_.subscribe(x=>{b=n.call(t,b,x)}));let y,m=v;o&&(y=p.subscribe(x=>{m=o.call(t,m,x)}));let h={configurable:!0,enumerable:l.enumerable,get(){return b=v,_.publish(v),b},set(x){m=x,p.publish(x),v=m}};try{Object.defineProperty(t,r,h)}catch(x){throw new Error(`Failed to override property: ${String(r)}. ${x instanceof Error?x.message:String(x)}`)}return()=>{d?.(),y?.();try{Object.defineProperty(t,r,l)}catch(C){throw new Error(`Failed to restore original property: ${String(r)}. ${C instanceof Error?C.message:String(C)}`)}s&&(t[r]=a);let x=t[vo];if(x){let C=x.get(r);C?.onGet.subscriberCount===0&&C.onSet.subscriberCount===0&&(x.delete(r),x.size===0&&delete t[vo])}}}i(Ef,"overrideAccessors")});var As=Wt(Vr=>{"use strict";c();var Tf=Vr&&Vr.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),el=Vr&&Vr.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&Tf(t,e,r)};Object.defineProperty(Vr,"__esModule",{value:!0});Es();el(ws(),Vr);el(Ja(),Vr)});var dl=w(()=>{c()});var pl,$,_l=w(()=>{c();pl=globalThis.process?.env?.NODE_ENV,$=pl&&!pl.toLowerCase().startsWith("prod")});var hl=w(()=>{c()});var J=w(()=>{c();dl();_l();hl()});function hi(e){for(var t=0;t{e=n,t=o});return{promise:r,resolve:e,reject:t}}function Rs(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let r=[];for(let n of e)if(r.push(n),r.length===t)break;return r}var _r,vl,Jt,qn,Ps,tt,xt,_i,Ns,ml,cn,Os,Re,ee=w(()=>{c();_r=Array.isArray,vl=Array.prototype.indexOf,Jt=Array.prototype.includes,qn=Array.from,Ps=Object.keys,tt=Object.defineProperty,xt=Object.getOwnPropertyDescriptor,_i=Object.getOwnPropertyDescriptors,Ns=Object.prototype,ml=Array.prototype,cn=Object.getPrototypeOf,Os=Object.isExtensible,Re=i(()=>{},"noop");i(hi,"run_all");i(vi,"deferred");i(Rs,"to_array")});var Ie,go,gl,mi,Is,Ot,Ds,gi,Vn,Yt,X=w(()=>{c();Ie=Symbol("$state"),go=Symbol("legacy props"),gl=Symbol(""),mi=Symbol("proxy path"),Is=Symbol("hmr anchor"),Ot=new(i(class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},"StaleReactionError")),Ds=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml"),gi=1,Vn=3,Yt=8});function bi(e){if($){let t=new Error(`experimental_async_required Cannot use \`${e}(...)\` unless the \`experimental.async\` compiler option is \`true\` https://svelte.dev/e/experimental_async_required`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/experimental_async_required")}function bl(e){if($){let t=new Error(`invariant_violation An invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app \u2014 please open an issue at https://github.com/sveltejs/svelte, citing the following message: "${e}" https://svelte.dev/e/invariant_violation`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/invariant_violation")}function Cr(e){if($){let t=new Error(`lifecycle_outside_component \`${e}(...)\` can only be used during component initialisation https://svelte.dev/e/lifecycle_outside_component`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function $l(){if($){let e=new Error(`missing_context Context was not set in a parent component https://svelte.dev/e/missing_context`);throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/missing_context")}var bo=w(()=>{c();J();i(bi,"experimental_async_required");i(bl,"invariant_violation");i(Cr,"lifecycle_outside_component");i($l,"missing_context")});function xl(){if($){let e=new Error("async_derived_orphan\nCannot create a `$derived(...)` with an `await` expression outside of an effect tree\nhttps://svelte.dev/e/async_derived_orphan");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/async_derived_orphan")}function Ms(){if($){let e=new Error("bind_invalid_checkbox_value\nUsing `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\nhttps://svelte.dev/e/bind_invalid_checkbox_value");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/bind_invalid_checkbox_value")}function wl(){if($){let e=new Error(`derived_references_self A derived value cannot reference itself recursively https://svelte.dev/e/derived_references_self`);throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/derived_references_self")}function Bs(e,t,r){if($){let n=new Error(`each_key_duplicate ${r?`Keyed each block has duplicate key \`${r}\` at indexes ${e} and ${t}`:`Keyed each block has duplicate key at indexes ${e} and ${t}`} https://svelte.dev/e/each_key_duplicate`);throw n.name="Svelte error",n}else throw new Error("https://svelte.dev/e/each_key_duplicate")}function El(e,t,r){if($){let n=new Error(`each_key_volatile Keyed each block has key that is not idempotent \u2014 the key for item at index ${e} was \`${t}\` but is now \`${r}\`. Keys must be the same each time for a given item https://svelte.dev/e/each_key_volatile`);throw n.name="Svelte error",n}else throw new Error("https://svelte.dev/e/each_key_volatile")}function Tl(e){if($){let t=new Error(`effect_in_teardown \`${e}\` cannot be used inside an effect cleanup function https://svelte.dev/e/effect_in_teardown`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/effect_in_teardown")}function kl(){if($){let e=new Error("effect_in_unowned_derived\nEffect cannot be created inside a `$derived` value that was not itself created inside an effect\nhttps://svelte.dev/e/effect_in_unowned_derived");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Al(e){if($){let t=new Error(`effect_orphan \`${e}\` can only be used inside an effect (e.g. during component initialisation) https://svelte.dev/e/effect_orphan`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/effect_orphan")}function Cl(){if($){let e=new Error(`effect_update_depth_exceeded Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state https://svelte.dev/e/effect_update_depth_exceeded`);throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Sl(){if($){let e=new Error(`fork_discarded Cannot commit a fork that was already discarded https://svelte.dev/e/fork_discarded`);throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/fork_discarded")}function Pl(){if($){let e=new Error(`fork_timing Cannot create a fork inside an effect or when state changes are pending https://svelte.dev/e/fork_timing`);throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/fork_timing")}function Nl(){if($){let e=new Error("get_abort_signal_outside_reaction\n`getAbortSignal()` can only be called inside an effect or derived\nhttps://svelte.dev/e/get_abort_signal_outside_reaction");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/get_abort_signal_outside_reaction")}function Ol(e){if($){let t=new Error(`hydratable_missing_but_required Expected to find a hydratable with key \`${e}\` during hydration, but did not. https://svelte.dev/e/hydratable_missing_but_required`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/hydratable_missing_but_required")}function Rl(){if($){let e=new Error(`hydration_failed Failed to hydrate the application https://svelte.dev/e/hydration_failed`);throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/hydration_failed")}function Il(){if($){let e=new Error("invalid_snippet\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\nhttps://svelte.dev/e/invalid_snippet");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/invalid_snippet")}function Ls(e){if($){let t=new Error(`lifecycle_legacy_only \`${e}(...)\` cannot be used in runes mode https://svelte.dev/e/lifecycle_legacy_only`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/lifecycle_legacy_only")}function Dl(e){if($){let t=new Error(`props_invalid_value Cannot do \`bind:${e}={undefined}\` when \`${e}\` has a fallback value https://svelte.dev/e/props_invalid_value`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/props_invalid_value")}function Ml(e){if($){let t=new Error(`rune_outside_svelte The \`${e}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files https://svelte.dev/e/rune_outside_svelte`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/rune_outside_svelte")}function Bl(){if($){let e=new Error("set_context_after_init\n`setContext` must be called when a component first initializes, not in a subsequent effect or after an `await` expression\nhttps://svelte.dev/e/set_context_after_init");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/set_context_after_init")}function Ll(){if($){let e=new Error("state_descriptors_fixed\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\nhttps://svelte.dev/e/state_descriptors_fixed");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Fl(){if($){let e=new Error("state_prototype_fixed\nCannot set prototype of `$state` object\nhttps://svelte.dev/e/state_prototype_fixed");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Yl(){if($){let e=new Error("state_unsafe_mutation\nUpdating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\nhttps://svelte.dev/e/state_unsafe_mutation");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function jl(){if($){let e=new Error("svelte_boundary_reset_onerror\nA `` `reset` function cannot be called while an error is still being handled\nhttps://svelte.dev/e/svelte_boundary_reset_onerror");throw e.name="Svelte error",e}else throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}var Ge=w(()=>{c();J();bo();i(xl,"async_derived_orphan");i(Ms,"bind_invalid_checkbox_value");i(wl,"derived_references_self");i(Bs,"each_key_duplicate");i(El,"each_key_volatile");i(Tl,"effect_in_teardown");i(kl,"effect_in_unowned_derived");i(Al,"effect_orphan");i(Cl,"effect_update_depth_exceeded");i(Sl,"fork_discarded");i(Pl,"fork_timing");i(Nl,"get_abort_signal_outside_reaction");i(Ol,"hydratable_missing_but_required");i(Rl,"hydration_failed");i(Il,"invalid_snippet");i(Ls,"lifecycle_legacy_only");i(Dl,"props_invalid_value");i(Ml,"rune_outside_svelte");i(Bl,"set_context_after_init");i(Ll,"state_descriptors_fixed");i(Fl,"state_prototype_fixed");i(Yl,"state_unsafe_mutation");i(jl,"svelte_boundary_reset_onerror")});var Hn,un,Fs,fn,Sr,me,jt,ql,$i,re=w(()=>{c();Hn="[",un="[!",Fs="[?",fn="]",Sr={},me=Symbol(),jt=Symbol("filename"),ql=Symbol("hmr"),$i="http://www.w3.org/1999/xhtml"});function Vl(e){$?console.warn(`%c[svelte] await_reactivity_loss %cDetected reactivity loss when reading \`${e}\`. This happens when state is read in an async function after an earlier \`await\` https://svelte.dev/e/await_reactivity_loss`,er,tr):console.warn("https://svelte.dev/e/await_reactivity_loss")}function Hl(e,t){$?console.warn(`%c[svelte] await_waterfall %cAn async derived, \`${e}\` (${t}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app https://svelte.dev/e/await_waterfall`,er,tr):console.warn("https://svelte.dev/e/await_waterfall")}function zl(){$?console.warn(`%c[svelte] derived_inert %cReading a derived belonging to a now-destroyed effect may result in stale values https://svelte.dev/e/derived_inert`,er,tr):console.warn("https://svelte.dev/e/derived_inert")}function Ul(e){$?console.warn(`%c[svelte] hydratable_missing_but_expected %cExpected to find a hydratable with key \`${e}\` during hydration, but did not. https://svelte.dev/e/hydratable_missing_but_expected`,er,tr):console.warn("https://svelte.dev/e/hydratable_missing_but_expected")}function Gl(e,t,r){$?console.warn(`%c[svelte] hydration_attribute_changed %cThe \`${e}\` attribute on \`${t}\` changed its value between server and client renders. The client value, \`${r}\`, will be ignored in favour of the server value https://svelte.dev/e/hydration_attribute_changed`,er,tr):console.warn("https://svelte.dev/e/hydration_attribute_changed")}function dn(e){$?console.warn(`%c[svelte] hydration_mismatch %c${e?`Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${e}`:"Hydration failed because the initial UI does not match what was rendered on the server"} https://svelte.dev/e/hydration_mismatch`,er,tr):console.warn("https://svelte.dev/e/hydration_mismatch")}function Xl(){$?console.warn("%c[svelte] invalid_raw_snippet_render\n%cThe `render` function passed to `createRawSnippet` should return HTML for a single element\nhttps://svelte.dev/e/invalid_raw_snippet_render",er,tr):console.warn("https://svelte.dev/e/invalid_raw_snippet_render")}function Kl(){$?console.warn(`%c[svelte] lifecycle_double_unmount %cTried to unmount a component that was not mounted https://svelte.dev/e/lifecycle_double_unmount`,er,tr):console.warn("https://svelte.dev/e/lifecycle_double_unmount")}function yi(e){$?console.warn(`%c[svelte] state_proxy_equality_mismatch %cReactive \`$state(...)\` proxies and the values they proxy have different identities. Because of this, comparisons with \`${e}\` will produce unexpected results https://svelte.dev/e/state_proxy_equality_mismatch`,er,tr):console.warn("https://svelte.dev/e/state_proxy_equality_mismatch")}function Wl(){$?console.warn(`%c[svelte] state_proxy_unmount %cTried to unmount a state proxy, rather than a component https://svelte.dev/e/state_proxy_unmount`,er,tr):console.warn("https://svelte.dev/e/state_proxy_unmount")}function Ql(){$?console.warn("%c[svelte] svelte_boundary_reset_noop\n%cA `` `reset` function only resets the boundary the first time it is called\nhttps://svelte.dev/e/svelte_boundary_reset_noop",er,tr):console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}var er,tr,Xe=w(()=>{c();J();er="font-weight: bold",tr="font-weight: normal";i(Vl,"await_reactivity_loss");i(Hl,"await_waterfall");i(zl,"derived_inert");i(Ul,"hydratable_missing_but_expected");i(Gl,"hydration_attribute_changed");i(dn,"hydration_mismatch");i(Xl,"invalid_raw_snippet_render");i(Kl,"lifecycle_double_unmount");i(yi,"state_proxy_equality_mismatch");i(Wl,"state_proxy_unmount");i(Ql,"svelte_boundary_reset_noop")});function De(e){P=e}function pe(e){if(e===null)throw dn(),Sr;return Y=e}function Ke(){return pe(We(Y))}function F(e){if(P){if(We(Y)!==null)throw dn(),Sr;Y=e}}function $o(e=1){if(P){for(var t=e,r=Y;t--;)r=We(r);Y=r}}function hr(e=!0){for(var t=0,r=Y;;){if(r.nodeType===Yt){var n=r.data;if(n===fn){if(t===0)return r;t-=1}else(n===Hn||n===un||n[0]==="["&&!isNaN(Number(n.slice(1))))&&(t+=1)}var o=We(r);e&&r.remove(),r=o}}function yo(e){if(!e||e.nodeType!==Yt)throw dn(),Sr;return e.data}var P,Y,ce=w(()=>{c();X();re();Xe();Pe();P=!1;i(De,"set_hydrating");i(pe,"set_hydrate_node");i(Ke,"hydrate_next");i(F,"reset");i($o,"next");i(hr,"skip_nodes");i(yo,"read_hydration_instruction")});function xi(e){return e===this.v}function wi(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Ei(e){return!wi(e,this.v)}var xo=w(()=>{c();i(xi,"equals");i(wi,"safe_not_equal");i(Ei,"safe_equals")});function Zl(){vr=!0}var Te,vr,rr,mt=w(()=>{c();Te=!1,vr=!1,rr=!1;i(Zl,"enable_legacy_mode_flag")});var Ys=w(()=>{c();J()});var zn=w(()=>{c();J();Ys();ee()});function ct(e,t){return e.label=t,ki(e.v,t),e}function ki(e,t){return e?.[mi]?.(t),e}var wo,Hr=w(()=>{c();re();zn();X();j();H();wo=null;i(ct,"tag");i(ki,"tag_proxy")});function or(e){let t=new Error,r=Nf();return r.length===0?null:(r.unshift(` `),tt(t,"stack",{value:r.join(` `)}),tt(t,"name",{value:e}),t)}function Nf(){let e=Error.stackTraceLimit;Error.stackTraceLimit=1/0;let t=new Error().stack;if(Error.stackTraceLimit=e,!t)return[];let r=t.split(` `),n=[];for(let o=0;o{c();J();ee();bo();i(or,"get_error");i(Nf,"get_stack");i(ec,"invariant")});function Pr(e){L=e}function Un(e){ir=e}function Ai(e){sr=e}function tc(){let e={};return[()=>(Vs(e)||$l(),js(e)),t=>qs(e,t)]}function js(e){return Ci("getContext").get(e)}function qs(e,t){let r=Ci("setContext");if(Te){var n=S.f,o=!I&&(n&32)!==0&&!L.i;o||Bl()}return r.set(e,t),t}function Vs(e){return Ci("hasContext").has(e)}function rc(){return Ci("getAllContexts")}function ne(e,t=!1,r){L={p:L,i:!1,c:null,e:null,s:e,x:null,r:S,l:vr&&!t?{s:null,u:null,$:[]}:null},$&&(L.function=r,sr=r)}function oe(e){var t=L,r=t.e;if(r!==null){t.e=null;for(var n of r)Hs(n)}return e!==void 0&&(t.x=e),t.i=!0,L=t.p,$&&(sr=L?.function??null),e??{}}function ar(){return!vr||L!==null&&L.l===null}function Ci(e){return L===null&&Cr(e),L.c??=new Map(Of(L)||void 0)}function Of(e){let t=e.p;for(;t!==null;){let r=t.c;if(r!==null)return r;t=t.p}return null}var L,ir,sr,ye=w(()=>{c();J();Ge();H();j();mt();re();X();L=null;i(Pr,"set_component_context");ir=null;i(Un,"set_dev_stack");sr=null;i(Ai,"set_dev_current_component_function");i(tc,"createContext");i(js,"getContext");i(qs,"setContext");i(Vs,"hasContext");i(rc,"getAllContexts");i(ne,"push");i(oe,"pop");i(ar,"is_runes");i(Ci,"get_or_init_context_map");i(Of,"get_parent_context")});function nc(){var e=_n;_n=[],hi(e)}function Ze(e){if(_n.length===0&&!hn){var t=_n;queueMicrotask(()=>{t===_n&&nc()})}_n.push(e)}function oc(){for(;_n.length>0;)nc()}var _n,lr=w(()=>{c();ee();ot();_n=[];i(nc,"run_micro_tasks");i(Ze,"queue_micro_task");i(oc,"flush_tasks")});function Si(e){var t=S;if(t===null)return I.f|=8388608,e;if($&&e instanceof Error&&!zs.has(e)&&zs.set(e,Rf(e,t)),!(t.f&32768)&&!(t.f&4))throw $&&!t.parent&&e instanceof Error&&ic(e),e;qt(e,t)}function qt(e,t){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(r){e=r}}t=t.parent}throw $&&e instanceof Error&&ic(e),e}function Rf(e,t){let r=xt(e,"message");if(!(r&&!r.configurable)){for(var n=To?" ":" ",o=` ${n}in ${t.fn?.name||""}`,s=t.ctx;s!==null;)o+=` ${n}in ${s.function?.[jt].split("/").pop()}`,s=s.p;return{message:e.message+` ${o} `,stack:e.stack?.split(` `).filter(a=>!a.includes("svelte/src/internal")).join(` `)}}}function ic(e){let t=zs.get(e);t&&(tt(e,"message",{value:t.message}),tt(e,"stack",{value:t.stack}))}var zs,Gn=w(()=>{c();J();re();Pe();X();ee();H();zs=new WeakMap;i(Si,"handle_error");i(qt,"invoke_error_boundary");i(Rf,"get_adjustments");i(ic,"apply_adjustments")});function ue(e,t){e.f=e.f&If|t}function Xn(e){e.f&512||e.deps===null?ue(e,1024):ue(e,4096)}var If,Or=w(()=>{c();X();If=-7169;i(ue,"set_signal_status");i(Xn,"update_derived_status")});function sc(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=65536,sc(t.deps))}function Pi(e,t,r){e.f&2048?t.add(e):e.f&4096&&r.add(e),sc(e.deps),ue(e,1024)}var Us=w(()=>{c();X();Or();i(sc,"clear_marked");i(Pi,"defer_effect")});var Gs=w(()=>{c();H();ee()});var ac=w(()=>{c();ee();xo();Gs()});function Xs(e){var t=Ni;try{return Ni=!1,[e(),Ni]}finally{Ni=t}}var lc,Ni,hv,ko=w(()=>{c();Gs();ac();ee();H();j();dt();J();lc=!1,Ni=!1,hv=Symbol();i(Xs,"capture_store_binding")});var cc=w(()=>{c();X();zn();H()});function E(e){var t=hn;hn=!0;try{var r;for(e&&(D!==null&&!D.is_fork&&D.flush(),r=e());;){if(oc(),D===null)return r;D.flush()}}finally{hn=t}}function Lf(){if($){var e=new Map;for(let r of D.current.keys())for(let[n,o]of r.updated??[]){var t=e.get(n);t||(t={error:o.error,count:0},e.set(n,t)),t.count+=o.count}for(let r of e.values())r.error&&console.error(r.error)}try{Cl()}catch(r){$&&tt(r,"stack",{value:""}),qt(r,Ws)}}function fc(e){var t=e.length;if(t!==0){for(var r=0;r0)){Rr.clear();for(let o of zt){if(o.f&24576)continue;let s=[o],a=o.parent;for(;a!==null;)zt.has(a)&&(zt.delete(a),s.push(a)),a=a.parent;for(let l=s.length-1;l>=0;l--){let f=s[l];f.f&24576||mr(f)}}zt.clear()}}zt=null}}function dc(e,t,r,n){if(!r.has(e)&&(r.add(e),e.reactions!==null))for(let o of e.reactions){let s=o.f;s&2?dc(o,t,r,n):s&4194320&&!(s&2048)&&Qs(o,t,n)&&(ue(o,2048),So(o))}}function pc(e,t){if(e.reactions!==null)for(let r of e.reactions){let n=r.f;n&2?pc(r,t):n&131072&&(ue(r,2048),t.add(r))}}function Qs(e,t,r){let n=r.get(e);if(n!==void 0)return n;if(e.deps!==null)for(let o of e.deps){if(Jt.call(t,o))return!0;if(o.f&2&&Qs(o,t,r))return r.set(o,!0),!0}return r.set(e,!1),!1}function So(e){D.schedule(e)}function _c(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),ue(e,1024);for(var r=e.first;r!==null;)_c(r,t),r=r.next}}function hc(e){ue(e,1024);for(var t=e.first;t!==null;)hc(t),t=t.next}function vc(e){Te||bi("fork"),D!==null&&Pl();var t=Le.ensure();t.is_fork=!0,Be=new Map;var r=!1,n=t.settled();return E(e),{commit:async()=>{if(r){await n;return}Ht.has(t)||Sl(),r=!0,t.is_fork=!1;for(var[o,[s]]of t.current)o.v=s,o.wv=Gr();t.activate(),t.run_fork_commit_callbacks(),t.deactivate(),E(()=>{var a=new Set;for(var l of t.current.keys())pc(l,a);Po(a),No()}),t.flush(),await n},discard:()=>{for(var o of t.current.keys())o.wv=Gr();!r&&Ht.has(t)&&t.discard()}}}var Ht,D,Co,Be,Ws,hn,Ks,gn,Ao,uc,Mf,Bf,Le,zt,ot=w(()=>{c();X();mt();ee();H();Ge();lr();J();Gn();dt();j();Us();re();Or();ko();pn();cc();Ht=new Set,D=null,Co=null,Be=null,Ws=null,hn=!1,Ks=!1,gn=null,Ao=null,uc=0,Mf=$?new Set:null,Bf=1,Le=class{id=Bf++;current=new Map;previous=new Map;#e=new Set;#n=new Set;#r=new Set;#i=new Map;#o=new Map;#s=null;#t=[];#a=[];#c=new Set;#u=new Set;#l=new Map;#p=new Set;is_fork=!1;#_=!1;#d=new Set;#f(){return this.is_fork||this.#o.size>0}#b(){for(let n of this.#d)for(let o of n.#o.keys()){for(var t=!1,r=o;r.parent!==null;){if(this.#l.has(r)){t=!0;break}r=r.parent}if(!t)return!0}return!1}skip_effect(t){this.#l.has(t)||this.#l.set(t,{d:[],m:[]}),this.#p.delete(t)}unskip_effect(t,r=n=>this.schedule(n)){var n=this.#l.get(t);if(n){this.#l.delete(t);for(var o of n.d)ue(o,2048),r(o);for(o of n.m)ue(o,4096),r(o)}this.#p.add(t)}#h(){if(uc++>1e3&&(Ht.delete(this),Lf()),!this.#f()){for(let l of this.#c)this.#u.delete(l),ue(l,2048),this.schedule(l);for(let l of this.#u)ue(l,4096),this.schedule(l)}let t=this.#t;this.#t=[],this.apply();var r=gn=[],n=[],o=Ao=[];for(let l of t)try{this.#m(l,r,n)}catch(f){throw hc(l),f}if(D=null,o.length>0){var s=Le.ensure();for(let l of o)s.schedule(l)}if(gn=null,Ao=null,this.#f()||this.#b()){this.#v(n),this.#v(r);for(let[l,f]of this.#l)_c(l,f)}else{this.#i.size===0&&Ht.delete(this),this.#c.clear(),this.#u.clear();for(let l of this.#e)l(this);this.#e.clear(),Co=this,fc(n),fc(r),Co=null,this.#s?.resolve()}var a=D;if(this.#t.length>0){let l=a??=this;l.#t.push(...this.#t.filter(f=>!l.#t.includes(f)))}if(a!==null){if(Ht.add(a),$)for(let l of this.current.keys())Mf.add(l);a.#h()}Te&&!Ht.has(this)&&this.#g()}#m(t,r,n){t.f^=1024;for(var o=t.first;o!==null;){var s=o.f,a=(s&96)!==0,l=a&&(s&1024)!==0,f=l||(s&8192)!==0||this.#l.has(o);if(!f&&o.fn!==null){a?o.f^=1024:s&4?r.push(o):Te&&s&16777224?n.push(o):Kr(o)&&(s&16&&this.#u.add(o),mr(o));var _=o.first;if(_!==null){o=_;continue}}for(;o!==null;){var p=o.next;if(p!==null){o=p;break}o=o.parent}}}#v(t){for(var r=0;r!this.current.has(v));if(o.length===0)t&&p.discard();else if(r.length>0){if($&&ec(p.#t.length===0,"Batch has scheduled roots"),t)for(let v of this.#p)p.unskip_effect(v,d=>{d.f&4194320?p.schedule(d):p.#v([d])});p.activate();var s=new Set,a=new Map;for(var l of r)dc(l,o,s,a);a=new Map;var f=[...p.current.keys()].filter(v=>this.current.has(v)?this.current.get(v)[0]!==v:!0);for(let v of this.#a)!(v.f&155648)&&Qs(v,f,a)&&(v.f&4194320?(ue(v,2048),p.schedule(v)):p.#c.add(v));if(p.#t.length>0){p.apply();for(var _ of p.#t)p.#m(_,[],[]);p.#t=[]}p.deactivate()}}for(let p of Ht)p.#d.has(this)&&(p.#d.delete(this),p.#d.size===0&&!p.#f()&&(p.activate(),p.#h()))}increment(t,r){let n=this.#i.get(r)??0;if(this.#i.set(r,n+1),t){let o=this.#o.get(r)??0;this.#o.set(r,o+1)}}decrement(t,r,n){let o=this.#i.get(r)??0;if(o===1?this.#i.delete(r):this.#i.set(r,o-1),t){let s=this.#o.get(r)??0;s===1?this.#o.delete(r):this.#o.set(r,s-1)}this.#_||n||(this.#_=!0,Ze(()=>{this.#_=!1,this.flush()}))}transfer_effects(t,r){for(let n of t)this.#c.add(n);for(let n of r)this.#u.add(n);t.clear(),r.clear()}oncommit(t){this.#e.add(t)}ondiscard(t){this.#n.add(t)}on_fork_commit(t){this.#r.add(t)}run_fork_commit_callbacks(){for(let t of this.#r)t(this);this.#r.clear()}settled(){return(this.#s??=vi()).promise}static ensure(){if(D===null){let t=D=new Le;Ks||(Ht.add(D),hn||Ze(()=>{D===t&&t.flush()}))}return D}apply(){if(!Te||!this.is_fork&&Ht.size===1){Be=null;return}Be=new Map;for(let[n,[o]]of this.current)Be.set(n,o);for(let n of Ht)if(!(n===this||n.is_fork)){var t=!1,r=!1;if(n.id{zr()&&(u(r),Fe(()=>(t===0&&(n=ae(()=>e(()=>bn(r)))),t+=1,()=>{Ze(()=>{t-=1,t===0&&(n?.(),n=void 0,bn(r))})})))}}var bc=w(()=>{c();H();j();dt();Hr();J();lr();i(gc,"createSubscriber")});function Js(e,t,r,n){new Oi(e,t,r,n)}var Yf,Oi,Ri=w(()=>{c();X();re();ye();Gn();j();H();ce();lr();Ge();Xe();J();ot();dt();Hr();bc();Pe();Us();Or();Yf=589824;i(Js,"boundary");Oi=class{parent;is_pending=!1;transform_error;#e;#n=P?Y:null;#r;#i;#o;#s=null;#t=null;#a=null;#c=null;#u=0;#l=0;#p=!1;#_=new Set;#d=new Set;#f=null;#b=gc(()=>(this.#f=_t(this.#u),$&&ct(this.#f,"$effect.pending()"),()=>{this.#f=null}));constructor(t,r,n,o){this.#e=t,this.#r=r,this.#i=s=>{var a=S;a.b=this,a.f|=128,n(s)},this.parent=S.b,this.transform_error=o??this.parent?.transform_error??(s=>s),this.#o=bt(()=>{if(P){let s=this.#n;Ke();let a=s.data===un;if(s.data.startsWith(Fs)){let f=JSON.parse(s.data.slice(Fs.length));this.#m(f)}else a?this.#v():this.#h()}else this.#g()},Yf),P&&(this.#e=Y)}#h(){try{this.#s=Ye(()=>this.#i(this.#e))}catch(t){this.error(t)}}#m(t){let r=this.#r.failed;r&&(this.#a=Ye(()=>{r(this.#e,()=>t,()=>()=>{})}))}#v(){let t=this.#r.pending;t&&(this.is_pending=!0,this.#t=Ye(()=>t(this.#e)),Ze(()=>{var r=this.#c=document.createDocumentFragment(),n=Ve();r.append(n),this.#s=this.#y(()=>Ye(()=>this.#i(n))),this.#l===0&&(this.#e.before(r),this.#c=null,gr(this.#t,()=>{this.#t=null}),this.#$(D))}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#l=0,this.#u=0,this.#s=Ye(()=>{this.#i(this.#e)}),this.#l>0){var t=this.#c=document.createDocumentFragment();Kn(this.#s,t);let r=this.#r.pending;this.#t=Ye(()=>r(this.#e))}else this.#$(D)}catch(r){this.error(r)}}#$(t){this.is_pending=!1,t.transfer_effects(this.#_,this.#d)}defer_effect(t){Pi(t,this.#_,this.#d)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#r.pending}#y(t){var r=S,n=I,o=L;qe(this.#o),je(this.#o),Pr(this.#o.ctx);try{return Le.ensure(),t()}catch(s){return Si(s),null}finally{qe(r),je(n),Pr(o)}}#x(t,r){if(!this.has_pending_snippet()){this.parent&&this.parent.#x(t,r);return}this.#l+=t,this.#l===0&&(this.#$(r),this.#t&&gr(this.#t,()=>{this.#t=null}),this.#c&&(this.#e.before(this.#c),this.#c=null))}update_pending_count(t,r){this.#x(t,r),this.#u+=t,!(!this.#f||this.#p)&&(this.#p=!0,Ze(()=>{this.#p=!1,this.#f&&ur(this.#f,this.#u)}))}get_effect_pending(){return this.#b(),u(this.#f)}error(t){if(!this.#r.onerror&&!this.#r.failed)throw t;D?.is_fork?(this.#s&&D.skip_effect(this.#s),this.#t&&D.skip_effect(this.#t),this.#a&&D.skip_effect(this.#a),D.on_fork_commit(()=>{this.#w(t)})):this.#w(t)}#w(t){this.#s&&(ke(this.#s),this.#s=null),this.#t&&(ke(this.#t),this.#t=null),this.#a&&(ke(this.#a),this.#a=null),P&&(pe(this.#n),$o(),pe(hr()));var r=this.#r.onerror;let n=this.#r.failed;var o=!1,s=!1;let a=i(()=>{if(o){Ql();return}o=!0,s&&jl(),this.#a!==null&&gr(this.#a,()=>{this.#a=null}),this.#y(()=>{this.#g()})},"reset"),l=i(f=>{try{s=!0,r?.(f,a),s=!1}catch(_){qt(_,this.#o&&this.#o.parent)}n&&(this.#a=this.#y(()=>{try{return Ye(()=>{var _=S;_.b=this,_.f|=128,n(this.#e,()=>f,()=>a)})}catch(_){return qt(_,this.#o.parent),null}}))},"handle_error_result");Ze(()=>{var f;try{f=this.transform_error(t)}catch(_){qt(_,this.#o&&this.#o.parent);return}f!==null&&typeof f=="object"&&typeof f.then=="function"?f.then(l,_=>qt(_,this.#o&&this.#o.parent)):l(f)})}};i(Oi,"Boundary")});function Ii(e,t,r,n){let o=ar()?$n:yn;var s=e.filter(d=>!d.settled);if(r.length===0&&s.length===0){n(t.map(o));return}var a=S,l=$c(),f=s.length===1?s[0].promise:s.length>1?Promise.all(s.map(d=>d.promise)):null;function _(d){l();try{n(d)}catch(b){a.f&16384||qt(b,a)}Wn()}if(i(_,"finish"),r.length===0){f.then(()=>_(t.map(o)));return}var p=Oo();function v(){Promise.all(r.map(d=>ta(d))).then(d=>_([...t.map(o),...d])).catch(d=>qt(d,a)).finally(()=>p())}i(v,"run"),f?f.then(()=>{l(),v(),Wn()}):v()}function $c(){var e=S,t=I,r=L,n=D;if($)var o=ir;return i(function(a=!0){qe(e),je(t),Pr(r),a&&!(e.f&16384)&&(n?.activate(),n?.apply()),$&&(ea(null),Un(o))},"restore")}function Wn(e=!0){qe(null),je(null),Pr(null),e&&D?.deactivate(),$&&(ea(null),Un(null))}function Oo(){var e=S,t=e.b,r=D,n=t.is_rendered();return t.update_pending_count(1,r),r.increment(n,e),(o=!1)=>{t.update_pending_count(-1,r),r.decrement(n,e,o)}}var Wr=w(()=>{c();X();J();ye();Ri();Gn();H();ot();Qr();j();i(Ii,"flatten");i($c,"capture");i(Wn,"unset_context");i(Oo,"increment_pending")});function ea(e){Et=e}function $n(e){var t=2050;S!==null&&(S.f|=524288);let r={ctx:L,deps:null,effects:null,equals:xi,f:t,fn:e,reactions:null,rv:0,v:me,wv:0,parent:S,ac:null};return $&&rr&&(r.created=or("created at")),r}function ta(e,t,r){let n=S;n===null&&xl();var o=void 0,s=_t(me);$&&(s.label=t);var a=!I,l=new Map;return wc(()=>{var f=S;$&&(Et={effect:f,effect_deps:new Set,warned:!1});var _=vi();o=_.promise;try{Promise.resolve(e()).then(_.resolve,_.reject).finally(Wn)}catch(b){_.reject(b),Wn()}if($){if(Et){if(f.deps!==null)for(let b=0;b<$t;b+=1)Et.effect_deps.add(f.deps[b]);if(et!==null)for(let b=0;b{if($&&(Et=null),v){var m=y===Ot;v(m)}if(!(y===Ot||f.f&16384)){if(p.activate(),y)s.f|=8388608,ur(s,y);else{s.f&8388608&&(s.f^=8388608),ur(s,b);for(let[h,x]of l){if(l.delete(h),h===p)break;x.reject(Ot)}$&&r!==void 0&&(Ro.add(s),setTimeout(()=>{Ro.has(s)&&(Hl(s.label,r),Ro.delete(s))}))}p.deactivate()}},"handler");_.promise.then(d,b=>d(null,b||"unknown"))}),pt(()=>{for(let f of l.values())f.reject(Ot)}),$&&(s.f|=4194304),new Promise(f=>{function _(p){function v(){p===o?f(s):_(o)}i(v,"go"),p.then(v,v)}i(_,"next"),_(o)})}function R(e){let t=$n(e);return Te||Mi(t),t}function yn(e){let t=$n(e);return t.equals=Ei,t}function yc(e){var t=e.effects;if(t!==null){e.effects=null;for(var r=0;r{c();J();X();H();xo();Ge();Xe();j();dt();pn();mt();ye();re();ot();Wr();ee();Or();Et=null;i(ea,"set_reactivity_loss_tracker");Ro=new Set;i($n,"derived");i(ta,"async_derived");i(R,"user_derived");i(yn,"derived_safe_equal");i(yc,"destroy_derived_effects");ra=[];i(Io,"execute_derived");i(na,"update_derived");i(xc,"freeze_derived_effects");i(oa,"unfreeze_derived_effects")});function Po(e){xn=e}function Ec(){ia=!0}function _t(e,t){var r={f:0,v:e,reactions:null,equals:xi,rv:0,wv:0};return $&&rr&&(r.created=t??or("created at"),r.updated=null,r.set_during_effect=!1,r.trace=null),r}function xe(e,t){let r=_t(e,t);return Mi(r),r}function vn(e,t=!1,r=!0){let n=_t(e);return t||(n.equals=Ei),vr&&r&&L!==null&&L.l!==null&&(L.l.s??=[]).push(n),n}function T(e,t,r=!1){I!==null&&(!yt||I.f&131072)&&ar()&&I.f&4325394&&(Dt===null||!Jt.call(Dt,e))&&Yl();let n=r?Ir(t):t;return $&&ki(n,e.label),ur(e,n,Ao)}function ur(e,t,r=null){if(!e.equals(t)){Rr.set(e,It?t:e.v);var n=Le.ensure();if(n.capture(e,t),$){if(rr||S!==null){e.updated??=new Map;let o=(e.updated.get("")?.count??0)+1;if(e.updated.set("",{error:null,count:o}),rr||o>5){let s=or("updated at");if(s!==null){let a=e.updated.get(s.stack);a||(a={error:s,count:0},e.updated.set(s.stack,a)),a.count++}}}S!==null&&(e.set_during_effect=!0)}if(e.f&2){let o=e;e.f&2048&&Io(o),Be===null&&Xn(o)}e.wv=Gr(),Tc(e,2048,r),ar()&&S!==null&&S.f&1024&&!(S.f&96)&&(Mt===null?kc([e]):Mt.push(e)),!n.is_fork&&xn.size>0&&!ia&&No()}return t}function No(){ia=!1;for(let e of xn)e.f&1024&&ue(e,4096),Kr(e)&&mr(e);xn.clear()}function bn(e){T(e,e.v+1)}function Tc(e,t,r){var n=e.reactions;if(n!==null)for(var o=ar(),s=n.length,a=0;a{c();J();H();xo();X();Ge();mt();ee();Hr();pn();ye();ot();En();Qr();Or();xn=new Set,Rr=new Map;i(Po,"set_eager_effects");ia=!1;i(Ec,"set_eager_effects_deferred");i(_t,"source");i(xe,"state");i(vn,"mutable_source");i(T,"set");i(ur,"internal_set");i(No,"flush_eager_effects");i(bn,"increment");i(Tc,"mark_reactions")});function Ir(e){if(typeof e!="object"||e===null||Ie in e)return e;let t=cn(e);if(t!==Ns&&t!==ml)return e;var r=new Map,n=_r(e),o=xe(0),s=$&&rr?or("created at"):null,a=Zr,l=i(v=>{if(Zr===a)return v();var d=I,b=Zr;je(null),sa(a);var y=v();return je(d),sa(b),y},"with_parent");n&&(r.set("length",xe(e.length,s)),$&&(e=Hf(e)));var f="";let _=!1;function p(v){if(!_){_=!0,f=v,ct(o,`${f} version`);for(let[d,b]of r)ct(b,Tn(f,d));_=!1}}return i(p,"update_path"),new Proxy(e,{defineProperty(v,d,b){(!("value"in b)||b.configurable===!1||b.enumerable===!1||b.writable===!1)&&Ll();var y=r.get(d);return y===void 0?l(()=>{var m=xe(b.value,s);return r.set(d,m),$&&typeof d=="string"&&ct(m,Tn(f,d)),m}):T(y,b.value,!0),!0},deleteProperty(v,d){var b=r.get(d);if(b===void 0){if(d in v){let y=l(()=>xe(me,s));r.set(d,y),bn(o),$&&ct(y,Tn(f,d))}}else T(b,me),bn(o);return!0},get(v,d,b){if(d===Ie)return e;if($&&d===mi)return p;var y=r.get(d),m=d in v;if(y===void 0&&(!m||xt(v,d)?.writable)&&(y=l(()=>{var x=Ir(m?v[d]:me),C=xe(x,s);return $&&ct(C,Tn(f,d)),C}),r.set(d,y)),y!==void 0){var h=u(y);return h===me?void 0:h}return Reflect.get(v,d,b)},getOwnPropertyDescriptor(v,d){var b=Reflect.getOwnPropertyDescriptor(v,d);if(b&&"value"in b){var y=r.get(d);y&&(b.value=u(y))}else if(b===void 0){var m=r.get(d),h=m?.v;if(m!==void 0&&h!==me)return{enumerable:!0,configurable:!0,value:h,writable:!0}}return b},has(v,d){if(d===Ie)return!0;var b=r.get(d),y=b!==void 0&&b.v!==me||Reflect.has(v,d);if(b!==void 0||S!==null&&(!y||xt(v,d)?.writable)){b===void 0&&(b=l(()=>{var h=y?Ir(v[d]):me,x=xe(h,s);return $&&ct(x,Tn(f,d)),x}),r.set(d,b));var m=u(b);if(m===me)return!1}return y},set(v,d,b,y){var m=r.get(d),h=d in v;if(n&&d==="length")for(var x=b;xxe(me,s)),r.set(x+"",C),$&&ct(C,Tn(f,x)))}if(m===void 0)(!h||xt(v,d)?.writable)&&(m=l(()=>xe(void 0,s)),$&&ct(m,Tn(f,d)),T(m,Ir(b)),r.set(d,m));else{h=m.v!==me;var k=l(()=>Ir(b));T(m,k)}var V=Reflect.getOwnPropertyDescriptor(v,d);if(V?.set&&V.set.call(y,b),!h){if(n&&typeof d=="string"){var Z=r.get("length"),U=Number(d);Number.isInteger(U)&&U>=Z.v&&T(Z,U+1)}bn(o)}return!0},ownKeys(v){u(o);var d=Reflect.ownKeys(v).filter(m=>{var h=r.get(m);return h===void 0||h.v!==me});for(var[b,y]of r)y.v!==me&&!(b in v)&&d.push(b);return d},setPrototypeOf(){Fl()}})}function Tn(e,t){return typeof t=="symbol"?`${e}[Symbol(${t.description??""})]`:qf.test(t)?`${e}.${t}`:/^\d+$/.test(t)?`${e}[${t}]`:`${e}['${t}']`}function Bi(e){try{if(e!==null&&typeof e=="object"&&Ie in e)return e[Ie]}catch{}return e}function Hf(e){return new Proxy(e,{get(t,r,n){var o=Reflect.get(t,r,n);return Vf.has(r)?function(...s){Ec();var a=o.apply(this,s);return No(),a}:o}})}var qf,Vf,En=w(()=>{c();J();H();ee();dt();X();re();Ge();Hr();pn();mt();qf=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;i(Ir,"proxy");i(Tn,"get_label");i(Bi,"get_proxied_value");Vf=new Set(["copyWithin","fill","pop","push","reverse","shift","sort","splice","unshift"]);i(Hf,"inspectable_array")});function Ac(){let e=Array.prototype,t=Array.__svelte_cleanup;t&&t();let{indexOf:r,lastIndexOf:n,includes:o}=e;e.indexOf=function(s,a){let l=r.call(this,s,a);if(l===-1){for(let f=a??0;f{e.indexOf=r,e.lastIndexOf=n,e.includes=o}}var aa=w(()=>{c();Xe();En();i(Ac,"init_array_prototype_warnings")});function Li(){if(la===void 0){la=window,Cc=document,To=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,r=Text.prototype;Sc=xt(t,"firstChild").get,Pc=xt(t,"nextSibling").get,Os(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),Os(r)&&(r.__t=void 0),$&&(e.__svelte_meta=null,Ac())}}function Ve(e=""){return document.createTextNode(e)}function it(e){return Sc.call(e)}function We(e){return Pc.call(e)}function q(e,t){if(!P)return it(e);var r=it(Y);if(r===null)r=Y.appendChild(Ve());else if(t&&r.nodeType!==Vn){var n=Ve();return r?.before(n),pe(n),n}return t&&Yi(r),pe(r),r}function st(e,t=!1){if(!P){var r=it(e);return r instanceof Comment&&r.data===""?We(r):r}if(t){if(Y?.nodeType!==Vn){var n=Ve();return Y?.before(n),pe(n),n}Yi(Y)}return Y}function N(e,t=1,r=!1){let n=P?Y:e;for(var o;t--;)o=n,n=We(n);if(!P)return n;if(r){if(n?.nodeType!==Vn){var s=Ve();return n===null?o?.after(s):n.before(s),pe(s),s}Yi(n)}return pe(n),n}function Mo(e){e.textContent=""}function Fi(){if(!Te||zt!==null)return!1;var e=S.f;return(e&32768)!==0}function Dr(e,t,r){let n=r?{is:r}:void 0;return document.createElementNS(t??$i,e,n)}function Yi(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Vn;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}var la,Cc,To,Sc,Pc,Pe=w(()=>{c();ce();J();aa();ee();H();mt();X();ot();re();i(Li,"init_operations");i(Ve,"create_text");i(it,"get_first_child");i(We,"get_next_sibling");i(q,"child");i(st,"first_child");i(N,"sibling");i(Mo,"clear_text_content");i(Fi,"should_defer_append");i(Dr,"create_element");i(Yi,"merge_text_nodes")});function ji(){Nc||(Nc=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t.__on_r?.()})},{capture:!0}))}var Nc,qi=w(()=>{c();ce();Pe();lr();Nc=!1;i(ji,"add_form_reset_listener")});function Jr(e){var t=I,r=S;je(null),qe(null);try{return e()}finally{je(t),qe(r)}}function Vi(e,t,r,n=r){e.addEventListener(t,()=>Jr(r));let o=e.__on_r;o?e.__on_r=()=>{o(),n(!0)}:e.__on_r=()=>n(!0),ji()}var Ut=w(()=>{c();j();H();qi();i(Jr,"without_reactive_context");i(Vi,"listen_to_event_and_reset_event")});function ua(e){S===null&&(I===null&&Al(e),kl()),It&&Tl(e)}function zf(e,t){var r=t.last;r===null?t.last=t.first=e:(r.next=e,e.prev=r,t.last=e)}function Gt(e,t){var r=S;if($)for(;r!==null&&r.f&131072;)r=r.parent;r!==null&&r.f&8192&&(e|=8192);var n={ctx:L,deps:null,nodes:null,f:e|2048|512,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};$&&(n.component_function=sr),D?.register_created_effect(n);var o=n;if(e&4)gn!==null?gn.push(n):Le.ensure().schedule(n);else if(t!==null){try{mr(n)}catch(a){throw ke(n),a}o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&!(o.f&524288)&&(o=o.first,e&16&&e&65536&&o!==null&&(o.f|=65536))}if(o!==null&&(o.parent=r,r!==null&&zf(o,r),I!==null&&I.f&2&&!(e&64))){var s=I;(s.effects??=[]).push(o)}return n}function zr(){return I!==null&&!yt}function pt(e){let t=Gt(8,null);return ue(t,1024),t.teardown=e,t}function $r(e){ua("$effect"),$&&tt(e,"name",{value:"$effect"});var t=S.f,r=!I&&(t&32)!==0&&(t&32768)===0;if(r){var n=L;(n.e??=[]).push(e)}else return Hs(e)}function Hs(e){return Gt(1048580,e)}function yr(e){return ua("$effect.pre"),$&&tt(e,"name",{value:"$effect.pre"}),Gt(1048584,e)}function fa(e){Le.ensure();let t=Gt(524352,e);return()=>{ke(t)}}function Ic(e){Le.ensure();let t=Gt(524352,e);return(r={})=>new Promise(n=>{r.outro?gr(t,()=>{ke(t),n(void 0)}):(ke(t),n(void 0))})}function Tt(e){return Gt(4,e)}function wc(e){return Gt(4718592,e)}function Fe(e,t=0){return Gt(8|t,e)}function ge(e,t=[],r=[],n=[]){Ii(n,t,r,o=>{Gt(8,()=>e(...o.map(u)))})}function bt(e,t=0){var r=Gt(16|t,e);return $&&(r.dev_stack=ir),r}function da(e,t=0){var r=Gt(16777216|t,e);return $&&(r.dev_stack=ir),r}function Ye(e){return Gt(524320,e)}function pa(e){var t=e.teardown;if(t!==null){let r=It,n=I;ca(!0),je(null);try{t.call(null)}finally{ca(r),je(n)}}}function Do(e,t=!1){var r=e.first;for(e.first=e.last=null;r!==null;){let o=r.ac;o!==null&&Jr(()=>{o.abort(Ot)});var n=r.next;r.f&64?r.parent=null:ke(r,t),r=n}}function Dc(e){for(var t=e.first;t!==null;){var r=t.next;t.f&32||ke(t),t=r}}function ke(e,t=!0){var r=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Mc(e.nodes.start,e.nodes.end),r=!0),ue(e,33554432),Do(e,t&&!r),wn(e,0);var n=e.nodes&&e.nodes.t;if(n!==null)for(let s of n)s.stop();pa(e),e.f^=33554432,e.f|=16384;var o=e.parent;o!==null&&o.first!==null&&Zs(e),$&&(e.component_function=null),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Mc(e,t){for(;e!==null;){var r=e===t?null:We(e);e.remove(),e=r}}function Zs(e){var t=e.parent,r=e.prev,n=e.next;r!==null&&(r.next=n),n!==null&&(n.prev=r),t!==null&&(t.first===e&&(t.first=n),t.last===e&&(t.last=r))}function gr(e,t,r=!0){var n=[];Bc(e,n,!0);var o=i(()=>{r&&ke(e),t&&t()},"fn"),s=n.length;if(s>0){var a=i(()=>--s||o(),"check");for(var l of n)l.out(a)}else o()}function Bc(e,t,r){if(!(e.f&8192)){e.f^=8192;var n=e.nodes&&e.nodes.t;if(n!==null)for(let l of n)(l.is_global||r)&&t.push(l);for(var o=e.first;o!==null;){var s=o.next;if(!(o.f&64)){var a=(o.f&65536)!==0||(o.f&32)!==0&&(e.f&16)!==0;Bc(o,t,a?r:!1)}o=s}}}function Bo(e){Lc(e,!0)}function Lc(e,t){if(e.f&8192){e.f^=8192,e.f&1024||(ue(e,2048),Le.ensure().schedule(e));for(var r=e.first;r!==null;){var n=r.next,o=(r.f&65536)!==0||(r.f&32)!==0;Lc(r,o?t:!1),r=n}var s=e.nodes&&e.nodes.t;if(s!==null)for(let a of s)(a.is_global||t)&&a.in()}}function Kn(e,t){if(e.nodes)for(var r=e.nodes.start,n=e.nodes.end;r!==null;){var o=r===n?null:We(r);t.append(r),r=o}}var j=w(()=>{c();H();X();Ge();J();ee();Pe();ye();ot();Wr();Ut();Or();i(ua,"validate_effect");i(zf,"push_effect");i(Gt,"create_effect");i(zr,"effect_tracking");i(pt,"teardown");i($r,"user_effect");i(Hs,"create_user_effect");i(yr,"user_pre_effect");i(fa,"effect_root");i(Ic,"component_root");i(Tt,"effect");i(wc,"async_effect");i(Fe,"render_effect");i(ge,"template_effect");i(bt,"block");i(da,"managed");i(Ye,"branch");i(pa,"execute_effect_teardown");i(Do,"destroy_effect_children");i(Dc,"destroy_block_effect_children");i(ke,"destroy_effect");i(Mc,"remove_effect_dom");i(Zs,"unlink_effect");i(gr,"pause_effect");i(Bc,"pause_children");i(Bo,"resume_effect");i(Lc,"resume_children");i(Kn,"move_effect")});var Fc,_a=w(()=>{c();dt();H();Fc=null});function ca(e){It=e}function je(e){I=e}function qe(e){S=e}function Mi(e){I!==null&&(!Te||I.f&2)&&(Dt===null?Dt=[e]:Dt.push(e))}function kc(e){Mt=e}function sa(e){Zr=e}function Gr(){return++Yc}function Kr(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=-65537),t&4096){for(var r=e.deps,n=r.length,o=0;oe.wv)return!0}t&512&&Be===null&&ue(e,1024)}return!1}function jc(e,t,r=!0){var n=e.reactions;if(n!==null&&!(!Te&&Dt!==null&&Jt.call(Dt,e)))for(var o=0;o{e.ac.abort(Ot)}),e.ac=null);try{e.f|=2097152;var p=e.fn,v=p();e.f|=32768;var d=e.deps,b=D?.is_fork;if(et!==null){var y;if(b||wn(e,$t),d!==null&&$t>0)for(d.length=$t+et.length,y=0;y{requestAnimationFrame(()=>e()),setTimeout(()=>e())});await Promise.resolve(),E()}function qc(){return Le.ensure().settled()}function u(e){var t=e.f,r=(t&2)!==0;if(Fc?.add(e),I!==null&&!yt){var n=S!==null&&(S.f&16384)!==0;if(!n&&(Dt===null||!Jt.call(Dt,e))){var o=I.deps;if(I.f&2097152)e.rv{c();J();ee();j();X();dt();Qr();mt();Hr();pn();ye();ot();Gn();re();_a();Ut();Or();Xe();zi=!1,It=!1;i(ca,"set_is_destroying_effect");I=null,yt=!1;i(je,"set_active_reaction");S=null;i(qe,"set_active_effect");Dt=null;i(Mi,"push_reaction_value");et=null,$t=0,Mt=null;i(kc,"set_untracked_writes");Yc=1,kn=0,Zr=kn;i(sa,"set_update_version");i(Gr,"increment_write_version");i(Kr,"is_dirty");i(jc,"schedule_possible_effect_self_invalidation");i(Di,"update_reaction");i(Uf,"remove_reaction");i(wn,"remove_reactions");i(mr,"update_effect");i(Lo,"tick");i(qc,"settled");i(u,"get");i(Vc,"reconnect");i(Hc,"depends_on_old_values");i(ae,"untrack");i(Gi,"deep_read_state");i(Ui,"deep_read")});var zc=w(()=>{c();at();re();en();j()});function Uc(e){return Kf.includes(e)}var Xf,Xb,Kf,Wf,Kb,tn=w(()=>{c();Xf=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","webkitdirectory","defer","disablepictureinpicture","disableremoteplayback"],Xb=[...Xf,"formNoValidate","isMap","noModule","playsInline","readOnly","value","volume","defaultValue","defaultChecked","srcObject","noValidate","allowFullscreen","disablePictureInPicture","disableRemotePlayback"],Kf=["touchstart","touchmove"];i(Uc,"is_passive_event");Wf=["$state","$state.raw","$derived","$derived.by"],Kb=[...Wf,"$state.eager","$state.snapshot","$props","$props.id","$bindable","$effect","$effect.pre","$effect.tracking","$effect.root","$effect.pending","$inspect","$inspect().with","$inspect.trace","$host"]});var Xc=w(()=>{c();X();tn();H();Xe()});var ha=w(()=>{c()});var Kc=w(()=>{c();X();re();ce();ye()});function Q(e,t,r){(t[Fo]??={})[e]=r}function kt(e){for(var t=0;t{throw h});throw d}}finally{e[Fo]=t,delete e.currentTarget,je(p),qe(v)}}}var Fo,va,Xi,Wc,Yo=w(()=>{c();j();ee();ce();lr();re();Xe();H();Ut();Fo=Symbol("events"),va=new Set,Xi=new Set;i(Q,"delegated");i(kt,"delegate");Wc=null;i(ma,"handle_event_propagation")});function Qc(e){return Zf?.createHTML(e)??e}function Ki(e){var t=Dr("template");return t.innerHTML=Qc(e.replaceAll("","")),t.content}var Zf,Wi=w(()=>{c();Pe();Zf=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});i(Qc,"create_trusted_html");i(Ki,"create_fragment_from_html")});function fr(e,t){var r=S;r.nodes===null&&(r.nodes={start:e,end:t,a:null,t:null})}function W(e,t){var r=(t&1)!==0,n=(t&2)!==0,o,s=!e.startsWith("");return()=>{if(P)return fr(Y,null),Y;o===void 0&&(o=Ki(s?e:""+e),r||(o=it(o)));var a=n||To?document.importNode(o,!0):o.cloneNode(!0);if(r){var l=it(a),f=a.lastChild;fr(l,f)}else fr(a,a);return a}}function Zn(){if(P)return fr(Y,null),Y;var e=document.createDocumentFragment(),t=document.createComment(""),r=Ve();return e.append(t,r),fr(t,r),e}function z(e,t){if(P){var r=S;(!(r.f&32768)||r.nodes.end===null)&&(r.nodes.end=Y),Ke();return}e!==null&&e.before(t)}var An=w(()=>{c();ce();Pe();Wi();H();re();X();i(fr,"assign_nodes");i(W,"from_html");i(Zn,"comment");i(z,"append")});function we(e,t){var r=t==null?"":typeof t=="object"?`${t}`:t;r!==(e.__t??=e.nodeValue)&&(e.__t=r,e.nodeValue=`${r}`)}function Cn(e,t){return Zc(e,t)}function Zi(e,t){Li(),t.intro=t.intro??!1;let r=t.target,n=P,o=Y;try{for(var s=it(r);s&&(s.nodeType!==Yt||s.data!==Hn);)s=We(s);if(!s)throw Sr;De(!0),pe(s);let a=Zc(e,{...t,anchor:s});return De(!1),a}catch(a){if(a instanceof Error&&a.message.split(` `).some(l=>l.startsWith("https://svelte.dev/e/")))throw a;return a!==Sr&&console.warn("Failed to hydrate: ",a),t.recover===!1&&Rl(),Li(),Mo(r),De(!1),Cn(e,t)}finally{De(n),pe(o)}}function Zc(e,{target:t,anchor:r,props:n={},events:o,context:s,intro:a=!0,transformError:l}){Li();var f=void 0,_=Ic(()=>{var p=r??t.appendChild(Ve());Js(p,{pending:()=>{}},b=>{ne({});var y=L;if(s&&(y.c=s),o&&(n.$$events=o),P&&fr(b,null),ba=a,f=e(b,n)||{},ba=!0,P&&(S.nodes.end=Y,Y===null||Y.nodeType!==Yt||Y.data!==fn))throw dn(),Sr;oe()},l);var v=new Set,d=i(b=>{for(var y=0;y{for(var b of v)for(let h of[t,document]){var y=Qi.get(h),m=y.get(b);--m==0?(h.removeEventListener(b,ma),y.delete(b),y.size===0&&Qi.delete(h)):y.set(b,m)}Xi.delete(d),p!==r&&p.parentNode?.removeChild(p)}});return $a.set(f,_),f}function Ji(e,t){let r=$a.get(e);return r?($a.delete(e),r(t)):($&&(Ie in e?Wl():Kl()),Promise.resolve())}var ba,Qi,$a,Sn=w(()=>{c();J();Pe();re();H();ye();j();ce();ee();Yo();Xe();Ge();An();tn();X();Ri();ba=!0;i(we,"set_text");i(Cn,"mount");i(Zi,"hydrate");Qi=new Map;i(Zc,"_mount");$a=new WeakMap;i(Ji,"unmount")});var Jc=w(()=>{c();re();X();ce();j();dt();Sn();H()});var eu=w(()=>{c();ee();X();re();ye();Xe();tn()});var tu=w(()=>{c();Ge();ye();re()});var ru=w(()=>{c();re();zn();j();H();pn()});var nu=w(()=>{c();Wr();H();ce()});var ou=w(()=>{c();Ge()});var Xt,Pn=w(()=>{c();ot();j();X();ce();Pe();J();Xt=class{anchor;#e=new Map;#n=new Map;#r=new Map;#i=new Set;#o=!0;constructor(t,r=!0){this.anchor=t,this.#o=r}#s=t=>{if(this.#e.has(t)){var r=this.#e.get(t),n=this.#n.get(r);if(n)Bo(n),this.#i.delete(r);else{var o=this.#r.get(r);o&&(this.#n.set(r,o.effect),this.#r.delete(r),$&&(o.fragment.lastChild[Is]=this.anchor),o.fragment.lastChild.remove(),this.anchor.before(o.fragment),n=o.effect)}for(let[s,a]of this.#e){if(this.#e.delete(s),s===t)break;let l=this.#r.get(a);l&&(ke(l.effect),this.#r.delete(a))}for(let[s,a]of this.#n){if(s===r||this.#i.has(s))continue;let l=i(()=>{if(Array.from(this.#e.values()).includes(s)){var _=document.createDocumentFragment();Kn(a,_),_.append(Ve()),this.#r.set(s,{effect:a,fragment:_})}else ke(a);this.#i.delete(s),this.#n.delete(s)},"on_destroy");this.#o||!n?(this.#i.add(s),gr(a,l,!1)):l()}}};#t=t=>{this.#e.delete(t);let r=Array.from(this.#e.values());for(let[n,o]of this.#r)r.includes(n)||(ke(o.effect),this.#r.delete(n))};ensure(t,r){var n=D,o=Fi();if(r&&!this.#n.has(t)&&!this.#r.has(t))if(o){var s=document.createDocumentFragment(),a=Ve();s.append(a),this.#r.set(t,{effect:Ye(()=>r(a)),fragment:s})}else this.#n.set(t,Ye(()=>r(this.anchor)));if(this.#e.set(n,t),o){for(let[l,f]of this.#n)l===t?n.unskip_effect(f):n.skip_effect(f);for(let[l,f]of this.#r)l===t?n.unskip_effect(f.effect):n.skip_effect(f.effect);n.oncommit(this.#s),n.ondiscard(this.#t)}else P&&(this.anchor=Y),this.#s(n)}};i(Xt,"BranchManager")});var iu=w(()=>{c();ee();j();dt();ce();lr();re();ye();ot();Pn();Wr()});function At(e,t,r=!1){var n;P&&(n=Y,Ke());var o=new Xt(e),s=r?65536:0;function a(l,f){if(P){var _=yo(n);if(l!==parseInt(_.substring(1))){var p=hr();pe(p),o.anchor=p,De(!1),o.ensure(l,f),De(!0);return}}o.ensure(l,f)}i(a,"update_branch"),bt(()=>{var l=!1;t((f,_=0)=>{l=!0,a(_,f)}),l||a(-1,null)},s)}var su=w(()=>{c();X();ce();j();Pn();i(At,"if_block")});function ya(e,t,r){P&&Ke();var n=new Xt(e),o=!ar();bt(()=>{var s=t();s!==s&&(s=od),o&&s!==null&&typeof s=="object"&&(s={}),n.ensure(s,r)})}var od,au=w(()=>{c();ye();j();ce();Pn();od=Symbol("NaN");i(ya,"key")});var lu=w(()=>{c();j();ce();Pe()});function cd(e,t,r){for(var n=[],o=t.length,s,a=t.length,l=0;l{if(s){if(s.pending.delete(v),s.done.add(v),s.pending.size===0){var d=e.outrogroups;xa(e,qn(s.done)),d.delete(s),d.size===0&&(e.outrogroups=null)}}else a-=1},!1)}if(a===0){var f=n.length===0&&r!==null;if(f){var _=r,p=_.parentNode;Mo(p),p.append(_),e.items.clear()}xa(e,t,!f)}else s={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(s)}function xa(e,t,r=!0){var n;if(e.pending.size>0){n=new Set;for(let a of e.pending.values())for(let l of a)n.add(e.items.get(l).e)}for(var o=0;o{var k=r();return _r(k)?k:k==null?[]:qn(k)});$&&ct(v,"{#each ...}");var d,b=new Map,y=!0;function m(k){C.effect.f&16384||(C.pending.delete(k),C.fallback=p,ud(C,d,a,t,n),p!==null&&(d.length===0?p.f&33554432?(p.f^=33554432,qo(p,null,a)):Bo(p):gr(p,()=>{p=null})))}i(m,"commit");function h(k){C.pending.delete(k)}i(h,"discard");var x=bt(()=>{d=u(v);var k=d.length;let V=!1;if(P){var Z=yo(a)===un;Z!==(k===0)&&(a=hr(),pe(a),De(!1),V=!0)}for(var U=new Set,G=D,Ce=Fi(),te=0;tes(a)):(p=Ye(()=>s(cu??=Ve())),p.f|=33554432)),k>U.size&&($?dd(d,n):Bs("","","")),P&&k>0&&pe(hr()),!y)if(b.set(G,U),Ce){for(let[ze,lt]of l)U.has(ze)||G.skip_effect(lt.e);G.oncommit(m),G.ondiscard(h)}else m(G);V&&De(!0),u(v)}),C={effect:x,flags:t,items:l,pending:b,outrogroups:null,fallback:p};y=!1,P&&(a=Y)}function jo(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function ud(e,t,r,n,o){var s=(n&8)!==0,a=t.length,l=e.items,f=jo(e.effect.first),_,p=null,v,d=[],b=[],y,m,h,x;if(s)for(x=0;x0){var te=n&4&&a===0?r:null;if(s){for(x=0;x{if(v!==void 0)for(h of v)h.nodes?.a?.apply()})}function fd(e,t,r,n,o,s,a,l){var f=a&1?a&16?_t(r):vn(r,!1,!1):null,_=a&2?_t(o):null;return $&&f&&(f.trace=()=>{l()[_?.v??o]}),{v:f,i:_,e:Ye(()=>(s(t,f??r,_??o,l),()=>{e.delete(n)}))}}function qo(e,t,r){if(e.nodes)for(var n=e.nodes.start,o=e.nodes.end,s=t&&!(t.f&33554432)?t.nodes.start:r;n!==null;){var a=We(n);if(s.before(n),n===o)return;n=a}}function rn(e,t,r){t===null?e.effect.first=r:t.next=r,r===null?e.effect.last=t:r.prev=t}function dd(e,t){let r=new Map,n=e.length;for(let o=0;o{c();re();ce();Pe();j();dt();ee();X();lr();H();J();Qr();ot();Ge();Hr();i(cd,"pause_effects");i(xa,"destroy_effects");i(wa,"each");i(jo,"skip_to_branch");i(ud,"reconcile");i(fd,"create_item");i(qo,"move");i(rn,"link");i(dd,"validate_each_keys")});var du=w(()=>{c();re();j();ce();An();Xe();tn();J();ye();Pe();H();X()});var pu=w(()=>{c();ce()});var Ea=w(()=>{c();tn();Ys();bo();bo()});function Mr(e,t,...r){var n=new Xt(e);bt(()=>{let o=t()??null;$&&o==null&&Il(),n.ensure(o,o&&(s=>o(s,...r)))},65536)}function _u(e){return(t,...r)=>{var n=e(...r),o;if(P)o=Y,Ke();else{var s=n.render().trim(),a=Ki(s);o=it(a),$&&(We(o)!==null||o.nodeType!==gi)&&Xl(),t.before(o)}let l=n.setup?.(o);fr(o,o),typeof l=="function"&&pt(l)}}var Ta=w(()=>{c();X();j();ye();ce();Wi();An();Xe();Ge();J();Pe();Ea();Pn();i(Mr,"snippet");i(_u,"createRawSnippet")});var hu=w(()=>{c();X();j();ce();Pn();re()});var ka=w(()=>{c();ee();J()});var vu=w(()=>{c();ka()});var Aa=w(()=>{c();ee();j();H();vu();Sn();re();X();lr();Ut()});var mu=w(()=>{c();re();ce();Pe();j();Sn();H();ye();J();X();An();tn();Pn();Aa()});var gu=w(()=>{c();ce();Pe();j();X()});var bu=w(()=>{c();J();ha();j();Pe()});function Vo(e,t,r){Tt(()=>{var n=ae(()=>t(e,r?.())||{});if(r&&n?.update){var o=!1,s={};Fe(()=>{var a=r();Gi(a),o&&wi(s,a)&&(s=a,n.update(a))}),o=!0}if(n?.destroy)return()=>n.destroy()})}var $u=w(()=>{c();j();xo();H();i(Vo,"action")});function Ho(e,t){var r=void 0,n;da(()=>{r!==(r=t())&&(n&&(ke(n),n=null),r&&(n=Ye(()=>{Tt(()=>r(e))})))})}var es=w(()=>{c();j();i(Ho,"attach")});var yu=w(()=>{c()});function xu(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(t=0;t{c();i(xu,"r");i(wu,"clsx")});function Br(e){return typeof e=="object"?wu(e):e??""}function Au(e,t,r){var n=e==null?"":""+e;if(t&&(n=n?n+" "+t:t),r){for(var o of Object.keys(r))if(r[o])n=n?n+" "+o:o;else if(n.length)for(var s=o.length,a=0;(a=n.indexOf(o,a))>=0;){var l=a+s;(a===0||Tu.includes(n[a-1]))&&(l===n.length||Tu.includes(n[l]))?n=(a===0?"":n.substring(0,a))+n.substring(l+1):a=l}}return n===""?null:n}function ku(e,t=!1){var r=t?" !important;":";",n="";for(var o of Object.keys(e)){var s=e[o];s!=null&&s!==""&&(n+=" "+o+": "+s+r)}return n}function Ca(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function Cu(e,t){if(t){var r="",n,o;if(Array.isArray(t)?(n=t[0],o=t[1]):n=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,a=0,l=!1,f=[];n&&f.push(...Object.keys(n).map(Ca)),o&&f.push(...Object.keys(o).map(Ca));var _=0,p=-1;let m=e.length;for(var v=0;v{c();yu();Eu();ee();i(Br,"clsx");Tu=[...` \r\f\xA0\v\uFEFF`];i(Au,"to_class");i(ku,"append_styles");i(Ca,"to_css_name");i(Cu,"to_style")});function Ae(e,t,r,n,o,s){var a=e.__className;if(P||a!==r||a===void 0){var l=Au(r,n,s);(!P||l!==e.getAttribute("class"))&&(l==null?e.removeAttribute("class"):t?e.className=l:e.setAttribute("class",l)),e.__className=r}else if(s&&o!==s)for(var f in s){var _=!!s[f];(o==null||_!==!!o[f])&&e.classList.toggle(f,_)}return s}var Sa=w(()=>{c();zo();ce();i(Ae,"set_class")});function Pa(e,t={},r,n){for(var o in r){var s=r[o];t[o]!==s&&(r[o]==null?e.style.removeProperty(o):e.style.setProperty(o,s,n))}}function Nn(e,t,r,n){var o=e.__style;if(P||o!==t){var s=Cu(t,n);(!P||s!==e.getAttribute("style"))&&(s==null?e.removeAttribute("style"):e.style.cssText=s),e.__style=t}else n&&(Array.isArray(n)?(Pa(e,r?.[0],n[0]),Pa(e,r?.[1],n[1],"important")):Pa(e,r,n));return n}var Na=w(()=>{c();zo();ce();i(Pa,"update_styles");i(Nn,"set_style")});var Oa=w(()=>{c();j();Ut();En();ee();Xe();ot();mt()});function Ct(e){if(P){var t=!1,r=i(()=>{if(!t){if(t=!0,e.hasAttribute("value")){var n=e.value;Ee(e,"value",null),e.value=n}if(e.hasAttribute("checked")){var o=e.checked;Ee(e,"checked",null),e.checked=o}}},"remove_defaults");e.__on_r=r,Ze(r),ji()}}function Ee(e,t,r,n){var o=kd(e);if(P&&(o[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName===Td)){n||Cd(e,t,r??"");return}o[t]!==(o[t]=r)&&(t==="loading"&&(e[gl]=r),r==null?e.removeAttribute(t):typeof r!="string"&&Ad(e).includes(t)?e[t]=r:e.setAttribute(t,r))}function kd(e){return e.__attributes??={[wd]:e.nodeName.includes("-"),[Ed]:e.namespaceURI===$i}}function Ad(e){var t=e.getAttribute("is")||e.nodeName,r=Su.get(t);if(r)return r;Su.set(t,r=[]);for(var n,o=e,s=Element.prototype;s!==o;){n=_i(o);for(var a in n)n[a].set&&r.push(a);o=cn(o)}return r}function Cd(e,t,r){$&&(t==="srcset"&&Sd(e,r)||Ra(e.getAttribute(t)??"",r)||Gl(t,e.outerHTML.replace(e.innerHTML,e.innerHTML&&"..."),String(r)))}function Ra(e,t){return e===t?!0:new URL(e,document.baseURI).href===new URL(t,document.baseURI).href}function Pu(e){return e.split(",").map(t=>t.trim().split(" ").filter(Boolean))}function Sd(e,t){var r=Pu(e.srcset),n=Pu(t);return n.length===r.length&&n.every(([o,s],a)=>s===r[a][1]&&(Ra(r[a][0],o)||Ra(o,r[a][0])))}var yd,xd,wd,Ed,Td,Su,Nu=w(()=>{c();J();ce();ee();Yo();qi();Xe();X();lr();tn();H();es();zo();Sa();Na();re();j();Oa();Wr();yd=Symbol("class"),xd=Symbol("style"),wd=Symbol("is custom element"),Ed=Symbol("is html"),Td=Ds?"link":"LINK";i(Ct,"remove_input_defaults");i(Ee,"set_attribute");i(kd,"get_attributes");Su=new Map;i(Ad,"get_setters");i(Cd,"check_src_in_dev_hydration");i(Ra,"src_url_equal");i(Pu,"split_srcset");i(Sd,"srcset_url_equal")});var Ou=w(()=>{c();ce();Pe();Wi();es()});var Ru=w(()=>{c();Ut()});function On(e,t,r=t){var n=new WeakSet;Vi(e,"input",async o=>{$&&e.type==="checkbox"&&Ms();var s=o?e.defaultValue:e.value;if(s=Ia(e)?Da(s):s,r(s),D!==null&&n.add(D),await Lo(),s!==(s=t())){var a=e.selectionStart,l=e.selectionEnd,f=e.value.length;if(e.value=s??"",l!==null){var _=e.value.length;a===l&&l===f&&_>f?(e.selectionStart=_,e.selectionEnd=_):(e.selectionStart=a,e.selectionEnd=Math.min(l,_))}}}),(P&&e.defaultValue!==e.value||ae(t)==null&&e.value)&&(r(Ia(e)?Da(e.value):e.value),D!==null&&n.add(D)),Fe(()=>{$&&e.type==="checkbox"&&Ms();var o=t();if(e===document.activeElement){var s=Te?Co:D;if(n.has(s))return}Ia(e)&&o===Da(e.value)||e.type==="date"&&!o&&!e.value||o!==e.value&&(e.value=o??"")})}function nn(e,t,r=t){Vi(e,"change",n=>{var o=n?e.defaultChecked:e.checked;r(o)}),(P&&e.defaultChecked!==e.checked||ae(t)==null)&&r(e.checked),Fe(()=>{var n=t();e.checked=!!n})}function Ia(e){var t=e.type;return t==="number"||t==="range"}function Da(e){return e===""?null:+e}var Iu=w(()=>{c();J();j();Ut();Ge();En();lr();ce();H();ye();ot();mt();i(On,"bind_value");i(nn,"bind_checked");i(Ia,"is_numberlike_input");i(Da,"to_number")});var Du=w(()=>{c();j();Ut()});var Mu=w(()=>{c();Ut()});var Bu=w(()=>{c();j();ee()});var on,Jn,Uo,ns,Lu,Ma,rs,Fu=w(()=>{c();j();H();Ma=class{constructor(t){fo(this,ns);fo(this,on,new WeakMap);fo(this,Jn,void 0);fo(this,Uo,void 0);$s(this,Uo,t)}observe(t,r){var n=Tr(this,on).get(t)||new Set;return n.add(r),Tr(this,on).set(t,n),za(this,ns,Lu).call(this).observe(t,Tr(this,Uo)),()=>{var o=Tr(this,on).get(t);o.delete(r),o.size===0&&(Tr(this,on).delete(t),Tr(this,Jn).unobserve(t))}}},rs=Ma;i(rs,"ResizeObserverSingleton"),on=new WeakMap,Jn=new WeakMap,Uo=new WeakMap,ns=new WeakSet,Lu=i(function(){return Tr(this,Jn)??$s(this,Jn,new ResizeObserver(t=>{for(var r of t){Ma.entries.set(r.target,r);for(var n of Tr(this,on).get(r.target)||[])n(r)}}))},"#getObserver"),ai(rs,"entries",new WeakMap)});function Yu(e,t){return e===t||e?.[Ie]===t}function dr(e={},t,r,n){var o=L.r,s=S;return Tt(()=>{var a,l;return Fe(()=>{a=l,l=n?.()||[],ae(()=>{e!==r(...l)&&(t(e,...l),a&&Yu(r(...a),e)&&t(null,...a))})}),()=>{let f=s;for(;f!==o&&f.parent!==null&&f.parent.f&33554432;)f=f.parent;let _=i(()=>{l&&Yu(r(...l),e)&&t(null,...l)},"teardown"),p=f.teardown;f.teardown=()=>{_(),p?.()}}}),e}var ju=w(()=>{c();X();ye();j();H();i(Yu,"is_bound_this");i(dr,"bind_this")});var qu=w(()=>{c();j();Ut()});var Vu=w(()=>{c();j();Ut()});var Ba=w(()=>{c();ee();j();Yo()});var Hu=w(()=>{c();ee();ye();Qr();j();H()});function fe(e,t,r){e.$$events||={},e.$$events[t]||=[],e.$$events[t].push(r)}function de(e){for(var t in e)t in this&&(this[t]=e[t])}var zu=w(()=>{c();dt();H();ee();i(fe,"add_legacy_event_listener");i(de,"update_legacy_props")});function A(e,t,r,n){var o=!vr||(r&2)!==0,s=(r&8)!==0,a=(r&16)!==0,l=n,f=!0,_=i(()=>(f&&(f=!1,l=a?ae(n):n),l),"get_fallback");let p;if(s){var v=Ie in e||go in e;p=xt(e,t)?.set??(v&&t in e?k=>e[t]=k:void 0)}var d,b=!1;s?[d,b]=Xs(()=>e[t]):d=e[t],d===void 0&&n!==void 0&&(d=_(),p&&(o&&Dl(t),p(d)));var y;if(o?y=i(()=>{var k=e[t];return k===void 0?_():(f=!0,k)},"getter"):y=i(()=>{var k=e[t];return k!==void 0&&(l=void 0),k===void 0?l:k},"getter"),o&&!(r&4))return y;if(p){var m=e.$$legacy;return function(k,V){return arguments.length>0?((!o||!V||m||b)&&p(V?y():k),k):y()}}var h=!1,x=(r&1?$n:yn)(()=>(h=!1,y()));$&&(x.label=t),s&&u(x);var C=S;return function(k,V){if(arguments.length>0){let Z=V?u(x):o&&s?Ir(k):k;return T(x,Z),h=!0,l!==void 0&&(l=Z),k}return It&&h||C.f&16384?x.v:u(x)}}var Uu=w(()=>{c();J();re();ee();dt();Qr();H();Ge();X();En();ko();mt();j();i(A,"prop")});var Gu=w(()=>{c();ye();re();j();Xe();ko();Wr()});function le(e){return new os(e)}var os,ht=w(()=>{c();X();j();dt();Sn();H();ot();ee();Ge();Xe();J();re();ye();mt();Or();Ba();i(le,"createClassComponent");os=class{#e;#n;constructor(t){var r=new Map,n=i((s,a)=>{var l=vn(a,!1,!1);return r.set(s,l),l},"add_source");let o=new Proxy({...t.props||{},$$events:{}},{get(s,a){return u(r.get(a)??n(a,Reflect.get(s,a)))},has(s,a){return a===go?!0:(u(r.get(a)??n(a,Reflect.get(s,a))),Reflect.has(s,a))},set(s,a,l){return T(r.get(a)??n(a,l),l),Reflect.set(s,a,l)}});this.#n=(t.hydrate?Zi:Cn)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),!Te&&(!t?.props?.$$host||t.sync===!1)&&E(),this.#e=o.$$events;for(let s of Object.keys(this.#n))s==="$set"||s==="$destroy"||s==="$on"||tt(this,s,{get(){return this.#n[s]},set(a){this.#n[s]=a},enumerable:!0});this.#n.$set=s=>{Object.assign(o,s)},this.#n.$destroy=()=>{Ji(this.#n)}}$set(t){this.#n.$set(t)}$on(t,r){this.#e[t]=this.#e[t]||[];let n=i((...o)=>r.call(this,...o),"cb");return this.#e[t].push(n),()=>{this.#e[t]=this.#e[t].filter(o=>o!==n)}}$destroy(){this.#n.$destroy()}};i(os,"Svelte4Component")});function La(e,t,r,n){let o=r[e]?.type;if(t=o==="Boolean"&&typeof t!="boolean"?t!=null:t,!n||!r[e])return t;if(n==="toAttribute")switch(o){case"Object":case"Array":return t==null?null:JSON.stringify(t);case"Boolean":return t?"":null;case"Number":return t??null;default:return t}else switch(o){case"Object":case"Array":return t&&JSON.parse(t);case"Boolean":return t;case"Number":return t!=null?+t:t;default:return t}}function Vd(e){let t={};return e.childNodes.forEach(r=>{t[r.slot||"default"]=!0}),t}var qd,Xu=w(()=>{c();ht();j();An();ee();Pe();typeof HTMLElement=="function"&&(qd=i(class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;$$me;$$shadowRoot=null;constructor(e,t,r){super(),this.$$ctor=e,this.$$s=t,r&&(this.$$shadowRoot=this.attachShadow(r))}addEventListener(e,t,r){if(this.$$l[e]=this.$$l[e]||[],this.$$l[e].push(t),this.$$c){let n=this.$$c.$on(e,t);this.$$l_u.set(t,n)}super.addEventListener(e,t,r)}removeEventListener(e,t,r){if(super.removeEventListener(e,t,r),this.$$c){let n=this.$$l_u.get(t);n&&(n(),this.$$l_u.delete(t))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let e=function(n){return o=>{let s=Dr("slot");n!=="default"&&(s.name=n),z(o,s)}};if(i(e,"create_slot"),await Promise.resolve(),!this.$$cn||this.$$c)return;let t={},r=Vd(this);for(let n of this.$$s)n in r&&(n==="default"&&!this.$$d.children?(this.$$d.children=e(n),t.default=!0):t[n]=e(n));for(let n of this.attributes){let o=this.$$g_p(n.name);o in this.$$d||(this.$$d[o]=La(o,n.value,this.$$p_d,"toProp"))}for(let n in this.$$p_d)!(n in this.$$d)&&this[n]!==void 0&&(this.$$d[n]=this[n],delete this[n]);this.$$c=le({component:this.$$ctor,target:this.$$shadowRoot||this,props:{...this.$$d,$$slots:t,$$host:this}}),this.$$me=fa(()=>{Fe(()=>{this.$$r=!0;for(let n of Ps(this.$$c)){if(!this.$$p_d[n]?.reflect)continue;this.$$d[n]=this.$$c[n];let o=La(n,this.$$d[n],this.$$p_d,"toAttribute");o==null?this.removeAttribute(this.$$p_d[n].attribute||n):this.setAttribute(this.$$p_d[n].attribute||n,o)}this.$$r=!1})});for(let n in this.$$l)for(let o of this.$$l[n]){let s=this.$$c.$on(n,o);this.$$l_u.set(o,s)}this.$$l={}}}attributeChangedCallback(e,t,r){this.$$r||(e=this.$$g_p(e),this.$$d[e]=La(e,r,this.$$p_d,"toProp"),this.$$c?.$set({[e]:this.$$d[e]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(e){return Ps(this.$$p_d).find(t=>this.$$p_d[t].attribute===e||!this.$$p_d[t].attribute&&t.toLowerCase()===e)||e}},"SvelteElement"));i(La,"get_custom_element_value");i(Vd,"get_custom_elements_slots")});var Ku=w(()=>{c();X();zn();Xe();H()});var at=w(()=>{c();zc();re();ye();Xc();ha();Kc();Jc();eu();tu();Hr();ru();nu();ou();iu();su();au();lu();fu();du();pu();Ta();hu();mu();gu();bu();$u();es();Nu();Sa();Yo();qi();Ou();Na();Aa();Ru();Iu();Du();Mu();Bu();Oa();Fu();ju();qu();Vu();ce();Ba();Hu();zu();An();Wr();ot();Qr();j();dt();Uu();ko();Ri();_a();Sn();H();Gu();ka();En();Xu();Pe();zo();zn();ee();Ea();aa();Ku();Gn()});function Wu(e,t){if(Te||bi("hydratable"),P){let r=window.__svelte?.h;if(r?.has(e))return r.get(e);$?Ol(e):Ul(e)}return t()}var Qu=w(()=>{c();mt();ce();Xe();Ge();J();i(Wu,"hydratable")});var Ya={};pf(Ya,{afterUpdate:()=>Xd,beforeUpdate:()=>Gd,createContext:()=>tc,createEventDispatcher:()=>Ud,createRawSnippet:()=>_u,flushSync:()=>E,fork:()=>vc,getAbortSignal:()=>Hd,getAllContexts:()=>rc,getContext:()=>js,hasContext:()=>Vs,hydratable:()=>Wu,hydrate:()=>Zi,mount:()=>Cn,onDestroy:()=>Go,onMount:()=>is,setContext:()=>qs,settled:()=>qc,tick:()=>Lo,unmount:()=>Ji,untrack:()=>ae});function Hd(){return I===null&&Nl(),(I.ac??=new AbortController).signal}function is(e){L===null&&Cr("onMount"),vr&&L.l!==null?Fa(L).m.push(e):$r(()=>{let t=ae(e);if(typeof t=="function")return t})}function Go(e){L===null&&Cr("onDestroy"),is(()=>()=>ae(e))}function zd(e,t,{bubbles:r=!1,cancelable:n=!1}={}){return new CustomEvent(e,{detail:t,bubbles:r,cancelable:n})}function Ud(){let e=L;return e===null&&Cr("createEventDispatcher"),(t,r,n)=>{let o=e.s.$$events?.[t];if(o){let s=_r(o)?o.slice():[o],a=zd(t,r,n);for(let l of s)l.call(e.x,a);return!a.defaultPrevented}return!0}}function Gd(e){L===null&&Cr("beforeUpdate"),L.l===null&&Ls("beforeUpdate"),Fa(L).b.push(e)}function Xd(e){L===null&&Cr("afterUpdate"),L.l===null&&Ls("afterUpdate"),Fa(L).a.push(e)}function Fa(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}var en=w(()=>{c();H();ee();at();Ge();mt();ye();J();ot();ye();Qu();Sn();H();Ta();if($){let e=function(t){if(!(t in globalThis)){let r;Object.defineProperty(globalThis,t,{configurable:!0,get:()=>{if(r!==void 0)return r;Ml(t)},set:n=>{r=n}})}};i(e,"throw_rune_error"),e("$state"),e("$effect"),e("$derived"),e("$inspect"),e("$props"),e("$bindable")}i(Hd,"getAbortSignal");i(is,"onMount");i(Go,"onDestroy");i(zd,"create_custom_event");i(Ud,"createEventDispatcher");i(Gd,"beforeUpdate");i(Xd,"afterUpdate");i(Fa,"init_update_callbacks")});var Zu=Wt(to=>{"use strict";c();Object.defineProperty(to,"__esModule",{value:!0});to.SvelteDialogSidebar=to.SvelteDialog=void 0;var eo=(en(),Ha(Ya)),ss=new Map,Xo=class extends Dialog{instance;anchor;titleInstance;footerInstance;constructor(t){let r=document.createComment("svelte-dialog-"+t.id),n={...t};typeof t.title!="string"&&(n.title=t.id),super({...n,lines:[r],component:void 0}),this.anchor=r,this.onBuild=()=>{this.dialogContentElement.appendChild(this.anchor)},this.onOpen=()=>{t.stackable||(ss.forEach(l=>l.cancel()),ss.clear());let s=ss.get(this.id);s&&(console.warn(`An existing instance of dialog "${this.id}" was found and will be closed before opening a new one.`),s.cancel()),ss.set(this.id,this);let a=this.dialogContentElement;if(a.style.overflow="visible",this.instance=(0,eo.mount)(t.component,{target:a,anchor:this.anchor,props:t.props??{},intro:t.intro,context:t.context}),console.log("Mounted Svelte component for dialog",this),typeof t.title!="string"){let l=this.dialogHandleElement;for(let _ of Array.from(l.childNodes))_.remove();let f=document.createComment("svelte-dialog-handle-"+guid());l.prepend(f),l.style.height="auto",l.style.minHeight="30px",this.titleInstance=(0,eo.mount)(t.title.component,{target:l,anchor:f,props:t.title.props??{},intro:t.intro,context:t.context})}if(t.footer){let l=this.dialogButtonBarElement,f=document.createComment("svelte-dialog-footer-"+guid());l.prepend(f),this.footerInstance=(0,eo.mount)(t.footer.component,{target:l,anchor:f,props:t.footer.props??{},intro:t.intro,context:t.context})}t.onOpen?.()};let o=i(()=>this.instance?((0,eo.unmount)(this.instance,{outro:t.outro??!1}),this.instance=void 0,!0):!1,"unmountSvelteComponent");this.confirm=s=>{if(s instanceof KeyboardEvent)switch(!0){case t.disableKeybinds:case(t.disableConfirmKeybind&&s.key===Keybinds.extra.confirm.keybind.getCode()):case(t.disableCancelKeybind&&s.key===Keybinds.extra.cancel.keybind.getCode()):s.preventDefault(),s.stopPropagation();return}this.close(this.confirmIndex,s)},this.onButton=(...s)=>{o()&&(t.onButton?.(...s),t.onClose?.())},this.onCancel=(...s)=>{o()&&(t.onCancel?.(...s),t.onClose?.())}}get dialogContentElement(){let t=this.object?.querySelector(".dialog_content");if(!t)throw new Error("Failed to find .dialog_content element");return t}get dialogHandleElement(){let t=this.object?.querySelector(".dialog_handle");if(!t)throw new Error("Failed to find .dialog_handle element");return t}get dialogButtonBarElement(){let t=this.object?.querySelector(".button_bar");if(!t)throw new Error("Failed to find .button_bar element");return t}};i(Xo,"SvelteDialog");to.SvelteDialog=Xo;var as=class extends Xo{pages;defaultPage;constructor(t){let r=t.onPageSwitch,n=i(l=>{let f=this.dialogContentElement;f.style.overflow="visible";let _=this.pages?.[l];if(!_){console.error(`Attempted to switch pages to unknown page "${l}" in "${t.id}" dialog`);return}this.instance&&(0,eo.unmount)(this.instance,{outro:!1}),this.instance=(0,eo.mount)(_.component,{target:f,anchor:this.anchor,props:_.props,intro:!1,context:_.context}),r?.(l)},"switchPage");if(Object.keys(t.pages).length===0)throw new Error("Attempted to create a sidebar dialog with no pages");let o=t.defaultPage??Object.keys(t.pages)[0],s=omitKeys({...t},["sidebar"]),a=setInterval(()=>{for(let[l,f]of Object.entries(this.pages))f.condition!==void 0&&(this.sidebar.page_menu[l].style.display=Condition(f.condition)?"":"none")},1e3/60);super({...s,sidebar:{pages:t.pages,page:o,onPageSwitch:n,actions:t.pageSwitchActions},component:t.pages[o].component,props:t.pages[o].props,onButton(...l){clearInterval(a),t.onButton?.(...l)},onCancel(...l){clearInterval(a),t.onCancel?.(...l)}}),this.pages=t.pages,this.defaultPage=o}};i(as,"SvelteDialogSidebar");to.SvelteDialogSidebar=as});var Ju=Wt(cs=>{"use strict";c();Object.defineProperty(cs,"__esModule",{value:!0});cs.SveltePanel=void 0;var ja=(en(),Ha(Ya)),ls=class extends Panel{instance;deleted=!1;constructor(t){let r=i(()=>this,"getScope");super(t.id,{...t,component:{template:"
",mounted(){r().instance=(0,ja.mount)(t.component,{target:this.$el.parentElement,props:t.props,intro:t.intro,context:t.context})},beforeDestroy(){let n=r();n.instance&&(0,ja.unmount)(n.instance).then(()=>{n.instance=void 0})}}})}delete(){this.instance&&(this.deleted=!0,(0,ja.unmount)(this.instance).then(()=>{this.instance=void 0})),super.delete()}};i(ls,"SveltePanel");cs.SveltePanel=ls});var tf=Wt(sn=>{"use strict";c();var Kd=sn&&sn.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),ef=sn&&sn.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&Kd(t,e,r)};Object.defineProperty(sn,"__esModule",{value:!0});ef(Zu(),sn);ef(Ju(),sn)});c();c();c();var Cs=gs(As());var rl="brush_tuna",nl="Brush Tuna",ol="1.0.6",il=["Texture","Paint","Tool"],sl="5.1.4",al={name:"SnaveSutit & Embody Games",email:"snavesutit@gmail.com",url:"https://snavesutit.github.io/"},ll={type:"github",url:"https://github.com/SnaveSutit/brush-tuna"},cl="Brush Tuna overhauls the Brush Presets system, providing an improved interface, and several new features.";var Zt={name:rl,title:nl,version:ol,tags:il,min_blockbench_version:sl,author:al,repository:ll,description:cl,main:"./dist/index.js",types:"./dist/src/index.d.ts",private:!0,scripts:{dev:"bun .scripts/esbuild.ts --mode=dev",build:"bun .scripts/esbuild.ts",test:"vitest",format:"prettier --write ."},devDependencies:{"@types/eslint":"^8.21.1","@types/fs-extra":"^11.0.4","@types/js-yaml":"^4.0.9","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.54.0","@typescript-eslint/parser":"^5.54.0","blockbench-patch-manager":"^1.1.0","blockbench-types":"^5.1.0-beta.1",esbuild:"^0.17.10","esbuild-plugin-import-folder":"^1.0.1","esbuild-plugin-import-glob":"^0.1.1","esbuild-plugin-inline-image":"^0.0.9","esbuild-plugin-svelte":"^0.1.1",eslint:"^8.35.0","eslint-plugin-svelte":"^3.17.1","js-yaml":"^4.1.0","node-modules-vscode-problems-patch":"^1.0.9",prettier:"^3.8.3","simple-subpub":"^1.2.0",svelte:"^5.55.5","svelte-eslint-parser":"^1.6.0","svelte-observable-store":"^1.0.1","svelte-patching-tools":"^1.0.14","svelte-preprocess":"^5.0.1","svelte-preprocess-esbuild":"^3.0.1","ts-loader":"^9.2.6",typescript:"^5.5.3","typescript-eslint":"^8.59.1",vitest:"^4.1.5",vue:"2.7.14"},license:"MIT"};c();c();var fi={en:{name:"en",structured:{brush_tuna:{curve_edit:{test_area:"Test pen pressure here",start:"Start",end:"End",ctrl_a:"Ctrl A",ctrl_b:"Ctrl B",copy:"Copy",copied:"Curve copied to clipboard",paste:"Paste",pasted:"Curve pasted from clipboard",clipboard_empty:"Clipboard is empty"},message:{brush_preset_switched:'Switched to brush preset "%s"'},action:{pressure_curve:"Pressure Curve",next_brush_preset:"Next Brush Preset",previous_brush_preset:"Previous Brush Preset"}}},flattened:{"brush_tuna.curve_edit.test_area":"Test pen pressure here","brush_tuna.curve_edit.start":"Start","brush_tuna.curve_edit.end":"End","brush_tuna.curve_edit.ctrl_a":"Ctrl A","brush_tuna.curve_edit.ctrl_b":"Ctrl B","brush_tuna.curve_edit.copy":"Copy","brush_tuna.curve_edit.copied":"Curve copied to clipboard","brush_tuna.curve_edit.paste":"Paste","brush_tuna.curve_edit.pasted":"Curve pasted from clipboard","brush_tuna.curve_edit.clipboard_empty":"Clipboard is empty","brush_tuna.message.brush_preset_switched":'Switched to brush preset "%s"',"brush_tuna.action.pressure_curve":"Pressure Curve","brush_tuna.action.next_brush_preset":"Next Brush Preset","brush_tuna.action.previous_brush_preset":"Previous Brush Preset"}}};function Af(){let e=settings.language.value,t=fi[e];return t||(console.warn(`Unknown language '${e}'`),t=fi.en),t}i(Af,"getCurrentLanguage");function Cf(e,...t){return e.replace(/%s/g,()=>t.shift()??"")}i(Cf,"replaceLocalizationPlaceholders");function Oe(e,...t){let r=Af(),n=r.flattened[e];return n??=fi.en.flattened[e],n?(t.length>0&&(n=Cf(n,...t)),n.startsWith("[Markdown]")?pureMarked(n.replace("[Markdown]","").trim()):n):(console.warn(`Could not find translation for '${e}' in language '${r.name}'`),e)}i(Oe,"localize");function ul(e){let t=StateMemory.brush_presets;if(!t.length)return;BrushTuna.brushPreset||(BrushTuna.brushPreset=t[0]);let r=e==="next"?1:-1,o=(t.indexOf(BrushTuna.brushPreset)+r+t.length)%t.length;Painter.loadBrushPreset(t[o]),Blockbench.showQuickMessage(Oe("brush_tuna.message.brush_preset_switched",BrushTuna.brushPreset.name))}i(ul,"switchBrushPreset");(0,Cs.registerDeletableHandlerPatch)({id:`${Zt.name}:actions/next_brush_preset`,create(){return new Action(`${Zt.name}:next_brush_preset`,{name:Oe("brush_tuna.action.next_brush_preset"),icon:"fa-forward",category:"paint",click:()=>ul("next"),keybind:new Keybind({key:221})})}});(0,Cs.registerDeletableHandlerPatch)({id:`${Zt.name}:actions/previous_brush_preset`,create(){return new Action(`${Zt.name}:previous_brush_preset`,{name:Oe("brush_tuna.action.previous_brush_preset"),icon:"fa-backward",category:"paint",click:()=>ul("previous"),keybind:new Keybind({key:219})})}});c();c();var ms=gs(As());c();var di=i((e,t,r)=>e+(t-e)*r,"lerp"),Ss=i((e,t,r)=>(e-t)/(r-t),"scale"),Sf=i((e,[t,r,n,o,s,a,l,f])=>e<=t?di(0,t,e/t):e>l?di(l,1,Ss(e,l,1)):(e=di(0,1,Ss(e,t,l)),Math.pow(1-e,3)*t+3*e*Math.pow(1-e,2)*n+3*e*e*(1-e)*s+e*e*e*l),"getCurveX"),mo=i((e,[t,r,n,o,s,a,l,f])=>e<=t?r:e>l?f:(e=di(0,1,Ss(e,t,l)),Math.pow(1-e,3)*r+3*e*Math.pow(1-e,2)*o+3*e*e*(1-e)*a+e*e*e*f),"getCurveY"),fl=i((e,t)=>({x:Sf(e,t),y:mo(e,t)}),"getCurveXY");c();function pi(e){let t,r;return e instanceof TouchEvent&&e.touches&&e.touches[0]&&e.touches[0]?.touchType==="stylus"&&e.touches[0]?.force!==void 0?(t=e.touches[0].force,r=e.touches[0].altitudeAngle):e.pressure>=0&&e.pressure<=1&&(e.pressure<1||e.pointerType!=="touch")&&e.pressure!==.5&&(t=e.pressure,r=e.altitudeAngle),{pressure:t,angle:r}}i(pi,"getPressureDataFromEvent");c();en();var of=gs(tf());c();ht();c();c();var rf="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(rf);at();c();ht();at();c();ht();at();c();ht();at();function vt(e,t){if(new.target)return le({component:vt,...e});ne(t,!0);let r=A(t,"children",7);var n={get children(){return r()},set children(a){r(a),E()},$set:de,$on:(a,l)=>fe(t,a,l)},o=Zn(),s=st(o);return Mr(s,()=>r()??Re),z(e,o),oe(n)}i(vt,"DialogItem");var Wd=W('');function us(e,t){if(new.target)return le({component:us,...e});ne(t,!0);let r=A(t,"icon",7),n=A(t,"label",7),o=A(t,"onclick",7);var s={get icon(){return r()},set icon(a){r(a),E()},get label(){return n()},set label(a){n(a),E()},get onclick(){return o()},set onclick(a){o(a),E()},$set:de,$on:(a,l)=>fe(t,a,l)};return vt(e,{children:(a,l)=>{var f=Wd(),_=q(f),p=N(_);F(f),ge(()=>{Ae(_,1,"fa fa-"+r()),we(p,` ${n()??""}`)}),Q("click",f,function(...v){o()?.apply(this,v)}),z(a,f)},$$slots:{default:!0}}),oe(s)}i(us,"Button");kt(["click"]);Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` button.svelte-1ythftc { display: flex; align-items: center; justify-content: center; width: -webkit-fill-available; gap: 4px; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});c();ht();at();var Qd=W('
');function Ko(e,t){if(new.target)return le({component:Ko,...e});ne(t,!0);let r=A(t,"id",7),n=A(t,"label",7),o=A(t,"checked",15);var s={get id(){return r()},set id(a){r(a),E()},get label(){return n()},set label(a){n(a),E()},get checked(){return o()},set checked(a){o(a),E()},$set:de,$on:(a,l)=>fe(t,a,l)};return vt(e,{children:(a,l)=>{var f=Qd(),_=q(f),p=q(_,!0);F(_);var v=N(_,2),d=N(q(v),2);Ct(d),F(v),F(f),ge(()=>{Ee(_,"for",r()),we(p,n()),Ee(d,"id",r())}),nn(d,o),z(a,f)},$$slots:{default:!0}}),oe(s)}i(Ko,"Checkbox");Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .checkbox_bar.svelte-1tphw2x { flex-direction: row; } .checkbox-line.svelte-1tphw2x { display: flex; flex-direction: row; align-items: center; height: min-content; flex-grow: 1; } .spacer.svelte-1tphw2x { flex-grow: 1; border-bottom: 2px dashed var(--color-button); height: 0px; margin: 8px; margin-left: 0px; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});c();ht();at();en();var Zd=W('
',1),Jd=W('
');function fs(e,t){if(new.target)return le({component:fs,...e});ne(t,!0);let r=A(t,"id",7),n=A(t,"label",7),o=A(t,"value",15),s=A(t,"disabled",7,!1),a=A(t,"children",7),l;yr(()=>{l=new ColorPicker(`color-picker-${guid()}`,{onChange(){let p=l.get();o(p.toHexString())}})}),$r(()=>{l.set(o())});function f(p){l.toElement(p),l.set(o())}i(f,"mountColorPicker"),Go(()=>{l.delete()});var _={get id(){return r()},set id(p){r(p),E()},get label(){return n()},set label(p){n(p),E()},get value(){return o()},set value(p){o(p),E()},get disabled(){return s()},set disabled(p=!1){s(p),E()},get children(){return a()},set children(p){a(p),E()},$set:de,$on:(p,v)=>fe(t,p,v)};return vt(e,{children:(p,v)=>{var d=Jd(),b=q(d),y=q(b,!0);F(b);var m=N(b,2);Vo(m,C=>f?.(C));var h=N(m,2);{var x=i(C=>{var k=Zd(),V=N(st(k),2);Mr(V,a),z(C,k)},"consequent");At(h,C=>{a()&&C(x)})}F(d),ge(()=>{Ae(b,1,`name_space_left ${s()?"disabled":""}`,"svelte-1tzmvuz"),Ee(b,"for",r()),we(y,n()),Ae(m,1,Br(s()?"disabled":""),"svelte-1tzmvuz")}),z(p,d)},$$slots:{default:!0}}),oe(_)}i(fs,"ColorPicker_1");Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .spacer.svelte-1tzmvuz { flex-grow: 1; border-bottom: 2px dashed var(--color-button); height: 0px; margin: 8px; margin-left: 0px; } .disabled.svelte-1tzmvuz { opacity: 0.5; pointer-events: none; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});c();ht();en();c();ht();at();var ep=W('
code
');function pr(e,t){if(new.target)return le({component:pr,...e});ne(t,!0);let r=A(t,"id",7),n=A(t,"step",7),o=A(t,"value",15),s=A(t,"min",15),a=A(t,"max",15),l=A(t,"disabled",7),f=xe(void 0);function _(h){let x=1/(n()??1);return Math.round(Math.clamp(Animator.MolangParser.parse(h),s()??-1/0,a()??1/0)*x)/x}i(_,"setValue");function p(h,x){x.preventDefault(),convertTouchEvent(x);let C=0;function k(Z){convertTouchEvent(Z);let U=Math.trunc((Z.clientX-x.clientX)/10)*(n()??1);U!=C&&(o(_(parseFloat(h.value)+(U-C))),h.value=o().toString(),C=U)}i(k,"move");function V(){removeEventListeners(document,"mousemove touchmove",k),removeEventListeners(document,"mouseup touchend",V)}i(V,"stop"),addEventListeners(document,"mousemove touchmove",k),addEventListeners(document,"mouseup touchend",V)}i(p,"onMousedown");function v(h,x,C){o(_(parseFloat(h.value))),h.value=o().toString()}i(v,"onFocusOut");var d={get id(){return r()},set id(h){r(h),E()},get step(){return n()},set step(h){n(h),E()},get value(){return o()},set value(h){o(h),E()},get min(){return s()},set min(h){s(h),E()},get max(){return a()},set max(h){a(h),E()},get disabled(){return l()},set disabled(h){l(h),E()},$set:de,$on:(h,x)=>fe(t,h,x)},b=ep(),y=q(b);Ct(y),dr(y,h=>T(f,h),()=>u(f));var m=N(y,2);return F(b),ge(()=>{Ae(b,1,`numeric_input ${l()?"disabled":""}`,"svelte-17ahl0s"),y.disabled=l()}),Q("focusout",y,()=>v(u(f),s(),a())),On(y,o),Q("mousedown",m,h=>p(u(f),h)),Q("touchstart",m,h=>p(u(f),h),void 0,!0),z(e,b),oe(d)}i(pr,"NumberSlider");kt(["focusout","mousedown","touchstart"]);Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` input.svelte-17ahl0s { padding: 0 6px !important; } .slider-fix.svelte-17ahl0s { right: 8px !important; } .disabled.svelte-17ahl0s { opacity: 0.5; pointer-events: none; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});at();var qa=null,tp=W('
',1),rp=W('
',1),np=W('
',1);function ro(e,t){if(new.target)return le({component:ro,...e});ne(t,!0);let r=A(t,"id",7),n=A(t,"label",7),o=A(t,"startX",15),s=A(t,"startY",15),a=A(t,"pointAX",15),l=A(t,"pointAY",15),f=A(t,"pointBX",15),_=A(t,"pointBY",15),p=A(t,"endX",15),v=A(t,"endY",15),d=A(t,"disabled",7,!1),b=A(t,"children",7),y=xe(void 0),m,h=xe(void 0),x=xe(void 0),C=xe(void 0),k=xe(void 0),V=xe(0),Z=i(M=>{T(V,pi(M).pressure??0,!0)},"readTestAreaPressure");function U(){qa=[o(),s(),a(),l(),f(),_(),p(),v()],Blockbench.showQuickMessage(Oe("brush_tuna.curve_edit.copied"))}i(U,"copyCurve");function G(){qa?((M=>{var _e=Rs(M,8);o(_e[0]),s(_e[1]),a(_e[2]),l(_e[3]),f(_e[4]),_(_e[5]),p(_e[6]),v(_e[7])})(qa),Blockbench.showQuickMessage(Oe("brush_tuna.curve_edit.pasted"))):Blockbench.showQuickMessage(Oe("brush_tuna.curve_edit.clipboard_empty"))}i(G,"pasteCurve");let Ce=i(()=>{if(!m)return;let M=o()*u(y).width,_e=(1-s())*u(y).height,be=p()*u(y).width,ze=(1-v())*u(y).height,lt=a()*u(y).width,Bt=(1-l())*u(y).height,Pt=f()*u(y).width,Se=(1-_())*u(y).height;if(m.clearRect(0,0,u(y).width,u(y).height),m.lineWidth=2,m.beginPath(),m.strokeStyle=getComputedStyle(document.body).getPropertyValue("--color-subtle_text"),m.moveTo(M,_e),m.lineTo(lt,Bt),m.moveTo(be,ze),m.lineTo(Pt,Se),m.stroke(),m.closePath(),be==M?(m.beginPath(),m.moveTo(M,_e),m.strokeStyle=getComputedStyle(document.body).getPropertyValue("--color-accent"),m.lineTo(be,ze),m.stroke(),m.closePath()):(m.beginPath(),m.moveTo(M,_e),m.strokeStyle=getComputedStyle(document.body).getPropertyValue("--color-accent"),m.bezierCurveTo(lt,Bt,Pt,Se,be,ze),m.stroke(),m.closePath()),m.beginPath(),m.strokeStyle=getComputedStyle(document.body).getPropertyValue("--color-accent"),m.moveTo(M,_e),m.lineTo(0,_e),m.stroke(),m.closePath(),m.beginPath(),m.strokeStyle=getComputedStyle(document.body).getPropertyValue("--color-accent"),m.moveTo(be,ze),m.lineTo(u(y).width,ze),m.stroke(),m.closePath(),u(V)>0){let{x:Nt,y:Lr}=fl(u(V),[o(),s(),a(),l(),f(),_(),p(),v()]);m.beginPath(),m.strokeStyle="red",m.arc(Nt*u(y).width,(1-Lr)*u(y).height,5,0,Math.PI*2),m.stroke(),m.closePath()}},"updateCurve");$r(()=>{T(V,u(V),!0),o()>p()&&(o(Math.min(o(),p())),p(Math.max(o(),p()))),u(h)&&(u(h).style.left=`${o()*u(y).width-5}px`,u(h).style.bottom=`${s()*u(y).height-5}px`),u(C)&&(u(C).style.left=`${a()*u(y).width-5}px`,u(C).style.bottom=`${l()*u(y).height-5}px`),u(k)&&(u(k).style.left=`${f()*u(y).width-5}px`,u(k).style.bottom=`${_()*u(y).height-5}px`),u(x)&&(u(x).style.left=`${p()*u(y).width-5}px`,u(x).style.bottom=`${v()*u(y).height-5}px`),Ce()});let te=i((M,_e)=>{_e.preventDefault(),convertTouchEvent(_e);let be=i(lt=>{convertTouchEvent(lt);let Bt=lt,Pt=u(y).getBoundingClientRect(),Se=Math.roundTo(Math.clamp((Bt.clientX-Pt.left)/u(y).width,0,1),2),Nt=Math.roundTo(Math.clamp(1-(Bt.clientY-Pt.top)/u(y).height,0,1),2);switch(M){case"start":o(Se),s(Nt),Se>p()&&p(Se);break;case"end":p(Se),v(Nt),Se{removeEventListeners(document,"mousemove touchmove",be),removeEventListeners(document,"mouseup touchend",ze)},"stop");addEventListeners(document,"mousemove touchmove",be),addEventListeners(document,"mouseup touchend",ze)},"onmousedown");is(()=>{m=u(y).getContext("2d"),Ce()});var He={get id(){return r()},set id(M){r(M),E()},get label(){return n()},set label(M){n(M),E()},get startX(){return o()},set startX(M){o(M),E()},get startY(){return s()},set startY(M){s(M),E()},get pointAX(){return a()},set pointAX(M){a(M),E()},get pointAY(){return l()},set pointAY(M){l(M),E()},get pointBX(){return f()},set pointBX(M){f(M),E()},get pointBY(){return _()},set pointBY(M){_(M),E()},get endX(){return p()},set endX(M){p(M),E()},get endY(){return v()},set endY(M){v(M),E()},get disabled(){return d()},set disabled(M=!1){d(M),E()},get children(){return b()},set children(M){b(M),E()},$set:de,$on:(M,_e)=>fe(t,M,_e)};return vt(e,{children:(M,_e)=>{var be=np(),ze=st(be),lt=q(ze),Bt=q(lt),Pt=q(Bt);dr(Pt,ie=>T(y,ie),()=>u(y));var Se=N(Pt,2);{var Nt=i(ie=>{var Er=tp(),B=st(Er);dr(B,K=>T(C,K),()=>u(C));var se=N(B,2);dr(se,K=>T(x,K),()=>u(x));var O=N(se,2);dr(O,K=>T(C,K),()=>u(C));var Ue=N(O,2);dr(Ue,K=>T(k,K),()=>u(k)),ge(()=>Nn(B,`left: ${o()*128-5}px; bottom: ${s()*128-5}px;`)),Q("mousedown",B,K=>!d()&&te("start",K)),Q("touchstart",B,K=>!d()&&te("start",K),void 0,!0),Q("mousedown",se,K=>!d()&&te("end",K)),Q("touchstart",se,K=>!d()&&te("end",K),void 0,!0),Q("mousedown",O,K=>!d()&&te("A",K)),Q("touchstart",O,K=>!d()&&te("A",K),void 0,!0),Q("mousedown",Ue,K=>!d()&&te("B",K)),Q("touchstart",Ue,K=>!d()&&te("B",K),void 0,!0),z(ie,Er)},"consequent");At(Se,ie=>{u(y)&&ie(Nt)})}F(Bt),F(lt);var Lr=N(lt,2),wr=q(Lr),io=q(wr,!0);F(wr);var Rn=N(wr,2);pr(Rn,{id:"start-x",min:0,max:1,step:.01,get disabled(){return d()},get value(){return o()},set value(ie){o(ie)}});var In=N(Rn,2);pr(In,{id:"start-y",min:0,max:1,step:.01,get disabled(){return d()},get value(){return s()},set value(ie){s(ie)}});var Fr=N(In,2),so=q(Fr,!0);F(Fr);var Dn=N(Fr,2);pr(Dn,{id:"end-x",min:0,max:1,step:.01,get disabled(){return d()},get value(){return p()},set value(ie){p(ie)}});var Mn=N(Dn,2);pr(Mn,{id:"end-y",min:0,max:1,step:.01,get disabled(){return d()},get value(){return v()},set value(ie){v(ie)}});var Yr=N(Mn,2),Bn=q(Yr,!0);F(Yr);var Qo=N(Yr,2);pr(Qo,{id:"point-ax",min:0,max:1,step:.01,get disabled(){return d()},get value(){return a()},set value(ie){a(ie)}});var ao=N(Qo,2);pr(ao,{id:"point-ay",min:0,max:1,step:.01,get disabled(){return d()},get value(){return l()},set value(ie){l(ie)}});var an=N(ao,2),Zo=q(an,!0);F(an);var lo=N(an,2);pr(lo,{id:"point-bx",min:0,max:1,step:.01,get disabled(){return d()},get value(){return f()},set value(ie){f(ie)}});var Jo=N(lo,2);pr(Jo,{id:"point-by",min:0,max:1,step:.01,get disabled(){return d()},get value(){return _()},set value(ie){_(ie)}}),F(Lr);var ei=N(Lr,2);{var ti=i(ie=>{var Er=rp(),B=N(st(Er),2);Mr(B,()=>b()??Re),z(ie,Er)},"consequent_1");At(ei,ie=>{b()&&ie(ti)})}F(ze);var ri=N(ze,2),Lt=q(ri),ni=q(Lt,!0);F(Lt);var oi=N(Lt,2),ln=q(oi),ii=q(ln,!0);F(ln);var co=N(ln,2),si=q(co,!0);F(co),F(oi),F(ri),ge((ie,Er,B,se,O,Ue,K)=>{Nn(lt,d()?"display: none;":""),Ee(Pt,"id",r()),Ae(wr,1,Br(d()?"disabled":""),"svelte-ybvjn5"),we(io,ie),Ae(Fr,1,Br(d()?"disabled":""),"svelte-ybvjn5"),we(so,Er),Ae(Yr,1,Br(d()?"disabled":""),"svelte-ybvjn5"),we(Bn,B),Ae(an,1,Br(d()?"disabled":""),"svelte-ybvjn5"),we(Zo,se),we(ni,O),we(ii,Ue),we(si,K)},[()=>Oe("brush_tuna.curve_edit.start"),()=>Oe("brush_tuna.curve_edit.end"),()=>Oe("brush_tuna.curve_edit.ctrl_a"),()=>Oe("brush_tuna.curve_edit.ctrl_b"),()=>Oe("brush_tuna.curve_edit.test_area"),()=>Oe("brush_tuna.curve_edit.copy"),()=>Oe("brush_tuna.curve_edit.paste")]),Q("pointerdown",Lt,Z),Q("pointermove",Lt,Z),Q("pointerup",Lt,Z),Q("touchstart",Lt,Z,void 0,!0),Q("touchmove",Lt,Z,void 0,!0),Q("touchend",Lt,Z),Q("click",ln,U),Q("click",co,G),z(M,be)},$$slots:{default:!0}}),oe(He)}i(ro,"CurveEdit");kt(["mousedown","touchstart","pointerdown","pointermove","pointerup","touchmove","touchend","click"]);Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .sliders.svelte-ybvjn5 { display: grid; grid-template-columns: 0.4fr 1fr 1fr; margin-left: 24px; row-gap: 6px; column-gap: 8px; } .sliders.svelte-ybvjn5 label:where(.svelte-ybvjn5) { display: flex; align-items: center; } .disabled.svelte-ybvjn5 { opacity: 0.5; pointer-events: none; } .group.svelte-ybvjn5 { border: 2px solid var(--color-border); padding: 10px; border-radius: 8px; } .canvas-container.svelte-ybvjn5 { position: relative; width: 128px; height: 128px; box-shadow: 0px 0px 0px 10px var(--color-back); border-radius: 2px; } .control-point.svelte-ybvjn5 { position: absolute; width: 10px; height: 10px; border-radius: 5px; cursor: pointer; } .start.svelte-ybvjn5 { background-color: var(--color-axis-x); } .a.svelte-ybvjn5 { background-color: var(--color-axis-y); } .b.svelte-ybvjn5 { background-color: var(--color-axis-z); } .end.svelte-ybvjn5 { background-color: var(--color-axis-w); } .spacer.svelte-ybvjn5 { flex-grow: 1; border-bottom: 2px dashed var(--color-button); height: 0px; margin: 8px; } .test-area.svelte-ybvjn5 { font-size: small; display: flex; align-items: center; justify-content: center; height: 32px; margin-bottom: 16px; border-radius: 6px; width: 152px; border: none; background: var(--color-button); text-align: center; vertical-align: middle; outline: none; height: 32px; min-width: 100px; color: var(--color-text); font-weight: normal; cursor: pointer; border-radius: 5px; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); } .button-bar.svelte-ybvjn5 { display: flex; flex-direction: row; gap: 8px; justify-content: space-between; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});c();ht();at();var op=W('
');function ds(e,t){if(new.target)return le({component:ds,...e});ne(t,!0);let r=A(t,"id",7),n=A(t,"label",7),o=A(t,"value",15),s=A(t,"disabled",7,!1);var a={get id(){return r()},set id(l){r(l),E()},get label(){return n()},set label(l){n(l),E()},get value(){return o()},set value(l){o(l),E()},get disabled(){return s()},set disabled(l=!1){s(l),E()},$set:de,$on:(l,f)=>fe(t,l,f)};return vt(e,{children:(l,f)=>{var _=op(),p=q(_),v=q(p,!0);F(p);var d=N(p,2);Ct(d),F(_),ge(()=>{Ee(p,"for",r()),we(v,n()),Ee(d,"id",r()),d.disabled=s(),Nn(d,s()?"color: var(--color-subtle_text);":"")}),On(d,o),z(l,_)},$$slots:{default:!0}}),oe(a)}i(ds,"LineEdit");c();ht();at();var ip=W('
code
');function no(e,t){if(new.target)return le({component:no,...e});ne(t,!0);let r=A(t,"id",7),n=A(t,"label",7),o=A(t,"description",7),s=A(t,"step",7),a=A(t,"value",15),l=A(t,"min",15),f=A(t,"max",15),_=A(t,"disabled",7),p=A(t,"children",7),v=xe(void 0);function d(h){let x=1/(s()??1);return Math.round(Math.clamp(Animator.MolangParser.parse(h),l()??-1/0,f()??1/0)*x)/x}i(d,"setValue");function b(h,x){x.preventDefault(),convertTouchEvent(x);let C=0;function k(Z){convertTouchEvent(Z);let U=Math.trunc((Z.clientX-x.clientX)/10)*(s()??1);U!=C&&(a(d(parseFloat(h.value)+(U-C))),h.value=a().toString(),C=U)}i(k,"move");function V(){removeEventListeners(document,"mousemove touchmove",k),removeEventListeners(document,"mouseup touchend",V)}i(V,"stop"),addEventListeners(document,"mousemove touchmove",k),addEventListeners(document,"mouseup touchend",V)}i(b,"onMousedown");function y(h,x,C){a(d(parseFloat(h.value))),h.value=a().toString()}i(y,"onFocusOut");var m={get id(){return r()},set id(h){r(h),E()},get label(){return n()},set label(h){n(h),E()},get description(){return o()},set description(h){o(h),E()},get step(){return s()},set step(h){s(h),E()},get value(){return a()},set value(h){a(h),E()},get min(){return l()},set min(h){l(h),E()},get max(){return f()},set max(h){f(h),E()},get disabled(){return _()},set disabled(h){_(h),E()},get children(){return p()},set children(h){p(h),E()},$set:de,$on:(h,x)=>fe(t,h,x)};return vt(e,{children:(h,x)=>{var C=ip(),k=q(C),V=q(k,!0);F(k);var Z=N(k,2),U=q(Z);Ct(U),dr(U,te=>T(v,te),()=>u(v));var G=N(U,2);F(Z);var Ce=N(Z,2);Mr(Ce,()=>p()??Re),F(C),ge(()=>{Ae(k,1,`name_space_left ${_()?"disabled":""}`,"svelte-17ahl0s"),Ee(k,"for",r()),we(V,n()),Ae(Z,1,`numeric_input ${_()?"disabled":""}`,"svelte-17ahl0s"),U.disabled=_()}),Q("focusout",U,()=>y(u(v),l(),f())),On(U,a),Q("mousedown",G,te=>b(u(v),te)),Q("touchstart",G,te=>b(u(v),te),void 0,!0),z(h,C)},$$slots:{default:!0}}),oe(m)}i(no,"NumberSlider");kt(["focusout","mousedown","touchstart"]);Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` input.svelte-17ahl0s { padding: 0 6px !important; } .slider-fix.svelte-17ahl0s { right: 8px !important; } .disabled.svelte-17ahl0s { opacity: 0.5; pointer-events: none; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});c();ht();at();var sp=W('
');function Wo(e,t){if(new.target)return le({component:Wo,...e});ne(t,!0);let r=A(t,"id",7),n=A(t,"label",7),o=A(t,"options",7),s=A(t,"value",15),a=R(()=>Object.keys(o())[0]),l;yr(()=>{s()||o()[s()]||s(u(a))}),$r(()=>{l.set(s())});let f=i(p=>{l=new Interface.CustomElements.SelectInput("dialog-select",{options:o(),value:s(),onChange(){let v=l?.node.getAttribute("value");if(v==null){console.warn("Select value is undefined");return}s(v)}}),p.appendChild(l.node)},"mountSelect");var _={get id(){return r()},set id(p){r(p),E()},get label(){return n()},set label(p){n(p),E()},get options(){return o()},set options(p){o(p),E()},get value(){return s()},set value(p){s(p),E()},$set:de,$on:(p,v)=>fe(t,p,v)};return vt(e,{children:(p,v)=>{var d=sp(),b=q(d),y=q(b,!0);F(b),F(d),Vo(d,m=>f?.(m)),ge(()=>{Ee(b,"for",r()),we(y,n())}),z(p,d)},$$slots:{default:!0}}),oe(_)}i(Wo,"Select");c();ht();at();var ap=W("
");function oo(e,t){if(new.target)return le({component:oo,...e});ne(t,!0);let r=A(t,"icon",7),n=A(t,"description",7),o=A(t,"checked",15),s=A(t,"disabled",7,!1);var a={get icon(){return r()},set icon(_){r(_),E()},get description(){return n()},set description(_){n(_),E()},get checked(){return o()},set checked(_){o(_),E()},get disabled(){return s()},set disabled(_=!1){s(_),E()},$set:de,$on:(_,p)=>fe(t,_,p)},l=ap(),f=q(l);return F(l),ge(()=>{Ae(l,1,`tool toggle-icon-button ${o()?"enabled":""} ${s()?"disabled":""}`,"svelte-nuhod1"),Ee(l,"title",n()),Ae(f,1,`fa fa-${r()??""}`,"svelte-nuhod1")}),Q("click",l,()=>{o(s()?o():!o())}),z(e,l),oe(a)}i(oo,"ToggleIconButton");kt(["click"]);Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .toggle-icon-button.svelte-nuhod1 { display: flex; align-items: center; justify-content: center; margin-left: 4px; } .toggle-icon-button.disabled.svelte-nuhod1 { opacity: 0.5; pointer-events: none; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});var lp=W(' ',1),cp=W(' ',1),up=W(' ',1),fp=W(''),dp=W('
',1);function ps(e,t){if(new.target)return le({component:ps,...e});ne(t,!0);let r=A(t,"presets",7),n=A(t,"presetIndex",15),o=A(t,"updatePresetHash",7),s=A(t,"deletePreset",7),a=R(()=>r()[n()]),l=R(()=>u(a).name),f=R(()=>u(a).shape),_=R(()=>u(a).blend_mode),p=R(()=>u(a).lock_alpha),v=R(()=>u(a).size),d=R(()=>u(a).size!=null),b=R(()=>u(a).size_pressure_curve!=null),y=R(()=>u(a).size_pressure_curve?.[0]??0),m=R(()=>u(a).size_pressure_curve?.[1]??0),h=R(()=>u(a).size_pressure_curve?.[2]??.25),x=R(()=>u(a).size_pressure_curve?.[3]??.25),C=R(()=>u(a).size_pressure_curve?.[4]??.75),k=R(()=>u(a).size_pressure_curve?.[5]??.75),V=R(()=>u(a).size_pressure_curve?.[6]??1),Z=R(()=>u(a).size_pressure_curve?.[7]??1),U=R(()=>u(a).softness),G=R(()=>u(a).softness!=null),Ce=R(()=>u(a).softness_pressure_curve!=null),te=R(()=>u(a).softness_pressure_curve?.[0]??0),He=R(()=>u(a).softness_pressure_curve?.[1]??0),M=R(()=>u(a).softness_pressure_curve?.[2]??.25),_e=R(()=>u(a).softness_pressure_curve?.[3]??.25),be=R(()=>u(a).softness_pressure_curve?.[4]??.75),ze=R(()=>u(a).softness_pressure_curve?.[5]??.75),lt=R(()=>u(a).softness_pressure_curve?.[6]??1),Bt=R(()=>u(a).softness_pressure_curve?.[7]??1),Pt=R(()=>u(a).opacity),Se=R(()=>u(a).opacity!=null),Nt=R(()=>u(a).opacity_pressure_curve!=null),Lr=R(()=>u(a).opacity_pressure_curve?.[0]??0),wr=R(()=>u(a).opacity_pressure_curve?.[1]??0),io=R(()=>u(a).opacity_pressure_curve?.[2]??.25),Rn=R(()=>u(a).opacity_pressure_curve?.[3]??.25),In=R(()=>u(a).opacity_pressure_curve?.[4]??.75),Fr=R(()=>u(a).opacity_pressure_curve?.[5]??.75),so=R(()=>u(a).opacity_pressure_curve?.[6]??1),Dn=R(()=>u(a).opacity_pressure_curve?.[7]??1),Mn=R(()=>u(a).pixel_perfect??!1),Yr=R(()=>u(a).color),Bn=R(()=>u(a).color!=null);yr(()=>{u(a).name=u(l),u(a).shape=u(f),u(a).blend_mode=u(_),u(a).lock_alpha=u(p),u(a).size=u(d)?u(v):null,u(a).size_pressure_curve=u(b)?[u(m),u(m),u(h),u(x),u(C),u(k),u(V),u(Z)]:null,u(a).softness=u(G)?u(U):null,u(a).softness_pressure_curve=u(Ce)?[u(He),u(He),u(M),u(_e),u(be),u(ze),u(lt),u(Bt)]:null,u(a).opacity=u(Se)?u(Pt):null,u(a).opacity_pressure_curve=u(Nt)?[u(wr),u(wr),u(io),u(Rn),u(In),u(Fr),u(so),u(Dn)]:null,u(a).pixel_perfect=u(Mn),u(a).color=u(Bn)?u(Yr):null,o()()});var Qo={get presets(){return r()},set presets(B){r(B),E()},get presetIndex(){return n()},set presetIndex(B){n(B),E()},get updatePresetHash(){return o()},set updatePresetHash(B){o(B),E()},get deletePreset(){return s()},set deletePreset(B){s(B),E()},$set:de,$on:(B,se)=>fe(t,B,se)},ao=dp(),an=st(ao);ds(an,{id:"brush-name",label:tl("generic.name"),get value(){return u(l)},set value(B){T(l,B)}});var Zo=N(an,2);Wo(Zo,{id:"brush-shape",label:tl("action.brush_shape"),options:{circle:tl("action.brush_shape.circle"),square:tl("action.brush_shape.square")},get value(){return u(f)},set value(B){T(f,B)}});var lo=N(Zo,2);Wo(lo,{id:"brush-blend-mode",label:tl("action.blend_mode"),options:{unset:tl("generic.unset"),default:tl("action.blend_mode.default"),set_opacity:tl("action.blend_mode.set_opacity"),color:tl("action.blend_mode.color"),behind:tl("action.blend_mode.behind"),multiply:tl("action.blend_mode.multiply"),add:tl("action.blend_mode.add"),lighten:tl("action.blend_mode.lighten"),darken:tl("action.blend_mode.darken"),screen:tl("action.blend_mode.screen"),overlay:tl("action.blend_mode.overlay"),difference:tl("action.blend_mode.difference")},get value(){return u(_)},set value(B){T(_,B)}});var Jo=N(lo,2);Ko(Jo,{id:"lock-alpha",label:tl("action.lock_alpha"),get checked(){return u(p)},set checked(B){T(p,B)}});var ei=N(Jo,2);{let B=R(()=>!u(d));no(ei,{id:"size",label:tl("action.slider_brush_size"),min:1,get disabled(){return u(B)},get value(){return u(v)},set value(se){T(v,se)},children:(se,O)=>{var Ue=lp(),K=st(Ue);{let Kt=R(()=>!u(d));oo(K,{icon:"weight-hanging",get disabled(){return u(Kt)},get checked(){return u(b)},set checked(uo){T(b,uo)}})}var jr=N(K,2);Ct(jr),nn(jr,()=>u(d),Kt=>T(d,Kt)),z(se,Ue)},$$slots:{default:!0}})}var ti=N(ei,2);{var ri=i(B=>{{let se=R(()=>tl("action.slider_brush_size")+" "+Oe("brush_tuna.action.pressure_curve"));ro(B,{id:"pressure-curve",get label(){return u(se)},get startX(){return u(y)},set startX(O){T(y,O)},get startY(){return u(m)},set startY(O){T(m,O)},get endX(){return u(V)},set endX(O){T(V,O)},get endY(){return u(Z)},set endY(O){T(Z,O)},get pointAX(){return u(h)},set pointAX(O){T(h,O)},get pointAY(){return u(x)},set pointAY(O){T(x,O)},get pointBX(){return u(C)},set pointBX(O){T(C,O)},get pointBY(){return u(k)},set pointBY(O){T(k,O)}})}},"consequent");At(ti,B=>{u(b)&&u(d)&&B(ri)})}var Lt=N(ti,2);{let B=R(()=>!u(Se));no(Lt,{id:"opacity",label:tl("action.slider_brush_opacity"),min:0,max:255,get disabled(){return u(B)},get value(){return u(Pt)},set value(se){T(Pt,se)},children:(se,O)=>{var Ue=cp(),K=st(Ue);{let Kt=R(()=>!u(Se));oo(K,{icon:"weight-hanging",get disabled(){return u(Kt)},get checked(){return u(Nt)},set checked(uo){T(Nt,uo)}})}var jr=N(K,2);Ct(jr),nn(jr,()=>u(Se),Kt=>T(Se,Kt)),z(se,Ue)},$$slots:{default:!0}})}var ni=N(Lt,2);{var oi=i(B=>{{let se=R(()=>tl("action.slider_brush_opacity")+" "+Oe("brush_tuna.action.pressure_curve"));ro(B,{id:"pressure-curve",get label(){return u(se)},get startX(){return u(Lr)},set startX(O){T(Lr,O)},get startY(){return u(wr)},set startY(O){T(wr,O)},get endX(){return u(so)},set endX(O){T(so,O)},get endY(){return u(Dn)},set endY(O){T(Dn,O)},get pointAX(){return u(io)},set pointAX(O){T(io,O)},get pointAY(){return u(Rn)},set pointAY(O){T(Rn,O)},get pointBX(){return u(In)},set pointBX(O){T(In,O)},get pointBY(){return u(Fr)},set pointBY(O){T(Fr,O)}})}},"consequent_1");At(ni,B=>{u(Nt)&&u(Se)&&B(oi)})}var ln=N(ni,2);{let B=R(()=>!u(G));no(ln,{id:"softness",label:tl("action.slider_brush_softness"),min:0,max:100,get disabled(){return u(B)},get value(){return u(U)},set value(se){T(U,se)},children:(se,O)=>{var Ue=up(),K=st(Ue);{let Kt=R(()=>!u(G));oo(K,{icon:"weight-hanging",get disabled(){return u(Kt)},get checked(){return u(Ce)},set checked(uo){T(Ce,uo)}})}var jr=N(K,2);Ct(jr),nn(jr,()=>u(G),Kt=>T(G,Kt)),z(se,Ue)},$$slots:{default:!0}})}var ii=N(ln,2);{var co=i(B=>{{let se=R(()=>tl("action.slider_brush_softness")+" "+Oe("brush_tuna.action.pressure_curve"));ro(B,{id:"pressure-curve",get label(){return u(se)},get startX(){return u(te)},set startX(O){T(te,O)},get startY(){return u(He)},set startY(O){T(He,O)},get endX(){return u(lt)},set endX(O){T(lt,O)},get endY(){return u(Bt)},set endY(O){T(Bt,O)},get pointAX(){return u(M)},set pointAX(O){T(M,O)},get pointAY(){return u(_e)},set pointAY(O){T(_e,O)},get pointBX(){return u(be)},set pointBX(O){T(be,O)},get pointBY(){return u(ze)},set pointBY(O){T(ze,O)}})}},"consequent_2");At(ii,B=>{u(Ce)&&u(G)&&B(co)})}var si=N(ii,2);Ko(si,{id:"pixel-perfect",label:tl("action.pixel_perfect_drawing"),get checked(){return u(Mn)},set checked(B){T(Mn,B)}});var ie=N(si,2);{let B=R(()=>!u(Bn));fs(ie,{id:"color",label:tl("data.color"),get disabled(){return u(B)},get value(){return u(Yr)},set value(se){T(Yr,se)},children:(se,O)=>{var Ue=fp();Ct(Ue),nn(Ue,()=>u(Bn),K=>T(Bn,K)),z(se,Ue)},$$slots:{default:!0}})}var Er=N(ie,4);return us(Er,{icon:"trash",label:tl("generic.delete"),get onclick(){return s()}}),z(e,ao),oe(Qo)}i(ps,"BrushOptions");Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .spacer.svelte-1jc80ge { height: 16px; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});c();ht();at();en();var pp=W('
'),_p=W('
'),hp=W('
');function _s(e,t){if(new.target)return le({component:_s,...e});ne(t,!0);let r=i((m,h=Re,x=Re)=>{var C=Zn(),k=st(C);{var V=i(U=>{var G=pp(),Ce=q(G),te=N(Ce);F(G),Ho(G,()=>_),ge(()=>{Ee(G,"title",h().name),Ae(Ce,1,`fa fa-${h().shape==="circle"?"circle":"square"}`),we(te,` ${h().name??""}`)}),Q("click",G,()=>f(x())),z(U,G)},"consequent"),Z=i(U=>{var G=_p(),Ce=q(G),te=N(Ce);F(G),ge(()=>{Ee(G,"title",h().name),Ae(Ce,1,`fa fa-${h().shape==="circle"?"circle":"square"}`),we(te,` ${h().name??""}`)}),Q("click",G,()=>f(x())),z(U,G)},"alternate");At(k,U=>{n()===x()?U(V):U(Z,-1)})}z(m,C)},"brushPresetItem"),n=A(t,"presetIndex",15),o=A(t,"presetHash",15),s=A(t,"presets",7),a=A(t,"updatePresetHash",7);function l(){let m={name:`Preset ${s().length+1}`,shape:"circle",lock_alpha:!1,size:16,size_pressure_curve:null,softness:.5,softness_pressure_curve:null,opacity:1,opacity_pressure_curve:null,color:null,blend_mode:"default"};s().push(m),f(s().length-1),a()()}i(l,"createPreset");function f(m){n(m),a()()}i(f,"selectPreset");let _=i(m=>{m.scrollIntoView({behavior:"instant",block:"center"})},"scrollSelectedIntoView");Go(()=>{StateMemory.save("brush_presets")});var p={get presetIndex(){return n()},set presetIndex(m){n(m),E()},get presetHash(){return o()},set presetHash(m){o(m),E()},get presets(){return s()},set presets(m){s(m),E()},get updatePresetHash(){return a()},set updatePresetHash(m){a(m),E()},$set:de,$on:(m,h)=>fe(t,m,h)},v=hp(),d=q(v);ya(d,o,m=>{var h=Zn(),x=st(h);wa(x,19,s,(C,k)=>k+C.name+C.shape,(C,k,V)=>{r(C,()=>u(k),()=>u(V))}),z(m,h)});var b=N(d,2),y=q(b);return F(b),F(v),Q("click",y,l),z(e,v),oe(p)}i(_s,"BrushPresetList");kt(["click"]);Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .brush-preset-list.svelte-1qfyl2h { display: flex; padding: 8px; border-radius: 8px; flex-direction: row; flex-wrap: wrap; gap: 8px; background: var(--color-back); margin-bottom: 24px; max-height: 128px; overflow-y: auto; } .brush-preset-item.svelte-1qfyl2h { gap: 4px; background: var(--color-button); border-radius: 8px; padding: 4px 8px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; } .selected.svelte-1qfyl2h { box-shadow: 0px 3px 0px 0px var(--color-accent); } .add-preset-button.svelte-1qfyl2h { width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; } .add-preset-button.svelte-1qfyl2h i:where(.svelte-1qfyl2h) { cursor: pointer; } .add-preset-button.svelte-1qfyl2h:hover { background-color: var(--color-secondary); border-radius: 4px; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});var vp=W('
');function hs(e,t){if(new.target)return le({component:hs,...e});ne(t,!0);let r=StateMemory.brush_presets,n=xe(0),o=xe(""),s=i(()=>{let d=r[u(n)];d?T(o,JSON.stringify(d),!0):T(o,"")},"updatePresetHash"),a=i(()=>{r.length!==0&&(r.splice(u(n),1),u(n)>=r.length&&T(n,r.length-1),s())},"deletePreset");var l={$set:de,$on:(d,b)=>fe(t,d,b)},f=vp(),_=q(f);_s(_,{get presets(){return r},updatePresetHash:s,get presetIndex(){return u(n)},set presetIndex(d){T(n,d,!0)},get presetHash(){return u(o)},set presetHash(d){T(o,d,!0)}});var p=N(_,2);{var v=i(d=>{ps(d,{get presets(){return r},deletePreset:a,updatePresetHash:s,get presetIndex(){return u(n)},set presetIndex(b){T(n,b,!0)}})},"consequent");At(p,d=>{r[u(n)]&&d(v)})}return F(f),z(e,f),oe(l)}i(hs,"BrushPresetsDialog");Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .brush-options-dialog.svelte-1tjprz0 { max-height: 75vh; overflow-y: auto; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});c();ht();c();mt();Zl();var nf="data:image/png;base64,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";at();var gp=W('
Brush Options Brush Options
');function vs(e,t){if(new.target)return le({component:vs,...e});ne(t,!1);var r={$set:de,$on:(s,a)=>fe(t,s,a)},n=gp(),o=q(n);return $o(),F(n),ge(()=>Ee(o,"src",nf)),z(e,n),oe(r)}i(vs,"Title");Blockbench.on("loaded_plugin",e=>{if(e?.plugin?.id==="brush_tuna"){let t=Blockbench.addCSS(` .brush-tuna-brush-options-title.svelte-4q4isa { display: flex; align-items: center; padding-left: 0px; } img.svelte-4q4isa { image-rendering: initial; width: 24px; height: 24px; margin-right: 8px; } `);Blockbench.once("unloaded_plugin",r=>{r?.plugin?.id==="brush_tuna"&&t?.delete()})}});function sf(){new of.SvelteDialog({id:`${Zt.name}:brush_options`,title:"menu.brush_presets.dialog",component:hs,singleButton:!0,onOpen(){let t=jQuery('dialog[id="brush_tuna:brush_options"] .dialog_title')[0];t&&(Cn(vs,{target:t.parentElement}),t.remove())}}).show()}i(sf,"openPenPusherBrushOptions");(0,ms.registerPropertyOverridePatch)({id:`${Zt.name}:painter/openBrushOptions`,target:Painter,key:"openBrushOptions",get(e){return function(){sf()}}});(0,ms.registerPropertyOverridePatch)({id:`${Zt.name}:painter/loadBrushPreset`,target:Painter,key:"loadBrushPreset",get(e){return function(t){e.call(this,t),BarItems.lock_alpha.set(t.lock_alpha),BrushTuna.brushPreset=t}}});(0,ms.registerPropertyOverridePatch)({id:`${Zt.name}:painter/useBrush`,target:Painter,key:"useBrush",get(e){return function(t,r,n,o,s){let a=BarItems.slider_brush_size,l=BarItems.slider_brush_softness,f=BarItems.slider_brush_opacity,_=a.get(),p=l.get(),v=f.get();if(BrushTuna.brushPreset){let d=BrushTuna.brushPreset,{pressure:b,angle:y}=pi(s);b!==void 0&&(d.size_pressure_curve&&a.setValue(_*mo(b,d.size_pressure_curve)),d.softness_pressure_curve&&l.setValue(p*mo(b,d.softness_pressure_curve)),d.opacity_pressure_curve&&f.setValue(v*mo(b,d.opacity_pressure_curve)))}e.call(this,t,r,n,o,s),a.setValue(_),l.setValue(p),f.setValue(v)}}});c();BBPlugin.register(rl,{title:nl,author:al.name,description:cl,icon:"icon.png",variant:"both",version:ol,min_version:sl,tags:il,bug_tracker:ll.url+"/issues",has_changelog:!0,onload(){},onunload(){},oninstall(){},onuninstall(){}});window.BrushTuna={brushPreset:null};})(); ================================================ FILE: plugins/brush_tuna/changelog.json ================================================ { "1.0.4": { "title": "v1.0.4", "author": "SnaveSutit & Embody Games", "date": "2025-05-05", "categories": [ { "title": "Changes", "list": ["Released the plugin!"] } ] } } ================================================ FILE: plugins/brush_tuna/members.yml ================================================ maintainers: - SnaveSutit ================================================ FILE: plugins/cameras.js ================================================ let deletables = []; BBPlugin.register('cameras', { title: 'Cameras', icon: 'videocam', author: 'JannisX11', description: 'Adds cameras to Blockbench. Cameras allow you to view the model from different angles, and can be animated to create camera paths.', about: 'Cameras can be added through the Edit menu. Enabling Split Screen from View > Split Screen is recommended to preview what the camera can see while editing it. Right-click the camera in the viewport to link or unlink it to the viewport.', version: '1.2.2', min_version: '4.3.0', variant: 'both', onload() { class CameraElement extends OutlinerElement { constructor(data, uuid) { super(data, uuid) for (var key in CameraElement.properties) { CameraElement.properties[key].reset(this); } if (data && typeof data === 'object') { this.extend(data) } } get origin() { return this.position; } getWorldCenter() { return THREE.fastWorldPosition(this.mesh, Reusable.vec2); } extend(object) { for (var key in CameraElement.properties) { CameraElement.properties[key].merge(this, object) } if (typeof object.vertices == 'object') { for (let key in object.vertices) { this.vertices[key] = object.vertices[key].slice(); } } this.sanitizeName(); return this; } getUndoCopy() { var copy = new CameraElement(this) copy.uuid = this.uuid; delete copy.parent; return copy; } getSaveCopy() { var el = {} for (var key in CameraElement.properties) { CameraElement.properties[key].copy(this, el) } el.type = 'camera'; el.uuid = this.uuid return el; } select(event, isOutlinerClick) { super.select(event, isOutlinerClick); if (Animator.open && Animation.selected) { Animation.selected.getBoneAnimator(this).select(true); } return this; } unselect(...args) { super.unselect(...args); if (Animator.open && Timeline.selected_animator && Timeline.selected_animator.element == this) { Timeline.selected_animator.selected = false; } } updatePreviewCamera(fov) { if (this.linked_preview) { let preview = Preview.all.find(preview => preview.id == this.linked_preview); if (!preview) return; if (preview.isOrtho) preview.setProjectionMode(false); preview.controls.unlinked = true; preview.camera.position.copy(this.getWorldCenter()); this.mesh.getWorldQuaternion(preview.camera.quaternion); // Update controls target in case camera is controlled by controls preview.controls.target.copy(preview.camera.position); let offset = Reusable.vec1.set(0, 0, -16).applyQuaternion(preview.camera.quaternion); preview.controls.target.add(offset); let preview_fov = (fov || this.fov) * 1.001; // padding to fix flickering with viewport border preview.setFOV(preview_fov); } } static behavior = { unique_name: true, movable: true, rotatable: true, } } window.CameraElement = CameraElement; /*Outliner.buttons.camera_linked = { id: 'camera_linked', title: 'Camera Active', icon: ' fas fa-link-slash', icon_off: ' fas fa-link', advanced_option: false };*/ CameraElement.prototype.title = 'Camera'; CameraElement.prototype.type = 'camera'; CameraElement.prototype.icon = 'fas fa-video'; CameraElement.prototype.movable = true; CameraElement.prototype.rotatable = true; CameraElement.prototype.needsUniqueName = true; CameraElement.prototype.menu = new Menu([ 'link_camera_to_preview', 'camera_to_view', 'edit_camera_properties', '_', ...Outliner.control_menu_group, '_', 'rename', 'delete' ]); CameraElement.prototype.buttons = [ //Outliner.buttons.camera_linked, Outliner.buttons.export, Outliner.buttons.locked, Outliner.buttons.visibility, ]; new Property(CameraElement, 'string', 'name', {default: 'camera'}) new Property(CameraElement, 'vector', 'position'); new Property(CameraElement, 'vector', 'rotation'); new Property(CameraElement, 'number', 'fov', { default: 70, inputs: { element_panel: { input: {label: 'FOV', type: 'number', min: 1, max: 160}, onChange() { Canvas.updateView({elements: CameraElement.selected, element_aspects: {transform: true}}); } } } }); new Property(CameraElement, 'vector2', 'aspect_ratio', { default: [16, 9], inputs: { element_panel: { input: {label: 'Aspect Ratio', type: 'vector', dimensions: 2}, onChange() { Canvas.updateView({elements: CameraElement.selected, element_aspects: {transform: true}}); } } } }); new Property(CameraElement, 'string', 'linked_preview'); new Property(CameraElement, 'boolean', 'camera_linked'); new Property(CameraElement, 'boolean', 'visibility', {default: true}); OutlinerElement.registerType(CameraElement, 'camera'); function getFrameVertices(camera, fov) { let r = 6; let deg = Math.degToRad(fov ?? camera.fov) / 2; let ratio = camera.aspect_ratio[0] / camera.aspect_ratio[1]; let h = r * Math.sin(deg); let d = r * Math.cos(deg); let w = h * ratio; let vertices = [ 0, 0, 0, -w, -h, -d, 0, 0, 0, w, -h, -d, 0, 0, 0, -w, h, -d, 0, 0, 0, w, h, -d, -w, -h, -d, w, -h, -d, -w, h, -d, w, h, -d, -w, h, -d, -w, -h, -d, w, h, -d, w, -h, -d, ]; return vertices; } new NodePreviewController(CameraElement, { setup(element) { var mesh = new THREE.Mesh( new THREE.BoxBufferGeometry(2.4, 1.3, 1.0), new THREE.MeshBasicMaterial({color: gizmo_colors.grid}) ); Project.nodes_3d[element.uuid] = mesh; mesh.name = element.uuid; mesh.type = element.type; mesh.isElement = true; mesh.visible = element.visibility; mesh.rotation.order = 'ZYX'; mesh.geometry.translate(0, 0, -0.5) let vertices = getFrameVertices(element, element.fov); let geometry = new THREE.BufferGeometry(); geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) ); mesh.line_material = new THREE.LineBasicMaterial({color: gizmo_colors.grid}); let frame = new THREE.LineSegments(geometry, mesh.material); frame.no_export = true; mesh.add(frame) mesh.outline = frame; mesh.fix_position = new THREE.Vector3(); mesh.fix_rotation = new THREE.Euler(); this.updateTransform(element); this.dispatchEvent('setup', {element}); }, updateTransform(element) { NodePreviewController.prototype.updateTransform.call(this, element); element.mesh.fix_position.copy(element.mesh.position); element.mesh.fix_rotation.copy(element.mesh.rotation); this.updateGeometry(element); element.updatePreviewCamera(); this.dispatchEvent('update_transform', {element}); }, updateGeometry(element) { let vertices = getFrameVertices(element, element.mesh.fov ?? element.fov); element.mesh.outline.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3)); this.dispatchEvent('update_geometry', {element}); }, updateSelection(element) { let {mesh} = element; mesh.material.color.set(element.selected ? gizmo_colors.outline : gizmo_colors.grid) mesh.line_material.color.set(element.selected ? gizmo_colors.outline : gizmo_colors.grid) this.dispatchEvent('update_selection', {element}); } }) let old_y_condition = KeyframeDataPoint.properties.y.condition; let old_z_condition = KeyframeDataPoint.properties.z.condition; KeyframeDataPoint.properties.y.condition = (point) => { return point.keyframe.channel == 'fov' ? false : old_y_condition(point); } KeyframeDataPoint.properties.z.condition = (point) => { return point.keyframe.channel == 'fov' ? false : old_z_condition(point); } let old_x_default = KeyframeDataPoint.properties.x.default; KeyframeDataPoint.properties.x.default = (point) => { return point.keyframe.channel == 'fov' ? (point.keyframe.animator.element?.fov || 70) : old_x_default(point); } let add_action = new Action('add_camera', { name: 'Add Camera', icon: 'fas.fa-video', category: 'edit', condition: () => Modes.edit, click() { Undo.initEdit({outliner: true, elements: [], selection: true}); var base_camera = new CameraElement().init() var group = getCurrentGroup(); base_camera.addTo(group) if (Format.bone_rig && group) { var pos1 = group.origin.slice() base_camera.extend({ position: pos1 }) } unselectAll(); base_camera.select() Undo.finishEdit('Add camera', {outliner: true, elements: selected, selection: true}); Blockbench.dispatchEvent( 'add_camera', {object: base_camera} ) return base_camera } }) Interface.Panels.outliner.menu.addAction(add_action, '3') MenuBar.menus.edit.addAction(add_action, '8') deletables.push(add_action); let link_action = new Toggle('link_camera_to_preview', { name: 'Link Camera to Preview', icon: 'emergency_recording', category: 'edit', condition: () => CameraElement.all.length && Preview.selected, onChange() { let should_have_preview = !(CameraElement.selected[0] || CameraElement.all[0]).linked_preview; if (!CameraElement.selected[0]) CameraElement.all[0].select(); Undo.initEdit({elements: CameraElement.selected}) CameraElement.selected.forEach(camera => { camera.linked_preview = should_have_preview ? Preview.selected.id : ''; if (should_have_preview) { camera.updatePreviewCamera(); } }) Undo.finishEdit('Link camera to preview') } }) deletables.push(link_action); Blockbench.on('update_selection', () => { if (CameraElement.selected[0]) { link_action.value = !!CameraElement.selected[0].linked_preview; link_action.updateEnabledState(); } Preview.all.forEach(preview => { let is_linked = CameraElement.all.find(camera => camera.linked_preview == preview.id); preview.controls.unlinked = !!is_linked; }) }) Preview.prototype.menu.addAction(link_action, -3); let set_fov_action = new Action('edit_camera_properties', { name: 'Camera Properties...', icon: 'settings_photo_camera', category: 'edit', condition: () => CameraElement.selected.length, click() { new Dialog('edit_camera_properties', { title: 'Edit Camera Properties', form: { fov: {label: 'FOV', value: CameraElement.selected[0]?.fov, type: 'number', min: 1, max: 160}, aspect_ratio: {label: 'Aspect Ratio', value: CameraElement.selected[0]?.aspect_ratio, type: 'vector', dimensions: 2, min: 1}, }, onConfirm(form) { Undo.initEdit({elements: CameraElement.selected}) CameraElement.selected.forEach(camera => { camera.fov = form.fov; camera.aspect_ratio.replace(form.aspect_ratio); CameraElement.preview_controller.updateTransform(camera); }) Undo.finishEdit('Change camera FOV') } }).show(); } }) deletables.push(set_fov_action); let snap_action = new Action('camera_to_view', { name: 'Move Camera to View', icon: 'fas.fa-video', category: 'edit', condition: () => CameraElement.selected.length && Modes.edit, click() { let position = Preview.selected.camera.position.toArray(); let rotation_euler = new THREE.Euler().copy(Preview.selected.camera.rotation).reorder('ZYX'); let rotation = rotation_euler.toArray().map(v => Math.radToDeg(v)); Undo.initEdit({elements: CameraElement.selected}); CameraElement.selected.forEach(cam => { cam.position.V3_set(position); cam.rotation.V3_set(rotation); cam.preview_controller.updateTransform(cam); }) Undo.finishEdit('Move camera to view') updateSelection(); } }) deletables.push(snap_action); const anim_sign = Blockbench.isNewerThan('4.99') ? 1 : -1; class CameraAnimator extends BoneAnimator { constructor(uuid, animation, name) { super(uuid, animation); this.uuid = uuid; this._name = name; this.position = []; this.rotation = []; this.fov = []; } get name() { var element = this.getElement(); if (element) return element.name; return this._name; } set name(name) { this._name = name; } getElement() { this.element = OutlinerNode.uuids[this.uuid]; return this.element } select(element_is_selected) { if (!this.getElement()) { unselectAll(); return this; } if (this.getElement().locked) return; if (element_is_selected !== true && this.element) { this.element.select(); } GeneralAnimator.prototype.select.call(this); if (this[Toolbox.selected.animation_channel] && (Timeline.selected.length == 0 || Timeline.selected[0].animator != this)) { var nearest; this[Toolbox.selected.animation_channel].forEach(kf => { if (Math.abs(kf.time - Timeline.time) < 0.002) { nearest = kf; } }) if (nearest) { nearest.select(); } } if (this.element && this.element.parent && this.element.parent !== 'root') { this.element.parent.openUp(); } return this; } doRender() { this.getElement() return (this.element && this.element && this.element.mesh); } displayPosition(arr, multiplier = 1) { var bone = this.element.mesh if (arr) { bone.position.x += arr[0] * multiplier * anim_sign; bone.position.y += arr[1] * multiplier; bone.position.z += arr[2] * multiplier; } return this; } displayRotation(arr, multiplier = 1) { var bone = this.element.mesh if (arr) { if (anim_sign == 1) { if (arr.length === 4) { var added_rotation = new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(arr), 'ZYX') bone.rotation.x += added_rotation.x * multiplier bone.rotation.y += added_rotation.y * multiplier bone.rotation.z += added_rotation.z * multiplier } else { bone.rotation.x += Math.degToRad(arr[0]) * multiplier bone.rotation.y += Math.degToRad(arr[1]) * multiplier bone.rotation.z += Math.degToRad(arr[2]) * multiplier } } else { arr.forEach((n, i) => { bone.rotation[getAxisLetter(i)] += Math.degToRad(n) * (i == 2 ? 1 : -1) * multiplier }) } } return this; } displayFrame(multiplier = 1) { if (!this.doRender()) return; this.getElement() let fov; if (!this.muted.position) { this.displayPosition(this.interpolate('position'), multiplier); } if (!this.muted.rotation) { this.displayRotation(this.interpolate('rotation'), multiplier); } if (!this.muted.fov) { fov = this.interpolate('fov')[0]; } this.element.mesh.updateMatrixWorld() this.element.mesh.fov = fov; this.element.preview_controller.updateGeometry(this.element); this.element.updatePreviewCamera(fov); } } CameraAnimator.prototype.type = 'camera'; CameraAnimator.prototype.channels = { position: {name: tl('timeline.position'), mutable: true, transform: true, max_data_points: 2}, rotation: {name: tl('timeline.rotation'), mutable: true, transform: true, max_data_points: 2}, fov: {name: 'FOV', mutable: true, transform: true, max_data_points: 2}, } CameraElement.animator = CameraAnimator; Blockbench.on('select_mode', (arg) => { if (arg.mode.id == 'animate') return; for (let camera of CameraElement.all) { camera.mesh.fov = camera.fov; CameraElement.preview_controller.updateGeometry(camera); } }) }, onunload() { deletables.forEach(action => { action.delete(); }) } }); ================================================ FILE: plugins/cardinal.js ================================================ (function() { let images = { north: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABVJREFUCNdjSGxgAKJKMEoHo0QEAgCIGwkHoSKsGQAAAABJRU5ErkJggg", east : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFAQMAAAC3obSmAAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABBJREFUCNdjKGBwYEgA4gIACMoBwSwi6WsAAAAASUVORK5CYII", south: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFAQMAAAC3obSmAAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABJJREFUCNdjKGBwYChgEGAoAAAIigGhv1KChwAAAABJRU5ErkJggg", west : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABhJREFUCNdjYGBgOHAAhM4gIWMGEGJgAACnnQmX+CnbdwAAAABJRU5ErkJggg" }, buildGridCopy = Canvas.buildGrid; Plugin.register("cardinal", { title: "Cardinal", author: "Bug1312", description: "Adds in all cardinal directions on the grid and renders them on-top of everything while facing the camera.", about: "If you wish to change the color, use custom CSS to set the variable 'cardinal' to any color! The scale can be changed from within the settings.", icon: "border_outer", version: "1.1.0", variant: "both", onload() { new Setting("cardinal_scale", { value: 1, category: "preview", name: "Cardinal Scale", description: "Change the scale of the cardinals", type: "number", onChange: build }); build(); }, onunload() { Canvas.buildGrid = buildGridCopy; window.buildGrid = Canvas.buildGrid; }, onuninstall() { Canvas.buildGrid() } }); function build() { Canvas.buildGrid = function() { // Default grid buildGridCopy(); // Hide default north mark let north_mark = three_grid.children.find(c => c.material === Canvas.northMarkMaterial); if (north_mark) north_mark.visible = false; // Generate other marks addMark(images.north, [ 0.0, -9.5 ]); addMark(images.east, [ 9.5, 0.0 ]); addMark(images.south, [ 0.0, 9.5 ]); addMark(images.west, [-9.5, 0.0 ]); }; window.buildGrid = Canvas.buildGrid; Canvas.buildGrid(); } function addMark(src, pos) { let img = new Image(), tex = new THREE.Texture(img), color = getComputedStyle(document.body).getPropertyValue("--cardinal").replace(/^\s*/, ""); if (color === "") color = "#FFF"; // Set textures to src img.src = src; img.tex = tex; // Render pixelated img.tex.magFilter = THREE.NearestFilter; img.tex.minFilter = THREE.NearestFilter; // When loaded, render texture but only do so after onBeforeRender() // Results in less flashing img.onload = function() { this.tex.needsUpdate = true }; // Setup cardinal mark let geometry = new THREE.PlaneGeometry(2.4 * settings.cardinal_scale.value, 2.4 * settings.cardinal_scale.value), material = new THREE.MeshBasicMaterial({ map: tex, transparent: true, color: new THREE.Color(color) }), mark = new THREE.Mesh(geometry, material); // Render on top mark.renderOrder = 10; mark.material.depthTest = false; mark.material.depthWrite = false; // Look at camera mark.onBeforeRender = function() { this.rotation.set(main_preview.camera.rotation.x, main_preview.camera.rotation.y, main_preview.camera.rotation.z) }; // Move marks based on grid positioning if (Format.centered_grid) mark.position.set(pos[0], 0, pos[1]); else mark.position.set(pos[0] + 8, 0, pos[1] + 8); // Add to grid three_grid.add(mark); } })(); ================================================ FILE: plugins/cem_template_loader/about.md ================================================

CEM Template Loader can be used to load the vanilla entity models for Minecraft: Java Edition, so you can use them in OptiFine CEM, or as texturing templates.

To use this plugin, head to the Tools menu and select CEM Template Loader. From here, select the model that you would like to edit and load it.

After editing your model, export it as an OptiFine JEM to the folder assets/minecraft/optifine/cem. If a texture is used in the model, make sure it saves with a valid file path.

Important

When editing an entity model, you cannot rotate root groups (top level folders), or move the pivot points of root groups, as this can break your model. If you need to rotate a root group, use a subgroup. If you need to change a root group's pivot point, use CEM animations.

Animation Editor

CEM Template Loader also includes an animation editor, so that you can create custom entity animations.

================================================ FILE: plugins/cem_template_loader/cem_template_loader.js ================================================ (() => { let plugin const connection = { roots: [ `https://wynem.com/assets`, `https://raw.githubusercontent.com/ewanhowell5195/wynem/main/src/assets`, `https://cdn.jsdelivr.net/gh/ewanhowell5195/wynem/src/assets` ], rootIndex: 0 } let root = connection.roots[0] const id = "cem_template_loader" const name = "CEM Template Loader" const icon = "keyboard_capslock" const description = "Load template Java Edition entity models for use with OptiFine CEM." const links = { website: { text: "By Ewan Howell", link: "https://ewanhowell.com/", icon: "language", colour: "#33E38E" }, discord: { text: "Discord Server", link: "https://discord.ewanhowell.com/", icon: "fab.fa-discord", colour: "#727FFF" }, tutorial: { text: "CEM Modelling Tutorial", link: "https://youtu.be/arj2eim42KI", icon: "fab.fa-youtube", colour: "#FF4444" } } function loadPlugin() { plugin = Plugin.register(id, { title: name, icon: "icon.png", author: "Ewan Howell", description: description + " Also includes an animation editor, so that you can create custom entity animations.", tags: ["Minecraft: Java Edition", "OptiFine", "Templates"], version: "9.1.1", min_version: "5.0.0", variant: "both", creation_date: "2020-02-02", has_changelog: true, website: "https://ewanhowell.com/plugins/cem-template-loader/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/cem_template_loader", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[CEM Template Loader]", onload() { loadCEMTemplateLoader() loadOptiFineEntityRestrictions() loadOptiFineAnimationEditor() }, onunload() { unloadCEMTemplateLoader() unloadOptiFineEntityRestrictions() unloadOptiFineAnimationEditor() } }) } async function fetchData(path, fallback) { // if (path === "json/cem_template_models.json") { // const fs = require("fs") // return JSON.parse(fs.readFileSync("E:/Programming/GitHub/wynem/src/assets/json/cem_template_models.json")) // } const currentRoot = connection.rootIndex try { const r = await fetch(`${root}/${path}`) if (!r.ok) throw new Error if (r.headers.get("Content-Type")?.startsWith("text/html")) { return } if (r.headers.get("Content-Type")?.startsWith("text/plain") || r.headers.get("Content-Type")?.startsWith("application/json")) { return r.json() } return r } catch { for (let x = currentRoot + 1; x < connection.roots.length; x++) { try { const r = await fetch(`${connection.roots[x]}/${path}`) if (r.status !== 200) { throw new Error } root = connection.roots[x] connection.rootIndex = x if (r.headers.get("Content-Type")?.startsWith("text/plain") || r.headers.get("Content-Type")?.startsWith("application/json")) { return r.json() } return r } catch {} } connection.failed = true return fallback ? fallback() : {} } } // CEM TEMPLATE LOADER let styles, loader, loaderDialog, modelData, loadingPromise const loaderData = { connection: null, loading: true, categories: {}, category: null, loadTexture: true, entity: null, subentity: null, search: "", entities: [], built: false } async function loadCEMTemplateLoader() { styles = Blockbench.addCSS(` .spacer { flex: 1; } .cem-template-loader-links { display: flex; justify-content: space-around; margin: 20px 40px 0; } .cem-template-loader-links > a { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 5px; text-decoration: none; flex-grow: 1; flex-basis: 0; color: var(--color-subtle_text); text-align: center; } .cem-template-loader-links > a:hover { background-color: var(--color-accent); color: var(--color-light); } .cem-template-loader-links > a > i { font-size: 32px; width: 100%; max-width: initial; height: 32px; text-align: center; } .cem-template-loader-links > a:hover > i { color: var(--color-light) !important; } .cem-template-loader-links > a > p { flex: 1; display: flex; align-items: center; } #format_page_cem_template_loader { padding-bottom: 0; } #format_page_cem_template_loader .format_target { margin-bottom: 6px; } #format_page_cem_template_loader div:nth-child(3), #format_page_cem_template_loader content { overflow-y: auto; } #cem-container { display: flex; flex-direction: column; height: 100%; } .cem-overlay { position: absolute; inset: 0; z-index: 2; background-color: var(--color-ui); display: flex; flex-direction: column; padding: 40px; text-align: center; gap: 16px; overflow-y: auto; > * { max-width: 512px; margin: 0 auto !important; } > :first-child { margin-top: auto !important; } > :last-child { margin-bottom: auto !important; } } `) loader = new ModelLoader(id, { name, description, icon, onStart: openLoader, format_page: { component: { methods: { openLoader }, template: `

${description}

Target : Minecraft: Java Edition with OptiFine Texturing Templates

How to use:

  • Press Load CEM Template and select a model.

  • Select your load settings, load the model, then edit the model.

  • Export your model as an OptiFine JEM to assets/minecraft/optifine/cem, using the provided name.

Do:

  • Edit any of the cubes that were loaded with the template, add your own cubes, and create your own subgroups.

Do not:

  • Edit any of the groups that were loaded with the template, add your own root groups, or remove any built in animations.

` } } }) loaderDialog = new Dialog({ id, title: name, width: 980, buttons: [], sidebar: { pages: {}, onPageSwitch(page) { loaderDialog.content_vue.category = page loaderDialog.content_vue.$refs.entry.focus() } }, lines: [``], component: { data: loaderData, methods: { async load() { this.loading = true await loadModel(this.subentity ?? this.entity, this.loadTexture) loaderDialog.close() }, reload() { window.cemTemplateLoaderReloaded = true plugin.reload() }, close: () => loaderDialog.close(), selectEntity(model) { if (this.entity !== model.id) { this.entity = model.id } else if (!this.subentity) { this.entity = null } this.subentity = null }, selectSubentity(model, submodel) { if (this.search && this.subentity === submodel.id) { this.entity = null this.subentity = null } else if (this.subentity !== submodel.id) { this.entity = model.id this.subentity = submodel.id } else { this.subentity = null } }, areAllNextItemsHidden(entities, heading) { const index = entities.indexOf(heading) for (let i = index + 1; i < entities.length; i++) { if (entities[i].type === "heading") break if (entities[i].id.includes(this.search)) return false } return true } }, template: `

Loading...

Connection Failed

Failed to load CEM Template data.

Please make sure you are connected to the internet, and can access this cem_template_models.json file.

If you are unable to access the cem_template_models.json file, it may be blocked by your computer or your internet service provider. If it is not your computer blocking it, you may be able to use a VPN to bypass the block. One good example is Cloudflare WARP, which is a free program that commonly resolves this issue.

{{ category }}

{{ categories[category]?.description }}

No results

` }, async onBuild() { loaderData.connection = connection await loadCEMTemplateModels() this.sidebar.build() if (!modelData.categories) { return this.content_vue.$forceUpdate() } const categories = modelData.categories.filter(e => !e.type).map(e => [e.name, e]) loaderData.categories = Object.fromEntries(categories) loaderData.entities = categories.flatMap(c => c[1].entities.map(e => [c[0], e.id])) loaderData.loading = false loaderData.built = true }, onOpen() { this.content_vue.$refs.entry.focus() if (loaderData.built) { loaderData.loading = false this.content_vue.$forceUpdate() } } }) MenuBar.addAction(new Action(id, { name, description, children: [ new Action("cem_template_loader_placeholder", { name: `All Entities`, description: "All entities", icon: "icon-player", click: () => openLoader() }) ], icon }), "tools") const script = document.createElement("script") script.innerHTML = ` if (!window.cemTemplateModelsLoaded) { loadCEMTemplateModels() } ` BarItems.cem_template_loader.menu_node.append(script) if (window.cemTemplateLoaderReloaded) { delete window.cemTemplateLoaderReloaded openLoader() } else if (Blockbench.isWeb) { const params = (new URL(location.href)).searchParams if (params.get("plugins")?.split(",").includes(id) && params.get("model") !== "") { if (!await MinecraftEULA.promptUser(id)) return await loadCEMTemplateModels() loadModel(params.get("model"), params.has("texture")) } } } function unloadCEMTemplateLoader() { styles.delete() loader.delete() loaderDialog.close() for (const child of BarItems.cem_template_loader.children) { child.delete?.() } BarItems.cem_template_loader.delete() delete window.loadCEMTemplateModels delete window.cemTemplateModelsLoaded } function resolvePopup(node, popups) { const popup = node.popup if (!popup) return undefined const master = node.file ?? node.id const display = node.name ?? String(master).split("_").filter(Boolean).map(p => p[0].toUpperCase() + p.slice(1)).join(" ") if (Array.isArray(popup)) { const [popupId, ...extra] = popup const template = popups[popupId] if (!template) return popupId return template.replace(/\{(\d+)\}/g, (_, n) => [display, ...extra][Number(n)] ?? `{${n}}`) } if (typeof popup === "object") return popup if (typeof popup === "string") { const template = popups[popup] if (template) return template.replace(/\{(\d+)\}/g, (_, n) => [display][Number(n)] ?? `{${n}}`) return popup } return undefined } window.loadCEMTemplateModels = async () => { if (window.cemTemplateModelsLoaded) return loadingPromise loadingPromise = fetchData("json/cem_template_models.json") modelData = await loadingPromise window.cemTemplateModelsLoaded = true if (!modelData.categories) return const firstCategory = modelData.categories.find(c => !c.type) loaderDialog.sidebar.page = firstCategory.name loaderData.category = firstCategory.name modelData.entities = [] for (const category of modelData.categories) { if (category.type === "heading") { loaderDialog.sidebar.pages["_" + category.text] = new MenuSeparator(category.text, category.text) continue } loaderDialog.sidebar.pages[category.name] = { label: category.name, icon: category.icon } for (let i = 0; i < category.entities.length; i++) { if (category.entities[i].type) continue category.entities[i].popup = resolvePopup(category.entities[i], modelData.popups) modelData.entities.push(category.entities[i]) if (category.entities[i].variants) { for (let j = 0; j < category.entities[i].variants.length; j++) { if (!category.entities[i].variants[j].model) { category.entities[i].variants[j].model = category.entities[i].model ?? category.entities[i].id } category.entities[i].variants[j].popup = resolvePopup(category.entities[i].variants[j], modelData.popups) modelData.entities.push(category.entities[i].variants[j]) } } } } BarItems.cem_template_loader_placeholder.delete() BarItems.cem_template_loader.children = [] for (let i = 0; i < modelData.categories.length; i++) { const e = modelData.categories[i] if (e.type === "heading") { if (i > 0 && i < modelData.categories.length - 1) { BarItems.cem_template_loader.children.push("_") } continue } BarItems.cem_template_loader.children.push(new Action(`cem_template_loader_${e.name.replace(/ /g, "_")}`, { plugin: id, name: `${e.name} Entities`, description: e.description, icon: e.icon, click: () => openLoader(e.name) })) } BarItems.cem_template_loader.children.push("_", { name: `Models v${modelData.version}`, id: "cem_template_loader_models_version", icon: "info", click: () => openLoader() }) if (MenuBar.menus.tools.label.classList.contains("opened")) { MenuBar.menus.tools.show() } } async function openLoader(category) { if (!await MinecraftEULA.promptUser(id)) return if (category) { loaderData.category = category loaderDialog.sidebar.page = category if (loaderDialog.content_vue) loaderDialog.sidebar.build() } loaderDialog.show() } const getBase64FromBlob = blob => new Promise(async fulfil => { const reader = new FileReader() reader.onloadend = () => fulfil(reader.result) reader.readAsDataURL(blob) }) async function loadModel(entity, loadTexture) { const data = modelData.entities.find(e => e.id === entity) if (!data) return Blockbench.showQuickMessage("Unknown CEM template model", 2000) const model = modelData.models[data.model ?? data.id] newProject(Formats.optifine_entity) Project.name = data.file ?? data.id Blockbench.setStatusBarText(data.id) Formats.optifine_entity.codec.parse(JSON.parse(model.model), "") let textureLoaded if (loadTexture && !data.textureless) { try { const textures = Array.isArray(data.vanilla_textures) ? data.vanilla_textures : [data.vanilla_textures ?? data.id] for (const [i, name] of textures.entries()) { const texture = await fetchData(`images/minecraft/entities/${entity}${i ? `_${i}` : ""}.png`, () => null) if (!texture) throw Error const tex = new Texture({ name }).fromDataURL(await getBase64FromBlob(await texture.blob())).add() if (!i && textures.length === 1) { tex.use_as_default = true } } textureLoaded = true } catch { Blockbench.showQuickMessage("Unable to load vanilla texture", 2000) loaderDialog.content_vue?.$forceUpdate() } } if (!textureLoaded && !data.textureless) { const textureData = Array.isArray(model.texture_data) ? model.texture_data : [model.texture_data] const textureNames = Array.isArray(data.texture) ? data.texture : [data.texture ?? data.id] const length = Math.max(textureData.length, textureNames.length) for (const cube of Cube.all) { cube.markAsSelected() } for (let i = 0; i < length; i++) { if (textureData[i]) { new Texture({ name: textureNames[i] ?? data.id }).fromDataURL("data:image/png;base64," + textureData[i]).add() } else { TextureGenerator.addBitmap({ name: textureNames[i] ?? data.id, color: new tinycolor("#00000000"), type: "template", rearrange_uv: false, resolution: "16" }) } } for (const cube of Cube.all) { cube.unselect() } if (length.length > 1) { Texture.all.forEach(t => t.use_as_default = false) } } if (data.popup) { Blockbench.showMessageBox({ title: data.popup.title ?? "Before you start...", message: data.popup.message ?? data.popup, width: data.popup.width }) } } // OPTIFINE ENTITY RESTRICTIONS let editCheck, jemRestrictionsDialog, originalJEMFormat, restrictionStyles function loadOptiFineEntityRestrictions() { restrictionStyles = Blockbench.addCSS(` #format_page_optifine_entity h3.markdown { margin-bottom: -10px; } `) new Setting("jem_restrictions", { value: false, category: "edit", name: "Remove OptiFine Entity Restrictions", description: "Remove the root group restrictions on the OptiFine Entity format. WARNING: You can easily break models with restrictions removed." }) new Setting("dialog_jem_restrictions", { value: true, category: "dialogs", name: "OptiFine Entity Restrictions Dialog", description: 'Show the "OptiFine Entity Restrictions" dialog' }) jemRestrictionsDialog = new Dialog({ id: "jem_restrictions_dialog", title: "Unsupported Edit", buttons: [], lines: [``], component: { data: { message: "", removeRestrictions: false, dontShowAgain: false }, methods: { finish() { if (this.removeRestrictions) { settings.jem_restrictions.set(true) } if (this.dontShowAgain) { settings.dialog_jem_restrictions.set(false) } jemRestrictionsDialog.close() } }, template: `

{{ message }}

The OptiFine Entity format has limitations for the top level groups.
You cannot:

  • Add new root groups
  • Remove root groups
  • Rename root groups
  • Move root groups
  • Rotate root groups
  • Move root group pivots
  • Have cubes or attachment points at root level

Doing any of the above can, and will, create broken/invalid models.

All elements added to OptiFine Entities must be placed within one of the existing groups. If you need to rotate something, create a subgroup and rotate that instead.


WARNING: It is highly recommended to leave restrictions enabled. This setting can be changed later in settings.


` } }) editCheck = () => { if (Format.id === "optifine_entity") { if (!settings.jem_restrictions.value) { const entry = Undo.history[Undo.history.length - 1] const check = editCheckProcess(entry) if (check) { if (settings.dialog_jem_restrictions.value) { jemRestrictionsDialog.show() jemRestrictionsDialog.content_vue.message = check } else { Blockbench.showQuickMessage(check, 1200) } Undo.loadSave(entry.before, entry.post) Undo.history.pop() Undo.index = Undo.history.length } } } } Blockbench.on("finished_edit", editCheck) originalJEMFormat = { new: Formats.optifine_entity.new, format_page: Formats.optifine_entity.format_page, convertTo: Formats.optifine_entity.convertTo } Formats.optifine_entity.new = () => { if (settings.jem_restrictions.value) originalJEMFormat.new.bind(Formats.optifine_entity)() else openLoader() } Formats.optifine_entity.format_page = JSON.parse(JSON.stringify(Formats.optifine_entity.format_page)) Formats.optifine_entity.format_page.content.push({ type: "h3", text: "CEM Template Loader" }, { text: "Creating an OptiFine entity will open CEM Template Loader. It is extremely rare to need a blank OptiFine entity model. You can disable this behavour with **File > Preferences > Settings > Edit > Remove OptiFine Entity Restrictions**, however, this is not recommended." }) Formats.optifine_entity.convertTo = () => { originalJEMFormat.convertTo.bind(Formats.optifine_entity)() if (!settings.jem_restrictions.value) { Blockbench.showMessageBox({ title: "Conversion Warning", message: "Models converted into OptiFine entities are not valid entity models. If you are converting a model into an OptiFine entity to use it in game, expect it to be broken. Instead load a new template entity model, and copy your elements across into that.", buttons: ["Load Template", "Continue"], icon: "warning" }, button => { if (button === 0) openLoader() }) } } } function unloadOptiFineEntityRestrictions() { restrictionStyles.delete() Blockbench.removeListener("finished_edit", editCheck) jemRestrictionsDialog.close() Formats.optifine_entity.new = originalJEMFormat.new Formats.optifine_entity.format_page = originalJEMFormat.format_page Formats.optifine_entity.convertTo = originalJEMFormat.convertTo } function editCheckProcess(entry) { if (entry.before.outliner) { for (const group of entry.before.outliner) { const postGroup = entry.post.outliner.find(e => e.uuid === group.uuid) if (!postGroup) return "You cannot remove root cubes/groups!" if (!group.origin.reduce((a, e, x) => a && e === postGroup.origin[x], true)) { return "You cannot move root groups!" } else if (group.name !== postGroup.name) { return "You cannot rename root groups!" } } } if (entry.post.outliner) { for (const group of entry.post.outliner) { const beforeGroup = entry.before.outliner.find(e => e.uuid === group.uuid) if (!beforeGroup) return "You cannot add new root cubes/groups!" } } if (entry.before.groups && entry.post.groups) { for (const beforeGroup of entry.before.groups) { const postGroup = entry.post.groups.find(e => e.uuid === beforeGroup.uuid) if (postGroup && Outliner.root.find(node => node instanceof Group && node.uuid == beforeGroup.uuid)) { if (!beforeGroup.rotation.reduce((a, e, x) => a && e === postGroup.rotation[x], true)) { return "You cannot rotate root groups!" } else if (!beforeGroup.origin.reduce((a, e, x) => a && e === postGroup.origin[x], true)) { return "You cannot move root group pivots!" } } } } } // OPTIFINE ANIMATION EDITOR let animationStyles, groupObserver, animationEditorPanel, animationControlPanel, context, boolMap, rangeMap, specialMap, stopAnimations, updateSelection, docShown, documentation, editorKeybinds, tabChange, renameGroup const E = s => $(document.createElement(s)) let frameCount const constants = { pi: Math.PI, sin: Math.sin, cos: Math.cos, asin: Math.asin, acos: Math.acos, tan: Math.tan, atan: Math.atan, atan2: Math.atan2, torad: deg => deg / 180 * Math.PI, todeg: rad => rad / Math.PI * 180, min: Math.min, max: Math.max, clamp: (x, min, max) => Math.min(max, Math.max(min, x)), abs: Math.abs, floor: Math.floor, ceil: Math.ceil, exp: Math.exp, frac: x => x - Math.floor(x), log: Math.log, pow: Math.pow, random: seed => { if (!seed) return Math.random() seed = constants.frac(seed * 123.34) seed += seed * (seed + 45.32) return constants.frac(seed * seed) }, round: Math.round, signum: Math.sign, sqrt: x => { if (x >= 0) return Math.sqrt(x) return 0 }, fmod: (x, y) => ((x % y) + y) % y, if: (...args) => { if (args.length < 3 || args.length % 2 !== 1 || typeof args[0] !== "boolean") throw Error for (let i = 0; i < args.length; i += 2) { if (i === args.length - 1) { if (typeof args[i] === "boolean") throw Error("if can only return numbers, use ifb instead") return args[i] } else if (args[i]) { if (typeof args[i + 1] === "boolean") throw Error("if can only return numbers, use ifb instead") return args[i + 1] } } }, ifb: (...args) => { if (args.length < 3 || args.length % 2 !== 1 || typeof args[0] !== "boolean") throw Error for (let i = 0; i < args.length; i += 2) { if (i === args.length - 1) { if (typeof args[i] !== "boolean") throw Error("ifb can only return booleans, use if instead") return args[i] } else if (args[i]) { if (typeof args[i + 1] !== "boolean") throw Error("ifb can only return booleans, use if instead") return args[i + 1] } } }, between: (x, min, max) => x >= min && x <= max, equals: (x, y, epsilon) => Math.abs(x - y) <= epsilon, in: (x, ...vals) => vals.includes(x), print: (id, int, val) => { if (val === undefined) throw Error("Not enough arguments. print requires 3 arguments") if ((settings.ignore_unkown_optifine_animations.value && !(typeof val === "number" || typeof val === "function")) || (!settings.ignore_unkown_optifine_animations.value && typeof val !== "number")) throw Error("print can only print numbers, use printb instead") if (frameCount % int === 0) console.log(`CEM print(${id}) = ${Number(val)}`) return val }, printb: (id, int, val) => { if (val === undefined) throw Error("Not enough arguments. printb requires 3 arguments") if (typeof val !== "boolean") throw Error("printb can only print booleans, use print instead") if (frameCount % int === 0) console.log(`CEM print(${id}) = ${val}`) return val }, smooth: (id, val) => { return val ?? id }, lerp: (a, b, c) => b * (1 - a) + c * a, frame_time: 0 } const rangesObj = { pos_x: [-128, 0, 128, 0.1], pos_y: [-64, 64, 320, 0.1], pos_z: [-128, 0, 128, 0.1], rot_x: [0, 0, 2 * Math.PI, 0.01], rot_y: [0, 0, 2 * Math.PI, 0.01], player_pos_x: [-128, 0, 128, 0.1], player_pos_y: [-64, 64, 320, 0.1], player_pos_z: [-128, 0, 128, 0.1], player_rot_x: [0, 0, 2 * Math.PI, 0.01], player_rot_y: [0, 0, 2 * Math.PI, 0.01], health: [0, 20, 20], max_health: [1, 20, 500], limb_speed: [0, 0, 1, 0.01], head_yaw: [-90, 0, 90], head_pitch: [-90, 0, 90], dimension: [-1, 0, 1], rule_index: [0, 0, 256] } const specialsObj = { limb_swing: [0, false], hurt_time: [10, false], death_time: [0, false], swing_progress: [0, false], anger_time: [0, false, 0, 0] } const boolList = new Set([ "is_aggressive", "is_alive", "is_burning", "is_child", "is_glowing", "is_hurt", "is_in_hand", "is_in_item_frame", "is_in_ground", "is_in_gui", "is_in_lava", "is_in_water", "is_invisible", "is_on_ground", "is_on_head", "is_on_shoulder", "is_ridden", "is_riding", "is_sitting", "is_sneaking", "is_sprinting", "is_tamed", "is_wet" ]) const enabledBooleans = new Set([ "is_alive", "is_on_ground" ]) const boneVars = ["tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz", "visible", "visible_boxes"] const renderVars = ["shadow_size", "shadow_opacity", "shadow_offset_x", "shadow_offset_z", "leash_offset_x", "leash_offset_y", "leash_offset_z"] const vars = [ "pi", "true", "false", "time", "day_time", "day_count", "limb_swing", "limb_speed", "age", "head_pitch", "head_yaw", "player_pos_x", "player_pos_y", "player_pos_z", "player_rot_x", "player_rot_y", "frame_time", "frame_counter", "dimension", "rule_index", "health", "hurt_time", "death_time", "anger_time", "anger_time_start", "max_health", "pos_x", "pos_y", "pos_z", "rot_x", "rot_y", "swing_progress", "id", "sin()", "cos()", "asin()", "acos()", "tan()", "atan()", "atan2()", "torad()", "todeg()", "min()", "max()", "clamp()", "abs()", "floor()", "ceil()", "exp()", "frac()", "log()", "pow()", "random()", "round()", "signum()", "sqrt()", "fmod()", "lerp()", "if()", "ifb()", "print()", "printb()", "between()", "equals()", "in()", ...boolList ] const varLabels = { "sin()": "sin(x)", "cos()": "cos(x)", "asin()": "asin(x)", "acos()": "acos(x)", "tan()": "tan(x)", "atan()": "atan(x)", "atan2()": "atan2(y, x)", "torad()": "torad(deg)", "todeg()": "todeg(rad)", "min()": "min(x, y, …)", "max()": "max(x, y, …)", "clamp()": "clamp(x, min, max)", "abs()": "abs(x)", "floor()": "floor(x)", "ceil()": "ceil(x)", "exp()": "exp(x)", "frac()": "frac(x)", "log()": "log(x)", "pow()": "pow(x, y)", "random()": "random(seed)", "round()": "round(x)", "signum()": "signum(x)", "sqrt()": "sqrt(x)", "fmod()": "fmod(x, y)", "lerp()": "lerp(t, x, y)", "if()": "if(c, v, [c2, v2, …,] v_else)", "ifb()": "ifb(c, v, [c2, v2, …,] v_else)", "print()": "print(id, n, x)", "printb()": "printb(id, n, x)", "between()": "between(x, min, max)", "equals()": "equals(x, y, epsilon)", "in()": "in(x, val1, val2, …)" } globalThis.optifineAnimationVariables = { constants, ranges: rangesObj, booleans: boolList, enabledBooleans: enabledBooleans, autocomplete: vars, autocompleteLabels: varLabels } let bools = new Map() let ranges = new Map() let specials = new Map() const parseCEMA = js => { try { return Function(`"use strict";return (function(ctx) { try { return (${js}) } catch (err) { return err } })`)()(context) } catch (err) { return err } } const reInnerGroups = /(?${bool[0]}" is not a supported boolean`] } } else { boolMap.set(bool[0], bools.get(bool[0]) ?? enabledBooleans.has(bool[0]) ? true : false) } } const check = anim.match(/[^a-z0-9_,\+\-\*\/%!&\|>=<\(\)\[\]:\.\s]/gi) if (check) throw [`Unsupported character "${check[0]}" in animation "${anim.replace(/"`] const check2 = anim.match(/[\)\]]\s*\(|=>|(?<]|^)=|<<=|>>>=|>>=|[!=]==|\+\+|--|\.\.\.|(?>>?|\*\*/ui) if (check2) throw [`Invalid syntax "${check2[0].replace(/" in animation "${anim.replace(/"`] const check3 = anim.match(/(?${check3[0]}": Bone names cannot start with numbers or underscores`] const check4 = anim.matchAll(/(?render" variable: "${m[2]}" is not a render variable`] } else if (!["this", "part", "var", "varb", "root"].includes(m[1]) && !Group.all.find(e => e.name === m[1])) { throw [`Unknown group "${m[1]}" in animation "${anim.replace(/"`] } } const check5 = anim.match(/(?${check5[0]}": Numbers must have digits before and after the decimal point`] if (anim.match(/\(/g)?.length !== anim.match(/\)/g)?.length) throw [`Invalid syntax in animation "${anim.replace(/": Number of opening and closing brackets do not match`] let s = anim, allArgs = "" while (reInnerGroups.test(s)) s = s.replace(reInnerGroups, "") while (reInnerFuncArgs.test(s)) { allArgs += s.match(reInnerFuncArgs).join("") s = s.replace(/\w\([^()]*\)/g, "") while (reInnerGroups.test(s)) s = s.replace(reInnerGroups, "") } if (allArgs.match(/,/g)?.length !== anim.match(/,/g)?.length) throw [`Invalid syntax in animation "${anim.replace(/": Commas are not allowed outside of functions`] return anim .replace(/:[a-z_]([a-z0-9_]+)?/gi, m => `.children["${m.slice(1)}"]`) .replace(/(?<=[\s\n(+*\/%!&|=<>,-]|^)[a-z_]([a-z0-9_]+)?/gi, (m, g, o, s) => { if (m === "render") return `ctx["${m}"]` if (["this", "part"].includes(m)) m = group if (s[o + m.length] === ".") return `ctx[Symbol.for("${m}")]` if (m in rangesObj && !rangeMap.has(m)) rangeMap.set(m, ranges.get(m) ?? [rangesObj[m], rangesObj[m]?.[1] ?? rangesObj[m]]) if (m in specialsObj && !specialMap.has(m)) specialMap.set(m, specials.get(m) ?? specialsObj[m]) return m === "true" || m === "false" ? m : `ctx["${m}"]` }) } let timescale = 1 function loadOptiFineAnimationEditor() { let steps, playing, paused, currentGroups new Setting("ignore_unkown_optifine_animations", { value: false, category: "edit", name: "Ignore Unknown OptiFine Animations", description: "If an OptiFine animation contains unknown animations, they will be ignored, allowing the animation to play and the model to be exported. WARNING: Unknown animations will cause the model to fail to load when using OptiFine." }) animationStyles = Blockbench.addCSS(` #panel_cem_animation .panel_vue_wrapper { flex: 1; padding: 8px; overflow: auto !important; display: flex; flex-direction: column; max-height: 100%; } #panel_cem_animation .prism-editor-wrapper { background-color: var(--color-back); padding-top: 0; } #panel_cem_animation .prism-editor-wrapper::-webkit-scrollbar-track, #panel_cem_animation .prism-editor-wrapper::-webkit-scrollbar-corner { background-color: var(--color-back); } #panel_cem_animation .prism-editor__line-numbers { overflow: visible; min-height: 100% !important; position: sticky; left: 0; } #panel_cem_animation .prism-editor__line-number { background-color: var(--color-back); translate: -4px 0; padding: 0 4px; } #panel_cem_animation .prism-editor__code { overflow: visible !important; } #cem_animation_editor_container { overflow: hidden; flex: 1; max-height: calc(100% - 40px); min-height: 37px; display: flex; position: relative; } #cem_animation_controller_container { flex: 1; padding: 8px; display: flex; flex-direction: column; max-height: 100%; overflow-y: auto; .cem_animation_button { height: initial; min-width: max-content; flex: 1; button { width: 100%; position: relative; overflow: hidden; &::before { content: ""; position: absolute; bottom: 0; left: 0; right: var(--progress, 100%); height: 3px; background-color: var(--color-accent); } &:not(.cem_animation_button_disabled):hover::before { background-color: var(--color-light); } } } } #cem_animation_editor { cursor: text; flex: 1; } #cem_animation_title { margin-left: 0; } #cem_animation_content { flex-direction: column; flex: 1; max-height: 100%; } .cem_animation_bar { display: flex; align-items: center; gap: 8px; } .cem_animation_bar span { display: flex; gap: 8px; align-items: center; } #cem_animation_part_name { display: inline !important; } .cem_animation_bar i, #cem_doc > div.selected { display: block; } .cem_animation_status { min-width: 25px; height: 25px; border-radius: 50%; display: flex; justify-content: center; align-items: center; } #cem_animation_status_success { background-color: var(--color-confirm); color: var(--color-dark); } #cem_animation_status_error { background-color: var(--color-error); color: var(--color-light); display: none; } #cem_animation_status_warning { background-color: transparent; fill: #FFA500; display: none; position: relative; } #cem_animation_status_warning:after { content: "!"; position: absolute; font-weight: 600; font-size: 20px; color: var(--color-dark); } #cem_animation_error_message { display: flex; margin-left: 8px; gap: 3px; overflow-x: auto; white-space: nowrap; } #cem_animation_error_message span { font-family: var(--font-code); color: #a6e22e; } .cem_animation_error_line { background-color: var(--color-error) !important; color: var(--color-light) !important; position: relative; padding-right: 4px; margin-right: -4px; } .cem_animation_error_line::after { content: ""; position: absolute; left: 100%; border-top: 12px solid transparent; border-bottom: 12px solid transparent; border-left: 12px solid var(--color-error); } .spacer { flex: 1; } .cem_animation_bool { display: flex; align-items: center; gap: 8px; flex: 1 1 50%; padding-right: 8px; } .cem_animation_range { display: flex; align-items: center; margin: 0 !important; height: 30px; box-sizing: content-box; } .cem_animation_range > input:first-of-type { flex: 1 1 0px; min-width: 40px; } .cem_animation_range p { margin: 0 8px 0 0; } .cem_animation_range_number { width: 2em; margin-left: 2px; cursor: text; min-width: 44px; } .cem_animation_button { height: 25px; min-width: 30px; cursor: pointer; position: relative; } .cem_animation_button:hover, #cem_animation_doc_button:hover { color: var(--color-light); } .cem_animation_button i { position: absolute; top: -3px; font-size: 30px; min-width: 30px; } .cem_animation_button_small { height: 15px; min-width: 20px; } .cem_animation_button_small i { font-size: 20px; min-width: 20px; } .cem_animation_button_disabled, .cem_animation_button_disabled div { color: var(--color-subtle_text) !important; cursor: default; } button.cem_animation_button_disabled { text-decoration: none; opacity: 0.5; } button.cem_animation_button_disabled:hover { background-color: var(--color-button); color: var(--color-subtle_text) !important; } #panel_cem_animation > h3 > label, #panel_cem_animation_controller > h3 > label { white-space: nowrap; text-overflow: ellipsis; } #cem_animation_controller_variables { position: relative; display: flex; flex-direction: column; gap: 8px; } #cem_animation_controller_variables:not(:empty) { margin-top: 24px; } #cem_animation_controller_variables:not(:empty)::before { content: ""; position: absolute; bottom: calc(100% + 10px); left: 0; right: 0; height: 1px; background-color: var(--color-border); } #cem_animation_range_labels div { height: 30px; display: flex; align-items: center; } #cem_animation_range_sliders { min-width: 0; flex: 1; } #cem_animation_ranges > div{ display: flex; flex-direction: column; gap: 2px; } #cem_animation_bools { display: flex; flex-wrap: wrap; } #cem_animation_buttons { display: flex; flex-wrap: wrap; gap: 8px; } #cem_animation_doc_button { cursor: pointer; } #cem_animation_format_button { position: absolute; top: 12px; right: 12px; } `) animationControlPanel = new Panel("cem_animation_controller", { name: "Animation Controller", condition: { formats: ["optifine_entity"], modes: ["edit"] }, default_position: { folded: true, slot: "left_bar", sidebar_index: 99 }, component: { template: `

Timescale

` } }) let timescaleTimeout const timescaleSlider = $("#cem_animation_timescale_slider") const timescaleText = $("#cem_animation_timescale_text") timescaleSlider.on("input", () => { timescaleText.val(timescaleSlider.val()) timescale = parseFloat(timescaleSlider.val()) }) timescaleText.on("input", () => { timescaleSlider.val(timescaleText.val()) const clamped = Math.min(4, Math.max(0, parseFloat(timescaleText.val()))) clearTimeout(timescaleTimeout) timescaleTimeout = setTimeout(() => timescaleText.val(isNaN(clamped) ? 1 : clamped), 1000) timescale = clamped }) animationEditorPanel = new Panel("cem_animation", { name: "Animation Editor", growable: true, condition: { formats: ["optifine_entity"], modes: ["edit"] }, default_position: { folded: true, slot: "bottom" }, component: { components: { VuePrismEditor }, data: { text: "" }, methods: { change() { stopAnimations() const text = this.text.trim() if (text === "") { animationErrorToggle() return group.cem_animations = [] } const parsed = parseAnimations(text) if (parsed) group.cem_animations = parsed }, format() { if (formatButton.hasClass("cem_animation_button_disabled")) return this.text = JSON.stringify(JSON.parse(this.text), null, 2) }, play() { if (playButton.hasClass("cem_animation_button_disabled")) return currentGroups = Group.all.filter(e => e.parent === "root") setupAnimations(currentGroups) }, stop: () => stopAnimations(), pause() { if (paused) { paused = false prevTime = Date.now() Blockbench.on("render_frame", playAnimations) pauseButton.text("pause").attr("title", "Pause the animations") } else { paused = true Blockbench.removeListener("render_frame", playAnimations) pauseButton.text("play_arrow").attr("title", "Resume the animations") } }, showDoc: () => showDocumentation(), autocomplete(text, position) { const before = text.substring(0, position) if (before.match(/"/g)?.length % 2 !== 1) return [] const beginning = text.substring(0, position).split(/[^a-zA-Z0-9_.]\.*/g).last() if (reInValue.test(before)) { if (beginning.includes(".")) { const [prefix, str] = beginning.split(".") if (!prefix.match(/^\d+$/)) { if (["var", "varb"].includes(prefix)) return [] return filterAndSortList(boneVars, str) } return [] } const groups = Group.all.map(e => e.name).concat("var", "varb") return filterAndSortList(groups.map(e => `${e}.`).concat(vars), beginning, null, Object.assign(Object.fromEntries(groups.map(e => [`${e}.`, e])), varLabels)) } if (beginning.includes(".")) { const [prefix, str] = beginning.split(".") if (!prefix.match(/^\d+$/)) { if (["var", "varb"].includes(prefix)) return [] if (prefix === "render") return filterAndSortList(renderVars, str) return filterAndSortList(boneVars, str) } return [] } const groups = Group.all.map(e => e.name).concat("var", "varb", "render") return filterAndSortList(groups.map(e => `${e}.`), beginning, null, Object.fromEntries(groups.map(e => [`${e}.`, e]))) } }, template: `

Editing animations for part:

Documentation

description
code
clear
play_arrow
` } }) const reInValue = /:[\s\n]*"[^"]*$/ function filterAndSortList(list, match, blacklist, labels) { const result = list.filter(f => f.startsWith(match) && f.length !== match.length) list.forEach(f => { if (!result.includes(f) && f.includes(match) && f.length !== match.length) result.push(f) }) if (blacklist) blacklist.forEach(black => result.remove(black)) return result.map(text => ({text, label: labels && labels[text], overlap: match.length})) } const partName = $("#cem_animation_part_name") const statusSuccess = $("#cem_animation_status_success") const statusError = $("#cem_animation_status_error") const statusWarning = $("#cem_animation_status_warning") const errorMessage = $("#cem_animation_error_message") const playButton = $("#cem_animation_play_button") const stopButton = $("#cem_animation_stop_button") const pauseButton = $("#cem_animation_pause_button") const formatButton = $("#cem_animation_format_button") const editor = $("#cem_animation_editor code") const controller = $("#cem_animation_controller_variables") const editorWrapper = $("#cem_animation_editor") let time = 0 let prevTime const invertions = new Set(["tx", "rx", "ry"]) function setupAnimations(groups, keepTime) { playing = true playButton.css("display", "none") stopButton.css("display", "flex") if (!keepTime) time = 0 constants.id = Math.random() constants[Symbol.for("var")] = new Proxy({}, { get(target, name, receiver) { if (Reflect.has(target, name)) { return Reflect.get(target, name, receiver) } else { return 0 } }, set(target, name, value, receiver) { if (typeof value !== "number") throw Error("A var must be set to a number") return Reflect.set(target, name, value, receiver) } }) constants[Symbol.for("varb")] = new Proxy({}, { get(target, name, receiver) { if (Reflect.has(target, name)) { return Reflect.get(target, name, receiver) } else { return false } }, set(target, name, value, receiver) { if (typeof value !== "boolean") throw Error("A varb must be set to a boolean") return Reflect.set(target, name, value, receiver) } }) frameCount = 0 steps = [] boolMap = new Map() rangeMap = new Map() specialMap = new Map() for (const group of groups) for (const section of group.cem_animations) for (const [key, val] of Object.entries(section)) { const split = key.split(".") if (split[0] === "render") continue else if (split[0] === "var") { steps.push({ type: "variable", key, raw: val, anim: `ctx[Symbol.for("var")].${split[1]} = ${preprocessCEMA(val, group.name)}` }) } else if (split[0] === "varb") { steps.push({ type: "variableBoolean", key, raw: val, anim: `ctx[Symbol.for("varb")].${split[1]} = ${preprocessCEMA(val, group.name)}` }) } else if (split[1] === "visible") { const part = ["this", "part"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0]) steps.push({ type: "visible", part, key, raw: val, anim: preprocessCEMA(val, group.name) }) } else if (split[1] === "visible_boxes") { const part = ["this", "part"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0]) steps.push({ type: "visible_boxes", part, key, raw: val, anim: split[0] === group.name || split[0] === "part" ? true : preprocessCEMA(val, group.name) }) } else { const part = ["this", "part"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0]) if (!part || part.cemAnimationDisableRotation && split[1][0] === "r") continue let anim try { anim = split[1] === "ty" ? `${part.parent === "root" ? "24-" : part.parent?.parent === "root" ? `- ${part.mesh.parent.position.y}-` : "-"}(${preprocessCEMA(val, group.name)})` : split[1] === "tz" && part.parent?.parent === "root" ? `(${preprocessCEMA(val, group.name)}) - ${part.mesh.parent.position.z}` : split[1] === "tx" && part.parent?.parent === "root" ? `(${preprocessCEMA(val, group.name)}) + ${part.mesh.parent.position.x}` : preprocessCEMA(val, group.name) } catch (err) { return animationErrorToggle(err) } steps.push({ type: "animation", part, mode: split[1][0] === "t" ? "position" : split[1][0] === "r" ? "rotation" : "scale", axis: split[1][1], transform: split[1], key, raw: val, anim, invert: invertions.has(split[1]) ? -1 : 1 }) } } controller.empty() bools = new Map(boolMap) if (bools.size) { const boolsSorted = [...bools.entries()] boolsSorted.sort(((a, b) => b[0] - a[0])) const boolContainer = E("div").attr("id", "cem_animation_bools").appendTo(controller) for (const bool of boolsSorted) { boolContainer.append(E("div").addClass("cem_animation_bool").append( E("input").attr({ id: `cem_animation_${bool[0]}_bool`, type: "checkbox", name: bool[0], checked: bool[1] }).on("change", evt => bools.set(bool[0], evt.target.checked)), E("label").attr("for", bool[0]).text(bool[0]), )) } } specials = new Map(specialMap) if (specials.has("limb_swing")) { let container = $("#cem_animation_bools") if (!container.length) container = E("div").attr("id", "cem_animation_bools").appendTo(controller) specials.get("limb_swing")[0] = 0 container.prepend(E("div").addClass("cem_animation_bool").append( E("input").attr({ type: "checkbox", name: "limb_swing", checked: specials.get("limb_swing")[1] }).on("change", evt => specials.get("limb_swing")[1] = evt.target.checked), E("label").attr("for", "limb_swing").text("limb_swing") )) } ranges = new Map(rangeMap) let rangesSorted function updateHealth(num) { if (ranges.has("health")) { const health = ranges.get("health") health[0][2] = num const slider = $("#cem_animation_range_health_slider") const number = $("#cem_animation_range_health_text") const current = parseInt(slider.val()) const val = current > num ? num : current const attr = { max: num, value: val } slider.attr(attr) number.attr(attr) slider.val(val) number.val(val) } } if (ranges.size) { rangesSorted = [...ranges.entries()] rangesSorted.sort(((a, b) => b[0] - a[0])) const rangeContainer = E("div").attr("id", "cem_animation_ranges").append(E("div").attr("id", "cem_animation_range_labels"), E("div").attr("id", "cem_animation_range_sliders")).css({ display: "flex", gap: "8px" }).appendTo(controller) for (const range of rangesSorted) { rangeContainer.children().first().append(E("div").text(range[0])) let timeout rangeContainer.children().eq(1).append(E("div").addClass("cem_animation_range bar slider_input_combo").append( E("input").attr({ id: `cem_animation_range_${range[0]}_slider`, type: "range", min: range[1][0][0], max: range[1][0][2], step: range[1][0][3] ?? 1, value: range[1][1], }).on("input", evt => { const num = parseFloat(evt.target.value) text.val(evt.target.value) ranges.set(range[0], [range[1][0], num]) if (range[0] === "max_health") updateHealth(num) }), E("input").addClass("tool cem_animation_range_number").attr({ id: `cem_animation_range_${range[0]}_text`, type: "number", min: range[1][0][0], max: range[1][0][2], step: range[1][0][3] ?? 1, value: range[1][1], }).on("input", evt => { slider.val(evt.target.value) const clamped = Math.min(range[1][0][2], Math.max(range[1][0][0], parseFloat(evt.target.value))) clearTimeout(timeout) timeout = setTimeout(() => text.val(isNaN(clamped) ? range[1][1] : clamped), 1000) const num = Math.max(range[1][0][0], clamped) ranges.set(range[0], [range[1][0], num]) if (range[0] === "max_health") updateHealth(num) }) )) const slider = $(`#cem_animation_range_${range[0]}_slider`) const text = $(`#cem_animation_range_${range[0]}_text`) } } if (specials.has("hurt_time")) { let container = $("#cem_animation_buttons") if (!container.length) container = E("div").attr("id", "cem_animation_buttons").appendTo(controller) const button = E("div").addClass("cem_animation_button").append( E("button").attr({ id: "cem_animation_hurt_time_button", title: 'Simulate the entity taking damage. Runs "hurt_time"' }).text("Hurt entity").on("click", evt => { if ($(evt.target).hasClass("cem_animation_button_disabled")) return specials.set("hurt_time", [10, true]) button.children().first().addClass("cem_animation_button_disabled") const hurtTimeBool = $("#cem_animation_is_hurt_bool") if (hurtTimeBool) { hurtTimeBool.prop("checked", true) bools.set("is_hurt", true) } }) ).appendTo(container) if (specials.get("hurt_time")[1] === true) button.children().first().addClass("cem_animation_button_disabled") } if (specials.has("death_time")) { let container = $("#cem_animation_buttons") if (!container.length) container = E("div").attr("id", "cem_animation_buttons").appendTo(controller) const button = E("div").addClass("cem_animation_button").append( E("button").attr({ id: "cem_animation_death_time_button", title: 'Simulate the entity getting killed. Runs "death_time"' }).text("Kill entity").on("click", evt => { if ($(evt.target).hasClass("cem_animation_button_disabled")) return specials.set("death_time", [0, true]) button.children().first().addClass("cem_animation_button_disabled") }) ).appendTo(container) if (specials.get("death_time")[1] === true) button.children().first().addClass("cem_animation_button_disabled") } if (specials.has("swing_progress")) { let container = $("#cem_animation_buttons") if (!container.length) container = E("div").attr("id", "cem_animation_buttons").appendTo(controller) const button = E("div").addClass("cem_animation_button").append( E("button").attr({ id: "cem_animation_swing_progress_button", title: 'Simulate the entity attacking. Runs "swing_progress"' }).text("Perform attack").on("click", evt => { if ($(evt.target).hasClass("cem_animation_button_disabled")) return specials.set("swing_progress", [0, true]) button.children().first().addClass("cem_animation_button_disabled") }) ).appendTo(container) if (specials.get("swing_progress")[1] === true) button.children().first().addClass("cem_animation_button_disabled") } if (specials.has("anger_time")) { let container = $("#cem_animation_buttons") if (!container.length) container = E("div").attr("id", "cem_animation_buttons").appendTo(controller) const button = E("div").addClass("cem_animation_button").append( E("button").attr({ id: "cem_animation_anger_time_button", title: 'Simulate the entity becoming angry. Runs "anger_time"' }).text("Anger entity").on("click", evt => { const start = Math.floor(Math.random() * 381) + 400 const delay = (Math.random() * 2 + 1) * 20 specials.set("anger_time", [start, true, start, delay]) button.children().first().removeClass("cem_animation_button_disabled") const aggressiveBool = $("#cem_animation_is_aggressive_bool") if (aggressiveBool) { aggressiveBool.prop("checked", true) bools.set("is_aggressive", true) } }) ).appendTo(container) } prevTime = Date.now() Blockbench.on("render_frame", playAnimations) } function parseAnimations(text) { animationErrorToggle() let animations try { animations = JSON.parse(text) if (!Array.isArray(animations)) throw ["The top level must be an array"] for (const [i, animation] of animations.entries()) if (animation === null || typeof animation !== "object" || Array.isArray(animation)) { throw [`Unexpected item of type "${animation === null ? "null" : Array.isArray(animation) ? "array" : typeof animation}" at position ${i}`] } animations = animations.filter(e => Object.keys(e).length > 0) for (const section of animations) for (const [key, val] of Object.entries(section)) { if (val.trim?.() === "") throw ["Animations cannot be empty", key, val] const split = key.split(".") if (split[0] === "render") { if (!renderVars.includes(split[1])) throw [`Invalid "render" variable: "${split[1]}" is not a render variable`] continue } if (split[1] === "visible_boxes") continue if (split.length < 2 || split[1] === "") throw [`Missing transformation type in animation "${key}"`, key, val] if (!(["var", "varb"].includes(split[0]) || split[1] === "visible")) { if (split[1].length > 2) throw [`Invalid transformation type in animation "${key}"`, key, val] if (!["r", "t", "s"].includes(split[1][0])) throw [`Unknown transform type "${split[1][0]}"`, key, val] if (!split[1][1]) throw [`Missing axis in animation "${key}"`, key, val] if (!["x", "y", "z"].includes(split[1][1])) throw [`Unknown axis "${split[1][1]}"`, key, val] } boolMap = new Map() rangeMap = new Map() specialMap = new Map() preprocessCEMA(val, group.name) if (!["var", "varb"].includes(split[0])) { const part = ["this", "part", "root"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0]) if (!part) animationErrorToggle(`Unknown group "${split[0]}"`, null, true) } } } catch (err) { if (err instanceof SyntaxError) { const numbers = err.message.match(/\d+/g) if (numbers?.length > 0) { let lineNum, colNum if (numbers.length === 1) { const split = text.substring(0, numbers[0]).split("\n") lineNum = split.length colNum = split[split.length - 1].length + 1 } else { lineNum = parseInt(numbers[0]) colNum = parseInt(numbers[1]) } return animationErrorToggle(`Unexpected character at line ${lineNum} column ${colNum}`, lineNum) } else { return animationErrorToggle(err) } } else { const split = text.split("\n") animationErrorToggle(err[0], split.indexOf(split.find(e => e.includes(`"${err[1]}"`) && e.includes(`"${err[2]}"`))) + 1) } } return animations } function animationErrorToggle(err, lineNum, warning) { $(".cem_animation_error_line").removeClass("cem_animation_error_line") if (err) { errorMessage.html(err) statusSuccess.css("display", "none") if (!warning) { statusWarning.css("display", "none") statusError.css("display", "flex") formatButton.addClass("cem_animation_button_disabled") playButton.addClass("cem_animation_button_disabled") } else { statusError.css("display", "none") statusWarning.css("display", "flex") } if (typeof lineNum === "number") { const line = $(`.prism-editor__line-numbers>:nth-child(${lineNum + 1})`) line.addClass("cem_animation_error_line") } } else { statusSuccess.css("display", "flex") statusError.css("display", "none") statusWarning.css("display", "none") errorMessage.text("") formatButton.removeClass("cem_animation_button_disabled") playButton.removeClass("cem_animation_button_disabled") } } let parents function playAnimations() { try { frameCount++ const now = Date.now() const dt = (now - prevTime) / 1000 constants.frame_time = dt * timescale prevTime = now const difference = 20 * timescale * dt time += difference if (specials.get("hurt_time")?.[0] <= 0) { specials.set("hurt_time", [10, false]) $("#cem_animation_hurt_time_button").removeClass("cem_animation_button_disabled") const hurtTimeBool = $("#cem_animation_is_hurt_bool") if (hurtTimeBool) { hurtTimeBool.prop("checked", false) bools.set("is_hurt", false) } } if (specials.get("death_time")?.[0] >= 20) { specials.set("death_time", [0, false]) $("#cem_animation_death_time_button").removeClass("cem_animation_button_disabled") } if (specials.get("swing_progress")?.[0] >= 1) { specials.set("swing_progress", [0, false]) $("#cem_animation_swing_progress_button").removeClass("cem_animation_button_disabled") } if (specials.get("anger_time")?.[1] && specials.get("anger_time")[0] <= 0) { specials.set("anger_time", [0, false, 0]) const aggressiveBool = $("#cem_animation_is_aggressive_bool") if (aggressiveBool) { aggressiveBool.prop("checked", false) bools.set("is_aggressive", false) } } if (specials.has("hurt_time")) { const progress = specials.get("hurt_time")[1] ? (1 - specials.get("hurt_time")[0] / 10) * 100 : 100 document.getElementById("cem_animation_hurt_time_button")?.style.setProperty("--progress", progress + "%") } if (specials.has("death_time")) { const progress = specials.get("death_time")[1] ? (specials.get("death_time")[0] / 20) * 100 : 100 document.getElementById("cem_animation_death_time_button")?.style.setProperty("--progress", progress + "%") } if (specials.has("swing_progress")) { const progress = specials.get("swing_progress")[1] ? specials.get("swing_progress")[0] * 100 : 100 document.getElementById("cem_animation_swing_progress_button")?.style.setProperty("--progress", progress + "%") } if (specials.has("anger_time")) { const a = specials.get("anger_time") const progress = a[1] && a[2] ? (a[3] > 0 ? 0 : (1 - a[0] / a[2]) * 100) : 100 document.getElementById("cem_animation_anger_time_button")?.style.setProperty("--progress", progress + "%") } if (frameCount === 1) { parents = {} for (const part of Group.all.filter(e => e.parent === "root")) { parents[part.name] = { tx: -((part.parent?.parent === "root") * part.mesh.parent.position.x + part.mesh.position.x), ty: (part.parent === "root") * 24 + (part.parent?.parent === "root") * -part.mesh.parent.position.y - part.mesh.position.y, tz: (part.parent?.parent === "root") * part.mesh.parent.position.z + part.mesh.position.z, rx: -part.mesh.rotation.x, ry: -part.mesh.rotation.y, rz: part.mesh.rotation.z, sx: part.mesh.scale.x, sy: part.mesh.scale.y, sz: part.mesh.scale.z, visible: true } } } context = Object.assign({ time: time, day_time: time % 24000, day_count: Math.floor(time / 24000), age: time, limb_swing: specials.get("limb_swing")?.[1] ? specials.get("limb_swing")[0] += difference / 1.666 : specials.get("limb_swing")?.[0] ?? 0, hurt_time: specials.get("hurt_time")?.[1] ? specials.get("hurt_time")[0] -= difference : 0, death_time: specials.get("death_time")?.[1] ? specials.get("death_time")[0] += difference : 0, swing_progress: specials.get("swing_progress")?.[1] ? specials.get("swing_progress")[0] += difference / 4 : 0, anger_time: specials.get("anger_time")?.[1] ? (specials.get("anger_time")[3] > 0 ? (specials.get("anger_time")[3] -= difference, specials.get("anger_time")[0]) : specials.get("anger_time")[0] -= difference) : 0, anger_time_start: specials.get("anger_time")?.[2] ?? 0, frame_counter: frameCount % 720719, render: Object.fromEntries(renderVars.map(e => [e, 0])) }, constants, Object.fromEntries(bools), Object.fromEntries(Array.from(ranges.entries()).map(e => [e[0], e[1][1]]))) if (settings.ignore_unkown_optifine_animations.value) { context = new Proxy(context, { get(target, prop) { if (prop in target) return target[prop] const num = e => e ?? 0 num.valueOf = () => 0 return num } }) } else { context = new Proxy(context, { get(target, prop) { if (prop in target) return target[prop] throw new Error(`Unknown variable / function
:
" ${prop} "`) } }) } const parts = new Map() for (const part of Group.all) { const partObj = { children: {}, tx: -((part.parent?.parent === "root") * part.mesh.parent.position.x + part.mesh.position.x), ty: (part.parent === "root") * 24 + (part.parent?.parent === "root") * -part.mesh.parent.position.y - part.mesh.position.y, tz: (part.parent?.parent === "root") * part.mesh.parent.position.z + part.mesh.position.z, rx: -part.mesh.rotation.x, ry: -part.mesh.rotation.y, rz: part.mesh.rotation.z, sx: part.mesh.scale.x, sy: part.mesh.scale.y, sz: part.mesh.scale.z, visible: true } parts.set(part, partObj) context[Symbol.for(part.name)] = partObj } for (const part of Group.all.filter(e => e.parent !== "root")) { const partObj = parts.get(part) for (const child of part.children) partObj.children[child.name] = parts.get(child) } for (const step of steps) { if (step.type === "animation" && typeof anim === "string" && step.part.name in parents) { step.anim = step.anim.replace(`ctx["Symbol.for(${step.part.name})"].${step.transform}`, parents[step.part.name][step.transform]) } let parsed = parseCEMA(step.anim) if (isNaN(parsed)) { if (typeof parsed === "number") parsed = 0 else { if (parsed?.message) throw `Invalid animation for "${step.key}"
:
${parsed.message}` throw `Unable to parse animation "${step.raw.replace(/" for "${step.key}"` } } else if (step.type === "animation") { if (parsed === true || parsed === false) throw `Unable to play animation "${step.raw.replace(/" as it retuned a boolean instead of a number` step.part.mesh[step.mode][step.axis] = parsed * step.invert context[Symbol.for(step.part.name)][step.transform] = step.transform === "ty" ? (step.part.parent === "root") * 24 + (step.part.parent?.parent === "root") * -step.part.mesh.parent.position.y - step.part.mesh.position.y : step.transform === "tx" ? -((step.part.parent?.parent === "root") * step.part.mesh.parent.position.x + step.part.mesh.position.x) : step.transform === "tz" ? (step.part.parent?.parent === "root") * step.part.mesh.parent.position.z + step.part.mesh.position.z : invertions.has(step.transform) ? - step.part.mesh[step.mode][step.axis] : step.part.mesh[step.mode][step.axis] } else if (step.type === "visible") { if (typeof parsed !== "boolean") throw `Invalid animation for "${step.key}"
:
visible must be set to a boolean` step.part.mesh.visible = parsed context[Symbol.for(step.part.name)].visible = parsed } else if (step.type === "visible_boxes") { if (typeof parsed !== "boolean") throw `Invalid animation for "${step.key}"
:
visible_boxes must be set to a boolean` step.part.mesh.children.filter(e => e.type === "cube").forEach(e => e.visible = parsed) context[Symbol.for(step.part.name)].visible_boxes = parsed } } } catch (err) { stopAnimations() animationErrorToggle(err.toString().replace(/ctx\./g, "")) } } stopAnimations = resetGroups => { Blockbench.removeListener("render_frame", playAnimations) if (resetGroups) for (const group of Group.all.filter(e => e.cemAnimationDisableRotation)) group.cemAnimationDisableRotation = false for (const group of Group.all) { group.mesh.visible = true group.mesh.children.filter(e => e.type === "cube").forEach(e => e.visible = true) for (const cube of Cube.all) { if (!cube.visibility) { cube.mesh.visible = false } } } Canvas.updateView({groups: Group.all}) playButton.css("display", "flex") stopButton.css("display", "none") pauseButton.text("pause").attr("title", "Pause the animations") if (specials.has("hurt_time")) specials.set("hurt_time", [10, false]) if (specials.has("death_time")) specials.set("death_time", [0, false]) if (specials.has("swing_progress")) specials.set("swing_progress", [0, false]) if (specials.has("anger_time")) specials.set("anger_time", [0, false, 0]) $("#cem_animation_hurt_time_button").removeClass("cem_animation_button_disabled").css("--progress", "100%") $("#cem_animation_death_time_button").removeClass("cem_animation_button_disabled").css("--progress", "100%") $("#cem_animation_swing_progress_button").removeClass("cem_animation_button_disabled").css("--progress", "100%") $("#cem_animation_anger_time_button").css("--progress", "100%") const aggressiveBool = $("#cem_animation_is_aggressive_bool") if (aggressiveBool.length) { aggressiveBool.prop("checked", false) bools.set("is_aggressive", false) } const hurtBool = $("#cem_animation_is_hurt_bool") if (hurtBool.length) { hurtBool.prop("checked", false) bools.set("is_hurt", false) } playing = false paused = false } let group function selectGroup(parse = true) { partName.text(group.name) const animation = JSON.stringify(group.cem_animations?.length === 0 ? [{}] : group.cem_animations, null, 2) if (animation) { if (parse) parseAnimations(animation) animationEditorPanel.vue.text = animation editorWrapper[0].__vue__._data.undoStack = [{ plain: animation }] editorWrapper[0].__vue__._data.undoOffset = 0 } } renameGroup = evt => { if (Project.format?.id === "optifine_entity") { const entry = Undo.history[Undo.history.length - 1] if (entry?.action === "Rename element") { const animation = JSON.stringify(group.cem_animations?.length === 0 ? [{}] : group.cem_animations, null, 2) if (animation) { parseAnimations(animation) } } } } Blockbench.on("finished_edit", renameGroup) updateSelection = () => { if (Project.format?.id === "optifine_entity") { resizeWindow() stopAnimations() let selected = Group.first_selected ?? Cube.selected?.[0] if (selected) { while (selected.parent !== "root") selected = selected.parent if (group !== selected) { group = selected selectGroup(false) } } const animation = JSON.stringify(group?.cem_animations?.length === 0 ? [{}] : group?.cem_animations, null, 2) if (animation) { parseAnimations(animation) } } } Blockbench.on("update_selection", updateSelection) tabChange = () => { setTimeout(() => { group = Group.all[0] if (Format.id === "optifine_entity" && group && !Group.first_selected) { selectGroup() } }, 0) } Blockbench.on("select_project", tabChange) tabChange() updateSelection() editorKeybinds = evt => { if (evt.key === "s" && evt.ctrlKey && !evt.shiftKey && !evt.altKey) { BarItems.export_over.trigger() evt.stopImmediatePropagation() } } animationEditorPanel.node.querySelector("#cem_animation_editor_container > div").addEventListener("keydown", editorKeybinds, true) resizeWindow() function addAnimationToggles() { if (Project.format?.id === "optifine_entity") { const toggle = $("[toolbar_id='outliner'] > div > [toolbar_item='outliner_toggle']") if (toggle.hasClass("enabled")) { const toggles = $("#cubes_list .group [toggle='autouv']") if (toggles.length) { groupObserver.disconnect() toggles.each((i, e) => { const toggle = $(e) const partName = toggle.parent().find("input").val() const part = Project.groups.find(e => e.name === partName) if (!part) return if (!toggle.parent().find("[toggle='cem_animation_disable_rotations']").length) { const rotateToggle = E("i").attr({ title: "Disable this group rotating while playing animations", toggle: "cem_animation_disable_rotations" }).addClass("outliner_toggle material-icons icon_off").text("sync_disabled").on("click", evt => { evt.stopPropagation() const partName = toggle.parent().find("input").val() const part = Project.groups.find(e => e.name === partName) const rotateToggle = $(evt.target) if (rotateToggle.hasClass("icon_off")) { rotateToggle.removeClass("icon_off") part.cemAnimationDisableRotation = true } else { rotateToggle.addClass("icon_off") part.cemAnimationDisableRotation = false } if (playing) { stopAnimations() setupAnimations(currentGroups, true) } }).insertBefore(toggle) if (part.cemAnimationDisableRotation) rotateToggle.removeClass("icon_off") } }) groupObserver.observe(document.body, { childList: true, subtree: true }) } } else $("[toggle='cem_animation_disable_rotations']").remove() } } groupObserver = new MutationObserver(() => { addAnimationToggles() }) groupObserver.observe(document.body, { childList: true, subtree: true }) addAnimationToggles() globalThis.optifineAnimationDocumentation = { custom: [] } async function showDocumentation() { if (optifineAnimationDocumentation.shown) { optifineAnimationDocumentation.dialog.show() } else { if (!optifineAnimationDocumentation.data) { optifineAnimationDocumentation.data = await fetchData("json/cem_animation_doc.json") optifineAnimationDocumentation.data.tabs ??= [] } optifineAnimationDocumentation.shown = true const tabs = [...optifineAnimationDocumentation.data.tabs, ...optifineAnimationDocumentation.custom] optifineAnimationDocumentation.dialog = new Dialog({ id: "cem_animation_documentation", title: "CEM Animation Documentation", width: 980, buttons: [], sidebar: { pages: Object.fromEntries(tabs.map(e => [e.name, { label: e.name, icon: e.icon }])), onPageSwitch(page) { optifineAnimationDocumentation.dialog.content_vue.page = page optifineAnimationDocumentation.dialog.content_vue.scrollToTop() } }, lines: [``], component: { data: { version: optifineAnimationDocumentation.data.version, optifineVersion: optifineAnimationDocumentation.data.optifineVersion, tabs, connection, page: tabs[0]?.name }, methods: { scrollToTop() { this.container.scrollTop = 0 }, reload() { window.cemTemplateAnimationDocReloaded = true plugin.reload() } }, template: `

Connection Failed

Failed to load CEM Animation documentation.

Please make sure you are connected to the internet, and can access this cem_animation_doc.json file.

If you are unable to access the cem_animation_doc.json file, it may be blocked by your computer or your internet service provider. If it is not your computer blocking it, you may be able to use a VPN to bypass the block. One good example is Cloudflare WARP, which is a free program that commonly resolves this issue.


Documentation version: v{{ version }} Updated to: OptiFine {{ optifineVersion }}

` }, onBuild() { this.content_vue.container = this.object.querySelector(".dialog_content") this.object.querySelector("#cem-container").addEventListener("click", e => { if (e.target.classList.contains("cem-doc-tab-link")) { this.content_vue.page = e.target.textContent this.sidebar.page = e.target.textContent this.sidebar.build() this.content_vue.scrollToTop() } }) } }).show() } } if (window.cemTemplateAnimationDocReloaded) { delete window.cemTemplateAnimationDocReloaded showDocumentation() } } function unloadOptiFineAnimationEditor() { stopAnimations?.(true) Blockbench.removeListener("update_selection", updateSelection) Blockbench.removeListener("select_project", tabChange) Blockbench.removeListener("finished_edit", renameGroup) animationEditorPanel.node.querySelector("#cem_animation_editor_container > div").removeEventListener("keydown", editorKeybinds) groupObserver.disconnect() $("[toggle='cem_animation_disable_rotations']").remove() animationEditorPanel.delete() animationControlPanel.delete() animationStyles.delete() optifineAnimationDocumentation.dialog?.close() resizeWindow() delete globalThis.optifineAnimationVariables delete globalThis.optifineAnimationDocumentation } // PLUGIN loadPlugin() })() ================================================ FILE: plugins/cem_template_loader/changelog.json ================================================ { "0.1.0": { "title": "0.1.0", "date": "2020-02-02", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "0.2.0": { "title": "0.2.0", "date": "2020-02-17", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added 1.15 and 1.16 template models" ] } ] }, "0.3.0": { "title": "0.3.0", "date": "2020-02-23", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the \"minecart\" template model" ] } ] }, "0.4.0": { "title": "0.4.0", "date": "2020-02-26", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Added missing \"hat\" bone to the \"illusioner\" template model" ] } ] }, "0.5.0": { "title": "0.5.0", "date": "2020-03-05", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the \"pufferfish_small\" template model" ] } ] }, "0.6.0": { "title": "0.6.0", "date": "2020-03-19", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added new \"player\", \"player_slim\", \"elytra\", \"trident\", \"shield\", and \"arrow\" template models", "Added new \"melon_golem\", \"furnace_golem\", and \"tropical_slime\" Minecraft Earth template models" ] }, { "title": "Changes", "list": [ "Modified the \"banner\" template model" ] } ] }, "0.7.0": { "title": "0.7.0", "date": "2020-04-14", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added new Minecraft Earth template models" ] }, { "title": "Bug Fixes", "list": [ "Fixed the \"wolf\" template model" ] } ] }, "0.8.0": { "title": "0.8.0", "date": "2020-05-15", "author": "Ewan Howell", "categories": [ { "title": "Removed Features", "list": [ "Removed Minecraft Earth template models" ] }, { "title": "Changes", "list": [ "Added \"strider\", \"zoglin\", and \"zombified_piglin\" template models to the unsupported category" ] } ] }, "0.9.0": { "title": "0.9.0", "date": "2020-05-20", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Added a section showing what template models are currently compatible with 1.15" ] } ] }, "1.0.0": { "title": "1.0.0", "date": "2020-06-01", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added a new \"Legacy\" section which now contains the 1.14 chest template models", "Replaced the chest template models with the 1.15 versions" ] }, { "title": "Bug Fixes", "list": [ "Fixed the \"villager\" template model" ] } ] }, "2.0.0": { "title": "2.0.0", "date": "2020-07-17", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Complete revamp of all template models" ] } ] }, "2.1.0": { "title": "2.1.0", "date": "2020-07-17", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed \"player\" and \"player_slim\" template models" ] } ] }, "2.2.0": { "title": "2.2.0", "date": "2020-07-22", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the \"villager\" template model failing to load" ] } ] }, "2.3.0": { "title": "2.3.0", "date": "2020-08-28", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added the \"piglin\", \"piglin_brute\", and \"zombified_piglin\" template models to the supported category" ] } ] }, "2.4.0": { "title": "2.4.0", "date": "2020-10-03", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Added unofficial \"axolotl\", \"goat\", and \"warden\" template models" ] }, { "title": "Bug Fixes", "list": [ "Minor bug fixes to various template models" ] } ] }, "2.5.0": { "title": "2.5.0", "date": "2020-10-04", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added an unofficial \"glow_squid\" template model" ] }, { "title": "Bug Fixes", "list": [ "Fixed issues with the \"dolphin\", \"squid\", \"axolotl\", and \"warden\" template models" ] } ] }, "2.6.0": { "title": "2.6.0", "date": "2020-10-17", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Added template textures to lots of template models", "Improved the unofficial \"goat\" template model" ] } ] }, "2.7.0": { "title": "2.7.0", "date": "2020-10-31", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed issues with the \"wither\" and \"parrot\" template models" ] } ] }, "2.8.0": { "title": "2.8.0", "date": "2020-12-16", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Replaced the unofficial \"axolotl\", \"goat\", and \"glow_squid\" model templates with the official models" ] } ] }, "2.9.0": { "title": "2.9.0", "date": "2021-01-25", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed a typo in the \"chest_large\" model" ] } ] }, "2.10.0": { "title": "2.10.0", "date": "2021-02-03", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed issues with the \"wither\", \"wither skull\", and \"rabbit\" models" ] } ] }, "3.0.0": { "title": "3.0.0", "date": "2021-03-25", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Template models are now loaded from an external model JSON file" ] } ] }, "3.1.0": { "title": "3.1.0", "date": "2021-03-27", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added the ability to reload the external external model JSON file", "Added external model JSON version number" ] } ] }, "4.0.0": { "title": "4.0.0", "date": "2021-05-25", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Restructured the external model JSON file to reduce it's file size" ] } ] }, "5.0.0": { "title": "5.0.0", "date": "2021-08-07", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added a brand new interface for selecting template models" ] }, { "title": "Technical Changes", "list": [ "Rewritten most of the plugin" ] } ] }, "5.0.1": { "title": "5.0.1", "date": "2021-08-12", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Add plugin about details" ] } ] }, "5.3.0": { "title": "5.3.0", "date": "2021-10-14", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Support for Blockbench v4.0.0" ] } ] }, "5.4.1": { "title": "5.4.1", "date": "2021-12-15", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Updated unable to connect dialog" ] }, { "title": "Bug Fixes", "list": [ "Fixed a bug with reloading template models" ] } ] }, "5.10.2": { "title": "5.10.2", "date": "2022-10-17", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added info dialog that is shown when the plugin is first installed" ] }, { "title": "Changes", "list": [ "Added bug report button to the loader interface" ] }, { "title": "Bug Fixes", "list": [ "Fixed \"CEM Template Loader\" not appeaing in the start screen" ] } ] }, "5.11.0": { "title": "5.11.0", "date": "2022-03-24", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Models can now be automatically loaded from URL queries in the webapp" ] } ] }, "6.0.0": { "title": "6.0.0", "date": "2022-05-05", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added an OptiFine animation editor with support for editing and previewing animations from OptiFine CEM" ] } ] }, "6.0.1": { "title": "6.0.1", "date": "2022-05-05", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Only try to read OptiFine animations when the current format is an \"OptiFine Entity\"" ] } ] }, "6.0.2": { "title": "6.0.2", "date": "2022-05-05", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed switching project tabs breaking the OptiFine animation editor" ] } ] }, "6.0.3": { "title": "6.0.3", "date": "2022-05-09", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Only try to stop OptiFine animations when the current format is an \"OptiFine Entity\"" ] } ] }, "6.0.4": { "title": "6.0.4", "date": "2022-05-10", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed selection update event listener when no format is loaded" ] } ] }, "6.1.0": { "title": "6.1.0", "date": "2022-05-29", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Restructured the plugin's info dialog and renamed it to the about dialog" ] }, { "title": "Technical Changes", "list": [ "Changed all references to the \"Filter\" menu to the new \"Tools\" menu" ] }, { "title": "Bug Fixes", "list": [ "Fixed \"CEM Template Loader\" not appeaing in the start screen" ] } ] }, "6.2.0": { "title": "6.2.0", "date": "2022-06-4", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Small edits to the plugin's structure" ] } ] }, "6.2.1": { "title": "6.2.1", "date": "2022-07-11", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Replaced tutorials playlist link with a single tutorial video" ] }, { "title": "Bug Fixes", "list": [ "Fixed playing animations when a non root group is selected" ] } ] }, "6.5.0": { "title": "6.5.0", "date": "2022-07-22", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added seeded randomness support to the \"random\" OptiFine animation function", "Added new OptiFine animation variables: \"id\", \"rot_x/y\", \"player_pos_x/y/z\", \"player_rot_x/y\", \"death_time\", \"dimension\", \"frame_time\"", "Added new OptiFine animation functions: \"printb\", \"lerp\"", "Added support for OptiFine animation \"var.\" and \"varb.\" entity variables" ] }, { "title": "Changes", "list": [ "The \"print\" function has been updated to match the officially supported one" ] }, { "title": "Removed Features", "list": [ "Removed internal support for the \"idle_time\" and \"revenge_time\" OptiFine animation variables", "Removed \"Invert this groups pivot point while playing animations\" group option" ] }, { "title": "Technical Changes", "list": [ "Switched to using the new ModelLoaders" ] }, { "title": "Bug Fixes", "list": [ "Fixed the \"sqrt\" OptiFine animation function when used with numbers that are zero or below", "Fixed the \"if\" OptiFine animation function allowing non boolean inputs", "Fixed OptiFine animations crashing if a cube is selected", "Fixed having groups named the same as functions causing issues" ] } ] }, "6.5.1": { "title": "6.5.1", "date": "2022-07-25", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed a gap appearing between the OptiFine animation editor and the viewport" ] } ] }, "6.6.0": { "title": "6.6.0", "date": "2022-10-02", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added \"rule_index\" OptiFine animation variable", "Added \".visible\" OptiFine animation property" ] } ] }, "6.6.1": { "title": "6.6.1", "date": "2022-10-11", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed issues with OptiFine animation validation", "Fixed broken \".visible\" references" ] } ] }, "6.6.2": { "title": "6.6.2", "date": "2022-10-24", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed \"print\" and \"lerp\" functions" ] } ] }, "6.6.3": { "title": "6.6.3", "date": "2022-10-26", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "\"rule_index\" animation variable is now defaulted to \"0\"", "\"frame_time\" is now affected by the animation timescale" ] } ] }, "6.6.4": { "title": "6.6.4", "date": "2022-11-07", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed issues with OptiFine animation validation" ] } ] }, "6.6.5": { "title": "6.6.5", "date": "2022-11-25", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Updated model source URL" ] } ] }, "6.11.0": { "title": "6.11.0", "date": "2023-01-17", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added autocomplete support to the OptiFine animation editor" ] }, { "title": "Bug Fixes", "list": [ "Fixed about action not being removed on unload" ] } ] }, "6.11.1": { "title": "6.11.1", "date": "2023-01-18", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed autocomplete for bones with numbers in the name" ] } ] }, "7.0.0": { "title": "7.0.0", "date": "2023-02-03", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added JEM format restrictions" ] }, { "title": "Bug Fixes", "list": [ "Fixed disable rotation toggles appearing on cubes", "Fixed broken styles" ] } ] }, "7.1.0": { "title": "7.1.0", "date": "2023-9-18", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed tab key in OptiFine animation editor", "Fixed OptiFine animation editor autocomplete" ] } ] }, "7.8.0": { "title": "7.8.0", "date": "2023-10-17", "author": "Ewan Howell", "categories": [ { "title": "Removed Features", "list": [ "Removed the ability to reload the template models" ] }, { "title": "Technical Changes", "list": [ "Update to new plugin repository format" ] } ] }, "8.0.0": { "title": "8.0.0", "date": "2024-05-12", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added a new dialog that shows when invalid operations are performed", "Added an option to ignore unknown OptiFine animations", "Loaded textures are now set as the default texture. This does not apply for models that load multiple textures" ] }, { "title": "Changes", "list": [ "\"Load vanilla texture\" will now be selected by default", "Moved the pretty print button", "The OptiFine animation editor will now always have a group selected", "Changed the play animaions button's icon to be the regular play icon" ] }, { "title": "Removed Features", "list": [ "Removed \"Load into current project\"", "Removed the ability to play only the current group's animations" ] }, { "title": "Technical Changes", "list": [ "Rewritten most of the plugin", "The CEM Animation Editor can now be extended by other plugins", "The CEM Animation Documentation can now be extended by other plugins", "Added CDN url fallback system", "The external model JSON file's version number will now be separated from the plugin's version number. I have reset that version number to 2.0.0 and it will increase separately from the plugin's version number from now on", "Added a class to the format page so it can be easily targetted by themes" ] }, { "title": "Bug Fixes", "list": [ "Fixed the page links in the CEM Animation Documentation" ] } ] }, "8.0.1": { "title": "8.0.1", "date": "2024-06-02", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed Vue.js warnings" ] } ] }, "8.1.0": { "title": "8.1.0", "date": "2024-06-08", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "The CEM model search bar can now be cleared with a button", "CEM animation errors now use the \"error\" colour instead of the \"close\" colour", "CEM animation documentation scroll will now reset back to the top when changing tab" ] }, { "title": "Bug Fixes", "list": [ "Fixed animation controller sliders going off the edge of the panel", "Fixed project not getting entity name", "Fixed codeblocks overflowing in the CEM Animation Documentation" ] } ] }, "8.2.0": { "title": "8.2.0", "date": "2024-07-26", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Invalid animations can now be saved instead of reverting to the last valid animation" ] }, { "title": "Bug Fixes", "list": [ "Fixed loading models without a vanilla texture" ] } ] }, "8.2.1": { "title": "8.2.1", "date": "2024-08-25", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Loading a template model that is missing its vanilla texture will no longer trigger the connction error state" ] } ] }, "8.3.0": { "title": "8.3.0", "date": "2024-09-03", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added support for the \"ifb()\" animation function", "Added support for the \"frame_counter\" animation variable", "Added more error checks to provide better animation error descriptions", "Added support for \"visible_boxes\"" ] }, { "title": "Bug Fixes", "list": [ "The animation editor will now no longer accept incorrectly formatted numbers", "Fixed \"render\" variables throwing errors when used in animations", "Fixed \"part\" and \"this\" variables throwing errors when used in animations", "Fixed animations not being re-parsed when you add, remove, or rename a group" ] } ] }, "8.4.0": { "title": "8.4.0", "date": "2024-11-11", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added support for entity list groups", "Added support for entity list headings" ] }, { "title": "Changes", "list": [ "The root bone will no longer cause animation errors when not present in the model" ] } ] }, "8.5.0": { "title": "8.5.0", "date": "2025-02-12", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Support for Blockbench v4.12.0" ] }, { "title": "Bug Fixes", "list": [ "Fixed opening the loader through the \"File > New\" menu, and when double clicking it on the start screen", "Category subheadings will now be hidden when searching and nothing from that subcategory matches the search" ] } ] }, "8.5.1": { "title": "8.5.1", "date": "2025-10-15", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed previewing CEM animations on mobile devices" ] } ] }, "8.6.0": { "title": "8.6.0", "date": "2026-04-02", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Support for Blockbench v5.0.0" ] }, { "title": "Bug Fixes", "list": [ "Fixed template texture generation when loading models" ] } ] }, "9.0.0": { "title": "9.0.0", "date": "2026-04-03", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Updated to the new template model data format", "Added category headings to the sidebar" ] } ] }, "9.0.1": { "title": "9.0.1", "date": "2026-04-03", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed vanilla texture loading for entities with multiple textures" ] } ] }, "9.0.2": { "title": "9.0.2", "date": "2026-04-03", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed display names falling back to the ID instead of the file name" ] } ] }, "9.1.0": { "title": "9.1.0", "date": "2026-04-03", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added support for the \"day_time\" and \"day_count\" animation variables", "Added support for the \"anger_time_start\" animation variable", "Added the \"Anger entity\" button to simulate \"anger_time\" countdown with delay", "Added progress bars to animation buttons (hurt, death, attack, anger)" ] }, { "title": "Bug Fixes", "list": [ "Fixed the default location of the \"Animation Controller\" panel", "Fixed stop button not resetting animation buttons" ] } ] }, "9.1.1": { "title": "9.1.1", "date": "2026-04-18", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the connection warning showing when the fallback URL loaded successfully" ] } ] } } ================================================ FILE: plugins/clone_brush.js ================================================ (function() { var brush_template, clone_brush_tool; Plugin.register('clone_brush', { title: 'Clone Brush', author: 'JannisX11', icon: 'account_balance_wallet', description: 'Clone Cubes', version: '1.1.1', variant: 'both', onload() { clone_brush_tool = new Tool({ id: 'clone_brush', name: 'Clone Brush', description: 'Tool to clone and place cubes against other cubes', icon: 'fa-edit', transformerMode: 'hidden', category: 'tools', selectFace: true, alt_tool: 'move_tool', modes: ['edit'], onSelect: function() { brush_template = 'select' }, onCanvasClick: function(data) { if (data.event.shiftKey === false) { if (brush_template == 'select' && data.element instanceof Cube) { brush_template = data.element $('#preview').css('cursor', 'url(assets/brush.png), auto') } else if (brush_template instanceof Cube) { var new_cubes = [] Undo.initEdit({elements: new_cubes}) var from = [ Cube.selected[0].from[0]+0, Cube.selected[0].from[1]+0, Cube.selected[0].from[2]+0 ] var canvas_grid = canvasGridSize() var sizes = [canvas_grid, canvas_grid, canvas_grid] if (brush_template && brush_template.type === 'cube') { sizes = brush_template.size() } switch (data.face) { case 'north': from[2] -= sizes[2] + Cube.selected[0].inflate + brush_template.inflate; break; case 'south': from[2] += sizes[2] + Cube.selected[0].inflate + brush_template.inflate; break; case 'west': from[0] -= sizes[0] + Cube.selected[0].inflate + brush_template.inflate; break; case 'east': from[0] += sizes[0] + Cube.selected[0].inflate + brush_template.inflate; break; case 'up': from[1] += sizes[1] + Cube.selected[0].inflate + brush_template.inflate; break; case 'down': from[1] -= sizes[1] + Cube.selected[0].inflate + brush_template.inflate; break; } var base_cube = new Cube(brush_template) base_cube.to = [ from[0]+base_cube.size(0), from[1]+base_cube.size(1), from[2]+base_cube.size(2) ] if (Format.canvas_limit) { var i = 0 while (i < 3) { if (base_cube.to[i] > 32 || from[i] < -16) return; i++; } } var number = base_cube.name.match(/[0-9]+$/) if (number) { number = parseInt(number[0]) base_cube.name = base_cube.name.split(number).join(number+1) } base_cube.from = from base_cube.addTo(brush_template.parent).init() new_cubes.push(base_cube); base_cube.select() Undo.finishEdit('clone_brush') } } } }); Toolbox.add(clone_brush_tool); }, onunload() { clone_brush_tool.delete(); } }) })() ================================================ FILE: plugins/code_view.js ================================================ var codeViewVue; (function() { var openCodeViewAction; var codeViewDialog; Plugin.register('code_view', { title: 'Code View', icon: 'developer_mode', author: 'Wither', description: 'View the model you are currently editing in the raw format', version: '1.0.1', variant: 'both', onload() { codeViewDialog = new Dialog({ title: 'Code View', id: 'code_view', resizable: true, width: 650, component: { components: {VuePrismEditor}, data: { text: '' }, methods: { copyText() { navigator.clipboard.writeText(this.text); } }, template: `
` } }); openCodeViewAction = new Action('open_code_view', { name: 'Open Code View', description: '', icon: 'developer_mode', click() { codeViewDialog.show(); codeViewDialog.content_vue.text = Format ? Format.codec.compile() : ''; } }) MenuBar.addAction(openCodeViewAction, 'filter') }, onunload() { openCodeViewAction.delete(); } }); })() ================================================ FILE: plugins/collapsible_start_screen_categories.js ================================================ (async function () { let aboutAction, styles, collapsed const id = "collapsible_start_screen_categories" const name = "Collapsible Start Screen Categories" const icon = "chevron_right" const author = "Ewan Howell" const about = "This plugin adds a small dropdown arrow next to each category on the start screen, allowing you to collapse each category and hide their respective formats." const links = { website: "https://ewanhowell.com/", discord: "https://discord.com/invite/pkRxtGw" } const E = s => $(document.createElement(s)) Plugin.register(id, { title: name, icon, author, description: "Add the ability to collapse the start screen categories.", about, tags: ["Start screen", "Menu", "Formats"], version: "1.0.0", min_version: "4.4.1", variant: "both", oninstall: () => showAbout(true), onuninstall: () => localStorage.removeItem("format_category_collapsed"), onload() { addAbout() styles = Blockbench.addCSS(` .format_category { position: relative; } .format_category_dropdown { position: absolute; top: 2px; right: 8px; cursor: pointer; color: var(--color-subtle_text); } .format_category_dropdown:hover { color: var(--color-text); } .format_category_collapsed ul { display: none; } .format_category i { transition: transform .15s; } .format_category_collapsed i { transform: rotateZ(-90deg); } `) collapsed = JSON.parse(localStorage.getItem("format_category_collapsed") ?? "[]") addDropDowns() Blockbench.on("construct_format", addDropDowns) Blockbench.on("construct_model_loader", addDropDowns) }, onunload() { Blockbench.removeListener("construct_format", addDropDowns) Blockbench.removeListener("construct_model_loader", addDropDowns) aboutAction.delete() MenuBar.removeAction(`help.about_plugins.about_${id}`) styles.delete() $(".format_category").removeClass("format_category_collapsed") $(".format_category_dropdown").remove() } }) function addDropDowns() { setTimeout(() => { $(".format_category").each(function() { const category = $(this) if (category.children().length === 2) { const text = category.find("label").first().text() const icon = E("i").addClass("format_category_dropdown material-icons").text("expand_more").appendTo(category) icon.on("click", e => { if (collapsed.includes(text)) { collapsed.splice(collapsed.indexOf(text), 1) icon.parent().removeClass("format_category_collapsed") } else { collapsed.push(text) icon.parent().addClass("format_category_collapsed") } localStorage.setItem("format_category_collapsed", JSON.stringify(collapsed)) }) if (collapsed.includes(text)) category.addClass("format_category_collapsed") } }) }, 0) } function addAbout() { let about = MenuBar.menus.help.structure.find(e => e.id === "about_plugins") if (!about) { about = new Action("about_plugins", { name: "About Plugins...", icon: "info", children: [] }) MenuBar.addAction(about, "help") } aboutAction = new Action(`about_${id}`, { name: `About ${name}...`, icon, click: () => showAbout() }) about.children.push(aboutAction) } function showAbout(banner) { const infoBox = new Dialog({ id: "about", title: name, width: 780, buttons: [], lines: [` ${banner ? `` : ""} `] }).show() $("dialog#about .dialog_title").html(` ${icon} ${name} `) } })() ================================================ FILE: plugins/colour_gradient_generator/about.md ================================================

This plugin generates hue shifted colour gradient palettes from a single colour.

Example

Input Colour

Output Gradient Palette

How to use

To use this plugin, go into paint mode and change the colour palette mode to Palette or Both. You can then select the Generate Colour Gradient button gradient to start creating your gradient palette.

================================================ FILE: plugins/colour_gradient_generator/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2022-06-02", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.0.1": { "title": "1.0.1", "date": "2022-06-05", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Updated the plugin about" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2022-10-22", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Stored data is now removed when uninstalling the plugin" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2023-01-19", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Updated for Blockbench 4.6" ] } ] }, "2.0.0": { "title": "2.0.0", "date": "2024-06-13", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added a live colour palette preview", "Added a new \"Brightness Range\" slider", "Added a new \"Colour Offset\" slider", "Added a toggle to limit the ranges to smaller ones, making it easier to be more precise" ] }, { "title": "Technical Changes", "list": [ "Rewritten from the ground up" ] } ] }, "2.1.0": { "title": "2.1.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] } ] } } ================================================ FILE: plugins/colour_gradient_generator/colour_gradient_generator.js ================================================ (() => { let action, dialog, data const id = "colour_gradient_generator" const defaults = { steps: 9, angle: 45, replace: false, smallRanges: true, brightnessRange: 1, brightnessOffset: 0 } Plugin.register(id, { title: "Colour Gradient Generator", icon: "icon.png", author: "Ewan Howell", description: "Generate hue shifted gradient palettes from a single colour.", tags: ["Paint", "Palette", "Color"], version: "2.1.0", min_version: "5.0.0", variant: "both", website: "https://ewanhowell.com/plugins/colour-gradient-generator/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/colour_gradient_generator", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Colour Gradient Generator]", creation_date: "2022-06-02", has_changelog: true, onload() { const storage = JSON.parse(localStorage.getItem(id) ?? "{}") data = { steps: storage.steps ?? defaults.steps, angle: storage.angle ?? defaults.angle, replace: storage.replace ?? defaults.replace, smallRanges: storage.smallRanges ?? defaults.smallRanges, brightnessRange: storage.brightnessRange ?? defaults.brightnessRange, brightnessOffset: storage.brightnessOffset ?? defaults.brightnessOffset } dialog = new Dialog({ id, title: "Generate Gradient Palette", width: 780, buttons: ["Generate", "Cancel"], lines: [``], component: { data: { data, defaults, colour: ColorPanel.get(), minBrightnessOffset: Math.min(0, data.brightnessOffset), maxBrightnessOffset: Math.max(0, data.brightnessOffset) }, methods: { save() { localStorage.setItem(id, JSON.stringify(this.data)) }, clamp() { this.data.steps = Math.min(32, this.data.steps) this.data.angle = Math.max(-120, Math.min(120, this.data.angle)) }, reset() { this.data.steps = defaults.steps this.data.angle = defaults.angle this.data.replace = defaults.replace this.data.smallRanges = defaults.smallRanges this.data.brightnessRange = defaults.brightnessRange this.data.brightnessOffset = defaults.brightnessOffset } }, computed: { palette() { const colour = tinycolor(this.colour) const hsl = colour.toHsl() let angle = this.data.angle if (hsl.h >= 100 && hsl.h < 260) angle *= -1 let minLightness = Math.max(0, hsl.l - this.data.brightnessRange * hsl.l) let maxLightness = Math.min(1, hsl.l + this.data.brightnessRange * (1 - hsl.l)) let darker = Math.min(this.data.steps - 1, Math.floor((this.data.steps * (hsl.l - minLightness) / (maxLightness - minLightness)).toFixed(10))) let lighter = this.data.steps - darker - 1 this.minBrightnessOffset = darker > 0 && lighter > 0 ? -lighter : 0 this.maxBrightnessOffset = darker > 0 && lighter > 0 ? darker : 0 this.data.brightnessOffset = Math.max(this.minBrightnessOffset, Math.min(this.maxBrightnessOffset, this.data.brightnessOffset)) if (isNaN(darker)) { darker = Math.floor(this.data.steps / 2) lighter = this.data.steps - darker - 1 } const position = (darker + 1) / (this.data.steps + 1) let darkFraction = 1 let lightFraction = 1 if (darker > 0 && lighter > 0) { if (this.data.brightnessOffset < 0) { const inside = lighter - Math.abs(this.data.brightnessOffset) const ratio = (darker - this.data.brightnessOffset) / darker lightFraction = inside / (ratio * lighter) maxLightness = Math.min(1, hsl.l + this.data.brightnessRange * lightFraction * (1 - hsl.l)) } else { const inside = darker - Math.abs(this.data.brightnessOffset) const ratio = (lighter + this.data.brightnessOffset) / lighter darkFraction = inside / (ratio * darker) minLightness = Math.max(0, hsl.l - this.data.brightnessRange * darkFraction * hsl.l) } } darker = darker - this.data.brightnessOffset lighter = lighter + this.data.brightnessOffset const colours = [] for (let x = darker - 1; x >= 0; x--) { const col = colour.toHsl() col.l = Math.lerp(hsl.l, minLightness, (x + 1) / (darker + 1)) col.h = toPositiveAngle(col.h + Math.lerp(0, -angle * position * darkFraction, (x + 1) / (darker + 1))) colours.push(tinycolor(col).toHexString()) } colours.push(tinycolor(colour).toHexString()) for (let x = lighter - 1; x >= 0; x--) { const col = colour.toHsl() col.l = Math.lerp(maxLightness, hsl.l, (x + 1) / (lighter + 1)) col.h = toPositiveAngle(col.h + Math.lerp(angle * (1 - position) * lightFraction, 0, (x + 1) / (lighter + 1))) colours.push(tinycolor(col).toHexString()) } this.save() return new Set(colours) } }, mounted() { $(this.$refs.colour).spectrum({ preferredFormat: "hex", color: dialog.component.data.colour, showAlpha: false, showInput: true, move: c => dialog.content_vue.colour = c.toHexString(), change: c => dialog.content_vue.colour = c.toHexString(), hide: c => dialog.content_vue.colour = c.toHexString() }) }, template: `
replay

Colour


Colour Count

replay

The number of colours to include in the gradient


Hue Shifting Angle

replay

The amount of degrees over which the hue shifting occurs


Brightness Range

replay

The range of the brightness included in the gradient


Colour Offset

replay

Adjust the position of the selected colour within the gradient spectrum



` }, onOpen() { this.content_vue.colour = ColorPanel.get() $(this.content_vue.$refs.colour).spectrum("set", this.content_vue.colour) }, onConfirm() { if (data.replace) ColorPanel.palette.length = 0 for (const colour of this.content_vue.palette) { if (ColorPanel.palette.includes(colour)) ColorPanel.palette.splice(ColorPanel.palette.indexOf(colour), 1) ColorPanel.palette.push(colour) } } }) action = new Action(id, { name: "Generate Gradient Palette", icon: "gradient", click: () => dialog.show() }) Toolbars.palette.add(action) }, onuninstall() { localStorage.removeItem("colour_gradient_steps") localStorage.removeItem("colour_gradient_angle") }, onunload() { dialog.close() action.delete() } }) function toPositiveAngle(angle) { angle = ((angle % 360) + 360) % 360 if (angle < 0) angle += 360 return angle } })() ================================================ FILE: plugins/cosmic_reach_model_editor/about.md ================================================ # Cosmic Reach Model Editor Simple plugin that allows editing models that were created for the game [Cosmic Reach](https://finalforeach.itch.io/cosmic-reach).
If any bugs founds, make sure to report it to the plugin's [Github](https://github.com/zHoeshin/CosmicReachModelEditor). ================================================ FILE: plugins/cosmic_reach_model_editor/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2024-03-09", "author": "Z. Hoeshin", "categories": [ { "title": "Features", "list": [ "Plugin created" ] } ] }, "1.1.1": { "title": "1.1.1", "date": "2024-04-19", "author": "Z. Hoeshin", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the bug that would cause Cosmic Reach models be loaded as Java Block Models" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2024-05-25", "author": "Z. Hoeshin", "categories": [ { "title": "Features", "list": [ "Added control over whether the output JSON file is minimized or not", "Added option to export model as a child of another model (saves only textures and the name of the parent model specified", "Made it possible to load a child model (parent model will be loaded too)" ] }, { "title": "Bug Fixes", "list": [ "Texture names now load properly" ] } ] }, "1.3.0": { "title": "1.3.0", "date": "2024-06-30", "author": "Z. Hoeshin", "categories": [ { "title": "Features", "list": [ "Added Cosmic Reach Entity Model format, export and import", "Added Cosmic Reach Entity Animation export and import tools", "Improved the menu import/export items", "Changed JSON output format to suit the original Cosmic Reach JSON files more" ] }, { "title": "Removed", "list": [ "Possibility to import either a maximized or a minimized JSON file. All of JSON files exported are now maximized" ] } ] }, "1.3.1": { "title": "1.3.1", "date": "2024-07-22", "author": "Z. Hoeshin", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed Entity Model Exporting Bug" ] } ] }, "1.3.2": { "title": "1.3.2", "date": "2024-08-01", "author":"Z. Hoeshin", "categories": [ { "title":"Bug Fixes", "list": [ "Fixed face culling always set to true bug" ] } ] }, "2.0.0": { "title": "2.0.0", "date": "2024-09-16", "author": "Z. Hoeshin", "categories": [ { "title": "Features", "list": [ "Textureless faces now do not require empty.png(instead they are not exported)", "Added model properties(Tools>Edit Model Properties)(used for cullsSelf and isTransparent block properties)(they aren't stored when saved as .bbmodel due to BB restrictions)", "New assets hyerarchy format replaced the old one" ] } ] }, "2.1.0": { "title": "2.1.0", "date": "2024-11-07", "author": "Z. Hoeshin", "categories": [ { "title": "Bug Fixes", "list": [ "UV Rotation is now exported", "UV is exported properly", "Textures export properly" ] } ] }, "2.2.0": { "title": "2.2.0", "date": "2024-03-03", "author": "Z. Hoeshin", "categories": [ { "title": "Bug Fixes", "list": [ "Various bug fixes and improvements" ] } ] } } ================================================ FILE: plugins/cosmic_reach_model_editor/cosmic_reach_model_editor.js ================================================ (() => { let codec, export_action_block_minimized, export_action_block_maximized, import_action_block, dialog, propertiesDialog, originalJavaBlockCond, lastOccuranceOfSequenceInArray const id = "cosmic_reach_model_editor" const name = "Cosmic Reach Model Editor" const icon = "icon.png" const icon64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAATxJREFUWIXtV6EOwjAQvREUAYFCowlBIkhm2LegMXwFho/gM8DMTS/T0ygEBDvE8pL1saNlWdIKnlmvaa+9d+/WNlqtd5WIyHgSSxPTUSJ94v66GPbzkYqIyKDXVTog2iTnqtnBkS/mM8OOl98dprlpF+XNsJkJ7wwM0UDkiBiRrrftE48n0z7s28dn19ofmCnKeh0w4Z8BqBEM2CIHbFoA2E9RirGefwbQQO55x8i1LeLsatrIOWsjzet1UB3hMKDBVRNdEQ4DrqrWNME514B5qIZwGABsqv9VE6gOMMR+vTPw38CHBljF2h+OgX7WBmx82V84DGgRMLQ6d60KZjAcBjRoOXedZ2MmHAZwPuMOh51rOWc1a+rn8XxL9s8Av4g451oOXcfxWQAEcyv+v4wi7XWM90Jf0Px7Z+ANxOF3G0qPE9EAAAAASUVORK5CYII=" Plugin.register(id, { title: name, icon: "icon.png", author: "Z. Hoeshin", description: "Allows creating, editing, importing and exporting Cosmic Reach block models.", tags: ["Cosmic Reach"], version: "2.2.0", min_version: "4.8.0", creation_date: "2024-04-19", variant: "both", new_repository_format: true, has_changelog: true, onload() { originalJavaBlockCond = Codecs.java_block.load_filter.condition const blockPropertiesForm = { cullsSelf: { label: "Culls Self", type: "checkbox", value: true }, isTransparent: { label: "Is transparent", type: "checkbox", value: false } } Codecs.java_block.load_filter.condition = (model) => { return !model.cuboids && originalJavaBlockCond(model); } dialog = new Dialog("cosmic_reach_model_errormessage", { id: "cosmic_reach_model_dialog_error", title: "Something went wrong...", buttons: [], lines: [], }) propertiesDialog = new Dialog("cosmic_reach_model_properties_dialog", { id: "cosmic_reach_model_properties_dialog", totle: "Properties", lines: [], onConfirm: (b, e) => { let res = propertiesDialog.getFormResult() Project.properties = res }, onCancel: (b, e) => {}, }) codec = new Codec("cosmic_reach_block_model_codec", { name: "Cosmic Reach", extension: "json", remember: false, load_filter: {type: "json", extensions: ["json"], condition: (model) => { return model.cuboids || model.textures; } }, format: new ModelFormat("cosmic_reach_model", { id: "cosmic_reach_model", icon: icon64, name: "Cosmic Reach Model", description: "Model format used by the game Cosmic Reach", show_on_start_screen: true, target: ["json"], vertex_color_ambient_occlusion: true, /*rotate_cubes: true, rotation_limit: true, rotation_snap: true,*/ uv_rotation: true, java_face_properties: true, edit_mode: true, new() { newProject(this) Project.texture_width = 16 Project.texture_height = 16 } }), compile(){ let replacePostProcess = [] let facenamesbb = ["up", "down", "north", "south", "east", "west"] let facenamescr = ["localPosY", "localNegY", "localNegZ", "localPosZ", "localPosX", "localNegX"] cuboids = [] texturesUsed = [] texturesFilesUsed = [] textures = {} function compileCube(obj){ let uvs = {} for(let f of Object.keys(obj.faces)){ let uv = obj.faces[f].uv let t = obj.faces[f].texture let textures = Texture.all.filter((x) => { if (x === undefined) { return false } if (t instanceof Texture) { return x.uuid == t.uuid } if (typeof(t) === 'string') { return x.uuid == t } }) let texture = textures[0] //if (texture == undefined) console.error(obj.faces) if (texture !== undefined) texture = texture.name //texture = (texture === undefined) ? "empty.png" : texture.name let face = obj.faces[f] uvs[f] = [uv[0], uv[1], uv[2], uv[3], face.cullface, texture, face.rotation] texturesUsed.push(texture) } let cube = { "localBounds": [...obj.from, ...obj.to], "faces": { /*"localNegX": {"uv": uvs.west.slice(0, 4), "ambientocclusion": uvs.west[4].tint === 0, "cullFace": uvs.west[4].cullFace !== "", "texture": uvs.west[5]}, "localPosX": {"uv": uvs.east.slice(0, 4), "ambientocclusion": uvs.east[4].tint === 0, "cullFace": uvs.east[4].cullFace !== "", "texture": uvs.east[5]}, "localNegY": {"uv": uvs.down.slice(0, 4), "ambientocclusion": uvs.down[4].tint === 0, "cullFace": uvs.down[4].cullFace !== "", "texture": uvs.down[5]}, "localPosY": {"uv": uvs.up.slice(0, 4), "ambientocclusion": uvs.up[4].tint === 0, "cullFace": uvs.up[4].cullFace !== "", "texture": uvs.up[5]}, "localNegZ": {"uv": uvs.north.slice(0, 4), "ambientocclusion": uvs.north[4].tint === 0, "cullFace": uvs.north[4].cullFace !== "", "texture": uvs.north[5]}, "localPosZ": {"uv": uvs.south.slice(0, 4), "ambientocclusion": uvs.south[4].tint === 0, "cullFace": uvs.south[4].cullFace !== "", "texture": uvs.south[5]}*/ } } for(let i = 0; i < 6; i++){ if ((uvs[facenamesbb[i]][5] === undefined) || (uvs[facenamesbb[i]][5] === "empty.png")){ continue } cube.faces[facenamescr[i]] = { "uv": uvs[facenamesbb[i]].slice(0, 4), "ambientocclusion": uvs[facenamesbb[i]][4].tint === 0, "cullFace": uvs[facenamesbb[i]][4].length > 0, "texture": uvs[facenamesbb[i]][5], "uvRotation": uvs[facenamesbb[i]][6], } } replacePostProcess.push( cube.localBounds, cube.faces.localNegX, cube.faces.localPosX, cube.faces.localNegY, cube.faces.localPosY, cube.faces.localNegZ, cube.faces.localPosZ, ) for(let f = 0; f < 6; f++){ if(uvs[facenamesbb[f]][4].rotation > 0){ cube.faces[facenamescr[f]].uvRotation = uvs[facenamesbb[f]][4].rotation } } cuboids.push(cube) } function compileGroup(group){ group.children.forEach(obj => { if (obj instanceof Group) { compileGroup(obj); } else if (obj instanceof Cube) { compileCube(obj) } }) } Outliner.root.forEach(obj => { if (obj instanceof Group) { compileGroup(obj); } else if (obj instanceof Cube) { compileCube(obj) } }) for(let i = 0; i < texturesUsed.length; i++){ if(texturesUsed[i] == null){ continue } const name = texturesUsed[i] textures[name] = { "fileName": name } } //JSON.stringify({"textures": textures, "cuboids": cuboids}, undefined, options.maximize ? 4 : undefined) let r = {"textures": textures, "cuboids": cuboids} if (Project.properties){ if (Project.properties.isTransparent !== undefined){ r.isTransparent = Project.properties.isTransparent } if (!Project.properties.cullsSelf !== undefined){ r.cullsSelf = Project.properties.cullsSelf } } return stringifyJSON(r) }, parse(rawJSONstring, path, cuboidsOnly = false){ let loadedTextures = {} let patharr = path.split(/[\\\/]/g) patharr = patharr.slice(0, patharr.length - 1) let root = lastOccuranceOfSequenceInArray(patharr, ["models", "blocks"]) let facenamesbb = ["up", "down", "north", "south", "east", "west"] let facenamescr = ["localPosY", "localNegY", "localNegZ", "localPosZ", "localPosX", "localNegX"] let allTexturesSpecified = false let data if(typeof rawJSONstring === 'string'){ data = JSON.parse(rawJSONstring) }else if(rawJSONstring instanceof Object && !(rawJSONstring instanceof Array)){ data = rawJSONstring }else{ throw "Unable to convert file data to Object" } if(cuboidsOnly){ if(data.cuboids === undefined){ if(data.parent === undefined){ return [] }else{ let p = data.parent Blockbench.read([...patharr.slice(undefined, patharr.length - 3), p.replace(":", "/")].join("/"), { extensions: ['json'], type: 'Cosmic Reach Model', readtype: 'text', resource_id: 'json' }, files => { try{ let cuboids = codec.parse(files[0].content, files[0].path, true); if(data.cuboids === undefined){ data.cuboids = [] } if(cuboids !== undefined){ for(let c of cuboids){ data.cuboids.push(c) } } return data.cuboids }catch(error){ return [] } }) } } return data.cuboids } if(data.textures === undefined){ data.textures = {} } for(let t of Object.keys(data.textures)){ let newtexture = new Texture().fromPath([...patharr.slice(undefined, patharr.length - 3), data.textures[t].fileName.replace(":", "/")].join("/")) newtexture.name = data.textures[t].fileName loadedTextures[t] = newtexture.add() } if(Texture.all.length > 0) { setTimeout(() => { Project.texture_width = Texture.all[0].width Project.texture_height = Texture.all[0].height }, 50); } if(data.cuboids === undefined){ if(data.parent === undefined){ throw Error(`No cuboids found in file ${path}`) }else{ let p = data.parent Blockbench.read([...patharr.slice(undefined, patharr.length - 3), p.replace(":", "/")].join("/"), { extensions: ['json'], type: 'Cosmic Reach Model', readtype: 'text', resource_id: 'json' }, files => { try{ let cuboids = codec.parse(files[0].content, files[0].path, true); if(data.cuboids === undefined){ data.cuboids = [] } if(cuboids !== undefined){ for(let c of cuboids){ data.cuboids.push(c) } } dialog.lines = `

Model is a child of '${p}'.

Loaded parent with textures from the model file

`.split("\n") dialog.show() }catch(error){ dialog.lines = `

Unable to import parent of the model.

${error}

`.split("\n") dialog.show() } }) } } if(data.textures["all"] != undefined){ allTexturesSpecified = true } function getFaceUV(cuboid, face, uv){ return cuboid.faces[face].uv[uv] } function setUVforFace(cube, cuboid, facenamebb, facenamecr){ texture = allTexturesSpecified ? data.textures["all"] : data.textures[cuboid.faces[facenamecr].texture] cube.faces[facenamebb].uv =[getFaceUV(cuboid, facenamecr, 0), getFaceUV(cuboid, facenamecr, 1), getFaceUV(cuboid, facenamecr, 2), getFaceUV(cuboid, facenamecr, 3)] cube.faces[facenamebb].rotation = cuboid.faces[facenamecr]["uvRotation"] ?? 0 cube.faces[facenamebb].texture = Texture.all.filter((x) => {return x.name == texture.fileName})[0] } for(let cuboid of data.cuboids){ let from = cuboid.localBounds.slice(0, 3) let to = cuboid.localBounds.slice(3, 6) let cube = new Cube({from: from, to: to}) for(let i = 0; i < 6; i++){ try{ let texture = loadedTextures[allTexturesSpecified ? "all" : cuboid.faces[facenamescr[i]].texture] setUVforFace(cube, cuboid, facenamesbb[i], facenamescr[i]) cube.faces[facenamesbb[i]].texture = texture }catch(error){ } if(cuboid.faces[facenamescr[i]] !== undefined){ cube.faces[facenamesbb[i]].cullface = cuboid.faces[facenamescr[i]].cullFace ? facenamesbb[i] : "" cube.faces[facenamesbb[i]].tint = cuboid.faces[facenamescr[i]].ambientocclusion ? 0 : -1 }else{ cube.faces[facenamesbb[i]].enabled = false } } cube.addTo(Group.all.last()).init() } setTimeout(() => { Canvas.updateAll() }, 50); properties = {isTransparent: false, cullsSelf: true} if (data.isTransparent !== undefined){ properties.isTransparent = data.isTransparent } if (data.cullsSelf !== undefined){ properties.cullsSelf = data.cullsSelf } Project.properties = properties return true; } }) codec_animation = new Codec("cosmic_reach_entity_animation_codec", { name: "Cosmic Reach Entity Animation", extension: "json", load_filter: {type: "json", extensions: ["json"]}, parse(rawJSONstring, path){ let contents if(typeof rawJSONstring === 'string'){ contents = JSON.parse(rawJSONstring) }else if(rawJSONstring instanceof Object && !(rawJSONstring instanceof Array)){ contents = rawJSONstring }else{ throw "Unable to convert file data to Object" } let bones = [] function compileGroup(obj){ bones[obj.name] = { self: obj, parent: null } for(let child of obj.children){ if(child instanceof Group){ compileGroup(child) } } } Outliner.root.forEach(obj => { if (obj instanceof Group) { compileGroup(obj); } else if (obj instanceof Cube) { //compileCube(obj) } }) for(let animation_name of Object.keys(contents.animations)){ let animation = contents.animations[animation_name] let animationobj = new Animation({ name: animation_name, loop: animation.loop ? "loop" : "once", length: animation.animation_length }) for(let bone_name of Object.keys(animation.bones)){ let bone = animation.bones[bone_name] if (!(bone_name in bones)) continue let animator = animationobj.getBoneAnimator(bones[bone_name].self) for(let channel_name of Object.keys(bone)){ let channel = bone[channel_name] if(channel instanceof Array){ animator.addKeyframe({time: 0, channel: channel_name, data_points: [ vectorFromArrayToObject(channel, true) ]}) }else if(channel instanceof Object){ for(let timekey of Object.keys(channel)){ let time = Number(timekey) let keyframedata = channel[timekey] if(Array.isArray(keyframedata)){ animator.addKeyframe({time: time, channel: channel_name, interpolation: "linear", data_points: [ vectorFromArrayToObject(keyframedata, true) ]}) }else if(keyframedata instanceof Object){ if(keyframedata.pre){ animator.addKeyframe({time: time, channel: channel_name, interpolation: "bezier", data_points: [ vectorFromArrayToObject(keyframedata.pre, true) ]}) } if(keyframedata.post){ animator.addKeyframe({time: time, channel: channel_name, interpolation: "bezier", data_points: [ vectorFromArrayToObject(keyframedata.post, true) ]}) } } } } } } animationobj.add() } }, compile(){ let animations = {} for(let anim of Project.animations){ let animation = { loop: anim.loop === "loop", animation_length: anim.length } let bones = {} for(let animatorEntry of Object.entries(anim.animators)){ let animator = animatorEntry[1] let bone = {} if(animator.position.length == 1){ if(animator.position[0].data_points.length == 1){ if(animator.position[0].time == 0){ let data_point = animator.position[0].data_points[0] bone.position = [data_point.x, data_point.y, data_point.z].map((n) => Number(n)) } } }else if(animator.position.length > 0){ bone.position = {} for(let keyframe of animator.position){ if(!keyframe.data_points.length) continue if(keyframe.interpolation === "bezier"){ bone.position[keyframe.time.toString()] = { "post": [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)), "lerp_mode": "catmullrom" } }else{ bone.position[keyframe.time.toString()] = [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)) } } } if(animator.rotation.length == 1){ if(animator.rotation[0].data_points.length == 1){ if(animator.rotation[0].time == 0){ let data_point = animator.rotation[0].data_points[0] bone.rotation = [data_point.x, data_point.y, data_point.z].map((n) => Number(n)) } } }else if(animator.rotation.length > 0){ bone.rotation = {} for(let keyframe of animator.rotation){ if(!keyframe.data_points.length) continue if(keyframe.interpolation === "bezier"){ bone.rotation[keyframe.time.toString()] = { "post": [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)), "lerp_mode": "catmullrom" } }else{ bone.rotation[keyframe.time.toString()] = [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)) } } } if(animator.scale.length == 1){ if(animator.scale[0].data_points.length == 1){ if(animator.scale[0].time == 0){ let data_point = animator.scale[0].data_points[0] bone.scale = [data_point.x, data_point.y, data_point.z].map((n) => Number(n)) } } }else if(animator.scale.length > 0){ bone.scale = {} for(let keyframe of animator.scale){ if(!keyframe.data_points.length) continue if(keyframe.interpolation === "bezier"){ bone.scale[keyframe.time.toString()] = { "post": [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)), "lerp_mode": "catmullrom" } }else{ bone.scale[keyframe.time.toString()] = [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)) } } } if(bone.position){ bones[animator.group.name] = {position: bone.position} } if(bone.rotation){ if(bones[animator.group.name] === undefined){ bones[animator.group.name] = {} } if(bones[animator.group.name].rotation === undefined){ bones[animator.group.name].rotation = null } bones[animator.group.name].rotation = bone.rotation } if(bone.scale){ if(bones[animator.group.name] === undefined){ bones[animator.group.name] = {} } if(bones[animator.group.name].scale === undefined){ bones[animator.group.name].scale = null } bones[animator.group.name].scale = bone.scale } } animation.bones = bones animations[anim.name] = animation } return stringifyJSON({animations: animations}) } }) codec_entity = new Codec("cosmic_reach_entity_model_codec", { name: "Cosmic Reach Entity", extension: "json", remember: false, load_filter: {type: "json", extensions: ["json"], condition: (model) => { return model.id && model.texture_width && model.texture_height && model.bones }}, format: new ModelFormat("cosmic_reach_entity_model", { id: "cosmic_reach_entity_model", icon: icon64, name: "Cosmic Reach Entity Model", description: "Entiy model format used by the game Cosmic Reach", show_on_start_screen: true, target: ["json"], vertex_color_ambient_occlusion: true, rotate_cubes: true, rotation_limit: false, rotation_snap: true, uv_rotation: false, box_uv: true, java_face_properties: true, centered_grid: true, edit_mode: true, rotate_cubes: true, box_uv: true, single_texture: true, bone_rig: true, centered_grid: true, animated_textures: true, animation_files: true, animation_mode: true, animation_controllers: true, bone_binding_expression: true, locators: true, new() { newProject(this) } }), compile(){ let bones = [] function compileCube(obj){ let cube = { origin: obj.from, size: [obj.to[0] - obj.from[0], obj.to[1] - obj.from[1], obj.to[2] - obj.from[2]], uv: obj.uv_offset } if(!vectorIsEqualToVector(obj.origin, [0, 0, 0])){ cube.pivot = obj.origin } if(!vectorIsEqualToVector(obj.rotation, [0, 0, 0])){ cube.rotation = obj.rotation } if(obj.inflate != 0){ cube.inflate = obj.inflate } return cube } function compileGroup(obj){ /*group.children.forEach(obj => { if (obj instanceof Group) { compileGroup(obj); } else if (obj instanceof Cube) { compileCube(obj) } })*/ let newBone = { name: obj.name, pivot: obj.origin } if((obj.rotation[0] !== 0)||(obj.rotation[1] !== 0)||(obj.rotation[2] !== 0)){ newBone.rotation = obj.rotation } if(obj.parent != "root"){ newBone.parent = obj.parent.name } for(let child of obj.children){ if(child instanceof Group){ compileGroup(child) }else if(child instanceof Cube){ if(newBone.cubes === undefined){ newBone.cubes = [] } newBone.cubes.push(compileCube(child)) } } bones.push(newBone) } Outliner.root.forEach(obj => { if (obj instanceof Group) { compileGroup(obj); } else if (obj instanceof Cube) { //compileCube(obj) } }) // return stringifyJSON({id: name, texture_width: Project.texture_width, texture_height: Project.texture_height, bones: bones}) }, parse(rawJSONstring, path, cuboidsOnly = false){ let data if(typeof rawJSONstring === 'string'){ data = JSON.parse(rawJSONstring) }else if(rawJSONstring instanceof Object && !(rawJSONstring instanceof Array)){ data = rawJSONstring }else{ throw "Unable to convert file data to Object" } Project.texture_width = data.texture_width || 16 Project.texture_height = data.texture_height || 16 Project.name = data.id || "" bones = {} for(let bone of data.bones){ let group = new Group((({ cubes, parent, ...o }) => o)(bone)).init() group.origin = bone.pivot if(bone.cubes){ for(let cube of bone.cubes){ let newCube = new Cube({ uv_offset: cube.uv, from: cube.origin, size: cube.size, rotation: cube.rotation, origin: cube.pivot, inflate: cube.inflate }) newCube.addTo(group).init() } } bones[bone.name] = {"self": group, "parent": bone.parent} } for(let bone of Object.keys(bones)){ let b = bones[bone] if(b.parent){ b.self.addTo(bones[b.parent].self) }else{ b.self.addTo("root") } } let patharr = path.split(/[\\\/]/g) let loadedTextures = {} const b = patharr.slice(undefined, patharr.length - 4) for(let t of Object.keys(data.textures ?? {})){ let newtexture = new Texture().fromPath([...b, data.textures[t].replace(":", "/")].join("/")) newtexture.name = data.textures[t].fileName loadedTextures[t] = newtexture.add() } //patharr = patharr.slice(0, patharr.length - 1) // let root = lastOccuranceOfSequenceInArray(patharr, ["models", "entities"]) let animpatharr = [...patharr.slice(undefined, root - 1), "animations", ...patharr.slice(root)] animpatharr[animpatharr.length - 1] = animpatharr[animpatharr.length - 1].replace(/\.json$/gi, ".animation.json").replace(/^model_/gi, "") let animpath = animpatharr.join("/") Blockbench.read(animpath, { extensions: ['json'], type: 'Cosmic Reach Entity Model', readtype: 'text', resource_id: 'json' }, files => { try{ let contents = JSON.parse(files[0].content) codec_animation.parse(contents, animpath) }catch(error){ dialog.lines = `

Unable to import animations of the model.

${error}

`.split("\n") dialog.show() } }) } }) import_action_block = new Action('import_cosmic_reach_model', { name: 'Import Cosmic Reach Block Model', description: '', icon: icon64, category: 'file', click() { Blockbench.import({ extensions: ['json'], type: 'Cosmic Reach Model', readtype: 'text', resource_id: 'json' }, files => { try{ codec.parse(files[0].content, files[0].path); Canvas.updateAll() }catch(error){ dialog.lines = `

Unable to import file.

${error}

`.split("\n") dialog.show() } }) } }) export_action_block = new Action('export_cosmic_reach_model', { name: 'Export Cosmic Reach Block Model', description: '', icon: icon64, category: 'file', /*side_menu: new Menu("export_cosmic_reach_model_sidemenu", [ new Action('export_cosmic_reach_model', { name: 'Export minimized', description: '', icon: icon64, category: 'file', structure: [ ], click() { try{ codec.export(); }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }), new Action('export_cosmic_reach_model_maximized', { name: 'Export maximized', description: '', icon: icon64, category: 'file', click() { try{ codec.export(); }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }), ]),*/ click() { try{ codec.export({parent: undefined}); }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }) //export_action_block_maximized = export_action_block_aschild = new Action('export_cosmic_reach_model_aschild', { name: 'Export Cosmic Reach Block Child Model', description: '', icon: icon64, category: 'file', click() { try{ new Dialog("cosmic_reach_model_exportaschildmodeldialog", { id: "cosmic_reach_model_dialog_aschild", title: "Export model as a child", form: { name: { label: "Parent name", value: Project._name } }, onConfirm: result => { codec.export({parent: result.name}); } }).show() }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }) MenuBar.addAction(import_action_block, 'file.import') MenuBar.addAction(export_action_block, 'file.export') /*MenuBar.addAction(export_action_block_minimized, 'file.export') MenuBar.addAction(export_action_block_maximized, 'file.export')*/ MenuBar.addAction(export_action_block_aschild, 'file.export') import_action_entity = new Action('import_cosmic_reach_entity_model', { name: 'Import Cosmic Reach Entity Model', description: '', icon: icon64, category: 'file', click() { Blockbench.import({ extensions: ['json'], type: 'Cosmic Reach Model', readtype: 'text', resource_id: 'json' }, files => { try{ codec_entity.parse(files[0].content, files[0].path); Canvas.updateAll() }catch(error){ dialog.lines = `

Unable to import file.

${error}

`.split("\n") dialog.show() } }) } }) export_action_entity = new Action('export_cosmic_reach_entity_model', { name: 'Export Cosmic Reach Entity Model', description: '', icon: icon64, category: 'file', /*children: side_menu: new Menu("export_cosmic_reach_entity_model_side_menu",[new Action('export_cosmic_reach_entity_model_minimized', { name: 'Export minimized', description: '', icon: icon64, category: 'file', side_menu: new Menu("export_cosmic_reach_entity_model_side_menu",[]), click() { try{ codec_entity.export(); }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }),new Action('export_cosmic_reach_entity_model_maximized', { name: 'Export maximized', description: '', icon: icon64, category: 'file', side_menu: new Menu("export_cosmic_reach_entity_model_side_menu",[]), click() { try{ codec_entity.export(); }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }),]),*/ click() { try{ codec_entity.export(); }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }) MenuBar.addAction(import_action_entity, 'file.import') MenuBar.addAction(export_action_entity, 'file.export') import_action_entity_animation = new Action('import_cosmic_reach_entity_animation', { name: 'Import Cosmic Reach Entity Animation', description: '', icon: icon64, category: 'file', click() { Blockbench.import({ extensions: ['json'], type: 'Cosmic Reach Animation', readtype: 'text', resource_id: 'json' }, files => { try{ codec_animation.parse(files[0].content, files[0].path); Canvas.updateAll() }catch(error){ dialog.lines = `

Unable to import file.

${error}

`.split("\n") dialog.show() } }) } }) export_action_entity_animation = new Action('export_cosmic_reach_entity_animation', { name: 'Export Cosmic Reach Entity Animation', description: '', icon: icon64, category: 'file', click() { try{ codec_animation.export(); }catch(error){ dialog.lines = `

Unable to export file.

${error}

`.split("\n") dialog.show() } } }) show_properties_dialog = new Action("cosmic_reach_show_properties_dialog", { id: "cosmic_reach_show_properties_dialog", icon: icon64, description: "", name: "Edit model properties", category: "Tools", click() { switch (Project.format.id){ default: propertiesDialog.form = {} propertiesDialog.show() case "cosmic_reach_model": propertiesDialog.form = blockPropertiesForm propertiesDialog.show() propertiesDialog.setFormValues(Project.properties) } } }) MenuBar.addAction(import_action_entity_animation, 'file.import') MenuBar.addAction(export_action_entity_animation, 'file.export') MenuBar.addAction(show_properties_dialog, 'tools') lastOccuranceOfSequenceInArray = (array, sequence) => { let count = 0 for(let i = array.length - 1; i >= 0; i--) { if(array[i] === sequence[sequence.length - count - 1]){ count ++ if(count === sequence.length - 1){ return i } } } return -1 } vectorFromArrayToObject = (vectorArray, isString = false) => { return isString ? {x: vectorArray[0].toString(), y: vectorArray[1].toString(), z: vectorArray[2].toString()} : {x: vectorArray[0], y: vectorArray[1], z: vectorArray[2]} } vectorIsEqualToVector = (vectorA, vectorB) => { return (vectorA[0] == vectorB[0]) && (vectorA[1] == vectorB[1]) && (vectorA[2] == vectorB[2]) } function stringifyJSON(obj, exclude = [], space = "\t", excluder = (obj) => { if(Array.isArray(obj)){ return obj.every(Number.isFinite) }else if(obj instanceof Object){ return obj.uv !== undefined } return false }) { let recur = (obj, spacing, inarray, islastinarray = false) => { let txt = ''; if (inarray) { if (Array.isArray(obj)) { txt += '['; for(let i=0;i Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: plugins/creative_mode/about.md ================================================ ### Fly like in creative Minecraft - From 'WASD Control plugin': Use AWSD to move around, E to go up, Q to go down (keybinds are configurable). - Use Shift to fly faster or Alt to fly slower (keybinds are configurable). - You can change the sensitivity of the camera, speed of flight, speed modifier for "go faster (shift)" and "go slower (alt)". ### Painting the world - Select a "brush" (Cube). - Press T or click the icon to toggle the tool. - Start painting by clicking with the Right Mouse Button on other cubes. - Use Left Click to remove blocks, or Ctrl + Z to undo. - If you want to select a different brush, or customize the current one, just press T again to deactivate the tool and select a different brush (Cube). - Differently from Minecraft there's no limit distance to place blocks, so you can remove or place a block from really far away. ### Demo - Checkout this discord thread with some videos (https://discord.com/channels/314078526104141834/1264973145681559674), I'll need to join the Blockbench discord server to see it. ### Known issues - The plugin may act weirdly when placing blocks with rotations or scales that differ from each other. - The Outliner can flicker up and down when placing lots of blocks. Selecting something in the outliner usually fixes that. - The performance can be a little weird when placing thousands of blocks in the same scene. However, that fixes itself when restarting the app, it's inconsistent what triggers the frame drops in this case. ### Limitations - It's not supported to place a cube in a Mesh or in the "void". - While placing a tiny block in a huge block, that placement can be weird and offset to some corner. That's tough to fix, so there's no planning for that. - It's not possible to Ctrl + S to save the project while the tool is active. That's due to the WASD movement for the navigation. - It's not possible to position multiple blocks at the same time. ### Future ideas - The plugin no longer implements a simple tool, but a new "edit mode" called 'Creative', placed next to Edit / Paint / Animate. This new tab will not show any Gizmo or selection; it will only be for 'placing and removing cubes'. - This new tab would have its own group system to help group the new cubes created; I've been using the plugin for creating a level design for my game, and I got 1000+ cubes in the scene, so it's important to have some group organization. - A new interface in this new tab, that would take the UV place, displaying the current selected cube (aka. the current Sample Cube used for painting the world). - A system that lets the user place cubes in an empty grid. The current state only lets the user place a cube next to another cube, so that can be a bit annoying at times. - Add middle click to pick blocks like in Minecraft (Suggested by Jannis). ================================================ FILE: plugins/creative_mode/creative_mode.js ================================================ (function() { let cubeSample = undefined; let cubeSample_normals = {}; const faceNormals = { north: { x: 0, y: 0, z: -1 }, south: { x: 0, y: 0, z: 1 }, west: { x: -1, y: 0, z: 0 }, east: { x: 1, y: 0, z: 0 }, up: { x: 0, y: 1, z: 0 }, down: { x: 0, y: -1, z: 0 } }; let old_animate; let just_enabled = false; BBPlugin.register('creative_mode', { title: 'Creative Mode', author: 'Caio Raphael', icon: 'icon.png', description: 'Place and remove cubes just like in Minecraft creative mode', version: '1.0.0', min_version: '4.8.0', variant: 'both', onload() { let canvas = document.querySelector('canvas'); // SETTINGS new Setting('creative_mode_camera_sensitivity', { name: 'Creative Mode: Camera Sensitivity', description: '-', category: 'preview', type: 'number', value: 1, max: 5.0, min: 0.1 }); new Setting('creative_mode_base_speed', { name: 'Creative Mode: Base Speed', description: '-', category: 'preview', type: 'number', value: 50, min: 1 }); new Setting('creative_mode_move_faster_mult', { name: 'Creative Mode: Move Faster Multiplier', description: '-', category: 'preview', type: 'number', value: 2.5, max: 10, min: 1 }); new Setting('creative_mode_move_slower_mult', { name: 'Creative Mode: Move Slower Multiplier', description: '-', category: 'preview', type: 'number', value: 0.5, max: 1, min: 0.1 }); new Setting('creative_mode_wasd_y_level', { name: 'Creative Mode: Navigate at Y Level', description: 'Navigate using WASD at consistent Y level rather than on camera plane', category: 'preview', value: true }); // FUNCTIONS: Behavior function manageActions(event) { let intersection = Canvas.raycast(event); if (intersection && intersection.element instanceof Mesh) { if (event.button === 0 || event.button == 2) { Blockbench.showQuickMessage('Meshes are not supported.', 2000); } return; } if (intersection && intersection.element instanceof Cube) { // Delete if (event.button === 0) { let cube = intersection.element; removeCube(cube); return; } if (cubeSample) { // Add if (event.button === 2) { if (intersection && intersection.element instanceof Cube) { let cube = intersection.element; let clicked_face = intersection.face; const cube_normals = { north: getRotatedVector(faceNormals['north'], cube.rotation), up: getRotatedVector(faceNormals['up'], cube.rotation), east: getRotatedVector(faceNormals['east'], cube.rotation), south: getRotatedVector(faceNormals['south'], cube.rotation), west: getRotatedVector(faceNormals['west'], cube.rotation), down: getRotatedVector(faceNormals['down'], cube.rotation) }; let face_normal = cube_normals[clicked_face]; placeAdjacentCube(cube, face_normal); return; } } else { return; } } else { Blockbench.showQuickMessage('Cube Sample not selected.', 2000); return; } } } function placeAdjacentCube(cubeTarget, face_normal) { Undo.initEdit({outliner: true, elements: []}); // 'cubeSample' and 'cubeTarget' transforms. apply_origin_to_geometry(cubeSample); apply_origin_to_geometry(cubeTarget); // Location spawn for the 'newCube'. let size_cubeSample = cubeSample.size(); let size_cubeTarget = cubeTarget.size(); let from_newCube_location = [...cubeTarget.from]; let to_newCube_location = [ from_newCube_location[0] + size_cubeSample[0], from_newCube_location[1] + size_cubeSample[1], from_newCube_location[2] + size_cubeSample[2] ]; // >>>> Testes para fix do bug 'scale + rotation'. let size_cubeTarget_converted = { x: size_cubeTarget[0], y: size_cubeTarget[1], z: size_cubeTarget[2], }; let rotated_size_cubeTarget = getRotatedVector(size_cubeTarget_converted, cubeTarget.rotation); // let translation = [ // face_normal.x * rotated_size_cubeTarget.x, // face_normal.y * rotated_size_cubeTarget.y, // face_normal.z * rotated_size_cubeTarget.z // ]; // <<<< let translation = [ face_normal.x * size_cubeTarget[0], face_normal.y * size_cubeTarget[1], face_normal.z * size_cubeTarget[2], ]; let newCube = cubeSample.duplicate(); // 'newCube' transforms. let old_newCube_rotation = newCube.rotation; newCube.rotation = [0,0,0]; newCube.from = [ from_newCube_location[0] + translation[0], from_newCube_location[1] + translation[1], from_newCube_location[2] + translation[2] ]; newCube.to = [ to_newCube_location[0] + translation[0], to_newCube_location[1] + translation[1], to_newCube_location[2] + translation[2] ]; move_pivot_to_geometry(newCube); newCube.rotation = old_newCube_rotation; // Finish. Cube.all.push(newCube); Undo.finishEdit('Add cube', {outliner: true, elements: [newCube]}); Canvas.updateAll(); } function removeCube(cube) { Undo.initEdit({outliner: true, elements: [cube]}); cube.remove(); // Atualizar somehow no outliner. Tive bugs ao apagar o objeto selecionado. if (cube === cubeSample) { cubeSample = undefined; cubeSample_normals = []; } Undo.finishEdit('Remove cube', {outliner: true, elements: []}); } function isCreativeModeEnabled() { // return Preview.selected && BarItems.creative_tool && BarItems.creative_tool.value; return Preview.selected && (BarItems.creative_tool === BarItems[Toolbox.selected.id]); } function setupWASDMovement(preview, length = 1) { let pos = new THREE.Vector3().copy(preview.camera.position); pos.add(preview.camera.getWorldDirection(new THREE.Vector3()).normalize().multiplyScalar(length)); preview.controls.target.copy(pos); } function move_camera(event) { let movementX = event.movementX || 0; let movementY = event.movementY || 0; // Rotate the camera Preview.selected.controls.rotateLeft(movementX * 0.004 * settings.creative_mode_camera_sensitivity.value); Preview.selected.controls.rotateUp(movementY * 0.004 * settings.creative_mode_camera_sensitivity.value); } function helper_hide_context_menu() { // Event trigger to hide the context_menu. let rect = canvas.getBoundingClientRect(); let centerX = rect.left + window.innerWidth / 2; let centerY = rect.top + window.innerHeight / 2; let mousedown_event = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, clientX: centerX, clientY: centerY, button: 1 }); let mouseup_event = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, clientX: centerX, clientY: centerY, button: 1 }); mousedown_event.selection_helper = true; mouseup_event.selection_helper = true; canvas.dispatchEvent(mousedown_event); canvas.dispatchEvent(mouseup_event); } function click_on_center(b) { // Event trigger to hide the context_menu. let rect = canvas.getBoundingClientRect(); let centerX = window.innerWidth / 2; let centerY = window.innerHeight / 2; let mousedown_event = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, clientX: centerX, clientY: centerY, button: b }); let mouseup_event = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, clientX: centerX, clientY: centerY, button: b }); mousedown_event.click_on_center = true; mouseup_event.click_on_center = true; canvas.dispatchEvent(mousedown_event); canvas.dispatchEvent(mouseup_event); } // FUNCTIONS: Geometry function getRotatedVector(vector, rotation) { let radX = rotation[0] * Math.PI / 180; let radY = rotation[1] * Math.PI / 180; let radZ = rotation[2] * Math.PI / 180; let cosX = Math.cos(radX); let sinX = Math.sin(radX); let cosY = Math.cos(radY); let sinY = Math.sin(radY); let cosZ = Math.cos(radZ); let sinZ = Math.sin(radZ); let rotatedNormal = {...vector}; // Apply rotation around X axis let tempY = rotatedNormal.y; rotatedNormal.y = tempY * cosX - rotatedNormal.z * sinX; rotatedNormal.z = tempY * sinX + rotatedNormal.z * cosX; // Apply rotation around Y axis let tempZ = rotatedNormal.z; rotatedNormal.z = tempZ * cosY - rotatedNormal.x * sinY; rotatedNormal.x = tempZ * sinY + rotatedNormal.x * cosY; // Apply rotation around Z axis let tempX = rotatedNormal.x; rotatedNormal.x = tempX * cosZ - rotatedNormal.y * sinZ; rotatedNormal.y = tempX * sinZ + rotatedNormal.y * cosZ; return rotatedNormal; } function getCubeGhostCenter(cube) { let max = [-Infinity, -Infinity, -Infinity]; let min = [ Infinity, Infinity, Infinity]; if (cube.getWorldCenter) { var pos = cube.getWorldCenter(); min[0] = Math.min(pos.x, min[0]); max[0] = Math.max(pos.x, max[0]); min[1] = Math.min(pos.y, min[1]); max[1] = Math.max(pos.y, max[1]); min[2] = Math.min(pos.z, min[2]); max[2] = Math.max(pos.z, max[2]); } let center = (min[0] == Infinity) ? [0, 0, 0] : max.V3_add(min).V3_divide(2); if (!Format.centered_grid) { center.V3_add(8, 8, 8); } return center; } function apply_origin_to_geometry(cube) { var center = getCubeGhostCenter(cube); if (!cube.transferOrigin) return; cube.transferOrigin(center); } function getCubeCenter(cube) { return [ cube.from[0] + cube.size(0)/2, cube.from[1] + cube.size(1)/2, cube.from[2] + cube.size(2)/2 ] } function move_pivot_to_geometry(cube) { cube.origin = getCubeCenter(cube); } // FUNCTIONS: Draw const crosshair_size = 10; const crosshair_linewidth = 2; const crosshair_color = 'white'; const custom_canvas = document.createElement('canvas'); custom_canvas.width = window.innerWidth; custom_canvas.height = window.innerHeight; custom_canvas.style.position = 'absolute'; custom_canvas.style.top = '0'; custom_canvas.style.left = '0'; custom_canvas.style.pointerEvents = 'none'; // Ensure the canvas doesn't block interactions custom_canvas.style.zIndex = '9999'; document.body.appendChild(custom_canvas); const ctx = custom_canvas.getContext('2d'); function drawCrosshair() { const centerX = custom_canvas.width / 2; const centerY = custom_canvas.height / 2; clearDrawing(); ctx.beginPath(); ctx.moveTo(centerX - crosshair_size, centerY); ctx.lineTo(centerX + crosshair_size, centerY); ctx.moveTo(centerX, centerY - crosshair_size); ctx.lineTo(centerX, centerY + crosshair_size); ctx.strokeStyle = crosshair_color; ctx.lineWidth = crosshair_linewidth; ctx.stroke(); } function clearDrawing() { ctx.clearRect(0, 0, custom_canvas.width, custom_canvas.height); // Clear the custom_canvas } // Adjust the custom_canvas size when the window is resized window.addEventListener('resize', () => { custom_canvas.width = window.innerWidth; custom_canvas.height = window.innerHeight; if (isCreativeModeEnabled()) { drawCrosshair(); } }); // INPUT: Keybinds let navigate_forward = new KeybindItem('creative_mode_navigate_forward', { name: 'Creative Mode: Move Forward', icon: 'arrow_upward', category: 'navigate', keybind: new Keybind({key: 'w', ctrl: null}) }); let navigate_backward = new KeybindItem('creative_mode_navigate_backward', { name: 'Creative Mode: Move Backward', icon: 'arrow_downward', category: 'navigate', keybind: new Keybind({key: 's', ctrl: null}) }); let navigate_left = new KeybindItem('creative_mode_navigate_left', { name: 'Creative Mode: Move Left', icon: 'arrow_back', category: 'navigate', keybind: new Keybind({key: 'a', ctrl: null}) }); let navigate_right = new KeybindItem('creative_mode_navigate_right', { name: 'Creative Mode: Move Right', icon: 'arrow_forward', category: 'navigate', keybind: new Keybind({key: 'd', ctrl: null}) }); let navigate_down = new KeybindItem('creative_mode_navigate_down', { name: 'Creative Mode: Move Down', icon: 'expand_more', category: 'navigate', keybind: new Keybind({key: 'q', ctrl: null}) }); let navigate_up = new KeybindItem('creative_mode_navigate_up', { name: 'Creative Mode: Move Up', icon: 'expand_less', category: 'navigate', keybind: new Keybind({key: 'e', ctrl: null}) }); let navigate_faster = new KeybindItem('creative_mode_navigate_faster', { name: 'Creative Mode: Move Faster', icon: 'expand_less', category: 'navigate', keybind: new Keybind({key: 16, ctrl: null}) }); let navigate_slower = new KeybindItem('creative_mode_navigate_slower', { name: 'Creative Mode: Move Slower', icon: 'expand_less', category: 'navigate', keybind: new Keybind({key: 18, ctrl: null}) }); let plugin_keybinds = [navigate_forward, navigate_backward, navigate_left, navigate_right, navigate_down, navigate_up, navigate_faster, navigate_slower]; // INPUT: Check let pressed_keys = []; Blockbench.on('press_key', data => { let key = data.event.which; if (plugin_keybinds.find(k => k.keybind.key == key) && !getFocusedTextInput()) { pressed_keys.safePush(key); if (isCreativeModeEnabled()) { data.capture(); } } }); document.addEventListener('keydown', event => { if (isCreativeModeEnabled()) { if (!just_enabled) { if (event.keyCode == creativeToolAction.keybind.key || event.key === 'Escape') { BarItems['move_tool'].select(); } } just_enabled = false; } }); document.addEventListener('keyup', event => { pressed_keys.remove(event.which); }); document.addEventListener('mousedown', event => { if (isCreativeModeEnabled()) { if (event.click_on_center) { manageActions(event); } else { if (event.button == 0) { event.preventDefault(); click_on_center(0); } if (event.button == 2) { event.preventDefault(); click_on_center(2); } } } }); document.addEventListener('mouseup', function(event) { if (isCreativeModeEnabled()) { if (event.click_on_center) { } if (event.button === 2) { event.preventDefault(); // I'm not sure about this. helper_hide_context_menu(); } unselectAllElements(); if (cubeSample) cubeSample.select(); } }); document.addEventListener('mousemove', function(event) { if (isCreativeModeEnabled()) { move_camera(event); } }); // TOOLS let creativeToolAction = new Tool('creative_tool', { name: 'Creative Tool', icon: 'fa-cube', category: 'tools', keybind: new Keybind({key: 't'}), modes: ['edit'], condition: {modes: ['edit']}, onSelect: function() { drawCrosshair(); setupWASDMovement(Preview.selected, 1); Preview.all.forEach(preview => { preview.controls.enableZoom = false; }); canvas.requestPointerLock(); cubeSample = Cube.selected[0]; if (cubeSample) { cubeSample.select(); cubeSample_normals = { north: getRotatedVector(faceNormals['north'], cubeSample.rotation), up: getRotatedVector(faceNormals['up'], cubeSample.rotation), east: getRotatedVector(faceNormals['east'], cubeSample.rotation), south: getRotatedVector(faceNormals['south'], cubeSample.rotation), west: getRotatedVector(faceNormals['west'], cubeSample.rotation), down: getRotatedVector(faceNormals['down'], cubeSample.rotation) }; } just_enabled = true; }, onUnselect: function() { clearDrawing(); setupWASDMovement(Preview.selected, 16); Preview.all.forEach(preview => { preview.controls.enableZoom = true; }); document.exitPointerLock(); cubeSample = undefined; cubeSample_normals = []; } }); MenuBar.addAction(creativeToolAction, 'tools'); // PROCESS function doWASDMovement() { let movement = new THREE.Vector3(0, 0, 0); let uses_wasd_movement = false; function add(x, y, z) { movement.x += x; movement.y += y; movement.z += z; uses_wasd_movement = true; } if (pressed_keys.includes(navigate_forward.keybind.key)) add(0, 0, -1); if (pressed_keys.includes(navigate_backward.keybind.key)) add(0, 0, 1); if (pressed_keys.includes(navigate_left.keybind.key)) add(-1, 0, 0); if (pressed_keys.includes(navigate_right.keybind.key)) add(1, 0, 0); if (pressed_keys.includes(navigate_down.keybind.key)) add(0, -1, 0); if (pressed_keys.includes(navigate_up.keybind.key)) add(0, 1, 0); if (uses_wasd_movement) { setupWASDMovement(Preview.selected); let speedMultiplier = 1.0; if (pressed_keys.includes(navigate_faster.keybind.key)) speedMultiplier *= settings.creative_mode_move_faster_mult.value; else if (pressed_keys.includes(navigate_slower.keybind.key)) speedMultiplier *= settings.creative_mode_move_slower_mult.value; if (settings.creative_mode_wasd_y_level.value) { let vec = Preview.selected.controls.object.getWorldDirection(new THREE.Vector3()).normalize(); let angle = Math.atan2(-vec.x, -vec.z); movement.applyAxisAngle(THREE.NormalY, angle); } else { movement.applyEuler(Preview.selected.controls.object.rotation); } movement.multiplyScalar(Settings.get('creative_mode_base_speed') * speedMultiplier / 100); Preview.selected.camera.position.add(movement); Preview.selected.controls.target.add(movement); } } old_animate = window.animate; window.animate = function(...args) { old_animate(...args); if (isCreativeModeEnabled() && pressed_keys.length) { doWASDMovement(); } }; }, onunload() { MenuBar.removeAction('creative_tool'); } }); })(); ================================================ FILE: plugins/csmodel.js ================================================ (function() { var import_action, export_action; Plugin.register('csmodel', { title: 'CraftStudio Model Format', icon: 'star', author: 'JannisX11', description: 'Allows to import and export CraftStudio Models (.csmodel).', about: `To **import** a model from CraftStudio, go to the CraftStudio project settings and export a cspack file. Open this file in an archive manager (like 7zip) and extract the model file. Import the file into Blockbench using the import menu. \nTo **export** a file, export a .csmodel file from Blockbench and drop it into an existing .cspack file into the Models folder. Make sure it is using the same file name as the old model in the pack. Import the .cspack into CraftStudio and select the models you want to import.`, tags: ["CraftStudio"], version: '0.1.3', min_version: '3.8.0', variant: 'both', onload() { function toArrayBuffer(buf) { var ab = new ArrayBuffer(buf.length); var view = new Uint8Array(ab); for (var i = 0; i < buf.length; ++i) { view[i] = buf[i]; } return ab; } let getNativeSize = function(cube, face) { var side = face.direction; var size = {}; if (side == 'north' || side == 'south') { return [cube.size('0'), cube.size('1')] } else if (side == 'east' || side == 'west') { return [cube.size('2'), cube.size('1')] } else if (side == 'up' || side == 'down') { return [cube.size('0'), cube.size('2')] } } var textDecoder; class BinaryReader { constructor(buffer) { this.view = new DataView(buffer); this.cursor = 0; this.textDecoder = new TextDecoder(); } ReadUInt8() { var val; val = this.view.getUint8(this.cursor); this.cursor += 1; return val; } ReadUInt16() { var val; val = this.view.getUint16(this.cursor, true); this.cursor += 2; return val; } ReadInt32() { var val; val = this.view.getInt32(this.cursor, true); this.cursor += 4; return val; } ReadUInt32() { var val; val = this.view.getUint32(this.cursor, true); this.cursor += 4; return val; } ReadFloat32() { var val; val = this.view.getFloat32(this.cursor, true); this.cursor += 4; return val; } ReadFloat64() { var val; val = this.view.getFloat64(this.cursor, true); this.cursor += 8; return val; } ReadBoolean() { return this.ReadUInt8() !== 0; } Read7BitEncodedInt() { var bitIndex, num, returnValue; returnValue = 0; bitIndex = 0; while (true) { if (bitIndex !== 35) { num = this.ReadUInt8(); returnValue |= (num & 127) << bitIndex; bitIndex += 7; } else { throw new Error("Invalid 7-bit encoded int"); } if ((num & 128) === 0) { break; } } return returnValue; } ReadString() { var length, val; length = this.Read7BitEncodedInt(); val = this.DecodeString(new Uint8Array(this.view.buffer.slice(this.cursor, this.cursor + length))); this.cursor += length; return val; } ReadPoint() { return { x: this.ReadInt32(), y: this.ReadInt32() }; } ReadVector2() { return new THREE.Vector2(this.ReadFloat32(), this.ReadFloat32()); } ReadVector3() { return new THREE.Vector3(this.ReadFloat32(), this.ReadFloat32(), this.ReadFloat32()); } ReadIntVector3() { return new THREE.Vector3(this.ReadInt32(), this.ReadInt32(), this.ReadInt32()); } ReadQuaternion() { var w; w = this.ReadFloat32(); return new THREE.Quaternion(this.ReadFloat32(), this.ReadFloat32(), this.ReadFloat32(), w); } ReadBytes(length) { var bytes; bytes = new Uint8Array(this.view.buffer.slice(this.cursor, this.cursor + length)); this.cursor += length; return bytes; } DecodeString(array) { return this.textDecoder.decode(array); }; }; class BinaryWriter { constructor(minimal_length) { this.array = new Uint8Array(minimal_length); this.buffer = this.array.buffer; this.view = new DataView(this.buffer); this.cursor = 0; this.textEncoder = new TextEncoder(); } expand(n) { var new_length = this.cursor+1+n; if (new_length > this.buffer.byteLength) { var oldArray = this.array; this.array = new Uint8Array(new_length); this.buffer = this.array.buffer; this.array.set(oldArray); this.view = new DataView(this.buffer) } } WriteUInt8(value) { this.expand(1); this.view.setUint8(this.cursor, value); this.cursor += 1; } WriteUInt16(value) { this.expand(2); this.view.setUint16(this.cursor, value, true); this.cursor += 2; } WriteInt32(value) { this.expand(4); this.view.setInt32(this.cursor, value, true); this.cursor += 4; } WriteUInt32(value) { this.expand(4); this.view.setUint32(this.cursor, value, true); this.cursor += 4; } WriteFloat32(value) { this.expand(4); this.view.setFloat32(this.cursor, value, true); this.cursor += 4; } WriteFloat64(value) { this.expand(8); this.view.setFloat64(this.cursor, value, true); this.cursor += 8; } WriteBoolean(value) { this.WriteUInt8(value ? 1 : 0) } Write7BitEncodedInt(value) { while (value >= 0x80) { this.WriteUInt8(value | 0x80); value = value >> 7; } this.WriteUInt8(value); } WriteString(string) { var array = this.EncodeString(string); this.Write7BitEncodedInt(array.byteLength); this.WriteBytes(array); } WritePoint(point) { this.expand(8); this.view.setInt32(this.cursor, point.x, true); this.cursor += 4; this.view.setInt32(this.cursor, point.y, true); this.cursor += 4; } WriteVector2(vector) { this.expand(8); this.view.setFloat32(this.cursor, vector.x, true); this.cursor += 4; this.view.setFloat32(this.cursor, vector.y, true); this.cursor += 4; } WriteVector3(vector) { this.expand(12); this.view.setFloat32(this.cursor, vector.x, true); this.cursor += 4; this.view.setFloat32(this.cursor, vector.y, true); this.cursor += 4; this.view.setFloat32(this.cursor, vector.z, true); this.cursor += 4; } WriteIntVector3(vector) { this.expand(12); this.view.setInt32(this.cursor, vector.x, true); this.cursor += 4; this.view.setInt32(this.cursor, vector.y, true); this.cursor += 4; this.view.setInt32(this.cursor, vector.z, true); this.cursor += 4; } WriteQuaternion(quat) { this.expand(16); this.view.setFloat32(this.cursor, quat.w, true); this.cursor += 4; this.view.setFloat32(this.cursor, quat.x, true); this.cursor += 4; this.view.setFloat32(this.cursor, quat.y, true); this.cursor += 4; this.view.setFloat32(this.cursor, quat.z, true); this.cursor += 4; } WriteBytes(array) { this.expand(array.byteLength); this.array.set(array, this.cursor); this.cursor += array.byteLength; } EncodeString(string) { return this.textEncoder.encode(string); } }; var oppositeFaces = { 'south': 'north', 'north': 'south', 'east': 'west', 'down': 'up', 'west': 'east', 'up': 'down', } var faceAxes = { 'north': 2, 'east': 0, 'up': 1, 'south': 2, 'west': 0, 'down': 1, } var codec = new Codec('csmodel', { name: 'CraftStudio', extension: 'csmodel', remember: false, compile(options) { var writer = new BinaryWriter(100); var fake_cube = new Cube({ from: [0, 0, 0], to: [0, 0, 0], }) var ids = {}; var id = -1; var offsets = {}; writer.WriteUInt8(0);//asset type writer.WriteUInt16(5);//format version writer.WriteUInt16(0);//next unused node id writer.WriteUInt16(0);//node count function processGroup(group, parent) { //get main cube var main_cube; for (var child of group.children) { if (child instanceof Cube && child.rotation.allEqual(0)) { main_cube = child; break; } } if (!main_cube) { //add fake 0x0x0 cube processCube(group, parent); } else { processCube(main_cube, parent, group) } ids[group.uuid] = id; for (var child of group.children) { if (child instanceof Cube && child != main_cube) { processCube(child, group, false) } else if (child instanceof Group) { processGroup(child, group) } } } function processCube(obj, parent, group) { id++; var cube = (obj instanceof Cube) ? obj : fake_cube; if (group) obj = group writer.WriteUInt16(id); if (parent && ids[parent.uuid] !== undefined) { writer.WriteUInt16(ids[parent.uuid]); } else { writer.WriteUInt16(-1); } writer.WriteString(obj.name); var size = cube.size(undefined, true); var center = [ cube.from[0] + size[0]/2, cube.from[1] + size[1]/2, cube.from[2] + size[2]/2, ] var pivot = obj.origin var pos = new THREE.Vector3().fromArray(pivot); if (parent) { pos.sub(new THREE.Vector3().fromArray(parent.origin)); } else { pos.add(new THREE.Vector3().fromArray(obj.origin)); } if (parent && ids[parent.uuid]) { pos.sub(offsets[ids[parent.uuid]]); } var offset = new THREE.Vector3(center[0] - pivot[0], center[1] - pivot[1], center[2] - pivot[2]); var euler = new THREE.Euler().setFromDegreeArray(obj.rotation); var rotation = new THREE.Quaternion().setFromEuler(euler); var scale = new THREE.Vector3( ((size[0]+2*cube.inflate) / size[0]) * (size[0] < 0 ?-1:1), ((size[1]+2*cube.inflate) / size[1]) * (size[1] < 0 ?-1:1), ((size[2]+2*cube.inflate) / size[2]) * (size[2] < 0 ?-1:1) ); offsets[id] = new THREE.Vector3().copy(offset); writer.WriteVector3(pos.divideScalar(16)); writer.WriteVector3(offset.divideScalar(16)); writer.WriteVector3(scale); writer.WriteQuaternion(rotation); writer.WriteUInt16(Math.abs(size[0])); writer.WriteUInt16(Math.abs(size[1])); writer.WriteUInt16(Math.abs(size[2])); writer.WriteUInt8(2); for (var face_key in oppositeFaces) { var face = cube.faces[face_key]; writer.WritePoint({ x: face.uv[0], y: face.uv[1] }) } for (var face_key in oppositeFaces) { var code = 0; var x_m = face_key != 'up' && face_key != 'down'; var y_m = face_key != 'up'; if (face.rotation == 90) code += 1; if (face.rotation == 180) code += 2; if (face.rotation == 270) code += 4; if (face.uv[0] > face.uv[2] != x_m) code += 8; if (face.uv[1] > face.uv[3] != y_m) code += 16; writer.WriteUInt8(code); } } Outliner.root.forEach(obj => { if (obj instanceof Group) { processGroup(obj); } else if (obj instanceof Cube) { processCube(obj) } }) writer.view.setUint16(5, id+1, true); if (Texture.getDefault()) { var src = Texture.getDefault().getBase64(); } else { var src = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHklEQVQ4T2P8////fwYKAOOoAQyjYcAwGgYMwyIMACUfP9Eb4ExuAAAAAElFTkSuQmCC' } var array = Uint8Array.from(atob(src), c => c.charCodeAt(0)); writer.WriteUInt32(array.length); writer.WriteBytes(array); writer.WriteUInt16(0); return writer.array; }, parse(arraybuffer) { newProject(Formats.bedrock) var reader = new BinaryReader(arraybuffer); var nodes = {}; var face_info = {}; var node_data = {}; reader.ReadUInt8();//asset type reader.ReadUInt16();//format version reader.ReadUInt16();//next unused node id var node_count = reader.ReadUInt16(); for (var i = 0; i < node_count; i++) { (function() { var id = reader.ReadUInt16(); var parent_id = reader.ReadUInt16(); var name = reader.ReadString(); var pos = reader.ReadVector3().multiplyScalar(16); var offset = reader.ReadVector3().multiplyScalar(16); node_data[id] = { name, pos: new THREE.Vector3().copy(pos), offset: new THREE.Vector3().copy(offset) } var scale = reader.ReadVector3(); var rotation = new THREE.Euler().setFromQuaternion(reader.ReadQuaternion(), 'ZYX').toArray(); rotation.forEach((n, i) => { rotation[i] = Math.radToDeg(n); }) var size = [ reader.ReadUInt16() * scale.x, reader.ReadUInt16() * scale.y, reader.ReadUInt16() * scale.z ] var uv_mode = reader.ReadUInt8(); var faces = { south: {offset: reader.ReadPoint()}, north: {offset: reader.ReadPoint()}, east: {offset: reader.ReadPoint()}, down: {offset: reader.ReadPoint()}, west: {offset: reader.ReadPoint()}, up: {offset: reader.ReadPoint()}, } faces.south.transform = reader.ReadUInt8(); faces.north.transform = reader.ReadUInt8(); faces.east.transform = reader.ReadUInt8(); faces.down.transform = reader.ReadUInt8(); faces.west.transform = reader.ReadUInt8(); faces.up.transform = reader.ReadUInt8(); if (nodes[parent_id]) { pos.add(new THREE.Vector3().fromArray(nodes[parent_id].origin)) pos.add(node_data[parent_id].offset) } var from = [ pos.x + offset.x - size[0]/2, pos.y + offset.y - size[1]/2, pos.z + offset.z - size[2]/2, ] var to = [ from[0] + size[0], from[1] + size[1], from[2] + size[2], ] var cube = new Cube({ name, origin: pos.toArray(), from, to, rotation, box_uv: false }).init(); nodes[id] = cube; face_info[cube.uuid] = faces; faces.scale = scale; faces.cube = cube; if (nodes[parent_id]) { var parent = nodes[parent_id]; if (parent instanceof Cube) { var parent_cube = parent; parent = nodes[parent_id] = new Group({ name: parent_cube.name, origin: parent_cube.origin, rotation: parent_cube.rotation }).addTo(parent_cube).init(); parent.createUniqueName(); parent_cube.addTo(parent); parent_cube.extend({rotation: [0, 0, 0]}) } cube.addTo(parent); } })() } var image = reader.ReadBytes(reader.ReadUInt32()); var i = 0; let txt = ''; while (i < image.length) { let sub = image.subarray(i, Math.clamp(i+1024, 0, image.length)); let substr = String.fromCharCode.apply(null, sub); txt += substr; i += 1024; } let url = 'data:image/png;base64,' + btoa(txt); var tex = new Texture({name: 'texture'}).fromDataURL(url).add(); tex.load_callback = function() { Project.texture_width = tex.width; Project.texture_height = tex.height; Project.box_uv = false; for (var uuid in face_info) { var info = face_info[uuid]; var cube = info.cube; for (var face_key in cube.faces) { var face = cube.faces[face_key]; face.extend({uv: [ info[face_key].offset.x, info[face_key].offset.y, 0,0 ]}); var native_size = getNativeSize(cube, face); if (face.direction == 'south' || face.direction == 'north') { face.uv_size = [ native_size[0]/info.scale.x, native_size[1]/info.scale.y ] } else if (face.direction == 'up' || face.direction == 'down') { face.uv_size = [ native_size[0]/info.scale.x, native_size[1]/info.scale.z ] } else { face.uv_size = [ native_size[0]/info.scale.z, native_size[1]/info.scale.y ] } var code = info[face_key].transform; if (code >= 16) { var size = face.uv[3] - face.uv[1]; face.uv[3] -= size*2; code -= 16; } if (code >= 8) { var size = face.uv[2] - face.uv[0]; face.uv[2] -= size*2; code -= 8; } switch (code) { case 4: face.rotation = 270; break; case 2: face.rotation = 180; break; case 1: face.rotation = 90; break; } } } Canvas.updateAll() } } }) import_action = new Action('import_csmodel', { name: 'Import CraftStudio Model', description: '', icon: 'star', category: 'file', click() { Blockbench.import({ extensions: ['csmodel'], type: 'CraftStudio Model', readtype: 'binary', resource_id: 'craftstudio_files' }, files => { codec.parse(files[0].content); csname = files[0].name.replace(".csmodel","").replace(/\s+/g, "_").toLowerCase(); Project.name = csname; Project.model_identifier = csname; Texture.all.last().name = csname; }) } }) export_action = new Action('export_csmodel', { name: 'Export CraftStudio Model', description: '', icon: 'star', category: 'file', click() { codec.export(); } }) MenuBar.addAction(import_action, 'file.import') MenuBar.addAction(export_action, 'file.export') }, onunload() { import_action.delete(); export_action.delete(); } }); })() ================================================ FILE: plugins/cube_inverter.js ================================================ (async function() { let aboutAction, cubeInverterAction const id = "cube_inverter" const name = "Cube Inverter" const icon = "swap_horiz" const author = "SirJain" // Used for about dialog const links = { website: "https://sirjain0.github.io/", twitter: "https://twitter.com/SirJain2", discord: "https://discord.gg/wM4CKTbFVN" } // Registers plugin data Plugin.register(id, { title: name, icon, author, description: "Adds a button that inverts selected cube sizes.", about: "This plugin adds a button that inverts the size values of each selected cube.\n## How to use\nTo use this plugin, go to the toolbar at the top of the screen (the one with the move, resize, and rotation tools) and click the `Invert Cubes` button. If you don't see the button, make sure to select some cubes. The button is also keybinded with a default of `Shift + I`.\n\nPlease report any bugs or suggestions you may have.", tags: ["Deprecated"], version: "1.0.0", min_version: "4.2.0", variant: "both", oninstall: () => showAbout(true), onload() { addAbout() cubeInverterAction = new Action("cube_inverter_action", { name: "Invert Cubes", icon: icon, description: "Invert the values of all axes of selected cubes.", keybind: new Keybind({key: 'i', shift: true}), condition: () => Cube.selected.length, click: () => invertCubes() }) Toolbars.main_tools.add(cubeInverterAction); }, onunload() { aboutAction.delete() cubeInverterAction.delete() MenuBar.removeAction(`help.about_plugins.about_${id}`) Blockbench.showQuickMessage("Uninstalled Cube Inverter plugin") } }) function invertCubes() { Undo.initEdit({elements: Cube.selected, outliner: true}); for (const cube of Cube.selected) { // Handles size dimensions [cube.from, cube.to] = [cube.to, cube.from] // UV handling cube.faces.north.uv = cube.faces.south.uv cube.faces.south.uv = cube.faces.north.uv cube.faces.north.texture = cube.faces.south.texture cube.faces.south.texture = cube.faces.north.texture cube.faces.north.cullface = cube.faces.south.cullface cube.faces.south.cullface = cube.faces.north.cullface cube.faces.north.rotation = (cube.faces.north.rotation + 180) % 360 cube.faces.south.rotation = (cube.faces.south.rotation + 180) % 360 cube.faces.east.uv = cube.faces.west.uv cube.faces.west.uv = cube.faces.east.uv cube.faces.east.texture = cube.faces.west.texture cube.faces.west.texture = cube.faces.east.texture cube.faces.east.cullface = cube.faces.west.cullface cube.faces.west.cullface = cube.faces.east.cullface cube.faces.east.rotation = (cube.faces.east.rotation + 180) % 360 cube.faces.west.rotation = (cube.faces.west.rotation + 180) % 360 cube.faces.up.uv = cube.faces.down.uv cube.faces.down.uv = cube.faces.up.uv cube.faces.up.texture = cube.faces.down.texture cube.faces.down.texture = cube.faces.up.texture cube.faces.up.cullface = cube.faces.down.cullface cube.faces.down.cullface = cube.faces.up.cullface cube.faces.up.rotation = (cube.faces.up.rotation + 180) % 360 cube.faces.down.rotation = (cube.faces.down.rotation + 180) % 360 } Canvas.updateView({ elements: Cube.selected, element_aspects: {transform: true, geometry: true}, }) Undo.finishEdit("Inverted cube values", {elements: Cube.selected, outliner: true}); } function addAbout() { let about = MenuBar.menus.help.structure.find(e => e.id === "about_plugins") if (!about) { about = new Action("about_plugins", { name: "About Plugins...", icon: "info", children: [] }) MenuBar.addAction(about, "help") } aboutAction = new Action(`about_${id}`, { name: `About ${name}...`, icon, click: () => showAbout() }) about.children.push(aboutAction) } function showAbout(banner) { const infoBox = new Dialog({ id: "about", title: name, width: 780, buttons: [], lines: [` ${banner ? `` : ""}

${name}

Adds a button that inverts selected cube sizes.

Worth noting:

- The plugin inverts each value of all the cubes selected - Positive to Negative or Negative to Positive.

- This plugin logically works on cubes - no meshes or other outliner elements.

- Like all other keybindings, the keybind tied to the 'Invert Cube' action can be changed in the settings.

How to use:

To use this plugin, press the Invert Cubes button which is located next to the Inflation number in the edit tab.


`] }).show() $("dialog#about .dialog_title").html(` ${icon} ${name} `) } })() ================================================ FILE: plugins/custom_marker_colors.js ================================================ (async function() { let aboutAction, defaultColourFunction const E = s => $(document.createElement(s)) const defaultMarkerArray = markerColors.map(e => e.id) const errorTitle = "Invalid Marker!" const duplicateIDErrorTitle = "This ID already exists!" const errorMessage = "You have made an invalid marker color because you have empty fields. Make sure that you leave no fields blank." const duplicateIDErrorMessage = "The ID of your marker color is already taken by a default marker color. Please enter a name which does not have the same ID as the default colors\n\nNote: Marker color IDs are derived from your marker color name but lowercase and with `_` instead of spaces." const id = "custom_marker_colors" const name = "Custom Marker Colors" const icon = "colorize" const author = "SirJain and Geode" // Local Storage const customMarkers = JSON.parse(localStorage.getItem("customMarkers") ?? "{}") // Used in about dialog const links = { twitter: "https://www.twitter.com/SirJain2", twittergeode: "https://twitter.com/GeodeModels", discord: "https://discord.gg/wM4CKTbFVN" } Plugin.register(id, { title: name, icon, author, description: "Allows users to add their own marker colors.", about: "To make a new custom marker, go to Tools > Marker Colors > Add Custom Color to get started with making your own custom marker color. Once you are done, click Confirm. You will now see your marker color in the default color list. And finally, if you ever choose to view or edit your marker colors, you can use Tools > Marker Colors > Manage Marker Colors", tags: ["Marker Color", "Customize", "UX"], version: "1.1.0", min_version: "4.2.0", variant: "both", oninstall() { showAbout(true) Blockbench.showQuickMessage("Installed Custom Marker Colors!", 3000) }, onload() { addAboutButton() actions = [ new Action("add_marker_color", { name: "Add Marker Color", description: "Add a custom marker color", icon: "fa-plus", click: () => createMarkers() }), new Action("edit_marker_colors", { name: "Manage Marker Colors", description: "Manage your custom marker colors", icon: "settings", click: () => editMarkers() }) ] // Update list for (const [name, hex] of Object.entries(customMarkers)) { markerColors.push({ id: name.toLowerCase().replace(/ /g, "_"), name: name, standard: hex, pastel: hex }) } Canvas.updateMarkerColorMaterials() defaultColourFunction = Cube.prototype.menu.structure.find(e => e.name === "menu.cube.color").children MenuBar.addAction({ id: "marker_colors", name: "Marker Colors", children: actions, icon: icon, condition: () => Format?.id != "image" }, "tools") }, onunload() { aboutAction.delete() Blockbench.showQuickMessage("Uninstalled Custom Marker Colors", 3000) MenuBar.removeAction(`help.about_plugins.about_${id}`) MenuBar.removeAction("tools.marker_colors") Cube.prototype.menu.structure.find(e => e.name === "menu.cube.color").children = defaultColourFunction for (const name of Object.keys(customMarkers)) { const index = markerColors.indexOf(markerColors.find(e => e.name === name)) markerColors.splice(index, 1) Canvas.emptyMaterials.splice(index, 1) } Canvas.updateMarkerColorMaterials() localStorage.removeItem("customMarkers") } }) // Function that creates markers function createMarkers() { const createMarkersDialog = new Blockbench.Dialog({ id: "add_custom_marker", title: "Add Marker Color", buttons: ["Add Marker", "Cancel"], lines: [` `], form: { name: { label: "Enter Name", type: "text", value: "" }, color: { label: "Choose Color", type: "color", value: "#6E6E6E" } }, onConfirm(formData) { const hexStr = formData.color.toHexString(); const rawID = formData.name; const FormID = rawID.toLowerCase().replace(/ /g, "_"); // case 1 - ID and name are not blank if ((FormID && formData.name) && !(defaultMarkerArray.includes(FormID))) { Blockbench.showQuickMessage(`Added marker color "${formData.name}"`, 3000) // update marker colors markerColors.push({ id: FormID, name: formData.name, standard: hexStr, pastel: hexStr }) // update local storage customMarkers[formData.name] = hexStr localStorage.setItem("customMarkers", JSON.stringify(customMarkers)) Canvas.updateMarkerColorMaterials() } // case 2 - Duplicate ID if (defaultMarkerArray.includes(FormID)) { Blockbench.showMessageBox({ title: duplicateIDErrorTitle, message: duplicateIDErrorMessage }) } // case 3 - ID and name are blank if (FormID === "" || formData.name === "") { Blockbench.showMessageBox({ title: errorTitle, message: errorMessage }) } }, onCancel: () => createMarkersDialog.hide() }).show() } function editMarkers() { const editMarkersDialog = new Dialog({ id: "edit_marker_colors_dialog", title: "Manage Marker Colors", buttons: [], lines: [`
`], component: { template: `
`, methods: { create: () => createMarkers(), exportMarkers: () => exportMarkerColors(), close: () => editMarkersDialog.close() } }, }).show() const container = $("dialog#edit_marker_colors_dialog #marker-colors") // Iterate through marker colors and display them in dialog for (const color of markerColors) { if (defaultMarkerArray.includes(color.id)) continue; let deleteWarningContainer const name = tl(`cube.color.${color.id}`) const markerDisplay = E("div").addClass("marker-color").append( E("div").addClass("marker-color-display").css("background-color", color.standard), E("div").addClass("marker-color-name").text(color.name), E("div").addClass("marker-color-hex").text(color.standard), E("div").addClass("spacer"), E("i").addClass("marker-color-remove material-icons icon tool").attr("title", "Delete marker").text("delete").on("click", e => { $("dialog#edit_marker_colors_dialog .dialog_wrapper").append( deleteWarningContainer = E("div").attr("id", "delete_warning").append( E("div").attr("id", "delete_warning_darken"), E("div").attr("id", "delete_warning_container").append( E("h2").html(`Are you sure you want to delete marker color
${color.name}?

This action cannot be undone!

`), E("div").attr("id", "delete_warning_buttons").append( E("button").text("Cancel").on("click", e => $("dialog#edit_marker_colors_dialog #delete_warning").remove()), E("button").addClass("danger-button").text("Delete").on("click", e => { Blockbench.showQuickMessage(`Removed "${color.name}" marker`, 3000) const index = markerColors.indexOf(color) markerColors.splice(index, 1) Canvas.emptyMaterials.splice(index, 1) markerDisplay.remove() // Edit local storage delete customMarkers[color.name] localStorage.setItem("customMarkers", JSON.stringify(customMarkers)) deleteWarningContainer.hide() }) ) ) ) ) }) ).appendTo(container) } if (!container.children().length) container.append( E("p").text("No custom marker colors. Please add a new custom marker color before trying to edit them.") ) } function exportMarkerColors() { if (localStorage.getItem("customMarkers")) { Blockbench.export({ resource_id: 'custom_marker_colors', type: 'JSON File', extensions: ['json'], name: 'custom_marker_colors', content: getMarkerColorString(), savetype: 'json' }); } else { Blockbench.showQuickMessage("Nothing to export!") } } function getMarkerColorString() { return localStorage.getItem("customMarkers") } function addAboutButton() { let about = MenuBar.menus.help.structure.find(e => e.id === "about_plugins") if (!about) { about = new Action("about_plugins", { name: "About Plugins...", icon: "info", children: [] }) MenuBar.addAction(about, "help") } aboutAction = new Action(`about_${id}`, { name: `About ${name}...`, icon, click: () => showAbout() }) about.children.push(aboutAction) } function showAbout(banner) { const infoBox = new Dialog({ id: "about", title: name, width: 780, buttons: [], lines: [`
  • ${banner ? `` : ""}

    ${name}

    Allows users to add their own marker colors.

    Worth noting:

    - Currently, the only way to get rid of your custom markers altogether is to uninstall the plugin and restart Blockbench.

    - You can use these marker colors for meshes and keyframes too!

    How to use:

    To make a new custom marker, go to Tools > Marker Colors > Add Custom Color to get started with making your own custom marker color. Once you are done, click Confirm. You will now see your marker color in the default color list. And finally, if you ever choose to view or edit your marker colors, you can use Tools > Marker Colors > Manage Marker Colors.

    Please report any bugs or suggestions you may have to make this plugin more enjoyable for everyone.


    `] }).show() $("dialog#about .dialog_title").html(` ${icon} ${name} `) } })() ================================================ FILE: plugins/datagen_export.js ================================================ (function () { var codec = new Codec("datagen", { name: "Datagen", remember: true, extension: "java", compile(options) { if (options === undefined) options = {}; let clear_elements = []; let textures_used = []; let overflow_cubes = []; function computeCube(s) { if (s.export == false) return; //Create Element let text = ".element()"; let element = {}; element.from = s.from.slice(); element.to = s.to.slice(); if (s.inflate) { for (let i = 0; i < 3; i++) { element.from[i] -= s.inflate; element.to[i] += s.inflate; } } text += `.from(${element.from[0]}F, ${element.from[1]}F, ${element.from[2]}F)`; text += `.to(${element.to[0]}F, ${element.to[1]}F, ${element.to[2]}F)`; if (s.shade === false) { text += `.shade(false)`; } let nonOrigin = !s.rotation.allEqual(0) || !s.origin.allEqual(8); let axis = (nonOrigin ? s.rotationAxis() : s.rotation_axis) || "y"; text += `.rotation().angle(${ nonOrigin ? getAxisNumber(axis) : 0 }F).axis(Axis.${axis.toUpperCase()}).origin(${s.origin[0]}F, ${ s.origin[1] }F, ${s.origin[2]}F)`; if (s.rescale) { text += `.rescale(true)`; } text += `.end()`; let faces = ""; for (let face in s.faces) { if (s.faces.hasOwnProperty(face)) { if (s.faces[face].texture !== null) { faces += `.face(Direction.${face.toUpperCase()})`; if (s.faces[face].enabled !== false) { let temp = {}; temp.uv = s.faces[face].uv.slice(); temp.uv.forEach((n, i) => { temp.uv[i] = (n * 16) / UVEditor.getResolution(i % 2); }); faces += `.uvs(${temp.uv[0]}F, ${temp.uv[1]}F, ${temp.uv[2]}F, ${temp.uv[3]}F)`; } if (s.faces[face].rotation) { let rotString = ""; switch (s.faces[face].rotation) { case 0: rotString = "ZERO"; break; case 90: rotString = "CLOCKWISE_90"; break; case 180: rotString = "UPSIDE_DOWN"; break; case 270: rotString = "COUNTERCLOCKWISE_90"; break; default: rotString = "ZERO"; break; } faces += `.rotation(FaceRotation.${rotString})`; } if (s.faces[face].texture) { let tex = s.faces[face].getTexture(); let texOut = ""; if (tex) { texOut = "#" + tex.id; textures_used.safePush(tex); } else { texOut = "#missing"; } faces += `.texture("${texOut}")`; } if (s.faces[face].cullface) { faces += `.cullface(Direction.${s.faces[ face ].cullface.toUpperCase()})`; } if (s.faces[face].tint >= 0) { faces += `.tintindex(${s.faces[face].tint})`; } faces += `.end()`; } } } text += faces; text += `.end()`; function inVd(n) { return n < -16 || n > 32; } if ( inVd(element.from[0]) || inVd(element.from[1]) || inVd(element.from[2]) || inVd(element.to[0]) || inVd(element.to[1]) || inVd(element.to[2]) ) { overflow_cubes.push(s); } if (Object.keys(s.faces).length) { clear_elements.push(text); } } function iterate(arr) { let i = 0; if (!arr || !arr.length) { return; } for (i = 0; i < arr.length; i++) { if (arr[i].type === "cube") { computeCube(arr[i]); } else if (arr[i].type === "group") { iterate(arr[i].children); } } } iterate(Outliner.root); function checkExport(key, condition) { key = options[key]; if (key === undefined) { return condition; } else { return key; } } let isTexturesOnlyModel = clear_elements.length === 0 && checkExport("parent", Project.parent != ""); let texturesObj = {}; textures.forEach(function (t, i) { let link = t.javaTextureLink(); if (t.particle) { texturesObj.particle = link; } if (!textures_used.includes(t) && !isTexturesOnlyModel) return; if (t.id !== link.replace(/^#/, "")) { texturesObj[t.id] = link; } }); if ( options.prevent_dialog !== true && overflow_cubes.length > 0 && settings.dialog_larger_cubes.value ) { Blockbench.showMessageBox( { translateKey: "model_clipping", icon: "settings_overscan", message: tl("message.model_clipping.message", [ overflow_cubes.length, ]), buttons: ["dialog.scale.select_overflow", "dialog.ok"], confirm: 1, cancel: 1, }, (result) => { if (result == 0) { selected.splice(0, Infinity, ...overflow_cubes); updateSelection(); } } ); } if ( options.prevent_dialog !== true && clear_elements.length && ["item/generated", "item/handheld"].includes(Project.parent) ) { Blockbench.showMessageBox({ translateKey: "invalid_builtin_parent", icon: "info", message: tl("message.invalid_builtin_parent.message", [ Project.parent, ]), }); Project.parent = ""; } let text = `this.models()`; if (checkExport("parent", Project.parent != "")) { text += `.withExistingParent("blockbench_export", "${Project.parent.replace( " ", "" )}")`; } else { text += `.getBuilder("blockbench_export")`; } if (checkExport("ambientocclusion", Project.ambientocclusion === false)) { text += ".ao(false)"; } if (checkExport("textures", Object.keys(texturesObj).length >= 1)) { for (let texture of Object.keys(texturesObj)) { text += `.texture("${texture}", new ResourceLocation("${texturesObj[texture]}"))`; } } if (checkExport("elements", clear_elements.length >= 1)) { for (let element of clear_elements) { text += element; } } if (checkExport("front_gui_light", Project.front_gui_light)) { text += ".guiLight(GuiLight.FRONT)"; } if (checkExport("display", Object.keys(display).length >= 1)) { let new_display = {}; let entries = 0; for (let i in DisplayMode.slots) { let key = DisplayMode.slots[i]; if ( DisplayMode.slots.hasOwnProperty(i) && display[key] && display[key].export ) { new_display[key] = display[key].export(); entries++; } } if (entries) { for (let key of Object.keys(new_display)) { let val = new_display[key]; text += `.transform(Perspective.${key .toUpperCase() .replace(/PERSON/g, "_PERSON") .replace(/HAND/g, "_HAND")})`; if (val.rotation) { text += `.rotation(${val.rotation[0]}F, ${val.rotation[1]}F, ${val.rotation[2]}F)`; } if (val.translation) { text += `.translation(${val.translation[0]}F, ${val.translation[1]}F, ${val.translation[2]}F)`; } if (val.scale) { text += `.scale(${val.scale[0]}F, ${val.scale[1]}F, ${val.scale[2]}F)`; } text += `.end()`; } } } this.dispatchEvent("compile", { model: text, options }); return text; }, }); Plugin.register("datagen_export", { title: "Datagen Exporter", icon: "code", author: "itsmeow", description: "Allows exporting to BlockStateProvider datagen code", version: "1.0.0", variant: "both", onload() { let action = new Action({ id: "export_datagen", name: "Export Datagen Code", icon: "code", description: "Exports a model to BlockStateProvider datagen code.", category: "file", condition: (_) => Format.id === "java_block", click: () => { codec.export(); }, }); MenuBar.addAction(action, "file.export"); }, onunload() { action.delete(); }, }); })(); ================================================ FILE: plugins/discord-rpc.js ================================================ ! function(e) { var t = {}; function n(i) { if (t[i]) return t[i].exports; var s = t[i] = { i: i, l: !1, exports: {} }; return e[i].call(s.exports, s, s.exports, n), s.l = !0, s.exports } n.m = e, n.c = t, n.d = function(e, t, i) { n.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: i }) }, n.r = function(e) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) }, n.t = function(e, t) { if (1 & t && (e = n(e)), 8 & t) return e; if (4 & t && "object" == typeof e && e && e.__esModule) return e; var i = Object.create(null); if (n.r(i), Object.defineProperty(i, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var s in e) n.d(i, s, function(t) { return e[t] }.bind(null, s)); return i }, n.n = function(e) { var t = e && e.__esModule ? function() { return e.default } : function() { return e }; return n.d(t, "a", t), t }, n.o = function(e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, n.p = "/", n(n.s = 4) }([function(e, t, n) { "use strict"; let i; try { const { app: e } = n(6); i = e.setAsDefaultProtocolClient.bind(e) } catch (e) { try { i = n(7) } catch (e) {} } "function" != typeof i && (i = () => !1); e.exports = { pid: function() { return "undefined" != typeof process ? process.pid : require('process')?.pid }, register: i, uuid: () => { let e = ""; for (let t = 0; t < 32; t += 1) { let n; if (8 !== t && 12 !== t && 16 !== t && 20 !== t || (e += "-"), 12 === t) n = 4; else { const e = 16 * Math.random() | 0; n = 16 === t ? 3 & e | 0 : e } e += n.toString(16) } return e } } }, function(e, t) { e.exports = require("events") }, function(e, t, n) { "use strict"; var i = function() { if ("undefined" != typeof self) return self; if ("undefined" != typeof window) return window; if (void 0 !== i) return i; throw new Error("unable to locate global object") }(); e.exports = t = i.fetch, t.default = i.fetch.bind(i), t.Headers = i.Headers, t.Request = i.Request, t.Response = i.Response }, function(e, t, n) { "use strict"; function i(e) { const t = {}; for (const n of e) t[n] = n; return t } t.browser = "undefined" != typeof window, t.RPCCommands = i(["DISPATCH", "AUTHORIZE", "AUTHENTICATE", "GET_GUILD", "GET_GUILDS", "GET_CHANNEL", "GET_CHANNELS", "GET_RELATIONSHIPS", "GET_USER", "SUBSCRIBE", "UNSUBSCRIBE", "SET_USER_VOICE_SETTINGS", "SET_USER_VOICE_SETTINGS_2", "SELECT_VOICE_CHANNEL", "GET_SELECTED_VOICE_CHANNEL", "SELECT_TEXT_CHANNEL", "GET_VOICE_SETTINGS", "SET_VOICE_SETTINGS_2", "SET_VOICE_SETTINGS", "CAPTURE_SHORTCUT", "SET_ACTIVITY", "SEND_ACTIVITY_JOIN_INVITE", "CLOSE_ACTIVITY_JOIN_REQUEST", "ACTIVITY_INVITE_USER", "ACCEPT_ACTIVITY_INVITE", "INVITE_BROWSER", "DEEP_LINK", "CONNECTIONS_CALLBACK", "BRAINTREE_POPUP_BRIDGE_CALLBACK", "GIFT_CODE_BROWSER", "OVERLAY", "BROWSER_HANDOFF", "SET_CERTIFIED_DEVICES", "GET_IMAGE", "CREATE_LOBBY", "UPDATE_LOBBY", "DELETE_LOBBY", "UPDATE_LOBBY_MEMBER", "CONNECT_TO_LOBBY", "DISCONNECT_FROM_LOBBY", "SEND_TO_LOBBY", "SEARCH_LOBBIES", "CONNECT_TO_LOBBY_VOICE", "DISCONNECT_FROM_LOBBY_VOICE", "SET_OVERLAY_LOCKED", "OPEN_OVERLAY_ACTIVITY_INVITE", "OPEN_OVERLAY_GUILD_INVITE", "OPEN_OVERLAY_VOICE_SETTINGS", "VALIDATE_APPLICATION", "GET_ENTITLEMENT_TICKET", "GET_APPLICATION_TICKET", "START_PURCHASE", "GET_SKUS", "GET_ENTITLEMENTS", "GET_NETWORKING_CONFIG", "NETWORKING_SYSTEM_METRICS", "NETWORKING_PEER_METRICS", "NETWORKING_CREATE_TOKEN", "SET_USER_ACHIEVEMENT", "GET_USER_ACHIEVEMENTS"]), t.RPCEvents = i(["CURRENT_USER_UPDATE", "GUILD_STATUS", "GUILD_CREATE", "CHANNEL_CREATE", "RELATIONSHIP_UPDATE", "VOICE_CHANNEL_SELECT", "VOICE_STATE_CREATE", "VOICE_STATE_DELETE", "VOICE_STATE_UPDATE", "VOICE_SETTINGS_UPDATE", "VOICE_SETTINGS_UPDATE_2", "VOICE_CONNECTION_STATUS", "SPEAKING_START", "SPEAKING_STOP", "GAME_JOIN", "GAME_SPECTATE", "ACTIVITY_JOIN", "ACTIVITY_JOIN_REQUEST", "ACTIVITY_SPECTATE", "ACTIVITY_INVITE", "NOTIFICATION_CREATE", "MESSAGE_CREATE", "MESSAGE_UPDATE", "MESSAGE_DELETE", "LOBBY_DELETE", "LOBBY_UPDATE", "LOBBY_MEMBER_CONNECT", "LOBBY_MEMBER_DISCONNECT", "LOBBY_MEMBER_UPDATE", "LOBBY_MESSAGE", "CAPTURE_SHORTCUT_CHANGE", "OVERLAY", "OVERLAY_UPDATE", "ENTITLEMENT_CREATE", "ENTITLEMENT_DELETE", "USER_ACHIEVEMENT_UPDATE", "READY", "ERROR"]), t.RPCErrors = { CAPTURE_SHORTCUT_ALREADY_LISTENING: 5004, GET_GUILD_TIMED_OUT: 5002, INVALID_ACTIVITY_JOIN_REQUEST: 4012, INVALID_ACTIVITY_SECRET: 5005, INVALID_CHANNEL: 4005, INVALID_CLIENTID: 4007, INVALID_COMMAND: 4002, INVALID_ENTITLEMENT: 4015, INVALID_EVENT: 4004, INVALID_GIFT_CODE: 4016, INVALID_GUILD: 4003, INVALID_INVITE: 4011, INVALID_LOBBY: 4013, INVALID_LOBBY_SECRET: 4014, INVALID_ORIGIN: 4008, INVALID_PAYLOAD: 4e3, INVALID_PERMISSIONS: 4006, INVALID_TOKEN: 4009, INVALID_USER: 4010, LOBBY_FULL: 5007, NO_ELIGIBLE_ACTIVITY: 5006, OAUTH2_ERROR: 5e3, PURCHASE_CANCELED: 5008, PURCHASE_ERROR: 5009, RATE_LIMITED: 5011, SELECT_CHANNEL_TIMED_OUT: 5001, SELECT_VOICE_FORCE_REQUIRED: 5003, SERVICE_UNAVAILABLE: 1001, TRANSACTION_ABORTED: 1002, UNAUTHORIZED_FOR_ACHIEVEMENT: 5010, UNKNOWN_ERROR: 1e3 }, t.RPCCloseCodes = { CLOSE_NORMAL: 1e3, CLOSE_UNSUPPORTED: 1003, CLOSE_ABNORMAL: 1006, INVALID_CLIENTID: 4e3, INVALID_ORIGIN: 4001, RATELIMITED: 4002, TOKEN_REVOKED: 4003, INVALID_VERSION: 4004, INVALID_ENCODING: 4005 }, t.LobbyTypes = { PRIVATE: 1, PUBLIC: 2 }, t.RelationshipTypes = { NONE: 0, FRIEND: 1, BLOCKED: 2, PENDING_INCOMING: 3, PENDING_OUTGOING: 4, IMPLICIT: 5 } }, function(e, t, n) { const i = n(5), s = new i.Client({ transport: "ipc" }); var o = new Date; ! function() { let e, t, n = !0, i = ""; Plugin.register("discord-rpc", { title: "Discord RPC", author: "strajabot, Kastle, & simplyme", icon: "announcement", version: "1.1.4", description: "Show a rich presence status in Discord", variant: "desktop", onload() { async function r() { if (!s) return; i !== Project.name && (i = Project.name, o = new Date); var e = Settings.get("obfuscaterpc") ? "Unknown Model" : i + ".bbmodel"; const t = { edit: "Editing", paint: "Painting", animate: "Animating", pose: "Posing" } [Modes.selected.id] || "Making", n = { free: "a Generic Model", java_block: "a Java Block/Item", bedrock: "a Bedrock Model", bedrock_block: "a Bedrock Block Model", bedrock_old: "a Bedrock Legacy Model", modded_entity: "a Modded Entity", optifine_entity: "an OptiFine Entity", optifine_part: "an OptiFine Part", skin: "a Skin", } [Format.id] || "a " + Format.name; s.setActivity({ largeImageKey: "icon", largeImageText: "Blockbench " + Blockbench.version, smallImageKey: "" + Format.id, details: `${t} ${n}`, state: "" + e, startTimestamp: o, instance: !1 }) } e = new Setting("obfuscaterpc", { value: !0, name: "Hide Project Name in Discord", description: "Display \"Unknown Model\" instead of revealing the project name in Discord activity" }); const c = Modes.options; Object.keys(c).forEach(e => { const t = Modes.options[e]; if (t.onSelect && "function" == typeof t.onSelect) { let e = t.onSelect; t.onSelect = () => { e.apply(this, arguments), n && r() } } }), s.on("ready", () => { r(), t = setInterval(() => { r() }, 15e3) }), s.login({ clientId: "642126871177199617" }).catch(console.error) }, onunload() { n = !1, e.delete(), clearInterval(t) } }) }() }, function(e, t, n) { "use strict"; const i = n(0); e.exports = { Client: n(8), register: e => i.register("discord-" + e) } }, function(e, t) { if ("undefined" == typeof electron) { var n = new Error("Cannot find module 'electron'"); throw n.code = "MODULE_NOT_FOUND", n } e.exports = electron }, function(e, t) {}, function(e, t, n) { "use strict"; const i = n(1), { setTimeout: s, clearTimeout: o } = n(9), r = n(2), c = n(10), { RPCCommands: a, RPCEvents: E, RelationshipTypes: _ } = n(3), { pid: u, uuid: T } = n(0); function d(e, t) { return `${e}${JSON.stringify(t)}` } e.exports = class extends i { constructor(e = {}) { super(), this.options = e, this.accessToken = null, this.clientId = null, this.application = null, this.user = null; const t = c[e.transport]; if (!t) throw new TypeError("RPC_INVALID_TRANSPORT", e.transport); this.fetch = (e, t, { data: n, query: i } = {}) => r(`${this.fetch.endpoint}${t}${i?new URLSearchParams(i):""}`, { method: e, body: n, headers: { Authorization: "Bearer " + this.accessToken } }).then(e => e.json()), this.fetch.endpoint = "https://discord.com/api", this.transport = new t(this), this.transport.on("message", this._onRpcMessage.bind(this)), this._expecting = new Map, this._subscriptions = new Map, this._connectPromise = void 0 } connect(e) { return this._connectPromise || (this._connectPromise = new Promise((t, n) => { this.clientId = e; const i = s(() => n(new Error("RPC_CONNECTION_TIMEOUT")), 1e4); i.unref(), this.once("connected", () => { o(i), t(this) }), this.transport.once("close", () => { this._expecting.forEach(e => { e.reject(new Error("connection closed")) }), this.emit("disconnected"), n(new Error("connection closed")) }), this.transport.connect().catch(n) })), this._connectPromise } async login(e = {}) { let { clientId: t, accessToken: n } = e; return await this.connect(t), e.scopes ? (n || (n = await this.authorize(e)), this.authenticate(n)) : (this.emit("ready"), this) } request(e, t, n) { return new Promise((i, s) => { const o = T(); this.transport.send({ cmd: e, args: t, evt: n, nonce: o }), this._expecting.set(o, { resolve: i, reject: s }) }) } _onRpcMessage(e) { if (e.cmd === a.DISPATCH && e.evt === E.READY) e.data.user && (this.user = e.data.user), this.emit("connected"); else if (this._expecting.has(e.nonce)) { const { resolve: t, reject: n } = this._expecting.get(e.nonce); if ("ERROR" === e.evt) { const t = new Error(e.data.message); t.code = e.data.code, t.data = e.data, n(t) } else t(e.data); this._expecting.delete(e.nonce) } else { const t = d(e.evt, e.args); if (!this._subscriptions.has(t)) return; this._subscriptions.get(t)(e.data) } } async authorize({ scopes: e, clientSecret: t, rpcToken: n, redirectUri: i } = {}) { if (t && !0 === n) { n = (await this.fetch("POST", "/oauth2/token/rpc", { data: new URLSearchParams({ client_id: this.clientId, client_secret: t }) })).rpc_token } const { code: s } = await this.request("AUTHORIZE", { scopes: e, client_id: this.clientId, rpc_token: n, redirect_uri: i }); return (await this.fetch("POST", "/oauth2/token", { data: new URLSearchParams({ client_id: this.clientId, client_secret: t, code: s, grant_type: "authorization_code", redirect_uri: i }) })).access_token } authenticate(e) { return this.request("AUTHENTICATE", { access_token: e }).then(({ application: t, user: n }) => (this.accessToken = e, this.application = t, this.user = n, this.emit("ready"), this)) } getGuild(e, t) { return this.request(a.GET_GUILD, { guild_id: e, timeout: t }) } getGuilds(e) { return this.request(a.GET_GUILDS, { timeout: e }) } getChannel(e, t) { return this.request(a.GET_CHANNEL, { channel_id: e, timeout: t }) } async getChannels(e, t) { const { channels: n } = await this.request(a.GET_CHANNELS, { timeout: t, guild_id: e }); return n } setCertifiedDevices(e) { return this.request(a.SET_CERTIFIED_DEVICES, { devices: e.map(e => ({ type: e.type, id: e.uuid, vendor: e.vendor, model: e.model, related: e.related, echo_cancellation: e.echoCancellation, noise_suppression: e.noiseSuppression, automatic_gain_control: e.automaticGainControl, hardware_mute: e.hardwareMute })) }) } setUserVoiceSettings(e, t) { return this.request(a.SET_USER_VOICE_SETTINGS, { user_id: e, pan: t.pan, mute: t.mute, volume: t.volume }) } selectVoiceChannel(e, { timeout: t, force: n = !1 } = {}) { return this.request(a.SELECT_VOICE_CHANNEL, { channel_id: e, timeout: t, force: n }) } selectTextChannel(e, { timeout: t, force: n = !1 } = {}) { return this.request(a.SELECT_TEXT_CHANNEL, { channel_id: e, timeout: t, force: n }) } getVoiceSettings() { return this.request(a.GET_VOICE_SETTINGS).then(e => ({ automaticGainControl: e.automatic_gain_control, echoCancellation: e.echo_cancellation, noiseSuppression: e.noise_suppression, qos: e.qos, silenceWarning: e.silence_warning, deaf: e.deaf, mute: e.mute, input: { availableDevices: e.input.available_devices, device: e.input.device_id, volume: e.input.volume }, output: { availableDevices: e.output.available_devices, device: e.output.device_id, volume: e.output.volume }, mode: { type: e.mode.type, autoThreshold: e.mode.auto_threshold, threshold: e.mode.threshold, shortcut: e.mode.shortcut, delay: e.mode.delay } })) } setVoiceSettings(e) { return this.request(a.SET_VOICE_SETTINGS, { automatic_gain_control: e.automaticGainControl, echo_cancellation: e.echoCancellation, noise_suppression: e.noiseSuppression, qos: e.qos, silence_warning: e.silenceWarning, deaf: e.deaf, mute: e.mute, input: e.input ? { device_id: e.input.device, volume: e.input.volume } : void 0, output: e.output ? { device_id: e.output.device, volume: e.output.volume } : void 0, mode: e.mode ? { mode: e.mode.type, auto_threshold: e.mode.autoThreshold, threshold: e.mode.threshold, shortcut: e.mode.shortcut, delay: e.mode.delay } : void 0 }) } captureShortcut(e) { const t = d(E.CAPTURE_SHORTCUT_CHANGE), n = () => (this._subscriptions.delete(t), this.request(a.CAPTURE_SHORTCUT, { action: "STOP" })); return this._subscriptions.set(t, ({ shortcut: t }) => { e(t, n) }), this.request(a.CAPTURE_SHORTCUT, { action: "START" }).then(() => n) } setActivity(e = {}, t = u()) { let n, i, s, o; if (e.startTimestamp || e.endTimestamp) { if (n = { start: e.startTimestamp, end: e.endTimestamp }, n.start instanceof Date && (n.start = Math.round(n.start.getTime())), n.end instanceof Date && (n.end = Math.round(n.end.getTime())), n.start > 2147483647e3) throw new RangeError("timestamps.start must fit into a unix timestamp"); if (n.end > 2147483647e3) throw new RangeError("timestamps.end must fit into a unix timestamp") } return (e.largeImageKey || e.largeImageText || e.smallImageKey || e.smallImageText) && (i = { large_image: e.largeImageKey, large_text: e.largeImageText, small_image: e.smallImageKey, small_text: e.smallImageText }), (e.partySize || e.partyId || e.partyMax) && (s = { id: e.partyId }, (e.partySize || e.partyMax) && (s.size = [e.partySize, e.partyMax])), (e.matchSecret || e.joinSecret || e.spectateSecret) && (o = { match: e.matchSecret, join: e.joinSecret, spectate: e.spectateSecret }), this.request(a.SET_ACTIVITY, { pid: t, activity: { state: e.state, details: e.details, timestamps: n, assets: i, party: s, secrets: o, instance: !!e.instance } }) } clearActivity(e = u()) { return this.request(a.SET_ACTIVITY, { pid: e }) } sendJoinInvite(e) { return this.request(a.SEND_ACTIVITY_JOIN_INVITE, { user_id: e.id || e }) } sendJoinRequest(e) { return this.request(a.SEND_ACTIVITY_JOIN_REQUEST, { user_id: e.id || e }) } closeJoinRequest(e) { return this.request(a.CLOSE_ACTIVITY_JOIN_REQUEST, { user_id: e.id || e }) } createLobby(e, t, n) { return this.request(a.CREATE_LOBBY, { type: e, capacity: t, metadata: n }) } updateLobby(e, { type: t, owner: n, capacity: i, metadata: s } = {}) { return this.request(a.UPDATE_LOBBY, { id: e.id || e, type: t, owner_id: n && n.id || n, capacity: i, metadata: s }) } deleteLobby(e) { return this.request(a.DELETE_LOBBY, { id: e.id || e }) } connectToLobby(e, t) { return this.request(a.CONNECT_TO_LOBBY, { id: e, secret: t }) } sendToLobby(e, t) { return this.request(a.SEND_TO_LOBBY, { id: e.id || e, data: t }) } disconnectFromLobby(e) { return this.request(a.DISCONNECT_FROM_LOBBY, { id: e.id || e }) } updateLobbyMember(e, t, n) { return this.request(a.UPDATE_LOBBY_MEMBER, { lobby_id: e.id || e, user_id: t.id || t, metadata: n }) } getRelationships() { const e = Object.keys(_); return this.request(a.GET_RELATIONSHIPS).then(t => t.relationships.map(t => ({ ...t, type: e[t.type] }))) } subscribe(e, t, n) { return n || "function" != typeof t || (n = t, t = void 0), this.request(a.SUBSCRIBE, t, e).then(() => { const i = d(e, t); return this._subscriptions.set(i, n), { unsubscribe: () => this.request(a.UNSUBSCRIBE, t, e).then(() => this._subscriptions.delete(i)) } }) } async destroy() { this.transport.close() } } }, function(e, t) { e.exports = require("timers") }, function(e, t, n) { "use strict"; e.exports = { ipc: n(11), websocket: n(13) } }, function(e, t, n) { "use strict"; const i = n(12), s = n(1), o = n(2), { uuid: r } = n(0), c = 0, a = 1, E = 2, _ = 3, u = 4; function T(e = 0) { return new Promise((t, n) => { const s = function(e) { if ("win32" === Blockbench.platform) return "\\\\?\\pipe\\discord-ipc-" + e; const { env: { XDG_RUNTIME_DIR: t, TMPDIR: n, TMP: i, TEMP: s } } = process; return `${(t||n||i||s||"/tmp").replace(/\/$/,"")}/discord-ipc-${e}` }(e), o = () => { e < 10 ? t(T(e + 1)) : n(new Error("Could not connect")) }, r = i.createConnection(s, () => { r.removeListener("error", o), t(r) }); r.once("error", o) }) } function d(e, t) { t = JSON.stringify(t); const n = Buffer.byteLength(t), i = Buffer.alloc(8 + n); return i.writeInt32LE(e, 0), i.writeInt32LE(n, 4), i.write(t, 8, n), i } const I = { full: "", op: void 0 }; function l(e, t) { const n = e.read(); if (!n) return; let i, { op: s } = I; if ("" === I.full) { s = I.op = n.readInt32LE(0); const e = n.readInt32LE(4); i = n.slice(8, e + 8) } else i = n.toString(); try { t({ op: s, data: JSON.parse(I.full + i) }), I.full = "", I.op = void 0 } catch (e) { I.full += i } l(e, t) } e.exports = class extends s { constructor(e) { super(), this.client = e, this.socket = null } async connect() { const e = this.socket = await T(); e.on("close", this.onClose.bind(this)), e.on("error", this.onClose.bind(this)), this.emit("open"), e.write(d(c, { v: 1, client_id: this.client.clientId })), e.pause(), e.on("readable", () => { l(e, ({ op: e, data: t }) => { switch (e) { case _: this.send(t, u); break; case a: if (!t) return; "AUTHORIZE" === t.cmd && "ERROR" !== t.evt && async function e(t = 0) { if (t > 30) throw new Error("Could not find endpoint"); const n = "http://127.0.0.1:" + (6463 + t % 10); try { return 401 !== (await o(n)).status ? e(t + 1) : n } catch (n) { return e(t + 1) } }().then(e => { this.client.request.endpoint = e }), this.emit("message", t); break; case E: this.emit("close", t) } }) }) } onClose(e) { this.emit("close", e) } send(e, t = a) { this.socket.write(d(t, e)) } close() { this.send({}, E), this.socket.end() } ping() { this.send(r(), _) } }, e.exports.encode = d, e.exports.decode = l }, function(e, t) { e.exports = require("net") }, function(e, t, n) { "use strict"; const i = n(1), { browser: s } = n(3), o = s ? window.WebSocket : n(14); e.exports = class extends i { constructor(e) { super(), this.client = e, this.ws = null, this.tries = 0 } async connect(e, t = this.tries) { if (this.connected) return; const n = 6463 + t % 10; this.hostAndPort = "127.0.0.1:" + n; const i = this.ws = new o(`ws://${this.hostAndPort}/?v=1&client_id=${this.client.clientId}`); i.onopen = this.onOpen.bind(this), i.onclose = i.onerror = this.onClose.bind(this), i.onmessage = this.onMessage.bind(this) } send(e) { var t; this.ws && this.ws.send((t = e, JSON.stringify(t))) } close() { this.ws && this.ws.close() } ping() {} onMessage(e) { var t; this.emit("message", (t = e.data, JSON.parse(t))) } onOpen() { this.emit("open") } onClose(e) { try { this.ws.close() } catch (e) {} const t = e.code >= 4e3 && e.code < 5e3; e.code && !t || this.emit("close", e), t || setTimeout(() => this.connect(void 0, 1006 === e.code ? ++this.tries : 0), 250) } } }, function(e, t) {}]); ================================================ FILE: plugins/double_sided_cubes.js ================================================ (()=> { let cube_action; Plugin.register('double_sided_cubes', { title: 'Double Sided Cubes', author: 'SnaveSutit', description: 'Creates inverted duplicates of the selected cube(s) to allow double-sided rendering in java edition.', tags: ["Minecraft: Java Edition"], icon: 'flip_to_back', version: '1.0.1', variant: 'both', onload() { cube_action = new Action({ id:"create_double_sided_cubes", name: 'Create Double Sided Cube', icon: 'flip_to_back', category: 'edit', condition: () => !Project.box_uv, click: function(ev) { if (selected.length === 0) { Blockbench.showMessage('No cubes selected', 'center') return; }; Undo.initEdit({elements:[]}); let cubes = []; Cube.selected.forEach((cube) => { const new_cube = cube.duplicate(); new_cube.name = new_cube.name + " inverted"; if (cube.parent !== "root") { new_cube.addTo(cube.parent); }; for (i=0; i<3; i++){ new_cube.flip(i, 0, false) }; new_cube.from = [...cube.to]; new_cube.to = [...cube.from]; new_cube.inflate = -new_cube.inflate; new_cube.origin = [-new_cube.origin[0],-new_cube.origin[1],-new_cube.origin[2]]; Canvas.adaptObjectPosition(new_cube); Canvas.updateUV(new_cube); cubes.push(new_cube); }); Undo.finishEdit('create_double_sided_cube', {elements:cubes}); } }); MenuBar.addAction(cube_action, 'filter'); }, onunload() { cube_action.delete(); } }); })(); ================================================ FILE: plugins/duplicate_renamer.js ================================================ (function () { // Register plugin Plugin.register('duplicate_renamer', { title: 'Duplicate Bone Renamer', author: 'Gecko', icon: 'fa-font', description: 'This plugin renames duplicate bones so they work in bedrock and GeckoLib', about: 'Simply go to Edit -> Rename Duplicates. All duplicate bones will get renamed to {bone}_{number}', version: '1.0.0', variant: 'both', onload() { button = new Action('rename_duplicates', { name: 'Rename Duplicates', description: 'Rename all duplicate bone names', icon: 'fa-font', click: function () { Undo.initEdit({outliner: true}); const duplicates = [] Group.all.forEach(x => { if (duplicates.some(group => group.name === x.name)) { let duplicate = duplicates.find(group => group.name === x.name); x.name += "_" + duplicate.number; duplicate.number++; } else { duplicates.push({ name: x.name, number: 1 }) } }) Undo.finishEdit('rename duplicates', {outliner: true}); } }); MenuBar.addAction(button, 'edit.-1'); }, onunload() { button.delete(); } }); })(); ================================================ FILE: plugins/easings/about.md ================================================ # Easings Apply easing to Minecraft: Bedrock Edition animations by utilizing `anim_time_update`. > Easing can only be applied to animations with a default or empty anim time update and a defined animation length. > You must reapply or re-run the easing if you change the animation duration or loop mode. > Blockbench might not be able to preview bounce easings properly. ## Supported Easings - Sine - Quad - Cubic - Quart - Quint - Expo - Circ - Bounce ## Unsupported Easings - Back - Elastic These are unsupported because Bedrock animations clamp values within the animation length while these easings can extend beyond that range. ================================================ FILE: plugins/easings/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "author": "Svdex", "date": "2026-02-28", "categories": [ { "title": "Features", "list": ["Initial Release"] } ] } } ================================================ FILE: plugins/easings/easings.js ================================================ "use strict";(()=>{var u={name:"easings",private:!0,version:"1.0.0",module:"src/index.ts",type:"module",author:{name:"Svdex",url:"http://svdex.moe"},scripts:{watch:"esbuild src/index.ts --bundle --watch --minify --outfile=../../plugins/easings/easings.js --format=iife",build:"esbuild src/index.ts --bundle --minify --outfile=../../plugins/easings/easings.js --format=iife"},devDependencies:{esbuild:"^0.25.6",eslint:"^9.37.0",prettier:"^3.6.2","prettier-plugin-multiline-arrays":"^4.0.3","prettier-plugin-organize-imports":"^4.1.0","typescript-eslint":"^8.36.0"}};function $(i){let t=0;for(let n=0;n0);return"v.__e"+n}var b={inSine:"math.ease_in_sine(_t)",outSine:"math.ease_out_sine(_t)",inOutSine:"math.ease_in_out_sine(_t)",inQuad:"math.ease_in_quad(_t)",outQuad:"math.ease_out_quad(_t)",inOutQuad:"math.ease_in_out_quad(_t)",inCubic:"math.ease_in_cubic(_t)",outCubic:"math.ease_out_cubic(_t)",inOutCubic:"math.ease_in_out_cubic(_t)",inQuart:"math.ease_in_quart(_t)",outQuart:"math.ease_out_quart(_t)",inOutQuart:"math.ease_in_out_quart(_t)",inQuint:"math.ease_in_quint(_t)",outQuint:"math.ease_out_quint(_t)",inOutQuint:"math.ease_in_out_quint(_t)",inExpo:"math.ease_in_expo(_t)",outExpo:"math.ease_out_expo(_t)",inOutExpo:"math.ease_in_out_expo(_t)",inCirc:"math.ease_in_circ(_t)",outCirc:"math.ease_out_circ(_t)",inOutCirc:"math.ease_in_out_circ(_t)",inBounce:"math.ease_in_bounce(_t)",outBounce:"math.ease_out_bounce(_t)",inOutBounce:"math.ease_in_out_bounce(_t)"},m=Object.keys(b);function O(i){let{easing:t,duration:n,animationName:o,loop:c=!1}=i,s=A(o),r=A(o+"_orig"),a=b[t].replace(/_t/g,`0,${n},${s}`).replace(/\s+/g,""),e;return c==="loop"?e=`${r}=(${r}??0)+q.delta_time;${r}>${n}?{${r}=${r}-${n};};`:e=`(${r}??0)>${n}?{return${n+.1};}:{${r}=(${r}??0)+q.delta_time;};`,`q.anim_time==0?{${r}=0;};${e}${s}=${r}/${n};return${a};`}var p=`'${u.name}=${u.version}';`;function y(i,t){let n=i.name,o=m.indexOf(t),c=p+`'i=${o}';`+O({animationName:n,duration:i.length,easing:t,loop:i.loop});i.anim_time_update=c}function g(i){let t=i.anim_time_update;if(!t.startsWith(p))return;let o=t.slice(p.length).match(/'i=(\d+)'/)?.[1];if(!o)return;let c=+o,s=m[c];if(s)return{easing:s,index:c}}function h(i){let t=i.anim_time_update;return t.startsWith(p)||!t&&i.length>0}var k={on:"far.fa-dot-circle",off:"far.fa-circle"},E=class{id=u.name;title="Easings";author=u.author.name;version=u.version;description="Apply easing functions to Minecraft: Bedrock Edition animations.";icon="stacked_line_chart";variant="both";tags=["Minecraft: Bedrock Edition","Animation"];website=u.author.url;min_version="4.8.0";has_changelog=!0;actions=[];formats=new Set(["bedrock","bedrock_old"]);constructor(){this.onload=this.onload.bind(this),this.onunload=this.onunload.bind(this)}onload(){this.actionApplyEasing(),this.actionManageEasings()}onunload(){for(let t of this.actions)t.delete();this.actions=[]}isBedrockAnimation(t){return"anim_time_update"in t&&typeof t.anim_time_update=="string"}getSelectedAnimation(){if(Animator.open&&Blockbench.Animation&&Animation.selected!==null){let t=Animation.selected;if(this.isBedrockAnimation(t))return t}}actionApplyEasing(){let t=new Action("easings.apply_easing",{icon:this.icon,name:"Apply Easing",description:"Apply the easing function of the selected animation.",condition:()=>{if(!this.formats.has(Format.id))return!1;let n=this.getSelectedAnimation();return Animator.open&&n&&h(n)},click(n){typeof this.children=="function"&&n?.target instanceof HTMLElement&&new Menu(this.children()).open(n.target)},children:()=>{let n=this.getSelectedAnimation();if(!n)return[];let o=["None",...m],c=g(n)?.easing??"None";return o.map(s=>({name:s,icon:s===c?k.on:k.off,click:()=>{Undo.initEdit({animations:[n]}),s==="None"?n.anim_time_update="":y(n,s),Undo.finishEdit("Apply Easing")}}))}});this.actions.push(t)}actionManageEasings(){let t=new Action("easings.manage_easings",{icon:this.icon,name:"Manage Easings",description:"Manage easing functions for all animations in the current file.",condition:()=>this.formats.has(Format.id)&&Animator.open&&this.allAnimations.some(h),click:()=>this.easingsDialog.show()});this.actions.push(t),MenuBar.addAction(t,"animation")}get allAnimations(){return Animator.open?AnimationItem.all.filter(this.isBedrockAnimation):[]}get easingsDialog(){let t=this.allAnimations,n=t.reduce((a,e)=>(a[e.name.replaceAll(".","_tkn_")]=e,a),{}),o=["None",...m],c=Object.fromEntries(o.map((a,e)=>[e,a])),s=t.reduce((a,e)=>{if(!h(e))return a;let l=g(e),_=e.name.replaceAll(".","_tkn_"),d=1+(l?.index??-1);return a[_]={type:"select",label:e.name,options:c,value:d},a},{}),r=new Dialog({id:this.id,title:this.title,form:{...s,buttonBar:{type:"buttons",buttons:["Reset All"],click(){r.setFormValues(Object.keys(s).reduce((a,e)=>(a[e]=0,a),{}),!0)}}},onConfirm:a=>{Undo.initEdit({animations:t});for(let e of Object.keys(a)){let l=n[e];if(!l)continue;let _=+a[e],d=!1;_?(y(l,o[_]),d=!0):g(l)&&(l.anim_time_update="",d=!0),d&&(l.saved=!1)}Undo.finishEdit("Apply Easing")}});return r}},B=new E;BBPlugin.register(B.id,B);})(); ================================================ FILE: plugins/emf_animation_addon/about.md ================================================ # EMF Animation Addon This is an addon plugin for Ewan Howell's `CEM Template Loader` plugin https://ewanhowell.com/plugins/cem-template-loader This plugin adds support for the extra animation functions and variables used in the Entity Model Features (**EMF**) Mod - https://www.curseforge.com/minecraft/mc-mods/entity-model-features - https://modrinth.com/mod/entity-model-features These extra features will not work when using these models in OptiFine. >*Tip: you can have both EMF & OptiFine models in the same resource-pack by putting the EMF only models in the EMF override directory `assets/minecraft/emf/cem/`. If you don't use EMF only features then `assets/minecraft/optifine/cem` is recommended.* A full list of all EMF animation functions and variables can be found [**here**](https://github.com/Traben-0/Entity_Model_Features/blob/master/.github/emf_animation.txt) you can also see them in the EMF mod's in-game config screen under models -> Animation math details. For **all** EMF features, including how to export modded entity models for use in blockbench, see the [**EMF Feature Guide**](https://github.com/Traben-0/Entity_Model_Features/blob/master/FEATURES.md) ### Plugin is current for EMF v2.2 ================================================ FILE: plugins/emf_animation_addon/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2024-06-05", "author": "Traben & Ewan Howell", "categories": [ { "title": "New Plugin", "list": [ "Initial release" ] } ] }, "1.0.1": { "title": "1.0.1", "date": "2024-06-23", "author": "Traben", "categories": [ { "title": "Doc update", "list": [ "minor icon change in doc where the cem template loader icon was used" ] } ] }, "1.0.2": { "title": "1.0.2", "date": "2024-07-01", "author": "Traben", "categories": [ { "title": "fixed setting", "list": [ "Fixed the EMF enable/disable setting not appearing in the plugins screen" ] } ] }, "1.0.3": { "title": "1.0.3", "date": "2024-08-20", "author": "Traben", "categories": [ { "title": "updated for EMF 2.2", "list": [ "Added functions, variables, and changes, from Entity Model Features update 2.2" ] } ] }, "1.0.4": { "title": "1.0.4", "date": "2024-08-25", "author": "Traben", "categories": [ { "title": "fixed keyframe method bug", "list": [ "Fixed a bug in the keyframe methods" ] } ] } } ================================================ FILE: plugins/emf_animation_addon/emf_animation_addon.js ================================================ (() => { let constants, ranges, booleans, enabledBooleans, functionHints, animDocs Plugin.register("emf_animation_addon", { title: "EMF Animation Addon", icon: "icon.png", author: "Traben & Ewan Howell", description: "Adds extra animation support to CEM Template Loader so that it is compatible with the Entity Model Features mod.", tags: ["Minecraft: Java Edition", "Entity Models", "Animation"], version: "1.0.4", min_version: "4.9.0", variant: "both", dependencies: ["cem_template_loader"], onload() { new Setting("emf_features", { value: true, category: "edit", plugin: "emf_animation_addon", name: "Enable EMF only animation features", description: "Enable animation features that are only compatible with the Entity Model Features mod. WARNING: These animations will cause the model to fail to load when using OptiFine.", onChange() { unload() load() } }) constants = { e: 2.718281828459045, nan: NaN, //add: (...args) => args.reduce((a, e) => a + e, 0) catch: (x, c, id) => { if (x === undefined || typeof x !== 'number') { console.log(`catch print(${id}) = x was undefined or not a number type`) return c } if (!Number.isNaN(x)) return x console.log(`catch print(${id}) = x was NaN`) return c }, wrapdeg: wrapDegrees, wraprad: (r) => Math.degToRad(wrapDegrees(Math.radToDeg(r))), degdiff: angleBetween, raddiff: (a, b) => Math.degToRad(angleBetween(Math.radToDeg(a), Math.radToDeg(b))), randomb: (seed) => { if (!seed) return Math.random() >= 0.5 seed = optifineAnimationVariables.constants.frac(seed * 123.34) seed += seed * (seed + 45.32) return optifineAnimationVariables.constants.frac(seed * seed) >= 0.5 }, // ifb: (...args) => { // if (args.length < 3 || args.length % 2 !== 1 || typeof args[0] !== "boolean") throw Error // for (let i = 0; i < args.length; i += 2) { // if (i === args.length - 1) { // if (typeof args[i] === "number") throw Error("Ifb statements cannot return a number") // return args[i] // } else if (args[i]) { // if (typeof args[i + 1] === "number") throw Error("Ifb statements cannot return a number") // return args[i + 1] // } // } // }, easeinquad: easeInQuad, easeoutquad: easeOutQuad, easeinoutquad: easeInOutQuad, easeincubic: easeInCubic, easeoutcubic: easeOutCubic, easeinoutcubic: easeInOutCubic, easeinquart: easeInQuart, easeoutquart: easeOutQuart, easeinoutquart: easeInOutQuart, easeinquint: easeInQuint, easeoutquint: easeOutQuint, easeinoutquint: easeInOutQuint, easeinsine: easeInSine, easeoutsine: easeOutSine, easeinoutsine: easeInOutSine, easeinexpo: easeInExpo, easeoutexpo: easeOutExpo, easeinoutexpo: easeInOutExpo, easeincirc: easeInCirc, easeoutcirc: easeOutCirc, easeinoutcirc: easeInOutCirc, easeinelastic: easeInElastic, easeoutelastic: easeOutElastic, easeinoutelastic: easeInOutElastic, easeinbounce: easeInBounce, easeoutbounce: easeOutBounce, easeinoutbounce: easeInOutBounce, easeinback: easeInBack, easeoutback: easeOutBack, easeinoutback: easeInOutBack, quadbezier: quadraticBezier, cubicbezier: cubicBezier, hermite: hermiteInterpolation, catmullrom: catmullrom, keyframe: (k, ...args) => { //skip if outside of scope let frameEnd = args.length - 1; let deltaFloor = Math.floor(k); if(deltaFloor >= frameEnd){ return args[frameEnd]; }else if(deltaFloor <= 0){ return args[0]; } return keyframeLoop(k, ...args); }, keyframeloop: keyframeLoop, nbt: (key, test) => { //todo no real functionality here return false } } ranges = { // zeroToHundred: [0, 50, 100], // start30Jump15: [0, 30, 90, 15] move_forward: [-1, 0, 1, 0.01], move_strafing: [-1, 0, 1, 0.01], height_above_ground: [0, 0, 128, 0.25], fluid_depth: [0, 0, 64], fluid_depth_up: [0, 0, 64], fluid_depth_down: [0, 0, 64], distance: [0, 0, 128, 0.25], } booleans = ["is_climbing", "is_crawling", "is_swimming", "is_gliding", "is_blocking","is_first_person_hand","is_swinging_right_arm", "is_swinging_left_arm", "is_using_item", "is_holding_item_right", "is_holding_item_left", "is_paused", "is_hovered"] enabledBooleans = ["is_right_handed"] functionHints = { "catch()": "catch(x, c, id)", "wrapdeg()": "wrapdeg(x)", "wraprad()": "wraprad(x)", "degdiff()": "degdiff(x, y)", "raddiff()": "raddiff(x, y)", "easeinquad()": "easeinquad(k, x, y)", "easeoutquad()": "easeoutquad(k, x, y)", "easeinoutquad()": "easeinoutquad(k, x, y)", "easeincubic()": "easeincubic(k, x, y)", "easeoutcubic()": "easeoutcubic(k, x, y)", "easeinoutcubic()": "easeinoutcubic(k, x, y)", "easeinquart()": "easeinquart(k, x, y)", "easeoutquart()": "easeoutquart(k, x, y)", "easeinoutquart()": "easeinoutquart(k, x, y)", "easeinquint()": "easeinquint(k, x, y)", "easeoutquint()": "easeoutquint(k, x, y)", "easeinoutquint()": "easeinoutquint(k, x, y)", "easeinsine()": "easeinsine(k, x, y)", "easeoutsine()": "easeoutsine(k, x, y)", "easeinoutsine()": "easeinoutsine(k, x, y)", "easeinexpo()": "easeinexpo(k, x, y)", "easeoutexpo()": "easeoutexpo(k, x, y)", "easeinoutexpo()": "easeinoutexpo(k, x, y)", "easeincirc()": "easeincirc(k, x, y)", "easeoutcirc()": "easeoutcirc(k, x, y)", "easeinoutcirc()": "easeinoutcirc(k, x, y)", "easeinelastic()": "easeinelastic(k, x, y)", "easeoutelastic()": "easeoutelastic(k, x, y)", "easeinoutelastic()": "easeinoutelastic(k, x, y)", "easeinbounce()": "easeinbounce(k, x, y)", "easeoutbounce()": "easeoutbounce(k, x, y)", "easeinoutbounce()": "easeinoutbounce(k, x, y)", "easeinback()": "easeinback(k, x, y)", "easeoutback()": "easeoutback(k, x, y)", "easeinoutback()": "easeinoutback(k, x, y)", "quadbezier()": "quadbezier(k, x, y, z)", "cubicbezier()": "cubicbezier(k, x, y, z, w)", "hermite()": "hermite(k, x, y, z, w)", "catmullrom()": "catmullrom(k, x, y, z, w)", "keyframe()": "keyframe(k, a, b, c,...)", "keyframeloop()": "keyframeloop(k, a, b, c,...)", "randomb()": "randomb(seed)", "nbt()": "nbt(leave empty) - breaks in editor!" } animDocs = { name: "EMF addon", icon: "difference", elements: [ { "type": "heading", "text": "Entity Model Features (EMF) Addon Docs" }, { "type": "text", "text": "The EMF Addon adds extra functions and variables to the CEM Template Loader that are only compatible with the Entity Model Features mod. These features will cause the model to fail to load when using OptiFine. You may choose to put such breaking models into the emf/cem/ folder rather than optifine/cem/ if you wish to use both in the same pack." }, // todo not supported in template loader // { // "type": "heading", // "text": "Global variables" // }, // { // "type": "text", // "text": "Global variables are a way of storing data between entities. You can then use these variables inside any other animations." // }, // { // "type": "table", // "tableType": "list", // "rows": [ // [ // "global_var.<name>", // "Store a value in a named variable" // ], // [ // "global_varb.<name>", // "Store a boolean in a named variable" // ] // ] // }, { "type": "heading", "text": "Constants" }, { "type": "table", "tableType": "list", "rows": [ [ "e", "Euler's number 2.718281....." ], [ "nan", "throws an error, used for debugging, bypasses the initial validation checks" ] ] }, { "type": "heading", "text": "Entity parameters (float)" }, { "type": "table", "tableType": "list", "rows": [ [ "move_forward", "The entity's current movement in the direction they are facing. Ranges from -1 to 1 denoting the Y axis intercept of a unit circle of the players current movement vector." ], [ "move_strafing", "The entity's current movement in the direction 90 degrees to the right of their facing direction. Ranges from -1 to 1 denoting the X axis intercept of a unit circle of the players current movement vector." ], // [ // "distance", // "silently deprecate" // ], [ "height_above_ground", "The distance the entity is above the ground, ground being the highest point below the entity with a collidable block" ], [ "fluid_depth", "The depth of the fluid above and below a submerged entity, 0 if not submerged" ], [ "fluid_depth_down", "The depth of the fluid below a submerged entity, 0 if not submerged" ], [ "fluid_depth_up", "The depth of the fluid above a submerged entity, 0 if not submerged" ] ] }, { "type": "heading", "text": "Entity parameters (boolean)" }, { "type": "table", "tableType": "list", "rows": [ [ "is_climbing", "If the entity is climbing a climbable block or is a spider on a wall." ], [ "is_blocking", "If the entity is blocking with a shield." ], [ "is_crawling", "If the entity is crawling." ], [ "is_jumping", "If the entity is jumping." ], [ "is_swimming", "If the entity is in its swimming pose." ], [ "is_right_handed", "If the biped entity is right handed." ], [ "is_swinging_right_arm", "If the biped entity is swinging it's right arm." ], [ "is_swinging_left_arm", "If the biped entity is swinging it's left arm." ], [ "is_first_person_hand", "If the model part being rendered is the first person player hand." ], [ "is_using_item", "If the entity is using an item." ], [ "is_holding_item_right", "If the entity is holding an item in its right hand." ], [ "is_holding_item_left", "If the entity is holding an item in its left hand." ], [ "is_paused", "If the game is paused." ], [ "is_hovered", "If the entity is being hovered over." ] ] }, { "type": "heading", "text": "Functions" }, { "type": "table", "tableType": "list", "rows": [ [ "catch(x, c, id)", "Returns x if x is not NaN or has an Error, otherwise returns c. id is optional, if it is added the catch function will print the reason c was used to the game log with this id." ], [ "wrapdeg(x)", "Wraps the degree value x to the range -180 to 180 that it matches." ], [ "wraprad(x)", "Wraps the radian value x to the range -pi to pi that it matches." ], [ "degdiff(x, y)", "Returns the shortest angular degree difference between two degree values x and y." ], [ "raddiff(x, y)", "Returns the shortest angular radian difference between two radian values x and y." ], [ "keyframe(k, a, b, c,...)", "Smoothly interpolates between values based on the current frame 'k' and the keyframes. 'a' is 'k=0', 'b' is 'k=1', 'c' is 'k=2' etc." ], [ "keyframeloop(k, a, b, c,...)", "Smoothly interpolates between values based on the current frame 'k' and the keyframes. 'a' is 'k=0', 'b' is 'k=1', 'c' is 'k=2' etc. The keyframes will loop back around from the start and end values." ] ] }, { "type": "heading", "text": "Boolean functions" }, { "type": "table", "tableType": "list", "rows": [ [ "randomb(seed)", "Random boolean true|false. Providing a seed will always return the same result. The seed is optional." ], [ "nbt(key, test)", "Works exactly like the nbt random property such that `models.1.SaddleItem=exits:false` will be `nbt(SaddleItem,exists:false)`. THIS IS BROKEN IN THE CEM TEMPLATE LOADER EDITOR. Always leave the function empty here!" ] ] }, { "type": "heading", "text": "Interpolation functions" }, { "type": "text", "text": "EMF adds multiple variations of the lerp(k, x, y) interpolation function, most of these can be seen in more detail, and with interactive graphs, on this website" }, { "type": "table", "tableType": "list", "rows": getEaseFuncs() }, ] } setTimeout(load, 0) }, onunload : unload }) function getEaseFuncs() { let easeFuncs = [] for (const val of Object.values(functionHints)) { if (val.startsWith("ease")) { easeFuncs.push([ val, "" ]) } } easeFuncs.push([ "quadbezier(k, x, y, z)", "" ]) easeFuncs.push([ "cubicbezier(k, x, y, z, w)", "" ]) easeFuncs.push([ "hermite(k, x, y, z, w)", "" ]) easeFuncs.push([ "catmullrom(k, x, y, z, w)", "" ]) return easeFuncs } function load() { if (settings.emf_features.value) { //add autocompletes - auto generated for (const key of Object.keys(ranges)) optifineAnimationVariables.autocomplete.push(key) for (const key of Object.keys(constants)) optifineAnimationVariables.autocomplete.push(typeof constants[key] === "function" ? `${key}()` : key) //add autocompletes - manual Object.assign(optifineAnimationVariables.autocompleteLabels, functionHints) //add variables and functions Object.assign(optifineAnimationVariables.constants, constants) Object.assign(optifineAnimationVariables.ranges, ranges) //add booleans for (const boolean of booleans) { optifineAnimationVariables.booleans.add(boolean) //add autocomplete optifineAnimationVariables.autocomplete.push(boolean) } for (const boolean of enabledBooleans) { optifineAnimationVariables.booleans.add(boolean) optifineAnimationVariables.enabledBooleans.add(boolean) //add autocomplete optifineAnimationVariables.autocomplete.push(boolean) } //add animation documentation optifineAnimationDocumentation.custom.push(animDocs) optifineAnimationDocumentation.shown = false } setTimeout(() => { if (Format.id === "optifine_entity") { Panels.cem_animation.inside_vue.change() } }, 0) } function unload() { //remove auto completes for (const key of Object.keys(ranges)) globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(key), 1) for (const key of Object.keys(constants)) { globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(typeof constants[key] === "function" ? `${key}()` : key), 1) } for (const key of Object.keys(functionHints)) delete globalThis.optifineAnimationVariables?.autocompleteLabels[key] //remove functions and variables for (const key of Object.keys(constants)) delete globalThis.optifineAnimationVariables?.constants[key] for (const key of Object.keys(ranges)) delete globalThis.optifineAnimationVariables?.ranges[key] //remove booleans for (const boolean of booleans) { globalThis.optifineAnimationVariables?.booleans.delete(boolean) //remove auto complete globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(boolean), 1) } for (const boolean of enabledBooleans) { globalThis.optifineAnimationVariables?.booleans.delete(boolean) globalThis.optifineAnimationVariables?.enabledBooleans.delete(boolean) //remove auto complete globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(boolean), 1) } //remove docs //todo needed? globalThis.optifineAnimationDocumentation?.custom.splice(globalThis.optifineAnimationDocumentation?.custom.indexOf(animDocs), 1) globalThis.optifineAnimationDocumentation.shown = false } function keyframeLoop(k, ...args) { if (args.length < 2) throw Error if (typeof k !== "number") throw Error let frameCount = args.length; let deltaFloor = Math.floor(k); let baseFrame = args[(deltaFloor % frameCount + frameCount) % frameCount]; let beforeFrame = args[((deltaFloor - 1) % frameCount + frameCount) % frameCount]; let nextFrame = args[((deltaFloor + 1) % frameCount + frameCount) % frameCount]; let afterFrame = args[((deltaFloor + 2) % frameCount + frameCount) % frameCount]; let individualFrameDelta = optifineAnimationVariables.constants.frac(k); return catmullrom(individualFrameDelta, beforeFrame, baseFrame, nextFrame, afterFrame); } function catmullrom(f, g, h, i, j) { return 0.5 * (2.0 * h + (i - g) * f + (2.0 * g - 5.0 * h + 4.0 * i - j) * f * f + (3.0 * h - g - 3.0 * i + j) * f * f * f); } function wrapDegrees(degrees) { let d = degrees % 360.0; if (d >= 180.0) { d -= 360.0; } if (d < -180.0) { d += 360.0; } return d; } function angleBetween(first, second) { let v = wrapDegrees(second - first); return v < 0 ? -v : v } function easeInQuad(t, start, end) { let delta = end - start; return start + delta * t * t; } function easeOutQuad(t, start, end) { let delta = end - start; return start + delta * -t * (t - 2); } function easeInOutQuad(t, start, end) { let delta = end - start; if (t < 0.5) { return start + delta * (2 * t * t); } else { return start + delta * (-2 * t * (t - 2) - 1); } } function easeInCubic(t, start, end) { let delta = end - start; return start + delta * t * t * t; } function easeOutCubic(t, start, end) { let delta = end - start; return start + delta * ((t = t - 1) * t * t + 1); } function easeInOutCubic(t, start, end) { let delta = end - start; if (t < 0.5) { return start + delta * 4 * t * t * t; } else { return start + delta * ((t = t - 1) * (2 * t * t + 2) + 1); } } function easeInQuart(t, start, end) { let delta = end - start; return start + delta * t * t * t * t; } function easeOutQuart(t, start, end) { let delta = end - start; return start + delta * ((t = t - 1) * t * t * t + 1); } function easeInOutQuart(t, start, end) { let delta = end - start; if (t < 0.5) { return start + delta * 8 * t * t * t * t; } else { return start + delta * ((t = t - 1) * (8 * t * t * t + 1) + 1); } } function easeInQuint(t, start, end) { let delta = end - start; return start + delta * t * t * t * t * t; } function easeOutQuint(t, start, end) { let delta = end - start; return start + delta * ((t = t - 1) * t * t * t * t + 1); } function easeInOutQuint(t, start, end) { let delta = end - start; if (t < 0.5) { return start + delta * 16 * t * t * t * t * t; } else { return start + delta * ((t = t - 1) * (16 * t * t * t * t + 1) + 1); } } function easeInSine(t, start, end) { let delta = end - start; return start + delta * (1 - Math.cos(t * Math.PI / 2)); } function easeOutSine(t, start, end) { let delta = end - start; return start + delta * Math.sin(t * Math.PI / 2); } function easeInOutSine(t, start, end) { let delta = end - start; return start + delta * (-0.5 * (Math.cos(Math.PI * t) - 1)); } function easeInExpo(t, start, end) { let delta = end - start; return start + delta * Math.pow(2, 10 * (t - 1)); } function easeOutExpo(t, start, end) { let delta = end - start; return start + delta * (-Math.pow(2, -10 * t) + 1); } function easeInOutExpo(t, start, end) { let delta = end - start; if (t < 1) { return start + delta * (0.5 * Math.pow(2, 10 * (t - 1))); } else { return start + delta * (0.5 * (-Math.pow(2, -10 * --t) + 2)); } } function easeInCirc(t, start, end) { let delta = end - start; return start + delta * -(Math.sqrt(1 - t * t) - 1); } function easeOutCirc(t, start, end) { let delta = end - start; let tMinus1 = t - 1; return start + delta * Math.sqrt(1 - tMinus1 * tMinus1); } function easeInOutCirc(t, start, end) { let delta = end - start; let tTimes2 = t * 2; if (tTimes2 < 1) { return start + delta * (-0.5 * (Math.sqrt(1 - tTimes2 * tTimes2) - 1)); } else { let tTimes2Minus2 = tTimes2 - 2; return start + delta * (0.5 * (Math.sqrt(1 - tTimes2Minus2 * tTimes2Minus2) + 1)); } } function easeInElastic(t, start, end) { let delta = end - start; return start + delta * (-Math.pow(2, 10 * (t -= 1)) * Math.sin((t - 0.3 / 4) * (2 * Math.PI) / 0.3)); } function easeOutElastic(t, start, end) { let delta = end - start; return start + delta * (Math.pow(2, -10 * t) * Math.sin((t - 0.3 / 4) * (2 * Math.PI) / 0.3) + 1); } function easeInOutElastic(t, start, end) { let delta = end - start; if (t < 0.5) { return start + delta * (-0.5 * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - 0.225 / 4) * (2 * Math.PI) / 0.45)); } else { return start + delta * (0.5 * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - 0.225 / 4) * (2 * Math.PI) / 0.45) + 1); } } function easeInBounce(t, start, end) { let delta = end - start; return start + delta * (1 - easeOutBounce(1 - t, 0, 1)); } function easeOutBounce(t, start, end) { let delta = end - start; if (t < (1 / 2.75)) { return start + delta * (7.5625 * t * t); } else if (t < (2 / 2.75)) { return start + delta * (7.5625 * (t -= (1.5 / 2.75)) * t + .75); } else if (t < (2.5 / 2.75)) { return start + delta * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375); } else { return start + delta * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375); } } function easeInOutBounce(t, start, end) { let delta = end - start; if (t < 0.5) { return start + delta * (0.5 * easeInBounce(t * 2, 0, 1)); } else { return start + delta * (0.5 * easeOutBounce(t * 2 - 1, 0, 1) + 0.5); } } function easeInBack(t, start, end) { let delta = end - start; return start + delta * (t * t * (2.70158 * t - 1.70158)); } function easeOutBack(t, start, end) { let delta = end - start; return start + delta * ((--t) * t * (2.70158 * t + 1.70158) + 1); } function easeInOutBack(t, start, end) { let delta = end - start; if (t < 0.5) { return start + delta * (t * t * (7 * t - 2.5) * 2); } else { return start + delta * ((--t) * t * (7 * t + 2.5) + 2); } } function quadraticBezier(t, p0, p1, p2) { let oneMinusT = 1 - t; return oneMinusT * oneMinusT * p0 + 2 * oneMinusT * t * p1 + t * t * p2; } function cubicBezier(t, p0, p1, p2, p3) { let oneMinusT = 1 - t; let oneMinusTSquared = oneMinusT * oneMinusT; let tSquared = t * t; return oneMinusTSquared * oneMinusT * p0 + 3 * oneMinusTSquared * t * p1 + 3 * oneMinusT * tSquared * p2 + tSquared * t * p3; } function hermiteInterpolation(t, p0, p1, m0, m1) { let tSquared = t * t; let tCubed = tSquared * t; let h00 = 2 * tCubed - 3 * tSquared + 1; let h10 = tCubed - 2 * tSquared + t; let h01 = -2 * tCubed + 3 * tSquared; let h11 = tCubed - tSquared; return h00 * p0 + h10 * m0 + h01 * p1 + h11 * m1; } })() ================================================ FILE: plugins/emf_animation_addon/members.yml ================================================ maintainers: - Traben-0 - ewanhowell5195 developers: - Traben-0 - ewanhowell5195 ================================================ FILE: plugins/endimations_exporter.js ================================================ (function () { let exportEndimations; Plugin.register('endimations_exporter', { title: 'Endimator Animations Exporter', author: 'SmellyModder', icon: 'icon-format_java', description: 'Exports Blockbench animations as the JSON format for Endimator animations from the Blueprint Mod Library. https://github.com/team-abnormals/blueprint', about: 'Go to Animation -> Export Endimations...', tags: ["Minecraft: Java Edition"], version: '1.0.0', min_version: '4.0.0', variant: 'both', onload() { exportEndimations = new Action('export_endimations', { name: 'Export Endimations...', description: 'Export a selection of animations as endimations', icon: 'movie', click: function () { const animations = Animation.all.slice() let keys = []; const form = {}; if (Format.animation_files) { animations.sort((a1, a2) => a1.path.hashCode() - a2.path.hashCode()) } animations.forEach(animation => { const key = animation.name; keys.push(key) form[key.hashCode()] = {label: key, type: 'checkbox', value: true}; }) const singleFile = "single_file".hashCode(); form[singleFile] = {label: "Single File", type: 'checkbox', value: false} const dialog = new Dialog({ id: 'animation_export', title: 'dialog.animation_export.title', form, onConfirm(form_result) { dialog.hide(); keys = keys.filter(key => form_result[key.hashCode()]) if (form_result[singleFile]) { const endimations = {}; Animator.animations.forEach(function (animation) { if (!keys || !keys.length || keys.includes(animation.name)) { endimations[animation.name] = compileEndimation(animation); } }) Blockbench.export({ resource_id: 'animation', type: 'JSON Animation', extensions: ['json'], name: (Project.geometry_name || 'endimations'), content: autoStringify(endimations), }) } else { Animator.animations.forEach(function (animation) { if (!keys || !keys.length || keys.includes(animation.name)) { Blockbench.export({ resource_id: 'animation', type: 'JSON Animation', extensions: ['json'], name: animation.name, content: autoStringify(compileEndimation(animation)), }) } }) } } }) dialog.show(); } }); MenuBar.addAction(exportEndimations, 'animation'); }, onunload() { exportEndimations.delete(); } }); function compileEndimation(animation) { const endimation = {}; const length = animation.length; if (length) { endimation.length = length; } const blendWeight = animation.blend_weight; if (blendWeight) { endimation.blend_weight = parseFloat(blendWeight); } const animators = animation.animators; const parts = {}; for (const uuid in animators) { const animator = animators[uuid]; if (animator instanceof BoneAnimator) { const keyframes = animator.keyframes; if (keyframes.length) { const group = animator.getGroup(); const part = parts[group ? group.name : animator.name] = {}; const channels = {}; keyframes.forEach(function (kf) { const channel = kf.channel; if (!channels[channel]) { channels[channel] = {}; } if (kf.transform) { let endimatorKeyframe; const timecodeString = kf.getTimecodeString(); if (kf.data_points.length === 1) { endimatorKeyframe = { time: parseFloat(timecodeString), transform: kf.getArray(), interpolation: { type: kf.interpolation } } } else { endimatorKeyframe = { time: parseFloat(timecodeString), transform: { pre: kf.getArray(0), post: kf.getArray(1), }, interpolation: { type: kf.interpolation } } } channels[channel][timecodeString] = endimatorKeyframe; } }) for (const channel in Animator.possible_channels) { const timecodes = channels[channel]; if (timecodes) { Object.keys(timecodes).sort((a, b) => parseFloat(a) - parseFloat(b)).forEach((timecode) => { if (!part[channel]) { part[channel] = []; } part[channel].push(timecodes[timecode]); }) } } } } } if (Object.keys(parts).length > 0) { endimation.parts = parts; } return endimation; } })(); ================================================ FILE: plugins/expand_bone_timeline/about.md ================================================ # Expand Bone Timeline A Blockbench plugin that speeds up animation workflow by adding or removing a bone and all its descendant bone animators from the Timeline with a single click. ## What it does In Animate mode, right-click a bone group in the Outliner to reveal two new context menu options under the **Settings** section (alongside *Add All to Timeline*): - **Show Child Animators** — Adds the selected bone and all of its descendant bones (children, grandchildren, etc.) that have keyframe data in the current animation to the Timeline. - **Hide Child Animators** — Removes the selected bone and all of its descendants from the Timeline. This makes it much easier to work with complex rigs where related bones are grouped under a parent, such as an arm chain, finger hierarchy, or a multi-part tail. Both actions also work as keybindings or toolbar buttons. To bind a shortcut, go to **File → Preferences → Keybindings** and search for *Show Child Animators* or *Hide Child Animators*. ## Installation 1. Open Blockbench 2. Go to **File → Plugins** 3. Switch to the **Available** tab 4. Search for **Expand Bone Timeline** 5. Click **Install** ## Usage 1. Open a model with animations 2. Switch to **Animate** mode 3. Select an animation 4. Right-click a bone group in the **Outliner** 5. Click **Show Child Animators** or **Hide Child Animators** ## Notes - Only descendant bones that have actual keyframe data in the currently selected animation will be shown. Empty bones are skipped. - The menu options only appear when in Animate mode with an animation selected. - Works with both Blockbench Desktop and Web versions. ## License MIT ================================================ FILE: plugins/expand_bone_timeline/expand_bone_timeline.js ================================================ (function () { let expandAction, collapseAction; BBPlugin.register('expand_bone_timeline', { title: 'Expand Bone Timeline', author: 'zzz1999', description: 'Show or hide a bone and all its child bone animators in the timeline from the outliner context menu.', icon: 'account_tree', tags: ['Animation', 'Timeline'], version: '2.2.0', min_version: '4.8.0', variant: 'both', creation_date: '2026-03-21', has_changelog: false, repository: 'https://github.com/zzz1999/expand_bone_timeline', bug_tracker: 'https://github.com/zzz1999/expand_bone_timeline/issues', onload() { expandAction = new Action('expand_bone_animators', { name: 'Show Child Animators', description: 'Show this bone and all child bone animators in the timeline', icon: 'unfold_more', category: 'animation', condition: {modes: ['animate'], selected: {animation: true}}, click() { const groups = Group.multi_selected; if (!groups.length) return; for (const group of groups) { expandDescendantAnimators(group); } } }); collapseAction = new Action('collapse_bone_animators', { name: 'Hide Child Animators', description: 'Remove this bone and all child bone animators from the timeline', icon: 'unfold_less', category: 'animation', condition: {modes: ['animate'], selected: {animation: true}}, click() { const groups = Group.multi_selected; if (!groups.length) return; for (const group of groups) { collapseGroup(group); } } }); Group.prototype.menu.addAction(expandAction, '#settings'); Group.prototype.menu.addAction(collapseAction, '#settings'); }, onunload() { expandAction.delete(); collapseAction.delete(); } }); function getAllDescendantGroups(group) { const result = []; if (!group.children) return result; for (const child of group.children) { if (child instanceof Group) { result.push(child); result.push(...getAllDescendantGroups(child)); } } return result; } function expandDescendantAnimators(parentGroup) { const animation = Animation.selected; if (!animation) return; const allGroups = [parentGroup, ...getAllDescendantGroups(parentGroup)]; for (const group of allGroups) { const animator = animation.getBoneAnimator(group); if (animator && animator.keyframes && animator.keyframes.length > 0) { animator.addToTimeline(); } } } function collapseGroup(parentGroup) { const allGroups = [parentGroup, ...getAllDescendantGroups(parentGroup)]; const uuidsToRemove = new Set(allGroups.map(g => g.uuid)); Timeline.animators.slice().forEach(animator => { if (uuidsToRemove.has(animator.uuid)) { Timeline.animators.remove(animator); } }); TickUpdates.keyframe_selection = true; } })(); ================================================ FILE: plugins/explorer/about.md ================================================ Use the folder icon in the left corner of the tab bar to open the explorer. Click files to peak into them, double click to jump into the file. Right click a file to bring up the context menu. ================================================ FILE: plugins/explorer/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2023-01-17", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Initial release" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2026-04-15", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added support for deep search (can be turned off in settings)", "Updated design", "Added Favorites list", "Replaced Back button with Back to and Up to buttons", "Added Drop In option to file context menu, which is the equivalent of drag-and-dropping the file into Blockbench", "Added Open File Location option in file context menu", "Display loading status and errors messages", "Added support for more image extensions", "Added Hytale icons" ] }, { "title": "Fixes", "list": [ "Fixed broken context menu options which require shell access" ] } ] } } ================================================ FILE: plugins/explorer/explorer.js ================================================ (function() { let deletables = []; let resize_line; let sidebar_button; const FAV_KEY = 'explorer.favorites'; BBPlugin.register('explorer', { title: 'Explorer', icon: 'fas.fa-folder-open', author: 'JannisX11', description: 'Navigate the files in your project from the sidebar in Blockbench!', tags: ["Files"], version: '1.1.0', min_version: '5.1.0', variant: 'desktop', has_changelog: true, onload() { StateMemory.init(FAV_KEY, 'array'); function getFileIcon(dirent) { let ext = dirent.name.split('.').last().toLowerCase(); let icon_name = 'insert_drive_file'; let color; switch (ext) { case 'bbmodel': icon_name = 'icon-blockbench_inverted'; color = '#a3cad9'; break; case 'json': icon_name = 'icon-format_block'; color = '#62a5df'; break; case 'jem': icon_name = 'icon-optifine_file'; color = '#df628a'; break; case 'jpm': icon_name = 'icon-optifine_file'; color = '#df628a'; break; case 'java': icon_name = 'icon-format_java'; color = '#dfd022'; break; case 'blockymodel': icon_name = 'icon-format_hytale'; color = '#aea0ffff'; break; case 'blockyanim': icon_name = 'movie'; color = '#97eaf5ff'; break; case 'png': icon_name = 'image'; color = '#42ab8d'; break; } if (dirent.isDirectory()) { icon_name = 'folder'; color = '#c3a670'; } if (dirent.name.endsWith('.geo.json')) { icon_name = 'icon-format_bedrock'; color = '#e3815b'; } if (icon_name == 'insert_drive_file' && Codec.getAllExtensions().includes(ext)) { icon_name = 'description'; } return Blockbench.getIconNode(icon_name, color); } function getDragHandler(file) { let lower_case_name = file.name.toLowerCase(); for (let key in Filesystem.drag_handlers) { if (key == 'model') continue; let handler = Filesystem.drag_handlers[key]; if (!Condition(handler.condition)) continue; let extensions = typeof handler.extensions == 'function' ? handler.extensions() : handler.extensions; if (extensions && !extensions.some(ext => lower_case_name.endsWith(ext))) continue; if (handler.element) continue; return handler; } } let css = Blockbench.addCSS(` .sidebar_explorer_open_button { height: 100%; padding-top: 2px; } #sidebar_explorer { display: flex; flex-direction: column; width: 350px; bottom: 0; top: 25px; left: 0; background-color: var(--color-ui); box-shadow: 10px 4px 44px rgb(0 0 0 / 42%), 500px 0px 500px 2000px rgb(0 0 0 / 15%); transition: left 120ms ease-out, box-shadow 120ms linear; width: var(--width); border-radius: 7px; } #sidebar_explorer:not(.visible) { box-shadow: none; left: calc(var(--width) * -1); } #sidebar_explorer .bar { padding: 0px 4px; margin-top: 9px; } #sidebar_explorer ul.list { overflow-y: auto; margin-top: 8px; padding: 5px; } li.sidebar_explorer_file { display: flex; height: 30px; padding: 1px 10px; gap: 5px; align-items: center; cursor: pointer; border-radius: 5px; } li.sidebar_explorer_file.unsupported { color: var(--color-subtle_text); } li.sidebar_explorer_file:hover { background-color: var(--color-ui); color: var(--color-light); } li.sidebar_explorer_file.selected { background-color: var(--color-selected); } li.sidebar_explorer_file span { flex-grow: 1; overflow: hidden; white-space: nowrap; cursor: inherit; direction: initial; } li.sidebar_explorer_file i { height: 24px; } .sidebar_explorer_is_open_icon { color: var(--color-subtle_text); font-size: 13px; padding: 5px; width: 20px; } #sidebar_explorer .sidebar_explorer_location { overflow: hidden; justify-content: right; font-size: 0.95em; overflow-x: scroll; direction: rtl; height: 32px; flex-shrink: 0; padding-left: 6px; padding-right: 6px; } .sidebar_explorer_location::-webkit-scrollbar { height: 7px; } .sidebar_explorer_location > span { padding: 3px 0; cursor: pointer; white-space: nowrap; } .sidebar_explorer_location > span:first-child { margin-right: auto; } .sidebar_explorer_location > span:hover { color: var(--color-light); background-color: var(--color-ui); } .sidebar_explorer_location > span::after { content: "\\f105"; font-family: 'Font Awesome 6 Free'; font-weight: 900; color: var(--color-subtle_text); margin: 0 7px; vertical-align: baseline; } .sidebar_explorer_location > span:first-child::after { display: none; } `); deletables.push(css); const setting_search_deep = new Setting('explorer_search_deep', { name: 'Explorer: Search Deep', description: 'Include all sub folders of the current directory when using the search bar', type: 'toggle', value: true, category: 'application', plugin: 'explorer' }); deletables.push(setting_search_deep); let temp_tab = null; let open_timeout = ''; let explorer = new ShapelessDialog('sidebar_explorer', { darken: false, keyboard_actions: { enter: { keybind: new Keybind({key: 13}), run(event) { let vue = this.content_vue; let path = vue.selected[0]; let file = path && vue.files.find(file => file.path == path); if (file) { vue.dblClickFile(file); } event.preventDefault(); } }, }, component: { data() {return { path: '', directory: [], directory_recursive: null, selected: [], history: [], search_term: '', width: 350, max_files: 500, scan_error: false, loading: true, recursive_cached: false, file_menu: new Menu([ { id: 'open', name: 'Open', icon: 'open_in_browser', click: (file, a) => { this.clickFile(file); this.dblClickFile(file); } }, { id: 'load_as', name: 'Load As...', icon: 'add_photo_alternate', condition: (file) => { let name = file.name.toLowerCase(); if (!name || !Texture.getAllExtensions) return false; return Texture.getAllExtensions().some(ext => name.endsWith('.'+ext)); }, click(file) { loadImages([{path: file.path, name: file.name}]) } }, { id: 'drop_in', name: 'Drop In', icon: 'system_update_alt', condition: file => file.type == 'file' && getDragHandler(file), click(file) { let handler = getDragHandler(file); Filesystem.readFile([file.path], {extensions: handler.extensions, readtype: handler.readtype}, files => { handler.cb(files); }); } }, '_', { id: 'open_externally', name: 'Open in Default Program', icon: 'open_in_new', condition: (file) => file.type == 'file', click(file) { requireNativeModule('shell').openPath(file.path); } }, { id: 'open_folder', name: 'menu.texture.folder', icon: 'folder', click(file) { requireNativeModule('shell').showItemInFolder(file.path); } }, { id: 'go_to_location', name: 'Open File Location', icon: 'snippet_folder', condition: (file) => this.recursive, click: (file) => { this.goTo(PathModule.dirname(file.path)); } }, { id: 'delete', name: 'generic.delete', icon: 'delete', condition: (file) => file.type == 'file', click: (file) => { let result = confirm(`Are you sure you want to move '${file.name}' to trash?`); if (result) { requireNativeModule('shell').trashItem(file.path); this.updateList(); } } } ]) }}, methods: { async updateList() { let list = this.directory; let deep = this.recursive; if (this.recursive) { if (!this.directory_recursive) this.directory_recursive = []; list = this.directory_recursive; } list.empty(); this.scan_error = false; if (!this.path) return; let folders = []; if (deep) { this.recursive_cached = true; } this.loading = true; try { let fs = require('fs'); let dirents = await fs.promises.readdir(this.path, {withFileTypes: true, recursive: deep}); if (!dirents) return; dirents.forEach(dirent => { let {name} = dirent; let path = PathModule.join(dirent.parentPath, name); let is_folder = dirent.isDirectory(); let file = { name, type: is_folder ? 'folder' : 'file', icon: getFileIcon(dirent), is_open: ModelProject.all.findIndex(project => project.save_path == path || project.export_path == path) !== -1, path, }; if (file.type == 'folder') { folders.push(file); } else { list.push(file); } }) if (folders.length) { list.splice(0, 0, ...folders); } } catch (err) { this.scan_error = err.code; if (err.code == 'EPERM') this.scan_error = 'Not permitted'; } this.selected.empty(); this.loading = false; }, clickFile(file) { if (open_timeout == file.path) return; open_timeout = file.path; setTimeout(() => (open_timeout = ''), 360); this.selected.replace([file.path]); if (file.type != 'folder') { if (Project?.save_path == file.path || Project?.export_path == file.path) return; let project_before = Project; Blockbench.read([file.path], {}, async files => { loadModelFile(files[0]); let to_close = temp_tab; if (Project !== project_before) temp_tab = Project; if (to_close) { await to_close.close(); } }) } }, dblClickFile(file) { if (file.type == 'folder') { this.goTo(file.path); } else { temp_tab = null; explorer.confirm(); } }, openContextMenu(file, event) { this.selected.replace([file.path]); this.file_menu.open(event, file); }, goTo(path) { if (this.path) this.history.push(this.path); this.path = path; this.search_term = ''; this.recursive_cached = false; this.directory_recursive = null; this.directory.empty(); this.updateList(); }, directoryBack() { let last = this.history.pop(); if (!last) return; this.goTo(last); this.history.pop(); }, directoryUp() { this.goTo(PathModule.dirname(this.path)); }, navigateBackTo(index) { if (!index) return; let arr = this.path.split(/[/\\]+/) arr = arr.slice(0, -Math.min(index, arr.length-2)); if (!arr[0]) return; if (arr[0].length === 0) arr[0] = PathModule.sep; this.goTo(PathModule.join(...arr)); }, createFile(event) { let arr = []; let arr_bbmodel = []; let redact = settings.streamer_mode.value; for (let key in Formats) { let format = Formats[key]; if (format.show_in_new_list == false) continue; if (key == 'image') continue; if (format.codec && format.codec.remember) { arr.push({ id: format.id, name: (redact && format.confidential) ? `[${tl('generic.redacted')}]` : format.name, icon: format.icon, description: format.description, click: (e) => { explorer.hide(); format.new(); let project = Project; let update = () => { Blockbench.removeListener('update_project_settings', update); if (project == Project) { project.export_path = PathModule.join(this.path, (project.name||'new') + `.${format.codec.extension || 'txt'}`); Format.codec.write(Format.codec.compile(), Project.export_path); } } Blockbench.on('update_project_settings', update); } }) } if (true && (!format.codec || format.codec.id !== 'project') && key !== 'skin') { arr_bbmodel.push({ id: format.id, name: ((redact && format.confidential) ? `[${tl('generic.redacted')}]` : format.name) + ' (bbmodel)', icon: format.icon, description: format.description, click: (e) => { explorer.hide(); format.new(); let project = Project; let update = () => { Blockbench.removeListener('update_project_settings', update); if (project == Project) { project.save_path = PathModule.join(this.path, (project.name||'new') + '.bbmodel') Codecs.project.write(Codecs.project.compile(), Project.save_path); } } Blockbench.on('update_project_settings', update); } }) } } arr.push('_', ...arr_bbmodel); new Menu('sidebar_explorer_new_file', arr).show(event.target); }, getFolderName(path) { return PathModule.basename(path); }, getFolderUpName(path) { return PathModule.basename(PathModule.dirname(path)); }, openSettings() { Settings.openDialog({search_term: 'Explorer'}); }, openFavoritesMenu(event) { let options = []; StateMemory[FAV_KEY].forEach((path, i) => { let option = { name: PathModule.basename(path), description: path, icon: 'folder', id: path, click: () => { this.goTo(path); }, children: [ {icon: 'delete', name: 'generic.delete', click() { StateMemory[FAV_KEY].remove(path); StateMemory.save(FAV_KEY); }} ] } options.push(option); }) if (this.path) { options.push( '_', { name: `Save "${PathModule.basename(this.path)}" to Favorites`, icon: 'star', id: 'save', click: () => { StateMemory[FAV_KEY].push(this.path); StateMemory.save(FAV_KEY); } } ); } new Menu(options).open(event.target); }, close(e) { explorer.cancel(); } }, computed: { recursive() { return setting_search_deep.value && !!this.search_term; }, files() { let list = this.recursive ? this.directory_recursive : this.directory; if (!this.search_term) return list.slice(0, this.max_files); let terms = this.search_term.toLowerCase().split(/\s/); let i = 0; return list.filter(file => { i++; if (i > this.max_files) return false; return !terms.find(term => ( !file.name.toLowerCase().includes(term) )) }) }, path_array() { return this.path.split(/[/\\]+/).reverse(); } }, watch: { search_term() { if (this.recursive && !this.directory_recursive) { this.updateList(); } } }, template: ` ` }, onOpen() { temp_tab = null; let current_file = Project && (Project.export_path || Project.save_path); if (current_file) { this.content_vue.goTo(PathModule.dirname(current_file)); } else if (!this.content_vue.path) { if ("SystemInfo" in window) { this.content_vue.goTo(SystemInfo.home_directory); } else { this.content_vue.goTo(electron.app.getPath('desktop')); } } this.content_vue.selected.replace(current_file ? [current_file] : []); setTimeout(() => { this.object.classList.add('visible'); resize_line.update(); }, 1); }, onCancel() { this.object.classList.remove('visible'); setTimeout(() => resize_line.update(), 0); }, onConfirm() { this.object.classList.remove('visible'); setTimeout(() => resize_line.update(), 0); } }) //deletables.push(explorer); sidebar_button = Interface.createElement('div', {class: 'tool sidebar_explorer_open_button', title: 'Open Explorer'}, Blockbench.getIconNode('fas.fa-folder-open')); sidebar_button.addEventListener('click', event => { explorer.show(); }) let tab_bar = document.getElementById('tab_bar'); tab_bar.prepend(sidebar_button); resize_line = new ResizeLine('sidebar_explorer', { condition() { return Dialog.open == explorer }, get() {return explorer.content_vue.width}, set(o, diff) { let calculated = Math.clamp(o + diff, 120, 800); explorer.content_vue.width = Math.snapToValues(calculated, [350], 16); }, position() { this.setPosition({ top: 0, bottom: 0, left: explorer.content_vue.width+2 }) } }); Interface.page_wrapper.append(resize_line.node); resize_line.node.style.zIndex = 40; let action = new Action('open_explorer_sidebar', { name: 'Open Explorer Sidebar', icon: 'fas.fa-folder-open', click() { explorer.show(); } }) deletables.push(action); }, onunload() { sidebar_button.remove(); deletables.forEach(action => { action.delete(); }) } }); })() ================================================ FILE: plugins/export_to_3mf/LICENSE.MD ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: plugins/export_to_3mf/about.md ================================================ # Export to 3MF **Export to 3MF** is a Blockbench plugin that allows you to directly export your models to .3mf files (3D Manufacturing Format). This allows you to easily slice your Blockbench models for 3D printing. ## How to use Access the export via `File > Export > Export 3MF Model`. You are able to choose what unit a pixel represents, which decides the scale of the model in the real world: - Micrometres - Millimetres (Default) - Centimetres - Metres - Inches - Feet The model by default will export as one object, but you can choose to divide it into separate objects by "group/bone" or "marker colour". This gives more control over reorganizing and material in your slicer. ## Valid models **Note:** Many Blockbench models are not suitable for printing without modification. Your model will have invalid aspects if you have zero thickness planes, or it is not manifold (watertight/solid). This conversion process is barebones and does not validate the printability of the exported 3MF file. ================================================ FILE: plugins/export_to_3mf/export_to_3mf.js ================================================ /// const contentTypes = ``; const rels = ``; const colourHexes = [ { hex: "#6EC9F4", name: "Light Blue" }, { hex: "#F7D84A", name: "Yellow" }, { hex: "#F4A428", name: "Orange" }, { hex: "#E64545", name: "Red" }, { hex: "#AD4ED2", name: "Purple" }, { hex: "#5B89E5", name: "Blue" }, { hex: "#30B75B", name: "Green" }, { hex: "#7CF38C", name: "Lime" }, { hex: "#F874D6", name: "Pink" }, { hex: "#D8D8D8", name: "Silver" }, ]; async function compile(units, splitGroups) { // @ts-ignore const zip = new JSZip(); // Basic stuff zip.file("[Content_Types].xml", contentTypes); zip.folder("_rels")?.file(".rels", rels); // Geometry const trianglesRaw = []; const objects = {}; let objectIndex = 1000; function addGeometry(geometry, mesh, cube, object) { const position = geometry.attributes.position; const index = geometry.index; const positions = position.array; const indices = index.array; const matrix = mesh.matrixWorld; for (let i = 0; i < indices.length; i += 3) { const v = []; for (let j = 0; j < 3; j++) { const idx = indices[i + j] * 3; const x = positions[idx]; const y = positions[idx + 1]; const z = positions[idx + 2]; const vec = new THREE.Vector3(x, y, z).applyMatrix4(matrix); v.push([vec.x, vec.z, vec.y]); } trianglesRaw.push({ vertices: v, colour: +cube.color - 1, object }); } } function addCube(cube, object) { const mesh = cube.mesh; mesh.updateMatrixWorld(); const geometry = mesh.geometry; addGeometry(geometry, mesh, cube, object); } function addMesh(meshObj, object) { const mesh = meshObj.mesh; mesh.updateMatrixWorld(); mesh.traverse(child => { if (!child.isMesh) { return; } const childMesh = child; const geometry = childMesh.geometry; addGeometry(geometry, mesh, meshObj, object); }); } function addGroup(group) { objects[++objectIndex] ??= { name: group.name ?? "Group", vertices: [], triangles: [] }; addChildren(group.children, objectIndex); } function addChildren(children, objectIndex) { for (const child of children) { if (child instanceof Cube) addCube(child, objectIndex); else if (child instanceof Mesh) addMesh(child, objectIndex); else if (child instanceof Group) addGroup(child); } } if (splitGroups !== "marker") objects[objectIndex] ??= { name: Project?.name && Project.name.length > 0 ? Project.name : "BBRoot", vertices: [], triangles: [] }; addChildren(splitGroups === "group" ? Outliner.root : [...Cube.all, ...Mesh.all], objectIndex); for (const triangle of trianglesRaw) { const indexes = []; if (splitGroups === "marker") objects[triangle.colour] ??= { name: colourHexes[triangle.colour].name, vertices: [], triangles: [] }; const object = objects[splitGroups === "marker" ? triangle.colour : triangle.object]; for (const vertex of triangle.vertices) { const [x, y, z] = vertex; let index = object.vertices.findIndex(d => d[0] === x && d[1] === y && d[2] === z); if (index === -1) { index = object.vertices.length; object.vertices.push(vertex); } indexes.push(index); } object.triangles.push({ indexes }); } const filteredObjects = Object.values(objects).filter(({ vertices }) => vertices.length > 0); const model = ` ${filteredObjects.map(({ name, vertices, triangles }, index) => ` ${vertices.map(([x, y, z]) => ``).join("")} ${triangles.map(({ indexes }) => ``)} `).join("\n")} ${filteredObjects.map(({ vertices }, index) => vertices.length > 0 ? `` : "").join("\n")} `; for (const object of filteredObjects) { continue; } zip.folder("3D")?.file("3dmodel.model", model); return zip.generateAsync({ type: "arraybuffer", compression: "DEFLATE" }); } /// let exportButton; let exportDialog = new Dialog("export-to-3mf-dialog", { title: "3MF Model Exporter", form: { exportUnits: { label: "Unit", description: "Convert pixels into the selected unit", type: "select", default: "millimeter", options: { micron: { name: "Micrometres" }, millimeter: { name: "Millimetres" }, centimeter: { name: "Centimetres" }, meter: { name: "Metres" }, inch: { name: "Inches" }, foot: { name: "Feet" } } }, exportGroups: { label: "Split", description: "Export model as multiple objects (useful for multi material printing)", type: "select", toggle_default: false, toggle_enabled: true, options: { group: { name: "By group" }, marker: { name: "By marker colour" } } }, }, lines: [ "

    Some models may result in an invalid 3MF file during export. To ensure a successful export, make sure all parts of your model have actual thickness and form enclosed, printable volumes.


    " ], async onConfirm({ exportUnits, exportGroups }) { const content = await compile(exportUnits, exportGroups); Blockbench.export({ resource_id: "CAD", extensions: ["3mf"], type: "3D Manufacturing Format", name: `${Project?.name ?? "unknown"}.3mf`, content }); } }); function load() { exportButton = new Action("export-to-3mf-button", { click() { exportDialog.show(); }, icon: "fa-file-export", name: "Export 3MF Model" }); MenuBar.addAction(exportButton, "file.export"); } function unload() { exportButton.delete(); exportDialog.delete(); } BBPlugin.register("export_to_3mf", { "title": "Export to 3MF", "author": "Ayden Hodgins-de Jonge", "description": "Export geometry as 3MF for 3D printing", "tags": ["Exporter", "3D Printing", "3MF"], "icon": "icon.png", "variant": "both", "version": "0.0.1", "min_version": "4.12.5", "has_changelog": false, "repository": "https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_to_3mf", onload: load, onunload: unload }); ================================================ FILE: plugins/export_to_3mf/members.yml ================================================ maintainers: - Ayden Hodgins-de Jonge ================================================ FILE: plugins/export_to_3mf/src/compile.ts ================================================ /// import {isObjectManifold} from "./validation"; declare const THREE: typeof import('three'); const contentTypes = `` const rels = `` const colourHexes = [ { hex: "#6EC9F4", name: "Light Blue" }, { hex: "#F7D84A", name: "Yellow" }, { hex: "#F4A428", name: "Orange" }, { hex: "#E64545", name: "Red" }, { hex: "#AD4ED2", name: "Purple" }, { hex: "#5B89E5", name: "Blue" }, { hex: "#30B75B", name: "Green" }, { hex: "#7CF38C", name: "Lime" }, { hex: "#F874D6", name: "Pink" }, { hex: "#D8D8D8", name: "Silver" }, ]; export type MFObject = {name: string, vertices: Vertex[], triangles: IndexedTriangle[]} export type Vertex = [number, number, number] export type RawTriangle = {vertices: Vertex[], colour: number, object: number} export type IndexedTriangle = {indexes: [number, number, number]} export async function compile(units: string, splitGroups: undefined|"group"|"marker"): Promise { // @ts-ignore const zip = new JSZip() // Basic stuff zip.file("[Content_Types].xml", contentTypes) zip.folder("_rels")?.file(".rels", rels) // Geometry const trianglesRaw: RawTriangle[] = [] const objects: {[key: number]: MFObject} = {} let objectIndex = 1000 function addGeometry(geometry: THREE.BufferGeometry, mesh: {matrixWorld: THREE.Matrix4}, cube: {color: number}, object: number) { const position = geometry.attributes.position const index = geometry.index! const positions = position.array const indices = index.array const matrix = mesh.matrixWorld for (let i = 0; i < indices.length; i += 3) { const v: [number, number, number][] = []; for (let j = 0; j < 3; j++) { const idx = indices[i + j] * 3; const x = positions[idx]; const y = positions[idx + 1]; const z = positions[idx + 2]; const vec = new THREE.Vector3(x, y, z).applyMatrix4(matrix); v.push([vec.x, vec.z, vec.y]); } trianglesRaw.push({vertices: v, colour: +cube.color - 1, object}); } } function addCube(cube: Cube, object: number) { const mesh = cube.mesh mesh.updateMatrixWorld() const geometry = mesh.geometry addGeometry(geometry, mesh, cube, object); } function addMesh(meshObj: Mesh, object: number) { const mesh = meshObj.mesh mesh.updateMatrixWorld() mesh.traverse(child => { if (!(child as THREE.Mesh).isMesh) { return } const childMesh = child as THREE.Mesh const geometry = childMesh.geometry addGeometry(geometry, mesh, meshObj, object); }) } function addGroup(group: Group) { objects[++objectIndex] ??= {name: group.name ?? "Group", vertices: [], triangles: []} addChildren(group.children, objectIndex) } function addChildren(children: OutlinerNode[], objectIndex: number) { for (const child of children) { if (child instanceof Cube) addCube(child, objectIndex) else if (child instanceof Mesh) addMesh(child, objectIndex) else if (child instanceof Group) addGroup(child) } } if (splitGroups !== "marker") objects[objectIndex] ??= {name: Project?.name && Project.name.length > 0 ? Project.name : "BBRoot", vertices: [], triangles: []} addChildren(splitGroups === "group" ? Outliner.root : [...Cube.all, ...Mesh.all], objectIndex) for (const triangle of trianglesRaw) { const indexes = [] if (splitGroups === "marker") objects[triangle.colour] ??= {name: colourHexes[triangle.colour].name, vertices: [], triangles: []} const object = objects[splitGroups === "marker" ? triangle.colour : triangle.object] for (const vertex of triangle.vertices) { const [x, y, z] = vertex let index = object.vertices.findIndex(d => d[0] === x && d[1] === y && d[2] === z) if (index === -1) { index = object.vertices.length object.vertices.push(vertex) } indexes.push(index) } object.triangles.push({indexes} as IndexedTriangle) } const filteredObjects = Object.values(objects).filter(({vertices}) => vertices.length > 0) const model = ` ${filteredObjects.map(({name, vertices, triangles}, index) => ` ${vertices.map(([x, y, z]) => ``).join("")} ${triangles.map(({indexes}) => ``)} `).join("\n")} ${filteredObjects.map(({vertices}, index) => vertices.length > 0 ? `` : "").join("\n")} ` for (const object of filteredObjects) { if (isObjectManifold(object)) continue console.error(object, "Object failed validation") } zip.folder("3D")?.file("3dmodel.model", model) return zip.generateAsync({type: "arraybuffer", compression: "DEFLATE"}) } ================================================ FILE: plugins/export_to_3mf/src/export_to_3mf.ts ================================================ /// import {compile} from "./compile"; let exportButton: Action let exportDialog = new Dialog("export-to-3mf-dialog", { title: "3MF Model Exporter", form: { exportUnits: { label: "Unit", description: "Convert pixels into the selected unit", type: "select", default: "millimeter", options: { micron: { name: "Micrometres" }, millimeter: { name: "Millimetres" }, centimeter: { name: "Centimetres" }, meter: { name: "Metres" }, inch: { name: "Inches" }, foot: { name: "Feet" } } }, exportGroups: { label: "Split", description: "Export model as multiple objects (useful for multi material printing)", type: "select", toggle_default: false, toggle_enabled: true, options: { group: { name: "By group" }, marker: { name: "By marker colour" } } }, }, lines: [ "

    Some models may result in an invalid 3MF file during export. To ensure a successful export, make sure all parts of your model have actual thickness and form enclosed, printable volumes.


    " ], async onConfirm({exportUnits, exportGroups}: { exportUnits: string, exportGroups: undefined|"group"|"marker" }) { const content = await compile(exportUnits, exportGroups) Blockbench.export({ resource_id: "CAD", extensions: ["3mf"], type: "3D Manufacturing Format", name: `${Project?.name ?? "unknown"}.3mf`, content }) } }) function load() { exportButton = new Action("export-to-3mf-button", { click(): void { exportDialog.show() }, icon: "fa-file-export", name: "Export 3MF Model" }) MenuBar.addAction(exportButton, "file.export") } function unload() { exportButton.delete() exportDialog.delete() } BBPlugin.register("export_to_3mf", { "title": "Export to 3MF", "author": "Ayden Hodgins-de Jonge", "description": "Export geometry as 3MF for 3D printing", "tags": ["Exporter", "3D Printing", "3MF"], "icon": "icon.png", "variant": "both", "version": "0.0.1", "min_version": "4.12.5", "has_changelog": false, "repository": "https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_to_3mf", onload: load, onunload: unload }) ================================================ FILE: plugins/export_to_3mf/src/validation.ts ================================================ import {MFObject} from "./compile"; export function isObjectManifold(object: MFObject): boolean { // TODO: Future error checking return true } ================================================ FILE: plugins/export_to_blender/LICENSE.MD ================================================ MIT License 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. ================================================ FILE: plugins/export_to_blender/about.md ================================================ **Requires Blender to be installed!** This plugin adds the option to export your project as a Blender scene file (.blend). It works by first exporting the project as GLTF, then importing that GLTF into Blender using a Python script. You may need to specify the path to your Blender installation upon first use. ================================================ FILE: plugins/export_to_blender/export_to_blender.js ================================================ (function() { const windows = Blockbench.operating_system === 'Windows'; const linux = Blockbench.operating_system === 'macOS'; const macos = Blockbench.operating_system === 'Linux'; const requireUserPermission = Blockbench.isNewerThan('4.99'); let fsModule = requireUserPermission ? undefined : require('fs'); let childProcessModule = requireUserPermission ? undefined : require('child_process'); // Python code to be run by Blender // 1. Imports a GLTF file // 2. Adds the file to a root node and a collection // 3. Saves the blend file const blenderScript = [ 'import bpy ', 'import sys ', ' ', 'args = sys.argv[sys.argv.index("--") + 1:] ', 'name = args[0] ', 'gltf_path = args[1] ', 'blend_path = args[2] ', ' ', 'print("Creating blend...") ', 'bpy.ops.wm.read_factory_settings(use_empty=True) ', ' ', '# Create collections ', 'collection = bpy.data.collections.new(name) ', 'bpy.context.scene.collection.children.link(collection) ', ' ', '# Import gltf ', 'print("Importing gltf...") ', 'bpy.ops.import_scene.gltf(filepath=gltf_path) ', ' ', '# Root node ', 'root_node = bpy.data.objects.new(name, None) ', 'bpy.context.collection.objects.link(root_node) ', 'collection.objects.link(root_node) ', 'bpy.context.scene.collection.objects.unlink(root_node) ', ' ', '# Add imported objects to collection and root node ', 'for obj in bpy.context.selected_objects: ', ' # Add to collection ', ' collection.objects.link(obj) ', ' bpy.context.scene.collection.objects.unlink(obj) ', ' # Add root object to prop node ', ' if obj.parent == None: ', ' obj.parent = root_node ', ' ', '# Save blend file ', 'bpy.ops.wm.save_as_mainfile(filepath=blend_path) ', 'print(f"Saved blend file: {blend_path}") ', ].join('\n'); // Because we need to send the code through a command line argument, // It's very hard to encode double quotes and newlines // We cheat by base-64 encoding the script, // Then having Python decode it and run it const encodedBlenderScript = `import base64; exec(base64.b64decode('${btoa(blenderScript)}'))`; let deferred = []; Plugin.register('export_to_blender', { title: 'Export to Blender', author: '0x13F', description: 'Export your project as a Blender scene (.blend)', icon: 'icon.png', creation_date: '2025-04-16', version: '2.0.0', variant: 'desktop', min_version: '4.12.4', has_changelog: false, tags: [ 'Exporter' ], repository: 'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_as_blender', onload() { deferDelete(new Setting('blender_path', { name: 'Blender path', description: 'Path to the Blender executable', category: 'export', type: 'text', })); let blenderSetPathDialog = deferDelete(new Dialog('blender_set_path', { title: 'Set Blender path', form: { ['info']: { type: 'info', text: 'The Blender installation could not be located. Please choose the path to the Blender executable.', }, ['path']: { type: 'file', label: 'Blender path', extensions: windows ? [ 'exe' ] : [], }, }, async onConfirm(form_result) { let blenderPath = form_result['path']; if (blenderPath != null && blenderPath != '' && getFs().existsSync(blenderPath) && await validateBlender(blenderPath)) { // New path is valid! Settings.structure.export.items['blender_path'].value = blenderPath; blenderCodec.export_action.trigger(); } else { // New path is not valid, show message box and try again Blockbench.showMessageBox({ title: 'Blender path', message: 'Provided path does not point to a valid Blender executable, please try again.', icon: 'error', }, () => blenderCodec.export_action.trigger()); } }, })); let blenderPatienceDialog = deferDelete(new Dialog('blender_patience', { title: 'Exporting as Blender Scene...', progress_bar: {}, buttons: [], cancel_on_click_outside: false, onOpen() { // Forcefully remove the close button let closeButton = this.object.querySelector('.dialog_close_button'); if (closeButton != undefined) this.object.removeChild(closeButton); // Keep increasing the progress bar // speed keeps decreasing this.progress_bar.setProgress(0); let progressUpdateFramerate = 60; let dt = 1/progressUpdateFramerate; this.updateProgressInterval = setInterval(() => { let remainingProgress = 1 - this.progress_bar.progress; let addProgress = remainingProgress * remainingProgress * dt; let newProgress = Math.min(this.progress_bar.progress + addProgress, 0.95); this.progress_bar.setProgress(newProgress); }, 1000/progressUpdateFramerate); }, onClose() { clearInterval(this.updateProgressInterval); }, })); let blenderCodec = deferDelete(new Codec('blender', { name: 'Blender Scene', extension: 'blend', export_action: deferDelete(new Action({ id: 'export_blender', name: 'Export Blender Scene', icon: 'blender', category: 'file', click() { let blenderPath = Settings.get('blender_path'); if (blenderPath == undefined || blenderPath == '') { setBlenderPath(this, blenderSetPathDialog); } else { blenderCodec.export(); } }, })), export_options: { ['scale']: { label: 'settings.model_export_scale', type: 'number', value: Settings.get('model_export_scale'), }, ['embed_textures']: { type: 'checkbox', label: 'codec.common.embed_textures', value: true, }, ['armature']: { type: 'checkbox', label: 'codec.common.armature', value: false, }, ['animations']: { label: 'codec.common.export_animations', type: 'checkbox', value: true, }, }, async compile(options) { return await compileBlend(options); }, async export() { let options = await this.promptExportOptions(); if (options === null) return; await exportBlend(this, options, blenderPatienceDialog); }, })); // Insert into export menu after last item with id 'export_...' let exportMenu = MenuBar.menus.file.structure.find(x => x.id === 'export'); let lastExportItem = exportMenu.children .filter(x => (typeof x === 'string' ? x : x.id).startsWith('export_')) .last(); let lastExportItemIndex = exportMenu.children.indexOf(lastExportItem); let blenderExportIndex = lastExportItemIndex + 1; exportMenu.children.splice(blenderExportIndex, 0, 'export_blender'); defer(() => exportMenu.children.splice(exportMenu.children.indexOf('export_blender'), 1)); }, onunload() { for (let lambda of deferred) lambda(); }, }); async function compileBlend(options) { let tempPathPrefix = `${PathModule.dirname(Project.save_path)}/.${PathModule.basename(Project.save_path)}`; let tempGlbPath = tempPathPrefix + '.TEMP_BLEND_EXPORT.glb'; let tempBlendPath = tempPathPrefix + '.TEMP_BLEND_EXPORT.blend'; // Export to .glb let glbContent = await Codecs.gltf.compile({ encoding: 'binary', ...options, }); getFs().writeFileSync(tempGlbPath, Buffer.from(glbContent)); // Run Blender script let blender = Settings.get('blender_path'); let blenderLogs = await executeCommand(blender, [ '--background', '--python-expr', encodedBlenderScript, '--', Project.name, tempGlbPath, tempBlendPath, ]); console.log(`Blender: ${blenderLogs}`); if (!getFs().existsSync(tempBlendPath)) { getFs().unlinkSync(tempGlbPath); return new Error('Blender didn\'t create blend file for some reason. Please verify your Blender path in your settings.'); } // Read Blender scene content let blendContent = getFs().readFileSync(tempBlendPath); // Clean up getFs().unlinkSync(tempGlbPath); getFs().unlinkSync(tempBlendPath); return blendContent; } async function exportBlend(codec, options, blenderPatienceDialog) { blenderPatienceDialog.show(); let content = await codec.compile(options); blenderPatienceDialog.close(); // Wait for the patience dialog to close await new Promise(r => setTimeout(r, 20)); // Something went wrong... if (content == undefined || content instanceof Error) { Blockbench.showMessageBox({ title: 'Blender export error', message: 'Exporting as Blender Scene failed for an unknown reason.\n' + 'Please verify that the Blender Path in your settings is correct.', icon: 'error', }); return; } // Export dialog Blockbench.export({ type: 'Blender Scene File', startpath: Project.save_path, extensions: ['blend'], savetype: 'binary', content: content, }, (exportPath) => { Blockbench.showQuickMessage(`Exported as ${PathModule.basename(exportPath)}`, 1000); }); } // Either find Blender path and retrigger the export action, // or open the dialog async function setBlenderPath(exportAction, pathDialog) { let foundPath = await findBlender(); if (foundPath == null) { pathDialog.show(); } else { Settings.structure.export.items['blender_path'].value = foundPath; exportAction.trigger(); } } // Try to find the path to Blender, if it can't be found, return null async function findBlender() { try { // Try just running the command if (await validateBlender('blender')) return 'blender'; // Try running `where blender` try { let whereCommand = windows ? 'where' : 'which'; let pathFromWhere = await executeCommand(whereCommand, ['blender']); if (getFs().existsSync(pathFromWhere) && await validateBlender(pathFromWhere)) return pathFromWhere; } catch { } // Try obvious paths // wildcards should be resolved, but only one wildcard is allowed let obviousPaths = windows ? ['C','D','E'].flatMap(drive => [ `${drive}:/Program Files/Blender Foundation/Blender */blender.exe`, `${drive}:/Program Files/WindowsApps/BlenderFoundation.Blender*/Blender/blender.exe`, `${drive}:/Program Files (x86)/Steam/steamapps/common/Blender/blender.exe`, `${drive}:/SteamLibrary/steamapps/common/Blender/blender.exe`, ]) : linux ? [`/usr/share/blender/*/Blender`] : macos ? [`/Applications/Blender.app/Contents/Resources/Blender`] : []; for (let obviousPath of obviousPaths) { // Resolve wildcard if (obviousPath.indexOf('*') !== -1) { let segments = obviousPath.split('/'); let wildcardSegmentIndex = segments.findIndex(s => s.includes('*')); let segmentsUntilWildcard = segments.slice(0, wildcardSegmentIndex); // Stop early if the the wildcard's parent doesn't exist if (!getFs().existsSync(segmentsUntilWildcard.join('/'))) continue; let wildcardSegment = segments[wildcardSegmentIndex]; let wildcardIndex = wildcardSegment.indexOf('*'); let beforeWildcard = wildcardSegment.slice(0, wildcardIndex); let afterWildcard = wildcardSegment.slice(wildcardIndex + 1); let matchingDirItems = getFs().readdirSync(segmentsUntilWildcard.join('/')) .filter(i => i.startsWith(beforeWildcard)) .filter(i => i.endsWith(afterWildcard)); let existingPaths = matchingDirItems .map(i => obviousPath.replace(wildcardSegment, i)) .filter(p => getFs().existsSync(p)); // Nothing matches or matches don't contain Blender exe if (existingPaths.length === 0) continue; // Just one existing match, go validate it! if (matchingDirItems.length === 1) { obviousPath = existingPaths[0]; } else { // Multiple versions of Blender // Find whichever file has the most recent write time let newestPath = existingPaths .map(existingPath => ({ existingPath, writeTime: getFs().statSync(existingPath).mtime.getTime() })) .sort((a, b) => b.writeTime - a.writeTime) .map(entry => entry.existingPath) [0]; obviousPath = newestPath; } } // Check to make sure we resolved the wildcard if (obviousPath.indexOf('*') !== -1) { console.warn('Two wildcards in Blender path?'); continue; } // Make sure the file exists and and can be called with --version if (getFs().existsSync(obviousPath) && await validateBlender(obviousPath)) return obviousPath; } } catch { // Give up, just prompt the user return null; } } // Runs a command as a Promise function executeCommand(command, args) { return new Promise((resolve, reject) => { try { let process = getChildProcess().spawn(command, args, { shell: false }); let stdout = ''; let stderr = ''; process.stdout.on('data', (data) => { stdout += data.toString(); }); process.stderr.on('data', (data) => { stderr += data.toString(); }); process.on('close', (code) => { if (code === 0) { resolve(stdout.trim()); } else { reject(new Error(stderr.trim() || `Command failed with exit code ${code}`)); } }); process.on('error', (err) => { reject(err); }); } catch (error) { reject(error); } }); } // Tries to run blender with the provided path // Returns the same path on success, otherwise null async function validateBlender(blender) { try { let result = await executeCommand(blender, ['--version']); if (result?.startsWith("Blender ")) return blender; } catch { } return null; } function defer(lambda) { deferred.push(lambda); } function deferDelete(deletable) { if (deletable.delete == undefined) { console.warn('deferDelete() called with object that isn\'t deletable: ', deletable); return; } defer(() => deletable.delete()); return deletable; } function getFs() { if (fsModule == undefined) fsModule = requireNativeModule('fs', { message: 'This permission is required to locate Blender and convert your model.', }); return fsModule; } function getChildProcess() { if (childProcessModule == undefined) childProcessModule = requireNativeModule('child_process', { message: 'This permission is required to communicate with Blender to convert your model.', }); return childProcessModule; } })(); ================================================ FILE: plugins/export_to_blender/members.yml ================================================ maintainers: - mr0x13f developers: - mr0x13f ================================================ FILE: plugins/farsight/LICENSE ================================================ MIT License Copyright (c) 2026 Luth3r 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. ================================================ FILE: plugins/farsight/README.md ================================================ # 👁️ Farsight Farsight is a Blockbench Plugin that increases the culling distance. Perfect for creating whole worlds. ![alt text]() ## ⚙️ Farsight can be Configured Use this option under the Tools Menu to increase the Clipping Limit. ![alt text]() ## ⛰️ Understanding of Scale *The map of Final Fantasy XV's playable area is around 128000m. Or 64km².* *That is also the size of the purple plane.* *If you somehow need to craft a world that's bigger than 1,000,000m, you can increase the cap manually. Check:* `Line 64 in farsight.js` ## ⚠️ Warning! Blockbench was not built to work with meshes and textures at this size. `Creating a Texture` is a very dangerous choice. I recommend always importing textures when working with large meshes. And playing on this, no matter your game engine, without splitting and chunking it into pieces won't be an easy thing to do. Consider how you can break your world apart into pieces, or even better, into seperate levels. ## 🖥️🌐 Install Installation is the same as every other Blockbench Plugin. Simply grab it from the Plugin Store, or Load the Plugin from the Javascript (`farsightjs`) file. ================================================ FILE: plugins/farsight/farsight.js ================================================ Plugin.register("farsight", { title: "Farsight", author: "Luther Gray", icon: "visibility", description: "Increases the Clipping Distance of Blockbench to see much larger maps & levels (configurable).", version: "1.0.1", min_version: "4.8.0", variant: "both", onload() { // Check to activate Farsight in new Tabs. this.onPreviewAdded = (data) => { setTimeout(() => this.applySettings(), 50); }; Blockbench.on('view_restored', this.onPreviewAdded); // Main Variable (If there's a setting in localStorage, use that.) this.clipDistance = parseFloat(localStorage.getItem("farsight_clipDistance")) || 200000; // Side Effect to fix the small Zoom Distance this.maxDistance = 300000; // Create the Apply Settings Function this.applySettings = () => { // Safety if (!Preview.all) return; Preview.all.forEach((preview) => { // Perspective preview.camPers.far = this.clipDistance; preview.camPers.updateProjectionMatrix(); // Check Controls if (preview.controls) { preview.controls.maxDistance = this.maxDistance; } // Ortho preview.camOrtho.far = this.clipDistance; preview.camOrtho.updateProjectionMatrix(); preview.render(); }); }; // Apply Settings this.applySettings(); //---------------------------------------- // Farsight Configure Window this.configureAction = new Action("configure_farsight", { name: "Configure Farsight", description: "Adjust the Clipping Distance.", icon: "settings", click: () => { let dialog = new Dialog({ id: "farsight_config", title: "Farsight Settings", form: { clipDistance: { label: "Maximum Clipping Distance (1,000,000 is current cap)", type: "number", value: this.clipDistance, min: 10000, max: 1000000, step: 10000, }, info: { type: "info", text: "Higher values allow for larger viewing distances, but be aware of performance impact. Especially with Textures applied.", }, }, onConfirm: (formData) => { this.clipDistance = formData.clipDistance; // Apply Config Settings localStorage.setItem("farsight_clipDistance", this.clipDistance); this.applySettings(); Blockbench.showQuickMessage("Farsight Settings Updated!"); dialog.hide(); }, }); dialog.show(); }, }); MenuBar.addAction(this.configureAction, "tools"); }, onunload() { // Clean Up let defaultFarPers = 10000; let defaultFarOrtho = 6000; let defaultMaxDistance = Infinity; Preview.all.forEach((preview) => { preview.camPers.far = defaultFarPers; preview.camPers.updateProjectionMatrix(); if (preview.controls) preview.controls.maxDistance = defaultMaxDistance; preview.camOrtho.far = defaultFarOrtho; preview.camOrtho.updateProjectionMatrix(); preview.render(); }); if (this.applyAction) this.applyAction.delete(); if (this.configureAction) this.configureAction.delete(); }, }); ================================================ FILE: plugins/figura_format/about.md ================================================ Figura uses Blockbench for it's modeling, but some features of Blockbench will not be parsed by Figura. This Plugin adds a Project Format that will make the following changes to Blockbench: * New Animations will be named `new` instead of `animation.model.new`. * The "Anim Time Update" Animation property has been renamed to "Start Offset" to reflect how the property is parsed by Figura. * The "Override" Animation property has been renamed to "Override Vanilla Animations" to better reflect how the property is used by Figura. * Added "Copy X Path" under the Right Click context menu for Cubes, Groups, Meshes, Animations, and Textures. * Copies the full script path as dictated by Figura's scripting API. * Assumes the bbmodel is at the root of the avatar. * Added "Add Animations from .bbmodel..." under Animation. * Allows you to select a bbmodel and imports all animations you select, replacing old animations. * Intended to replace "Export Animations to file, then import file" workflow. * Added "Allow Duplicate Names" which can be found in the Figura Plugin Settings (File->Plugins->Figura Format->Settings) * Enabling this bypasses the group name restrictions, such as duplicate group names and special characters in group names. * Will break certain Blockbench Animation features. Use at own risk. * Added "Recalculate UVs" under UV. * Scales an entire texture's uvs to match a new texture size. * Useful for fixing Texture Size related issues. * Added "Optimize Model" under Tools. * Provides batch operations related to optimizing a bbmodel for filesize when compressed to a Figura Avatar. * Removed Blockbench Animated Textures. * Removed File Name textbox. * Removed Model Identifier. * Removed Molang Errors. * Removed Texture Render Mode from the Texture Properties. * Removed Particle and Sound keyframes. change_history ================================================ FILE: plugins/figura_format/figura_format.js ================================================ (function () { const toDelete = [] function isValidLuaIdentifier(str) { const keywords = [ "and", "break", "do", "else", "elseif", "end", "false", "for", "function", "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while", ] return ( typeof str == "string" && str.search(/^[a-zA-Z0-9_]+$/) !== -1 && str.search(/^[0-9]/) === -1 && !keywords.includes(str) ) } function getValidLuaIndex(str) { return isValidLuaIdentifier(str) ? `.${str}` : `["${str}"]` } BBPlugin.register('figura_format', { title: "Figura Model Format", author: "Katt (KitCat962)", icon: "icon.svg", description: "Create models for the Figura mod in a custom format that optimizes Blockbench to work with Figura models.", tags: ["Minecraft: Java Edition", "Figura"], version: "0.1.3", min_version: "4.8.0", variant: "both", await_loading: true, creation_date: "2023-07-22", onload() { const particle = EffectAnimator.prototype.channels.particle, sound = EffectAnimator.prototype.channels.sound const format = new ModelFormat('figura', { icon: 'change_history', name: 'Figura Model', description: 'Model for the Figura mod.', category: 'minecraft', target: ['Figura'], show_on_start_screen: true, box_uv: false, optional_box_uv: true, single_texture: false, per_texture_uv_size: true, model_identifier: false, parent_model_id: false, vertex_color_ambient_occlusion: false, animated_textures: false, bone_rig: true, centered_grid: true, rotate_cubes: true, integer_size: false, meshes: true, texture_meshes: false, locators: true, rotation_limit: false, uv_rotation: true, java_face_properties: false, select_texture_for_particles: false, bone_binding_expression: false, animation_files: false, texture_folder: false, image_editor: false, edit_mode: true, paint_mode: true, display_mode: false, animation_mode: true, pose_mode: false, onActivation() { Language.addTranslations('en', { ['menu.animation.anim_time_update']: "Start Offset", ['menu.animation.override']: "Override Vanilla Animations", }) delete EffectAnimator.prototype.channels.particle delete EffectAnimator.prototype.channels.sound EffectAnimator.prototype.channels.timeline.name = "Instruction (Lua Script)" }, onDeactivation() { Language.addTranslations('en', { ['menu.animation.anim_time_update']: "Anim Time Update", ['menu.animation.override']: "Override", }) EffectAnimator.prototype.channels.particle = particle EffectAnimator.prototype.channels.sound = sound EffectAnimator.prototype.channels.timeline.name = tl('timeline.timeline') }, }) toDelete.push(format) const copyPathModelPart = new Action('figura_copy_path_modelpart', { name: "Copy ModelPart Path", description: "Calculates the scripting path to this ModelPart and copies it to the clipboard.", icon: "fa-clipboard", condition: () => Format === format && (Group.selected != null || Outliner.selected.length === 1), click() { let path = [] let element = Group.selected || Outliner.selected[0] while (element !== "root") { path.unshift(element.name) element = element.parent; } path.unshift(Project.name || "modelName") path = path.map(getValidLuaIndex) path.unshift('models') let pathString = path.join("") navigator.clipboard.writeText(pathString) Blockbench.showQuickMessage(`Coppied "${pathString}" to the clipboard`) } }) const copyPathAnimation = new Action('figura_copy_path_animation', { name: "Copy Animation Path", description: "Calculates the scripting path to this Animation and copies it to the clipboard.", icon: "fa-clipboard", condition: () => Format === format && (Animation.selected !== null), click() { let path = [Project.name || "modelName", Animation.selected.name] path = path.map(getValidLuaIndex) path.unshift('animations') let pathString = path.join("") navigator.clipboard.writeText(pathString) Blockbench.showQuickMessage(`Coppied "${pathString}" to the clipboard`) } }) const copyPathTextures = new Action('figura_copy_path_texture', { name: "Copy Texture Path", description: "Calculates the scripting path to this Texture and copies it to the clipboard. Results may vary.", icon: "fa-clipboard", condition: () => Format === format && (Texture.selected !== null), click() { let path if (!isApp) path = `textures["${Project.name}.${Texture.selected.name.replace(/\.png$/, "")}"]` else { let texture = PathModule.parse(Texture.selected.path) let project = PathModule.parse(Project.save_path) let relative = PathModule.relative(project.dir, texture.dir) if (texture.dir == '' || relative.startsWith(`..`)) path = `textures["${Project.name}.${Texture.selected.name.replace(/\.png$/, "")}"]` else path = `textures["${relative.replace(`\\${PathModule.sep}`, '.')}${relative == '' ? '' : '.'}${texture.name}"]` } navigator.clipboard.writeText(path) Blockbench.showQuickMessage(`Coppied "${path}" to the clipboard`) } }) const recalculateUV = new Action('figura_recalculate_uv', { name: "Recalculate UVs", description: "Calculate the uvs for all of a texture's parts", icon: "fa-expand", condition: { method: () => Format === format }, click() { if (Texture.all.length == 0) { Blockbench.showQuickMessage('No textures in bbmodel'); return } let _texture = null; let _width = 0, _height = 0; let dialog = new Dialog({ id: 'figura_recalculate_uv', title: 'Recalculate UVs', form: { texture: { label: 'Texture', type: 'select', options: Texture.all.reduce((o, t) => { o[t.uuid] = t.name; return o }, {}) }, prev_width: { label: 'Current Width', type: 'number', }, prev_height: { label: 'Current Height', type: 'number', }, _: "_", new_width: { label: 'New Width', type: 'number', min: 1, step: 1 }, new_height: { label: 'New Height', type: 'number', min: 1, step: 1 }, }, onFormChange(form_result) { let texture = Texture.all.find(t => t.uuid === form_result.texture) if (form_result.texture != _texture) { _texture = form_result.texture _width = texture.width _height = texture.height dialog.setFormValues({ prev_width: texture.width, prev_height: texture.height, new_width: texture.width, new_height: texture.height }) dialog.updateFormValues(false) } else if (form_result.prev_width != _width || form_result.prev_height != _height) { dialog.setFormValues({ prev_width: _width, prev_height: _height, }) dialog.updateFormValues(false) } }, onConfirm(form_result) { console.log("?") console.log(Cube.all.filter(c => !c.box_uv)) Undo.initEdit({ elements: [...Cube.all, ...Mesh.all] }) Cube.all.filter(c => !c.box_uv).forEach(cube => { for (var key in cube.faces) { if (cube.faces[key].texture != form_result.texture) continue var uv = cube.faces[key].uv; uv[0] *= form_result.new_width / form_result.prev_width; uv[2] *= form_result.new_width / form_result.prev_width; uv[1] *= form_result.new_height / form_result.prev_height; uv[3] *= form_result.new_height / form_result.prev_height; } }) Mesh.all.forEach(mesh => { for (var key in mesh.faces) { if (mesh.faces[key].texture != form_result.texture) continue var uv = mesh.faces[key].uv; for (let vkey in uv) { uv[vkey][0] *= form_result.new_width / form_result.prev_width; uv[vkey][1] *= form_result.new_height / form_result.prev_height; } } }) Canvas.updateAllUVs() Interface.Panels.textures.inside_vue.$forceUpdate(); Canvas.updateLayeredTextures(); UVEditor.vue.$forceUpdate(); Undo.finishEdit('Recalculated UVs') }, onCancel() { } }); dialog.show(); dialog.updateFormValues(false) } }) const importAnimations = new Action('figura_import_animations', { name: "Import Animations from .bbmodel...", description: "Import animations from another bbmodel", icon: "fa-file-import", condition: { modes: ['animate'], method: () => Format === format }, click() { Blockbench.import({ resource_id: 'model', extensions: ['bbmodel'], type: 'Model', readtype: 'text', multiple: false }, function (files) { let file = files[0] if (!file) return // get the animation data in JSON form via opening the project file and generating the json from the current file. let currentProject = Project let close = !(isApp && ModelProject.all.find(project => ( project.save_path == file.path || project.export_path == file.path ))) loadModelFile(file); let loadedProject = Project let animJson = Animator.buildFile() currentProject.select() if (close) loadedProject.close() // load the animations into the current project, deleting the originals if desired. // stolen from function importFile at line 1525 of animation.js let form = {}; let keys = []; for (var key in animJson.animations) { form[key.hashCode()] = { label: key, type: 'checkbox', value: true, nocolon: true }; keys.push(key) } if (keys.length == 0) { Blockbench.showQuickMessage('message.no_animation_to_import'); } else { let dialog = new Dialog({ id: 'figura_animation_import', title: 'dialog.animation_import.title', form, onConfirm(form_result) { let names = []; let animsToRemove = []; for (var key of keys) { if (form_result[key.hashCode()]) { names.push(key); let a = Animation.all.find(anim => anim.name == key) if (a) animsToRemove.push(a) } } Undo.initEdit({ animations: animsToRemove }) if (form_result.replace_animations) animsToRemove.forEach(anim => anim.remove(false)) let new_animations = Animator.loadFile({ json: animJson, path: null }, names); Undo.finishEdit('Figura Import animations', { animations: new_animations }) }, onCancel() { } }); form.select_all_none = { type: 'buttons', buttons: ['generic.select_all', 'generic.select_none'], click(index) { let values = {}; keys.forEach(key => values[key.hashCode()] = (index == 0)); dialog.setFormValues(values); } } form.properties_break = '_' form.replace_animations = { label: "Replace Animations?", description: "If enabled, the imported animations will replace the old ones", type: 'checkbox', value: true, nocolon: true }; dialog.show(); } }) } }) const optimizeModel = new Action('figura_optimize_model', { name: 'Optimize Model', icon: 'fa-gear', condition: { method: () => Format == format }, click() { new Dialog('figura_optimize_model_dialog', { title: "Optimize Model", form: { clear_unused_pivots: { type: "checkbox", label: "Clear Unused Pivot Data", description: "If a cube does not have a rotation, set the pivot point to the origin.\nFigura does not store pivot points at the origin, resulting in saved bytes", value: true, nocolon: true, } }, onConfirm(form_result) { Undo.initEdit({ elements: Cube.all }) if (form_result.clear_unused_pivots) { Cube.all.forEach((cube) => { if (cube.rotation.allEqual(0)) { cube.origin.V3_set(0, 0, 0) } }) Canvas.updatePositions(Cube.all) } Undo.finishEdit('Optimize Model'); } }).show() } }) const validateFaces = new ValidatorCheck('figura_mesh_face_rule', { update_triggers: ['update_selection'], condition: { method: (context) => Format === format && Mesh.hasAny() }, run() { Mesh.all.forEach(mesh => { mesh.forAllFaces(face => { if (![3, 4].includes(face.vertices.length)) { this.fail({ message: `Mesh ${mesh.name} has invalid face ${face.getFaceKey()} with ${face.vertices.length} vertices`, buttons: [{ name: "Select Mesh", icon: "fa-gem", click() { mesh.select() BarItems.selection_mode.change('face') // It works best when I select all possible selections, even though I only need to select faces. let selectedVertices = mesh.getSelectedVertices(true) selectedVertices.empty() selectedVertices.push(...face.vertices) let selectedEdges = mesh.getSelectedEdges(true) selectedEdges.empty() for (i = 0; i < face.vertices.length; i++) selectedEdges.push([face.vertices[i], face.vertices[(i + 1) % face.vertices.length]]) let selectedFaces = mesh.getSelectedFaces(true) selectedFaces.empty() selectedFaces.push(face.getFaceKey()) // UV Editor for completeness UVEditor.vue.selected_faces.empty(); UVEditor.vue.selected_faces.safePush(face.getFaceKey()); updateSelection() Validator.dialog.hide() } }] }) } }) }) } }) const validateTextureNames = new ValidatorCheck('figura_duplicate_texture_name_rule', { update_triggers: ['add_texture', 'update_selection'], condition: { method: (context) => Format === format && Texture.all.length > 0 }, run() { let textureCount = Texture.all.reduce((arr, t) => { if (arr[t.name]) arr[t.name]++ else arr[t.name] = 1 return arr }, {}) for (const [name, cnt] of Object.entries(textureCount)) if (cnt > 1) this.fail({ message: `${cnt} textures have the name "${name}". Figura does not support textures with duplicate names` }) } }) const arbitraryGroupNames = new Setting('figura_allow_duplicate_names', { name: "Allow arbitrary group names", description: "Enabling this removes the group name restrictions imposed by Blockbench. This can break Animations. Figura Model Format is not liable for any harm caused by this setting. You have been warned.", category: 'edit', type: 'toggle', value: false }) Cube.prototype.menu.addAction(copyPathModelPart, '#manage'); Mesh.prototype.menu.addAction(copyPathModelPart, '#manage'); Group.prototype.menu.addAction(copyPathModelPart, '#manage'); Animation.prototype.menu.addAction(copyPathAnimation, '#properties'); Texture.prototype.menu.addAction(copyPathTextures, '#properties'); MenuBar.menus.uv.addAction(recalculateUV) MenuBar.menus.animation.addAction(importAnimations, '#file') MenuBar.menus.tools.addAction(optimizeModel) toDelete.push( copyPathModelPart, copyPathAnimation, copyPathTextures, recalculateUV, importAnimations, validateFaces, validateTextureNames, arbitraryGroupNames, optimizeModel, ) // Removes the FileName in the Project dialog ModelProject.properties.name.condition = () => Format != format // Removed the Render Order field from the Right Click context menu. const elementRenderOrderCondition = BarItems.element_render_order.condition BarItems['element_render_order'].condition = () => Format === format ? false : elementRenderOrderCondition() // Change the default name of new Animations from `animation.model.new` to just `new` const addAnimationClick = BarItems['add_animation'].click BarItems['add_animation'].click = function () { if (Format !== format) addAnimationClick.call(this) else new Animation({ name: 'new', saved: false }).add(true).propertiesDialog() } // Add a popup when clicking on Export Textures to notify new users const exportAnimationClick = BarItems['export_animation_file'].click BarItems['export_animation_file'].click = function (...args) { let button = this if (Format !== format) { exportAnimationClick.call(button, ...args) return } new Dialog({ id: "figura_confirm_export_animation", title: "Confirm Export Animations", lines: [ "

    Figura does not read these exported Animation files.

    ", "

    Figura reads animations directly from the Blockbench file itself.

    ", "

    The Export Animmations button should only be used when transfering animations from one bbmodel to another.

    ", "

    Otherwise, do not touch this button.

    ", "

    Do you understand, and want the exported animations anyways?

    " ], onConfirm() { exportAnimationClick.call(button, ...args) } }).show() } const name_regex = Group.prototype.name_regex, needsUniqueName = Group.prototype.needsUniqueName Group.prototype.name_regex = () => (Format === format && arbitraryGroupNames.value) ? false : name_regex(); Group.prototype.needsUniqueName = () => (Format === format && arbitraryGroupNames.value) ? false : needsUniqueName(); const showMessageBox = Blockbench.showMessageBox Blockbench.showMessageBox = function (options, callback) { if (Format === format && arbitraryGroupNames.value && options.translateKey == "duplicate_groups") return showMessageBox.apply(this, [options, callback]) } // Remove the Texture Render Mode field from the Right Click context menu. Texture.prototype.menu.structure.find(v => v.name == 'menu.texture.render_mode').condition = () => Format !== format // In the Texture Properties Dialog specifically, remove the Render Mode field const DialogBuild = Dialog.prototype.build Dialog.prototype.build = function () { if (Format === format && this.id == 'texture_edit') delete this.form.render_mode DialogBuild.call(this) } // Prevents the Timeline from erroring when Sound and Particle channels are removed const displayFrame = EffectAnimator.prototype.displayFrame EffectAnimator.prototype.displayFrame = function () { if (Format === format) return displayFrame.call(this) } // Remove molang validation, as Figura uses Lua not molang const molangSyntax = Validator.checks.find(element => element.id == 'molang_syntax') if (molangSyntax) { let method = molangSyntax.condition.method molangSyntax.condition.method = (context) => Format === format ? false : (method ? method(context) : false) } }, onunload() { for (const deletable of toDelete) deletable.delete() } }); })() ================================================ FILE: plugins/free_rotation/about.md ================================================

    This format is designed to create Minecraft: Java Edition item models without the rotation limitations imposed by the game.

    These models cannot be re-imported, so make sure to save your project as a bbmodel.

    This format requires Minecraft 1.21.4 or later.

    Usage:

    To use this plugin, start by creating a new model, or converting an existing cube based project into this format.

    Configure the display settings. These will be respected as long as the size limits are not reached.

    Use File > Export > Free Rotation Item to export your model into your resource pack.

    When exporting, select which display slots you would like to export. The more you export, the larger the file size, so only export what you need.

    ================================================ FILE: plugins/free_rotation/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2024-12-20", "author": "Godlander & Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.0.1": { "title": "1.0.1", "date": "2025-01-22", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed changelog tab not showing up on the plugin page" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2025-03-25", "author": "Godlander & Ewan Howell", "categories": [ { "title": "New Features", "list": [ "GUI Light is now supported", "Changing namespace is now supported" ] }, { "title": "Bug Fixes", "list": [ "Fixed rotations not being exported when display settings were not customised" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] } ] }, "1.2.1": { "title": "1.2.1", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the export dialog failing to open" ] } ] } } ================================================ FILE: plugins/free_rotation/free_rotation.js ================================================ (() => { const path = require("node:path") let fs, codec, format, action, properties, styles, oldGUILightCondition const id = "free_rotation" const name = "Free Rotation" const icon = "3d_rotation" const description = "Create Java Item models without any rotation limitations." const links = { websiteGodlander: { text: "By Godlander", link: "https://github.com/Godlander", icon: "fab.fa-github", colour: "#6E40C9" }, discordGodlander: { text: "Godlander's Discord", link: "https://discord.gg/2s6th9SvZd", icon: "fab.fa-discord", colour: "#727FFF" }, websiteEwan: { text: "By Ewan Howell", link: "https://ewanhowell.com/", icon: "language", colour: "#33E38E" }, discordEwan: { text: "Ewan's Discord", link: "https://discord.ewanhowell.com/", icon: "fab.fa-discord", colour: "#727FFF" } } let directory if (SystemInfo.platform === "win32") { directory = PathModule.join(SystemInfo.appdata_directory, ".minecraft") } else if (SystemInfo.platform === "darwin") { directory = PathModule.join(SystemInfo.home_directory, "Library", "Application Support", "minecraft") } else { directory = PathModule.join(SystemInfo.home_directory, ".minecraft") } Plugin.register(id, { title: name, icon: "icon.png", author: "Godlander & Ewan Howell", description, tags: ["Minecraft: Java Edition", "Items", "Rotation"], version: "1.2.1", min_version: "5.0.0", variant: "desktop", await_loading: true, website: "https://ewanhowell.com/plugins/free-rotation/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/free_rotation", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Free Rotation]", creation_date: "2024-12-20", has_changelog: true, onload() { fs = require("fs", { message: "This permission is required for exporting your free rotation models.", optional: false }) if (!fs) { throw new Error("fs access denied") } styles = Blockbench.addCSS(` #format_page_free_rotation { padding-bottom: 0; } #format_page_free_rotation .format_target { margin-bottom: 6px; } #format_page_free_rotation div:nth-child(3), #format_page_free_rotation content { overflow-y: auto; } .format_entry[format="free_rotation"] i { overflow: visible; } .free-rotation-links { display: flex; justify-content: space-around; margin: 20px 35px 0; } .free-rotation-links * { cursor: pointer; } .free-rotation-links > a { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 5px; text-decoration: none; flex-grow: 1; flex-basis: 0; color: var(--color-subtle_text); text-align: center; } .free-rotation-links > a:hover { background-color: var(--color-accent); color: var(--color-light); } .free-rotation-links > a > i { font-size: 32px; width: 100%; max-width: initial; height: 32px; text-align: center; } .free-rotation-links > a:hover > i { color: var(--color-light) !important; } .free-rotation-links > a > p { flex: 1; display: flex; align-items: center; } `) codec = new Codec("free_rotation_codec", { name: "Free Rotation Codec", remember: true, export() { const project = Project for (const texture of Texture.all) { if (!texture.saved) texture.save() } const dialog = new Dialog({ id: "free_rotation_export_prompt", title: "Free Rotation Export", buttons: [], lines: [``], component: { data: { ModelProject, project, exportAllowed: false, idError: "", nameError: "", displayIcons: { thirdperson_lefthand: { icon: "accessibility" }, thirdperson_righthand: { icon: "accessibility" }, firstperson_lefthand: { icon: "person" }, firstperson_righthand: { icon: "person" }, head: { icon: "sentiment_satisfied" }, ground: { icon: "icon-ground", iconType: "custom" }, fixed: { icon: "filter_frames" }, gui: { name: "GUI", icon: "border_style" } } }, methods: { check() { if (project.free_rotation_namespace.match(/[^a-z0-9\._-]/)) { this.namespaceError = "The Namespace can only include the following characters:
    a-z, 0-9, _, -, ." } else { this.namespaceError = "" } if (!project.free_rotation_item) { this.idError = "The Item ID is required" } else if (project.free_rotation_item.match(/[^a-z0-9\._-]/)) { this.idError = "The Item ID can only include the following characters:
    a-z, 0-9, _, -, ." } else { this.idError = "" } if (!project.free_rotation_name) { this.nameError = "The Model Name is required" } else if (project.free_rotation_name.match(/[^a-z0-9\._-]/)) { this.nameError = "The Model Name can only include the following characters:
    a-z, 0-9, _, -, ." } else { this.nameError = "" } if (this.namespaceError || this.idError || this.nameError) { this.exportAllowed = false return } this.exportAllowed = true }, async exportModel() { dialog.close() const dir = Blockbench.pickDirectory({ title: "Select resource pack to export to", startpath: project.free_rotation_path }) if (!dir) return const namespace = Project.free_rotation_namespace || "minecraft" const definitionDir = path.join(dir, "assets", namespace, "items") const definitionFile = path.join(definitionDir, project.free_rotation_item + ".json") const modelDir = path.join(dir, "assets", namespace, "models", project.free_rotation_name) if (fs.existsSync(definitionFile)) { const check = await new Promise(fulfil => { Blockbench.showMessageBox({ title: "Item definition already exists", message: `The item definition assets/${namespace}/items/${project.free_rotation_item}.json already exists. Are you sure you want to continue and overwrite it?`, buttons: ["dialog.confirm", "dialog.cancel"] }, button => { if (button === 0) fulfil(true) else fulfil() }) }) if (!check) return } if (fs.existsSync(modelDir)) { const check = await new Promise(fulfil => { Blockbench.showMessageBox({ title: "Model already exists", message: `The the model folder assets/${namespace}/models/${project.free_rotation_name} already exists. Are you sure you want to continue and possibly overwrite files inside it?`, buttons: ["dialog.confirm", "dialog.cancel"] }, button => { if (button === 0) fulfil(true) else fulfil() }) }) if (!check) return } const processing = new Dialog("exporting", { title: "Exporting...", lines: [ ``, "

    Exporting...

    " ], buttons: [], cancel_on_click_outside: false, onConfirm: () => false }).show() const close = processing.close processing.close = () => {} fs.mkdirSync(definitionDir, { recursive: true }) fs.mkdirSync(modelDir, { recursive: true }) const models = await codec.compile(project) const definition = { model: { type: "composite", models: new Array(models.length).fill().map((e, i) => ({ type: "model", model: `${namespace}:${project.free_rotation_name}/${i}` })) } } fs.writeFileSync(definitionFile, autoStringify(definition)) for (const [i, model] of models.entries()) { fs.writeFileSync(path.join(modelDir, `${i}.json`), model) } Blockbench.showQuickMessage("Exported free rotation model") close.bind(processing)() } }, template: `

    Model Details

    Display Settings to Export

    Free Rotation models can be quite large in file size. Select only the display settings you need in order to reduce this file size.

    {{ displayIcons[key]?.name || key.replace(/_/g, " ").split(" ").map(e => e.slice(0, 1).toUpperCase() + e.slice(1)).join(" ") }}
    {{ displayIcons[key]?.icon || 'desktop_windows' }}
    ` }, onOpen() { if (project.free_rotation_item || project.free_rotation_name) { this.content_vue.check() } } }).show() }, async compile(project) { project ??= Project project.select() const mode = Modes.selected Modes.options.edit.select() let maxcoord = 24 const cubes = Cube.all.filter(e => e.export) for (const cube of cubes) { for (const position of cube.getGlobalVertexPositions()) { for (const coord of position) { maxcoord = Math.max(maxcoord, Math.abs(coord - 8)) } } } const downscale = Math.min(4, maxcoord / 24) const models = [] for (const cube of cubes) { const element = {} const model = { textures: {}, elements: [element], display: {} } if (project.front_gui_light) model.gui_light = "front" let size = [ (cube.to[0] - cube.from[0]) / downscale, (cube.to[1] - cube.from[1]) / downscale, (cube.to[2] - cube.from[2]) / downscale ] element.from = [ 8 - (size[0] / 2), 8 - (size[1] / 2), 8 - (size[2] / 2) ] element.to = [ 8 + (size[0] / 2), 8 + (size[1] / 2), 8 + (size[2] / 2) ] element.light_emission = cube.light_emission element.faces = {} for (const [face, data] of Object.entries(cube.faces)) { if (!data || !data.texture) continue const renderedFace = {} if (data.enabled) { renderedFace.uv = data.uv .slice() .map((v, i) => (v * 16) / UVEditor.getResolution(i % 2)) } if (data.rotation) renderedFace.rotation = data.rotation if (data.texture) { const texture = project.textures.find(e => e.uuid == data.texture) if (!texture) { console.error("Texture not found... skipping") } else { renderedFace.texture = "#" + texture.id const path = texture.source.replaceAll(/\\/g, "/") const parts = path.split("/") const assetsIndex = parts.indexOf("assets") if (assetsIndex === -1) model.textures[texture.id] = "unknown" else { const namespace = parts[assetsIndex + 1] const resourcePath = parts.slice(assetsIndex + 3, -1).join("/") model.textures[texture.id] = namespace + ":" + resourcePath + "/" + texture.name.slice(0, -4) } } } if (data.tint >= 0) renderedFace.tintindex = data.tint element.faces[face] = renderedFace } const quat = new THREE.Quaternion() cube.mesh.getWorldQuaternion(quat) const rotation = new THREE.Quaternion() for (const slot of DisplayMode.slots) { if (project.free_rotation_display[slot]) { const scale = new THREE.Vector3(downscale, downscale, downscale) const translation = cube.getWorldCenter() translation.y -= 8 const display = project.display_settings[slot] if (display) { const dscale = new THREE.Vector3().fromArray(display.scale) const dtranslation = new THREE.Vector3().fromArray(display.translation) const drotation = new THREE.Quaternion().setFromEuler( new THREE.Euler().fromArray([ Math.degToRad(display.rotation[0]), Math.degToRad(display.rotation[1]), Math.degToRad(display.rotation[2]) ], "XYZ") ) scale.multiply(dscale) rotation.multiplyQuaternions(drotation, quat) translation.multiply(dscale) translation.applyQuaternion(drotation) translation.add(dtranslation) } else { rotation.copy(quat) } model.display[slot] = { rotation: (new THREE.Euler()).setFromQuaternion(rotation, "XYZ").toArray().slice(0,3).map(e => Math.radToDeg(e)), translation: translation.toArray(), scale: scale.toArray() } } } models.push(autoStringify(model)) } mode.select() return models } }) format = new ModelFormat({ id: "free_rotation", name: "Free Rotation Item", extension: "json", icon: "3d_rotation", category: "minecraft", format_page: { component: { methods: { create: () => format.new() }, template: `

    ${description}

    Target : Minecraft: Java Edition

    About:

    • This format is designed to create Minecraft: Java Edition item models without the rotation limitations imposed by the game.
    • These models cannot be re-imported, so make sure to save your project as a bbmodel.
    • This format requires Minecraft 1.21.4 or later.

    Usage:

    • Create a new model, or convert an existing cube based project into this format.
    • Configure the display settings. These will be respected as long as the size limits are not reached.
    • Use File > Export > Free Rotation Item to export your model into your resource pack.
    • When exporting, select which display slots you would like to export. The more you export, the larger the file size, so only export what you need.

    ` } }, render_sides: "front", model_identifier: false, parent_model_id: true, vertex_color_ambient_occlusion: true, bone_rig: true, rotate_cubes: true, optional_box_uv: true, uv_rotation: true, java_cube_shading_properties: true, java_face_properties: true, cullfaces: true, animated_textures: true, select_texture_for_particles: true, texture_mcmeta: true, display_mode: true, texture_folder: true, codec }) codec.format = format action = new Action("free_rotation_export", { name: "Export Free Rotation Item", icon: "3d_rotation", condition: { formats: [format.id] }, click: () => codec.export() }) MenuBar.addAction(action, "file.export.0") properties = [ new Property(ModelProject, "string", "free_rotation_namespace", { label: "Namespace", description: "The namespace the model will be exported to", default: "minecraft", condition: { formats: [format.id] } }), new Property(ModelProject, "string", "free_rotation_item", { label: "Item ID", description: "The item ID of the item that the model should apply to", condition: { formats: [format.id] } }), new Property(ModelProject, "string", "free_rotation_name", { label: "Model Name", description: "The name of the model file that is output", condition: { formats: [format.id] } }), new Property(ModelProject, "string", "free_rotation_path", { label: "Export Path", default: directory, condition: { formats: [format.id] }, exposed: false }), new Property(ModelProject, "object", "free_rotation_display", { default: { thirdperson_lefthand: true, thirdperson_righthand: true, firstperson_lefthand: true, firstperson_righthand: true, head: true, ground: true, fixed: true, gui: true }, label: "Display Settings", condition: { formats: [format.id] }, exposed: false }) ] oldGUILightCondition = BarItems.gui_light.condition BarItems.gui_light.condition = () => Format.id === id || oldGUILightCondition() }, onunload() { if (oldGUILightCondition) { BarItems.gui_light.condition = oldGUILightCondition codec.delete() format.delete() action.delete() styles.delete() properties.forEach(e => e.delete()) } } }) })() ================================================ FILE: plugins/free_rotation/members.yml ================================================ maintainers: - ewanhowell5195 - Godlander ================================================ FILE: plugins/geckolib/README.md ================================================ # GeckoLib Animation Utils Developer Readme This readme is intended for developers wishing to work on the GeckoLib plugin. # Environment setup ## Windows Inspect the contents of [.nvmrc](./src/.nvmrc) - this specifies the recommended version of Node.JS to use for plugin development. You can [download the corresponding version of Node.JS here](https://nodejs.org/en/download/releases). ## macOS and Unix It's recommended, though not required, to install the correct version of Node.JS using the Node Version Manager script (nvm). [Follow the install guide here](https://github.com/nvm-sh/nvm/blob/master/README.md). A brief summary of how to use `nvm` once it's installed is to `cd` into the [src](./src) folder of the plugin and then run: ``` nvm install `cat .nvmrc` ``` followed by: ``` nvm use ``` If you have multiple versions of node installed on your system, it may be convenient to [change the default version to the version of node you just installed](https://github.com/nvm-sh/nvm/blob/master/README.md#set-default-node-version). Otherwise you may need to run `nvm use` every time you start a new terminal session. If you are using `nvm` for other projects with other versions of node, you can also use a [shell hook script to automatically run nvm use when changing directories](https://stackoverflow.com/questions/23556330/run-nvm-use-automatically-every-time-theres-a-nvmrc-file-on-the-directory). You can confirm the active node version by running ``` node --version ``` ## All Platforms After Node.JS has been installed, run: ``` npm install ``` Inside the `src` folder. You should run this command any time there has been a change to `package.json`. You might see a diff on `package-lock.json`. This is usually OK and indicates an update to transient dependenices, and should be OK to commit. If you see a LOT of changes to this file it might be an indication you are using the wrong version of node/npm. # Developing the plugin ## Working on the plugin First, start the development webpack bundler: ``` npm start ``` The development bundler will watch the filesystem for changes and automatically re-build the plugin to [geckolib.js](./geckolib.js). Then, you can load the plugin in Blockbench from `File` -> `Plugins` and selecting the `Load Plugin from File` button. Every time you make a change to the plugin source code, the bundler will automatically rebuild the plugin, but you still need to reload it in Blockbench in order for the changes to take effect. You can do this by selecting `Help` -> `Developer` -> `Reload Plugins`. In some cases if the global state has been messed up, you may need to reload the entire application using `Help` -> `Developer` -> `Reload Blockbench`. It's also recommended to select `Open Dev Tools` from this menu as it can be very helpful to explore the Blockbench API using the console and inspect error logs and debug breakpoints. As every time you load the plugin, it's considered by the JS interpreter to be a different source file, any breakpoints set on the previously loaded file will be lost. You can work around this by adding a `debugger;` statement inside the source code where you want to set a breakpoint, which will force the JS interpreter to break on that line. If a TypeScript compiler error is encountered, it will be logged to the terminal window, but the JS bundle will still be generated. To check for errors, you can run: ``` npm run test ``` This will run all pretest scripts (eslint and TypeScript type check) as well as unit tests. It's also possible to run pretest separately, or the individual checks by themselves. To see all available npm scripts, run: ``` npm run ``` ## Building a release of the plugin First, inspect [package.json](./src/package.json) to make sure all the properties are correct. If you are making a release of the plugin, you should bump the `version` property to be one minor version up for a bugfix, minor version for new features, or major version for backwards-incompatible breaking changes. Then, check the `pluginOptions` section. `min_version` should be the lowest version of Blockbench the plugin is known to work with and `max_version` should be the first version the plugin is expected to not work with that's higher than the versions it was tested on. When the metadata is ready, run: ``` npm run build ``` This will first run prebuild/pretest/test scripts, then build the plugin and automatically update the [plugins.json](../../plugins.json) manifest with your settings. Then, update the [changelog](./changelog.json) to add patch notes for the new version. New version entries go at the bottom. Double-check everything looks right, then commit and make a PR to [JannisX11/blockbench-plugins](https://github.com/JannisX11/blockbench-plugins) to release the plugin. Note that it is possible to skip pre-build scripts by running: ``` npm run build:only ``` This is dangerous and shouldn't be done to make a full release, it's better to fix any errors from tests, lint, and compiler before publishing changes. ## Using TypeScript The plugin is now written using a loose version of [TypeScript](https://www.typescriptlang.org/docs/handbook/intro.html). Blockbench types are supplied by the [blockbench-types](https://github.com/JannisX11/blockbench-types) package. Note that these types are hand-written and may contain errors or be missing certain APIs. So just because you see an error message in your IDE or the bundler output doesn't neccessarily mean your code is wrong, it's possible it could be an issue with the type definitions. TypeScript errors won't prevent the plugin from being built so you can always test your code manually and/or inspect the [Blockbench source code](https://github.com/JannisX11/blockbench) to confirm the code is correct. If there's an error in the types, there are a few ways of fixing it: 1. Make a PR to `blockbench-types`. This is the best, although possibly the slowest method of fixing type errors, and will help all other plugin authors. * These changes can be tested locally first using `npm link`. To do so, clone the repo and ensure the same node version is being used as the one for the plugin. Then run `npm link` inside `blockbench-types`. Finally, run `npm link blockbench-types` inside the plugin `src` folder. This will create a symbolic link inside `node_modules` so that the types are resolved from your local copy of `blockbench-types`. You need to run `npm link blockbench-types` after every time you run `npm install` because an install overwrites the symlink. 1. Massage the types inside the plugin. There are a number of ways you can do this, such as: * Use [type assertions (aka casting)](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions). Performing an `as` cast directly into the target type is the safest method. If neccessary, casting via `as unknown as ` will cause the compiler to ignore insufficient overlap between types. It's also possible to attempt to change the type of a function parameter or inferred variable type by adding a type annotation, such as: ```typescript (kf: GeckolibKeyframe) => { } // Otherwise kf would be a Keyframe ``` or ```typescript let easingBar: HTMLElement = document.createElement('div'); // Otherwise this would be an HTMLDivElement ``` * Subclassing a blockbench type (for an example of this see usage of the `GeckolibBoneAnimator` in [codec.ts](./src/codec.ts)). * Performing [type narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html). * There are other options, such as [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#handbook-content). 1. The nuclear option when all else fails: slap a `// @ts-ignore` comment above the problematic line(s). This is a bit dangerous as it shuts off ALL type checking on on that line, but sometimes this is necessary if you need to just force the compiler to ignore a problematic area of the code. Some places that are good to look for help with TypeScript are the [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html), [TypeScript Discord](https://discord.com/invite/typescript), or you can ping Eliot on the GeckoLib Discord. # Working with ESLint [ESLint](https://eslint.org) is a tool for checking the code for common errors or problematic coding styles. It can be integrated into IDEs via plugins, and can be run from the terminal like so: ``` npm run lint ``` Some lint errors can be fixed automatically by running: ``` npm run lint:fix ``` It's best to fix errors by changing the source code when possible. There are some cases in which certain lint rules might get in the way of particular things we might need to do in the plugin. In this case, [the rules can be disabled for different scopes](https://eslint.org/docs/latest/use/configure/rules). It's best to keep the scope as small as possible, so disabling individual rules per-line is the best way to start, or if it's needed in a larger area, disabling individual rules for a block of code, then lastly a whole file. You can search the code for `eslint-disable` to find examples. In some cases it may be necessary to disable a rule for the entire codebase, this can be done in the `rules` block of the [.eslintrc.cjs](./src/.eslintrc.cjs) file. ================================================ FILE: plugins/geckolib/about.md ================================================ GeckoLib Blockbench plugin for the GeckoLib animation and rendering library mod for Minecraft: Java edition. This plugin allows you to create and edit model and animation assets for GeckoLib-based mods, utilising Blockbench's live animation editor and other editing tools. Utilise native support for resourcepack-able controller-based animations, mathematical expressions, easings, and more to create armour, items, entities, blocks, and anything else you can think of! Must be paired with a Mod for Minecraft: Java utilising the GeckoLib library.

    Links:

    ================================================ FILE: plugins/geckolib/changelog.json ================================================ { "3.0.7": { "title": "3.0.7", "author": "Eliot Lash", "categories": [ { "title": "Changes", "list": [ "Disable minification of JS bundle, fix some build errors on case sensitive filesystems, and upgrade to NodeJS v16.16" ] }, { "title": "Bug Fixes", "list": [ "Don't save `geckolib_format_version` in animation json for bedrock models", "Remove hold menu hiding code that was causing issues for other plugins (regression of an old bug occurred in version 3.0.6)" ] } ] }, "3.1.0": { "title": "3.1.0", "author": "Eliot Lash", "categories": [ { "title": "New Features", "list": [ "Added support for \"Reverse Keyframes\" action" ] }, { "title": "Changes", "list": [ "Update to new plugin format, bump minimum Blockbench version to 4.8.0", "Ported plugin to TypeScript, added developer README and a few unit tests" ] } ] }, "3.1.1": { "title": "3.1.1", "author": "Tslat", "categories": [ { "title": "Bug Fixes", "list": [ "Fix the item display settings being cleared if saving as an entity type model", "Fix the armour template having swapped pivot points on the legs", "Fix incorrect importing of loop type. Closes [#591](https://github.com/bernie-g/geckolib/issues/591)" ] } ] }, "3.2": { "title": "3.2", "author": "Tslat", "categories": [ { "title": "New Features", "list": [ "Auto-export the particle texture entry in the textures list for block/item display jsons if not defined", "Auto-convert bedrock animation jsons to GeckoLib-supported animation jsons when exporting" ] }, { "title": "Bug Fixes", "list": [ "Fix the particle texture entry not exporting if the name doesn't end in .png", "Fixed item_display_transforms being shipped with .geo jsons for non-bedrock models", "Forced known forward-compatible versions to export as 1.12.0 to maintain compatibility while we work out a better system" ] } ] }, "3.2.1": { "title": "3.2.1", "author": "Tslat", "categories": [ { "title": "Bug Fixes", "list": [ "Fix some animation exporting issues with specific animation setup cases" ] } ] }, "4.0": { "title": "4.0", "date": "2024-10-06", "author": "Tslat", "categories": [ { "title": "New Features", "list": [ "Overhauled the new project window, adding new settings and a much more dynamic experience", "Add export of animations json from File -> Export menu for GeckoLib projects", "Add plugin setting for default modid for projects", "Add plugin setting for forcing the Display tab to be visible", "Add plugin setting for auto-computing the particle texture when otherwise unspecified for item display jsons", "Add plugin setting for auto-converting Bedrock-format animations to GeckoLib-format animations when exporting to json, if relevant", "New GeckoLib models will now state their model type in the tab name", "Auto-apply modid and parent folder prefix to texture path in display settings", "Remember export locations for model, animations and item display settings per-project, independently" ] }, { "title": "Changes", "list": [ "Allow exporting of item display settings if the model has them set, even if not in block/item mode", "Skip auto-exporting particle entry for item display if not a valid path", "Don't store filepath in BB project", "Don't include .item in exported display jsons by default", "Updated the plugin's about panel", "Updated the plugin's icon", "Added api-supported changelog", "Tweaked various information and tooltip entries to be more clear", "Large internal cleanup", "Don't print plugin load console line until plugin is actually loaded", "The Display tab will now disappear/reappear correctly when switching between projects" ] }, { "title": "Bug Fixes", "list": [ "Fix Geckolib item/block models not displaying properly in the display tab", "Fix the item model parent sometimes not being applied" ] } ] }, "4.0.1": { "title": "4.0.1", "author": "Zigy, Squishy", "categories": [ { "title": "Changes", "list": [ "Keyframes now have different icons based on their easing.", "Easing arguments are now reset upon choosing a new easing. Fixes [#690](https://github.com/bernie-g/geckolib/issues/690)", "Fixed a typo where the circle easing was spelled cicle instead." ] } ] }, "4.0.2": { "title": "4.0.2", "author": "Zigy", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the plugin not working on web." ] } ] }, "4.1.0": { "title": "4.1.0", "author": "Zigy", "categories": [ { "title": "Changes", "list": [ "Added support for bezier, step, and smooth (Catmull-Rom) keyframes!" ] }, { "title": "Bug Fixes", "list": [ "Fixed incorrect armor template pivots. Fixes [#527](https://github.com/bernie-g/geckolib/issues/527)" ] } ] }, "4.2.0": { "title": "4.2.0", "author": "Tslat", "categories": [ { "title": "Changes", "list": [ "Rename to GeckoLib", "Update to support Blockbench 5.0.0", "General internal cleanup", "Skip `Auto-compute block/item particle texture` at export time if no mod-id set", "Default the `Auto-compute block/item particle texture` to false to reduce runtime errors from unaware devs" ] }, { "title": "Bug Fixes", "list": [ "Require Blockbench to fully load the plugin before running, preventing race conditions on format availability", "Fixed GeckoLib item display settings sometimes not exporting with the parent set" ] } ] }, "4.2.1": { "title": "4.2.1", "author": "Tslat", "categories": [ { "title": "Bug Fixes", "list": [ "Fix Blockbench exporting empty quotes instead of keyframe values some keyframes", "Fix Blockbench failing to export animations files for some specific models", "Fix the keyframe panel selector not updating properly" ] } ] }, "4.2.2": { "title": "4.2.2", "author": "Tslat", "categories": [ { "title": "Changes", "list": [ "Added support for auto-creating the .png.mcmeta file for animated textures" ] }, { "title": "Bug Fixes", "list": [ "Fixed the model type property not saving/loading/applying properly", "Fixed the broken plugin description page image for UK users", "Fixed UV face rotation not showing when editing textures" ] } ] }, "4.2.3": { "title": "4.2.3", "author": "Tslat", "categories": [ { "title": "Bug Fixes", "list": [ "Further fix situations where the model type property would not save properly", "Fixed an issue with importing animations with sound keyframes", "Properly update the project's settings when converting from another format to GeckoLib" ] } ] }, "4.2.4": { "title": "4.2.4", "author": "Zigy", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed an issue where some keyframe icons displayed incorrectly." ] } ] }, "4.2.5": { "title": "4.2.5", "author": "matmat37000", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed an issue where importing an existing animation.json file will cause GeckoLib frame keys to be reset." ] } ] } } ================================================ FILE: plugins/geckolib/geckolib.js ================================================ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css": /*!******************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css ***! \******************************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/getUrl.js */ "./node_modules/css-loader/dist/runtime/getUrl.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;base64,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 */ "data:font/woff2;base64,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"), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, `@font-face { font-family: 'geckolib_icomoon'; font-weight: normal; font-style: normal; src: url(${___CSS_LOADER_URL_REPLACEMENT_0___}) format("woff2"); } [class^="easing-"]:not(.fa), [class*=" easing-"]:not(.fa) { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'geckolib_icomoon' !important; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; max-width: 24px; margin-top: 4px; font-size: 14px; margin-left: -1px; pointer-events: none; display: block; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .easing-linear:before { content: "\\e925"; } .easing-step:before { content: "\\e921"; } .easing-in_sine:before { content: "\\e915"; } .easing-out_sine:before { content: "\\e916"; } .easing-in_out_sine:before { content: "\\e917"; } .easing-in_quad:before { content: "\\e900"; } .easing-out_quad:before { content: "\\e901"; } .easing-in_out_quad:before { content: "\\e902"; } .easing-in_cubic:before { content: "\\e903"; } .easing-out_cubic:before { content: "\\e904"; } .easing-in_out_cubic:before { content: "\\e905"; } .easing-in_quart:before { content: "\\e906"; } .easing-out_quart:before { content: "\\e907"; } .easing-in_out_quart:before { content: "\\e908"; } .easing-in_quint:before { content: "\\e909"; } .easing-out_quint:before { content: "\\e90a"; } .easing-in_out_quint:before { content: "\\e90b"; } .easing-in_expo:before { content: "\\e90c"; } .easing-out_expo:before { content: "\\e90d"; } .easing-in_out_expo:before { content: "\\e90e"; } .easing-in_circ:before { content: "\\e90f"; } .easing-out_circ:before { content: "\\e910"; } .easing-in_out_circ:before { content: "\\e911"; } .easing-in_back:before { content: "\\e918"; } .easing-out_back:before { content: "\\e919"; } .easing-in_out_back:before { content: "\\e91a"; } .easing-in_elastic:before { content: "\\e91b"; } .easing-out_elastic:before { content: "\\e91c"; } .easing-in_out_elastic:before { content: "\\e91d"; } .easing-in_bounce:before { content: "\\e91e"; } .easing-out_bounce:before { content: "\\e91f"; } .easing-in_out_bounce:before { content: "\\e920"; }`, ""]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./node_modules/css-loader/dist/runtime/api.js": /*!*****************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/api.js ***! \*****************************************************/ /***/ ((module) => { "use strict"; /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ "./node_modules/css-loader/dist/runtime/getUrl.js": /*!********************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/getUrl.js ***! \********************************************************/ /***/ ((module) => { "use strict"; module.exports = function (url, options) { if (!options) { options = {}; } if (!url) { return url; } url = String(url.__esModule ? url.default : url); // If url is already wrapped in quotes, remove them if (/^['"].*['"]$/.test(url)) { url = url.slice(1, -1); } if (options.hash) { url += options.hash; } // Should url be wrapped? // See https://drafts.csswg.org/css-values-3/#urls if (/["'() \t\n]|(%20)/.test(url) || options.needQuotes) { return "\"".concat(url.replace(/"/g, '\\"').replace(/\n/g, "\\n"), "\""); } return url; }; /***/ }), /***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js": /*!**************************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***! \**************************************************************/ /***/ ((module) => { "use strict"; module.exports = function (i) { return i[1]; }; /***/ }), /***/ "./node_modules/lodash/_DataView.js": /*!******************************************!*\ !*** ./node_modules/lodash/_DataView.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var DataView = getNative(root, 'DataView'); module.exports = DataView; /***/ }), /***/ "./node_modules/lodash/_Hash.js": /*!**************************************!*\ !*** ./node_modules/lodash/_Hash.js ***! \**************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var hashClear = __webpack_require__(/*! ./_hashClear */ "./node_modules/lodash/_hashClear.js"), hashDelete = __webpack_require__(/*! ./_hashDelete */ "./node_modules/lodash/_hashDelete.js"), hashGet = __webpack_require__(/*! ./_hashGet */ "./node_modules/lodash/_hashGet.js"), hashHas = __webpack_require__(/*! ./_hashHas */ "./node_modules/lodash/_hashHas.js"), hashSet = __webpack_require__(/*! ./_hashSet */ "./node_modules/lodash/_hashSet.js"); /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `Hash`. Hash.prototype.clear = hashClear; Hash.prototype['delete'] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; module.exports = Hash; /***/ }), /***/ "./node_modules/lodash/_ListCache.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_ListCache.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var listCacheClear = __webpack_require__(/*! ./_listCacheClear */ "./node_modules/lodash/_listCacheClear.js"), listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ "./node_modules/lodash/_listCacheDelete.js"), listCacheGet = __webpack_require__(/*! ./_listCacheGet */ "./node_modules/lodash/_listCacheGet.js"), listCacheHas = __webpack_require__(/*! ./_listCacheHas */ "./node_modules/lodash/_listCacheHas.js"), listCacheSet = __webpack_require__(/*! ./_listCacheSet */ "./node_modules/lodash/_listCacheSet.js"); /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `ListCache`. ListCache.prototype.clear = listCacheClear; ListCache.prototype['delete'] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; module.exports = ListCache; /***/ }), /***/ "./node_modules/lodash/_Map.js": /*!*************************************!*\ !*** ./node_modules/lodash/_Map.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var Map = getNative(root, 'Map'); module.exports = Map; /***/ }), /***/ "./node_modules/lodash/_MapCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_MapCache.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ "./node_modules/lodash/_mapCacheClear.js"), mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ "./node_modules/lodash/_mapCacheDelete.js"), mapCacheGet = __webpack_require__(/*! ./_mapCacheGet */ "./node_modules/lodash/_mapCacheGet.js"), mapCacheHas = __webpack_require__(/*! ./_mapCacheHas */ "./node_modules/lodash/_mapCacheHas.js"), mapCacheSet = __webpack_require__(/*! ./_mapCacheSet */ "./node_modules/lodash/_mapCacheSet.js"); /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `MapCache`. MapCache.prototype.clear = mapCacheClear; MapCache.prototype['delete'] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; module.exports = MapCache; /***/ }), /***/ "./node_modules/lodash/_Promise.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_Promise.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var Promise = getNative(root, 'Promise'); module.exports = Promise; /***/ }), /***/ "./node_modules/lodash/_Set.js": /*!*************************************!*\ !*** ./node_modules/lodash/_Set.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var Set = getNative(root, 'Set'); module.exports = Set; /***/ }), /***/ "./node_modules/lodash/_SetCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_SetCache.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"), setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ "./node_modules/lodash/_setCacheAdd.js"), setCacheHas = __webpack_require__(/*! ./_setCacheHas */ "./node_modules/lodash/_setCacheHas.js"); /** * * Creates an array cache object to store unique values. * * @private * @constructor * @param {Array} [values] The values to cache. */ function SetCache(values) { var index = -1, length = values == null ? 0 : values.length; this.__data__ = new MapCache; while (++index < length) { this.add(values[index]); } } // Add methods to `SetCache`. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; SetCache.prototype.has = setCacheHas; module.exports = SetCache; /***/ }), /***/ "./node_modules/lodash/_Stack.js": /*!***************************************!*\ !*** ./node_modules/lodash/_Stack.js ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), stackClear = __webpack_require__(/*! ./_stackClear */ "./node_modules/lodash/_stackClear.js"), stackDelete = __webpack_require__(/*! ./_stackDelete */ "./node_modules/lodash/_stackDelete.js"), stackGet = __webpack_require__(/*! ./_stackGet */ "./node_modules/lodash/_stackGet.js"), stackHas = __webpack_require__(/*! ./_stackHas */ "./node_modules/lodash/_stackHas.js"), stackSet = __webpack_require__(/*! ./_stackSet */ "./node_modules/lodash/_stackSet.js"); /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = this.__data__ = new ListCache(entries); this.size = data.size; } // Add methods to `Stack`. Stack.prototype.clear = stackClear; Stack.prototype['delete'] = stackDelete; Stack.prototype.get = stackGet; Stack.prototype.has = stackHas; Stack.prototype.set = stackSet; module.exports = Stack; /***/ }), /***/ "./node_modules/lodash/_Symbol.js": /*!****************************************!*\ !*** ./node_modules/lodash/_Symbol.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /** Built-in value references. */ var Symbol = root.Symbol; module.exports = Symbol; /***/ }), /***/ "./node_modules/lodash/_Uint8Array.js": /*!********************************************!*\ !*** ./node_modules/lodash/_Uint8Array.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /** Built-in value references. */ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; /***/ }), /***/ "./node_modules/lodash/_WeakMap.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_WeakMap.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /* Built-in method references that are verified to be native. */ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; /***/ }), /***/ "./node_modules/lodash/_arrayAggregator.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_arrayAggregator.js ***! \*************************************************/ /***/ ((module) => { /** * A specialized version of `baseAggregator` for arrays. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} setter The function to set `accumulator` values. * @param {Function} iteratee The iteratee to transform keys. * @param {Object} accumulator The initial aggregated object. * @returns {Function} Returns `accumulator`. */ function arrayAggregator(array, setter, iteratee, accumulator) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { var value = array[index]; setter(accumulator, value, iteratee(value), array); } return accumulator; } module.exports = arrayAggregator; /***/ }), /***/ "./node_modules/lodash/_arrayFilter.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_arrayFilter.js ***! \*********************************************/ /***/ ((module) => { /** * A specialized version of `_.filter` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result[resIndex++] = value; } } return result; } module.exports = arrayFilter; /***/ }), /***/ "./node_modules/lodash/_arrayIncludes.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_arrayIncludes.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ "./node_modules/lodash/_baseIndexOf.js"); /** * A specialized version of `_.includes` for arrays without support for * specifying an index to search from. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludes(array, value) { var length = array == null ? 0 : array.length; return !!length && baseIndexOf(array, value, 0) > -1; } module.exports = arrayIncludes; /***/ }), /***/ "./node_modules/lodash/_arrayIncludesWith.js": /*!***************************************************!*\ !*** ./node_modules/lodash/_arrayIncludesWith.js ***! \***************************************************/ /***/ ((module) => { /** * This function is like `arrayIncludes` except that it accepts a comparator. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @param {Function} comparator The comparator invoked per element. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludesWith(array, value, comparator) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (comparator(value, array[index])) { return true; } } return false; } module.exports = arrayIncludesWith; /***/ }), /***/ "./node_modules/lodash/_arrayLikeKeys.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_arrayLikeKeys.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseTimes = __webpack_require__(/*! ./_baseTimes */ "./node_modules/lodash/_baseTimes.js"), isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */ function arrayLikeKeys(value, inherited) { var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; for (var key in value) { if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode. key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers. (isBuff && (key == 'offset' || key == 'parent')) || // PhantomJS 2 has enumerable non-index properties on typed arrays. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || // Skip index properties. isIndex(key, length) ))) { result.push(key); } } return result; } module.exports = arrayLikeKeys; /***/ }), /***/ "./node_modules/lodash/_arrayMap.js": /*!******************************************!*\ !*** ./node_modules/lodash/_arrayMap.js ***! \******************************************/ /***/ ((module) => { /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } module.exports = arrayMap; /***/ }), /***/ "./node_modules/lodash/_arrayPush.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arrayPush.js ***! \*******************************************/ /***/ ((module) => { /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) { array[offset + index] = values[index]; } return array; } module.exports = arrayPush; /***/ }), /***/ "./node_modules/lodash/_arraySome.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arraySome.js ***! \*******************************************/ /***/ ((module) => { /** * A specialized version of `_.some` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. */ function arraySome(array, predicate) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (predicate(array[index], index, array)) { return true; } } return false; } module.exports = arraySome; /***/ }), /***/ "./node_modules/lodash/_assocIndexOf.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_assocIndexOf.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq(array[length][0], key)) { return length; } } return -1; } module.exports = assocIndexOf; /***/ }), /***/ "./node_modules/lodash/_baseAggregator.js": /*!************************************************!*\ !*** ./node_modules/lodash/_baseAggregator.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"); /** * Aggregates elements of `collection` on `accumulator` with keys transformed * by `iteratee` and values set by `setter`. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} setter The function to set `accumulator` values. * @param {Function} iteratee The iteratee to transform keys. * @param {Object} accumulator The initial aggregated object. * @returns {Function} Returns `accumulator`. */ function baseAggregator(collection, setter, iteratee, accumulator) { baseEach(collection, function(value, key, collection) { setter(accumulator, value, iteratee(value), collection); }); return accumulator; } module.exports = baseAggregator; /***/ }), /***/ "./node_modules/lodash/_baseAssignValue.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseAssignValue.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"); /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function baseAssignValue(object, key, value) { if (key == '__proto__' && defineProperty) { defineProperty(object, key, { 'configurable': true, 'enumerable': true, 'value': value, 'writable': true }); } else { object[key] = value; } } module.exports = baseAssignValue; /***/ }), /***/ "./node_modules/lodash/_baseEach.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseEach.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), createBaseEach = __webpack_require__(/*! ./_createBaseEach */ "./node_modules/lodash/_createBaseEach.js"); /** * The base implementation of `_.forEach` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array|Object} Returns `collection`. */ var baseEach = createBaseEach(baseForOwn); module.exports = baseEach; /***/ }), /***/ "./node_modules/lodash/_baseFindIndex.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_baseFindIndex.js ***! \***********************************************/ /***/ ((module) => { /** * The base implementation of `_.findIndex` and `_.findLastIndex` without * support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} predicate The function invoked per iteration. * @param {number} fromIndex The index to search from. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseFindIndex(array, predicate, fromIndex, fromRight) { var length = array.length, index = fromIndex + (fromRight ? 1 : -1); while ((fromRight ? index-- : ++index < length)) { if (predicate(array[index], index, array)) { return index; } } return -1; } module.exports = baseFindIndex; /***/ }), /***/ "./node_modules/lodash/_baseFor.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseFor.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var createBaseFor = __webpack_require__(/*! ./_createBaseFor */ "./node_modules/lodash/_createBaseFor.js"); /** * The base implementation of `baseForOwn` which iterates over `object` * properties returned by `keysFunc` and invokes `iteratee` for each property. * Iteratee functions may exit iteration early by explicitly returning `false`. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {Function} keysFunc The function to get the keys of `object`. * @returns {Object} Returns `object`. */ var baseFor = createBaseFor(); module.exports = baseFor; /***/ }), /***/ "./node_modules/lodash/_baseForOwn.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseForOwn.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** * The base implementation of `_.forOwn` without support for iteratee shorthands. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Object} Returns `object`. */ function baseForOwn(object, iteratee) { return object && baseFor(object, iteratee, keys); } module.exports = baseForOwn; /***/ }), /***/ "./node_modules/lodash/_baseGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseGet.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** * The base implementation of `_.get` without support for default values. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @returns {*} Returns the resolved value. */ function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return (index && index == length) ? object : undefined; } module.exports = baseGet; /***/ }), /***/ "./node_modules/lodash/_baseGetAllKeys.js": /*!************************************************!*\ !*** ./node_modules/lodash/_baseGetAllKeys.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** * The base implementation of `getAllKeys` and `getAllKeysIn` which uses * `keysFunc` and `symbolsFunc` to get the enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @param {Function} keysFunc The function to get the keys of `object`. * @param {Function} symbolsFunc The function to get the symbols of `object`. * @returns {Array} Returns the array of property names and symbols. */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } module.exports = baseGetAllKeys; /***/ }), /***/ "./node_modules/lodash/_baseGetTag.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseGetTag.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"), objectToString = __webpack_require__(/*! ./_objectToString */ "./node_modules/lodash/_objectToString.js"); /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag && symToStringTag in Object(value)) ? getRawTag(value) : objectToString(value); } module.exports = baseGetTag; /***/ }), /***/ "./node_modules/lodash/_baseHasIn.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseHasIn.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.hasIn` without support for deep paths. * * @private * @param {Object} [object] The object to query. * @param {Array|string} key The key to check. * @returns {boolean} Returns `true` if `key` exists, else `false`. */ function baseHasIn(object, key) { return object != null && key in Object(object); } module.exports = baseHasIn; /***/ }), /***/ "./node_modules/lodash/_baseIndexOf.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIndexOf.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ "./node_modules/lodash/_baseIsNaN.js"), strictIndexOf = __webpack_require__(/*! ./_strictIndexOf */ "./node_modules/lodash/_strictIndexOf.js"); /** * The base implementation of `_.indexOf` without `fromIndex` bounds checks. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseIndexOf(array, value, fromIndex) { return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); } module.exports = baseIndexOf; /***/ }), /***/ "./node_modules/lodash/_baseIsArguments.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsArguments.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** `Object#toString` result references. */ var argsTag = '[object Arguments]'; /** * The base implementation of `_.isArguments`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, */ function baseIsArguments(value) { return isObjectLike(value) && baseGetTag(value) == argsTag; } module.exports = baseIsArguments; /***/ }), /***/ "./node_modules/lodash/_baseIsEqual.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsEqual.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ "./node_modules/lodash/_baseIsEqualDeep.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** * The base implementation of `_.isEqual` which supports partial comparisons * and tracks traversed objects. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @param {boolean} bitmask The bitmask flags. * 1 - Unordered comparison * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { return value !== value && other !== other; } return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } module.exports = baseIsEqual; /***/ }), /***/ "./node_modules/lodash/_baseIsEqualDeep.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsEqualDeep.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), equalByTag = __webpack_require__(/*! ./_equalByTag */ "./node_modules/lodash/_equalByTag.js"), equalObjects = __webpack_require__(/*! ./_equalObjects */ "./node_modules/lodash/_equalObjects.js"), getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', objectTag = '[object Object]'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqual` for arrays and objects which performs * deep comparisons and tracks traversed objects enabling objects with circular * references to be compared. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); objTag = objTag == argsTag ? objectTag : objTag; othTag = othTag == argsTag ? objectTag : othTag; var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; if (isSameTag && isBuffer(object)) { if (!isBuffer(other)) { return false; } objIsArr = true; objIsObj = false; } if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } if (!(bitmask & COMPARE_PARTIAL_FLAG)) { var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); if (objIsWrapped || othIsWrapped) { var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack); return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) { return false; } stack || (stack = new Stack); return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } module.exports = baseIsEqualDeep; /***/ }), /***/ "./node_modules/lodash/_baseIsMatch.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsMatch.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.isMatch` without support for iteratee shorthands. * * @private * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. * @param {Array} matchData The property names, values, and compare flags to match. * @param {Function} [customizer] The function to customize comparisons. * @returns {boolean} Returns `true` if `object` is a match, else `false`. */ function baseIsMatch(object, source, matchData, customizer) { var index = matchData.length, length = index, noCustomizer = !customizer; if (object == null) { return !length; } object = Object(object); while (index--) { var data = matchData[index]; if ((noCustomizer && data[2]) ? data[1] !== object[data[0]] : !(data[0] in object) ) { return false; } } while (++index < length) { data = matchData[index]; var key = data[0], objValue = object[key], srcValue = data[1]; if (noCustomizer && data[2]) { if (objValue === undefined && !(key in object)) { return false; } } else { var stack = new Stack; if (customizer) { var result = customizer(objValue, srcValue, key, object, source, stack); } if (!(result === undefined ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result )) { return false; } } } return true; } module.exports = baseIsMatch; /***/ }), /***/ "./node_modules/lodash/_baseIsNaN.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseIsNaN.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.isNaN` without support for number objects. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. */ function baseIsNaN(value) { return value !== value; } module.exports = baseIsNaN; /***/ }), /***/ "./node_modules/lodash/_baseIsNative.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseIsNative.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), isMasked = __webpack_require__(/*! ./_isMasked */ "./node_modules/lodash/_isMasked.js"), isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used for built-in method references. */ var funcProto = Function.prototype, objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject(value) || isMasked(value)) { return false; } var pattern = isFunction(value) ? reIsNative : reIsHostCtor; return pattern.test(toSource(value)); } module.exports = baseIsNative; /***/ }), /***/ "./node_modules/lodash/_baseIsTypedArray.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_baseIsTypedArray.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', weakMapTag = '[object WeakMap]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** Used to identify `toStringTag` values of typed arrays. */ var typedArrayTags = {}; typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; /** * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ function baseIsTypedArray(value) { return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; } module.exports = baseIsTypedArray; /***/ }), /***/ "./node_modules/lodash/_baseIteratee.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseIteratee.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseMatches = __webpack_require__(/*! ./_baseMatches */ "./node_modules/lodash/_baseMatches.js"), baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ "./node_modules/lodash/_baseMatchesProperty.js"), identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), property = __webpack_require__(/*! ./property */ "./node_modules/lodash/property.js"); /** * The base implementation of `_.iteratee`. * * @private * @param {*} [value=_.identity] The value to convert to an iteratee. * @returns {Function} Returns the iteratee. */ function baseIteratee(value) { // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. if (typeof value == 'function') { return value; } if (value == null) { return identity; } if (typeof value == 'object') { return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); } return property(value); } module.exports = baseIteratee; /***/ }), /***/ "./node_modules/lodash/_baseKeys.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseKeys.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), nativeKeys = __webpack_require__(/*! ./_nativeKeys */ "./node_modules/lodash/_nativeKeys.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeys(object) { if (!isPrototype(object)) { return nativeKeys(object); } var result = []; for (var key in Object(object)) { if (hasOwnProperty.call(object, key) && key != 'constructor') { result.push(key); } } return result; } module.exports = baseKeys; /***/ }), /***/ "./node_modules/lodash/_baseMatches.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseMatches.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ "./node_modules/lodash/_baseIsMatch.js"), getMatchData = __webpack_require__(/*! ./_getMatchData */ "./node_modules/lodash/_getMatchData.js"), matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"); /** * The base implementation of `_.matches` which doesn't clone `source`. * * @private * @param {Object} source The object of property values to match. * @returns {Function} Returns the new spec function. */ function baseMatches(source) { var matchData = getMatchData(source); if (matchData.length == 1 && matchData[0][2]) { return matchesStrictComparable(matchData[0][0], matchData[0][1]); } return function(object) { return object === source || baseIsMatch(object, source, matchData); }; } module.exports = baseMatches; /***/ }), /***/ "./node_modules/lodash/_baseMatchesProperty.js": /*!*****************************************************!*\ !*** ./node_modules/lodash/_baseMatchesProperty.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"), get = __webpack_require__(/*! ./get */ "./node_modules/lodash/get.js"), hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"), isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. * * @private * @param {string} path The path of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function baseMatchesProperty(path, srcValue) { if (isKey(path) && isStrictComparable(srcValue)) { return matchesStrictComparable(toKey(path), srcValue); } return function(object) { var objValue = get(object, path); return (objValue === undefined && objValue === srcValue) ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); }; } module.exports = baseMatchesProperty; /***/ }), /***/ "./node_modules/lodash/_baseProperty.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseProperty.js ***! \**********************************************/ /***/ ((module) => { /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new accessor function. */ function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; } module.exports = baseProperty; /***/ }), /***/ "./node_modules/lodash/_basePropertyDeep.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_basePropertyDeep.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); /** * A specialized version of `baseProperty` which supports deep paths. * * @private * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. */ function basePropertyDeep(path) { return function(object) { return baseGet(object, path); }; } module.exports = basePropertyDeep; /***/ }), /***/ "./node_modules/lodash/_baseTimes.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseTimes.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */ function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) { result[index] = iteratee(index); } return result; } module.exports = baseTimes; /***/ }), /***/ "./node_modules/lodash/_baseToString.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseToString.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString) + ''; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = baseToString; /***/ }), /***/ "./node_modules/lodash/_baseUnary.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseUnary.js ***! \*******************************************/ /***/ ((module) => { /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary(func) { return function(value) { return func(value); }; } module.exports = baseUnary; /***/ }), /***/ "./node_modules/lodash/_baseUniq.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseUniq.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ "./node_modules/lodash/_arrayIncludes.js"), arrayIncludesWith = __webpack_require__(/*! ./_arrayIncludesWith */ "./node_modules/lodash/_arrayIncludesWith.js"), cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"), createSet = __webpack_require__(/*! ./_createSet */ "./node_modules/lodash/_createSet.js"), setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * The base implementation of `_.uniqBy` without support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new duplicate free array. */ function baseUniq(array, iteratee, comparator) { var index = -1, includes = arrayIncludes, length = array.length, isCommon = true, result = [], seen = result; if (comparator) { isCommon = false; includes = arrayIncludesWith; } else if (length >= LARGE_ARRAY_SIZE) { var set = iteratee ? null : createSet(array); if (set) { return setToArray(set); } isCommon = false; includes = cacheHas; seen = new SetCache; } else { seen = iteratee ? [] : result; } outer: while (++index < length) { var value = array[index], computed = iteratee ? iteratee(value) : value; value = (comparator || value !== 0) ? value : 0; if (isCommon && computed === computed) { var seenIndex = seen.length; while (seenIndex--) { if (seen[seenIndex] === computed) { continue outer; } } if (iteratee) { seen.push(computed); } result.push(value); } else if (!includes(seen, computed, comparator)) { if (seen !== result) { seen.push(computed); } result.push(value); } } return result; } module.exports = baseUniq; /***/ }), /***/ "./node_modules/lodash/_cacheHas.js": /*!******************************************!*\ !*** ./node_modules/lodash/_cacheHas.js ***! \******************************************/ /***/ ((module) => { /** * Checks if a `cache` value for `key` exists. * * @private * @param {Object} cache The cache to query. * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function cacheHas(cache, key) { return cache.has(key); } module.exports = cacheHas; /***/ }), /***/ "./node_modules/lodash/_castPath.js": /*!******************************************!*\ !*** ./node_modules/lodash/_castPath.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), stringToPath = __webpack_require__(/*! ./_stringToPath */ "./node_modules/lodash/_stringToPath.js"), toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); /** * Casts `value` to a path array if it's not one. * * @private * @param {*} value The value to inspect. * @param {Object} [object] The object to query keys on. * @returns {Array} Returns the cast property path array. */ function castPath(value, object) { if (isArray(value)) { return value; } return isKey(value, object) ? [value] : stringToPath(toString(value)); } module.exports = castPath; /***/ }), /***/ "./node_modules/lodash/_coreJsData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_coreJsData.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); /** Used to detect overreaching core-js shims. */ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; /***/ }), /***/ "./node_modules/lodash/_createAggregator.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_createAggregator.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayAggregator = __webpack_require__(/*! ./_arrayAggregator */ "./node_modules/lodash/_arrayAggregator.js"), baseAggregator = __webpack_require__(/*! ./_baseAggregator */ "./node_modules/lodash/_baseAggregator.js"), baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** * Creates a function like `_.groupBy`. * * @private * @param {Function} setter The function to set accumulator values. * @param {Function} [initializer] The accumulator object initializer. * @returns {Function} Returns the new aggregator function. */ function createAggregator(setter, initializer) { return function(collection, iteratee) { var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {}; return func(collection, setter, baseIteratee(iteratee, 2), accumulator); }; } module.exports = createAggregator; /***/ }), /***/ "./node_modules/lodash/_createBaseEach.js": /*!************************************************!*\ !*** ./node_modules/lodash/_createBaseEach.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** * Creates a `baseEach` or `baseEachRight` function. * * @private * @param {Function} eachFunc The function to iterate over a collection. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseEach(eachFunc, fromRight) { return function(collection, iteratee) { if (collection == null) { return collection; } if (!isArrayLike(collection)) { return eachFunc(collection, iteratee); } var length = collection.length, index = fromRight ? length : -1, iterable = Object(collection); while ((fromRight ? index-- : ++index < length)) { if (iteratee(iterable[index], index, iterable) === false) { break; } } return collection; }; } module.exports = createBaseEach; /***/ }), /***/ "./node_modules/lodash/_createBaseFor.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_createBaseFor.js ***! \***********************************************/ /***/ ((module) => { /** * Creates a base function for methods like `_.forIn` and `_.forOwn`. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseFor(fromRight) { return function(object, iteratee, keysFunc) { var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; while (length--) { var key = props[fromRight ? length : ++index]; if (iteratee(iterable[key], key, iterable) === false) { break; } } return object; }; } module.exports = createBaseFor; /***/ }), /***/ "./node_modules/lodash/_createSet.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_createSet.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), noop = __webpack_require__(/*! ./noop */ "./node_modules/lodash/noop.js"), setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * Creates a set object of `values`. * * @private * @param {Array} values The values to add to the set. * @returns {Object} Returns the new set. */ var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { return new Set(values); }; module.exports = createSet; /***/ }), /***/ "./node_modules/lodash/_defineProperty.js": /*!************************************************!*\ !*** ./node_modules/lodash/_defineProperty.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); var defineProperty = (function() { try { var func = getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); module.exports = defineProperty; /***/ }), /***/ "./node_modules/lodash/_equalArrays.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_equalArrays.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), arraySome = __webpack_require__(/*! ./_arraySome */ "./node_modules/lodash/_arraySome.js"), cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * A specialized version of `baseIsEqualDeep` for arrays with support for * partial deep comparisons. * * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; if (arrLength != othLength && !(isPartial && othLength > arrLength)) { return false; } // Check that cyclic values are equal. var arrStacked = stack.get(array); var othStacked = stack.get(other); if (arrStacked && othStacked) { return arrStacked == other && othStacked == array; } var index = -1, result = true, seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; stack.set(array, other); stack.set(other, array); // Ignore non-index properties. while (++index < arrLength) { var arrValue = array[index], othValue = other[index]; if (customizer) { var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); } if (compared !== undefined) { if (compared) { continue; } result = false; break; } // Recursively compare arrays (susceptible to call stack limits). if (seen) { if (!arraySome(other, function(othValue, othIndex) { if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { return seen.push(othIndex); } })) { result = false; break; } } else if (!( arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack) )) { result = false; break; } } stack['delete'](array); stack['delete'](other); return result; } module.exports = equalArrays; /***/ }), /***/ "./node_modules/lodash/_equalByTag.js": /*!********************************************!*\ !*** ./node_modules/lodash/_equalByTag.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"), eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), mapToArray = __webpack_require__(/*! ./_mapToArray */ "./node_modules/lodash/_mapToArray.js"), setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** `Object#toString` result references. */ var boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', mapTag = '[object Map]', numberTag = '[object Number]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]'; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; /** * A specialized version of `baseIsEqualDeep` for comparing objects of * the same `toStringTag`. * * **Note:** This function only supports comparing values with tags of * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { case dataViewTag: if ((object.byteLength != other.byteLength) || (object.byteOffset != other.byteOffset)) { return false; } object = object.buffer; other = other.buffer; case arrayBufferTag: if ((object.byteLength != other.byteLength) || !equalFunc(new Uint8Array(object), new Uint8Array(other))) { return false; } return true; case boolTag: case dateTag: case numberTag: // Coerce booleans to `1` or `0` and dates to milliseconds. // Invalid dates are coerced to `NaN`. return eq(+object, +other); case errorTag: return object.name == other.name && object.message == other.message; case regexpTag: case stringTag: // Coerce regexes to strings and treat strings, primitives and objects, // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring // for more details. return object == (other + ''); case mapTag: var convert = mapToArray; case setTag: var isPartial = bitmask & COMPARE_PARTIAL_FLAG; convert || (convert = setToArray); if (object.size != other.size && !isPartial) { return false; } // Assume cyclic values are equal. var stacked = stack.get(object); if (stacked) { return stacked == other; } bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). stack.set(object, other); var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack['delete'](object); return result; case symbolTag: if (symbolValueOf) { return symbolValueOf.call(object) == symbolValueOf.call(other); } } return false; } module.exports = equalByTag; /***/ }), /***/ "./node_modules/lodash/_equalObjects.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_equalObjects.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqualDeep` for objects with support for * partial deep comparisons. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; if (objLength != othLength && !isPartial) { return false; } var index = objLength; while (index--) { var key = objProps[index]; if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { return false; } } // Check that cyclic values are equal. var objStacked = stack.get(object); var othStacked = stack.get(other); if (objStacked && othStacked) { return objStacked == other && othStacked == object; } var result = true; stack.set(object, other); stack.set(other, object); var skipCtor = isPartial; while (++index < objLength) { key = objProps[index]; var objValue = object[key], othValue = other[key]; if (customizer) { var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); } // Recursively compare objects (susceptible to call stack limits). if (!(compared === undefined ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) : compared )) { result = false; break; } skipCtor || (skipCtor = key == 'constructor'); } if (result && !skipCtor) { var objCtor = object.constructor, othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal. if (objCtor != othCtor && ('constructor' in object && 'constructor' in other) && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) { result = false; } } stack['delete'](object); stack['delete'](other); return result; } module.exports = equalObjects; /***/ }), /***/ "./node_modules/lodash/_freeGlobal.js": /*!********************************************!*\ !*** ./node_modules/lodash/_freeGlobal.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; module.exports = freeGlobal; /***/ }), /***/ "./node_modules/lodash/_getAllKeys.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getAllKeys.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** * Creates an array of own enumerable property names and symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeys(object) { return baseGetAllKeys(object, keys, getSymbols); } module.exports = getAllKeys; /***/ }), /***/ "./node_modules/lodash/_getMapData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getMapData.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isKeyable = __webpack_require__(/*! ./_isKeyable */ "./node_modules/lodash/_isKeyable.js"); /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; } module.exports = getMapData; /***/ }), /***/ "./node_modules/lodash/_getMatchData.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_getMatchData.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** * Gets the property names, values, and compare flags of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the match data of `object`. */ function getMatchData(object) { var result = keys(object), length = result.length; while (length--) { var key = result[length], value = object[key]; result[length] = [key, value, isStrictComparable(value)]; } return result; } module.exports = getMatchData; /***/ }), /***/ "./node_modules/lodash/_getNative.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_getNative.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsNative = __webpack_require__(/*! ./_baseIsNative */ "./node_modules/lodash/_baseIsNative.js"), getValue = __webpack_require__(/*! ./_getValue */ "./node_modules/lodash/_getValue.js"); /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : undefined; } module.exports = getNative; /***/ }), /***/ "./node_modules/lodash/_getRawTag.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_getRawTag.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } module.exports = getRawTag; /***/ }), /***/ "./node_modules/lodash/_getSymbols.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getSymbols.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeGetSymbols = Object.getOwnPropertySymbols; /** * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { if (object == null) { return []; } object = Object(object); return arrayFilter(nativeGetSymbols(object), function(symbol) { return propertyIsEnumerable.call(object, symbol); }); }; module.exports = getSymbols; /***/ }), /***/ "./node_modules/lodash/_getTag.js": /*!****************************************!*\ !*** ./node_modules/lodash/_getTag.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var DataView = __webpack_require__(/*! ./_DataView */ "./node_modules/lodash/_DataView.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), Promise = __webpack_require__(/*! ./_Promise */ "./node_modules/lodash/_Promise.js"), Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), WeakMap = __webpack_require__(/*! ./_WeakMap */ "./node_modules/lodash/_WeakMap.js"), baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); /** `Object#toString` result references. */ var mapTag = '[object Map]', objectTag = '[object Object]', promiseTag = '[object Promise]', setTag = '[object Set]', weakMapTag = '[object WeakMap]'; var dataViewTag = '[object DataView]'; /** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap); /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || (Map && getTag(new Map) != mapTag) || (Promise && getTag(Promise.resolve()) != promiseTag) || (Set && getTag(new Set) != setTag) || (WeakMap && getTag(new WeakMap) != weakMapTag)) { getTag = function(value) { var result = baseGetTag(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : ''; if (ctorString) { switch (ctorString) { case dataViewCtorString: return dataViewTag; case mapCtorString: return mapTag; case promiseCtorString: return promiseTag; case setCtorString: return setTag; case weakMapCtorString: return weakMapTag; } } return result; }; } module.exports = getTag; /***/ }), /***/ "./node_modules/lodash/_getValue.js": /*!******************************************!*\ !*** ./node_modules/lodash/_getValue.js ***! \******************************************/ /***/ ((module) => { /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue(object, key) { return object == null ? undefined : object[key]; } module.exports = getValue; /***/ }), /***/ "./node_modules/lodash/_hasPath.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hasPath.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** * Checks if `path` exists on `object`. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @param {Function} hasFunc The function to check properties. * @returns {boolean} Returns `true` if `path` exists, else `false`. */ function hasPath(object, path, hasFunc) { path = castPath(path, object); var index = -1, length = path.length, result = false; while (++index < length) { var key = toKey(path[index]); if (!(result = object != null && hasFunc(object, key))) { break; } object = object[key]; } if (result || ++index != length) { return result; } length = object == null ? 0 : object.length; return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); } module.exports = hasPath; /***/ }), /***/ "./node_modules/lodash/_hashClear.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_hashClear.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } module.exports = hashClear; /***/ }), /***/ "./node_modules/lodash/_hashDelete.js": /*!********************************************!*\ !*** ./node_modules/lodash/_hashDelete.js ***! \********************************************/ /***/ ((module) => { /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } module.exports = hashDelete; /***/ }), /***/ "./node_modules/lodash/_hashGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashGet.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED ? undefined : result; } return hasOwnProperty.call(data, key) ? data[key] : undefined; } module.exports = hashGet; /***/ }), /***/ "./node_modules/lodash/_hashHas.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashHas.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); } module.exports = hashHas; /***/ }), /***/ "./node_modules/lodash/_hashSet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashSet.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; return this; } module.exports = hashSet; /***/ }), /***/ "./node_modules/lodash/_isIndex.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_isIndex.js ***! \*****************************************/ /***/ ((module) => { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { var type = typeof value; length = length == null ? MAX_SAFE_INTEGER : length; return !!length && (type == 'number' || (type != 'symbol' && reIsUint.test(value))) && (value > -1 && value % 1 == 0 && value < length); } module.exports = isIndex; /***/ }), /***/ "./node_modules/lodash/_isKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_isKey.js ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** Used to match property names within property paths. */ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/; /** * Checks if `value` is a property name and not a property path. * * @private * @param {*} value The value to check. * @param {Object} [object] The object to query keys on. * @returns {boolean} Returns `true` if `value` is a property name, else `false`. */ function isKey(value, object) { if (isArray(value)) { return false; } var type = typeof value; if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object)); } module.exports = isKey; /***/ }), /***/ "./node_modules/lodash/_isKeyable.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_isKeyable.js ***! \*******************************************/ /***/ ((module) => { /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } module.exports = isKeyable; /***/ }), /***/ "./node_modules/lodash/_isMasked.js": /*!******************************************!*\ !*** ./node_modules/lodash/_isMasked.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var coreJsData = __webpack_require__(/*! ./_coreJsData */ "./node_modules/lodash/_coreJsData.js"); /** Used to detect methods masquerading as native. */ var maskSrcKey = (function() { var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); return uid ? ('Symbol(src)_1.' + uid) : ''; }()); /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && (maskSrcKey in func); } module.exports = isMasked; /***/ }), /***/ "./node_modules/lodash/_isPrototype.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_isPrototype.js ***! \*********************************************/ /***/ ((module) => { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */ function isPrototype(value) { var Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; return value === proto; } module.exports = isPrototype; /***/ }), /***/ "./node_modules/lodash/_isStrictComparable.js": /*!****************************************************!*\ !*** ./node_modules/lodash/_isStrictComparable.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); /** * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` if suitable for strict * equality comparisons, else `false`. */ function isStrictComparable(value) { return value === value && !isObject(value); } module.exports = isStrictComparable; /***/ }), /***/ "./node_modules/lodash/_listCacheClear.js": /*!************************************************!*\ !*** ./node_modules/lodash/_listCacheClear.js ***! \************************************************/ /***/ ((module) => { /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } module.exports = listCacheClear; /***/ }), /***/ "./node_modules/lodash/_listCacheDelete.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_listCacheDelete.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } module.exports = listCacheDelete; /***/ }), /***/ "./node_modules/lodash/_listCacheGet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheGet.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? undefined : data[index][1]; } module.exports = listCacheGet; /***/ }), /***/ "./node_modules/lodash/_listCacheHas.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheHas.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } module.exports = listCacheHas; /***/ }), /***/ "./node_modules/lodash/_listCacheSet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheSet.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } module.exports = listCacheSet; /***/ }), /***/ "./node_modules/lodash/_mapCacheClear.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_mapCacheClear.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Hash = __webpack_require__(/*! ./_Hash */ "./node_modules/lodash/_Hash.js"), ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"); /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { 'hash': new Hash, 'map': new (Map || ListCache), 'string': new Hash }; } module.exports = mapCacheClear; /***/ }), /***/ "./node_modules/lodash/_mapCacheDelete.js": /*!************************************************!*\ !*** ./node_modules/lodash/_mapCacheDelete.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = getMapData(this, key)['delete'](key); this.size -= result ? 1 : 0; return result; } module.exports = mapCacheDelete; /***/ }), /***/ "./node_modules/lodash/_mapCacheGet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheGet.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return getMapData(this, key).get(key); } module.exports = mapCacheGet; /***/ }), /***/ "./node_modules/lodash/_mapCacheHas.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheHas.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return getMapData(this, key).has(key); } module.exports = mapCacheHas; /***/ }), /***/ "./node_modules/lodash/_mapCacheSet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheSet.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } module.exports = mapCacheSet; /***/ }), /***/ "./node_modules/lodash/_mapToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_mapToArray.js ***! \********************************************/ /***/ ((module) => { /** * Converts `map` to its key-value pairs. * * @private * @param {Object} map The map to convert. * @returns {Array} Returns the key-value pairs. */ function mapToArray(map) { var index = -1, result = Array(map.size); map.forEach(function(value, key) { result[++index] = [key, value]; }); return result; } module.exports = mapToArray; /***/ }), /***/ "./node_modules/lodash/_matchesStrictComparable.js": /*!*********************************************************!*\ !*** ./node_modules/lodash/_matchesStrictComparable.js ***! \*********************************************************/ /***/ ((module) => { /** * A specialized version of `matchesProperty` for source values suitable * for strict equality comparisons, i.e. `===`. * * @private * @param {string} key The key of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function matchesStrictComparable(key, srcValue) { return function(object) { if (object == null) { return false; } return object[key] === srcValue && (srcValue !== undefined || (key in Object(object))); }; } module.exports = matchesStrictComparable; /***/ }), /***/ "./node_modules/lodash/_memoizeCapped.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_memoizeCapped.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var memoize = __webpack_require__(/*! ./memoize */ "./node_modules/lodash/memoize.js"); /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** * A specialized version of `_.memoize` which clears the memoized function's * cache when it exceeds `MAX_MEMOIZE_SIZE`. * * @private * @param {Function} func The function to have its output memoized. * @returns {Function} Returns the new memoized function. */ function memoizeCapped(func) { var result = memoize(func, function(key) { if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); var cache = result.cache; return result; } module.exports = memoizeCapped; /***/ }), /***/ "./node_modules/lodash/_nativeCreate.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_nativeCreate.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); /* Built-in method references that are verified to be native. */ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; /***/ }), /***/ "./node_modules/lodash/_nativeKeys.js": /*!********************************************!*\ !*** ./node_modules/lodash/_nativeKeys.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeKeys = overArg(Object.keys, Object); module.exports = nativeKeys; /***/ }), /***/ "./node_modules/lodash/_nodeUtil.js": /*!******************************************!*\ !*** ./node_modules/lodash/_nodeUtil.js ***! \******************************************/ /***/ ((module, exports, __webpack_require__) => { /* module decorator */ module = __webpack_require__.nmd(module); var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); /** Detect free variable `exports`. */ var freeExports = true && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Detect free variable `process` from Node.js. */ var freeProcess = moduleExports && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { // Use `util.types` for Node.js 10+. var types = freeModule && freeModule.require && freeModule.require('util').types; if (types) { return types; } // Legacy `process.binding('util')` for Node.js < 10. return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); module.exports = nodeUtil; /***/ }), /***/ "./node_modules/lodash/_objectToString.js": /*!************************************************!*\ !*** ./node_modules/lodash/_objectToString.js ***! \************************************************/ /***/ ((module) => { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } module.exports = objectToString; /***/ }), /***/ "./node_modules/lodash/_overArg.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_overArg.js ***! \*****************************************/ /***/ ((module) => { /** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */ function overArg(func, transform) { return function(arg) { return func(transform(arg)); }; } module.exports = overArg; /***/ }), /***/ "./node_modules/lodash/_root.js": /*!**************************************!*\ !*** ./node_modules/lodash/_root.js ***! \**************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; /***/ }), /***/ "./node_modules/lodash/_setCacheAdd.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_setCacheAdd.js ***! \*********************************************/ /***/ ((module) => { /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Adds `value` to the array cache. * * @private * @name add * @memberOf SetCache * @alias push * @param {*} value The value to cache. * @returns {Object} Returns the cache instance. */ function setCacheAdd(value) { this.__data__.set(value, HASH_UNDEFINED); return this; } module.exports = setCacheAdd; /***/ }), /***/ "./node_modules/lodash/_setCacheHas.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_setCacheHas.js ***! \*********************************************/ /***/ ((module) => { /** * Checks if `value` is in the array cache. * * @private * @name has * @memberOf SetCache * @param {*} value The value to search for. * @returns {number} Returns `true` if `value` is found, else `false`. */ function setCacheHas(value) { return this.__data__.has(value); } module.exports = setCacheHas; /***/ }), /***/ "./node_modules/lodash/_setToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_setToArray.js ***! \********************************************/ /***/ ((module) => { /** * Converts `set` to an array of its values. * * @private * @param {Object} set The set to convert. * @returns {Array} Returns the values. */ function setToArray(set) { var index = -1, result = Array(set.size); set.forEach(function(value) { result[++index] = value; }); return result; } module.exports = setToArray; /***/ }), /***/ "./node_modules/lodash/_stackClear.js": /*!********************************************!*\ !*** ./node_modules/lodash/_stackClear.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"); /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache; this.size = 0; } module.exports = stackClear; /***/ }), /***/ "./node_modules/lodash/_stackDelete.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_stackDelete.js ***! \*********************************************/ /***/ ((module) => { /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data['delete'](key); this.size = data.size; return result; } module.exports = stackDelete; /***/ }), /***/ "./node_modules/lodash/_stackGet.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackGet.js ***! \******************************************/ /***/ ((module) => { /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } module.exports = stackGet; /***/ }), /***/ "./node_modules/lodash/_stackHas.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackHas.js ***! \******************************************/ /***/ ((module) => { /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } module.exports = stackHas; /***/ }), /***/ "./node_modules/lodash/_stackSet.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackSet.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof ListCache) { var pairs = data.__data__; if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } module.exports = stackSet; /***/ }), /***/ "./node_modules/lodash/_strictIndexOf.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_strictIndexOf.js ***! \***********************************************/ /***/ ((module) => { /** * A specialized version of `_.indexOf` which performs strict equality * comparisons of values, i.e. `===`. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function strictIndexOf(array, value, fromIndex) { var index = fromIndex - 1, length = array.length; while (++index < length) { if (array[index] === value) { return index; } } return -1; } module.exports = strictIndexOf; /***/ }), /***/ "./node_modules/lodash/_stringToPath.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_stringToPath.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ "./node_modules/lodash/_memoizeCapped.js"); /** Used to match property names within property paths. */ var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; /** Used to match backslashes in property paths. */ var reEscapeChar = /\\(\\)?/g; /** * Converts `string` to a property path array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the property path array. */ var stringToPath = memoizeCapped(function(string) { var result = []; if (string.charCodeAt(0) === 46 /* . */) { result.push(''); } string.replace(rePropName, function(match, number, quote, subString) { result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); }); return result; }); module.exports = stringToPath; /***/ }), /***/ "./node_modules/lodash/_toKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_toKey.js ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * Converts `value` to a string key if it's not a string or symbol. * * @private * @param {*} value The value to inspect. * @returns {string|symbol} Returns the key. */ function toKey(value) { if (typeof value == 'string' || isSymbol(value)) { return value; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = toKey; /***/ }), /***/ "./node_modules/lodash/_toSource.js": /*!******************************************!*\ !*** ./node_modules/lodash/_toSource.js ***! \******************************************/ /***/ ((module) => { /** Used for built-in method references. */ var funcProto = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString.call(func); } catch (e) {} try { return (func + ''); } catch (e) {} } return ''; } module.exports = toSource; /***/ }), /***/ "./node_modules/lodash/eq.js": /*!***********************************!*\ !*** ./node_modules/lodash/eq.js ***! \***********************************/ /***/ ((module) => { /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || (value !== value && other !== other); } module.exports = eq; /***/ }), /***/ "./node_modules/lodash/get.js": /*!************************************!*\ !*** ./node_modules/lodash/get.js ***! \************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); /** * Gets the value at `path` of `object`. If the resolved value is * `undefined`, the `defaultValue` is returned in its place. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @param {*} [defaultValue] The value returned for `undefined` resolved values. * @returns {*} Returns the resolved value. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.get(object, 'a[0].b.c'); * // => 3 * * _.get(object, ['a', '0', 'b', 'c']); * // => 3 * * _.get(object, 'a.b.c', 'default'); * // => 'default' */ function get(object, path, defaultValue) { var result = object == null ? undefined : baseGet(object, path); return result === undefined ? defaultValue : result; } module.exports = get; /***/ }), /***/ "./node_modules/lodash/groupBy.js": /*!****************************************!*\ !*** ./node_modules/lodash/groupBy.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), createAggregator = __webpack_require__(/*! ./_createAggregator */ "./node_modules/lodash/_createAggregator.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Creates an object composed of keys generated from the results of running * each element of `collection` thru `iteratee`. The order of grouped values * is determined by the order they occur in `collection`. The corresponding * value of each key is an array of elements responsible for generating the * key. The iteratee is invoked with one argument: (value). * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The iteratee to transform keys. * @returns {Object} Returns the composed aggregate object. * @example * * _.groupBy([6.1, 4.2, 6.3], Math.floor); * // => { '4': [4.2], '6': [6.1, 6.3] } * * // The `_.property` iteratee shorthand. * _.groupBy(['one', 'two', 'three'], 'length'); * // => { '3': ['one', 'two'], '5': ['three'] } */ var groupBy = createAggregator(function(result, value, key) { if (hasOwnProperty.call(result, key)) { result[key].push(value); } else { baseAssignValue(result, key, [value]); } }); module.exports = groupBy; /***/ }), /***/ "./node_modules/lodash/hasIn.js": /*!**************************************!*\ !*** ./node_modules/lodash/hasIn.js ***! \**************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseHasIn = __webpack_require__(/*! ./_baseHasIn */ "./node_modules/lodash/_baseHasIn.js"), hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); /** * Checks if `path` is a direct or inherited property of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * * var object = _.create({ 'a': _.create({ 'b': 2 }) }); * * _.hasIn(object, 'a'); * // => true * * _.hasIn(object, 'a.b'); * // => true * * _.hasIn(object, ['a', 'b']); * // => true * * _.hasIn(object, 'b'); * // => false */ function hasIn(object, path) { return object != null && hasPath(object, path, baseHasIn); } module.exports = hasIn; /***/ }), /***/ "./node_modules/lodash/identity.js": /*!*****************************************!*\ !*** ./node_modules/lodash/identity.js ***! \*****************************************/ /***/ ((module) => { /** * This method returns the first argument it receives. * * @static * @since 0.1.0 * @memberOf _ * @category Util * @param {*} value Any value. * @returns {*} Returns `value`. * @example * * var object = { 'a': 1 }; * * console.log(_.identity(object) === object); * // => true */ function identity(value) { return value; } module.exports = identity; /***/ }), /***/ "./node_modules/lodash/isArguments.js": /*!********************************************!*\ !*** ./node_modules/lodash/isArguments.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ "./node_modules/lodash/_baseIsArguments.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); }; module.exports = isArguments; /***/ }), /***/ "./node_modules/lodash/isArray.js": /*!****************************************!*\ !*** ./node_modules/lodash/isArray.js ***! \****************************************/ /***/ ((module) => { /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; module.exports = isArray; /***/ }), /***/ "./node_modules/lodash/isArrayLike.js": /*!********************************************!*\ !*** ./node_modules/lodash/isArrayLike.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"); /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } module.exports = isArrayLike; /***/ }), /***/ "./node_modules/lodash/isBuffer.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isBuffer.js ***! \*****************************************/ /***/ ((module, exports, __webpack_require__) => { /* module decorator */ module = __webpack_require__.nmd(module); var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"), stubFalse = __webpack_require__(/*! ./stubFalse */ "./node_modules/lodash/stubFalse.js"); /** Detect free variable `exports`. */ var freeExports = true && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Built-in value references. */ var Buffer = moduleExports ? root.Buffer : undefined; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; /** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */ var isBuffer = nativeIsBuffer || stubFalse; module.exports = isBuffer; /***/ }), /***/ "./node_modules/lodash/isFunction.js": /*!*******************************************!*\ !*** ./node_modules/lodash/isFunction.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); /** `Object#toString` result references. */ var asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', proxyTag = '[object Proxy]'; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject(value)) { return false; } // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 9 which returns 'object' for typed arrays and other constructors. var tag = baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } module.exports = isFunction; /***/ }), /***/ "./node_modules/lodash/isLength.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isLength.js ***! \*****************************************/ /***/ ((module) => { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } module.exports = isLength; /***/ }), /***/ "./node_modules/lodash/isObject.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isObject.js ***! \*****************************************/ /***/ ((module) => { /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } module.exports = isObject; /***/ }), /***/ "./node_modules/lodash/isObjectLike.js": /*!*********************************************!*\ !*** ./node_modules/lodash/isObjectLike.js ***! \*********************************************/ /***/ ((module) => { /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == 'object'; } module.exports = isObjectLike; /***/ }), /***/ "./node_modules/lodash/isSymbol.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isSymbol.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag); } module.exports = isSymbol; /***/ }), /***/ "./node_modules/lodash/isTypedArray.js": /*!*********************************************!*\ !*** ./node_modules/lodash/isTypedArray.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ "./node_modules/lodash/_baseIsTypedArray.js"), baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); /* Node.js helper references. */ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** * Checks if `value` is classified as a typed array. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); * // => true * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; module.exports = isTypedArray; /***/ }), /***/ "./node_modules/lodash/keys.js": /*!*************************************!*\ !*** ./node_modules/lodash/keys.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ function keys(object) { return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } module.exports = keys; /***/ }), /***/ "./node_modules/lodash/mapValues.js": /*!******************************************!*\ !*** ./node_modules/lodash/mapValues.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"); /** * Creates an object with the same keys as `object` and values generated * by running each own enumerable string keyed property of `object` thru * `iteratee`. The iteratee is invoked with three arguments: * (value, key, object). * * @static * @memberOf _ * @since 2.4.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns the new mapped object. * @see _.mapKeys * @example * * var users = { * 'fred': { 'user': 'fred', 'age': 40 }, * 'pebbles': { 'user': 'pebbles', 'age': 1 } * }; * * _.mapValues(users, function(o) { return o.age; }); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) * * // The `_.property` iteratee shorthand. * _.mapValues(users, 'age'); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) */ function mapValues(object, iteratee) { var result = {}; iteratee = baseIteratee(iteratee, 3); baseForOwn(object, function(value, key, object) { baseAssignValue(result, key, iteratee(value, key, object)); }); return result; } module.exports = mapValues; /***/ }), /***/ "./node_modules/lodash/memoize.js": /*!****************************************!*\ !*** ./node_modules/lodash/memoize.js ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); /** Error message constants. */ var FUNC_ERROR_TEXT = 'Expected a function'; /** * Creates a function that memoizes the result of `func`. If `resolver` is * provided, it determines the cache key for storing the result based on the * arguments provided to the memoized function. By default, the first argument * provided to the memoized function is used as the map cache key. The `func` * is invoked with the `this` binding of the memoized function. * * **Note:** The cache is exposed as the `cache` property on the memoized * function. Its creation may be customized by replacing the `_.memoize.Cache` * constructor with one whose instances implement the * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) * method interface of `clear`, `delete`, `get`, `has`, and `set`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to have its output memoized. * @param {Function} [resolver] The function to resolve the cache key. * @returns {Function} Returns the new memoized function. * @example * * var object = { 'a': 1, 'b': 2 }; * var other = { 'c': 3, 'd': 4 }; * * var values = _.memoize(_.values); * values(object); * // => [1, 2] * * values(other); * // => [3, 4] * * object.a = 2; * values(object); * // => [1, 2] * * // Modify the result cache. * values.cache.set(object, ['a', 'b']); * values(object); * // => ['a', 'b'] * * // Replace `_.memoize.Cache`. * _.memoize.Cache = WeakMap; */ function memoize(func, resolver) { if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { throw new TypeError(FUNC_ERROR_TEXT); } var memoized = function() { var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } var result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || MapCache); return memoized; } // Expose `MapCache`. memoize.Cache = MapCache; module.exports = memoize; /***/ }), /***/ "./node_modules/lodash/noop.js": /*!*************************************!*\ !*** ./node_modules/lodash/noop.js ***! \*************************************/ /***/ ((module) => { /** * This method returns `undefined`. * * @static * @memberOf _ * @since 2.3.0 * @category Util * @example * * _.times(2, _.noop); * // => [undefined, undefined] */ function noop() { // No operation performed. } module.exports = noop; /***/ }), /***/ "./node_modules/lodash/property.js": /*!*****************************************!*\ !*** ./node_modules/lodash/property.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"), basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ "./node_modules/lodash/_basePropertyDeep.js"), isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** * Creates a function that returns the value at `path` of a given object. * * @static * @memberOf _ * @since 2.4.0 * @category Util * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. * @example * * var objects = [ * { 'a': { 'b': 2 } }, * { 'a': { 'b': 1 } } * ]; * * _.map(objects, _.property('a.b')); * // => [2, 1] * * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); * // => [1, 2] */ function property(path) { return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); } module.exports = property; /***/ }), /***/ "./node_modules/lodash/stubArray.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubArray.js ***! \******************************************/ /***/ ((module) => { /** * This method returns a new empty array. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {Array} Returns the new empty array. * @example * * var arrays = _.times(2, _.stubArray); * * console.log(arrays); * // => [[], []] * * console.log(arrays[0] === arrays[1]); * // => false */ function stubArray() { return []; } module.exports = stubArray; /***/ }), /***/ "./node_modules/lodash/stubFalse.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubFalse.js ***! \******************************************/ /***/ ((module) => { /** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */ function stubFalse() { return false; } module.exports = stubFalse; /***/ }), /***/ "./node_modules/lodash/toString.js": /*!*****************************************!*\ !*** ./node_modules/lodash/toString.js ***! \*****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseToString = __webpack_require__(/*! ./_baseToString */ "./node_modules/lodash/_baseToString.js"); /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } module.exports = toString; /***/ }), /***/ "./node_modules/lodash/uniq.js": /*!*************************************!*\ !*** ./node_modules/lodash/uniq.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var baseUniq = __webpack_require__(/*! ./_baseUniq */ "./node_modules/lodash/_baseUniq.js"); /** * Creates a duplicate-free version of an array, using * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons, in which only the first occurrence of each element * is kept. The order of result values is determined by the order they occur * in the array. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to inspect. * @returns {Array} Returns the new duplicate free array. * @example * * _.uniq([2, 1, 2]); * // => [2, 1] */ function uniq(array) { return (array && array.length) ? baseUniq(array) : []; } module.exports = uniq; /***/ }), /***/ "./node_modules/semver/classes/comparator.js": /*!***************************************************!*\ !*** ./node_modules/semver/classes/comparator.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const ANY = Symbol('SemVer ANY') // hoisted class for cyclic dependency class Comparator { static get ANY () { return ANY } constructor (comp, options) { options = parseOptions(options) if (comp instanceof Comparator) { if (comp.loose === !!options.loose) { return comp } else { comp = comp.value } } comp = comp.trim().split(/\s+/).join(' ') debug('comparator', comp, options) this.options = options this.loose = !!options.loose this.parse(comp) if (this.semver === ANY) { this.value = '' } else { this.value = this.operator + this.semver.version } debug('comp', this) } parse (comp) { const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] const m = comp.match(r) if (!m) { throw new TypeError(`Invalid comparator: ${comp}`) } this.operator = m[1] !== undefined ? m[1] : '' if (this.operator === '=') { this.operator = '' } // if it literally is just '>' or '' then allow anything. if (!m[2]) { this.semver = ANY } else { this.semver = new SemVer(m[2], this.options.loose) } } toString () { return this.value } test (version) { debug('Comparator.test', version, this.options.loose) if (this.semver === ANY || version === ANY) { return true } if (typeof version === 'string') { try { version = new SemVer(version, this.options) } catch (er) { return false } } return cmp(version, this.operator, this.semver, this.options) } intersects (comp, options) { if (!(comp instanceof Comparator)) { throw new TypeError('a Comparator is required') } if (this.operator === '') { if (this.value === '') { return true } return new Range(comp.value, options).test(this.value) } else if (comp.operator === '') { if (comp.value === '') { return true } return new Range(this.value, options).test(comp.semver) } options = parseOptions(options) // Special cases where nothing can possibly be lower if (options.includePrerelease && (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) { return false } if (!options.includePrerelease && (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) { return false } // Same direction increasing (> or >=) if (this.operator.startsWith('>') && comp.operator.startsWith('>')) { return true } // Same direction decreasing (< or <=) if (this.operator.startsWith('<') && comp.operator.startsWith('<')) { return true } // same SemVer and both sides are inclusive (<= or >=) if ( (this.semver.version === comp.semver.version) && this.operator.includes('=') && comp.operator.includes('=')) { return true } // opposite directions less than if (cmp(this.semver, '<', comp.semver, options) && this.operator.startsWith('>') && comp.operator.startsWith('<')) { return true } // opposite directions greater than if (cmp(this.semver, '>', comp.semver, options) && this.operator.startsWith('<') && comp.operator.startsWith('>')) { return true } return false } } module.exports = Comparator const parseOptions = __webpack_require__(/*! ../internal/parse-options */ "./node_modules/semver/internal/parse-options.js") const { safeRe: re, t } = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const cmp = __webpack_require__(/*! ../functions/cmp */ "./node_modules/semver/functions/cmp.js") const debug = __webpack_require__(/*! ../internal/debug */ "./node_modules/semver/internal/debug.js") const SemVer = __webpack_require__(/*! ./semver */ "./node_modules/semver/classes/semver.js") const Range = __webpack_require__(/*! ./range */ "./node_modules/semver/classes/range.js") /***/ }), /***/ "./node_modules/semver/classes/range.js": /*!**********************************************!*\ !*** ./node_modules/semver/classes/range.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const SPACE_CHARACTERS = /\s+/g // hoisted class for cyclic dependency class Range { constructor (range, options) { options = parseOptions(options) if (range instanceof Range) { if ( range.loose === !!options.loose && range.includePrerelease === !!options.includePrerelease ) { return range } else { return new Range(range.raw, options) } } if (range instanceof Comparator) { // just put it in the set and return this.raw = range.value this.set = [[range]] this.formatted = undefined return this } this.options = options this.loose = !!options.loose this.includePrerelease = !!options.includePrerelease // First reduce all whitespace as much as possible so we do not have to rely // on potentially slow regexes like \s*. This is then stored and used for // future error messages as well. this.raw = range.trim().replace(SPACE_CHARACTERS, ' ') // First, split on || this.set = this.raw .split('||') // map the range to a 2d array of comparators .map(r => this.parseRange(r.trim())) // throw out any comparator lists that are empty // this generally means that it was not a valid range, which is allowed // in loose mode, but will still throw if the WHOLE range is invalid. .filter(c => c.length) if (!this.set.length) { throw new TypeError(`Invalid SemVer Range: ${this.raw}`) } // if we have any that are not the null set, throw out null sets. if (this.set.length > 1) { // keep the first one, in case they're all null sets const first = this.set[0] this.set = this.set.filter(c => !isNullSet(c[0])) if (this.set.length === 0) { this.set = [first] } else if (this.set.length > 1) { // if we have any that are *, then the range is just * for (const c of this.set) { if (c.length === 1 && isAny(c[0])) { this.set = [c] break } } } } this.formatted = undefined } get range () { if (this.formatted === undefined) { this.formatted = '' for (let i = 0; i < this.set.length; i++) { if (i > 0) { this.formatted += '||' } const comps = this.set[i] for (let k = 0; k < comps.length; k++) { if (k > 0) { this.formatted += ' ' } this.formatted += comps[k].toString().trim() } } } return this.formatted } format () { return this.range } toString () { return this.range } parseRange (range) { // memoize range parsing for performance. // this is a very hot path, and fully deterministic. const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE) const memoKey = memoOpts + ':' + range const cached = cache.get(memoKey) if (cached) { return cached } const loose = this.options.loose // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) debug('hyphen replace', range) // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) debug('comparator trim', range) // `~ 1.2.3` => `~1.2.3` range = range.replace(re[t.TILDETRIM], tildeTrimReplace) debug('tilde trim', range) // `^ 1.2.3` => `^1.2.3` range = range.replace(re[t.CARETTRIM], caretTrimReplace) debug('caret trim', range) // At this point, the range is completely trimmed and // ready to be split into comparators. let rangeList = range .split(' ') .map(comp => parseComparator(comp, this.options)) .join(' ') .split(/\s+/) // >=0.0.0 is equivalent to * .map(comp => replaceGTE0(comp, this.options)) if (loose) { // in loose mode, throw out any that are not valid comparators rangeList = rangeList.filter(comp => { debug('loose invalid filter', comp, this.options) return !!comp.match(re[t.COMPARATORLOOSE]) }) } debug('range list', rangeList) // if any comparators are the null set, then replace with JUST null set // if more than one comparator, remove any * comparators // also, don't include the same comparator more than once const rangeMap = new Map() const comparators = rangeList.map(comp => new Comparator(comp, this.options)) for (const comp of comparators) { if (isNullSet(comp)) { return [comp] } rangeMap.set(comp.value, comp) } if (rangeMap.size > 1 && rangeMap.has('')) { rangeMap.delete('') } const result = [...rangeMap.values()] cache.set(memoKey, result) return result } intersects (range, options) { if (!(range instanceof Range)) { throw new TypeError('a Range is required') } return this.set.some((thisComparators) => { return ( isSatisfiable(thisComparators, options) && range.set.some((rangeComparators) => { return ( isSatisfiable(rangeComparators, options) && thisComparators.every((thisComparator) => { return rangeComparators.every((rangeComparator) => { return thisComparator.intersects(rangeComparator, options) }) }) ) }) ) }) } // if ANY of the sets match ALL of its comparators, then pass test (version) { if (!version) { return false } if (typeof version === 'string') { try { version = new SemVer(version, this.options) } catch (er) { return false } } for (let i = 0; i < this.set.length; i++) { if (testSet(this.set[i], version, this.options)) { return true } } return false } } module.exports = Range const LRU = __webpack_require__(/*! ../internal/lrucache */ "./node_modules/semver/internal/lrucache.js") const cache = new LRU() const parseOptions = __webpack_require__(/*! ../internal/parse-options */ "./node_modules/semver/internal/parse-options.js") const Comparator = __webpack_require__(/*! ./comparator */ "./node_modules/semver/classes/comparator.js") const debug = __webpack_require__(/*! ../internal/debug */ "./node_modules/semver/internal/debug.js") const SemVer = __webpack_require__(/*! ./semver */ "./node_modules/semver/classes/semver.js") const { safeRe: re, t, comparatorTrimReplace, tildeTrimReplace, caretTrimReplace, } = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = __webpack_require__(/*! ../internal/constants */ "./node_modules/semver/internal/constants.js") const isNullSet = c => c.value === '<0.0.0-0' const isAny = c => c.value === '' // take a set of comparators and determine whether there // exists a version which can satisfy it const isSatisfiable = (comparators, options) => { let result = true const remainingComparators = comparators.slice() let testComparator = remainingComparators.pop() while (result && remainingComparators.length) { result = remainingComparators.every((otherComparator) => { return testComparator.intersects(otherComparator, options) }) testComparator = remainingComparators.pop() } return result } // comprised of xranges, tildes, stars, and gtlt's at this point. // already replaced the hyphen ranges // turn into a set of JUST comparators. const parseComparator = (comp, options) => { debug('comp', comp, options) comp = replaceCarets(comp, options) debug('caret', comp) comp = replaceTildes(comp, options) debug('tildes', comp) comp = replaceXRanges(comp, options) debug('xrange', comp) comp = replaceStars(comp, options) debug('stars', comp) return comp } const isX = id => !id || id.toLowerCase() === 'x' || id === '*' // ~, ~> --> * (any, kinda silly) // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 // ~0.0.1 --> >=0.0.1 <0.1.0-0 const replaceTildes = (comp, options) => { return comp .trim() .split(/\s+/) .map((c) => replaceTilde(c, options)) .join(' ') } const replaceTilde = (comp, options) => { const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] return comp.replace(r, (_, M, m, p, pr) => { debug('tilde', comp, _, M, m, p, pr) let ret if (isX(M)) { ret = '' } else if (isX(m)) { ret = `>=${M}.0.0 <${+M + 1}.0.0-0` } else if (isX(p)) { // ~1.2 == >=1.2.0 <1.3.0-0 ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` } else if (pr) { debug('replaceTilde pr', pr) ret = `>=${M}.${m}.${p}-${pr } <${M}.${+m + 1}.0-0` } else { // ~1.2.3 == >=1.2.3 <1.3.0-0 ret = `>=${M}.${m}.${p } <${M}.${+m + 1}.0-0` } debug('tilde return', ret) return ret }) } // ^ --> * (any, kinda silly) // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 // ^1.2.3 --> >=1.2.3 <2.0.0-0 // ^1.2.0 --> >=1.2.0 <2.0.0-0 // ^0.0.1 --> >=0.0.1 <0.0.2-0 // ^0.1.0 --> >=0.1.0 <0.2.0-0 const replaceCarets = (comp, options) => { return comp .trim() .split(/\s+/) .map((c) => replaceCaret(c, options)) .join(' ') } const replaceCaret = (comp, options) => { debug('caret', comp, options) const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] const z = options.includePrerelease ? '-0' : '' return comp.replace(r, (_, M, m, p, pr) => { debug('caret', comp, _, M, m, p, pr) let ret if (isX(M)) { ret = '' } else if (isX(m)) { ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` } else if (isX(p)) { if (M === '0') { ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` } else { ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` } } else if (pr) { debug('replaceCaret pr', pr) if (M === '0') { if (m === '0') { ret = `>=${M}.${m}.${p}-${pr } <${M}.${m}.${+p + 1}-0` } else { ret = `>=${M}.${m}.${p}-${pr } <${M}.${+m + 1}.0-0` } } else { ret = `>=${M}.${m}.${p}-${pr } <${+M + 1}.0.0-0` } } else { debug('no pr') if (M === '0') { if (m === '0') { ret = `>=${M}.${m}.${p }${z} <${M}.${m}.${+p + 1}-0` } else { ret = `>=${M}.${m}.${p }${z} <${M}.${+m + 1}.0-0` } } else { ret = `>=${M}.${m}.${p } <${+M + 1}.0.0-0` } } debug('caret return', ret) return ret }) } const replaceXRanges = (comp, options) => { debug('replaceXRanges', comp, options) return comp .split(/\s+/) .map((c) => replaceXRange(c, options)) .join(' ') } const replaceXRange = (comp, options) => { comp = comp.trim() const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] return comp.replace(r, (ret, gtlt, M, m, p, pr) => { debug('xRange', comp, ret, gtlt, M, m, p, pr) const xM = isX(M) const xm = xM || isX(m) const xp = xm || isX(p) const anyX = xp if (gtlt === '=' && anyX) { gtlt = '' } // if we're including prereleases in the match, then we need // to fix this to -0, the lowest possible prerelease value pr = options.includePrerelease ? '-0' : '' if (xM) { if (gtlt === '>' || gtlt === '<') { // nothing is allowed ret = '<0.0.0-0' } else { // nothing is forbidden ret = '*' } } else if (gtlt && anyX) { // we know patch is an x, because we have any x at all. // replace X with 0 if (xm) { m = 0 } p = 0 if (gtlt === '>') { // >1 => >=2.0.0 // >1.2 => >=1.3.0 gtlt = '>=' if (xm) { M = +M + 1 m = 0 p = 0 } else { m = +m + 1 p = 0 } } else if (gtlt === '<=') { // <=0.7.x is actually <0.8.0, since any 0.7.x should // pass. Similarly, <=7.x is actually <8.0.0, etc. gtlt = '<' if (xm) { M = +M + 1 } else { m = +m + 1 } } if (gtlt === '<') { pr = '-0' } ret = `${gtlt + M}.${m}.${p}${pr}` } else if (xm) { ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` } else if (xp) { ret = `>=${M}.${m}.0${pr } <${M}.${+m + 1}.0-0` } debug('xRange return', ret) return ret }) } // Because * is AND-ed with everything else in the comparator, // and '' means "any version", just remove the *s entirely. const replaceStars = (comp, options) => { debug('replaceStars', comp, options) // Looseness is ignored here. star is always as loose as it gets! return comp .trim() .replace(re[t.STAR], '') } const replaceGTE0 = (comp, options) => { debug('replaceGTE0', comp, options) return comp .trim() .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') } // This function is passed to string.replace(re[t.HYPHENRANGE]) // M, m, patch, prerelease, build // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 // 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do // 1.2 - 3.4 => >=1.2.0 <3.5.0-0 // TODO build? const hyphenReplace = incPr => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => { if (isX(fM)) { from = '' } else if (isX(fm)) { from = `>=${fM}.0.0${incPr ? '-0' : ''}` } else if (isX(fp)) { from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` } else if (fpr) { from = `>=${from}` } else { from = `>=${from}${incPr ? '-0' : ''}` } if (isX(tM)) { to = '' } else if (isX(tm)) { to = `<${+tM + 1}.0.0-0` } else if (isX(tp)) { to = `<${tM}.${+tm + 1}.0-0` } else if (tpr) { to = `<=${tM}.${tm}.${tp}-${tpr}` } else if (incPr) { to = `<${tM}.${tm}.${+tp + 1}-0` } else { to = `<=${to}` } return `${from} ${to}`.trim() } const testSet = (set, version, options) => { for (let i = 0; i < set.length; i++) { if (!set[i].test(version)) { return false } } if (version.prerelease.length && !options.includePrerelease) { // Find the set of versions that are allowed to have prereleases // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 // That should allow `1.2.3-pr.2` to pass. // However, `1.2.4-alpha.notready` should NOT be allowed, // even though it's within the range set by the comparators. for (let i = 0; i < set.length; i++) { debug(set[i].semver) if (set[i].semver === Comparator.ANY) { continue } if (set[i].semver.prerelease.length > 0) { const allowed = set[i].semver if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) { return true } } } // Version has a -pre, but it's not one of the ones we like. return false } return true } /***/ }), /***/ "./node_modules/semver/classes/semver.js": /*!***********************************************!*\ !*** ./node_modules/semver/classes/semver.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const debug = __webpack_require__(/*! ../internal/debug */ "./node_modules/semver/internal/debug.js") const { MAX_LENGTH, MAX_SAFE_INTEGER } = __webpack_require__(/*! ../internal/constants */ "./node_modules/semver/internal/constants.js") const { safeRe: re, t } = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const parseOptions = __webpack_require__(/*! ../internal/parse-options */ "./node_modules/semver/internal/parse-options.js") const { compareIdentifiers } = __webpack_require__(/*! ../internal/identifiers */ "./node_modules/semver/internal/identifiers.js") class SemVer { constructor (version, options) { options = parseOptions(options) if (version instanceof SemVer) { if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) { return version } else { version = version.version } } else if (typeof version !== 'string') { throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`) } if (version.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ) } debug('SemVer', version, options) this.options = options this.loose = !!options.loose // this isn't actually relevant for versions, but keep it so that we // don't run into trouble passing this.options around. this.includePrerelease = !!options.includePrerelease const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) if (!m) { throw new TypeError(`Invalid Version: ${version}`) } this.raw = version // these are actually numbers this.major = +m[1] this.minor = +m[2] this.patch = +m[3] if (this.major > MAX_SAFE_INTEGER || this.major < 0) { throw new TypeError('Invalid major version') } if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { throw new TypeError('Invalid minor version') } if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { throw new TypeError('Invalid patch version') } // numberify any prerelease numeric ids if (!m[4]) { this.prerelease = [] } else { this.prerelease = m[4].split('.').map((id) => { if (/^[0-9]+$/.test(id)) { const num = +id if (num >= 0 && num < MAX_SAFE_INTEGER) { return num } } return id }) } this.build = m[5] ? m[5].split('.') : [] this.format() } format () { this.version = `${this.major}.${this.minor}.${this.patch}` if (this.prerelease.length) { this.version += `-${this.prerelease.join('.')}` } return this.version } toString () { return this.version } compare (other) { debug('SemVer.compare', this.version, this.options, other) if (!(other instanceof SemVer)) { if (typeof other === 'string' && other === this.version) { return 0 } other = new SemVer(other, this.options) } if (other.version === this.version) { return 0 } return this.compareMain(other) || this.comparePre(other) } compareMain (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } return ( compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch) ) } comparePre (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } // NOT having a prerelease is > having one if (this.prerelease.length && !other.prerelease.length) { return -1 } else if (!this.prerelease.length && other.prerelease.length) { return 1 } else if (!this.prerelease.length && !other.prerelease.length) { return 0 } let i = 0 do { const a = this.prerelease[i] const b = other.prerelease[i] debug('prerelease compare', i, a, b) if (a === undefined && b === undefined) { return 0 } else if (b === undefined) { return 1 } else if (a === undefined) { return -1 } else if (a === b) { continue } else { return compareIdentifiers(a, b) } } while (++i) } compareBuild (other) { if (!(other instanceof SemVer)) { other = new SemVer(other, this.options) } let i = 0 do { const a = this.build[i] const b = other.build[i] debug('build compare', i, a, b) if (a === undefined && b === undefined) { return 0 } else if (b === undefined) { return 1 } else if (a === undefined) { return -1 } else if (a === b) { continue } else { return compareIdentifiers(a, b) } } while (++i) } // preminor will bump the version up to the next minor release, and immediately // down to pre-release. premajor and prepatch work the same way. inc (release, identifier, identifierBase) { if (release.startsWith('pre')) { if (!identifier && identifierBase === false) { throw new Error('invalid increment argument: identifier is empty') } // Avoid an invalid semver results if (identifier) { const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]) if (!match || match[1] !== identifier) { throw new Error(`invalid identifier: ${identifier}`) } } } switch (release) { case 'premajor': this.prerelease.length = 0 this.patch = 0 this.minor = 0 this.major++ this.inc('pre', identifier, identifierBase) break case 'preminor': this.prerelease.length = 0 this.patch = 0 this.minor++ this.inc('pre', identifier, identifierBase) break case 'prepatch': // If this is already a prerelease, it will bump to the next version // drop any prereleases that might already exist, since they are not // relevant at this point. this.prerelease.length = 0 this.inc('patch', identifier, identifierBase) this.inc('pre', identifier, identifierBase) break // If the input is a non-prerelease version, this acts the same as // prepatch. case 'prerelease': if (this.prerelease.length === 0) { this.inc('patch', identifier, identifierBase) } this.inc('pre', identifier, identifierBase) break case 'release': if (this.prerelease.length === 0) { throw new Error(`version ${this.raw} is not a prerelease`) } this.prerelease.length = 0 break case 'major': // If this is a pre-major version, bump up to the same major version. // Otherwise increment major. // 1.0.0-5 bumps to 1.0.0 // 1.1.0 bumps to 2.0.0 if ( this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0 ) { this.major++ } this.minor = 0 this.patch = 0 this.prerelease = [] break case 'minor': // If this is a pre-minor version, bump up to the same minor version. // Otherwise increment minor. // 1.2.0-5 bumps to 1.2.0 // 1.2.1 bumps to 1.3.0 if (this.patch !== 0 || this.prerelease.length === 0) { this.minor++ } this.patch = 0 this.prerelease = [] break case 'patch': // If this is not a pre-release version, it will increment the patch. // If it is a pre-release it will bump up to the same patch version. // 1.2.0-5 patches to 1.2.0 // 1.2.0 patches to 1.2.1 if (this.prerelease.length === 0) { this.patch++ } this.prerelease = [] break // This probably shouldn't be used publicly. // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. case 'pre': { const base = Number(identifierBase) ? 1 : 0 if (this.prerelease.length === 0) { this.prerelease = [base] } else { let i = this.prerelease.length while (--i >= 0) { if (typeof this.prerelease[i] === 'number') { this.prerelease[i]++ i = -2 } } if (i === -1) { // didn't increment anything if (identifier === this.prerelease.join('.') && identifierBase === false) { throw new Error('invalid increment argument: identifier already exists') } this.prerelease.push(base) } } if (identifier) { // 1.2.0-beta.1 bumps to 1.2.0-beta.2, // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 let prerelease = [identifier, base] if (identifierBase === false) { prerelease = [identifier] } if (compareIdentifiers(this.prerelease[0], identifier) === 0) { if (isNaN(this.prerelease[1])) { this.prerelease = prerelease } } else { this.prerelease = prerelease } } break } default: throw new Error(`invalid increment argument: ${release}`) } this.raw = this.format() if (this.build.length) { this.raw += `+${this.build.join('.')}` } return this } } module.exports = SemVer /***/ }), /***/ "./node_modules/semver/functions/cmp.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/cmp.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const eq = __webpack_require__(/*! ./eq */ "./node_modules/semver/functions/eq.js") const neq = __webpack_require__(/*! ./neq */ "./node_modules/semver/functions/neq.js") const gt = __webpack_require__(/*! ./gt */ "./node_modules/semver/functions/gt.js") const gte = __webpack_require__(/*! ./gte */ "./node_modules/semver/functions/gte.js") const lt = __webpack_require__(/*! ./lt */ "./node_modules/semver/functions/lt.js") const lte = __webpack_require__(/*! ./lte */ "./node_modules/semver/functions/lte.js") const cmp = (a, op, b, loose) => { switch (op) { case '===': if (typeof a === 'object') { a = a.version } if (typeof b === 'object') { b = b.version } return a === b case '!==': if (typeof a === 'object') { a = a.version } if (typeof b === 'object') { b = b.version } return a !== b case '': case '=': case '==': return eq(a, b, loose) case '!=': return neq(a, b, loose) case '>': return gt(a, b, loose) case '>=': return gte(a, b, loose) case '<': return lt(a, b, loose) case '<=': return lte(a, b, loose) default: throw new TypeError(`Invalid operator: ${op}`) } } module.exports = cmp /***/ }), /***/ "./node_modules/semver/functions/coerce.js": /*!*************************************************!*\ !*** ./node_modules/semver/functions/coerce.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/semver/classes/semver.js") const parse = __webpack_require__(/*! ./parse */ "./node_modules/semver/functions/parse.js") const { safeRe: re, t } = __webpack_require__(/*! ../internal/re */ "./node_modules/semver/internal/re.js") const coerce = (version, options) => { if (version instanceof SemVer) { return version } if (typeof version === 'number') { version = String(version) } if (typeof version !== 'string') { return null } options = options || {} let match = null if (!options.rtl) { match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]) } else { // Find the right-most coercible string that does not share // a terminus with a more left-ward coercible string. // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4' // // Walk through the string checking with a /g regexp // Manually set the index so as to pick up overlapping matches. // Stop when we get a match that ends at the string end, since no // coercible string can be more right-ward without the same terminus. const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL] let next while ((next = coerceRtlRegex.exec(version)) && (!match || match.index + match[0].length !== version.length) ) { if (!match || next.index + next[0].length !== match.index + match[0].length) { match = next } coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length } // leave it in a clean state coerceRtlRegex.lastIndex = -1 } if (match === null) { return null } const major = match[2] const minor = match[3] || '0' const patch = match[4] || '0' const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '' const build = options.includePrerelease && match[6] ? `+${match[6]}` : '' return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options) } module.exports = coerce /***/ }), /***/ "./node_modules/semver/functions/compare.js": /*!**************************************************!*\ !*** ./node_modules/semver/functions/compare.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/semver/classes/semver.js") const compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose)) module.exports = compare /***/ }), /***/ "./node_modules/semver/functions/eq.js": /*!*********************************************!*\ !*** ./node_modules/semver/functions/eq.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const eq = (a, b, loose) => compare(a, b, loose) === 0 module.exports = eq /***/ }), /***/ "./node_modules/semver/functions/gt.js": /*!*********************************************!*\ !*** ./node_modules/semver/functions/gt.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const gt = (a, b, loose) => compare(a, b, loose) > 0 module.exports = gt /***/ }), /***/ "./node_modules/semver/functions/gte.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/gte.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const gte = (a, b, loose) => compare(a, b, loose) >= 0 module.exports = gte /***/ }), /***/ "./node_modules/semver/functions/lt.js": /*!*********************************************!*\ !*** ./node_modules/semver/functions/lt.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const lt = (a, b, loose) => compare(a, b, loose) < 0 module.exports = lt /***/ }), /***/ "./node_modules/semver/functions/lte.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/lte.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const lte = (a, b, loose) => compare(a, b, loose) <= 0 module.exports = lte /***/ }), /***/ "./node_modules/semver/functions/neq.js": /*!**********************************************!*\ !*** ./node_modules/semver/functions/neq.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const compare = __webpack_require__(/*! ./compare */ "./node_modules/semver/functions/compare.js") const neq = (a, b, loose) => compare(a, b, loose) !== 0 module.exports = neq /***/ }), /***/ "./node_modules/semver/functions/parse.js": /*!************************************************!*\ !*** ./node_modules/semver/functions/parse.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const SemVer = __webpack_require__(/*! ../classes/semver */ "./node_modules/semver/classes/semver.js") const parse = (version, options, throwErrors = false) => { if (version instanceof SemVer) { return version } try { return new SemVer(version, options) } catch (er) { if (!throwErrors) { return null } throw er } } module.exports = parse /***/ }), /***/ "./node_modules/semver/functions/satisfies.js": /*!****************************************************!*\ !*** ./node_modules/semver/functions/satisfies.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const Range = __webpack_require__(/*! ../classes/range */ "./node_modules/semver/classes/range.js") const satisfies = (version, range, options) => { try { range = new Range(range, options) } catch (er) { return false } return range.test(version) } module.exports = satisfies /***/ }), /***/ "./node_modules/semver/internal/constants.js": /*!***************************************************!*\ !*** ./node_modules/semver/internal/constants.js ***! \***************************************************/ /***/ ((module) => { "use strict"; // Note: this is the semver.org version of the spec that it implements // Not necessarily the package version of this code. const SEMVER_SPEC_VERSION = '2.0.0' const MAX_LENGTH = 256 const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ 9007199254740991 // Max safe segment length for coercion. const MAX_SAFE_COMPONENT_LENGTH = 16 // Max safe length for a build identifier. The max length minus 6 characters for // the shortest version with a build 0.0.0+BUILD. const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6 const RELEASE_TYPES = [ 'major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease', ] module.exports = { MAX_LENGTH, MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_SAFE_INTEGER, RELEASE_TYPES, SEMVER_SPEC_VERSION, FLAG_INCLUDE_PRERELEASE: 0b001, FLAG_LOOSE: 0b010, } /***/ }), /***/ "./node_modules/semver/internal/debug.js": /*!***********************************************!*\ !*** ./node_modules/semver/internal/debug.js ***! \***********************************************/ /***/ ((module) => { "use strict"; const debug = ( typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ) ? (...args) => console.error('SEMVER', ...args) : () => {} module.exports = debug /***/ }), /***/ "./node_modules/semver/internal/identifiers.js": /*!*****************************************************!*\ !*** ./node_modules/semver/internal/identifiers.js ***! \*****************************************************/ /***/ ((module) => { "use strict"; const numeric = /^[0-9]+$/ const compareIdentifiers = (a, b) => { const anum = numeric.test(a) const bnum = numeric.test(b) if (anum && bnum) { a = +a b = +b } return a === b ? 0 : (anum && !bnum) ? -1 : (bnum && !anum) ? 1 : a < b ? -1 : 1 } const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) module.exports = { compareIdentifiers, rcompareIdentifiers, } /***/ }), /***/ "./node_modules/semver/internal/lrucache.js": /*!**************************************************!*\ !*** ./node_modules/semver/internal/lrucache.js ***! \**************************************************/ /***/ ((module) => { "use strict"; class LRUCache { constructor () { this.max = 1000 this.map = new Map() } get (key) { const value = this.map.get(key) if (value === undefined) { return undefined } else { // Remove the key from the map and add it to the end this.map.delete(key) this.map.set(key, value) return value } } delete (key) { return this.map.delete(key) } set (key, value) { const deleted = this.delete(key) if (!deleted && value !== undefined) { // If cache is full, delete the least recently used item if (this.map.size >= this.max) { const firstKey = this.map.keys().next().value this.delete(firstKey) } this.map.set(key, value) } return this } } module.exports = LRUCache /***/ }), /***/ "./node_modules/semver/internal/parse-options.js": /*!*******************************************************!*\ !*** ./node_modules/semver/internal/parse-options.js ***! \*******************************************************/ /***/ ((module) => { "use strict"; // parse out just the options we care about const looseOption = Object.freeze({ loose: true }) const emptyOpts = Object.freeze({ }) const parseOptions = options => { if (!options) { return emptyOpts } if (typeof options !== 'object') { return looseOption } return options } module.exports = parseOptions /***/ }), /***/ "./node_modules/semver/internal/re.js": /*!********************************************!*\ !*** ./node_modules/semver/internal/re.js ***! \********************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; const { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_LENGTH, } = __webpack_require__(/*! ./constants */ "./node_modules/semver/internal/constants.js") const debug = __webpack_require__(/*! ./debug */ "./node_modules/semver/internal/debug.js") exports = module.exports = {} // The actual regexps go on exports.re const re = exports.re = [] const safeRe = exports.safeRe = [] const src = exports.src = [] const safeSrc = exports.safeSrc = [] const t = exports.t = {} let R = 0 const LETTERDASHNUMBER = '[a-zA-Z0-9-]' // Replace some greedy regex tokens to prevent regex dos issues. These regex are // used internally via the safeRe object since all inputs in this library get // normalized first to trim and collapse all extra whitespace. The original // regexes are exported for userland consumption and lower level usage. A // future breaking change could export the safer regex only with a note that // all input should have extra whitespace removed. const safeRegexReplacements = [ ['\\s', 1], ['\\d', MAX_LENGTH], [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], ] const makeSafeRegex = (value) => { for (const [token, max] of safeRegexReplacements) { value = value .split(`${token}*`).join(`${token}{0,${max}}`) .split(`${token}+`).join(`${token}{1,${max}}`) } return value } const createToken = (name, value, isGlobal) => { const safe = makeSafeRegex(value) const index = R++ debug(name, index, value) t[name] = index src[index] = value safeSrc[index] = safe re[index] = new RegExp(value, isGlobal ? 'g' : undefined) safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) } // The following Regular Expressions can be used for tokenizing, // validating, and parsing SemVer version strings. // ## Numeric Identifier // A single `0`, or a non-zero digit followed by zero or more digits. createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') createToken('NUMERICIDENTIFIERLOOSE', '\\d+') // ## Non-numeric Identifier // Zero or more digits, followed by a letter or hyphen, and then zero or // more letters, digits, or hyphens. createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`) // ## Main Version // Three dot-separated numeric identifiers. createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`) createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`) // ## Pre-release Version Identifier // A numeric identifier, or a non-numeric identifier. // Non-numberic identifiers include numberic identifiers but can be longer. // Therefore non-numberic identifiers must go first. createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER] }|${src[t.NUMERICIDENTIFIER]})`) createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER] }|${src[t.NUMERICIDENTIFIERLOOSE]})`) // ## Pre-release Version // Hyphen, followed by one or more dot-separated pre-release version // identifiers. createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] }(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] }(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) // ## Build Metadata Identifier // Any combination of digits, letters, or hyphens. createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`) // ## Build Metadata // Plus sign, followed by one or more period-separated build metadata // identifiers. createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] }(?:\\.${src[t.BUILDIDENTIFIER]})*))`) // ## Full Version String // A main version, followed optionally by a pre-release version and // build metadata. // Note that the only major, minor, patch, and pre-release sections of // the version string are capturing groups. The build metadata is not a // capturing group, because it should not ever be used in version // comparison. createToken('FULLPLAIN', `v?${src[t.MAINVERSION] }${src[t.PRERELEASE]}?${ src[t.BUILD]}?`) createToken('FULL', `^${src[t.FULLPLAIN]}$`) // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty // common in the npm registry. createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] }${src[t.PRERELEASELOOSE]}?${ src[t.BUILD]}?`) createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) createToken('GTLT', '((?:<|>)?=?)') // Something like "2.*" or "1.2.x". // Note that "x.x" is a valid xRange identifer, meaning "any version" // Only the first item is strictly required. createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${ src[t.BUILD]}?` + `)?)?`) createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${ src[t.BUILD]}?` + `)?)?`) createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) // Coercion. // Extract anything that could conceivably be a part of a valid semver createToken('COERCEPLAIN', `${'(^|[^\\d])' + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`) createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`) createToken('COERCEFULL', src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`) createToken('COERCERTL', src[t.COERCE], true) createToken('COERCERTLFULL', src[t.COERCEFULL], true) // Tilde ranges. // Meaning is "reasonably at or greater than" createToken('LONETILDE', '(?:~>?)') createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) exports.tildeTrimReplace = '$1~' createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) // Caret ranges. // Meaning is "at least and backwards compatible with" createToken('LONECARET', '(?:\\^)') createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) exports.caretTrimReplace = '$1^' createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) // A simple gt/lt/eq thing, or just "" to indicate "any version" createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) // An expression to strip any whitespace between the gtlt and the thing // it modifies, so that `> 1.2.3` ==> `>1.2.3` createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] }\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) exports.comparatorTrimReplace = '$1$2$3' // Something like `1.2.3 - 1.2.4` // Note that these all use the loose form, because they'll be // checked against either the strict or loose comparator form // later. createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`) createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`) // Star ranges basically just allow anything at all. createToken('STAR', '(<|>)?=?\\s*\\*') // >=0.0.0 is like a star createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$') createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$') /***/ }), /***/ "./package.json": /*!**********************!*\ !*** ./package.json ***! \**********************/ /***/ ((module) => { "use strict"; module.exports = /*#__PURE__*/JSON.parse('{"name":"geckolib","version":"4.2.5","private":true,"description":"GeckoLib Models & Animations","main":"index.js","scripts":{"prebuild":"npm run test","build":"npm run build:only","build:only":"webpack && npm run update_manifest","update_manifest":"node scripts/updateManifest.mjs","start":"webpack --watch --mode=development","lint":"eslint .","lint:fix":"eslint --fix .","tsc":"tsc --noEmit","pretest":"npm run lint && npm run tsc","test":"npm run test:only","test:only":"jest"},"author":"Eliot Lash, Tslat, Gecko, McHorse, matmat37000","license":"MIT","pluginOptions":{"title":"GeckoLib Models & Animations","description":"Create animated blocks, items, entities, and armor for the GeckoLib java mod library.","icon":"icon.png","tags":["Minecraft: Java Edition"],"variant":"both","min_version":"5.0.0","max_version":"6.0.0","await_loading":true,"has_changelog":true,"website":"https://github.com/bernie-g/geckolib/wiki","repository":"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/geckolib","bug_tracker":"https://github.com/bernie-g/geckolib/issues"},"sideEffects":["./index.js"],"devDependencies":{"@types/jest":"^30.0.0","@types/lodash":"^4.17.20","@typescript-eslint/eslint-plugin":"^8.41.0","@typescript-eslint/parser":"^8.41.0","blockbench-types":"^5.0.6","css-loader":"^7.1.2","eol":"0.10.0","eslint":"^9.34.0","indent-string":"^5.0.0","jest":"^30.1.1","to-string-loader":"^1.2.0","ts-jest":"^29.4.1","ts-loader":"^9.5.4","typescript":"^5.9.2","webpack":"^5.101.3","webpack-cli":"^6.0.1"},"dependencies":{"lodash":"^4.17.21","semver":"7.7.2"}}'); /***/ }), /***/ "./resources/armorTemplate.json": /*!**************************************!*\ !*** ./resources/armorTemplate.json ***! \**************************************/ /***/ ((module) => { "use strict"; module.exports = /*#__PURE__*/JSON.parse('{"meta":{"format_version":"3.2","model_format":"geckolib_model","box_uv":true},"name":"CustomArmor","geo_name":"CustomArmor","resolution":{"width":64,"height":64},"elements":[{"name":"dontTouch","from":[-4,24,-4],"to":[4,32,4],"autouv":1,"color":0,"export":false,"locked":true,"origin":[0,0,0],"uuid":"9675593e-b27d-b70e-e1ea-1fc29f46a294"},{"name":"dontTouch","from":[-4,12,-2],"to":[4,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[0,24,0],"uuid":"fa43156a-2a62-948c-082f-483d525f6d1f"},{"name":"dontTouch","from":[4,12,-2],"to":[8,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"aa51170c-8b32-fb62-71f1-58ac0b7785a8"},{"name":"dontTouch","from":[-8,12,-2],"to":[-4,24,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"bf2c2539-20e3-cfcc-94c0-491734019889"},{"name":"dontTouch","from":[-4,0,-2],"to":[0,12,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"17b9bae0-356a-9bba-fad9-4672e2671191"},{"name":"dontTouch","from":[0,0,-2],"to":[4,12,2],"autouv":1,"color":0,"export":false,"locked":true,"origin":[4,22,0],"uuid":"7b31bac4-dc40-2b93-1204-7bbdcfe7d924"}],"outliner":[{"name":"bipedHead","uuid":"d340b6fa-56aa-9c0f-3560-7a067643b77d","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":["9675593e-b27d-b70e-e1ea-1fc29f46a294",{"name":"armorHead","uuid":"6ab88dea-c816-d2bb-6be9-05ed7838da97","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":[]}]},{"name":"bipedBody","uuid":"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":["fa43156a-2a62-948c-082f-483d525f6d1f",{"name":"armorBody","uuid":"282fcdbb-8ea9-4a13-4154-f2ed20d696c8","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,24,0],"children":[]}]},{"name":"bipedRightArm","uuid":"d8113cc7-7e10-0930-259e-b8e4211ce9da","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[5,22,0],"children":["aa51170c-8b32-fb62-71f1-58ac0b7785a8",{"name":"armorRightArm","uuid":"c5300e23-fd2f-b56c-3552-45d6650e11c6","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[5,22,0],"children":[]}]},{"name":"bipedLeftArm","uuid":"3b8901e8-3420-0834-51eb-76d64ff2ae8f","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-5,22,0],"children":["bf2c2539-20e3-cfcc-94c0-491734019889",{"name":"armorLeftArm","uuid":"b0d41a53-f4ce-53c1-f899-5a2048c90ac2","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-5,22,0],"children":[]}]},{"name":"bipedLeftLeg","uuid":"37231be7-a8ef-22ca-7fea-40aed58003bb","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":["17b9bae0-356a-9bba-fad9-4672e2671191",{"name":"armorLeftLeg","uuid":"e4b19746-2d17-1f56-befe-00718165ae50","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":[]},{"name":"armorLeftBoot","uuid":"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[-2,12,0],"children":[]}]},{"name":"bipedRightLeg","uuid":"45c031a5-b6be-e0a7-5454-b45d07f28429","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":["7b31bac4-dc40-2b93-1204-7bbdcfe7d924",{"name":"armorRightLeg","uuid":"60238f18-e74b-c863-cb45-2e2f162221bd","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":[]},{"name":"armorRightBoot","uuid":"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[2,12,0],"children":[]}]}],"textures":[]}'); /***/ }), /***/ "./resources/easing_keyframes.css": /*!****************************************!*\ !*** ./resources/easing_keyframes.css ***! \****************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var result = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./easing_keyframes.css */ "./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css"); if (result && result.__esModule) { result = result.default; } if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /***/ "./ts/animationUi.ts": /*!***************************!*\ !*** ./ts/animationUi.ts ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ displayAnimationFrameCallback: () => (/* binding */ displayAnimationFrameCallback), /* harmony export */ loadAnimationUI: () => (/* binding */ loadAnimationUI), /* harmony export */ renderFrameCallback: () => (/* binding */ renderFrameCallback), /* harmony export */ unloadAnimationUI: () => (/* binding */ unloadAnimationUI), /* harmony export */ updateKeyframeEasing: () => (/* binding */ updateKeyframeEasing), /* harmony export */ updateKeyframeEasingArg: () => (/* binding */ updateKeyframeEasingArg), /* harmony export */ updateKeyframeSelectionCallback: () => (/* binding */ updateKeyframeSelectionCallback) /* harmony export */ }); /* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/uniq */ "./node_modules/lodash/uniq.js"); /* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_uniq__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./easing */ "./ts/easing.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); const easingRegExp = /^ease(InOut|In|Out)?([\w]+)$/; const loadAnimationUI = () => { Blockbench.on('display_animation_frame', displayAnimationFrameCallback); Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.on('render_frame', renderFrameCallback); (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, "updateKeyframeEasing", updateKeyframeEasing); (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, "updateKeyframeEasingArg", updateKeyframeEasingArg); }; const unloadAnimationUI = () => { Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback); Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.removeListener('render_frame', renderFrameCallback); }; const displayAnimationFrameCallback = ( /*...args*/) => { // const keyframe = $('#keyframe'); // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here }; function renderFrameCallback() { if (Format.id !== _constants__WEBPACK_IMPORTED_MODULE_3__.GECKOLIB_MODEL_ID) return; Timeline.keyframes.forEach((kf) => { if (kf.interpolation != "linear" && kf.easing != undefined) { kf.easing = undefined; kf.easingArgs = undefined; window.updateKeyframeSelection(); } if (kf.interpolation === "step") { kf.interpolation = "linear"; if (kf.data_points.length == 1) addDataPoint(); window.updateKeyframeSelection(); } updateKeyframeIcon(kf); }); const addPrePostButton = document.querySelector('#keyframe_type_label > div'); if (addPrePostButton) addPrePostButton.hidden = true; } function updateKeyframeEasing(value) { Undo.initEdit({ keyframes: Timeline.selected }); // var axis = $(obj).attr('axis'); // const value = $(obj).val(); // console.log('updateKeyframeEasing value:', value, 'obj:', obj); if (value === "-") return; Timeline.selected.forEach((kf) => { kf.easing = value; kf.easingArgs = undefined; kf.interpolation = 'linear'; }); window.updateKeyframeSelection(); // Ensure easingArg display is updated // Animator.preview(); Undo.finishEdit('edit keyframe easing'); } function updateKeyframeEasingArg(obj) { Undo.initEdit({ keyframes: Timeline.selected }); if ($(obj).val() === "-") return; // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); Timeline.selected.forEach((kf) => { const value = (0,_easing__WEBPACK_IMPORTED_MODULE_2__.parseEasingArg)(kf, $(obj).val().trim()); kf.easingArgs = [value]; // obj.value = value; }); Undo.finishEdit('edit keyframe easing argument'); } const updateKeyframeSelectionCallback = ( /*...args*/) => { $('#keyframe_bar_easing').remove(); $('#keyframe_bar_easing_type').remove(); $('#keyframe_bar_easing_arg1').remove(); let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars let channel = false; Timeline.selected.forEach((kf) => { if (channel === false) { channel = kf.channel; } else if (channel !== kf.channel) { multi_channel = true; } }); Timeline.keyframes.forEach((kf) => { updateKeyframe(kf); }); const getMultiSelectValue = (selector, defaultValue, conflictValue) => { const selectorFunction = typeof selector === 'function' ? selector : x => (x[selector] === undefined ? defaultValue : x[selector]); if (Timeline.selected.length > 1) { const uniqSelected = lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected.map(selectorFunction)); if (uniqSelected.length === 1) { return uniqSelected[0]; } else { return conflictValue; } } else { return selectorFunction(Timeline.selected[0]) || defaultValue; } }; const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => { // Dear god I miss lodash if (!acc.has(kf.animator)) acc.set(kf.animator, {}); const animatorChannels = acc.get(kf.animator); if (!animatorChannels[kf.channel]) animatorChannels[kf.channel] = []; animatorChannels[kf.channel].push(kf); animatorChannels[kf.channel].sort((a, b) => { if (a.time < b.time) return -1; if (a.time > b.time) return 1; return 0; }); return acc; }, new Map()); const isFirstInChannel = (kf) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1; if (Timeline.selected.length && Format.id === _constants__WEBPACK_IMPORTED_MODULE_3__.GECKOLIB_MODEL_ID) { if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) { const displayedEasing = getMultiSelectValue('easing', _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_DEFAULT, 'null'); const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => { const easingTypeToTypeId = type => { let finalEasingType = "In"; if (type === "out") { finalEasingType = "Out"; } else if (type === "inout") { finalEasingType = "InOut"; } return finalEasingType; }; let finalEasing = 'ease'; if (inputEasingOrType === "in" || inputEasingOrType === "out" || inputEasingOrType === "inout") { const finalEasingType = easingTypeToTypeId(inputEasingOrType); finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1); } else if (inputEasingOrType === "linear" || inputEasingOrType == "step") { finalEasing = inputEasingOrType; } else { const finalEasingType = easingTypeToTypeId(easingType); finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1); } return finalEasing; }; const addEasingTypeIcons = (bar, easingType, title) => { const div = document.createElement("div"); div.innerHTML = getIcon(easingType); div.id = "kf_easing_type_" + easingType; div.setAttribute("style", "stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px"); div.setAttribute("title", title); div.onclick = () => { const selectedEasing = $(".selected_kf_easing"); const selectedEasingType = $(".selected_kf_easing_type"); const keySelectedEasing = selectedEasing.attr("id").substring(15); const keySelectedEasingType = selectedEasingType.length <= 0 ? "in" : selectedEasingType.attr("id").substring(15); const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing); const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType); if (finalEasing != currentEasing) { // console.log("Changed from " + currentEasing + " to " + finalEasing); updateKeyframeEasing(finalEasing); } }; bar.appendChild(div); }; const keyframePanel = document.getElementById('panel_keyframe'); if (keyframePanel) { let easingBar = document.createElement('div'); keyframePanel.appendChild(easingBar); easingBar.outerHTML = `
    `; easingBar = document.getElementById('keyframe_bar_easing'); addEasingTypeIcons(easingBar, "linear", "Switch to Linear easing"); addEasingTypeIcons(easingBar, "step", "Switch to Step easing"); addEasingTypeIcons(easingBar, "sine", "Switch to Sine easing"); addEasingTypeIcons(easingBar, "quad", "Switch to Quadratic easing"); addEasingTypeIcons(easingBar, "cubic", "Switch to Cubic easing"); addEasingTypeIcons(easingBar, "quart", "Switch to Quartic easing"); addEasingTypeIcons(easingBar, "quint", "Switch to Quntic easing"); addEasingTypeIcons(easingBar, "expo", "Switch to Exponential easing"); addEasingTypeIcons(easingBar, "circ", "Switch to Circle easing"); addEasingTypeIcons(easingBar, "back", "Switch to Back easing"); addEasingTypeIcons(easingBar, "elastic", "Switch to Elastic easing"); addEasingTypeIcons(easingBar, "bounce", "Switch to Bounce easing"); const keyEasing = getEasingInterpolation(displayedEasing); const keyEasingElement = document.getElementById("kf_easing_type_" + keyEasing); keyEasingElement.style.stroke = "var(--color-accent)"; keyEasingElement.classList.add('selected_kf_easing'); if (!(keyEasing === "linear" || keyEasing == "step")) { let easingTypeBar = document.createElement('div'); keyframePanel.appendChild(easingTypeBar); easingTypeBar.outerHTML = `
    `; easingTypeBar = document.getElementById('keyframe_bar_easing_type'); addEasingTypeIcons(easingTypeBar, "in", "Switch to In easing type"); addEasingTypeIcons(easingTypeBar, "out", "Switch to Out easing type"); addEasingTypeIcons(easingTypeBar, "inout", "Switch to In/Out easing type"); const keyEasingType = getEasingType(displayedEasing); const keyEasingTypeElement = document.getElementById("kf_easing_type_" + keyEasingType); keyEasingTypeElement.style.stroke = "var(--color-accent)"; keyEasingTypeElement.classList.add('selected_kf_easing_type'); } if (keyEasing !== "linear") document.getElementById('panel_keyframe').querySelector('div.bb-select').textContent = "GeckoLib"; const getEasingArgLabel = (kf) => { switch (kf.easing) { case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBack: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBack: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBack: return 'Overshoot'; case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInElastic: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutElastic: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutElastic: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBounce: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBounce: case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBounce: return 'Bounciness'; case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.step: return 'Steps'; default: return 'N/A'; } }; const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null); if (Timeline.selected.every((kf) => (0,_easing__WEBPACK_IMPORTED_MODULE_2__.isArgsEasing)(kf.easing)) && easingArgLabel !== null) { const argDefault = getMultiSelectValue(_easing__WEBPACK_IMPORTED_MODULE_2__.getEasingArgDefault, null, null); const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]); let scaleBar = document.createElement('div'); keyframePanel.appendChild(scaleBar); scaleBar.outerHTML = `
    `; scaleBar = document.getElementById('keyframe_bar_easing_arg1'); } } } } }; const getEasingInterpolation = (name) => { const matches = name.match(easingRegExp); if (matches) { return matches[2].toLowerCase(); } return name; }; const getEasingType = (name) => { const matches = name.match(easingRegExp); if (matches) { return matches[1].toLowerCase(); } return "in"; }; const updateKeyframe = (kf) => { if (kf.data_points.length != 1 && kf.interpolation !== "linear") { removeLastDataPoint(); } }; const updateKeyframeIcon = (kf) => { const element = document.getElementById(kf.uuid); if (element && element.children && kf.easing) element.children[0].className = 'easing-' + kf.easing.split(/\.?(?=[A-Z])/).join('_').toLowerCase().replace("ease_", ""); }; const addDataPoint = () => { Undo.initEdit({ keyframes: Timeline.selected }); Timeline.selected.forEach(kf => { if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) { kf.data_points.push(new KeyframeDataPoint(kf)); kf.data_points.last().extend(kf.data_points[0]); } }); Animator.preview(); Undo.finishEdit('Add keyframe data point'); }; const removeLastDataPoint = () => { Undo.initEdit({ keyframes: Timeline.selected }); Timeline.selected.forEach(kf => { if (kf.data_points.length >= 2) { kf.data_points.remove(kf.data_points.last()); } }); Animator.preview(); Undo.finishEdit('Remove keyframe data point'); }; const getIcon = (name) => { switch (name) { case "back": return ''; case "bounce": return ''; case "circ": return ''; case "cubic": return ''; case "elastic": return ''; case "expo": case "in": return ''; case "inout": return ''; case "out": return ''; case "quad": return ''; case "quart": return ''; case "quint": return ''; case "sine": return ''; case "step": return ''; default: // linear return ''; } }; /***/ }), /***/ "./ts/codec.ts": /*!*********************!*\ !*** ./ts/codec.ts ***! \*********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ buildDisplaySettingsJson: () => (/* binding */ buildDisplaySettingsJson), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ format: () => (/* binding */ format), /* harmony export */ openProjectSettingsDialog: () => (/* binding */ openProjectSettingsDialog) /* harmony export */ }); /* harmony import */ var _resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../resources/armorTemplate.json */ "./resources/armorTemplate.json"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); const codec = Codecs.bedrock; // This gets automatically applied by Blockbench, we don't need to do anything with it const format = new ModelFormat(_constants__WEBPACK_IMPORTED_MODULE_2__.GECKOLIB_MODEL_ID, { id: _constants__WEBPACK_IMPORTED_MODULE_2__.GECKOLIB_MODEL_ID, icon: "view_in_ar", name: "GeckoLib Animated Model", description: "Animated Model for Java mods using GeckoLib", category: "minecraft", box_uv: true, optional_box_uv: true, single_texture: true, animated_textures: true, bone_rig: true, centered_grid: true, rotate_cubes: true, locators: true, uv_rotation: true, select_texture_for_particles: true, texture_mcmeta: true, animation_files: true, display_mode: false, animation_mode: true, codec: Codecs.project, animation_codec: Codecs.bedrock.format.animation_codec, }); // Override the new project panel to allow customisation format.new = function () { if (newProject(this)) return openProjectSettingsDialog(); }; /** * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item */ function openProjectSettingsDialog() { if (Project instanceof ModelProject) return createProjectSettingsDialog(Project, createProjectSettingsForm(Project)); } /** * Internal function for determining the placeholder value for the model_identifier form element in dialog windows */ function getObjectIdPlaceholder(formResult) { const name = formResult?.['name']; const modelType = formResult?.[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]; if (!name && !modelType) return 'my_entity'; const invalidPathChar = new RegExp('[^_\\-/.a-z0-9]+', 'g'); const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g'); if (name) return name.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidPathChar, ""); switch (_constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType[modelType]) { case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ENTITY: return 'my_entity'; case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.BLOCK: return 'my_block'; case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM: return 'my_item'; case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ARMOR: return 'my_armor'; case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.OBJECT: return 'my_object'; default: return 'my_entity'; } } /** * Create the Project Settings dialog form for use in both new projects and editing existing ones */ function createProjectSettingsForm(Project) { const form = { format: { type: 'info', label: 'data.format', text: Format.name || 'unknown', description: Format.description } }; const properties = ModelProject['properties']; const modelType = properties[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]; if (modelType) { const currentType = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]; form[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = { label: modelType.label, description: modelType["description"], default: _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ENTITY.toUpperCase(), value: typeof (currentType) === 'string' ? _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType[currentType.toUpperCase()].toUpperCase() : _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ENTITY.toUpperCase(), placeholder: modelType["placeholder"], type: 'select', options: modelType["options"], }; } for (const key in properties) { const property = properties[key]; if (property.exposed === false || !Condition(property.condition)) continue; const entry = form[property.name] = { label: property.label, description: property["description"], value: Project[property.name], placeholder: property["placeholder"], type: property.type }; if (property.name === 'name') { entry.label = 'Project Name'; entry.placeholder = 'My Project'; entry.description = 'The name of the Blockbench project'; } else if (property.name === 'model_identifier') { entry.label = 'Object ID'; entry.description = 'The registered id of the object this model represents, for exporting purposes'; entry.placeholder = getObjectIdPlaceholder(); } switch (property.type) { case 'boolean': entry.type = 'checkbox'; break; case 'string': entry.type = 'text'; break; default: if (property["options"]) { entry['options'] = property["options"]; entry.type = 'select'; } break; } } if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name']) delete form['name']; form['uv_mode'] = { label: 'dialog.project.default_uv_mode', description: 'dialog.project.default_uv_mode.description', type: 'select', condition: Format.optional_box_uv, options: { face_uv: 'dialog.project.uv_mode.face_uv', box_uv: 'dialog.project.uv_mode.box_uv', }, value: Project.box_uv ? 'box_uv' : 'face_uv', }; form['texture_size'] = { label: 'dialog.project.texture_size', type: 'vector', dimensions: 2, value: [Project.texture_width, Project.texture_height], min: 1 }; return form; } /** * Create the 'new project' popup dialogue for GeckoLib projects. *

    * The contents of this is mostly a copy of project.js "project_window" action declaration (Copyright Blockbench)
    * Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility * @return false if the user clicks cancel, otherwise true */ function createProjectSettingsDialog(Project, form) { const dialog = new Dialog({ id: 'project', title: 'dialog.project.title', width: 500, form, onConfirm: function (formResult) { let save; const box_uv = formResult['uv_mode'] == 'box_uv'; const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity); const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity); if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) { // Adjust UV Mapping if resolution changed if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) { save = Undo.initEdit({ elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true }); Cube.all.forEach(cube => { for (const key in cube.faces) { const uv = cube.faces[key].uv; uv[0] *= texture_width / Project.texture_width; uv[2] *= texture_width / Project.texture_width; uv[1] *= texture_height / Project.texture_height; uv[3] *= texture_height / Project.texture_height; } }); Mesh.all.forEach(mesh => { for (const key in mesh.faces) { const uv = mesh.faces[key].uv; for (const vkey in uv) { uv[vkey][0] *= texture_width / Project.texture_width; uv[vkey][1] *= texture_height / Project.texture_height; } } }); } // Convert UV mode per element if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) { if (!save) save = Undo.initEdit({ elements: Cube.all, uv_only: true, uv_mode: true }); Cube.all.forEach(cube => cube.setUVMode(box_uv)); } if (!save) save = Undo.initEdit({ uv_mode: true }); Project.texture_width = texture_width; Project.texture_height = texture_height; if (Format.optional_box_uv) Project.box_uv = box_uv; Canvas.updateAllUVs(); updateSelection(); } const properties = ModelProject['properties']; for (const key in properties) { properties[key].merge(Project, formResult); } Project.name = Project.name.trim(); Project.model_identifier = Project.model_identifier.trim(); if (save) Undo.finishEdit('Change project UV settings'); Blockbench.dispatchEvent('update_project_settings', formResult); BARS.updateConditions(); if (Project.EditSession) { const metadata = { texture_width: Project.texture_width, texture_height: Project.texture_height, box_uv: Project.box_uv }; for (const key in properties) { properties[key].copy(Project, metadata); } Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata)); } const modelType = _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType[formResult[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]]; Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = modelType; if (modelType == _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM) Project.parent = 'builtin/entity'; if (Project.name === Format.name || Project.name === '') Project.name = "GeckoLib " + Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]; switch (modelType) { case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ARMOR: if (Outliner.root.length === 0) { Codecs.project.parse(_resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_0__, null); } else { alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.'); return false; } break; default: break; } Format.display_mode = modelType === _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM || settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_ALWAYS_SHOW_DISPLAY].value; dialog.hide(); }, onFormChange(formResult) { try { document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult); } // eslint-disable-next-line @typescript-eslint/no-unused-vars catch (ex) { /* empty */ } }, }); dialog.show(); return true; } /** * Export the item display json *

    * Only called for GeckoLib projects */ function buildDisplaySettingsJson(options = {}) { if (!Project) return; const modelProperties = {}; if (options['comment'] || settings.credit.value) modelProperties.credit = settings.credit.value; modelProperties.parent = !Project.parent ? 'builtin/entity' : Project.parent; if (options['ambientocclusion'] || Project.ambientocclusion === false) modelProperties.ambientocclusion = false; if (Project.texture_width !== 16 || Project.texture_height !== 16) modelProperties.texture_size = [Project.texture_width, Project.texture_height]; if (options['front_gui_light'] || Project.front_gui_light) modelProperties.gui_light = 'front'; if (options['overrides'] || Project.overrides) modelProperties.overrides = Project.overrides; if (options['display'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(Project.display_settings)) { const nonDefaultDisplays = {}; for (const slot in DisplayMode.slots) { const perspective = DisplayMode.slots[slot]; // eslint-disable-next-line no-prototype-builtins if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) { const display = Project.display_settings[perspective].export(); if (display) nonDefaultDisplays[perspective] = display; } } if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(nonDefaultDisplays)) modelProperties.display = nonDefaultDisplays; } if ((options['textures'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(Project.textures)) && Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODID]) { for (const texture of Project.textures) { if (texture.particle || (settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) { let name = texture.name; if (name.indexOf(".png") > 0) name = name.substring(0, name.indexOf(".png")); if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isValidPath)(name)) { name = name.toLowerCase().replace(" ", "_"); if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isValidPath)(name)) continue; } name = (Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] == _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.BLOCK ? "block/" : "item/") + name; name = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODID] + ":" + name; modelProperties.textures = { 'particle': name }; break; } } } Blockbench.export({ resource_id: 'model', type: Codecs.java_block.name, extensions: ['json'], name: Project.model_identifier ? (Project.model_identifier + ".json") : codec.fileName().replace(".geo", ""), startpath: Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display, content: JSON.stringify(modelProperties, null, 2), }, file_path => { const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display; Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display = settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display) Project.saved = false; }); return this; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (codec); /***/ }), /***/ "./ts/constants.ts": /*!*************************!*\ !*** ./ts/constants.ts ***! \*************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BAKE_IN_BEZIER_KEYFRAMES: () => (/* binding */ BAKE_IN_BEZIER_KEYFRAMES), /* harmony export */ GECKOLIB_MODEL_ID: () => (/* binding */ GECKOLIB_MODEL_ID), /* harmony export */ GeckoModelType: () => (/* binding */ GeckoModelType), /* harmony export */ PROPERTY_FILEPATH_CACHE: () => (/* binding */ PROPERTY_FILEPATH_CACHE), /* harmony export */ PROPERTY_MODEL_TYPE: () => (/* binding */ PROPERTY_MODEL_TYPE), /* harmony export */ PROPERTY_MODID: () => (/* binding */ PROPERTY_MODID), /* harmony export */ SETTING_ALWAYS_SHOW_DISPLAY: () => (/* binding */ SETTING_ALWAYS_SHOW_DISPLAY), /* harmony export */ SETTING_AUTO_PARTICLE_TEXTURE: () => (/* binding */ SETTING_AUTO_PARTICLE_TEXTURE), /* harmony export */ SETTING_DEFAULT_MODID: () => (/* binding */ SETTING_DEFAULT_MODID), /* harmony export */ SETTING_REMEMBER_EXPORT_LOCATIONS: () => (/* binding */ SETTING_REMEMBER_EXPORT_LOCATIONS) /* harmony export */ }); /** * GeckoLib plugin model format ID. Used to identify model types generated from this plugin */ const GECKOLIB_MODEL_ID = "geckolib_model"; // Setting name constants const SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture'; const SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display'; const SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations'; const SETTING_DEFAULT_MODID = 'geckolib_default_modid'; const BAKE_IN_BEZIER_KEYFRAMES = "geckolib_bake_in_bezier_keyframes"; // Property name constants const PROPERTY_MODID = 'geckolib_modid'; const PROPERTY_MODEL_TYPE = 'geckolib_model_type'; const PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache'; /** * Available GeckoLib model types */ var GeckoModelType; (function (GeckoModelType) { GeckoModelType["ENTITY"] = "Entity"; GeckoModelType["BLOCK"] = "Block"; GeckoModelType["ITEM"] = "Item"; GeckoModelType["ARMOR"] = "Armor"; GeckoModelType["OBJECT"] = "Object"; })(GeckoModelType || (GeckoModelType = {})); /***/ }), /***/ "./ts/easing.ts": /*!**********************!*\ !*** ./ts/easing.ts ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EASING_DEFAULT: () => (/* binding */ EASING_DEFAULT), /* harmony export */ EASING_OPTIONS: () => (/* binding */ EASING_OPTIONS), /* harmony export */ easingFunctions: () => (/* binding */ easingFunctions), /* harmony export */ getEasingArgDefault: () => (/* binding */ getEasingArgDefault), /* harmony export */ isArgsEasing: () => (/* binding */ isArgsEasing), /* harmony export */ parseEasingArg: () => (/* binding */ parseEasingArg), /* harmony export */ reverseEasing: () => (/* binding */ reverseEasing) /* harmony export */ }); // The MIT license notice below applies to the function findIntervalBorderIndex /* The MIT License (MIT) Copyright (c) 2015 Boris Chumichev 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. /** * * Utilizes bisection method to search an interval to which * point belongs to, then returns an index of left or right * border of the interval * * @param {Number} point * @param {Array} intervals * @param {Boolean} useRightBorder * @returns {Number} */ function findIntervalBorderIndex(point, intervals, useRightBorder) { //If point is beyond given intervals if (point < intervals[0]) return 0; if (point > intervals[intervals.length - 1]) return intervals.length - 1; //If point is inside interval //Start searching on a full range of intervals let indexOfNumberToCompare = 0; let leftBorderIndex = 0; let rightBorderIndex = intervals.length - 1; //Reduce searching range till it find an interval point belongs to using binary search while (rightBorderIndex - leftBorderIndex !== 1) { indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2); point >= intervals[indexOfNumberToCompare] ? leftBorderIndex = indexOfNumberToCompare : rightBorderIndex = indexOfNumberToCompare; } return useRightBorder ? rightBorderIndex : leftBorderIndex; } function stepRange(steps, stop = 1) { if (steps < 2) throw new Error("steps must be > 2, got:" + steps); const stepLength = stop / steps; return Array.from({ length: steps }, (_, i) => i * stepLength); } // The MIT license notice below applies to the Easing class /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ class Easing { /** * A stepping function, returns 1 for any positive value of `n`. */ static step0(n) { return n > 0 ? 1 : 0; } /** * A stepping function, returns 1 if `n` is greater than or equal to 1. */ static step1(n) { return n >= 1 ? 1 : 0; } /** * A linear function, `f(t) = t`. Position correlates to elapsed time one to * one. * * http://cubic-bezier.com/#0,0,1,1 */ static linear(t) { return t; } /** * A simple inertial interaction, similar to an object slowly accelerating to * speed. * * http://cubic-bezier.com/#.42,0,1,1 */ // static ease(t) { // if (!ease) { // ease = Easing.bezier(0.42, 0, 1, 1); // } // return ease(t); // } /** * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed * time. * * http://easings.net/#easeInQuad */ static quad(t) { return t * t; } /** * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed * time. * * http://easings.net/#easeInCubic */ static cubic(t) { return t * t * t; } /** * A power function. Position is equal to the Nth power of elapsed time. * * n = 4: http://easings.net/#easeInQuart * n = 5: http://easings.net/#easeInQuint */ static poly(n) { return (t) => Math.pow(t, n); } /** * A sinusoidal function. * * http://easings.net/#easeInSine */ static sin(t) { return 1 - Math.cos((t * Math.PI) / 2); } /** * A circular function. * * http://easings.net/#easeInCirc */ static circle(t) { return 1 - Math.sqrt(1 - t * t); } /** * An exponential function. * * http://easings.net/#easeInExpo */ static exp(t) { return Math.pow(2, 10 * (t - 1)); } /** * A simple elastic interaction, similar to a spring oscillating back and * forth. * * Default bounciness is 1, which overshoots a little bit once. 0 bounciness * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N * times. * * http://easings.net/#easeInElastic */ static elastic(bounciness = 1) { const p = bounciness * Math.PI; return (t) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p); } /** * Use with `Animated.parallel()` to create a simple effect where the object * animates back slightly as the animation starts. * * Wolfram Plot: * * - http://tiny.cc/back_default (s = 1.70158, default) */ static back(s = 1.70158) { return (t) => t * t * ((s + 1) * t - s); } /** * Provides a simple bouncing effect. * * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up * using min instead of ternaries * http://easings.net/#easeInBounce */ static bounce(k = 0.5) { const q = (x) => (121 / 16) * x * x; const w = (x) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k; const r = (x) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k; const t = (x) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k; return (x) => Math.min(q(x), w(x), r(x), t(x)); } /** * Provides a cubic bezier curve, equivalent to CSS Transitions' * `transition-timing-function`. * * A useful tool to visualize cubic bezier curves can be found at * http://cubic-bezier.com/ */ // static bezier(x1, y1, x2, y2) { // const _bezier = require('./bezier'); // return _bezier(x1, y1, x2, y2); // } /** * Runs an easing function forwards. */ static in(easing) { return easing; } /** * Runs an easing function backwards. */ static out(easing) { return (t) => 1 - easing(1 - t); } /** * Makes any easing function symmetrical. The easing function will run * forwards for half of the duration, then backwards for the rest of the * duration. */ static inOut(easing) { return (t) => { if (t < 0.5) { return easing(t * 2) / 2; } return 1 - easing((1 - t) * 2) / 2; }; } } const quart = Easing.poly(4); const quint = Easing.poly(5); const back = (direction, scalar, t) => direction(Easing.back(1.70158 * scalar))(t); const elastic = (direction, bounciness, t) => direction(Easing.elastic(bounciness))(t); const bounce = (direction, bounciness, t) => direction(Easing.bounce(bounciness))(t); const easingFunctions = { linear: Easing.linear, step(steps, x) { const intervals = stepRange(steps); return intervals[findIntervalBorderIndex(x, intervals, false)]; }, easeInQuad: Easing.in(Easing.quad), easeOutQuad: Easing.out(Easing.quad), easeInOutQuad: Easing.inOut(Easing.quad), easeInCubic: Easing.in(Easing.cubic), easeOutCubic: Easing.out(Easing.cubic), easeInOutCubic: Easing.inOut(Easing.cubic), easeInQuart: Easing.in(quart), easeOutQuart: Easing.out(quart), easeInOutQuart: Easing.inOut(quart), easeInQuint: Easing.in(quint), easeOutQuint: Easing.out(quint), easeInOutQuint: Easing.inOut(quint), easeInSine: Easing.in(Easing.sin), easeOutSine: Easing.out(Easing.sin), easeInOutSine: Easing.inOut(Easing.sin), easeInExpo: Easing.in(Easing.exp), easeOutExpo: Easing.out(Easing.exp), easeInOutExpo: Easing.inOut(Easing.exp), easeInCirc: Easing.in(Easing.circle), easeOutCirc: Easing.out(Easing.circle), easeInOutCirc: Easing.inOut(Easing.circle), easeInBack: back.bind(null, Easing.in), easeOutBack: back.bind(null, Easing.out), easeInOutBack: back.bind(null, Easing.inOut), easeInElastic: elastic.bind(null, Easing.in), easeOutElastic: elastic.bind(null, Easing.out), easeInOutElastic: elastic.bind(null, Easing.inOut), easeInBounce: bounce.bind(null, Easing.in), easeOutBounce: bounce.bind(null, Easing.out), easeInOutBounce: bounce.bind(null, Easing.inOut), }; // Object with the same keys as easingFunctions and values of the stringified key names const EASING_OPTIONS = Object.freeze(Object.fromEntries(Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]])))); const EASING_DEFAULT = 'linear'; const getEasingArgDefault = (kf) => { switch (kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: return 1; case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return 0.5; case EASING_OPTIONS.step: return 5; default: return null; } }; const parseEasingArg = (kf, value) => { switch (kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return parseFloat(value); case EASING_OPTIONS.step: return Math.max(parseInt(value, 10), 2); default: return parseInt(value, 10); } }; function reverseEasing(easing) { if (!easing) return easing; if (easing.startsWith("easeInOut")) return easing; if (easing.startsWith("easeIn")) return easing.replace("easeIn", "easeOut"); if (easing.startsWith("easeOut")) return easing.replace("easeOut", "easeIn"); return easing; } const isArgsEasing = (easing = "") => easing.includes("Back") || easing.includes("Elastic") || easing.includes("Bounce") || easing === EASING_OPTIONS.step; /***/ }), /***/ "./ts/events.ts": /*!**********************!*\ !*** ./ts/events.ts ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ addEventListeners: () => (/* binding */ addEventListeners), /* harmony export */ removeEventListeners: () => (/* binding */ removeEventListeners) /* harmony export */ }); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keyframe */ "./ts/keyframe.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); /* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./codec */ "./ts/codec.ts"); function addEventListeners() { (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('save_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSave)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('convert_format', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectConvert)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Animator, null, "buildFile", monkeypatchAnimatorBuildFile); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Codecs.bedrock.format.animation_codec, null, "loadFile", monkeypatchAnimatorLoadFile); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Blockbench, null, "export", monkeypatchBlockbenchExport); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(BarItems, 'project_window', "click", monkeypatchProjectWindowClick); } function removeEventListeners() { (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged)); (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeMonkeypatches)(); } /** * When an existing GeckoLib project is being read from file */ function onProjectParse(e) { onSettingsChanged(); if (!e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]) { e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.determineModelType)(e.model); Project.saved = false; } // Because the project hasn't had its model properties applied at this stage Format.display_mode = (e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] && e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM) || settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_ALWAYS_SHOW_DISPLAY].value; } /** * When the Blockbench project is being saved *

    * Only called for GeckoLib projects */ function onProjectSave(e) { if (!e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]) e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.determineModelType)(e.model); // Explicitly checked for undefined here because Blockbench attempts a save when removing the plugin if (settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS] && !settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value) e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE] = {}; } /** * When a project is being converted from another format to a GeckoLib model *

    * Only called for GeckoLib projects */ function onProjectConvert(e) { onSettingsChanged(); } /** * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to *

    * Only called for GeckoLib projects */ function onSettingsChanged() { if (Modes.selected instanceof Mode) Modes.selected.select(); if (Project instanceof ModelProject) { if (!Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]) { Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.determineModelType)(); Project.saved = false; } if (Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) { Project.parent = 'builtin/entity'; Project.saved = false; } } Format.display_mode = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.shouldShowDisplayPanel)(); } /** * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs *

    * Only called for GeckoLib projects */ function onProjectSelect() { onSettingsChanged(); } /** * When selecting edit/paint/display/animate/etc *

    * Only called for GeckoLib projects */ function onModeSelect(e) { // Offset the display emulator to account for GeckoLib's +0.51 manual offset // This is a legacy patch as Blockbench no longer does this internally if (e.mode.id == 'display') Project.model_3d.position.y = 0; } /** * When the model geometry is being compiled for export *

    * Only called for GeckoLib projects */ function onBedrockCompile(e) { // Remove display transforms from non-bedrock geometry e.model["minecraft:geometry"]?.forEach((geo) => delete geo["item_display_transforms"]); // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established switch (e.model.format_version) { case "1.14.0": case "1.21.0": case "1.21.20": e.model.format_version = "1.12.0"; break; default: break; } } /** * When the project settings window is being opened, either via a new project or the File -> Project... menu item *

    * The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchProjectWindowClick() { if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) { (0,_codec__WEBPACK_IMPORTED_MODULE_3__.openProjectSettingsDialog)(); } else { _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(BarItems).click(); } } /** * When any file is being exported to disk by Blockbench *

    * The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchBlockbenchExport(options, cb) { if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) { _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb); return; } if (Project instanceof ModelProject) { if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON const fileName = Project.model_identifier && Project.model_identifier + ".animation"; options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation; const parentCallback = cb; cb = (file_path) => { if (parentCallback) parentCallback(file_path); const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation; Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation = settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation) Project.saved = false; }; if (fileName) options.name = fileName; } else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo const fileName = Project.model_identifier && Project.model_identifier + ".geo"; options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model; const parentWriter = options.custom_writer; const parentCallback = cb; if (parentWriter) { options.custom_writer = (content, filePath, callback) => { parentWriter(content, filePath, callback); callback(filePath); }; } cb = file_path => { if (parentCallback) parentCallback(file_path); const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model; Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model = settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model) Project.saved = false; }; if (fileName) options.name = fileName; } } _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb); } /** * When the animation file is being loaded into the project *

    * The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchAnimatorLoadFile(file, exportingAnims) { // eslint-disable-next-line no-undef const json = file.json || autoParseJSON(file.content); const path = file.path; const new_animations = []; function geoLoopToBbLoop(jsonLoop) { if (jsonLoop) { if (typeof jsonLoop === 'boolean') return jsonLoop ? 'loop' : 'once'; if (typeof jsonLoop === 'string') { if (jsonLoop === "hold_on_last_frame") return 'hold'; if (jsonLoop === "loop" || jsonLoop === "true") return 'loop'; } } return 'once'; } function getKeyframeDataPoints(channel, source) { if (source instanceof Array) return invertAnimKeyframe(channel, [{ x: source[0], y: source[1], z: source[2] }]); if (['number', 'string'].includes(typeof source)) return invertAnimKeyframe(channel, [{ x: source, y: source, z: source }]); if (typeof source == 'object') { if (source.vector) return getKeyframeDataPoints(channel, source.vector); const points = []; if (source.pre) points.push(getKeyframeDataPoints(channel, source.pre)[0]); if (source.post) points.push(getKeyframeDataPoints(channel, source.post)[0]); return points; } } // Because Blockbench now implicitly inverts rotation and position keyframes on export and import (??) function invertAnimKeyframe(channel, value) { if (channel != 'position' && channel != 'rotation') return value; if (value instanceof Array) { switch (value.length) { case 1: return [invertAnimKeyframe(channel, value[0])]; case 3: return [invertAnimKeyframe(channel, value[0]), channel == 'rotation' ? invertAnimKeyframe(channel, value[1]) : value[1], value[2]]; default: return value; } } else if (typeof value == 'object') { if (value.x) value.x = invertMolang(value.x); if (value.y && channel == 'rotation') value.y = invertMolang(value.y); return value; } return invertMolang(value); } if (json && typeof json.animations === 'object') { for (const animName in json.animations) { if (exportingAnims && !exportingAnims.includes(animName)) continue; //Animation const animData = json.animations[animName]; let animation = new Animation({ name: animName, path, loop: geoLoopToBbLoop(animData.loop), override: animData.override_previous_animation, anim_time_update: (typeof animData.anim_time_update == 'string' ? animData.anim_time_update.replace(/;(?!$)/, ';\n') : animData.anim_time_update), blend_weight: (typeof animData.blend_weight == 'string' ? animData.blend_weight.replace(/;(?!$)/, ';\n') : animData.blend_weight), length: animData.animation_length }); animation = animation.add(); //Bones if (animData.bones) { for (const boneName in animData.bones) { const bone = animData.bones[boneName]; const lowercase_bone_name = boneName.toLowerCase(); const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name); const uuid = group ? group.uuid : guid(); const boneAnimator = new _keyframe__WEBPACK_IMPORTED_MODULE_1__.GeckolibBoneAnimator(uuid, animation, boneName); animation.animators[uuid] = boneAnimator; //Channels for (const channel in bone) { if (Animator.possible_channels[channel]) { if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel]["easing"], easingArgs: bone[channel]["easingArgs"], data_points: getKeyframeDataPoints(channel, bone[channel]), }); } else if (typeof bone[channel] === 'object' && bone[channel].post) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel].easing == "bezier" ? undefined : bone[channel].easing, easingArgs: bone[channel]["easingArgs"], interpolation: bone[channel].easing == "bezier" ? "bezier" : bone[channel].lerp_mode, data_points: getKeyframeDataPoints(channel, bone[channel]), bezier_right_time: bone[channel].right_time, bezier_left_time: bone[channel].left_time, bezier_left_value: bone[channel].left, bezier_right_value: bone[channel].right }); } else if (typeof bone[channel] === 'object') { for (const timestamp in bone[channel]) { boneAnimator.addKeyframe({ time: parseFloat(timestamp), channel, easing: bone[channel][timestamp].easing == "bezier" ? undefined : bone[channel][timestamp].easing, easingArgs: bone[channel][timestamp].easingArgs, interpolation: bone[channel][timestamp].easing == "bezier" ? "bezier" : bone[channel][timestamp].lerp_mode, data_points: getKeyframeDataPoints(channel, bone[channel][timestamp]), bezier_right_time: bone[channel][timestamp].right_time, bezier_left_time: bone[channel][timestamp].left_time, bezier_left_value: bone[channel][timestamp].left, bezier_right_value: bone[channel][timestamp].right }); } } } } } } if (animData.sound_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.sound_effects) { const sounds = animData.sound_effects[timestamp]; animation.animators.effects.addKeyframe({ channel: 'sound', time: parseFloat(timestamp), data_points: sounds instanceof Array ? sounds : [sounds] }); } } if (animData.particle_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.particle_effects) { let particles = animData.particle_effects[timestamp]; if (!(particles instanceof Array)) particles = [particles]; particles.forEach(particle => { if (particle) particle.script = particle.pre_effect_script; }); animation.animators.effects.addKeyframe({ channel: 'particle', time: parseFloat(timestamp), data_points: particles }); } } if (animData.timeline) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.timeline) { const entry = animData.timeline[timestamp]; const script = entry instanceof Array ? entry.join('\n') : entry; animation.animators.effects.addKeyframe({ channel: 'timeline', time: parseFloat(timestamp), data_points: [{ script }] }); } } animation.calculateSnappingFromKeyframes(); if (!Animator.selected && Animator.open) animation.select(); new_animations.push(animation); } } return new_animations; } /** * When the animations JSON is being compiled for export *

    * Makes sure bezier keyframes get exported correctly rather than being baked. */ function monkeypatchAnimatorBuildFile() { const bezierKeys = []; if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_2__.BAKE_IN_BEZIER_KEYFRAMES].value) { const arg = arguments[1][0]; const animation = this.animations.find(anim => anim.name == arg); if (animation) { for (const uuid in animation.animators) { const animator = animation.animators[uuid]; if (!animator.keyframes.length && !animator.rotation_global) continue; if (animator.type == 'bone') { for (const channel in Animator.possible_channels) { if (!animator[channel]?.length) continue; const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time); sorted_keyframes.forEach((kf) => { if (kf.interpolation == "bezier") { bezierKeys[bezierKeys.length] = kf; kf.bezier = true; } }); } } } } } const result = _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Animator).buildFile.apply(this, arguments); if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_2__.BAKE_IN_BEZIER_KEYFRAMES].value) { result.geckolib_format_version = 2; bezierKeys.forEach((kf) => { kf.bezier = false; kf.easing = undefined; }); } return result; } /***/ }), /***/ "./ts/keyframe.ts": /*!************************!*\ !*** ./ts/keyframe.ts ***! \************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GeckolibBoneAnimator: () => (/* binding */ GeckolibBoneAnimator), /* harmony export */ loadKeyframeOverrides: () => (/* binding */ loadKeyframeOverrides), /* harmony export */ unloadKeyframeOverrides: () => (/* binding */ unloadKeyframeOverrides) /* harmony export */ }); /* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/groupBy */ "./node_modules/lodash/groupBy.js"); /* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/mapValues */ "./node_modules/lodash/mapValues.js"); /* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./easing */ "./ts/easing.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); function loadKeyframeOverrides() { // @ts-ignore (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "getLerp", keyframeGetLerp); // @ts-ignore (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "compileBedrockKeyframe", keyframeCompileBedrock); // @ts-ignore (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "getUndoCopy", keyframeGetUndoCopy); // @ts-ignore (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, "prototype", "extend", keyframeExtend); (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(BarItems.reverse_keyframes, null, "click", onReverseKeyframes); } function unloadKeyframeOverrides() { //No-op for now since monkeypatches are unloaded automatically } // This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch class GeckolibBoneAnimator extends BoneAnimator { addKeyframe(data, uuid) { const keyframe = super.addKeyframe(data, uuid); if (data.bezier_left_time) keyframe.bezier_left_time = data.bezier_left_time; if (data.bezier_right_time) keyframe.bezier_right_time = data.bezier_right_time; if (data.bezier_right_value) keyframe.bezier_right_value = data.bezier_right_value; if (data.bezier_left_value) keyframe.bezier_left_value = data.bezier_left_value; return keyframe; } } function lerp(start, stop, amt) { return amt * (stop - start) + start; } // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars function keyframeGetLerp(other, axis, amount, allow_expression) { if (Format.id !== _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID) // @ts-ignore return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getLerp.apply(this, arguments); const easing = other.easing || _easing__WEBPACK_IMPORTED_MODULE_3__.EASING_DEFAULT; let easingFunc = _easing__WEBPACK_IMPORTED_MODULE_3__.easingFunctions[easing]; if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) { const easingValue = Array.isArray(other.easingArgs) && other.easingArgs.length > 0 ? other.easingArgs[0] : (0,_easing__WEBPACK_IMPORTED_MODULE_3__.getEasingArgDefault)(other); easingFunc = easingFunc.bind(null, easingValue); } const easedAmount = easingFunc(amount); const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1); const stop = other.calc(axis); const result = lerp(start, stop, easedAmount); if (Number.isNaN(result)) throw new Error('batman'); return result; } // Calculate GeckoLib's keyframe values in place of the built-in Bedrock compiler. // Additionally, invert the keyframe to match Blockbench's internal handling function geckolibGetArray(data_point, channel) { const { easing, easingArgs, getArray } = this; let result = getArray.apply(this, [data_point]); if (this.bezier) { result = { vector: result, easing: "bezier", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time }; } else if (Format.id === _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID) { if (this.data_points.length != 1) { const postResult = getArray.apply(this, [1]); if (!easing && result[0] === postResult[0] && result[1] === postResult[1] && result[2] === postResult[2]) { result = { vector: result, easing }; } else { result = { pre: checkAndPatchKeyframeValues(result, channel), post: checkAndPatchKeyframeValues(getArray.apply(this, [1]), channel), easing }; } } else { result = { vector: result, easing }; } if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) result.easingArgs = easingArgs; } if (result.vector) result.vector = checkAndPatchKeyframeValues(result.vector, channel); return result; } // Invert the molang value to match Blockbench's internal handling // Also swap out empty molang queries because Blockbench now sends them as empty quotes for some reason function checkAndPatchKeyframeValues(vector, channel) { for (let i = 0; i <= 2; i++) { if (vector[i] === "") vector[i] = 0; } if (channel === 'rotation' || channel === 'position') { vector[0] = invertMolang(vector[0]); if (channel === 'rotation') vector[1] = invertMolang(vector[1]); } return vector; } // Replace the bedrock keyframe compilation with a custom handler function keyframeCompileBedrock() { if (Format.id !== _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID || !this.transform) // @ts-ignore return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments); if (this.interpolation == 'catmullrom') { const previous = this.getPreviousKeyframe.apply(this); const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom'); return { pre: include_pre ? geckolibGetArray.call(this, [0], this.channel) : undefined, post: geckolibGetArray.call(this, [include_pre ? 1 : 0], this.channel), lerp_mode: this.interpolation, }; } if (this.data_points.length == 1) return geckolibGetArray.call(this, 0, this.channel); return geckolibGetArray.call(this, [0], this.channel); } function keyframeGetUndoCopy() { const { easing, easingArgs } = this; // @ts-ignore const result = _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments); if (Format.id === _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID) { Object.assign(result, { easing }); if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) result.easingArgs = easingArgs; } return result; } // Append GeckoLib data to Keyframes when constructed function keyframeExtend(dataIn) { const data = Object.assign({}, dataIn); if (Format.id === _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID) { if (typeof data.values === 'object') { if (data.values.easing !== undefined) Merge.string(this, data.values, 'easing'); if (Array.isArray(data.values.easingArgs)) this.easingArgs = data.values.easingArgs; if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) { // Convert data to format expected by KeyframeExtendOriginal data.values = data.values.vector; } } else { if (data.easing !== undefined) Merge.string(this, data, 'easing'); if (Array.isArray(data.easingArgs)) this.easingArgs = data.easingArgs; } } // @ts-ignore return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).extend.apply(this, arguments); } // Inject GeckoLib support for the reverse keyframes feature function onReverseKeyframes() { _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments); // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead Undo.initEdit({ keyframes: Timeline.selected }); const kfByAnimator = lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected, kf => kf.animator.uuid); const kfByAnimatorAndChannel = lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default()(kfByAnimator, keyframesForAnimator => lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(keyframesForAnimator, kf => kf.channel)); Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => { const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid]; Object.keys(animatorChannelGroups).forEach(channel => { const channelKeyframes = animatorChannelGroups[channel]; // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time); // Reverse easing direction const easingData = channelKeyframes.map((kf) => ({ easing: (0,_easing__WEBPACK_IMPORTED_MODULE_3__.reverseEasing)(kf.easing), easingArgs: kf.easingArgs })); // Shift easing data to the right by one keyframe channelKeyframes.forEach((kf, i) => { if (i == 0) { kf.easing = undefined; kf.easingArgs = undefined; return; } const newEasingData = easingData[i - 1]; kf.easing = newEasingData.easing; kf.easingArgs = newEasingData.easingArgs; }); }); }); Undo.finishEdit('Reverse keyframe easing'); updateKeyframeSelection(); Animator.preview(); } /***/ }), /***/ "./ts/utils.ts": /*!*********************!*\ !*** ./ts/utils.ts ***! \*********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Monkeypatches: () => (/* binding */ Monkeypatches), /* harmony export */ addCodecCallback: () => (/* binding */ addCodecCallback), /* harmony export */ addEventListener: () => (/* binding */ addEventListener), /* harmony export */ addMonkeypatch: () => (/* binding */ addMonkeypatch), /* harmony export */ determineModelType: () => (/* binding */ determineModelType), /* harmony export */ isEmpty: () => (/* binding */ isEmpty), /* harmony export */ isGeckoLibModel: () => (/* binding */ isGeckoLibModel), /* harmony export */ isValidNamespace: () => (/* binding */ isValidNamespace), /* harmony export */ isValidPath: () => (/* binding */ isValidPath), /* harmony export */ make: () => (/* binding */ make), /* harmony export */ onlyIfGeckoLib: () => (/* binding */ onlyIfGeckoLib), /* harmony export */ removeCodecCallback: () => (/* binding */ removeCodecCallback), /* harmony export */ removeEventListener: () => (/* binding */ removeEventListener), /* harmony export */ removeMonkeypatches: () => (/* binding */ removeMonkeypatches), /* harmony export */ shouldShowDisplayPanel: () => (/* binding */ shouldShowDisplayPanel) /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); const VALID_NAMESPACE_PATTERN = new RegExp('^[_\\-.a-z0-9]+$'); const VALID_PATH_PATTERN = new RegExp('^[_\\-/.a-z0-9]+$'); const Monkeypatches = new Map(); /** * Add what is effectively an override of another javascript function in a target object. *

    * The patched function should call the original first and operate on the result to ensure compatibility *

    * * @param symbol The target object * @param path The property of the target to access, or null to access the root target itself * @param functionKey The name of the function to replace * @param newFunction The function to patch in to replace the target */ const addMonkeypatch = (symbol, path, functionKey, newFunction) => { const pathAccessor = path ? symbol[path] : symbol; if (!Monkeypatches.get(symbol)) Monkeypatches.set(symbol, { _pathAccessor: pathAccessor }); Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey]; pathAccessor[functionKey] = newFunction; }; /** * Remove all previously added monkeypatches, reverting their operation to prior to the patch */ const removeMonkeypatches = () => { Monkeypatches.forEach(symbol => { Object.keys(symbol).forEach(functionKey => { if (functionKey.startsWith('_')) return; symbol._pathAccessor[functionKey] = symbol[functionKey]; }); }); Monkeypatches.clear(); }; /** * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety */ const onlyIfGeckoLib = (callback) => { return (e) => { if (isGeckoLibModel()) callback(e); }; }; /** * Add an event listener to Blockbench's event callback system. *

    * This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ const addEventListener = (eventName, callback) => { Blockbench.on(eventName, callback); }; /** * Remove a previously registered event listener from Blockbench's event callback system. *

    * All registered event listeners should be removed when the plugin or codec is unloaded */ const removeEventListener = (eventName, callback) => { Blockbench.removeListener(eventName, callback); }; /** * Add a callback to a codec to be called after the task has been completed *

    * This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ const addCodecCallback = (codec, taskName, callback) => { codec.on(taskName, callback); }; /** * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable */ function make(obj, consumer) { consumer(obj); return obj; } /** * Remove a previously added codec task completion callback *

    * All registered coded callbacks should be removed when the plugin or codec is unloaded */ const removeCodecCallback = (codec, taskName, callback) => { codec.removeListener(taskName, callback); }; /** * Whether a given string is a valid ResourceLocation path for Minecraft */ const isValidPath = (path) => { return VALID_PATH_PATTERN.test(path); }; /** * Whether a given string is a valid ResourceLocation namespace for Minecraft */ const isValidNamespace = (namespace) => { return VALID_NAMESPACE_PATTERN.test(namespace); }; /** * Whether a map-like object has no defined keys or values */ const isEmpty = (object = {}) => !object || Object.keys(object).length === 0; /** * Whether the currently focussed model is a GeckoLib model */ const isGeckoLibModel = () => Format.id === _constants__WEBPACK_IMPORTED_MODULE_0__.GECKOLIB_MODEL_ID; /** * Whether the current project is a GeckoLib model that has or uses item render perspective transforms */ const shouldShowDisplayPanel = () => { if (!isGeckoLibModel() || !Project) return false; if (settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_ALWAYS_SHOW_DISPLAY].value) return true; return Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM || !isEmpty(Project.display_settings); }; /** * Determine the GeckoModelType of the current project (as best as possible), or null if it is not a GeckoLib model. */ const determineModelType = (optionalModel) => { if (!isGeckoLibModel() || !Project) return null; if (Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] && typeof Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] === 'string') return Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE]; if (optionalModel && !isEmpty(optionalModel.display)) return _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM; if (!isEmpty(Project.display_settings)) return _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM; return _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ENTITY; }; /***/ }), /***/ "data:font/woff2;base64,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": /*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** data:font/woff2;base64,d09GRgABAAAAAC+EAAsAAAAALzgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIGQ2NtYXAAAAFoAAAAXAAAAFzpYun4Z2FzcAAAAcQAAAAIAAAACAAAABBnbHlmAAABzAAAKigAACoonylLumhlYWQAACv0AAAANgAAADYrGAMRaGhlYQAALCwAAAAkAAAAJAfEA+1obXR4AAAsUAAAAKgAAACongAAAGxvY2EAACz4AAAAVgAAAFbckNGqbWF4cAAALVAAAAAgAAAAIAAvAMhuYW1lAAAtcAAAAfIAAAHyIjDgSnBvc3QAAC9kAAAAIAAAACAAAwAAAAMD8wGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6SYDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAEAAAAAMAAgAAgAEAAEAIOkj6Sb//f//AAAAAAAg6QDpJf/9//8AAf/jFwQXAwADAAEAAAAAAAAAAAAAAAAAAQAB//8ADwABAAD/wAAAA8AAAgAANzkBAAAAAAEAAP/AAAADwAACAAA3OQEAAAAAAQAA/8AAAAPAAAIAADc5AQAAAAACAAD/wAQAA8AAHQB4AAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhYXHgEVFAYHOAExOAE5AQ4BBzMyFhUwFDkBFTgBMRQGIyEiJjU4ATkBNDY3PgE3PgE3PgE1NCYnOAE5AS4BIyIGBw4BBw4BIzgBMSMiJjU8ATUxPgE3PgEzAgBpXl2LKSgoKYtdXmkSHwsBqwwNDQz+VQsfEkwzXCIfIhcXFkgyfxslJRv+hxslFxQWQC0qNwsKCAQEAwwQDAwHBAcCAiQaTBolBCYiIlkxA8AoKYtdXmlqXV2LKSgNDAGrCx8SEh8LAasLDp4fIh9TLShMIB5EKiYaAUMbJSUbJEUeID8kIjQODRoQDgsEAwUFBgQPEhkiJhoBAwEvVB8fHwACAAD/wAQAA8AAIAB7AAABIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhYXHgEVFAYHOAExOAE5AQ4BBzMyFhUwFDkBFTgBMRQGIyEiJjU4ATkBNDY3PgE3PgE3PgE1NCYnOAE5AS4BIyIGBw4BBw4BIzgBMSMiJjU8ATUxPgE3PgEzAgASHwz+VgwNDQwBqgwfEmpdXYsoKSkoi11dal8zXCEgIRcXFkcyfxomJhr+hhomFxUVQS0qNgsKCQQEBAwQCwwHBQcBAiUZTBslBCchIloxA8AOC/5VCx8SEh8L/lUMDSgpi11damleXYspKJ4fIh9TLShMIB5EKiYaAUMbJSUbJEUeID8kIjQODRoQDgsEAwUFBgQPEhkiJRsBAwEvVB8fHwAAAgAA/8AEAAPAABwAeAAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJiMXMzIWFx4BFRQGBzgBMTgBOQEOAQczMhYVOAE5ARU4ATEUBiMhIiY1OAE5ATQ2Nz4BNz4BNz4BNTQmJzAiOQEuASMiBgcOAQcOASM4ATEjIiY1PAE1FT4BNz4BMwIAal1diykoKCmLXV1qal1diygpKSiLXV1qCQEzWyIfIhcXFkczgBomJhr+hhomFxUVQSwqNwsKCQUDAQMMEAsMBwUHAgElGUwbJQQmIiJZMQPAKCmLXV1qal1diykoKCmLXV1qal1diykonh8iH1MtKEwgHkQqJhpEGiYmGiRFHx8/JCI0Dg0aEA8KBAMGBQcEDxIZIiYaAQMCAS9UHx8fAAAAAwAA/8AEAAPAAB0AfwCbAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhYXHgEVFAYHDgEHHgEXHgEVFAYHDgEjIiYnLgEnJjQ1NDY7ATIWFTgBOQEUFhceATMyNjcwNDMxPgE1NCYnOAE5AS4BKwEiJj0BNDY3MSIGIzEjIiY1PAE1MT4BNz4BMxciBgcOAQcOAQcxMjYzMTMyNjc+ATU0JicuASMCAGpdXYspKCgpi11dahIfCwGrCw4OC/5VCx8SVS5WICAiDw4CCQIHEgUUFSckJFwxMVoiIycCASYaTBomBQYEDRIPDQYBBgcGBQUVFxwbJQYEAgQDSxslBSgiIFAsAQ0JAgIGAQIFBAIFAxETEAECBAMBAQcNA8AoKYtdXWpqXV2LKSgOCwGrCx8SEh8LAasLDp4dHh1RKxs1FwMEBAYHCBxCIzJcIiAiHh4eVC8BAgEaJiYaCwsHBAYGBgEHEhERDQUECCYaOQoRBwElGwIDAi1QHBoaugQBAgsQBw4FAQYCAQkQDQcBAQMAAwAA/8AEAAPAAB0AiACkAAABIgYHAQ4BFRQWFwEeATMxMjc+ATc2NTQnLgEnJiMXMhYXHgEVFAYHDgEHHgEXHgEVFAYHDgEjIiYnLgEnPAE1NDYzOAExMzgBMTIWFTgBOQEUFhceATMyNjc0MDkBPgE1NCYnOAEjMS4BKwE4ATEiJj0BNDY3MSIGIzEjIiY1NDY1MT4BNz4BMxciBgcOAQcOAQcxMjYzMTMyNjc+ATU0JicuASMCABIfC/5VDA0NDAGrCx8Sal1diygpKSiLXV1qVS9VISAiDw4DCAMHEwUUFCYkJFwxMVojIicDJRtMGiYEBwQNEg8NBgcHBgUBBBUXHBslBQUCBQJMGiYBBSciIVArAg4JAQIGAgEFBAIFAxETDwICBAMBAgcMA8AOC/5VCx8SEh8L/lULDigpi11dampdXYspKJ4dHh1RKxs1FwQDBAYHCBxCIzJcIiAiHh4eVC8BAgEaJiYaCwsHBAYGBgEHEhERDQUECCYaOQoRBwElGwIDAi1QHBoaugQBAgsQBw4FAQYCAQkQDQcBAQMAAAAAAwAA/8AEAAPAABwAhwCjAAABIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIxUyFhceARUUBgcOAQceARceARUUBgcOASMiJicuASc8ATU0NjM4ATEzMhYVOAE5ARQWFx4BMzI2NzA0OQE+ATU0JicwIjkBLgErATAiMSImPQE+ATcxIgYjMSM4ATEiJjU8ATUxPgE3PgEzFyIGBw4BBw4BBzEyNjsCMjY3PgE1NCYnLgEjAgBqXV2LKSgoKYtdXWpqXV2LKCkpKItdXWovVSEgIhAOAggDBxIGFBQmJCRcMjFZIyMnAiUbSxslBQcEDREPDgYHBgUFAQQWFxsBGiYBBQUCBQJMGyUGJyIhUCsCDgkCAQYCAQYDAgUCARAUDwIBBQQBAQcMA8AoKYtdXWpqXV2LKSgoKYtdXWpqXV2LKSieHR4dUSsbNRcDBAQGBwgcQiMyXCIgIh4eHlQvAQIBGiYmGgsLBwQGBgYBBxIREQ0FBAgmGjkKEQcBJRsCAwItUBwaGroEAQILEAcOBQEGAgEJEA0HAQEDAAIAAP/ABAADwAAdAFcAAAEiBw4BBwYVFBceARcWMzI2NwE+ATU0JicBLgEjMQczMhYVETM4ATMyFhU4ATkBFRQGIyIwMSMVFAYrATgBMSImNTE1IyIwMSImPQE4ATE0NjcxAT4BMzECAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SGzkbJQ0BGiYmGgENJRtJGyWzARomBgYBAwkbEQPAKCmLXV1qaV5diykoDgsBqwsfEhIfCwGrDA2gJhr+xyYaQRomSBomJhpIJhpBChMHAXkNDwAAAAIAAP/ABAADwAAgAFEAAAE4ATEiBgcBDgEVFBYXAR4BMzEyNz4BNzY1NCcuAScmIxczMhYVETMyFhU4ATkBFRQGKwEVFAYrATgBMSImNTE1IyImPQE4ATE0NjcVAT4BMzECABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qjzoaJg0bJSUbDSYaShomsxomBgUBBAgcEAPADQz+VQsfEhIfC/5VCw4oKYtdXmlqXV2LKSigJhr+xyYaQRomSBomJhpIJhpBChMIAQF5DQ8AAAACAAD/wAQAA8AAHABWAAABIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIxczMhYVETM4ATEyFhU4ATkBFRQGIzgBMSMVFAYrATgBMSImNTE1IzgBMSImPQE4ATE0NjcxAT4BMzECAGleXYspKCgpi11eaWpdXYspKCgpi11dajo6GiYNGiYmGg0mGkoaJrMbJQYFAQQIHBADwCgpi11damleXYspKCgpi11eaWpdXYspKKAmGv7HJhpBGiZIGiYmGkgmGkEKEwcBeQ0PAAAABAAA/8AEAAPAAB0AUwBYAHoAAAEiBw4BBwYVFBceARcWMzI2NwE+ATU0JicBLgEjMQchMhYVOAE5ARUUBisBHgEXHgEVFAYHDgEjIiYnLgEnPAE1NDYzOAExMy4BJzETPgEzOAE5ARcVPgEzByIGBw4BBzEeARcxHgEXHgEzMjY3OAE5AT4BNTQmJy4BIwIAaV5diykoKCmLXV5pEh8LAasMDQ0M/lULHxLcATEbJSUbiyxSICQkIyMjYzYtVCIlKgUlGwEUGAEZAiQaeQYKBgcSGA0JFQ0VHwQCCAQGDQsODggJCQgHCBARA8AoKYtdXWppXl2LKSgNDAGrCx8SEh8LAasMDaglG0QaJQMfHyJeNDZhJicoGxsdVTECAwIaJgYhFQEtGSLDCAEGugoPCQoBAhsUEg8DBgQGCwsbFBUWBwgHAAAAAAQAAP/ABAADwAAjAFYAWwB9AAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMHITIWFTgBOQEVFAYHIx4BFx4BFRQGBw4BIyImJy4BJzQmNTQ2OwEuATUxEz4BMzgBOQEXBz4BMwciBgcOAQcxHgEXMR4BFx4BMzI2NzAyOQE+ATU0JicuASMCABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qMgEyGiYmGowsUiAkJSMjJGI3LVMiJSoFASYaARMZGAIlGXoBBgsGBxIYDggWDBQfBQIIAwcMCw8NCAEJCQgIBxEQA8ANDP5VCx8SEh8L/lUMDSgpi11eaWpdXYspKKglG0QaJQECHx8iXjQ2YSYnKBsbHVUxAgMCGiYGIRUBLRkiwwgBBroKDwkKAQIbFBIPAwYEBgsLGxQVFgcIBwAABAAA/8AEAAPAABwAUgBXAHkAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjByEyFhUwIjkBFRQGKwEeARceARUUBgcOASMiJicuASc8ATU0NjM4ATEzLgE1MRM+ATM4ATkBFwc+ATMHIgYHDgEHMR4BFzMeARceATMyNjcwMjEjPgE1NCYnLgEjAgBpXl2LKSgoKYtdXmlqXV2LKSgoKYtdXWqHATIaJgElGowsUiAkJSQiJGI3LVQiJSoFJhoBExkYAiUZegEGCgcHEhgOCBYMFB8EAQIIAwcMCw8NCAEBCgkJBwgQEAPAKCmLXV1qaV5diykoKCmLXV5pal1diykoqCUbRBolAx8fIl40NmEmJygbGx1VMQIDAhomBiEVAS0ZIsMIAQa6Cg8JCgECGxQSDwMGBAYLCxsUFRYHCAcAAwAA/8AEAAPAAB0AcQCRAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEXMhYXHgEVFAYHDgEHDgEVFBYXHgEzMjY3OAExOAE5AT4BNz4BMzIWHwEeARUUBgcxDgEHDgEjIiYnMDQ5AS4BNTQ2NzgBMTA0OQE+ATc+ATc+ATMHIgYHDgEHPgE3PgE3MiYxMDIxPgE1NCYnMCI1MS4BIwIAaV5diykoKCmLXV5pEh8LAasMDQ0M/lULHxIHJkEYGhg7NC1+SQECCAQEEhQVJA8RKBUGDwkJEAYjBQYFBhw8ICFLKS9RHRwaCwwLJRgYPCIjSicUESYWDBEJDB0LFyEJAQEBCAkEAgEBAwkDwCgpi11damleXYspKA0MAasLHxISHwsBqwwNwxAVFD8jOV4cGBIDCRIKGRsEBAgICQkfFQYHCAYkBg8ICQ4GHzIREhEfHwEgVDEiRiQBJUQfHjARERGBEhkNKhMCAQIGEQkBCBcTDAsCAQECAAAAAwAA/8AEAAPAACMAegCaAAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhYXMDQVHgEVFAYHDgEHDgEVFBYXHgEzMjY3OAExOAE5AT4BNz4BMzIWHwEeARUUBgcxDgEHDgEjIiYnMDQxIy4BNTQ2NzgBMTA0OQE+ATc+ATc+ATMHIgYHDgEHPgE3PgE3MDQxOAExPgE1NCYnIjA1MS4BIwIAEh8M/lYMDQ0MAaoMHxJqXV2LKCkpKItdXWqyJUEZGhg8NC1+SAEDCQQDEhUVIxARJxYFEAkJEAYiBgYGBR08ICBMKS5RHQEcGgwLDCQYGTsjIksnFRElFgwRCg0dChggCgkJBAIBAgMJA8ANDP5VCx8SEh8L/lUMDSgpi11eaWpdXYspKMMQFQEBFD8jOV4cGBIDCRIKGRsEBAgICQkfFQYHCAYkBg8ICQ4GHzIREhEfHwEgVDEiRiQBJUUeHjARERGBEhkNKhMCAQIGEQkBCBcTDAsCAQECAAADAAD/wAQAA8AAHABwAJAAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjFzIWFx4BFRQGBw4BBw4BFRQWFx4BMzI2NzgBMTgBOQE+ATc+ATMyFh8BHgEVFAYHMQ4BBw4BIyImJzA0IzEuATU0Njc4ATEwNDkBPgE3PgE3PgEzByIGBw4BBz4BNz4BNzA0MTgBMT4BNTQmJyI0OQEuASMCAGleXYspKCgpi11eaWpdXYspKCgpi11dalwmQRkZGDs0LX5IAQMJBAMSFRQkEBEnFQYQCQkQBiIFBwYFHTwgIUspLlIcARwaDAsMJBgZOyIjSyYUESUXCxEKDR0KGCAKCQgEAQECAwkDwCgpi11damleXYspKCgpi11eaWpdXYspKMMQFRQ/IzleHBgSAwkSChkbBAQICAkJHxUGBwgGJAYPCAkOBh8yERIRHx8BIFQxIkYkASVEHx4wERERgRIZDSoTAgECBhEJAQgXEwwLAgEBAgAAAwAA/8AEAAPAAB0AOgBHAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SVUY+Pl0bGxsbXT4+RkY/Pl0bGxsbXT4/Rj5VVT49VVU9A8AoKYtdXmlqXV2LKSgNDAGrCx8SEh8LAasMDasbG10+PkZGPz5cGxsbG1w+P0ZGPj5dGxvDVT0+VFQ+PVUAAAAAAwAA/8AEAAPAACMAQABNAAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCABIfC/5VDA0NDAGrCx8Sal1diygpKSiLXV1qVUc+Pl0bGxsbXT4+R0Y+Pl0bGxsbXT4+Rj1VVT0+VFQ+A8ANDP5VCx8SEh8L/lUMDSgpi11damleXYspKKsbG10+PkZGPz5cGxsbG1w+P0ZGPj5dGxvDVT0+VFQ+PVUAAAMAAP/ABAADwAAcADkARgAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJiMVMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCAGleXYspKCgpi11eaWpdXYspKCgpi11dakY/PlwbGxsbXD4/RkY+Pl0bGxsbXT4+Rj1VVT0+VFQ+A8AoKYtdXmlqXV2LKSgoKYtdXWppXl2LKSirGxtdPj5GRj8+XBsbGxtcPj9GRj4+XRsbw1U9PlRUPj1VAAABAAD/wAQAA8AAHQAAASIHDgEHBhUUFx4BFxYzMjY3AT4BNTQmJwEuASMxAgBpXl2LKSgoKYtdXmkSHwsBqwwNDQz+VQsfEgPAKCmLXV5pal1diykoDQwBqwsfEhIfCwGrDA0AAQAA/8AEAAPAACMAAAE4ATEiBgcBDgEVFBYXAR4BMzgBOQEyNz4BNzY1NCcuAScmIwIAEh8M/lYMDQ0MAaoMHxJqXV2LKCkpKItdXWoDwA0M/lULHxISHwv+VQwNKCmLXV1qaV5diykoAAAAAQAA/8AEAAPAABwAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjAgBpXl2LKSgoKYtdXmlqXV2LKSgoKYtdXWoDwCgpi11eaWpdXYspKCgpi11damleXYspKAAAAgAA/8AEAAPAAB0AYQAAASIHDgEHBhUUFx4BFxYzMjY3AT4BNTQmJwEuASMxBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFyceARUUBgcxMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnFy4BNTQ2NyMwNjc+ARcCAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SghEjETdBFxMlAQIEESJHCygXDBUKARQYBgVRSSVuNjdCFhMlAQIEESJHCygXDBUKARQYBgYBUUkZRSYDwCgpi11eaWpdXYspKA0MAasLHxISHwsBqwwN9QkIHXJVRTIBAQEMGWcTGAUGAQwnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGAQwnGAsWCYE1EhsCAAAAAgAA/8AEAAPAACMAZwAAATgBMSIGBwEOARUUFhcBHgEzOAE5ATI3PgE3NjU0Jy4BJyYjBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFzEeARUUBgczMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnFS4BNTQ2NzEwNjc+ARcCABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qghIiETdCFhMlAQEFESJHCycYDBUJFBgGBgFRSSVuNzZCFxIlAQEFESJHCycYDBUJFBgGBVFJGUUmA8ANDP5VCx8SEh8L/lUMDSgpi11damleXYspKPUJCB1yVUUyAQEBDBlnExgFBgsnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGAQwnGAsWCYE1EhsCAAAAAAIAAP/ABAADwAAcAGAAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFyMeARUUBgcxMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnMS4BNTQ2NyMwNjc+ARcCAGleXYspKCgpi11eaWpdXYspKCgpi11daoISIhE3QRcTJQECBBEiRwsoFwwVCgEUGAYFUUklbjY3QRcTJQEBBREiRwsnGAwVCRQYBgYBUUkZRSYDwCgpi11eaWpdXYspKCgpi11damleXYspKPUJCB1yVUUyAQEBDBlnExgFBgsnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGCycYCxYJgTUSGwIAAAABAAD/wAQAA8AAMwAAASIGBw4BBw4BFRQWFx4BFx4BFRQGBw4BBw4BFRQWFx4BFx4BMzI2NwE+ATU0JicBLgEjMQIAQJxJJEUfHzQgExMlEB8fHSAQJhQUHjMgH0YlSZs/Eh8LAasMDQ0M/lULHxIDwAgPBxYUE0otJ0EWFR4OGigtLSQaDR4XFkQnLUwVFRYGDgUNDAGrCx8SEh8LAasMDQAAAAEAAP/ABAADwAA5AAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjY3PgE3PgE1NCYnLgEnLgE1NDY3PgE3PgE1NCYnLgEnLgEjAgASHwz+VgwNDQwBqgwfEj+bSiRGICAyHhQUJhAgHR8fECUTFB80HyBEJEmcQAPADQz+VQsfEhIfC/5VDA0FDgYWFRVMLSdEFhceDRokLS0oGg4eFRZBJy1KExQWBw8IAAEAAP/ABAADwABIAAABIgYHDgEHDgEVFBYXHgEXHgEVFAYHDgEHDgEVFBYXHgEXHgEzMjY3PgE3PgE1NCYnLgEnLgE1NDY3PgE3PgE1NCYnLgEnLgEjAgBAnEkkRB8gNCATEyUQHyAeIBAmFBQeMyAgRSVJmz8/nEklRSAgMh4UEycQHx4fHxAlFBMfNB8fRSRJm0EDwAgPBxYUE0otJ0EWFR4OGigtLSQaDR4XFkQnLUwVFRYGDgUFDgYWFRVMLSdEFhceDRokLS0oGg4eFRZBJy1KExQWBw8IAAABAAD/wAP9A8AAhAAAAQ4BBw4BBw4BBw4BByIGIw4BBw4BBw4BBw4BBw4BBw4BBxQGBw4BBw4BBw4BBw4BFRQWFx4BFx4BFx4BFx4BFR4BFx4BFx4BFx4BFx4BFx4BFzIWMx4BFx4BFx4BFx4BFzI2NzI2MyM+ATc+ATcxAT4BNTQmJwEuAScjLgEnIiYrAS4BIwH3GhQHEBcNDBgJBAgEAgQDCRkODhwPDyMXGAkDBAMBAgICAQEBAwIGEAkIEggJEhIJCBIICRAGAgMBAQECAgIBAwQDCRgXIw8PHA4OGQkDBAIDCQQJGAwNFxAHFBoFDAYBAgEBAwYDCQ8GAakMDQ0M/lcGDggBAwYDAQEBAQYMBQPAAQsFCRMKChQIAwYCAQEDAQEEAwMJFxgiDw8dDQ4ZCQQFAwEFAggTCwoXDQ0fISIeDQwXCwoUBwMEAgMFBAkZDQ4dDw4jFxgIBAMDAgECAgECBQQIFAoKEwkFCwEBAgEBAgEDCQYBqgwfERIfCwGqBgkDAQIBAQIBAAAAAQAA/8AD/wPAAKAAAAEiBgciBiMzDgEHDgEHMRQiBw4BBzEBDgEVFBYXAR4BFzMWMjM+ATc+ATc+ATc+ATcyNjM+ATc+ATc+ATc+ATc+ATc+ATc0Njc+ATc+ATc+ATc+ATU0JicuAScuAScuAScuATUuAScuAScuASc4ATE4ATkBMDQxOAE5ATgBMTgBOQE4ATE4ATkBLgEnLgEnLgEnIiYnLgEnLgEnLgEnLgEnAgcFDAYBAgEBBAcDBgoEAQECAwH+VgwNDQwBqgoaDwEECAQaEwgPGQwMGAkECQMCBAMJGg0OHQ8PIhgXCQQDBAECAgEBAQEDAgYQCQkSCAkSEgkIEgkJEAYCAwEBAQECAgEEAwQJFxgiDw8dDg0aCQMFAgMIBAkYDAwZDwgTGgPAAQIBAQICAgYDAQEBAgH+VgwfEhEfDP5WCgwCAQELBQkTCgoUCAMGAgEBAwEBBAMDCRcYIw4PHQ4NGQkDBgICBQMHEwsKFw0NHyEiHg0NFgsLEwcDBAIDBQQJGQ4NHQ8PIhcBFwkDAwQBAgIBAQEBBgMIFAoKEwkFCwEAAAABAAD/wAQAA8AAwAAAASIGBw4BBw4BBw4BByIGIw4BBw4BBw4BBw4BBw4BBw4BBxQGFQ4BBw4BBw4BBw4BFRQWFx4BFx4BFx4BFxQWFR4BFx4BFx4BFx4BFx4BFx4BFzIWMx4BFx4BFx4BFx4BMzI2Nz4BNz4BNz4BNzI2Mz4BNz4BNz4BNz4BNz4BNz4BNzQ2NT4BNz4BNz4BNz4BNTQmJy4BJy4BJy4BJzQmNS4BJy4BJy4BJy4BJy4BJy4BJyImIy4BJy4BJy4BJy4BIwIAIR8NDRcLChQHAwUCAgYECRkODh0PDyIYGAkDAwQBAgIBAgEEAgYQCQgSCAkSEgkIEggJEAYDAwECAQICAQQDAwkYGCIPDx0ODhkJBAUDAgUDBxQKCxcNDR8hIR8NDRcLChQHAwUCAgYECRkODh0PDyIYGAgEAwQBAgIBAgEEAgYQCAkSCAkSEgkIEgkIEAYCBAECAQICAQQDBAgYGCIPDx0ODhkJBAYCAgUDBxQKCxcNDR8hA8ASCQgSCAkQBgMDAQIBAgIBBAMDCRgYIg8PHQ4OGQkEBgICBQMHFAoLFw0NHyEhHw0NFwsKFAcDBQICBgQJGQ4OHQ8PIhgYCAQDBAEBAwECAQQCBhAJCBIICRISCQgSCAkQBgIEAQIBAwEBBAMECBgYIg8PHQ4OGQkEBgICBQMHFAoLFw0NHyEhHw0NFwsKFAcDBQICBgQJGQ4OHQ8PIhgYCQMDBAECAgECAQMDBhAJCBIICRIAAAEAAP/ABAEDwACiAAABIgYjMQ4BBzMOASMzDgE5AQ4BBzEOAQcxIgYjMQYHDgEHBiMiBhUUFjMxMhYXHgEVFAYHDgEjDgEVFBYzMTIXHgEXFhcyFjkBHgEXMx4BFxUeARczHgE7ARYyMzoBMzE6ATcjMjY3MTI2NxU+ATcxPgE3MT4BMzEBPgE1NCYnASImJzEuAScjLgEnIzAmNSMiJicjLgEnMSImIyoBOQEqASMxAfgBAgEDBwQBAgQCAQECBAYDAgQCAQIBHSgnXzU2OSMyMiMqMQ8QERIQEDEoIjExIjw3N14nJhoBAQMHAwEBBAIDCAQBAQQCAQIHAwEDAQIEAgEFCAQCBAIEBwMCAwIBAgEBqwwNDQz+VQECAQIDAgEDBgMBAgEBBAEBAwYEAgYCAQECBQIDwAEBAQEBAQEBAgMCAgMCAh4gITcSEjIkIzIXEREwGhkxERIWATIjIzITEzkgIBsBAwUCAQIBAQEDAQEBAQECAgIBAQIFAgEDAQECAawLHxISHwsBrAIBAQMBAgQCAQEBAQEBAQEAAAAAAQAA/8AEAgPAAKUAAAEiBiMzDgEHMQ4BIzEOASMxDgEHMQ4BBzEOASMxAQ4BFRQWFwEeARczHgEXMR4BFxUyFhcxHgE7ARYyMzAyMzEwMjM6ATcxMjY3Iz4BNwc+ATcjPgE3MT4BNzE2Nz4BNzYzPgE1NCYjMSImJy4BNTQ2Nz4BMzI2NTQmIzEiJy4BJyYnIiYnMS4BJzEuAScjMCYnIyImJyMuAScjIiYjKgE5ASoBIzEB+AECAQEEBwMCBAEBAQEEBgMCBAECAgH+VQwNDQwBqwECAQEBBAIDBgQCBQMDBwMBAgUDAQEBAQMFAgQHAwEDBgIBBAcDAQMDAgECARsmJl83NzsjMTEjKDEQEBIREBAxKSMzMyM5NTZeKCceAQIBAgMCAwcDAQEBAQEDAgECBwMBAgUDAQECBAMDwAEBAQEBAQEBAgQCAQMBAQL+VAsgERIfDP5VAQEBAQMCAgQBAQIBAQIBAQIBAQIBAQIEAgIDAQEBARohIDgTEwEyIyMyFxIRMBoaMBERFzIjJDISEjchIB4CAQEDAQIEAgEBAQEBAQEBAAEAAP/ABAEDwADFAAABIgYjMw4BBzEOASMzDgEjMQ4BBzEOAQcxDgEHNQYHDgEHBiMiBhUUFjMxMhYXHgEVDgEHDgEjDgEVFBYzMTIXHgEXFhcyFjEzHgEXMR4BFxUeARcxHgE7ARYyMzoBMzE6ATcxMjY3IzI2Nwc+ATcxPgE3MT4BMzE2Nz4BNzYzMjY1NCYnMSImJy4BNTQ2Nz4BMzI2NTQmIzEiJy4BJyYnIiYnMS4BJzEuAScjMCYnIyImIzEuAScxIiYjMCI5ASoBIzAiOQEB+AEDAQEDBgMCBQIBAQIBAwUDAgUCAQIBHSgnXzU2OSMyMiMqMRAQEQESEBAxKCIxMSI8NzdeJyYaAQEBAwYEAgMCBAcFAgMCAQMGBAECAQIEAgQJBAECBQIBBAcDAgQBAQIBGyYmXzc2PCMwMCMoMRAQEhEQEDEpIzIyIzk1Nl4oJx4BAgECAwIDBwMBAQEBAQMCAwcEAwQDAQIFAgEDwAEBAQEBAQEBAgMCAgMCAQEBAR4hIDcSEjIkIzIXEREwGhowERIWATIjIzITEzkgIBsBAwUCAQIBAQEDAQEBAQECAgIBAQIEAwEDAQECGyAgORMTMiMjMgEWEhEwGhowEREXMiMkMhISNyAhHgIBAQICAgQCAQEBAgEBAQADAAD/wAQAA8AAKgBIAGUAAAE4ATEiBhU4ATkBETgBMRQWMzgBMTM4ATEyNjU4ATkBETgBMTQmIzgBOQEFJiIjIgYHAQ4BFRQWFwEeATMyNjURNCYnMS4BKwEBOAExIgYVERQWMzgBMTM4ATEyNjURNCYjOAE5AQNBHy0tH3MgLCwg/lQBBQISHwv+VQwNDQwBqwsfEiMyHRcGDAYBATkfLS0fcyAsLCADwCwg/u0fLS0fARMgLAEBDgv+VQsfEhIfC/5VDA0yIwNWGioKAwP9qywf/u0gLCwgARMfLAAAAAEAAP/ABAADwAAkAAATIgYVFBYXCQEOARUUFjMhOAExMjY1NCYnCQE+ATU0JiM4ATkBVSMyDQwBbv6SDA0yIwNWIzINDP6SAW4MDTIjA8AyIxIfDP6S/pIMHxIjMjIjEh8MAW4BbgwfEiMyAAIAAP/ABAADwAAWADcAAAE4ATEiBhURFBYzOAExMzI2NRE0JiMxISoBIyIGBwEOARUUFhcBHgEzMjY1ETgBMTQmJzUuAScjA0EfLS0fcyAsLCD+VAIEAhIfC/5VDA0NDAGrCx8SIzIdFwYMBgEDwCwg/JggLCwgA2ggLA0M/lULHxISHwv+VQwNMiMDVhorCQECAwEAAAAAAQAA/8AEAAPAACAAAAEOAQcBDgEVFBYXAR4BMzI2NwE+ATU0JicBLgEjIgYjMwHzDhgJ/lUMDQ0MAasLHxISHwsBqwwNDQz+VQsfEgQGBAEDvwINCf5VCx8SEh8L/lUMDQ0MAasLHxISHwsBqwwNAQAAAAACAAD/wAQAA8AAIAAjAAABIgYHAQ4BFRQWFwEeATMyNjcBPgE1NCYnAS4BIzgBOQEVCQECABIfC/5VDA0NDAGrCx8SEh8LAasMDQ0M/lULHxIBMv7OA8ANDP5VCx8SEh8L/lUMDQ0MAasLHxISHwsBqwwNzv7O/s4AAAAAAQAAAAEAAG9Y4W9fDzz1AAsEAAAAAADj+19KAAAAAOP7X0oAAP/ABAIDwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAgAAAAAEAgABAAAAAAAAAAAAAAAAAAAAKgQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAD/QAAA/8AAAQAAAAEAQAABAIAAAQBAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAACgAUAB4AtAFMAeICrgOABE4EugUiBYoGLgbUB3YINgj6CbYKIgqQCvgLKgtgC5AMIAyyDT4NkA3kDlIPGg/wEQ4R3hKyE6oUGhRQFJwU1hUUAAAAAQAAACoAxgAEAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAAcAsQABAAAAAAADABAAUQABAAAAAAAEABAAxgABAAAAAAAFAAsAMAABAAAAAAAGABAAgQABAAAAAAAKABoA9gADAAEECQABACAAEAADAAEECQACAA4AuAADAAEECQADACAAYQADAAEECQAEACAA1gADAAEECQAFABYAOwADAAEECQAGACAAkQADAAEECQAKADQBEGdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AbmdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= ***! \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /***/ ((module) => { "use strict"; module.exports = "data:font/woff2;base64,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"; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ loaded: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = __webpack_modules__; /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/global */ /******/ (() => { /******/ __webpack_require__.g = (function() { /******/ if (typeof globalThis === 'object') return globalThis; /******/ try { /******/ return this || new Function('return this')(); /******/ } catch (e) { /******/ if (typeof window === 'object') return window; /******/ } /******/ })(); /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/node module decorator */ /******/ (() => { /******/ __webpack_require__.nmd = (module) => { /******/ module.paths = []; /******/ if (!module.children) module.children = []; /******/ return module; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/jsonp chunk loading */ /******/ (() => { /******/ __webpack_require__.b = document.baseURI || self.location.href; /******/ /******/ // object to store loaded and loading chunks /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ "main": 0 /******/ }; /******/ /******/ // no chunk on demand loading /******/ /******/ // no prefetching /******/ /******/ // no preloaded /******/ /******/ // no HMR /******/ /******/ // no HMR manifest /******/ /******/ // no on chunks loaded /******/ /******/ // no jsonp function /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { "use strict"; /*!*********************!*\ !*** ./ts/index.ts ***! \*********************/ __webpack_require__.r(__webpack_exports__); /* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! semver/functions/coerce */ "./node_modules/semver/functions/coerce.js"); /* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! semver/functions/satisfies */ "./node_modules/semver/functions/satisfies.js"); /* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../package.json */ "./package.json"); /* harmony import */ var _animationUi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./animationUi */ "./ts/animationUi.ts"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./ts/utils.ts"); /* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keyframe */ "./ts/keyframe.ts"); /* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./codec */ "./ts/codec.ts"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ "./ts/constants.ts"); /* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./events */ "./ts/events.ts"); const { version, author, pluginOptions } = _package_json__WEBPACK_IMPORTED_MODULE_2__; const SUPPORTED_BB_VERSION_RANGE = `${pluginOptions.min_version} - ${pluginOptions.max_version}`; // eslint-disable-next-line @typescript-eslint/no-require-imports const css = (__webpack_require__(/*! ../resources/easing_keyframes.css */ "./resources/easing_keyframes.css").toString)(); if (!semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default()(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default()(Blockbench.version), SUPPORTED_BB_VERSION_RANGE)) alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`); // Register the plugin and define what it adds (function () { let pluginSettings; let pluginProperties; let pluginMenuItems; // @ts-expect-error - Typescript doesn't like that the "Tags" collection could be empty instead of implicitly non-empty BBPlugin.register("geckolib", Object.assign({}, pluginOptions, { name: pluginOptions.title, version, author, onload() { Blockbench.addCSS(css); (0,_events__WEBPACK_IMPORTED_MODULE_8__.addEventListeners)(); (0,_animationUi__WEBPACK_IMPORTED_MODULE_3__.loadAnimationUI)(); (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.loadKeyframeOverrides)(); pluginSettings = createPluginSettings(); pluginProperties = createPluginProperties(); pluginMenuItems = createPluginMenuItems(); for (const menuItem of pluginMenuItems) { MenuBar.addAction(menuItem.action, menuItem.menuCategory); } console.log("Loaded GeckoLib plugin"); }, onunload() { for (const setting of pluginSettings) { setting.delete(); } for (const property of pluginProperties) { property.delete(); } for (const menuItem of pluginMenuItems) { menuItem.action.delete(); } (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.unloadKeyframeOverrides)(); (0,_animationUi__WEBPACK_IMPORTED_MODULE_3__.unloadAnimationUI)(); (0,_events__WEBPACK_IMPORTED_MODULE_8__.removeEventListeners)(); _codec__WEBPACK_IMPORTED_MODULE_6__.format.delete(); console.clear(); }, })); })(); /** * Create and return the plugin's settings. *

    * These are found in the Settings panel in the plugin info window */ function createPluginSettings() { return [ new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_AUTO_PARTICLE_TEXTURE, { value: false, category: "export", name: "Auto-compute block/item particle texture", description: "Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json" }), new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.BAKE_IN_BEZIER_KEYFRAMES, { value: false, category: "export", name: "Bake in bezier keyframes", description: "When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier." }), new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_ALWAYS_SHOW_DISPLAY, { value: false, category: "edit", name: "Always show display tab", description: "Force the Display tab to always show, even when not an Item type model" }), new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_REMEMBER_EXPORT_LOCATIONS, { value: true, category: "export", name: "Remember file export locations", description: "Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file." }), (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID, { // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore type: 'text', value: "", category: "export", name: "Default Mod ID", description: "Default Mod ID for models (if applicable)" }), setting => { setting.onChange = function () { const invalidNamespaceChar = new RegExp('[^_\\-.a-z0-9]+', 'g'); const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g'); this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidNamespaceChar, ""); return {}; }; }) ]; } /** * Create and return the plugin's properties. *

    * These are metadata values stored in the project, usually used in project settings windows */ function createPluginProperties() { return [ (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Property(ModelProject, "string", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODID, { label: "Mod ID", condition: { formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID] }, values: [], merge_validation: _utils__WEBPACK_IMPORTED_MODULE_4__.isValidNamespace }), property => { property['placeholder'] = 'my_modid'; property['description'] = 'The modid of the mod this model is for'; property.getDefault = function () { return settings[_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID].value; }; }), (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Property(ModelProject, "object", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE, { label: "Model Type", condition: { formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID] }, exposed: false, options: _constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType, values: Object.values(_constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType) }), property => { property.merge = (instance, data) => { instance[_constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE] = data[_constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE]; }; property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure'; }), (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Property(ModelProject, "instance", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_FILEPATH_CACHE, { label: "GeckoLib Filepath Cache", condition: { formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID] }, exposed: false, values: [] }), property => { property.default = {}; }) ]; } /** * Create and return the plugin's menu items *

    * These are added to Blockbench's menu bar or submenus */ function createPluginMenuItems() { return [ { action: new Action("export_geckolib_model", { name: "Export GeckoLib Model", icon: "archive", description: "Export your model geometry as a model for GeckoLib.", category: "file", condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isGeckoLibModel)(), click: function () { _codec__WEBPACK_IMPORTED_MODULE_6__["default"].export(); }, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_display", { name: "Export GeckoLib Display Settings", icon: "icon-bb_interface", description: "Export your item/block display settings for GeckoLib.", category: "file", condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isGeckoLibModel)() && (0,_utils__WEBPACK_IMPORTED_MODULE_4__.shouldShowDisplayPanel)(), click: _codec__WEBPACK_IMPORTED_MODULE_6__.buildDisplaySettingsJson, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_animations", { name: "Export GeckoLib Animations", icon: "movie", description: "Export your model animations for GeckoLib.", category: "file", condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isGeckoLibModel)() && !(0,_utils__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object', click: e => BarItems['export_animation_file'].trigger(e), }), menuCategory: 'file.export' } ]; } })(); /******/ })() ; ================================================ FILE: plugins/geckolib/members.yml ================================================ maintainers: - bernie-g - fadookie - Tslat ================================================ FILE: plugins/geckolib/src/.eslintrc.cjs ================================================ /* eslint-env node */ module.exports = { extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], root: true, env: { browser: true, es2015: true, jquery: true }, rules: { 'prefer-rest-params': 'off', '@typescript-eslint/no-explicit-any': 'off', }, }; ================================================ FILE: plugins/geckolib/src/.gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids *.pid *.seed *.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage *.lcov # nyc test coverage .nyc_output # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) bower_components # node-waf configuration .lock-wscript # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ # Snowpack dependency directory (https://snowpack.dev/) web_modules/ # TypeScript cache *.tsbuildinfo # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Microbundle cache .rpt2_cache/ .rts2_cache_cjs/ .rts2_cache_es/ .rts2_cache_umd/ # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # Yarn Integrity file .yarn-integrity # dotenv environment variables file .env .env.test # parcel-bundler cache (https://parceljs.org/) .cache .parcel-cache # Next.js build output .next out # Nuxt.js build / generate output .nuxt dist # Gatsby files .cache/ # Comment in the public line in if your project uses Gatsby and not Next.js # https://nextjs.org/blog/next-9-1#public-directory-support # public # vuepress build output .vuepress/dist # Serverless directories .serverless/ # FuseBox cache .fusebox/ # DynamoDB Local files .dynamodb/ # TernJS port file .tern-port # Stores VSCode versions used for testing VSCode extensions .vscode-test # yarn v2 .yarn/cache .yarn/unplugged .yarn/build-state.yml .yarn/install-state.gz .pnp.* ================================================ FILE: plugins/geckolib/src/.nvmrc ================================================ v24.7.0 ================================================ FILE: plugins/geckolib/src/eslint.config.js ================================================ module.exports = { ignores: ["webpack.config.js", "jest.config.js"], } ================================================ FILE: plugins/geckolib/src/jest.config.js ================================================ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { preset: 'ts-jest', testEnvironment: 'node', }; ================================================ FILE: plugins/geckolib/src/package.json ================================================ { "name": "geckolib", "version": "4.2.5", "private": true, "description": "GeckoLib Models & Animations", "main": "index.js", "scripts": { "prebuild": "npm run test", "build": "npm run build:only", "build:only": "webpack && npm run update_manifest", "update_manifest": "node scripts/updateManifest.mjs", "start": "webpack --watch --mode=development", "lint": "eslint .", "lint:fix": "eslint --fix .", "tsc": "tsc --noEmit", "pretest": "npm run lint && npm run tsc", "test": "npm run test:only", "test:only": "jest" }, "author": "Eliot Lash, Tslat, Gecko, McHorse, matmat37000", "license": "MIT", "pluginOptions": { "title": "GeckoLib Models & Animations", "description": "Create animated blocks, items, entities, and armor for the GeckoLib java mod library.", "icon": "icon.png", "tags": [ "Minecraft: Java Edition" ], "variant": "both", "min_version": "5.0.0", "max_version": "6.0.0", "await_loading": true, "has_changelog": true, "website": "https://github.com/bernie-g/geckolib/wiki", "repository": "https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/geckolib", "bug_tracker": "https://github.com/bernie-g/geckolib/issues" }, "sideEffects": [ "./index.js" ], "devDependencies": { "@types/jest": "^30.0.0", "@types/lodash": "^4.17.20", "@typescript-eslint/eslint-plugin": "^8.41.0", "@typescript-eslint/parser": "^8.41.0", "blockbench-types": "^5.0.6", "css-loader": "^7.1.2", "eol": "0.10.0", "eslint": "^9.34.0", "indent-string": "^5.0.0", "jest": "^30.1.1", "to-string-loader": "^1.2.0", "ts-jest": "^29.4.1", "ts-loader": "^9.5.4", "typescript": "^5.9.2", "webpack": "^5.101.3", "webpack-cli": "^6.0.1" }, "dependencies": { "lodash": "^4.17.21", "semver": "7.7.2" } } ================================================ FILE: plugins/geckolib/src/resources/armorTemplate.json ================================================ { "meta": { "format_version": "3.2", "model_format": "geckolib_model", "box_uv": true }, "name": "CustomArmor", "geo_name": "CustomArmor", "resolution": { "width": 64, "height": 64 }, "elements": [ { "name": "dontTouch", "from": [ -4, 24, -4 ], "to": [ 4, 32, 4 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 0, 0, 0 ], "uuid": "9675593e-b27d-b70e-e1ea-1fc29f46a294" }, { "name": "dontTouch", "from": [ -4, 12, -2 ], "to": [ 4, 24, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 0, 24, 0 ], "uuid": "fa43156a-2a62-948c-082f-483d525f6d1f" }, { "name": "dontTouch", "from": [ 4, 12, -2 ], "to": [ 8, 24, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "aa51170c-8b32-fb62-71f1-58ac0b7785a8" }, { "name": "dontTouch", "from": [ -8, 12, -2 ], "to": [ -4, 24, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "bf2c2539-20e3-cfcc-94c0-491734019889" }, { "name": "dontTouch", "from": [ -4, 0, -2 ], "to": [ 0, 12, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "17b9bae0-356a-9bba-fad9-4672e2671191" }, { "name": "dontTouch", "from": [ 0, 0, -2 ], "to": [ 4, 12, 2 ], "autouv": 1, "color": 0, "export": false, "locked": true, "origin": [ 4, 22, 0 ], "uuid": "7b31bac4-dc40-2b93-1204-7bbdcfe7d924" } ], "outliner": [ { "name": "bipedHead", "uuid": "d340b6fa-56aa-9c0f-3560-7a067643b77d", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ "9675593e-b27d-b70e-e1ea-1fc29f46a294", { "name": "armorHead", "uuid": "6ab88dea-c816-d2bb-6be9-05ed7838da97", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ ] } ] }, { "name": "bipedBody", "uuid": "ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ "fa43156a-2a62-948c-082f-483d525f6d1f", { "name": "armorBody", "uuid": "282fcdbb-8ea9-4a13-4154-f2ed20d696c8", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 0, 24, 0 ], "children": [ ] } ] }, { "name": "bipedRightArm", "uuid": "d8113cc7-7e10-0930-259e-b8e4211ce9da", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 5, 22, 0 ], "children": [ "aa51170c-8b32-fb62-71f1-58ac0b7785a8", { "name": "armorRightArm", "uuid": "c5300e23-fd2f-b56c-3552-45d6650e11c6", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 5, 22, 0 ], "children": [ ] } ] }, { "name": "bipedLeftArm", "uuid": "3b8901e8-3420-0834-51eb-76d64ff2ae8f", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -5, 22, 0 ], "children": [ "bf2c2539-20e3-cfcc-94c0-491734019889", { "name": "armorLeftArm", "uuid": "b0d41a53-f4ce-53c1-f899-5a2048c90ac2", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -5, 22, 0 ], "children": [ ] } ] }, { "name": "bipedLeftLeg", "uuid": "37231be7-a8ef-22ca-7fea-40aed58003bb", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -2, 12, 0 ], "children": [ "17b9bae0-356a-9bba-fad9-4672e2671191", { "name": "armorLeftLeg", "uuid": "e4b19746-2d17-1f56-befe-00718165ae50", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -2, 12, 0 ], "children": [ ] }, { "name": "armorLeftBoot", "uuid": "9fe26b9a-ad66-9e6b-2fa2-4168e333b4be", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ -2, 12, 0 ], "children": [ ] } ] }, { "name": "bipedRightLeg", "uuid": "45c031a5-b6be-e0a7-5454-b45d07f28429", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 2, 12, 0 ], "children": [ "7b31bac4-dc40-2b93-1204-7bbdcfe7d924", { "name": "armorRightLeg", "uuid": "60238f18-e74b-c863-cb45-2e2f162221bd", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 2, 12, 0 ], "children": [ ] }, { "name": "armorRightBoot", "uuid": "eb3db34b-ccfe-dae9-ac4d-4e22c3222f70", "export": true, "isOpen": true, "visibility": true, "autouv": 0, "origin": [ 2, 12, 0 ], "children": [ ] } ] } ], "textures": [ ] } ================================================ FILE: plugins/geckolib/src/resources/easing_keyframes.css ================================================ @font-face { font-family: 'geckolib_icomoon'; font-weight: normal; font-style: normal; src: url("data:font/woff2;base64,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") format("woff2"); } [class^="easing-"]:not(.fa), [class*=" easing-"]:not(.fa) { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'geckolib_icomoon' !important; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; max-width: 24px; margin-top: 4px; font-size: 14px; margin-left: -1px; pointer-events: none; display: block; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .easing-linear:before { content: "\e925"; } .easing-step:before { content: "\e921"; } .easing-in_sine:before { content: "\e915"; } .easing-out_sine:before { content: "\e916"; } .easing-in_out_sine:before { content: "\e917"; } .easing-in_quad:before { content: "\e900"; } .easing-out_quad:before { content: "\e901"; } .easing-in_out_quad:before { content: "\e902"; } .easing-in_cubic:before { content: "\e903"; } .easing-out_cubic:before { content: "\e904"; } .easing-in_out_cubic:before { content: "\e905"; } .easing-in_quart:before { content: "\e906"; } .easing-out_quart:before { content: "\e907"; } .easing-in_out_quart:before { content: "\e908"; } .easing-in_quint:before { content: "\e909"; } .easing-out_quint:before { content: "\e90a"; } .easing-in_out_quint:before { content: "\e90b"; } .easing-in_expo:before { content: "\e90c"; } .easing-out_expo:before { content: "\e90d"; } .easing-in_out_expo:before { content: "\e90e"; } .easing-in_circ:before { content: "\e90f"; } .easing-out_circ:before { content: "\e910"; } .easing-in_out_circ:before { content: "\e911"; } .easing-in_back:before { content: "\e918"; } .easing-out_back:before { content: "\e919"; } .easing-in_out_back:before { content: "\e91a"; } .easing-in_elastic:before { content: "\e91b"; } .easing-out_elastic:before { content: "\e91c"; } .easing-in_out_elastic:before { content: "\e91d"; } .easing-in_bounce:before { content: "\e91e"; } .easing-out_bounce:before { content: "\e91f"; } .easing-in_out_bounce:before { content: "\e920"; } ================================================ FILE: plugins/geckolib/src/scripts/updateManifest.mjs ================================================ // @ts-check import indentString from 'indent-string'; import path from 'path'; import fs from 'fs'; import eol from 'eol'; import * as url from 'url'; // Identify key file paths // @ts-ignore const PLUGIN_SRC_PATH = url.fileURLToPath(new URL('.', import.meta.url)); const PACKAGE_JSON_PATH = path.join(PLUGIN_SRC_PATH, '../package.json'); const PLUGINS_MANIFEST_PATH = path.join(PLUGIN_SRC_PATH, '..', '..', '..', '..', 'plugins.json'); // Extract plugins.json contents const pluginsJsonRaw = fs.readFileSync(PLUGINS_MANIFEST_PATH, { encoding: 'utf8' }); const pluginsJson = JSON.parse(pluginsJsonRaw); // Extract package.json const packageJsonRaw = fs.readFileSync(PACKAGE_JSON_PATH, { encoding: 'utf8' }); const packageJson = JSON.parse(packageJsonRaw); // Update plugins.json manifest entry for plugin packageJson.pluginOptions.version = packageJson.version; const newManifest = Object.assign({}, pluginsJson.geckolib, packageJson.pluginOptions ); const newManifestString = indentString( JSON.stringify(newManifest, null, '\t'), 1, { indent: '\t' } ) .trimStart(); // Write updated plugins.json const newPluginsString = pluginsJsonRaw.replace(/("geckolib":\s*)({[\s\S.]*?})/, `$1${newManifestString}`); fs.writeFileSync(PLUGINS_MANIFEST_PATH, eol.lf(newPluginsString)); ================================================ FILE: plugins/geckolib/src/tests/easing.test.ts ================================================ import { reverseEasing } from '../ts/easing'; describe('easing', () => { describe('reverseEasing', () => { it('should return the easing parameter if it is falsy', () => { expect(reverseEasing(undefined)).toEqual(undefined); expect(reverseEasing(null)).toEqual(null); }); it('should not change direction of non-directional easings', () => { expect(reverseEasing("linear")).toEqual("linear"); expect(reverseEasing("easeInOutBack")).toEqual("easeInOutBack"); }); it('should change easeIn to easeOut and vice versa', () => { expect(reverseEasing("easeInBack")).toEqual("easeOutBack"); expect(reverseEasing("easeOutBack")).toEqual("easeInBack"); }); }); }); ================================================ FILE: plugins/geckolib/src/ts/animationUi.ts ================================================ import uniq from 'lodash/uniq'; import {addMonkeypatch} from './utils'; import {EASING_OPTIONS, EASING_DEFAULT, getEasingArgDefault, parseEasingArg, GeckolibKeyframe, isArgsEasing} from './easing'; import {GECKOLIB_MODEL_ID} from "./constants"; const easingRegExp = /^ease(InOut|In|Out)?([\w]+)$/; export const loadAnimationUI = () => { Blockbench.on('display_animation_frame', displayAnimationFrameCallback); Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.on('render_frame', renderFrameCallback) addMonkeypatch(window, null, "updateKeyframeEasing", updateKeyframeEasing); addMonkeypatch(window, null, "updateKeyframeEasingArg", updateKeyframeEasingArg); }; export const unloadAnimationUI = () => { Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback); Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback); Blockbench.removeListener('render_frame', renderFrameCallback); }; export const displayAnimationFrameCallback = (/*...args*/) => { // const keyframe = $('#keyframe'); // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here }; export function renderFrameCallback() { if (Format.id !== GECKOLIB_MODEL_ID) return Timeline.keyframes.forEach((kf: GeckolibKeyframe) => { if (kf.interpolation != "linear" && kf.easing != undefined) { kf.easing = undefined kf.easingArgs = undefined window.updateKeyframeSelection(); } if (kf.interpolation === "step") { kf.interpolation = "linear" if (kf.data_points.length == 1) addDataPoint() window.updateKeyframeSelection(); } updateKeyframeIcon(kf) }) const addPrePostButton = document.querySelector('#keyframe_type_label > div'); if (addPrePostButton) addPrePostButton.hidden = true; } export function updateKeyframeEasing(value) { Undo.initEdit({keyframes: Timeline.selected}) // var axis = $(obj).attr('axis'); // const value = $(obj).val(); // console.log('updateKeyframeEasing value:', value, 'obj:', obj); if (value === "-") return; Timeline.selected.forEach((kf: GeckolibKeyframe) => { kf.easing = value; kf.easingArgs = undefined; kf.interpolation = 'linear'; }) window.updateKeyframeSelection(); // Ensure easingArg display is updated // Animator.preview(); Undo.finishEdit('edit keyframe easing') } export function updateKeyframeEasingArg(obj) { Undo.initEdit({keyframes: Timeline.selected}) if ($(obj).val() === "-") return; // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); Timeline.selected.forEach((kf: GeckolibKeyframe) => { const value = parseEasingArg(kf, ($(obj).val() as string).trim()); kf.easingArgs = [value]; // obj.value = value; }) Undo.finishEdit('edit keyframe easing argument') } export const updateKeyframeSelectionCallback = (/*...args*/) => { $('#keyframe_bar_easing').remove() $('#keyframe_bar_easing_type').remove() $('#keyframe_bar_easing_arg1').remove() let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars let channel: boolean | string | number = false; Timeline.selected.forEach((kf) => { if (channel === false) { channel = kf.channel } else if (channel !== kf.channel) { multi_channel = true } }) Timeline.keyframes.forEach((kf: GeckolibKeyframe) => { updateKeyframe(kf) }) const getMultiSelectValue = (selector, defaultValue, conflictValue) => { const selectorFunction = typeof selector === 'function' ? selector : x => (x[selector] === undefined ? defaultValue : x[selector]); if (Timeline.selected.length > 1) { const uniqSelected = uniq(Timeline.selected.map(selectorFunction)); if (uniqSelected.length === 1) { return uniqSelected[0]; } else { return conflictValue; } } else { return selectorFunction(Timeline.selected[0]) || defaultValue; } }; const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => { // Dear god I miss lodash if (!acc.has(kf.animator)) acc.set(kf.animator, {}); const animatorChannels = acc.get(kf.animator); if (!animatorChannels[kf.channel]) animatorChannels[kf.channel] = []; animatorChannels[kf.channel].push(kf); animatorChannels[kf.channel].sort((a, b) => { if (a.time < b.time) return -1; if (a.time > b.time) return 1; return 0; }); return acc; }, new Map()); const isFirstInChannel = (kf: _Keyframe) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1; if (Timeline.selected.length && Format.id === GECKOLIB_MODEL_ID) { if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) { const displayedEasing = getMultiSelectValue('easing', EASING_DEFAULT, 'null'); const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => { const easingTypeToTypeId = type => { let finalEasingType = "In"; if (type === "out") { finalEasingType = "Out"; } else if (type === "inout") { finalEasingType = "InOut"; } return finalEasingType; }; let finalEasing = 'ease'; if (inputEasingOrType === "in" || inputEasingOrType === "out" || inputEasingOrType === "inout") { const finalEasingType = easingTypeToTypeId(inputEasingOrType) finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1); } else if (inputEasingOrType === "linear" || inputEasingOrType == "step") { finalEasing = inputEasingOrType; } else { const finalEasingType = easingTypeToTypeId(easingType); finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1); } return finalEasing; }; const addEasingTypeIcons = (bar, easingType, title) => { const div = document.createElement("div"); div.innerHTML = getIcon(easingType); div.id = "kf_easing_type_" + easingType; div.setAttribute("style", "stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px"); div.setAttribute("title", title); div.onclick = () => { const selectedEasing = $(".selected_kf_easing"); const selectedEasingType = $(".selected_kf_easing_type"); const keySelectedEasing = selectedEasing.attr("id").substring(15); const keySelectedEasingType = selectedEasingType.length <= 0 ? "in" : selectedEasingType.attr("id").substring(15); const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing); const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType); if (finalEasing != currentEasing) { // console.log("Changed from " + currentEasing + " to " + finalEasing); updateKeyframeEasing(finalEasing); } }; bar.appendChild(div); }; const keyframePanel = document.getElementById('panel_keyframe'); if (keyframePanel) { let easingBar: HTMLElement = document.createElement('div'); keyframePanel.appendChild(easingBar); easingBar.outerHTML = `

    `; easingBar = document.getElementById('keyframe_bar_easing'); addEasingTypeIcons(easingBar, "linear", "Switch to Linear easing"); addEasingTypeIcons(easingBar, "step", "Switch to Step easing"); addEasingTypeIcons(easingBar, "sine", "Switch to Sine easing"); addEasingTypeIcons(easingBar, "quad", "Switch to Quadratic easing"); addEasingTypeIcons(easingBar, "cubic", "Switch to Cubic easing"); addEasingTypeIcons(easingBar, "quart", "Switch to Quartic easing"); addEasingTypeIcons(easingBar, "quint", "Switch to Quntic easing"); addEasingTypeIcons(easingBar, "expo", "Switch to Exponential easing"); addEasingTypeIcons(easingBar, "circ", "Switch to Circle easing"); addEasingTypeIcons(easingBar, "back", "Switch to Back easing"); addEasingTypeIcons(easingBar, "elastic", "Switch to Elastic easing"); addEasingTypeIcons(easingBar, "bounce", "Switch to Bounce easing"); const keyEasing = getEasingInterpolation(displayedEasing); const keyEasingElement = document.getElementById("kf_easing_type_" + keyEasing); keyEasingElement.style.stroke = "var(--color-accent)"; keyEasingElement.classList.add('selected_kf_easing'); if (!(keyEasing === "linear" || keyEasing == "step")) { let easingTypeBar: HTMLElement = document.createElement('div'); keyframePanel.appendChild(easingTypeBar); easingTypeBar.outerHTML = `
    `; easingTypeBar = document.getElementById('keyframe_bar_easing_type'); addEasingTypeIcons(easingTypeBar, "in", "Switch to In easing type"); addEasingTypeIcons(easingTypeBar, "out", "Switch to Out easing type"); addEasingTypeIcons(easingTypeBar, "inout", "Switch to In/Out easing type"); const keyEasingType = getEasingType(displayedEasing); const keyEasingTypeElement = document.getElementById("kf_easing_type_" + keyEasingType); keyEasingTypeElement.style.stroke = "var(--color-accent)"; keyEasingTypeElement.classList.add('selected_kf_easing_type'); } if (keyEasing !== "linear") document.getElementById('panel_keyframe').querySelector('div.bb-select').textContent = "GeckoLib" const getEasingArgLabel = (kf: GeckolibKeyframe) => { switch(kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: return 'Overshoot'; case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return 'Bounciness'; case EASING_OPTIONS.step: return 'Steps'; default: return 'N/A'; } }; const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null); if (Timeline.selected.every((kf: GeckolibKeyframe) => isArgsEasing(kf.easing)) && easingArgLabel !== null) { const argDefault = getMultiSelectValue(getEasingArgDefault, null, null); const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]); let scaleBar: HTMLElement = document.createElement('div'); keyframePanel.appendChild(scaleBar); scaleBar.outerHTML = `
    `; scaleBar = document.getElementById('keyframe_bar_easing_arg1'); } } } } }; const getEasingInterpolation = (name: string) => { const matches = name.match(easingRegExp); if (matches) { return matches[2].toLowerCase(); } return name; }; const getEasingType = (name: string) => { const matches = name.match(easingRegExp); if (matches) { return matches[1].toLowerCase(); } return "in"; }; const updateKeyframe = (kf: GeckolibKeyframe) => { if (kf.data_points.length != 1 && kf.interpolation !== "linear") { removeLastDataPoint() } } const updateKeyframeIcon = (kf: GeckolibKeyframe) => { const element = document.getElementById(kf.uuid); if (element && element.children && kf.easing) element.children[0].className = 'easing-' + kf.easing.split(/\.?(?=[A-Z])/).join('_').toLowerCase().replace("ease_", "") } const addDataPoint = () => { Undo.initEdit({keyframes: Timeline.selected}) Timeline.selected.forEach(kf => { if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) { kf.data_points.push(new KeyframeDataPoint(kf)) kf.data_points.last().extend(kf.data_points[0]) } }) Animator.preview() Undo.finishEdit('Add keyframe data point') } const removeLastDataPoint = () => { Undo.initEdit({keyframes: Timeline.selected}) Timeline.selected.forEach(kf => { if (kf.data_points.length >= 2) { kf.data_points.remove(kf.data_points.last()); } }) Animator.preview() Undo.finishEdit('Remove keyframe data point') } const getIcon = (name: string) => { switch(name) { case "back": return ''; case "bounce": return ''; case "circ": return ''; case "cubic": return ''; case "elastic": return ''; case "expo": case "in": return ''; case "inout": return ''; case "out": return ''; case "quad": return ''; case "quart": return ''; case "quint": return ''; case "sine": return ''; case "step": return ''; default: // linear return ''; } }; ================================================ FILE: plugins/geckolib/src/ts/codec.ts ================================================ import armorTemplate from '../resources/armorTemplate.json'; import { isEmpty, isValidPath } from './utils'; import { GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, PROPERTY_MODID, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE, SETTING_REMEMBER_EXPORT_LOCATIONS } from "./constants"; import { FormResultValue } from 'blockbench-types/generated/interface/form'; const codec = Codecs.bedrock; // This gets automatically applied by Blockbench, we don't need to do anything with it export const format = new ModelFormat(GECKOLIB_MODEL_ID, { id: GECKOLIB_MODEL_ID, icon: "view_in_ar", name: "GeckoLib Animated Model", description: "Animated Model for Java mods using GeckoLib", category: "minecraft", box_uv: true, optional_box_uv: true, single_texture: true, animated_textures: true, bone_rig: true, centered_grid: true, rotate_cubes: true, locators: true, uv_rotation: true, select_texture_for_particles: true, texture_mcmeta: true, animation_files: true, display_mode: false, animation_mode: true, codec: Codecs.project, animation_codec: Codecs.bedrock.format.animation_codec, }); // Override the new project panel to allow customisation format.new = function () { if (newProject(this)) return openProjectSettingsDialog(); } /** * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item */ export function openProjectSettingsDialog() { if (Project instanceof ModelProject) return createProjectSettingsDialog(Project, createProjectSettingsForm(Project)); } /** * Internal function for determining the placeholder value for the model_identifier form element in dialog windows */ function getObjectIdPlaceholder(formResult?: { [key: string]: FormResultValue }) { const name = formResult?.['name'] as string; const modelType = formResult?.[PROPERTY_MODEL_TYPE] as string; if (!name && !modelType) return 'my_entity'; const invalidPathChar = new RegExp('[^_\\-/.a-z0-9]+', 'g') const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g') if (name) return name.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidPathChar, ""); switch (GeckoModelType[modelType]) { case GeckoModelType.ENTITY: return 'my_entity' case GeckoModelType.BLOCK: return 'my_block'; case GeckoModelType.ITEM: return 'my_item'; case GeckoModelType.ARMOR: return 'my_armor'; case GeckoModelType.OBJECT: return 'my_object'; default: return 'my_entity'; } } /** * Create the Project Settings dialog form for use in both new projects and editing existing ones */ function createProjectSettingsForm(Project: ModelProject) { const form = { format: { type: 'info', label: 'data.format', text: Format.name || 'unknown', description: Format.description } as FormElementOptions } const properties = ModelProject['properties']; const modelType = properties[PROPERTY_MODEL_TYPE]; if (modelType) { const currentType = Project[PROPERTY_MODEL_TYPE]; form[PROPERTY_MODEL_TYPE] = { label: modelType.label, description: modelType["description"], default: GeckoModelType.ENTITY.toUpperCase(), value: typeof (currentType) === 'string' ? GeckoModelType[currentType.toUpperCase()].toUpperCase() : GeckoModelType.ENTITY.toUpperCase(), placeholder: modelType["placeholder"], type: 'select', options: modelType["options"], } } for (const key in properties) { const property = properties[key]; if (property.exposed === false || !Condition(property.condition)) continue; const entry = form[property.name] = { label: property.label, description: property["description"], value: Project[property.name], placeholder: property["placeholder"], type: property.type } if (property.name === 'name') { entry.label = 'Project Name' entry.placeholder = 'My Project' entry.description = 'The name of the Blockbench project' } else if (property.name === 'model_identifier') { entry.label = 'Object ID' entry.description = 'The registered id of the object this model represents, for exporting purposes' entry.placeholder = getObjectIdPlaceholder() } switch (property.type) { case 'boolean': entry.type = 'checkbox' break; case 'string': entry.type = 'text'; break; default: if (property["options"]) { entry['options'] = property["options"]; entry.type = 'select'; } break; } } if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name']) delete form['name']; form['uv_mode'] = { label: 'dialog.project.default_uv_mode', description: 'dialog.project.default_uv_mode.description', type: 'select', condition: Format.optional_box_uv, options: { face_uv: 'dialog.project.uv_mode.face_uv', box_uv: 'dialog.project.uv_mode.box_uv', }, value: Project.box_uv ? 'box_uv' : 'face_uv', }; form['texture_size'] = { label: 'dialog.project.texture_size', type: 'vector', dimensions: 2, value: [Project.texture_width, Project.texture_height], min: 1 }; return form; } /** * Create the 'new project' popup dialogue for GeckoLib projects. *

    * The contents of this is mostly a copy of project.js "project_window" action declaration (Copyright Blockbench)
    * Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility * @return false if the user clicks cancel, otherwise true */ function createProjectSettingsDialog(Project: ModelProject, form: { [formElement: string]: '_' | FormElementOptions }) { const dialog = new Dialog({ id: 'project', title: 'dialog.project.title', width: 500, form, onConfirm: function (formResult) { let save; const box_uv = formResult['uv_mode'] == 'box_uv'; const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity); const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity); if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) { // Adjust UV Mapping if resolution changed if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) { save = Undo.initEdit({ elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true } as UndoAspects) Cube.all.forEach(cube => { for (const key in cube.faces) { const uv = cube.faces[key].uv; uv[0] *= texture_width / Project.texture_width; uv[2] *= texture_width / Project.texture_width; uv[1] *= texture_height / Project.texture_height; uv[3] *= texture_height / Project.texture_height; } }) Mesh.all.forEach(mesh => { for (const key in mesh.faces) { const uv = mesh.faces[key].uv; for (const vkey in uv) { uv[vkey][0] *= texture_width / Project.texture_width; uv[vkey][1] *= texture_height / Project.texture_height; } } }) } // Convert UV mode per element if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) { if (!save) save = Undo.initEdit({ elements: Cube.all, uv_only: true, uv_mode: true } as UndoAspects); Cube.all.forEach(cube => cube.setUVMode(box_uv)); } if (!save) save = Undo.initEdit({ uv_mode: true }); Project.texture_width = texture_width; Project.texture_height = texture_height; if (Format.optional_box_uv) Project.box_uv = box_uv; Canvas.updateAllUVs(); updateSelection(); } const properties = ModelProject['properties']; for (const key in properties) { properties[key].merge(Project, formResult); } Project.name = Project.name.trim(); Project.model_identifier = Project.model_identifier.trim(); if (save) Undo.finishEdit('Change project UV settings'); Blockbench.dispatchEvent('update_project_settings', formResult); BARS.updateConditions(); if (Project.EditSession) { const metadata = { texture_width: Project.texture_width, texture_height: Project.texture_height, box_uv: Project.box_uv }; for (const key in properties) { properties[key].copy(Project, metadata); } Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata)); } const modelType = GeckoModelType[formResult[PROPERTY_MODEL_TYPE]] Project[PROPERTY_MODEL_TYPE] = modelType; if (modelType == GeckoModelType.ITEM) Project.parent = 'builtin/entity'; if (Project.name === Format.name || Project.name === '') Project.name = "GeckoLib " + Project[PROPERTY_MODEL_TYPE]; switch (modelType) { case GeckoModelType.ARMOR: if (Outliner.root.length === 0) { Codecs.project.parse(armorTemplate, null); } else { alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.') return false; } break; default: break; } Format.display_mode = modelType === GeckoModelType.ITEM || settings[SETTING_ALWAYS_SHOW_DISPLAY].value as boolean; dialog.hide(); }, onFormChange(formResult) { try { document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult) } // eslint-disable-next-line @typescript-eslint/no-unused-vars catch (ex) { /* empty */ } }, }) dialog.show() return true; } /** * Export the item display json *

    * Only called for GeckoLib projects */ export function buildDisplaySettingsJson(options = {}) { if (!Project) return; const modelProperties: any = {} if (options['comment'] || settings.credit.value) modelProperties.credit = settings.credit.value modelProperties.parent = !Project.parent ? 'builtin/entity' : Project.parent; if (options['ambientocclusion'] || Project.ambientocclusion === false) modelProperties.ambientocclusion = false if (Project.texture_width !== 16 || Project.texture_height !== 16) modelProperties.texture_size = [Project.texture_width, Project.texture_height] if (options['front_gui_light'] || Project.front_gui_light) modelProperties.gui_light = 'front'; if (options['overrides'] || Project.overrides) modelProperties.overrides = Project.overrides; if (options['display'] || !isEmpty(Project.display_settings)) { const nonDefaultDisplays = {} for (const slot in DisplayMode.slots) { const perspective = DisplayMode.slots[slot] // eslint-disable-next-line no-prototype-builtins if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) { const display: any = Project.display_settings[perspective].export(); if (display) nonDefaultDisplays[perspective] = display } } if (!isEmpty(nonDefaultDisplays)) modelProperties.display = nonDefaultDisplays } if ((options['textures'] || !isEmpty(Project.textures)) && Project[PROPERTY_MODID]) { for (const texture of Project.textures) { if (texture.particle || (settings[SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) { let name = texture.name; if (name.indexOf(".png") > 0) name = name.substring(0, name.indexOf(".png")) if (!isValidPath(name)) { name = name.toLowerCase().replace(" ", "_") if (!isValidPath(name)) continue; } name = (Project[PROPERTY_MODEL_TYPE] == GeckoModelType.BLOCK ? "block/" : "item/") + name; name = Project[PROPERTY_MODID] + ":" + name modelProperties.textures = { 'particle': name }; break } } } Blockbench.export({ resource_id: 'model', type: Codecs.java_block.name, extensions: ['json'], name: Project.model_identifier ? (Project.model_identifier + ".json") : codec.fileName().replace(".geo", ""), startpath: Project[PROPERTY_FILEPATH_CACHE].display, content: JSON.stringify(modelProperties, null, 2), }, file_path => { const oldPath = Project[PROPERTY_FILEPATH_CACHE].display; Project[PROPERTY_FILEPATH_CACHE].display = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].display) Project.saved = false; }); return this; } export default codec; ================================================ FILE: plugins/geckolib/src/ts/constants.ts ================================================ /** * GeckoLib plugin model format ID. Used to identify model types generated from this plugin */ export const GECKOLIB_MODEL_ID = "geckolib_model" // Setting name constants export const SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture'; export const SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display'; export const SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations'; export const SETTING_DEFAULT_MODID = 'geckolib_default_modid'; export const BAKE_IN_BEZIER_KEYFRAMES = "geckolib_bake_in_bezier_keyframes"; // Property name constants export const PROPERTY_MODID = 'geckolib_modid'; export const PROPERTY_MODEL_TYPE = 'geckolib_model_type'; export const PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache'; /** * Available GeckoLib model types */ export enum GeckoModelType { ENTITY = 'Entity', BLOCK = 'Block', ITEM = 'Item', ARMOR = 'Armor', OBJECT = 'Object' } /** * Statically defined type for the filepath cache property, for ease of use */ export type GeckoFilepathCache = {model?: string, animation?: string, display?: string} ================================================ FILE: plugins/geckolib/src/ts/easing.ts ================================================ // The MIT license notice below applies to the function findIntervalBorderIndex /* The MIT License (MIT) Copyright (c) 2015 Boris Chumichev 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. /** * * Utilizes bisection method to search an interval to which * point belongs to, then returns an index of left or right * border of the interval * * @param {Number} point * @param {Array} intervals * @param {Boolean} useRightBorder * @returns {Number} */ function findIntervalBorderIndex(point: number, intervals: number[], useRightBorder: boolean) { //If point is beyond given intervals if (point < intervals[0]) return 0 if (point > intervals[intervals.length - 1]) return intervals.length - 1 //If point is inside interval //Start searching on a full range of intervals let indexOfNumberToCompare = 0; let leftBorderIndex = 0; let rightBorderIndex = intervals.length - 1 //Reduce searching range till it find an interval point belongs to using binary search while (rightBorderIndex - leftBorderIndex !== 1) { indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2) point >= intervals[indexOfNumberToCompare] ? leftBorderIndex = indexOfNumberToCompare : rightBorderIndex = indexOfNumberToCompare } return useRightBorder ? rightBorderIndex : leftBorderIndex } function stepRange(steps: number, stop = 1) { if (steps < 2) throw new Error("steps must be > 2, got:" + steps); const stepLength = stop / steps; return Array.from({length: steps}, (_, i) => i * stepLength); } type EasingFunction = (t: number) => number; type EasingDirection = (easing: EasingFunction) => EasingFunction; // The MIT license notice below applies to the Easing class /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ class Easing { /** * A stepping function, returns 1 for any positive value of `n`. */ static step0(n: number) { return n > 0 ? 1 : 0; } /** * A stepping function, returns 1 if `n` is greater than or equal to 1. */ static step1(n: number) { return n >= 1 ? 1 : 0; } /** * A linear function, `f(t) = t`. Position correlates to elapsed time one to * one. * * http://cubic-bezier.com/#0,0,1,1 */ static linear(t: number) { return t; } /** * A simple inertial interaction, similar to an object slowly accelerating to * speed. * * http://cubic-bezier.com/#.42,0,1,1 */ // static ease(t) { // if (!ease) { // ease = Easing.bezier(0.42, 0, 1, 1); // } // return ease(t); // } /** * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed * time. * * http://easings.net/#easeInQuad */ static quad(t: number) { return t * t; } /** * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed * time. * * http://easings.net/#easeInCubic */ static cubic(t: number) { return t * t * t; } /** * A power function. Position is equal to the Nth power of elapsed time. * * n = 4: http://easings.net/#easeInQuart * n = 5: http://easings.net/#easeInQuint */ static poly(n: number) { return (t: number) => Math.pow(t, n); } /** * A sinusoidal function. * * http://easings.net/#easeInSine */ static sin(t: number) { return 1 - Math.cos((t * Math.PI) / 2); } /** * A circular function. * * http://easings.net/#easeInCirc */ static circle(t: number) { return 1 - Math.sqrt(1 - t * t); } /** * An exponential function. * * http://easings.net/#easeInExpo */ static exp(t: number) { return Math.pow(2, 10 * (t - 1)); } /** * A simple elastic interaction, similar to a spring oscillating back and * forth. * * Default bounciness is 1, which overshoots a little bit once. 0 bounciness * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N * times. * * http://easings.net/#easeInElastic */ static elastic(bounciness = 1) { const p = bounciness * Math.PI; return (t: number) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p); } /** * Use with `Animated.parallel()` to create a simple effect where the object * animates back slightly as the animation starts. * * Wolfram Plot: * * - http://tiny.cc/back_default (s = 1.70158, default) */ static back(s = 1.70158) { return (t: number) => t * t * ((s + 1) * t - s); } /** * Provides a simple bouncing effect. * * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up * using min instead of ternaries * http://easings.net/#easeInBounce */ static bounce(k = 0.5) { const q = (x: number) => (121 / 16) * x * x; const w = (x: number) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k; const r = (x: number) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k; const t = (x: number) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k; return (x: number) => Math.min(q(x), w(x), r(x), t(x)); } /** * Provides a cubic bezier curve, equivalent to CSS Transitions' * `transition-timing-function`. * * A useful tool to visualize cubic bezier curves can be found at * http://cubic-bezier.com/ */ // static bezier(x1, y1, x2, y2) { // const _bezier = require('./bezier'); // return _bezier(x1, y1, x2, y2); // } /** * Runs an easing function forwards. */ static in(easing: EasingFunction) { return easing; } /** * Runs an easing function backwards. */ static out(easing: EasingFunction) { return (t: number) => 1 - easing(1 - t); } /** * Makes any easing function symmetrical. The easing function will run * forwards for half of the duration, then backwards for the rest of the * duration. */ static inOut(easing: EasingFunction) { return (t: number) => { if (t < 0.5) { return easing(t * 2) / 2; } return 1 - easing((1 - t) * 2) / 2; }; } } const quart = Easing.poly(4); const quint = Easing.poly(5); const back = (direction: EasingDirection, scalar: number, t: number) => direction(Easing.back(1.70158 * scalar))(t); const elastic = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.elastic(bounciness))(t); const bounce = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.bounce(bounciness))(t); export const easingFunctions = { linear: Easing.linear, step(steps, x) { const intervals = stepRange(steps); return intervals[findIntervalBorderIndex(x, intervals, false)]; }, easeInQuad: Easing.in(Easing.quad), easeOutQuad: Easing.out(Easing.quad), easeInOutQuad: Easing.inOut(Easing.quad), easeInCubic: Easing.in(Easing.cubic), easeOutCubic: Easing.out(Easing.cubic), easeInOutCubic: Easing.inOut(Easing.cubic), easeInQuart: Easing.in(quart), easeOutQuart: Easing.out(quart), easeInOutQuart: Easing.inOut(quart), easeInQuint: Easing.in(quint), easeOutQuint: Easing.out(quint), easeInOutQuint: Easing.inOut(quint), easeInSine: Easing.in(Easing.sin), easeOutSine: Easing.out(Easing.sin), easeInOutSine: Easing.inOut(Easing.sin), easeInExpo: Easing.in(Easing.exp), easeOutExpo: Easing.out(Easing.exp), easeInOutExpo: Easing.inOut(Easing.exp), easeInCirc: Easing.in(Easing.circle), easeOutCirc: Easing.out(Easing.circle), easeInOutCirc: Easing.inOut(Easing.circle), easeInBack: back.bind(null, Easing.in), easeOutBack: back.bind(null, Easing.out), easeInOutBack: back.bind(null, Easing.inOut), easeInElastic: elastic.bind(null, Easing.in), easeOutElastic: elastic.bind(null, Easing.out), easeInOutElastic: elastic.bind(null, Easing.inOut), easeInBounce: bounce.bind(null, Easing.in), easeOutBounce: bounce.bind(null, Easing.out), easeInOutBounce: bounce.bind(null, Easing.inOut), }; export type EasingKey = keyof typeof easingFunctions; // Object with the same keys as easingFunctions and values of the stringified key names export const EASING_OPTIONS = Object.freeze(Object.fromEntries( Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]])) ) as { [Property in EasingKey]: string }); export const EASING_DEFAULT = 'linear'; export interface EasingProperties { easing?: EasingKey | null; easingArgs?: number[]; } export type GeckolibKeyframe = _Keyframe & EasingProperties & {bezier: boolean}; export const getEasingArgDefault = (kf: GeckolibKeyframe): number => { switch (kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: return 1; case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return 0.5; case EASING_OPTIONS.step: return 5; default: return null; } }; export const parseEasingArg = (kf: GeckolibKeyframe, value: string) => { switch(kf.easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: case EASING_OPTIONS.easeInElastic: case EASING_OPTIONS.easeOutElastic: case EASING_OPTIONS.easeInOutElastic: case EASING_OPTIONS.easeInBounce: case EASING_OPTIONS.easeOutBounce: case EASING_OPTIONS.easeInOutBounce: return parseFloat(value); case EASING_OPTIONS.step: return Math.max(parseInt(value, 10), 2); default: return parseInt(value, 10); } }; export function reverseEasing(easing?: EasingKey): EasingKey { if (!easing) return easing; if (easing.startsWith("easeInOut")) return easing; if (easing.startsWith("easeIn")) return easing.replace("easeIn", "easeOut") as EasingKey; if (easing.startsWith("easeOut")) return easing.replace("easeOut", "easeIn") as EasingKey; return easing; } export const isArgsEasing = (easing = "") => easing.includes("Back") || easing.includes("Elastic") || easing.includes("Bounce") || easing === EASING_OPTIONS.step; ================================================ FILE: plugins/geckolib/src/ts/events.ts ================================================ import { addCodecCallback, addEventListener, addMonkeypatch, shouldShowDisplayPanel, isGeckoLibModel, Monkeypatches, onlyIfGeckoLib, removeCodecCallback, removeEventListener, removeMonkeypatches, determineModelType } from "./utils"; import {GeckolibBoneAnimator} from "./keyframe"; import { BAKE_IN_BEZIER_KEYFRAMES, GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_REMEMBER_EXPORT_LOCATIONS } from "./constants"; import {openProjectSettingsDialog} from "./codec"; import {GeckolibKeyframe} from "./easing"; import * as molang from "blockbench-types/generated/util/molang"; export function addEventListeners() { addCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse)) addCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile)) addEventListener('select_mode', onlyIfGeckoLib(onModeSelect)); addEventListener('select_project', onlyIfGeckoLib(onProjectSelect)); addEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged)); addEventListener('save_project', onlyIfGeckoLib(onProjectSave)); addEventListener('convert_format', onlyIfGeckoLib(onProjectConvert)); addMonkeypatch(Animator, null, "buildFile", monkeypatchAnimatorBuildFile); addMonkeypatch(Codecs.bedrock.format.animation_codec, null, "loadFile", monkeypatchAnimatorLoadFile); addMonkeypatch(Blockbench, null, "export", monkeypatchBlockbenchExport); addMonkeypatch(BarItems, 'project_window', "click", monkeypatchProjectWindowClick); } export function removeEventListeners() { removeCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse)) removeCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile)) removeEventListener('select_mode', onlyIfGeckoLib(onModeSelect)); removeEventListener('select_project', onlyIfGeckoLib(onProjectSelect)); removeEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged)); removeMonkeypatches(); } /** * When an existing GeckoLib project is being read from file */ function onProjectParse(e: any) { onSettingsChanged(); if (!e.model[PROPERTY_MODEL_TYPE]) { e.model[PROPERTY_MODEL_TYPE] = determineModelType(e.model); Project.saved = false; } // Because the project hasn't had its model properties applied at this stage Format.display_mode = (e.model[PROPERTY_MODEL_TYPE] && e.model[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM) || settings[SETTING_ALWAYS_SHOW_DISPLAY].value as boolean; } /** * When the Blockbench project is being saved *

    * Only called for GeckoLib projects */ function onProjectSave(e: {model: object, options: any }) { if (!e.model[PROPERTY_MODEL_TYPE]) e.model[PROPERTY_MODEL_TYPE] = determineModelType(e.model); // Explicitly checked for undefined here because Blockbench attempts a save when removing the plugin if (settings[SETTING_REMEMBER_EXPORT_LOCATIONS] && !settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value) e.model[PROPERTY_FILEPATH_CACHE] = {} } /** * When a project is being converted from another format to a GeckoLib model *

    * Only called for GeckoLib projects */ function onProjectConvert(e: any) { onSettingsChanged(); } /** * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to *

    * Only called for GeckoLib projects */ function onSettingsChanged() { if (Modes.selected instanceof Mode) Modes.selected.select() if (Project instanceof ModelProject) { if (!Project[PROPERTY_MODEL_TYPE]) { Project[PROPERTY_MODEL_TYPE] = determineModelType(); Project.saved = false; } if (Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) { Project.parent = 'builtin/entity'; Project.saved = false; } } Format.display_mode = shouldShowDisplayPanel(); } /** * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs *

    * Only called for GeckoLib projects */ function onProjectSelect() { onSettingsChanged() } /** * When selecting edit/paint/display/animate/etc *

    * Only called for GeckoLib projects */ function onModeSelect(e: any) { // Offset the display emulator to account for GeckoLib's +0.51 manual offset // This is a legacy patch as Blockbench no longer does this internally if (e.mode.id == 'display') (Project as ModelProject).model_3d.position.y = 0; } /** * When the model geometry is being compiled for export *

    * Only called for GeckoLib projects */ function onBedrockCompile(e: any) { // Remove display transforms from non-bedrock geometry e.model["minecraft:geometry"]?.forEach((geo: Map) => delete geo["item_display_transforms"]) // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established switch (e.model.format_version) { case "1.14.0": case "1.21.0": case "1.21.20": e.model.format_version = "1.12.0" break; default: break; } } /** * When the project settings window is being opened, either via a new project or the File -> Project... menu item *

    * The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchProjectWindowClick() { if (isGeckoLibModel()) { openProjectSettingsDialog(); } else { Monkeypatches.get(BarItems).click(); } } /** * When any file is being exported to disk by Blockbench *

    * The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchBlockbenchExport(options, cb) { if (!isGeckoLibModel()) { Monkeypatches.get(Blockbench).export(options, cb); return; } if (Project instanceof ModelProject) { if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON const fileName = Project.model_identifier && Project.model_identifier + ".animation"; options.startpath = Project[PROPERTY_FILEPATH_CACHE].animation; const parentCallback = cb; cb = (file_path: string) => { if (parentCallback) parentCallback(file_path); const oldPath = Project[PROPERTY_FILEPATH_CACHE].animation; Project[PROPERTY_FILEPATH_CACHE].animation = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].animation) Project.saved = false; } if (fileName) options.name = fileName; } else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo const fileName = Project.model_identifier && Project.model_identifier + ".geo"; options.startpath = Project[PROPERTY_FILEPATH_CACHE].model; const parentWriter = options.custom_writer; const parentCallback = cb; if (parentWriter) { options.custom_writer = (content, filePath, callback) => { parentWriter(content, filePath, callback); callback(filePath) } } cb = file_path => { if (parentCallback) parentCallback(file_path); const oldPath = Project[PROPERTY_FILEPATH_CACHE].model; Project[PROPERTY_FILEPATH_CACHE].model = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined; if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].model) Project.saved = false; } if (fileName) options.name = fileName; } } Monkeypatches.get(Blockbench).export(options, cb); } /** * When the animation file is being loaded into the project *

    * The project may not be a GeckoLib project, so check it as necessary */ function monkeypatchAnimatorLoadFile(file, exportingAnims) { // eslint-disable-next-line no-undef const json = file.json || autoParseJSON(file.content); const path = file.path; const new_animations = []; function geoLoopToBbLoop(jsonLoop) { if (jsonLoop) { if (typeof jsonLoop === 'boolean') return jsonLoop ? 'loop' : 'once' if (typeof jsonLoop === 'string') { if (jsonLoop === "hold_on_last_frame") return 'hold' if (jsonLoop === "loop" || jsonLoop === "true") return 'loop' } } return 'once' } function getKeyframeDataPoints(channel: string, source: any) { if (source instanceof Array) return invertAnimKeyframe(channel, [{x: source[0], y: source[1], z: source[2]}]) if (['number', 'string'].includes(typeof source)) return invertAnimKeyframe(channel, [{x: source, y: source, z: source}]) if (typeof source == 'object') { if (source.vector) return getKeyframeDataPoints(channel, source.vector); const points = []; if (source.pre) points.push(getKeyframeDataPoints(channel, source.pre)[0]) if (source.post) points.push(getKeyframeDataPoints(channel, source.post)[0]) return points; } } // Because Blockbench now implicitly inverts rotation and position keyframes on export and import (??) function invertAnimKeyframe(channel: string, value: any) { if (channel != 'position' && channel != 'rotation') return value; if (value instanceof Array) { switch (value.length) { case 1: return [invertAnimKeyframe(channel, value[0])]; case 3: return [invertAnimKeyframe(channel, value[0]), channel == 'rotation' ? invertAnimKeyframe(channel, value[1]) : value[1], value[2]]; default: return value; } } else if (typeof value == 'object') { if (value.x) value.x = invertMolang(value.x); if (value.y && channel == 'rotation') value.y = invertMolang(value.y); return value; } return invertMolang(value); } if (json && typeof json.animations === 'object') { for (const animName in json.animations) { if (exportingAnims && !exportingAnims.includes(animName)) continue; //Animation const animData = json.animations[animName] let animation: any = new Animation({ name: animName, path, loop: geoLoopToBbLoop(animData.loop), override: animData.override_previous_animation, anim_time_update: (typeof animData.anim_time_update == 'string' ? animData.anim_time_update.replace(/;(?!$)/, ';\n') : animData.anim_time_update), blend_weight: (typeof animData.blend_weight == 'string' ? animData.blend_weight.replace(/;(?!$)/, ';\n') : animData.blend_weight), length: animData.animation_length } as any) animation = animation.add() //Bones if (animData.bones) { for (const boneName in animData.bones) { const bone = animData.bones[boneName] const lowercase_bone_name = boneName.toLowerCase(); const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name) const uuid = group ? group.uuid : guid(); const boneAnimator = new GeckolibBoneAnimator(uuid, animation, boneName); animation.animators[uuid] = boneAnimator; //Channels for (const channel in bone) { if (Animator.possible_channels[channel]) { if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel]["easing"], easingArgs: bone[channel]["easingArgs"], data_points: getKeyframeDataPoints(channel, bone[channel]), }) } else if (typeof bone[channel] === 'object' && bone[channel].post) { boneAnimator.addKeyframe({ time: 0, channel, easing: bone[channel].easing == "bezier" ? undefined : bone[channel].easing, easingArgs: bone[channel]["easingArgs"], interpolation: bone[channel].easing == "bezier" ? "bezier" : bone[channel].lerp_mode, data_points: getKeyframeDataPoints(channel, bone[channel]), bezier_right_time: bone[channel].right_time, bezier_left_time: bone[channel].left_time, bezier_left_value: bone[channel].left, bezier_right_value: bone[channel].right }); } else if (typeof bone[channel] === 'object') { for (const timestamp in bone[channel]) { boneAnimator.addKeyframe({ time: parseFloat(timestamp), channel, easing: bone[channel][timestamp].easing == "bezier" ? undefined : bone[channel][timestamp].easing, easingArgs: bone[channel][timestamp].easingArgs, interpolation: bone[channel][timestamp].easing == "bezier" ? "bezier" : bone[channel][timestamp].lerp_mode, data_points: getKeyframeDataPoints(channel, bone[channel][timestamp]), bezier_right_time: bone[channel][timestamp].right_time, bezier_left_time: bone[channel][timestamp].left_time, bezier_left_value: bone[channel][timestamp].left, bezier_right_value: bone[channel][timestamp].right }); } } } } } } if (animData.sound_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.sound_effects) { const sounds = animData.sound_effects[timestamp]; animation.animators.effects.addKeyframe({ channel: 'sound', time: parseFloat(timestamp), data_points: sounds instanceof Array ? sounds : [sounds] }) } } if (animData.particle_effects) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.particle_effects) { let particles = animData.particle_effects[timestamp]; if (!(particles instanceof Array)) particles = [particles]; particles.forEach(particle => { if (particle) particle.script = particle.pre_effect_script; }) animation.animators.effects.addKeyframe({ channel: 'particle', time: parseFloat(timestamp), data_points: particles }) } } if (animData.timeline) { if (!animation.animators.effects) animation.animators.effects = new EffectAnimator(animation); for (const timestamp in animData.timeline) { const entry = animData.timeline[timestamp]; const script = entry instanceof Array ? entry.join('\n') : entry; animation.animators.effects.addKeyframe({ channel: 'timeline', time: parseFloat(timestamp), data_points: [{script}] }) } } animation.calculateSnappingFromKeyframes(); if (!Animator.selected && Animator.open) animation.select() new_animations.push(animation) } } return new_animations } /** * When the animations JSON is being compiled for export *

    * Makes sure bezier keyframes get exported correctly rather than being baked. */ function monkeypatchAnimatorBuildFile() { const bezierKeys:GeckolibKeyframe[] = []; if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) { const arg = arguments[1][0]; const animation = this.animations.find(anim => anim.name == arg); if (animation) { for (const uuid in animation.animators) { const animator = animation.animators[uuid]; if (!animator.keyframes.length && !animator.rotation_global) continue; if (animator.type == 'bone') { for (const channel in Animator.possible_channels) { if (!animator[channel]?.length) continue; const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time); sorted_keyframes.forEach((kf: GeckolibKeyframe) => { if (kf.interpolation == "bezier") { bezierKeys[bezierKeys.length] = kf; kf.bezier = true; } }); } } } } } const result = Monkeypatches.get(Animator).buildFile.apply(this, arguments); if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) { result.geckolib_format_version = 2 bezierKeys.forEach((kf) => { kf.bezier = false; kf.easing = undefined; }); } return result; } ================================================ FILE: plugins/geckolib/src/ts/index.ts ================================================ import semverCoerce from 'semver/functions/coerce'; import semverSatisfies from 'semver/functions/satisfies'; import packageJson from '../package.json'; import { loadAnimationUI, unloadAnimationUI } from './animationUi'; import {shouldShowDisplayPanel, isEmpty, isGeckoLibModel, isValidNamespace, make} from './utils'; import { loadKeyframeOverrides, unloadKeyframeOverrides } from './keyframe'; import codec, {buildDisplaySettingsJson, format} from './codec'; import { GeckoFilepathCache, GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, PROPERTY_MODID, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE, BAKE_IN_BEZIER_KEYFRAMES, SETTING_DEFAULT_MODID, SETTING_REMEMBER_EXPORT_LOCATIONS, } from "./constants"; import {addEventListeners, removeEventListeners} from "./events"; const { version, author, pluginOptions } = packageJson; const SUPPORTED_BB_VERSION_RANGE = `${pluginOptions.min_version} - ${pluginOptions.max_version}`; // eslint-disable-next-line @typescript-eslint/no-require-imports const css = require('../resources/easing_keyframes.css').toString(); if (!semverSatisfies(semverCoerce(Blockbench.version), SUPPORTED_BB_VERSION_RANGE)) alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`); // Register the plugin and define what it adds (function () { let pluginSettings: Setting[]; let pluginProperties: Property[]; let pluginMenuItems: { action: Action, menuCategory: string }[]; // @ts-expect-error - Typescript doesn't like that the "Tags" collection could be empty instead of implicitly non-empty BBPlugin.register("geckolib", Object.assign( {}, pluginOptions, { name: pluginOptions.title, version, author, onload() { Blockbench.addCSS(css); addEventListeners(); loadAnimationUI(); loadKeyframeOverrides(); pluginSettings = createPluginSettings(); pluginProperties = createPluginProperties(); pluginMenuItems = createPluginMenuItems(); for (const menuItem of pluginMenuItems as { action: Action, menuCategory: string }[]) { MenuBar.addAction(menuItem.action, menuItem.menuCategory); } console.log("Loaded GeckoLib plugin") }, onunload() { for (const setting of pluginSettings) { setting.delete(); } for (const property of pluginProperties) { property.delete(); } for (const menuItem of pluginMenuItems) { menuItem.action.delete(); } unloadKeyframeOverrides(); unloadAnimationUI(); removeEventListeners() format.delete(); console.clear(); }, } )); })(); /** * Create and return the plugin's settings. *

    * These are found in the Settings panel in the plugin info window */ function createPluginSettings(): Setting[] { return [ new Setting(SETTING_AUTO_PARTICLE_TEXTURE, { value: false, category: "export", name: "Auto-compute block/item particle texture", description: "Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json" }), new Setting(BAKE_IN_BEZIER_KEYFRAMES, { value: false, category: "export", name: "Bake in bezier keyframes", description: "When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier." }), new Setting(SETTING_ALWAYS_SHOW_DISPLAY, { value: false, category: "edit", name: "Always show display tab", description: "Force the Display tab to always show, even when not an Item type model" }), new Setting(SETTING_REMEMBER_EXPORT_LOCATIONS, { value: true, category: "export", name: "Remember file export locations", description: "Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file." }), make( new Setting(SETTING_DEFAULT_MODID, { // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore type: 'text', value: "", category: "export", name: "Default Mod ID", description: "Default Mod ID for models (if applicable)" }), setting => { setting.onChange = function() { const invalidNamespaceChar = new RegExp('[^_\\-.a-z0-9]+', 'g') const pseudoWhitepaceChar = new RegExp('[\\s&-]+', 'g') this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, "_").replace(invalidNamespaceChar, "") return {}; } } ) ]; } /** * Create and return the plugin's properties. *

    * These are metadata values stored in the project, usually used in project settings windows */ function createPluginProperties(): Property[] { return [ make( new Property(ModelProject, "string", PROPERTY_MODID, { label: "Mod ID", condition: { formats: [GECKOLIB_MODEL_ID] }, values: [], merge_validation: isValidNamespace }), property => { property['placeholder'] = 'my_modid'; property['description'] = 'The modid of the mod this model is for'; property.getDefault = function() { return settings[SETTING_DEFAULT_MODID].value as string; }; } ), make( new Property(ModelProject, "object", PROPERTY_MODEL_TYPE, { label: "Model Type", condition: { formats: [GECKOLIB_MODEL_ID] }, exposed: false, options: GeckoModelType, values: Object.values(GeckoModelType) }), property => { property.merge = (instance, data) => { instance[PROPERTY_MODEL_TYPE] = data[PROPERTY_MODEL_TYPE] as string; } property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure'; } ), make( new Property(ModelProject, "instance", PROPERTY_FILEPATH_CACHE, { label: "GeckoLib Filepath Cache", condition: { formats: [GECKOLIB_MODEL_ID] }, exposed: false, values: [] }), property => { property.default = {} as GeckoFilepathCache; } ) ]; } /** * Create and return the plugin's menu items *

    * These are added to Blockbench's menu bar or submenus */ function createPluginMenuItems(): { action: Action, menuCategory: string }[] { return [ { action: new Action("export_geckolib_model", { name: "Export GeckoLib Model", icon: "archive", description: "Export your model geometry as a model for GeckoLib.", category: "file", condition: () => isGeckoLibModel(), click: function () { codec.export(); }, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_display", { name: "Export GeckoLib Display Settings", icon: "icon-bb_interface", description: "Export your item/block display settings for GeckoLib.", category: "file", condition: () => isGeckoLibModel() && shouldShowDisplayPanel(), click: buildDisplaySettingsJson, }), menuCategory: 'file.export' }, { action: new Action("export_geckolib_animations", { name: "Export GeckoLib Animations", icon: "movie", description: "Export your model animations for GeckoLib.", category: "file", condition: () => isGeckoLibModel() && !isEmpty(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object', click: e => (BarItems['export_animation_file'] as Action).trigger(e), }), menuCategory: 'file.export' } ]; } ================================================ FILE: plugins/geckolib/src/ts/keyframe.ts ================================================ import groupBy from 'lodash/groupBy'; import mapValues from 'lodash/mapValues'; import {addMonkeypatch, Monkeypatches} from './utils'; import { EASING_DEFAULT, easingFunctions, type EasingKey, EasingProperties, GeckolibKeyframe, getEasingArgDefault, isArgsEasing, reverseEasing } from './easing'; import {GECKOLIB_MODEL_ID} from "./constants"; export function loadKeyframeOverrides() { // @ts-ignore addMonkeypatch(Keyframe, "prototype", "getLerp", keyframeGetLerp); // @ts-ignore addMonkeypatch(Keyframe, "prototype", "compileBedrockKeyframe", keyframeCompileBedrock); // @ts-ignore addMonkeypatch(Keyframe, "prototype", "getUndoCopy", keyframeGetUndoCopy); // @ts-ignore addMonkeypatch(Keyframe, "prototype", "extend", keyframeExtend); addMonkeypatch(BarItems.reverse_keyframes, null, "click", onReverseKeyframes); } export function unloadKeyframeOverrides() { //No-op for now since monkeypatches are unloaded automatically } interface GeckolibKeyframeOptions extends KeyframeOptions { easing: EasingKey easingArgs: number[] | null | undefined } // This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch export class GeckolibBoneAnimator extends BoneAnimator { public addKeyframe(data: GeckolibKeyframeOptions, uuid?: string): _Keyframe { const keyframe = super.addKeyframe(data, uuid); if (data.bezier_left_time) keyframe.bezier_left_time = data.bezier_left_time; if (data.bezier_right_time) keyframe.bezier_right_time = data.bezier_right_time; if (data.bezier_right_value) keyframe.bezier_right_value = data.bezier_right_value; if (data.bezier_left_value) keyframe.bezier_left_value = data.bezier_left_value; return keyframe; } } function lerp(start: number, stop: number, amt: number) { return amt * (stop - start) + start; } // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars function keyframeGetLerp(other, axis, amount, allow_expression) { if (Format.id !== GECKOLIB_MODEL_ID) // @ts-ignore return Monkeypatches.get(Keyframe).getLerp.apply(this, arguments); const easing = other.easing || EASING_DEFAULT; let easingFunc = easingFunctions[easing]; if (isArgsEasing(easing)) { const easingValue = Array.isArray(other.easingArgs) && other.easingArgs.length > 0 ? other.easingArgs[0] : getEasingArgDefault(other); easingFunc = easingFunc.bind(null, easingValue); } const easedAmount = easingFunc(amount); const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1); const stop = other.calc(axis); const result = lerp(start, stop, easedAmount); if (Number.isNaN(result)) throw new Error('batman'); return result; } // Calculate GeckoLib's keyframe values in place of the built-in Bedrock compiler. // Additionally, invert the keyframe to match Blockbench's internal handling function geckolibGetArray(data_point: number, channel: string) { const {easing, easingArgs, getArray} = this; let result = getArray.apply(this, [data_point]); if ((this as GeckolibKeyframe).bezier) { result = {vector: result, easing: "bezier", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time}; } else if (Format.id === GECKOLIB_MODEL_ID) { if (this.data_points.length != 1) { const postResult = getArray.apply(this, [1]); if (!easing && result[0] === postResult[0] && result[1] === postResult[1] && result[2] === postResult[2]) { result = {vector: result, easing}; } else { result = { pre: checkAndPatchKeyframeValues(result, channel), post: checkAndPatchKeyframeValues(getArray.apply(this, [1]), channel), easing }; } } else { result = {vector: result, easing}; } if (isArgsEasing(easing)) result.easingArgs = easingArgs; } if (result.vector) result.vector = checkAndPatchKeyframeValues(result.vector, channel); return result; } // Invert the molang value to match Blockbench's internal handling // Also swap out empty molang queries because Blockbench now sends them as empty quotes for some reason function checkAndPatchKeyframeValues(vector: any[], channel: string) { for (let i = 0; i <= 2; i++) { if (vector[i] === "") vector[i] = 0; } if (channel === 'rotation' || channel === 'position') { vector[0] = invertMolang(vector[0]); if (channel === 'rotation') vector[1] = invertMolang(vector[1]); } return vector; } // Replace the bedrock keyframe compilation with a custom handler function keyframeCompileBedrock() { if (Format.id !== GECKOLIB_MODEL_ID || !this.transform) // @ts-ignore return Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments); if (this.interpolation == 'catmullrom') { const previous = this.getPreviousKeyframe.apply(this); const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom'); return { pre: include_pre ? geckolibGetArray.call(this, [0], this.channel) : undefined, post: geckolibGetArray.call(this, [include_pre ? 1 : 0], this.channel), lerp_mode: this.interpolation, } } if (this.data_points.length == 1) return geckolibGetArray.call(this, 0, this.channel); return geckolibGetArray.call(this, [0], this.channel); } function keyframeGetUndoCopy() { const {easing, easingArgs} = this; // @ts-ignore const result = Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments); if (Format.id === GECKOLIB_MODEL_ID) { Object.assign(result, {easing}); if (isArgsEasing(easing)) result.easingArgs = easingArgs; } return result; } // Append GeckoLib data to Keyframes when constructed function keyframeExtend(dataIn) { const data = Object.assign({}, dataIn); if (Format.id === GECKOLIB_MODEL_ID) { if (typeof data.values === 'object') { if (data.values.easing !== undefined) Merge.string(this, data.values, 'easing'); if (Array.isArray(data.values.easingArgs)) this.easingArgs = data.values.easingArgs; if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) { // Convert data to format expected by KeyframeExtendOriginal data.values = data.values.vector; } } else { if (data.easing !== undefined) Merge.string(this, data, 'easing'); if (Array.isArray(data.easingArgs)) this.easingArgs = data.easingArgs; } } // @ts-ignore return Monkeypatches.get(Keyframe).extend.apply(this, arguments); } // Inject GeckoLib support for the reverse keyframes feature function onReverseKeyframes() { Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments); // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead Undo.initEdit({keyframes: Timeline.selected}) const kfByAnimator = groupBy(Timeline.selected, kf => kf.animator.uuid); const kfByAnimatorAndChannel = mapValues( kfByAnimator, keyframesForAnimator => groupBy(keyframesForAnimator, kf => kf.channel) ); Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => { const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid]; Object.keys(animatorChannelGroups).forEach(channel => { const channelKeyframes = animatorChannelGroups[channel]; // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time); // Reverse easing direction const easingData: EasingProperties[] = channelKeyframes.map((kf: GeckolibKeyframe) => ({ easing: reverseEasing(kf.easing), easingArgs: kf.easingArgs })); // Shift easing data to the right by one keyframe channelKeyframes.forEach((kf: GeckolibKeyframe, i: number) => { if (i == 0) { kf.easing = undefined; kf.easingArgs = undefined; return; } const newEasingData = easingData[i - 1]; kf.easing = newEasingData.easing; kf.easingArgs = newEasingData.easingArgs; }); }); }); Undo.finishEdit('Reverse keyframe easing') updateKeyframeSelection(); Animator.preview(); } ================================================ FILE: plugins/geckolib/src/ts/utils.ts ================================================ import {GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY} from "./constants"; const VALID_NAMESPACE_PATTERN = new RegExp('^[_\\-.a-z0-9]+$') const VALID_PATH_PATTERN = new RegExp('^[_\\-/.a-z0-9]+$') export const Monkeypatches = new Map(); /** * Add what is effectively an override of another javascript function in a target object. *

    * The patched function should call the original first and operate on the result to ensure compatibility *

    * * @param symbol The target object * @param path The property of the target to access, or null to access the root target itself * @param functionKey The name of the function to replace * @param newFunction The function to patch in to replace the target */ export const addMonkeypatch = (symbol: any, path: string | null, functionKey: string, newFunction) => { const pathAccessor = path ? symbol[path] : symbol; if (!Monkeypatches.get(symbol)) Monkeypatches.set(symbol, { _pathAccessor: pathAccessor }); Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey]; pathAccessor[functionKey] = newFunction; }; /** * Remove all previously added monkeypatches, reverting their operation to prior to the patch */ export const removeMonkeypatches = () => { Monkeypatches.forEach(symbol => { Object.keys(symbol).forEach(functionKey => { if (functionKey.startsWith('_')) return; symbol._pathAccessor[functionKey] = symbol[functionKey]; }); }); Monkeypatches.clear(); } /** * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety */ export const onlyIfGeckoLib = (callback: (data: object) => void) => { return (e: any) => { if (isGeckoLibModel()) callback(e) } } /** * Add an event listener to Blockbench's event callback system. *

    * This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ export const addEventListener = (eventName: BlockbenchEventName, callback: (data: object) => void) => { Blockbench.on(eventName, callback) } /** * Remove a previously registered event listener from Blockbench's event callback system. *

    * All registered event listeners should be removed when the plugin or codec is unloaded */ export const removeEventListener = (eventName: BlockbenchEventName, callback: (data: object) => void) => { Blockbench.removeListener(eventName, callback) } /** * Add a callback to a codec to be called after the task has been completed *

    * This should be done in codec.ts#loadCodec or in the plugin creation in index.ts */ export const addCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => { codec.on(taskName, callback); } /** * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable */ export function make(obj: T, consumer: (obj2: T) => void): T { consumer(obj); return obj; } /** * Remove a previously added codec task completion callback *

    * All registered coded callbacks should be removed when the plugin or codec is unloaded */ export const removeCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => { codec.removeListener(taskName, callback); } /** * Whether a given string is a valid ResourceLocation path for Minecraft */ export const isValidPath = (path: string) => { return VALID_PATH_PATTERN.test(path) } /** * Whether a given string is a valid ResourceLocation namespace for Minecraft */ export const isValidNamespace = (namespace: string) => { return VALID_NAMESPACE_PATTERN.test(namespace) } /** * Whether a map-like object has no defined keys or values */ export const isEmpty = (object = {}) => !object || Object.keys(object).length === 0; /** * Whether the currently focussed model is a GeckoLib model */ export const isGeckoLibModel = () => Format.id === GECKOLIB_MODEL_ID; /** * Whether the current project is a GeckoLib model that has or uses item render perspective transforms */ export const shouldShowDisplayPanel = () => { if (!isGeckoLibModel() || !Project) return false; if (settings[SETTING_ALWAYS_SHOW_DISPLAY].value) return true; return Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM || !isEmpty(Project.display_settings); } /** * Determine the GeckoModelType of the current project (as best as possible), or null if it is not a GeckoLib model. */ export const determineModelType = (optionalModel?: any) => { if (!isGeckoLibModel() || !Project) return null; if (Project[PROPERTY_MODEL_TYPE] && typeof Project[PROPERTY_MODEL_TYPE] === 'string') return Project[PROPERTY_MODEL_TYPE]; if (optionalModel && !isEmpty(optionalModel.display)) return GeckoModelType.ITEM; if (!isEmpty(Project.display_settings)) return GeckoModelType.ITEM; return GeckoModelType.ENTITY; } ================================================ FILE: plugins/geckolib/src/tsconfig.json ================================================ { "compilerOptions": { "outDir": "'../../plugins", // "noImplicitAny": true, "module": "es2022", "target": "es2023", "allowJs": true, "resolveJsonModule": true, "allowSyntheticDefaultImports": true, "skipLibCheck": true, "moduleResolution": "node", "types": ["blockbench-types", "jest"] // "typeRoots": ["./node_modules/@types", "./node_modules/blockbench-types"] }, "exclude": [ "node_modules" ] } ================================================ FILE: plugins/geckolib/src/types/blockbench-types.d.ts ================================================ /// ================================================ FILE: plugins/geckolib/src/webpack.config.js ================================================ const PathModule = require('path') module.exports = { mode: 'development', devtool: false, entry: './ts/index.ts', module: { rules: [ { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/, }, { test: /\.css$/, use: [ 'to-string-loader', 'css-loader' ] }, ], }, resolve: { extensions: ['.tsx', '.ts', '.js'], }, output: { filename: 'geckolib.js', path: PathModule.resolve(__dirname, '..') } } ================================================ FILE: plugins/geenium_bedrock_entity_helper.js ================================================ /***********************************\ | PLUGIN DATA | \***********************************/ var plugin_data = { id: 'geenium_bedrock_entity_helper', title: 'Bedrock Entity Model Presets', icon: 'pets', author: 'Geenium', description: 'Loads Bedrock vanilla entity models up to version 1.13', deprecation_note: "This plugin is no longer updated. To get models for texturing, use File > New > Minecraft Skin. To get Minecraft Bedrock Edition models, use the plugin 'Minecraft Entity Wizard'. To get template models for OptiFine CEM, use the plugin 'CEM Template Loader'.", tags: ['Minecraft: Bedrock Edition'], version: '0.3.0', variant: 'both' } /***********************************\ | ADDING NEW FUNCTIONS | \***********************************/ //New addCube function allows you to specify the name and position properties of the cube addEntityCube = function(name, from, to, uv, inflate, mirror) { var added_cube = new Cube({name: name, from: from, to: to, uv_offset: uv, shade: (mirror != undefined)}).addTo(Group.all.last()).init() if (inflate) { added_cube.inflate = inflate } } getEntityName = function(entity, parent) { var parentEntity = '' switch (entity) { case 'enderman': case 'zombie': case 'pigzombie': case 'zombie.villager': case 'vex': parentEntity = ':geometry.humanoid' break case 'cow': case 'sheep.sheared': case 'pig': parentEntity = ':geometry.quadruped' break case 'evoker': case 'villager.witch': parentEntity = ':geometry.villager' break case 'zombie.husk': case 'skeleton': parentEntity = ':geometry.zombie' break case 'skeleton.wither': case 'skeleton.stray': parentEntity = ':geometry.skeleton' break case 'creeper.charged': parentEntity = ':geometry.creeper' break case 'pigzombie.baby': parentEntity = ':geometry.pigzombie' break case 'mooshroom': parentEntity = ':geometry.cow' break case 'sheep': parentEntity = ':geometry.sheep.sheared' break case 'witherBoss.armor': parentEntity = ':geometry.witherBoss' } entity = 'geometry.' + entity if (parent) return entity + parentEntity return entity } //Sets the base texture size for the project for the default entity texture //This is used in calculating the UVs of the entity changeTextureSizes = function(entity) { switch (entity) { case 'dragon': case 'dragon_head': Project.texture_width = 256 Project.texture_height = 256 break case 'horse': case 'irongolem': Project.texture_width = 128 Project.texture_height = 128 break case 'llama': case 'polarbear': case 'boat': Project.texture_width = 128 Project.texture_height = 64 break case 'villager.witch': Project.texture_width = 64 Project.texture_height = 128 break case 'llamaspit': case 'shulker': case 'zombie.villager': case 'evoker': case 'vex': case 'vindicator': case 'guardian': case 'witherBoss': case 'armor_stand': case 'bed': case 'player_head': case 'villager': case 'snowgolem': case 'sheep': case 'sheep.sheared': case 'bat': case 'dolphin': case 'horse.v2': case 'zombie.drowned': Project.texture_width = 64 Project.texture_height = 64 break case 'parrot': case 'tropicalfish_a': case 'tropicalfish_b': case 'trident': case 'cod': case 'pufferfish.small': case 'pufferfish.mid': case 'pufferfish.large': case 'salmon': Project.texture_width = 32 Project.texture_height = 32 break default: Project.texture_width = 64 Project.texture_height = 32 } } createBones = function(entity, add_cubes) { //These entities parent all their bones from other entities //Means I don't have to define the exact same entity repeatedly switch (entity) { case 'zombie': case 'zombie.husk': case 'pigzombie.baby': entity = 'humanoid' break case 'skeleton.wither': case 'skeleton.stray': entity = 'skeleton' break case 'mooshroom': entity = 'cow' break case 'mob_head': entity = 'player_head' break } var bones = entity_bones[entity] //Iterates over each bone from the entity defined in entity_bones Object.keys(bones).forEach(function(bone_name) { //Copies the list to a new variable so the original list is not altered cubeValues = bones[bone_name].slice() //Removes the first element from the list, which is the rotation values rotationValues = cubeValues.shift() //Creates a new group for the bone bone_group = new Group(bone_name).init(); bone_group.origin = rotationValues[0] bone_group.shade = false //Sets the selected group to the newly created bone selected_group = bone_group //Cubes are added first, so all added cubes can be instantly added to a group if (add_cubes) { cubeValues.forEach(function(cubes) { addEntityCube(bone_name, ...cubes) }) } if (rotationValues.length > 1) { bone_group.rotation = rotationValues[1] } }) } /***********************************\ | BONE VALUES | \***********************************/ //Defines bones that are repeated multiple times var repeat={blazeRod:[[[0,24,0]],[[0,16,0],[2,24,2],[0,16]]],dragon:{wingtip:[[[-56,24,0]],[[-112,22,-2],[-56,26,2],[112,136]],[[-112,24,2],[-56,24,58],[-56,144]]],rearlegtip:[[[0,-8,-4]],[[-6,-38,-4],[6,-6,8],[196,0]]],frontlegtip:[[[0,4,-1]],[[-3,-19,-4],[3,5,2],[226,138]]],rearfoot:[[[0,-7,4]],[[-9,-13,-16],[9,-7,8],[112,0]]],frontfoot:[[[0,1,0]],[[-4,-3,-12],[4,1,4],[144,104]]],jaw:[[[0,20,-8]],[[-6,16,-24],[6,20,-8],[176,65]]]},slime:{eye0:[[[0,24,0]],[[-3.3,4,-3.5],[-1.3,6,-1.5],[32,0]]],eye1:[[[0,24,0]],[[1.3,4,-3.5],[3.3,6,-1.5],[32,4]]],mouth:[[[0,24,0]],[[0,2,-3.5],[1,3,-2.5],[32,8]]]},humanoid:{head:[[[0,24,0]],[[-4,24,-4],[4,32,4],[0,0]]],body:[[[0,24,0]],[[-4,12,-2],[4,24,2],[16,16]]],leftArm:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,16],0,1]],rightArm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[40,16]]],leftLeg:[[[1.9,12,0]],[[-0.1,0,-2],[3.9,12,2],[0,16],0,1]],rightLeg:[[[-1.9,12,0]],[[-3.9,0,-2],[0.1,12,2],[0,16]]]},snowgolemArm:[[[0,18,0]],[[-1,16,-1],[11,18,1],[32,0],-0.5]],guardianSpike:[[[0,24,0]],[[-1,19.5,-1],[1,28.5,1],[0,0]]],villager:{head:[[[0,24,0]],[[-4,24,-4],[4,34,4],[0,0]]],nose:[[[0,26,0]],[[-1,23,-6],[1,27,-4],[24,0]]],body:[[[0,24,0]],[[-4,12,-3],[4,24,3],[16,20]],[[-4,6,-3],[4,24,3],[0,38],0.5]],leg0:[[[-2,12,0]],[[-4,0,-2],[0,12,2],[0,22]]],leg1:[[[2,12,0]],[[0,0,-2],[4,12,2],[0,22]]],arms:[[[0,22,0]],[[-4,16,-2],[4,20,2],[40,38]],[[-8,16,-2],[-4,24,2],[44,22]],[[4,16,-2],[8,24,2],[44,22]]]},zombieVillagerLeftLeg:[[[2,12,0]],[[0,0,-2],[4,12,2],[0,22],0,1]],illager:{rightarm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[40,46]]],leftarm:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,46],0,1]]}} //These are all the hard coded entity bone values var entity_bones={chicken:{head:[[[0,9,-4]],[[-2,9,-6],[2,15,-3],[0,0]]],beak:[[[0,9,-4]],[[-2,11,-8],[2,13,-6],[14,0]]],comb:[[[0,9,-4]],[[-1,9,-7],[1,11,-5],[14,4]]],body:[[[0,8,0]],[[-3,4,-3],[3,12,3],[0,9]]],leg0:[[[-2,5,1]],[[-3,0,-2],[0,5,1],[26,0]]],leg1:[[[1,5,1]],[[0,0,-2],[3,5,1],[26,0]]],wing0:[[[-3,11,0]],[[-4,7,-3],[-3,11,3],[24,13]]],wing1:[[[3,11,0]],[[3,7,-3],[4,11,3],[24,13]]]},blaze:{upperBodyParts0:repeat.blazeRod,upperBodyParts1:repeat.blazeRod,upperBodyParts2:repeat.blazeRod,upperBodyParts3:repeat.blazeRod,upperBodyParts4:repeat.blazeRod,upperBodyParts5:repeat.blazeRod,upperBodyParts6:repeat.blazeRod,upperBodyParts7:repeat.blazeRod,upperBodyParts8:repeat.blazeRod,upperBodyParts9:repeat.blazeRod,upperBodyParts10:repeat.blazeRod,upperBodyParts11:repeat.blazeRod,head:[[[0,24,0]],[[-4,20,-4],[4,28,4],[0,0]]]},llamaspit:{body:[[[0,24,0]],[[-4,22,0],[-2,24,2],[0,0]],[[0,26,0],[2,28,2],[0,0]],[[0,22,-4],[2,24,-2],[0,0]],[[0,22,0],[2,24,2],[0,0]],[[2,22,0],[4,24,2],[0,0]],[[0,20,0],[2,22,2],[0,0]],[[0,22,2],[2,24,4],[0,0]]]},llama:{head:[[[0,17,-6]],[[-2,27,-16],[2,31,-7],[0,0]],[[-4,15,-12],[4,33,-6],[0,14]],[[-4,33,-10],[-1,36,-8],[17,0]],[[1,33,-10],[4,36,-8],[17,0]]],chest1:[[[-8.5,21,3],[0,90,0]],[[-11.5,13,3],[-3.5,21,6],[45,28]]],chest2:[[[5.5,21,3],[0,90,0]],[[2.5,13,3],[10.5,21,6],[45,41]]],body:[[[0,19,2]],[[-6,11,-5],[6,29,5],[29,0]]],leg0:[[[-3.5,14,6]],[[-5.5,0,4],[-1.5,14,8],[29,29]]],leg1:[[[3.5,14,6]],[[1.5,0,4],[5.5,14,8],[29,29]]],leg2:[[[-3.5,14,-5]],[[-5.5,0,-7],[-1.5,14,-3],[29,29]]],leg3:[[[3.5,14,-5]],[[1.5,0,-7],[5.5,14,-3],[29,29]]]},dragon:{head:[[[0,24,0]],[[-6,20,-24],[6,25,-8],[176,44]],[[-8,16,-10],[8,32,6],[112,30]],[[-5,32,-4],[-3,36,2],[0,0]],[[-5,25,-22],[-3,27,-18],[112,0]],[[3,32,-4],[5,36,2],[0,0]],[[3,25,-22],[5,27,-18],[112,0],0,1]],jaw:repeat.dragon.jaw,neck:[[[0,24,0]],[[-5,19,-5],[5,29,5],[192,104]],[[-1,29,-3],[1,33,3],[48,0]]],body:[[[0,20,8]],[[-12,-4,-8],[12,20,56],[0,0]],[[-1,20,-2],[1,26,10],[220,53]],[[-1,20,18],[1,26,30],[220,53]],[[-1,20,38],[1,26,50],[220,53]]],wing:[[[-12,19,2]],[[-68,15,-2],[-12,23,6],[112,88]],[[-68,19,4],[-12,19,60],[-56,88]]],wingtip:repeat.dragon.wingtip,wing1:[[[12,19,2]],[[-44,15,-2],[12,23,6],[112,88]],[[-44,19,4],[12,19,60],[-56,88]]],wingtip1:repeat.dragon.wingtip,rearleg:[[[-16,8,42]],[[-24,-20,34],[-8,12,50],[0,0]]],rearleg1:[[[16,8,42]],[[8,-20,34],[24,12,50],[0,0]]],frontleg:[[[-12,4,2]],[[-16,-16,-2],[-8,8,6],[112,104]]],frontleg1:[[[12,4,2]],[[8,-16,-2],[16,8,6],[112,104]]],rearlegtip:repeat.dragon.rearlegtip,rearlegtip1:repeat.dragon.rearlegtip,frontlegtip:repeat.dragon.frontlegtip,frontlegtip1:repeat.dragon.frontlegtip,rearfoot:repeat.dragon.rearfoot,rearfoot1:repeat.dragon.rearfoot,frontfoot:repeat.dragon.frontfoot,frontfoot1:repeat.dragon.frontfoot},ghast:{tentacles_0:[[[-3.8,1,-5]],[[-4.8,-8,-6],[-2.8,1,-4],[0,0]]],tentacles_1:[[[1.3,1,-5]],[[0.3,-10,-6],[2.3,1,-4],[0,0]]],tentacles_2:[[[6.3,1,-5]],[[5.3,-7,-6],[7.3,1,-4],[0,0]]],tentacles_3:[[[-6.3,1,0]],[[-7.3,-8,-1],[-5.3,1,1],[0,0]]],tentacles_4:[[[-1.3,1,0]],[[-2.3,-12,-1],[-0.3,1,1],[0,0]]],tentacles_5:[[[3.8,1,0]],[[2.8,-10,-1],[4.8,1,1],[0,0]]],tentacles_6:[[[-3.8,1,5]],[[-4.8,-11,4],[-2.8,1,6],[0,0]]],tentacles_7:[[[1.3,1,5]],[[0.3,-11,4],[2.3,1,6],[0,0]]],tentacles_8:[[[6.3,1,5]],[[5.3,-12,4],[7.3,1,6],[0,0]]],body:[[[0,8,0]],[[-8,0,-8],[8,16,8],[0,0]]]},slime:{cube:[[[0,24,0]],[[-3,1,-3],[3,7,3],[0,16]]],eye0:repeat.slime.eye0,eye1:repeat.slime.eye1,mouth:repeat.slime.mouth},'slime.armor':{cube:[[[0,24,0]],[[-4,0,-4],[4,8,4],[0,0]]],eye0:repeat.slime.eye0,eye1:repeat.slime.eye1,mouth:repeat.slime.mouth},lavaslime:{bodyCube_0:[[[0,24,0]],[[-4,7,-4],[4,8,4],[0,0]]],bodyCube_1:[[[0,24,0]],[[-4,6,-4],[4,7,4],[0,1]]],bodyCube_2:[[[0,24,0]],[[-4,5,-4],[4,6,4],[24,10]]],bodyCube_3:[[[0,24,0]],[[-4,4,-4],[4,5,4],[24,19]]],bodyCube_4:[[[0,24,0]],[[-4,3,-4],[4,4,4],[0,4]]],bodyCube_5:[[[0,24,0]],[[-4,2,-4],[4,3,4],[0,5]]],bodyCube_6:[[[0,24,0]],[[-4,1,-4],[4,2,4],[0,6]]],bodyCube_7:[[[0,24,0]],[[-4,0,-4],[4,1,4],[0,7]]],insideCube:[[[0,24,0]],[[-2,2,-2],[2,6,2],[0,16]]]},silverfish:{bodyPart_0:[[[0,2,-3.5]],[[-1.5,0,-4.5],[1.5,2,-2.5],[0,0]]],bodyPart_1:[[[0,3,-1.5]],[[-2,0,-2.5],[2,3,-0.5],[0,4]]],bodyPart_2:[[[0,4,1]],[[-3,0,-0.5],[3,4,2.5],[0,9]]],bodyPart_3:[[[0,3,4]],[[-1.5,0,2.5],[1.5,3,5.5],[0,16]]],bodyPart_4:[[[0,2,7]],[[-1,0,5.5],[1,2,8.5],[0,22]]],bodyPart_5:[[[0,1,9.5]],[[-1,0,8.5],[1,1,10.5],[11,0]]],bodyPart_6:[[[0,1,11.5]],[[-0.5,0,10.5],[0.5,1,12.5],[13,4]]],bodyLayer_0:[[[0,8,1]],[[-5,0,-0.5],[5,8,2.5],[20,0]]],bodyLayer_1:[[[0,4,7]],[[-3,0,5.5],[3,4,8.5],[20,11]]],bodyLayer_2:[[[0,5,-1.5]],[[-3,0,-3],[3,5,-1],[20,18]]]},shulker:{lid:[[[0,0,0]],[[-8,4,-8],[8,16,8],[0,0]]],base:[[[0,0,0]],[[-8,0,-8],[8,8,8],[0,28]]],head:[[[0,12,0]],[[-3,6,-3],[3,12,3],[0,52]]]},rabbit:{rearFootLeft:[[[3,6.5,3.7]],[[2,0,0],[4,1,7],[8,24],0,1]],rearFootRight:[[[-3,6.5,3.7]],[[-4,0,0],[-2,1,7],[26,24],0,1]],haunchLeft:[[[3,6.5,3.7],[20,0,0]],[[2,2.5,3.7],[4,6.5,8.7],[16,15],0,1]],haunchRight:[[[-3,6.5,3.7],[20,0,0]],[[-4,2.5,3.7],[-2,6.5,8.7],[30,15],0,1]],body:[[[0,5,8],[20,0,0]],[[-3,2,-2],[3,7,8],[0,0],0,1]],frontLegLeft:[[[3,7,-1],[10,0,0]],[[2,0,-2],[4,7,0],[8,15],0,1]],frontLegRight:[[[-3,7,-1],[10,0,0]],[[-4,0,-2],[-2,7,0],[0,15],0,1]],head:[[[0,8,-1]],[[-2.5,8,-6],[2.5,12,-1],[32,0],0,1]],earRight:[[[0,8,-1],[0,-15,0]],[[-2.5,12,-2],[-0.5,17,-1],[52,0],0,1]],earLeft:[[[0,8,-1],[0,15,0]],[[0.5,12,-2],[2.5,17,-1],[58,0],0,1]],tail:[[[0,4,7],[20,0,0]],[[-1.5,2.5,7],[1.5,5.5,9],[52,6],0,1]],nose:[[[0,8,-1]],[[-0.5,9.5,-6.5],[0.5,10.5,-5.5],[32,9],0,1]]},'horse.v2':{Body:[[[0,13,9]],[[-5,11,-11],[5,21,11],[0,32]]],TailA:[[[0,20,11],[-30,0,0]],[[-1.5,6,9],[1.5,20,13],[42,36]]],Leg1A:[[[3,11,9]],[[1,0,7],[5,11,11],[48,21],0,1]],Leg2A:[[[-3,11,9]],[[-5,0,7],[-1,11,11],[48,21]]],Leg3A:[[[3,11,-9]],[[1,0,-11],[5,11,-7],[48,21],0,1]],Leg4A:[[[-3,11,-9]],[[-5,0,-11],[-1,11,-7],[48,21]]],Head:[[[0,28,-11],[-30,0,0]],[[-3,28,-11],[3,33,-4],[0,13]]],UMouth:[[[0,28,-11],[-30,0,0]],[[-2,28,-16],[2,33,-11],[0,25]]],Ear1:[[[0,17,-8],[-30,0,5]],[[-0.5,32,-5.01],[1.5,35,-4.01],[19,16],0,1]],Ear2:[[[0,17,-8],[-30,0,-5]],[[-1.5,32,-5.01],[0.5,35,-4.01],[19,16]]],MuleEarL:[[[0,17,-8],[-30,0,15]],[[-3,32,-5.01],[-1,39,-4.01],[0,12],0,1]],MuleEarR:[[[0,17,-8],[-30,0,-15]],[[1,32,-5.01],[3,39,-4.01],[0,12]]],Neck:[[[0,17,-8],[-30,0,0]],[[-2,16,-11],[2,28,-4],[0,35]]],Bag1:[[[-5,21,11],[0,-90,0]],[[-14,13,11],[-6,21,14],[26,21]]],Bag2:[[[5,21,11],[0,90,0]],[[6,13,11],[14,21,14],[26,21],0,1]],Saddle:[[[0,22,2]],[[-5,12,-3.5],[5,21,5.5],[26,0],0.5]],SaddleMouthL:[[[0,17,-8],[-30,0,0]],[[2,29,-14],[3,31,-12],[29,5]]],SaddleMouthR:[[[0,17,-8],[-30,0,0]],[[-3,29,-14],[-2,31,-12],[29,5]]],SaddleMouthLine:[[[0,17,-8]],[[3.1,24,-19.5],[3.1,27,-3.5],[32,2]]],SaddleMouthLineR:[[[0,17,-8]],[[-3.1,24,-19.5],[-3.1,27,-3.5],[32,2]]],Mane:[[[0,17,-8],[-30,0,0]],[[-1,17,-4],[1,33,-2],[56,36]]],HeadSaddle:[[[0,17,-8],[-30,0,0]],[[-2,28,-13],[2,33,-11],[19,0]],[[-3,28,-11],[3,33,-4],[0,0],0.25]]},horse:{Body:[[[0,13,9]],[[-5,11,-10],[5,21,14],[0,34]]],TailA:[[[0,21,14],[65,0,0]],[[-1,20,14],[1,22,17],[44,0]]],TailB:[[[0,21,14],[65,0,0]],[[-1.5,19,17],[1.5,23,24],[38,7]]],TailC:[[[0,21,14],[80.34,0,0]],[[-1.5,21.5,23],[1.5,25.5,30],[24,3]]],Leg1A:[[[4,15,11]],[[1.5,8,8.5],[5.5,17,13.5],[78,29]]],Leg1B:[[[4,8,11]],[[2,3,9.5],[5,8,12.5],[78,43]]],Leg1C:[[[4,8,11]],[[1.5,-0.1,9],[5.5,2.9,13],[78,51]]],Leg2A:[[[-4,15,11]],[[-5.5,8,8.5],[-1.5,17,13.5],[96,29]]],Leg2B:[[[-4,8,11]],[[-5,3,9.5],[-2,8,12.5],[96,43]]],Leg2C:[[[-4,8,11]],[[-5.5,-0.1,9],[-1.5,2.9,13],[96,51]]],Leg3A:[[[4,15,-8]],[[2.1,8,-10.1],[5.1,16,-6.1],[44,29]]],Leg3B:[[[4,8,-8]],[[2.1,3,-9.6],[5.1,8,-6.6],[44,41]]],Leg3C:[[[4,8,-8]],[[1.6,-0.1,-10.1],[5.6,2.9,-6.1],[44,51]]],Leg4A:[[[-4,15,-8]],[[-5.1,8,-10.1],[-2.1,16,-6.1],[60,29]]],Leg4B:[[[-4,8,-8]],[[-5.1,3,-9.6],[-2.1,8,-6.6],[60,41]]],Leg4C:[[[-4,8,-8]],[[-5.6,-0.1,-10.1],[-1.6,2.9,-6.1],[60,51]]],Head:[[[0,20,-10],[-30,0,0]],[[-2.5,25,-11.5],[2.5,30,-4.5],[0,0]]],UMouth:[[[0,20.05,-10],[-30,0,0]],[[-2,27.05,-17],[2,30.05,-11],[24,18]]],LMouth:[[[0,20,-10],[-30,0,0]],[[-2,25,-16.5],[2,27,-11.5],[24,27]]],Ear1:[[[0,20,-10],[-30,0,0]],[[0.45,29,-6],[2.45,32,-5],[0,0]]],Ear2:[[[0,20,-10],[-30,0,0]],[[-2.45,29,-6],[-0.45,32,-5],[0,0]]],MuleEarL:[[[0,20,-10],[-30,0,15]],[[-2,29,-6],[0,36,-5],[0,12]]],MuleEarR:[[[0,20,-10],[-30,0,-15]],[[0,29,-6],[2,36,-5],[0,12]]],Neck:[[[0,20,-10],[-30,0,0]],[[-2.05,15.8,-12],[1.95,29.8,-4],[0,12]]],Bag1:[[[-7.5,21,10],[0,-90,0]],[[-10.5,13,10],[-2.5,21,13],[0,34]]],Bag2:[[[4.5,21,10],[0,90,0]],[[1.5,13,10],[9.5,21,13],[0,47]]],Saddle:[[[0,22,2]],[[-5,21,-1],[5,22,7],[80,0]]],SaddleB:[[[0,22,2]],[[-1.5,22,-1],[1.5,23,1],[106,9]]],SaddleC:[[[0,22,2]],[[-4,22,5],[4,23,7],[80,9]]],SaddleL2:[[[5,21,2]],[[4.5,13,1],[5.5,15,3],[74,0]]],SaddleL:[[[5,21,2]],[[4.5,15,1.5],[5.5,21,2.5],[70,0]]],SaddleR2:[[[-5,21,2]],[[-5.5,13,1],[-4.5,15,3],[74,4]]],SaddleR:[[[-5,21,2]],[[-5.5,15,1.5],[-4.5,21,2.5],[80,0]]],SaddleMouthL:[[[0,20,-10],[-30,0,0]],[[1.5,26,-14],[2.5,28,-12],[74,13]]],SaddleMouthR:[[[0,20,-10],[-30,0,0]],[[-2.5,26,-14],[-1.5,28,-12],[74,13]]],SaddleMouthLine:[[[0,20,-10]],[[2.6,23,-16],[2.6,26,0],[44,10]]],SaddleMouthLineR:[[[0,20,-10]],[[-2.6,23,-16],[-2.6,26,0],[44,5]]],Mane:[[[0,20,-10],[-30,0,0]],[[-1,15.5,-5],[1,31.5,-1],[58,0]]],HeadSaddle:[[[0,20,-10],[-30,0,0]],[[-2.5,25.1,-17],[2.5,30.1,-5],[80,12],0.05]]},humanoid:repeat.humanoid,creeper:{body:[[[0,0,0]],[[-4,6,-2],[4,18,2],[16,16]]],head:[[[0,18,0]],[[-4,18,-4],[4,26,4],[0,0]]],leg0:[[[-2,6,4]],[[-4,0,2],[0,6,6],[0,16]]],leg1:[[[2,6,4]],[[0,0,2],[4,6,6],[0,16]]],leg2:[[[-2,6,-4]],[[-4,0,-6],[0,6,-2],[0,16]]],leg3:[[[2,6,-4]],[[0,0,-6],[4,6,-2],[0,16]]]},'zombie.drowned':{body:repeat.humanoid.body,jacket:[[[0,24,0]],[[-4,12,-2],[4,24,2],[16,32],0.5]],head:[[[0,24,0]],[[-4,24,-4],[4,32,4],[0,0],0.5]],hat:[[[0,24,0]],[[-4,24,-4],[4,32,4],[32,0],1]],rightArm:[[[-5,22,0]],[[-7,12,-2],[-3,24,2],[0,16]]],leftArm:repeat.humanoid.leftArm,rightSleeve:[[[-5,22,0]],[[-7,12,-2],[-3,24,2],[48,48],0.5]],leftSleeve:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,32],0.5,1]],rightLeg:[[[-1.9,12,0]],[[-4.05,0,-2],[-0.05,12,2],[16,48]]],leftLeg:[[[1.9,12,0]],[[0.05,0,-2],[4.05,12,2],[32,48],0,1]],rightPants:[[[-1.9,12,0]],[[-4.25,0,-2],[-0.25,12,2],[0,48],0.25]],leftPants:[[[1.9,12,0]],[[0.25,0,-2],[4.25,12,2],[0,32],0.25,1]]},squid:{body:[[[0,0,0]],[[-6,-8,-6],[6,8,6],[0,0]]],tentacle1:[[[5,-7,0],[0,90,0]],[[4,-25,-1],[6,-7,1],[48,0]]],tentacle2:[[[3.5,-7,3.5],[0,45,0]],[[2.5,-25,2.5],[4.5,-7,4.5],[48,0]]],tentacle3:[[[0,-7,5]],[[-1,-25,4],[1,-7,6],[48,0]]],tentacle4:[[[-3.5,-7,3.5],[0,-45,0]],[[-4.5,-25,2.5],[-2.5,-7,4.5],[48,0]]],tentacle5:[[[-5,-7,0],[0,-90,0]],[[-6,-25,-1],[-4,-7,1],[48,0]]],tentacle6:[[[-3.5,-7,-3.5],[0,-135,0]],[[-4.5,-25,-4.5],[-2.5,-7,-2.5],[48,0]]],tentacle7:[[[0,-7,-5],[0,-180,0]],[[-1,-25,-6],[1,-7,-4],[48,0]]],tentacle8:[[[3.5,-7,-3.5],[0,-225,0]],[[2.5,-25,-4.5],[4.5,-7,-2.5],[48,0]]]},spider:{head:[[[0,9,-3]],[[-4,5,-11],[4,13,-3],[32,4]]],body0:[[[0,9,0]],[[-3,6,-3],[3,12,3],[0,0]]],body1:[[[0,9,9]],[[-5,5,3],[5,13,15],[0,12]]],leg0:[[[-4,9,2]],[[-19,8,1],[-3,10,3],[18,0]]],leg1:[[[4,9,2]],[[3,8,1],[19,10,3],[18,0]]],leg2:[[[-4,9,1]],[[-19,8,0],[-3,10,2],[18,0]]],leg3:[[[4,9,1]],[[3,8,0],[19,10,2],[18,0]]],leg4:[[[-4,9,0]],[[-19,8,-1],[-3,10,1],[18,0]]],leg5:[[[4,9,0]],[[3,8,-1],[19,10,1],[18,0]]],leg6:[[[-4,9,-1]],[[-19,8,-2],[-3,10,0],[18,0]]],leg7:[[[4,9,-1]],[[3,8,-2],[19,10,0],[18,0]]]},cow:{body:[[[0,19,2]],[[-6,11,-5],[6,29,5],[18,4]],[[-2,11,-6],[2,17,-5],[52,0]]],head:[[[0,20,-8]],[[-4,16,-14],[4,24,-8],[0,0]],[[-5,22,-12],[-4,25,-11],[22,0]],[[4,22,-12],[5,25,-11],[22,0]]],leg0:[[[-4,12,7]],[[-6,0,5],[-2,12,9],[0,16]]],leg1:[[[4,12,7]],[[2,0,5],[6,12,9],[0,16]]],leg2:[[[-4,12,-6]],[[-6,0,-7],[-2,12,-3],[0,16]]],leg3:[[[4,12,-6]],[[2,0,-7],[6,12,-3],[0,16]]]},bat:{head:[[[0,24,0]],[[-3,21,-3],[3,27,3],[0,0]]],rightEar:[[[0,24,0]],[[-4,26,-2],[-1,30,-1],[24,0]]],leftEar:[[[0,24,0]],[[1,26,-2],[4,30,-1],[24,0],0,1]],body:[[[0,24,0]],[[-3,8,-3],[3,20,3],[0,16]],[[-5,-8,0],[5,8,1],[0,34]]],rightWing:[[[0,24,0]],[[-12,7,1.5],[-2,23,2.5],[42,0]]],rightWingTip:[[[-12,23,1.5]],[[-20,10,1.5],[-12,22,2.5],[24,16]]],leftWing:[[[0,24,0]],[[2,7,1.5],[12,23,2.5],[42,0],0,1]],leftWingTip:[[[12,23,1.5]],[[12,10,1.5],[20,22,2.5],[24,16],0,1]]},dolphin:{head:[[[0,0,-3]],[[-4,0,-9],[4,7,-3],[0,0]]],body:[[[0,0,-3]],[[-4,0,-3],[4,7,10],[0,13]]],tail:[[[0,2.5,11]],[[-2,0,10],[2,5,21],[0,33]]],tail_fin:[[[0,2.5,20]],[[-5,2,19],[5,3,25],[0,49]]],back_fin:[[[0,7,4]],[[-0.5,7,3],[0.5,12,7],[29,0]]],left_fin:[[[3,1,-1]],[[3,1,-2],[11,2,2],[40,0]]],right_fin:[[[-3,1,-1]],[[-11,1,-2],[-3,2,2],[40,6]]],nose:[[[0,0,-13]],[[-1,0,-13],[1,2,-9],[0,13]]]},irongolem:{body:[[[0,31,0]],[[-9,21,-6],[9,33,5],[0,40]],[[-4.5,16,-3],[4.5,21,3],[0,70],0.5]],head:[[[0,31,-2]],[[-4,33,-7.5],[4,43,0.5],[0,0]],[[-1,32,-9.5],[1,36,-7.5],[24,0]]],arm0:[[[0,31,0]],[[-13,3.5,-3],[-9,33.5,3],[60,21]]],arm1:[[[0,31,0]],[[9,3.5,-3],[13,33.5,3],[60,58]]],leg0:[[[-4,13,0]],[[-7.5,0,-3],[-1.5,16,2],[37,0]]],leg1:[[[5,13,0]],[[1.5,0,-3],[7.5,16,2],[60,0],0,1]]},snowgolem:{head:[[[0,20,0]],[[-4,20,-4],[4,28,4],[0,0],-0.5]],arm1:repeat.snowgolemArm,arm2:repeat.snowgolemArm,piece1:[[[0,11,0]],[[-5,11,-5],[5,21,5],[0,16],-0.5]],piece2:[[[0,0,0]],[[-6,0,-6],[6,12,6],[0,36],-0.5]]},vindicator:{head:repeat.villager.head,nose:repeat.villager.nose,body:repeat.villager.body,arms:repeat.villager.arms,leg0:repeat.villager.leg0,leg1:repeat.zombieVillagerLeftLeg,rightarm:repeat.illager.rightarm,leftarm:repeat.illager.leftarm},wolf:{head:[[[-1,10.5,-7]],[[-4,7.5,-9],[2,13.5,-5],[0,0]],[[-4,13.5,-7],[-2,15.5,-6],[16,14]],[[0,13.5,-7],[2,15.5,-6],[16,14]],[[-2.5,7.52,-12],[0.5,10.52,-8],[0,10]]],body:[[[0,10,2]],[[-4,3,-1],[2,12,5],[18,14]]],upperBody:[[[-1,10,2]],[[-5,7,-1],[3,13,6],[21,0]]],leg0:[[[-2.5,8,7]],[[-3.5,0,6],[-1.5,8,8],[0,18]]],leg1:[[[0.5,8,7]],[[-0.5,0,6],[1.5,8,8],[0,18]]],leg2:[[[-2.5,8,-4]],[[-3.5,0,-5],[-1.5,8,-3],[0,18]]],leg3:[[[0.5,8,-4]],[[-0.5,0,-5],[1.5,8,-3],[0,18]]],tail:[[[-1,12,8]],[[-2,4,7],[0,12,9],[9,18]]]},ocelot:{head:[[[0,9,-9]],[[-2.5,7,-12],[2.5,11,-7],[0,0]],[[-1.5,7.02,-13],[1.5,9.02,-11],[0,24]],[[-2,11,-9],[-1,12,-7],[0,10]],[[1,11,-9],[2,12,-7],[6,10]]],body:[[[0,12,-10]],[[-2,-7,-18],[2,9,-12],[20,0]]],tail1:[[[0,9,8],[-50,0,0]],[[-0.5,1,8],[0.5,9,9],[0,15]]],tail2:[[[0,4,13]],[[-0.5,-4,13],[0.5,4,14],[4,15]]],backLegL:[[[1.1,6,5]],[[0.1,0,6],[2.1,6,8],[8,13]]],backLegR:[[[-1.1,6,5]],[[-2.1,0,6],[-0.1,6,8],[8,13]]],frontLegL:[[[1.2,10.2,-5]],[[0.2,0.2,-5],[2.2,10.2,-3],[40,0]]],frontLegR:[[[-1.2,10.2,-5]],[[-2.2,0.2,-5],[-0.2,10.2,-3],[40,0]]]},trident:{pole:[[[0,24,0]],[[-0.5,-3,-0.5],[0.5,28,0.5],[0,0],0.01],[[-1.5,22,-0.5],[1.5,24,0.5],[4,0]],[[-2.5,23,-0.5],[-1.5,27,0.5],[4,3]]],rDent:[[[0,24,0]],[[1.5,23,-0.5],[2.5,27,0.5],[4,3],0,1]]},guardian:{head:[[[0,24,0]],[[-6,2,-8],[6,14,8],[0,0]],[[-8,2,-6],[-6,14,6],[0,28]],[[6,2,-6],[8,14,6],[0,28],0,1],[[-6,14,-6],[6,16,6],[16,40],0,1],[[-6,0,-6],[6,2,6],[16,40],0,1]],eye:[[[0,24,0]],[[-1,7,0],[1,9,1],[8,0]]],tailpart0:[[[0,24,0]],[[-2,6,7],[2,10,15],[40,0]]],tailpart1:[[[0,24,0]],[[0,7,0],[3,10,7],[0,54]]],tailpart2:[[[0,24,0]],[[0,8,0],[2,10,6],[41,32]],[[1,4.5,3],[2,13.5,12],[25,19]]],spikepart0:repeat.guardianSpike,spikepart1:repeat.guardianSpike,spikepart2:repeat.guardianSpike,spikepart3:repeat.guardianSpike,spikepart4:repeat.guardianSpike,spikepart5:repeat.guardianSpike,spikepart6:repeat.guardianSpike,spikepart7:repeat.guardianSpike,spikepart8:repeat.guardianSpike,spikepart9:repeat.guardianSpike,spikepart10:repeat.guardianSpike,spikepart11:repeat.guardianSpike},polarbear:{head:[[[0,14,-16]],[[-3.5,10,-19],[3.5,17,-12],[0,0]],[[-2.5,10,-22],[2.5,13,-19],[0,44]],[[-4.5,16,-17],[-2.5,18,-16],[26,0]],[[2.5,16,-17],[4.5,18,-16],[26,0]]],body:[[[-2,15,12]],[[-7,14,5],[7,28,16],[0,19]],[[-6,28,5],[6,40,15],[39,0]]],leg0:[[[-4.5,10,6]],[[-6.5,0,4],[-2.5,10,12],[50,22]]],leg1:[[[4.5,10,6]],[[2.5,0,4],[6.5,10,12],[50,22]]],leg2:[[[-3.5,10,-8]],[[-5.5,0,-10],[-1.5,10,-4],[50,40]]],leg3:[[[3.5,10,-8]],[[1.5,0,-10],[5.5,10,-4],[50,40]]]},villager:repeat.villager,witherBoss:{upperBodyPart1:[[[0,24,0]],[[-10,17.1,-0.5],[10,20.1,2.5],[0,16]]],upperBodyPart2:[[[-2,17.1,-0.5]],[[-2,7.1,-0.5],[1,17.1,2.5],[0,22]],[[-6,13.6,0],[5,15.6,2],[24,22]],[[-6,11.1,0],[5,13.1,2],[24,22]],[[-6,8.6,0],[5,10.6,2],[24,22]]],upperBodyPart3:[[[0,24,0]],[[0,18,0],[3,24,3],[12,22]]],head1:[[[0,20,0]],[[-4,20,-4],[4,28,4],[0,0]]],head2:[[[-9,18,-1]],[[-12,18,-4],[-6,24,2],[32,0]]],head3:[[[9,18,-1]],[[6,18,-4],[12,24,2],[32,0]]]},armor_stand:{head:[[[0,24,0]],[[-1,24,-1],[1,31,1],[0,0]]],body:[[[0,24,0]],[[-6,21,-1.5],[6,24,1.5],[0,26]],[[-3,14,-1],[-1,21,1],[16,0]],[[1,14,-1],[3,21,1],[48,16]],[[-4,12,-1],[4,14,1],[0,48]]],rightArm:[[[-5,22,0]],[[-7,12,-1],[-5,24,1],[24,0]]],leftArm:[[[5,22,0]],[[5,12,-1],[7,24,1],[32,16],0,1]],rightLeg:[[[-1.9,12,0]],[[-2.9,1,-1],[-0.9,12,1],[8,0]]],leftLeg:[[[1.9,12,0]],[[0.9,1,-1],[2.9,12,1],[40,16],0,1]],basePlate:[[[0,0,0]],[[-6,0,-6],[6,1,6],[0,32]]]},parrot:{head:[[[0,8.3,-2.8]],[[-1,6.8,-3.8],[1,9.8,-1.8],[2,2]]],head2:[[[0,26,-1]],[[-1,25.5,-3],[1,26.5,1],[10,0]]],beak1:[[[0,24.5,-1.5]],[[-0.5,23.5,-2],[0.5,25.5,-1],[11,7]]],beak2:[[[0,25.8,-2.5]],[[-0.5,23.8,-3],[0.5,25.5,-2],[16,7]]],body:[[[0,7.5,-3]],[[-1.5,1.5,-4.5],[1.5,7.5,-1.5],[2,8]]],tail:[[[0,2.9,1.2]],[[-1.5,-0.1,0.2],[1.5,3.9,1.2],[22,1]]],wing0:[[[1.5,7.1,-2.8]],[[1,2.1,-4.3],[2,7.1,-1.3],[19,8]]],wing1:[[[-1.5,7.1,-2.8]],[[-2,2.1,-4.3],[-1,7.1,-1.3],[19,8]]],feather:[[[0,26.1,0.2]],[[0,25.1,-1.9],[0,30.1,2.1],[2,18]]],leg0:[[[1,2,-1]],[[0.5,0,-0.5],[1.5,2,0.5],[14,18]]],leg1:[[[-1,2,-1]],[[-1.5,0,-0.5],[-0.5,2,0.5],[14,18]]]},bed:{bed:[[[0,24,0]],[[0,0,0],[16,32,6],[0,0]],[[3,31,6],[13,32,9],[38,2]],[[3,0,6],[13,1,9],[38,38]],[[15,3,6],[16,29,9],[52,6]],[[0,3,6],[1,29,9],[44,6]]],leg1:[[[5,22,0]],[[13,29,6],[16,32,9],[12,38]]],leg0:[[[-5,22,0]],[[0,29,6],[3,32,9],[0,38]]],leg3:[[[2,12,0]],[[13,0,6],[16,3,9],[12,44]]],leg2:[[[-2,12,0]],[[0,0,6],[3,3,9],[0,44]]]},player_head:{head:repeat.humanoid.head},dragon_head:{head:[[[0,24,0]],[[-8,16,-10],[8,32,6],[112,30]],[[-5,32,-4],[-3,36,2],[0,0]],[[3,32,-4],[5,36,2],[0,0],0,1]],snout:[[[0,24,0]],[[-6,20,-24],[6,25,-8],[176,44]],[[-5,25,-22],[-3,27,-18],[112,0]],[[3,25,-22],[5,27,-18],[112,0],0,1]],jaw:repeat.dragon.jaw},cod:{body:[[[0,0,0]],[[-1,0,1],[1,4,8],[0,0]],[[0.0,4.0,0],[0,5,6],[20,-6]],[[-0.0,-1,3.0],[0,0,5],[24,-2]]],head:[[[0,2,0]],[[-1.0,1.0,-3],[1,4,-2],[0,0]],[[-1,0,-2],[1,4,1],[11,0]]],leftFin:[[[1,1,0],[0,0,35]],[[1,0,0],[3,1,2],[24,4]]],rightFin:[[[-1,1,0],[0,0,-35]],[[-3,0,0],[-1,1,2],[24,1]]],tailfin:[[[0,0,8]],[[0,0,8],[0,4,14],[20,1]]]},'pufferfish.small':{body:[[[0,0,0]],[[-1.5,0,-1.5],[1.5,2,1.5],[0,27]],[[0.5,2,-1.5],[1.5,3,-0.5],[24,6]],[[-1.5,2,-1.5],[-0.5,3,-0.5],[28,6]]],tailfin:[[[0,0,0]],[[-1.5,1,1.5],[1.5,1,4.5],[-3,0]]],leftFin:[[[4,7,3]],[[1.5,0,-1.49],[2.5,1,0.51],[25,0]]],rightFin:[[[-4,7,1]],[[-2.5,0,-1.49],[-1.5,1,0.51],[25,0]]]},'pufferfish.mid':{body:[[[0,0,0]],[[-2.5,1,-2.5],[2.5,6,2.5],[12,22]]],leftFin:[[[4,7,3]],[[2.5,5,-1.49],[4.5,6,0.51],[24,3]]],rightFin:[[[-4,7,1]],[[-4,6,1],[-2,7,3],[24,0]]],spines_top_front:[[[-2.5,6,-2.5],[45,0,0]],[[-2.5,6,-2.5],[1.5,7,-1.5],[18,16]]],spines_top_back:[[[-2.5,6,2.5],[-45,0,0]],[[-1.5,6,1.5],[2.5,7,2.5],[10,16]]],spines_bottom_front:[[[-2.5,0,-2.5],[-45,0,0]],[[-2.5,0.5,-2.5],[2.5,1.5,-1.5],[17,19]]],spines_bottom_back:[[[0,1,2.5],[-45,0,0]],[[-2.5,0,2.5],[2.5,1,3.5],[17,20]]],spines_left_front:[[[2.5,0,-2.5],[0,45,0]],[[2.5,1,-2.5],[3.5,6,-1.5],[4,16]]],spines_left_back:[[[2.5,0,2.5],[0,-45,0]],[[2.5,1,2.5],[3.5,6,3.5],[4,16]]],spines_right_front:[[[-2.5,0,-2.5],[0,-45,0]],[[-3.5,1,-2.5],[-2.5,6,-1.5],[4,16]]],spines_right_back:[[[-2.5,0,2.5],[0,45,0]],[[-3.5,1,2.5],[-2.5,6,3.5],[8,16]]]},'pufferfish.large':{body:[[[0,0,0]],[[-4,0,-4],[4,8,4],[0,0]]],leftFin:[[[4,7,3]],[[4,6,-2.99],[6,7,-0.99],[24,3]]],rightFin:[[[-4,7,1]],[[-6.0,6,-2.99],[-4,7,-0.99],[24,0]]],spines_top_front:[[[-4,8,-4],[45,0,0]],[[-4,8,-4],[4,9,-3],[14,16]]],spines_top_mid:[[[0,8,0]],[[-4,8,0],[4,9,1],[14,16]]],spines_top_back:[[[0,8,4],[-45,0,0]],[[-4,8,4],[4,9,5],[14,16]]],spines_bottom_front:[[[0,0,-4],[-45,0,0]],[[-4,-1,-4],[4,0,-3],[14,19]]],spines_bottom_mid:[[[0,-1,0]],[[-4,-1,0],[4,0,1],[14,19]]],spines_bottom_back:[[[0,0,4],[-45,0,0]],[[-4,-1,4],[4,0,5],[14,20]]],spines_left_front:[[[4,0,-4],[0,45,0]],[[4,0,-4],[5,8,-3],[0,16]]],spines_left_mid:[[[4,0,0]],[[4,0,0],[5,8,1],[4,16]]],spines_left_back:[[[4,0,4],[0,-45,0]],[[4,0,4],[5,8,5],[8,16]]],spines_right_front:[[[-4,0,-4],[0,-45,0]],[[-5,0,-4],[-4,8,-3],[4,16]]],spines_right_mid:[[[-4,0,0]],[[-5,0,0],[-4,8,1],[8,16]]],spines_right_back:[[[-4,0,4],[0,45,0]],[[-5,0,4],[-4,8,5],[8,16]]]},salmon:{body_front:[[[0,0,-4]],[[-1.5,3.5,-4],[1.5,8.5,4],[0,0]]],body_back:[[[0,0,4]],[[-1.5,3.5,4],[1.5,8.5,12],[0,13]]],dorsal_front:[[[0,5,2]],[[0,8.5,2],[0,10.5,4],[4,2]]],dorsal_back:[[[0,5,4]],[[0,8.5,4],[0,10.5,7],[2,3]]],tailfin:[[[0,0,12]],[[0,3.5,12],[0,8.5,18],[20,10]]],head:[[[0,3,-4]],[[-1,4.5,-7],[1,8.5,-4],[22,0]]],leftFin:[[[1.5,1,-4],[0,0,35]],[[-0.51,3.87,-4],[1.49,3.87,-2],[2,0]]],rightFin:[[[-1.5,1,-4],[0,0,-35]],[[-1.49,3.87,-4],[0.51,3.87,-2],[-2,0]]]},tropicalfish_a:{body:[[[-0.5,0,0]],[[-1,0,-3],[1,3,3],[0,0]],[[0,3,-3.0],[0,7,3],[10,-6]]],tailfin:[[[0,0,3]],[[0,0,3],[0,3,7],[24,-4]]],leftFin:[[[0.5,0,1],[0,-35,0]],[[0.34,0,-0.11],[2.34,2,-0.11],[2,12]]],rightFin:[[[-0.5,0,1],[0,35,0]],[[-2.34,0,-0.11],[-0.34,2,-0.11],[2,16]]]},tropicalfish_b:{body:[[[-0.5,0,0]],[[-1,0,-0.0],[1,6,6],[0,20]],[[0,-5,-0.0],[0,0,6],[20,21]],[[0,6,-0.0],[0,11,6],[20,10]]],tailfin:[[[0,0,6]],[[0,0.0,6],[0,6,11],[21,16]]],leftFin:[[[0.5,0,1],[0,-35,0]],[[2.06,0,2.35],[4.06,2,2.35],[2,12]]],rightFin:[[[-0.5,0,1],[0,35,0]],[[-4.06,0,2.35],[-2.06,2,2.35],[2,16]]]},'creeper.charged':{body:[[[0,0,0]],[[-4,6,-2],[4,18,2],[16,16],2]],head:[[[0,18,0]],[[-4,18,-4],[4,26,4],[0,0],2]],leg0:[[[-2,6,4]],[[-4,0,2],[0,6,6],[0,16],2]],leg1:[[[2,6,4]],[[0,0,2],[4,6,6],[0,16],2]],leg2:[[[-2,6,-4]],[[-4,0,-6],[0,6,-2],[0,16],2]],leg3:[[[2,6,-4]],[[0,0,-6],[4,6,-2],[0,16],2]]},enderman:{body:[[[0,38,0]],[[-4,26,-2],[4,38,2],[32,16]]],head:repeat.humanoid.head,hat:[[[0,38,0]],[[-4,38,-4],[4,46,4],[0,16],-0.5]],rightArm:[[[-3,36,0]],[[-4,8,-1],[-2,38,1],[56,0]]],leftArm:[[[5,36,0]],[[4,8,-1],[6,38,1],[56,0],0,1]],rightLeg:[[[-2,26,0]],[[-3,-4,-1],[-1,26,1],[56,0]]],leftLeg:[[[2,26,0]],[[1,-4,-1],[3,26,1],[56,0],0,1]]},'sheep.sheared':{body:[[[0,19,2]],[[-4,13,-5],[4,29,1],[28,8]]],head:[[[0,18,-8]],[[-3,16,-14],[3,22,-6],[0,0]]],leg0:[[[-3,12,7]],[[-5,0,5],[-1,12,9],[0,16]]],leg1:[[[3,12,7]],[[1,0,5],[5,12,9],[0,16]]],leg2:[[[-3,12,-5]],[[-5,0,-7],[-1,12,-3],[0,16]]],leg3:[[[3,12,-5]],[[1,0,-7],[5,12,-3],[0,16]]]},pig:{body:[[[0,13,2]],[[-5,7,-5],[5,23,3],[28,8]]],head:[[[0,12,-6]],[[-4,8,-14],[4,16,-6],[0,0]],[[-2,9,-15],[2,12,-14],[16,16]]],leg0:[[[-3,6,7]],[[-5,0,5],[-1,6,9],[0,16]]],leg1:[[[3,6,7]],[[1,0,5],[5,6,9],[0,16]]],leg2:[[[-3,6,-5]],[[-5,0,-7],[-1,6,-3],[0,16]]],leg3:[[[3,6,-5]],[[1,0,-7],[5,6,-3],[0,16]]]},'zombie.villager':{body:repeat.villager.body,head:[[[0,24,0]],[[-4,24,-4],[4,34,4],[0,0]],[[-1,23,-6],[1,27,-4],[24,0],0.25]],rightArm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[44,38]]],leftArm:[[[5,22,0]],[[4,12,-2],[8,24,2],[44,38],0,1]],rightLeg:repeat.villager.leg0,leftLeg:repeat.zombieVillagerLeftLeg},evoker:{head:repeat.villager.head,nose:repeat.villager.nose,body:repeat.villager.body,arms:repeat.villager.arms,leg0:repeat.villager.leg0,leg1:repeat.zombieVillagerLeftLeg,rightarm:repeat.illager.rightarm,leftarm:repeat.illager.leftarm},vex:{body:repeat.humanoid.body,head:repeat.humanoid.head,rightarm:repeat.humanoid.rightArm,leftarm:repeat.humanoid.leftArm,leg0:[[[-1.9,12,0]],[[-3.9,0,-2],[0.1,12,2],[0,16]],[[-2.9,3,-2],[3.1,13,2],[32,0]]],leftwing:[[[0,24,0]],[[0,12,0],[20,24,1],[0,32],0,1]],rightwing:[[[0,24,0]],[[-20,12,0],[0,24,1],[0,32]]]},'villager.witch':{head:repeat.villager.head,nose:[[[0,26,0]],[[0,25,-6.75],[1,26,-5.75],[0,0],-0.25],[[-1,23,-6],[1,27,-4],[24,0]]],body:repeat.villager.body,arms:repeat.villager.arms,leg0:repeat.villager.leg0,leg1:repeat.zombieVillagerLeftLeg,hat:[[[-5,32.03,-5]],[[-5,32.05,-5],[5,34.05,5],[0,64]]],hat2:[[[1.75,32,2],[-3,0,1.5]],[[-3.25,33.5,-3],[3.75,37.5,4],[0,76]]],hat3:[[[1.75,35,2],[-6,0,3]],[[-1.5,36.5,-1],[2.5,40.5,3],[0,87]]],hat4:[[[1.75,38,2],[-12,0,6]],[[0.25,40,1],[1.25,42,2],[0,95],0.25]]},'witherBoss.armor':{upperBodyPart1:[[[0,24,0]],[[-10,17.1,-0.5],[10,20.1,2.5],[0,16],2]],upperBodyPart2:[[[-2,17.1,-0.5]],[[-2,7.1,-0.5],[1,17.1,2.5],[0,22],2],[[-6,13.6,0],[5,15.6,2],[24,22],2],[[-6,11.1,0],[5,13.1,2],[24,22],2],[[-6,8.6,0],[5,10.6,2],[24,22],2]],upperBodyPart3:[[[0,24,0]],[[0,18,0],[3,24,3],[12,22],2]],head1:[[[0,20,0]],[[-4,20,-4],[4,28,4],[0,0],2]],head2:[[[-9,18,-1]],[[-12,18,-4],[-6,24,2],[32,0],2]],head3:[[[9,18,-1]],[[6,18,-4],[12,24,2],[32,0],2]]},skeleton:{body:repeat.humanoid.body,head:repeat.humanoid.head,rightArm:[[[-5,22,0]],[[-6,12,-1],[-4,24,1],[40,16]]],leftArm:[[[5,22,0]],[[4,12,-1],[6,24,1],[40,16],0,1]],rightLeg:[[[-2,12,0]],[[-3,0,-1],[-1,12,1],[0,16]]],leftLeg:[[[2,12,0]],[[1,0,-1],[3,12,1],[0,16],0,1]]},'stray.armor':{body:[[[0,24,0]],[[-4,12,-2],[4,24,2],[16,16],0.25]],head:[[[0,24,0]],[[-4,24,-4],[4,32,4],[0,0],0.25]],rightArm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[40,16],0.25]],leftArm:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,16],0.25,1]],rightLeg:[[[-1.9,12,0]],[[-3.9,0,-2],[0.1,12,2],[0,16],0.25]],leftLeg:[[[1.9,12,0]],[[-0.1,0,-2],[3.9,12,2],[0,16],0.25,1]]},sheep:{body:[[[0,19,2]],[[-4,13,-5],[4,29,1],[28,40],1.75]],head:[[[0,18,-8]],[[-3,16,-12],[3,22,-6],[0,32],0.6]],leg0:[[[-3,12,7]],[[-5,6,5],[-1,12,9],[0,48],0.5]],leg1:[[[3,12,7]],[[1,6,5],[5,12,9],[0,48],0.5]],leg2:[[[-3,12,-5]],[[-5,6,-7],[-1,12,-3],[0,48],0.5]],leg3:[[[3,12,-5]],[[1,6,-7],[5,12,-3],[0,48],0.5]]},boat:{bottom:[[[0,18,0],[-90,0,0]],[[-14,10,0],[14,26,3],[0,0]]],front:[[[-15,24,0],[0,-90,0]],[[-23,21,-1],[-7,27,1],[0,27]]],back:[[[15,24,0],[0,90,0]],[[6,21,-1],[24,27,1],[0,19]]],right:[[[0,24,-9],[0,180,0]],[[-14,21,-10],[14,27,-8],[0,35]]],left:[[[0,24,9]],[[-14,21,8],[14,27,10],[0,43]]],paddle_left:[[[2.5,28,9]],[[1.5,27,3.5],[3.5,29,21.5],[62,0]],[[1.51,26,17.5],[2.51,32,24.5],[62,0]]],paddle_right:[[[2.5,28,-9]],[[1.5,27,-14.5],[3.5,29,3.5],[62,20]],[[2.49,26,-0.5],[3.49,32,6.5],[62,20]]]},minecart:{bottom:[[[0,20,0],[-90,0,0]],[[-10,12,-1],[10,28,1],[0,10]]],front:[[[9,25,0],[0,90,0]],[[1,21,-1],[17,29,1],[0,0]]],back:[[[-9,25,0],[0,-90,0]],[[-17,21,-1],[-1,29,1],[0,0]]],right:[[[0,25,-7],[0,180,0]],[[-8,21,-8],[8,29,-6],[0,0]]],left:[[[0,25,7]],[[-8,21,6],[8,29,8],[0,0]]]},endermite:{bodyPart_0:[[[0,0,-3.5]],[[-2,0,-4.5],[2,3,-2.5],[0,0]]],bodyPart_1:[[[0,0,0]],[[-3,0,-2.5],[3,4,2.5],[0,5]]],bodyPart_2:[[[0,0,3]],[[-1.5,0,2.5],[1.5,3,3.5],[0,14]]],bodyPart_3:[[[0,0,4]],[[-0.5,0,3.5],[0.5,2,4.5],[0,18]]]}} //Copies humanoid bones so the hat isn't added to 'humanoid' as well entity_bones.pigzombie = Object.assign({},repeat.humanoid) //Adds in zombie pigmans hat layer //Everything else is the same as 'humanoid' entity_bones.pigzombie.hat = [[[0,24,0]],[[-4,24,-4],[4,32,4],[32,0],0.5]] /***********************************\ | DIALOG WINDOW | \***********************************/ //Dropdown selection used in the dialog window var bedrock_entity_list = `Select an entity: ` //Dialog window var bedrock_entity_selector = new Dialog({title:'Entity Selector', id:'entity_selector', lines:[bedrock_entity_list + '

    Create entity model

    ', '

    Add default entity parent

    ', '
    ']}) //Runs when 'confirm' is clicked on the dialog window bedrock_entity_selector.onConfirm = function() { //Gets the entity from the dropdown list selected in the dialog window entity = $('#bedrock_entity_list')[0].value //Changes the project texture size to the default texture size of the chosen entity changeTextureSizes(entity) //Passes whether 'Create entity model' is checked to the function createBones(entity, $('#mob_model')[0].checked) //Changes the project name to the correct value for the entity selected Project.geometry_name = getEntityName(entity, $('#mob_parent')[0].checked) //Sets the file name to the default mobs.json, if there isn't a file name if (Project.name == '') Project.name = 'mobs.json' Canvas.updateAll() //Hides the dialog window bedrock_entity_selector.hide() } /***********************************\ | MENU ENTRY | \***********************************/ //Adds an entry to the plugin menu Blockbench.addMenuEntry('Bedrock Entity Generator', 'pets', function() { bedrock_entity_selector.show() }) /***********************************\ | UNINSTALL PLUGIN | \***********************************/ onUninstall = function() { //Removes the menu entry Blockbench.removeMenuEntry('Bedrock Entity Generator') } ================================================ FILE: plugins/gltf_importer/LICENSE.MD ================================================ ## License for glTF Importer MIT License 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. -------------------------------------------------------------------------------- ## Third-Party License for GLTFLoader.js Three.js glTF Model Loader https://github.com/mrdoob/three.js Copyright © 2010-2021 three.js authors 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. -------------------------------------------------------------------------------- ## Trademark Notice for glTF glTF and the glTF logo are trademarks of the Khronos Group Inc. ================================================ FILE: plugins/gltf_importer/about.md ================================================ Adds the options to import a glTF (.GLTF or .GLB) model as a generic model. Currently only imports meshes, textures and groups. Armatures and animations are not supported as of this version. -------------------------------------------------------------------------------- *This plugin is not affiliated with, endorsed by, or officially certified by the Khronos Group.* *glTF and the glTF logo are trademarks of the Khronos Group Inc.* ================================================ FILE: plugins/gltf_importer/gltf_importer.js ================================================ (() => { var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // plugin/GLTFLoader.js var GLTFLoader_exports = {}; var init_GLTFLoader = __esm({ "plugin/GLTFLoader.js"() { (function() { class GLTFLoader extends THREE.Loader { constructor(manager) { super(manager); this.dracoLoader = null; this.ktx2Loader = null; this.meshoptDecoder = null; this.pluginCallbacks = []; this.register(function(parser) { return new GLTFMaterialsClearcoatExtension(parser); }); this.register(function(parser) { return new GLTFTextureBasisUExtension(parser); }); this.register(function(parser) { return new GLTFTextureWebPExtension(parser); }); this.register(function(parser) { return new GLTFMaterialsTransmissionExtension(parser); }); this.register(function(parser) { return new GLTFMaterialsVolumeExtension(parser); }); this.register(function(parser) { return new GLTFMaterialsIorExtension(parser); }); this.register(function(parser) { return new GLTFMaterialsSpecularExtension(parser); }); this.register(function(parser) { return new GLTFLightsExtension(parser); }); this.register(function(parser) { return new GLTFMeshoptCompression(parser); }); } load(url, onLoad, onProgress, onError) { const scope = this; let resourcePath; if (this.resourcePath !== "") { resourcePath = this.resourcePath; } else if (this.path !== "") { resourcePath = this.path; } else { resourcePath = THREE.LoaderUtils.extractUrlBase(url); } this.manager.itemStart(url); const _onError = function(e) { if (onError) { onError(e); } else { console.error(e); } scope.manager.itemError(url); scope.manager.itemEnd(url); }; const loader = new THREE.FileLoader(this.manager); loader.setPath(this.path); loader.setResponseType("arraybuffer"); loader.setRequestHeader(this.requestHeader); loader.setWithCredentials(this.withCredentials); loader.load(url, function(data) { try { scope.parse(data, resourcePath, function(gltf) { onLoad(gltf); scope.manager.itemEnd(url); }, _onError); } catch (e) { _onError(e); } }, onProgress, _onError); } setDRACOLoader(dracoLoader) { this.dracoLoader = dracoLoader; return this; } setDDSLoader() { throw new Error('THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".'); } setKTX2Loader(ktx2Loader) { this.ktx2Loader = ktx2Loader; return this; } setMeshoptDecoder(meshoptDecoder) { this.meshoptDecoder = meshoptDecoder; return this; } register(callback) { if (this.pluginCallbacks.indexOf(callback) === -1) { this.pluginCallbacks.push(callback); } return this; } unregister(callback) { if (this.pluginCallbacks.indexOf(callback) !== -1) { this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(callback), 1); } return this; } parse(data, path, onLoad, onError) { let content; const extensions = {}; const plugins = {}; if (typeof data === "string") { content = data; } else { const magic = THREE.LoaderUtils.decodeText(new Uint8Array(data, 0, 4)); if (magic === BINARY_EXTENSION_HEADER_MAGIC) { try { extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data); } catch (error) { if (onError) onError(error); return; } content = extensions[EXTENSIONS.KHR_BINARY_GLTF].content; } else { content = THREE.LoaderUtils.decodeText(new Uint8Array(data)); } } const json = JSON.parse(content); if (json.asset === void 0 || json.asset.version[0] < 2) { if (onError) onError(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")); return; } const parser = new GLTFParser(json, { path: path || this.resourcePath || "", crossOrigin: this.crossOrigin, requestHeader: this.requestHeader, manager: this.manager, ktx2Loader: this.ktx2Loader, meshoptDecoder: this.meshoptDecoder }); parser.fileLoader.setRequestHeader(this.requestHeader); for (let i = 0; i < this.pluginCallbacks.length; i++) { const plugin = this.pluginCallbacks[i](parser); plugins[plugin.name] = plugin; extensions[plugin.name] = true; } if (json.extensionsUsed) { for (let i = 0; i < json.extensionsUsed.length; ++i) { const extensionName = json.extensionsUsed[i]; const extensionsRequired = json.extensionsRequired || []; switch (extensionName) { case EXTENSIONS.KHR_MATERIALS_UNLIT: extensions[extensionName] = new GLTFMaterialsUnlitExtension(); break; case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: extensions[extensionName] = new GLTFMaterialsPbrSpecularGlossinessExtension(); break; case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: extensions[extensionName] = new GLTFDracoMeshCompressionExtension(json, this.dracoLoader); break; case EXTENSIONS.KHR_TEXTURE_TRANSFORM: extensions[extensionName] = new GLTFTextureTransformExtension(); break; case EXTENSIONS.KHR_MESH_QUANTIZATION: extensions[extensionName] = new GLTFMeshQuantizationExtension(); break; default: if (extensionsRequired.indexOf(extensionName) >= 0 && plugins[extensionName] === void 0) { console.warn('THREE.GLTFLoader: Unknown extension "' + extensionName + '".'); } } } } parser.setExtensions(extensions); parser.setPlugins(plugins); parser.parse(onLoad, onError); } } function GLTFRegistry() { let objects = {}; return { get: function(key) { return objects[key]; }, add: function(key, object) { objects[key] = object; }, remove: function(key) { delete objects[key]; }, removeAll: function() { objects = {}; } }; } const EXTENSIONS = { KHR_BINARY_GLTF: "KHR_binary_glTF", KHR_DRACO_MESH_COMPRESSION: "KHR_draco_mesh_compression", KHR_LIGHTS_PUNCTUAL: "KHR_lights_punctual", KHR_MATERIALS_CLEARCOAT: "KHR_materials_clearcoat", KHR_MATERIALS_IOR: "KHR_materials_ior", KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: "KHR_materials_pbrSpecularGlossiness", KHR_MATERIALS_SPECULAR: "KHR_materials_specular", KHR_MATERIALS_TRANSMISSION: "KHR_materials_transmission", KHR_MATERIALS_UNLIT: "KHR_materials_unlit", KHR_MATERIALS_VOLUME: "KHR_materials_volume", KHR_TEXTURE_BASISU: "KHR_texture_basisu", KHR_TEXTURE_TRANSFORM: "KHR_texture_transform", KHR_MESH_QUANTIZATION: "KHR_mesh_quantization", EXT_TEXTURE_WEBP: "EXT_texture_webp", EXT_MESHOPT_COMPRESSION: "EXT_meshopt_compression" }; class GLTFLightsExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; this.cache = { refs: {}, uses: {} }; } _markDefs() { const parser = this.parser; const nodeDefs = this.parser.json.nodes || []; for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { const nodeDef = nodeDefs[nodeIndex]; if (nodeDef.extensions && nodeDef.extensions[this.name] && nodeDef.extensions[this.name].light !== void 0) { parser._addNodeRef(this.cache, nodeDef.extensions[this.name].light); } } } _loadLight(lightIndex) { const parser = this.parser; const cacheKey = "light:" + lightIndex; let dependency = parser.cache.get(cacheKey); if (dependency) return dependency; const json = parser.json; const extensions = json.extensions && json.extensions[this.name] || {}; const lightDefs = extensions.lights || []; const lightDef = lightDefs[lightIndex]; let lightNode; const color = new THREE.Color(16777215); if (lightDef.color !== void 0) color.fromArray(lightDef.color); const range = lightDef.range !== void 0 ? lightDef.range : 0; switch (lightDef.type) { case "directional": lightNode = new THREE.DirectionalLight(color); lightNode.target.position.set(0, 0, -1); lightNode.add(lightNode.target); break; case "point": lightNode = new THREE.PointLight(color); lightNode.distance = range; break; case "spot": lightNode = new THREE.SpotLight(color); lightNode.distance = range; lightDef.spot = lightDef.spot || {}; lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== void 0 ? lightDef.spot.innerConeAngle : 0; lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== void 0 ? lightDef.spot.outerConeAngle : Math.PI / 4; lightNode.angle = lightDef.spot.outerConeAngle; lightNode.penumbra = 1 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; lightNode.target.position.set(0, 0, -1); lightNode.add(lightNode.target); break; default: throw new Error("THREE.GLTFLoader: Unexpected light type: " + lightDef.type); } lightNode.position.set(0, 0, 0); lightNode.decay = 2; if (lightDef.intensity !== void 0) lightNode.intensity = lightDef.intensity; lightNode.name = parser.createUniqueName(lightDef.name || "light_" + lightIndex); dependency = Promise.resolve(lightNode); parser.cache.add(cacheKey, dependency); return dependency; } createNodeAttachment(nodeIndex) { const self2 = this; const parser = this.parser; const json = parser.json; const nodeDef = json.nodes[nodeIndex]; const lightDef = nodeDef.extensions && nodeDef.extensions[this.name] || {}; const lightIndex = lightDef.light; if (lightIndex === void 0) return null; return this._loadLight(lightIndex).then(function(light) { return parser._getNodeRef(self2.cache, lightIndex, light); }); } } class GLTFMaterialsUnlitExtension { constructor() { this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; } getMaterialType() { return THREE.MeshBasicMaterial; } extendParams(materialParams, materialDef, parser) { const pending = []; materialParams.color = new THREE.Color(1, 1, 1); materialParams.opacity = 1; const metallicRoughness = materialDef.pbrMetallicRoughness; if (metallicRoughness) { if (Array.isArray(metallicRoughness.baseColorFactor)) { const array = metallicRoughness.baseColorFactor; materialParams.color.fromArray(array); materialParams.opacity = array[3]; } if (metallicRoughness.baseColorTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture)); } } return Promise.all(pending); } } class GLTFMaterialsClearcoatExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; } getMaterialType(materialIndex) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams(materialIndex, materialParams) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[this.name]; if (extension.clearcoatFactor !== void 0) { materialParams.clearcoat = extension.clearcoatFactor; } if (extension.clearcoatTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "clearcoatMap", extension.clearcoatTexture)); } if (extension.clearcoatRoughnessFactor !== void 0) { materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; } if (extension.clearcoatRoughnessTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "clearcoatRoughnessMap", extension.clearcoatRoughnessTexture)); } if (extension.clearcoatNormalTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "clearcoatNormalMap", extension.clearcoatNormalTexture)); if (extension.clearcoatNormalTexture.scale !== void 0) { const scale = extension.clearcoatNormalTexture.scale; materialParams.clearcoatNormalScale = new THREE.Vector2(scale, -scale); } } return Promise.all(pending); } } class GLTFMaterialsTransmissionExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; } getMaterialType(materialIndex) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams(materialIndex, materialParams) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[this.name]; if (extension.transmissionFactor !== void 0) { materialParams.transmission = extension.transmissionFactor; } if (extension.transmissionTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "transmissionMap", extension.transmissionTexture)); } return Promise.all(pending); } } class GLTFMaterialsVolumeExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; } getMaterialType(materialIndex) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams(materialIndex, materialParams) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[this.name]; materialParams.thickness = extension.thicknessFactor !== void 0 ? extension.thicknessFactor : 0; if (extension.thicknessTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "thicknessMap", extension.thicknessTexture)); } materialParams.attenuationDistance = extension.attenuationDistance || 0; const colorArray = extension.attenuationColor || [1, 1, 1]; materialParams.attenuationTint = new THREE.Color(colorArray[0], colorArray[1], colorArray[2]); return Promise.all(pending); } } class GLTFMaterialsIorExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_IOR; } getMaterialType(materialIndex) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams(materialIndex, materialParams) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) { return Promise.resolve(); } const extension = materialDef.extensions[this.name]; materialParams.ior = extension.ior !== void 0 ? extension.ior : 1.5; return Promise.resolve(); } } class GLTFMaterialsSpecularExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; } getMaterialType(materialIndex) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams(materialIndex, materialParams) { const parser = this.parser; const materialDef = parser.json.materials[materialIndex]; if (!materialDef.extensions || !materialDef.extensions[this.name]) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[this.name]; materialParams.specularIntensity = extension.specularFactor !== void 0 ? extension.specularFactor : 1; if (extension.specularTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "specularIntensityMap", extension.specularTexture)); } const colorArray = extension.specularColorFactor || [1, 1, 1]; materialParams.specularTint = new THREE.Color(colorArray[0], colorArray[1], colorArray[2]); if (extension.specularColorTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "specularTintMap", extension.specularColorTexture).then(function(texture) { texture.encoding = THREE.sRGBEncoding; })); } return Promise.all(pending); } } class GLTFTextureBasisUExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.KHR_TEXTURE_BASISU; } loadTexture(textureIndex) { const parser = this.parser; const json = parser.json; const textureDef = json.textures[textureIndex]; if (!textureDef.extensions || !textureDef.extensions[this.name]) { return null; } const extension = textureDef.extensions[this.name]; const source = json.images[extension.source]; const loader = parser.options.ktx2Loader; if (!loader) { if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) { throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures"); } else { return null; } } return parser.loadTextureImage(textureIndex, source, loader); } } class GLTFTextureWebPExtension { constructor(parser) { this.parser = parser; this.name = EXTENSIONS.EXT_TEXTURE_WEBP; this.isSupported = null; } loadTexture(textureIndex) { const name = this.name; const parser = this.parser; const json = parser.json; const textureDef = json.textures[textureIndex]; if (!textureDef.extensions || !textureDef.extensions[name]) { return null; } const extension = textureDef.extensions[name]; const source = json.images[extension.source]; let loader = parser.textureLoader; if (source.uri) { const handler = parser.options.manager.getHandler(source.uri); if (handler !== null) loader = handler; } return this.detectSupport().then(function(isSupported) { if (isSupported) return parser.loadTextureImage(textureIndex, source, loader); if (json.extensionsRequired && json.extensionsRequired.indexOf(name) >= 0) { throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported."); } return parser.loadTexture(textureIndex); }); } detectSupport() { if (!this.isSupported) { this.isSupported = new Promise(function(resolve) { const image = new Image(); image.src = "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"; image.onload = image.onerror = function() { resolve(image.height === 1); }; }); } return this.isSupported; } } class GLTFMeshoptCompression { constructor(parser) { this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; this.parser = parser; } loadBufferView(index) { const json = this.parser.json; const bufferView = json.bufferViews[index]; if (bufferView.extensions && bufferView.extensions[this.name]) { const extensionDef = bufferView.extensions[this.name]; const buffer = this.parser.getDependency("buffer", extensionDef.buffer); const decoder = this.parser.options.meshoptDecoder; if (!decoder || !decoder.supported) { if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) { throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files"); } else { return null; } } return Promise.all([buffer, decoder.ready]).then(function(res) { const byteOffset = extensionDef.byteOffset || 0; const byteLength = extensionDef.byteLength || 0; const count = extensionDef.count; const stride = extensionDef.byteStride; const result = new ArrayBuffer(count * stride); const source = new Uint8Array(res[0], byteOffset, byteLength); decoder.decodeGltfBuffer(new Uint8Array(result), count, stride, source, extensionDef.mode, extensionDef.filter); return result; }); } else { return null; } } } const BINARY_EXTENSION_HEADER_MAGIC = "glTF"; const BINARY_EXTENSION_HEADER_LENGTH = 12; const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 1313821514, BIN: 5130562 }; class GLTFBinaryExtension { constructor(data) { this.name = EXTENSIONS.KHR_BINARY_GLTF; this.content = null; this.body = null; const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH); this.header = { magic: THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))), version: headerView.getUint32(4, true), length: headerView.getUint32(8, true) }; if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) { throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header."); } else if (this.header.version < 2) { throw new Error("THREE.GLTFLoader: Legacy binary file detected."); } const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; const chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH); let chunkIndex = 0; while (chunkIndex < chunkContentsLength) { const chunkLength = chunkView.getUint32(chunkIndex, true); chunkIndex += 4; const chunkType = chunkView.getUint32(chunkIndex, true); chunkIndex += 4; if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) { const contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength); this.content = THREE.LoaderUtils.decodeText(contentArray); } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) { const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; this.body = data.slice(byteOffset, byteOffset + chunkLength); } chunkIndex += chunkLength; } if (this.content === null) { throw new Error("THREE.GLTFLoader: JSON content not found."); } } } class GLTFDracoMeshCompressionExtension { constructor(json, dracoLoader) { if (!dracoLoader) { throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided."); } this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; this.json = json; this.dracoLoader = dracoLoader; this.dracoLoader.preload(); } decodePrimitive(primitive, parser) { const json = this.json; const dracoLoader = this.dracoLoader; const bufferViewIndex = primitive.extensions[this.name].bufferView; const gltfAttributeMap = primitive.extensions[this.name].attributes; const threeAttributeMap = {}; const attributeNormalizedMap = {}; const attributeTypeMap = {}; for (const attributeName in gltfAttributeMap) { const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase(); threeAttributeMap[threeAttributeName] = gltfAttributeMap[attributeName]; } for (const attributeName in primitive.attributes) { const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase(); if (gltfAttributeMap[attributeName] !== void 0) { const accessorDef = json.accessors[primitive.attributes[attributeName]]; const componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; attributeTypeMap[threeAttributeName] = componentType; attributeNormalizedMap[threeAttributeName] = accessorDef.normalized === true; } } return parser.getDependency("bufferView", bufferViewIndex).then(function(bufferView) { return new Promise(function(resolve) { dracoLoader.decodeDracoFile(bufferView, function(geometry) { for (const attributeName in geometry.attributes) { const attribute = geometry.attributes[attributeName]; const normalized = attributeNormalizedMap[attributeName]; if (normalized !== void 0) attribute.normalized = normalized; } resolve(geometry); }, threeAttributeMap, attributeTypeMap); }); }); } } class GLTFTextureTransformExtension { constructor() { this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; } extendTexture(texture, transform) { if (transform.texCoord !== void 0) { console.warn('THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.'); } if (transform.offset === void 0 && transform.rotation === void 0 && transform.scale === void 0) { return texture; } texture = texture.clone(); if (transform.offset !== void 0) { texture.offset.fromArray(transform.offset); } if (transform.rotation !== void 0) { texture.rotation = transform.rotation; } if (transform.scale !== void 0) { texture.repeat.fromArray(transform.scale); } texture.needsUpdate = true; return texture; } } class GLTFMeshStandardSGMaterial extends THREE.MeshStandardMaterial { constructor(params) { super(); this.isGLTFSpecularGlossinessMaterial = true; const specularMapParsFragmentChunk = ["#ifdef USE_SPECULARMAP", " uniform sampler2D specularMap;", "#endif"].join("\n"); const glossinessMapParsFragmentChunk = ["#ifdef USE_GLOSSINESSMAP", " uniform sampler2D glossinessMap;", "#endif"].join("\n"); const specularMapFragmentChunk = ["vec3 specularFactor = specular;", "#ifdef USE_SPECULARMAP", " vec4 texelSpecular = texture2D( specularMap, vUv );", " texelSpecular = sRGBToLinear( texelSpecular );", " // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture", " specularFactor *= texelSpecular.rgb;", "#endif"].join("\n"); const glossinessMapFragmentChunk = ["float glossinessFactor = glossiness;", "#ifdef USE_GLOSSINESSMAP", " vec4 texelGlossiness = texture2D( glossinessMap, vUv );", " // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture", " glossinessFactor *= texelGlossiness.a;", "#endif"].join("\n"); const lightPhysicalFragmentChunk = ["PhysicalMaterial material;", "material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );", "vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );", "float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );", "material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.", "material.roughness += geometryRoughness;", "material.roughness = min( material.roughness, 1.0 );", "material.specularColor = specularFactor;"].join("\n"); const uniforms = { specular: { value: new THREE.Color().setHex(16777215) }, glossiness: { value: 1 }, specularMap: { value: null }, glossinessMap: { value: null } }; this._extraUniforms = uniforms; this.onBeforeCompile = function(shader) { for (const uniformName in uniforms) { shader.uniforms[uniformName] = uniforms[uniformName]; } shader.fragmentShader = shader.fragmentShader.replace("uniform float roughness;", "uniform vec3 specular;").replace("uniform float metalness;", "uniform float glossiness;").replace("#include ", specularMapParsFragmentChunk).replace("#include ", glossinessMapParsFragmentChunk).replace("#include ", specularMapFragmentChunk).replace("#include ", glossinessMapFragmentChunk).replace("#include ", lightPhysicalFragmentChunk); }; Object.defineProperties(this, { specular: { get: function() { return uniforms.specular.value; }, set: function(v) { uniforms.specular.value = v; } }, specularMap: { get: function() { return uniforms.specularMap.value; }, set: function(v) { uniforms.specularMap.value = v; if (v) { this.defines.USE_SPECULARMAP = ""; } else { delete this.defines.USE_SPECULARMAP; } } }, glossiness: { get: function() { return uniforms.glossiness.value; }, set: function(v) { uniforms.glossiness.value = v; } }, glossinessMap: { get: function() { return uniforms.glossinessMap.value; }, set: function(v) { uniforms.glossinessMap.value = v; if (v) { this.defines.USE_GLOSSINESSMAP = ""; this.defines.USE_UV = ""; } else { delete this.defines.USE_GLOSSINESSMAP; delete this.defines.USE_UV; } } } }); delete this.metalness; delete this.roughness; delete this.metalnessMap; delete this.roughnessMap; this.setValues(params); } copy(source) { super.copy(source); this.specularMap = source.specularMap; this.specular.copy(source.specular); this.glossinessMap = source.glossinessMap; this.glossiness = source.glossiness; delete this.metalness; delete this.roughness; delete this.metalnessMap; delete this.roughnessMap; return this; } } class GLTFMaterialsPbrSpecularGlossinessExtension { constructor() { this.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS; this.specularGlossinessParams = ["color", "map", "lightMap", "lightMapIntensity", "aoMap", "aoMapIntensity", "emissive", "emissiveIntensity", "emissiveMap", "bumpMap", "bumpScale", "normalMap", "normalMapType", "displacementMap", "displacementScale", "displacementBias", "specularMap", "specular", "glossinessMap", "glossiness", "alphaMap", "envMap", "envMapIntensity", "refractionRatio"]; } getMaterialType() { return GLTFMeshStandardSGMaterial; } extendParams(materialParams, materialDef, parser) { const pbrSpecularGlossiness = materialDef.extensions[this.name]; materialParams.color = new THREE.Color(1, 1, 1); materialParams.opacity = 1; const pending = []; if (Array.isArray(pbrSpecularGlossiness.diffuseFactor)) { const array = pbrSpecularGlossiness.diffuseFactor; materialParams.color.fromArray(array); materialParams.opacity = array[3]; } if (pbrSpecularGlossiness.diffuseTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "map", pbrSpecularGlossiness.diffuseTexture)); } materialParams.emissive = new THREE.Color(0, 0, 0); materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== void 0 ? pbrSpecularGlossiness.glossinessFactor : 1; materialParams.specular = new THREE.Color(1, 1, 1); if (Array.isArray(pbrSpecularGlossiness.specularFactor)) { materialParams.specular.fromArray(pbrSpecularGlossiness.specularFactor); } if (pbrSpecularGlossiness.specularGlossinessTexture !== void 0) { const specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; pending.push(parser.assignTexture(materialParams, "glossinessMap", specGlossMapDef)); pending.push(parser.assignTexture(materialParams, "specularMap", specGlossMapDef)); } return Promise.all(pending); } createMaterial(materialParams) { const material = new GLTFMeshStandardSGMaterial(materialParams); material.fog = true; material.color = materialParams.color; material.map = materialParams.map === void 0 ? null : materialParams.map; material.lightMap = null; material.lightMapIntensity = 1; material.aoMap = materialParams.aoMap === void 0 ? null : materialParams.aoMap; material.aoMapIntensity = 1; material.emissive = materialParams.emissive; material.emissiveIntensity = 1; material.emissiveMap = materialParams.emissiveMap === void 0 ? null : materialParams.emissiveMap; material.bumpMap = materialParams.bumpMap === void 0 ? null : materialParams.bumpMap; material.bumpScale = 1; material.normalMap = materialParams.normalMap === void 0 ? null : materialParams.normalMap; material.normalMapType = THREE.TangentSpaceNormalMap; if (materialParams.normalScale) material.normalScale = materialParams.normalScale; material.displacementMap = null; material.displacementScale = 1; material.displacementBias = 0; material.specularMap = materialParams.specularMap === void 0 ? null : materialParams.specularMap; material.specular = materialParams.specular; material.glossinessMap = materialParams.glossinessMap === void 0 ? null : materialParams.glossinessMap; material.glossiness = materialParams.glossiness; material.alphaMap = null; material.envMap = materialParams.envMap === void 0 ? null : materialParams.envMap; material.envMapIntensity = 1; material.refractionRatio = 0.98; return material; } } class GLTFMeshQuantizationExtension { constructor() { this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; } } class GLTFCubicSplineInterpolant extends THREE.Interpolant { constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { super(parameterPositions, sampleValues, sampleSize, resultBuffer); } copySampleValue_(index) { const result = this.resultBuffer, values = this.sampleValues, valueSize = this.valueSize, offset = index * valueSize * 3 + valueSize; for (let i = 0; i !== valueSize; i++) { result[i] = values[offset + i]; } return result; } } GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; GLTFCubicSplineInterpolant.prototype.interpolate_ = function(i1, t0, t, t1) { const result = this.resultBuffer; const values = this.sampleValues; const stride = this.valueSize; const stride2 = stride * 2; const stride3 = stride * 3; const td = t1 - t0; const p = (t - t0) / td; const pp = p * p; const ppp = pp * p; const offset1 = i1 * stride3; const offset0 = offset1 - stride3; const s2 = -2 * ppp + 3 * pp; const s3 = ppp - pp; const s0 = 1 - s2; const s1 = s3 - pp + p; for (let i = 0; i !== stride; i++) { const p0 = values[offset0 + i + stride]; const m0 = values[offset0 + i + stride2] * td; const p1 = values[offset1 + i + stride]; const m1 = values[offset1 + i] * td; result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; } return result; }; const _q = new THREE.Quaternion(); class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { interpolate_(i1, t0, t, t1) { const result = super.interpolate_(i1, t0, t, t1); _q.fromArray(result).normalize().toArray(result); return result; } } const WEBGL_CONSTANTS = { FLOAT: 5126, //FLOAT_MAT2: 35674, FLOAT_MAT3: 35675, FLOAT_MAT4: 35676, FLOAT_VEC2: 35664, FLOAT_VEC3: 35665, FLOAT_VEC4: 35666, LINEAR: 9729, REPEAT: 10497, SAMPLER_2D: 35678, POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6, UNSIGNED_BYTE: 5121, UNSIGNED_SHORT: 5123 }; const WEBGL_COMPONENT_TYPES = { 5120: Int8Array, 5121: Uint8Array, 5122: Int16Array, 5123: Uint16Array, 5125: Uint32Array, 5126: Float32Array }; const WEBGL_FILTERS = { 9728: THREE.NearestFilter, 9729: THREE.LinearFilter, 9984: THREE.NearestMipmapNearestFilter, 9985: THREE.LinearMipmapNearestFilter, 9986: THREE.NearestMipmapLinearFilter, 9987: THREE.LinearMipmapLinearFilter }; const WEBGL_WRAPPINGS = { 33071: THREE.ClampToEdgeWrapping, 33648: THREE.MirroredRepeatWrapping, 10497: THREE.RepeatWrapping }; const WEBGL_TYPE_SIZES = { "SCALAR": 1, "VEC2": 2, "VEC3": 3, "VEC4": 4, "MAT2": 4, "MAT3": 9, "MAT4": 16 }; const ATTRIBUTES = { POSITION: "position", NORMAL: "normal", TANGENT: "tangent", TEXCOORD_0: "uv", TEXCOORD_1: "uv2", COLOR_0: "color", WEIGHTS_0: "skinWeight", JOINTS_0: "skinIndex" }; const PATH_PROPERTIES = { scale: "scale", translation: "position", rotation: "quaternion", weights: "morphTargetInfluences" }; const INTERPOLATION = { CUBICSPLINE: void 0, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each // keyframe track will be initialized with a default interpolation type, then modified. LINEAR: THREE.InterpolateLinear, STEP: THREE.InterpolateDiscrete }; const ALPHA_MODES = { OPAQUE: "OPAQUE", MASK: "MASK", BLEND: "BLEND" }; function resolveURL(url, path) { if (typeof url !== "string" || url === "") return ""; if (/^https?:\/\//i.test(path) && /^\//.test(url)) { path = path.replace(/(^https?:\/\/[^\/]+).*/i, "$1"); } if (/^(https?:)?\/\//i.test(url)) return url; if (/^data:.*,.*$/i.test(url)) return url; if (/^blob:.*$/i.test(url)) return url; return path + url; } function createDefaultMaterial(cache) { if (cache["DefaultMaterial"] === void 0) { cache["DefaultMaterial"] = new THREE.MeshStandardMaterial({ color: 16777215, emissive: 0, metalness: 1, roughness: 1, transparent: false, depthTest: true, side: THREE.FrontSide }); } return cache["DefaultMaterial"]; } function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) { for (const name in objectDef.extensions) { if (knownExtensions[name] === void 0) { object.userData.gltfExtensions = object.userData.gltfExtensions || {}; object.userData.gltfExtensions[name] = objectDef.extensions[name]; } } } function assignExtrasToUserData(object, gltfDef) { if (gltfDef.extras !== void 0) { if (typeof gltfDef.extras === "object") { Object.assign(object.userData, gltfDef.extras); } else { console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, " + gltfDef.extras); } } } function addMorphTargets(geometry, targets, parser) { let hasMorphPosition = false; let hasMorphNormal = false; for (let i = 0, il = targets.length; i < il; i++) { const target = targets[i]; if (target.POSITION !== void 0) hasMorphPosition = true; if (target.NORMAL !== void 0) hasMorphNormal = true; if (hasMorphPosition && hasMorphNormal) break; } if (!hasMorphPosition && !hasMorphNormal) return Promise.resolve(geometry); const pendingPositionAccessors = []; const pendingNormalAccessors = []; for (let i = 0, il = targets.length; i < il; i++) { const target = targets[i]; if (hasMorphPosition) { const pendingAccessor = target.POSITION !== void 0 ? parser.getDependency("accessor", target.POSITION) : geometry.attributes.position; pendingPositionAccessors.push(pendingAccessor); } if (hasMorphNormal) { const pendingAccessor = target.NORMAL !== void 0 ? parser.getDependency("accessor", target.NORMAL) : geometry.attributes.normal; pendingNormalAccessors.push(pendingAccessor); } } return Promise.all([Promise.all(pendingPositionAccessors), Promise.all(pendingNormalAccessors)]).then(function(accessors) { const morphPositions = accessors[0]; const morphNormals = accessors[1]; if (hasMorphPosition) geometry.morphAttributes.position = morphPositions; if (hasMorphNormal) geometry.morphAttributes.normal = morphNormals; geometry.morphTargetsRelative = true; return geometry; }); } function updateMorphTargets(mesh, meshDef) { mesh.updateMorphTargets(); if (meshDef.weights !== void 0) { for (let i = 0, il = meshDef.weights.length; i < il; i++) { mesh.morphTargetInfluences[i] = meshDef.weights[i]; } } if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) { const targetNames = meshDef.extras.targetNames; if (mesh.morphTargetInfluences.length === targetNames.length) { mesh.morphTargetDictionary = {}; for (let i = 0, il = targetNames.length; i < il; i++) { mesh.morphTargetDictionary[targetNames[i]] = i; } } else { console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names."); } } } function createPrimitiveKey(primitiveDef) { const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]; let geometryKey; if (dracoExtension) { geometryKey = "draco:" + dracoExtension.bufferView + ":" + dracoExtension.indices + ":" + createAttributesKey(dracoExtension.attributes); } else { geometryKey = primitiveDef.indices + ":" + createAttributesKey(primitiveDef.attributes) + ":" + primitiveDef.mode; } return geometryKey; } function createAttributesKey(attributes) { let attributesKey = ""; const keys = Object.keys(attributes).sort(); for (let i = 0, il = keys.length; i < il; i++) { attributesKey += keys[i] + ":" + attributes[keys[i]] + ";"; } return attributesKey; } function getNormalizedComponentScale(constructor) { switch (constructor) { case Int8Array: return 1 / 127; case Uint8Array: return 1 / 255; case Int16Array: return 1 / 32767; case Uint16Array: return 1 / 65535; default: throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type."); } } class GLTFParser { constructor(json = {}, options = {}) { this.json = json; this.extensions = {}; this.plugins = {}; this.options = options; this.cache = new GLTFRegistry(); this.associations = /* @__PURE__ */ new Map(); this.primitiveCache = {}; this.meshCache = { refs: {}, uses: {} }; this.cameraCache = { refs: {}, uses: {} }; this.lightCache = { refs: {}, uses: {} }; this.textureCache = {}; this.nodeNamesUsed = {}; if (typeof createImageBitmap !== "undefined" && /Firefox/.test(navigator.userAgent) === false) { this.textureLoader = new THREE.ImageBitmapLoader(this.options.manager); } else { this.textureLoader = new THREE.TextureLoader(this.options.manager); } this.textureLoader.setCrossOrigin(this.options.crossOrigin); this.textureLoader.setRequestHeader(this.options.requestHeader); this.fileLoader = new THREE.FileLoader(this.options.manager); this.fileLoader.setResponseType("arraybuffer"); if (this.options.crossOrigin === "use-credentials") { this.fileLoader.setWithCredentials(true); } } setExtensions(extensions) { this.extensions = extensions; } setPlugins(plugins) { this.plugins = plugins; } parse(onLoad, onError) { const parser = this; const json = this.json; const extensions = this.extensions; this.cache.removeAll(); this._invokeAll(function(ext) { return ext._markDefs && ext._markDefs(); }); Promise.all(this._invokeAll(function(ext) { return ext.beforeRoot && ext.beforeRoot(); })).then(function() { return Promise.all([parser.getDependencies("scene"), parser.getDependencies("animation"), parser.getDependencies("camera")]); }).then(function(dependencies) { const result = { scene: dependencies[0][json.scene || 0], scenes: dependencies[0], animations: dependencies[1], cameras: dependencies[2], asset: json.asset, parser, userData: {} }; addUnknownExtensionsToUserData(extensions, result, json); assignExtrasToUserData(result, json); Promise.all(parser._invokeAll(function(ext) { return ext.afterRoot && ext.afterRoot(result); })).then(function() { onLoad(result); }); }).catch(onError); } /** * Marks the special nodes/meshes in json for efficient parse. */ _markDefs() { const nodeDefs = this.json.nodes || []; const skinDefs = this.json.skins || []; const meshDefs = this.json.meshes || []; for (let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) { const joints = skinDefs[skinIndex].joints; for (let i = 0, il = joints.length; i < il; i++) { nodeDefs[joints[i]].isBone = true; } } for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { const nodeDef = nodeDefs[nodeIndex]; if (nodeDef.mesh !== void 0) { this._addNodeRef(this.meshCache, nodeDef.mesh); if (nodeDef.skin !== void 0) { meshDefs[nodeDef.mesh].isSkinnedMesh = true; } } if (nodeDef.camera !== void 0) { this._addNodeRef(this.cameraCache, nodeDef.camera); } } } /** * Counts references to shared node / THREE.Object3D resources. These resources * can be reused, or "instantiated", at multiple nodes in the scene * hierarchy. THREE.Mesh, Camera, and Light instances are instantiated and must * be marked. Non-scenegraph resources (like Materials, Geometries, and * Textures) can be reused directly and are not marked here. * * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. */ _addNodeRef(cache, index) { if (index === void 0) return; if (cache.refs[index] === void 0) { cache.refs[index] = cache.uses[index] = 0; } cache.refs[index]++; } /** Returns a reference to a shared resource, cloning it if necessary. */ _getNodeRef(cache, index, object) { if (cache.refs[index] <= 1) return object; const ref = object.clone(); ref.name += "_instance_" + cache.uses[index]++; return ref; } _invokeOne(func) { const extensions = Object.values(this.plugins); extensions.push(this); for (let i = 0; i < extensions.length; i++) { const result = func(extensions[i]); if (result) return result; } return null; } _invokeAll(func) { const extensions = Object.values(this.plugins); extensions.unshift(this); const pending = []; for (let i = 0; i < extensions.length; i++) { const result = func(extensions[i]); if (result) pending.push(result); } return pending; } /** * Requests the specified dependency asynchronously, with caching. * @param {string} type * @param {number} index * @return {Promise} */ getDependency(type, index) { const cacheKey = type + ":" + index; let dependency = this.cache.get(cacheKey); if (!dependency) { switch (type) { case "scene": dependency = this.loadScene(index); break; case "node": dependency = this.loadNode(index); break; case "mesh": dependency = this._invokeOne(function(ext) { return ext.loadMesh && ext.loadMesh(index); }); break; case "accessor": dependency = this.loadAccessor(index); break; case "bufferView": dependency = this._invokeOne(function(ext) { return ext.loadBufferView && ext.loadBufferView(index); }); break; case "buffer": dependency = this.loadBuffer(index); break; case "material": dependency = this._invokeOne(function(ext) { return ext.loadMaterial && ext.loadMaterial(index); }); break; case "texture": dependency = this._invokeOne(function(ext) { return ext.loadTexture && ext.loadTexture(index); }); break; case "skin": dependency = this.loadSkin(index); break; case "animation": dependency = this.loadAnimation(index); break; case "camera": dependency = this.loadCamera(index); break; default: throw new Error("Unknown type: " + type); } this.cache.add(cacheKey, dependency); } return dependency; } /** * Requests all dependencies of the specified type asynchronously, with caching. * @param {string} type * @return {Promise>} */ getDependencies(type) { let dependencies = this.cache.get(type); if (!dependencies) { const parser = this; const defs = this.json[type + (type === "mesh" ? "es" : "s")] || []; dependencies = Promise.all(defs.map(function(def, index) { return parser.getDependency(type, index); })); this.cache.add(type, dependencies); } return dependencies; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views * @param {number} bufferIndex * @return {Promise} */ loadBuffer(bufferIndex) { const bufferDef = this.json.buffers[bufferIndex]; const loader = this.fileLoader; if (bufferDef.type && bufferDef.type !== "arraybuffer") { throw new Error("THREE.GLTFLoader: " + bufferDef.type + " buffer type is not supported."); } if (bufferDef.uri === void 0 && bufferIndex === 0) { return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body); } const options = this.options; return new Promise(function(resolve, reject) { loader.load(resolveURL(bufferDef.uri, options.path), resolve, void 0, function() { reject(new Error('THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".')); }); }); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views * @param {number} bufferViewIndex * @return {Promise} */ loadBufferView(bufferViewIndex) { const bufferViewDef = this.json.bufferViews[bufferViewIndex]; return this.getDependency("buffer", bufferViewDef.buffer).then(function(buffer) { const byteLength = bufferViewDef.byteLength || 0; const byteOffset = bufferViewDef.byteOffset || 0; return buffer.slice(byteOffset, byteOffset + byteLength); }); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors * @param {number} accessorIndex * @return {Promise} */ loadAccessor(accessorIndex) { const parser = this; const json = this.json; const accessorDef = this.json.accessors[accessorIndex]; if (accessorDef.bufferView === void 0 && accessorDef.sparse === void 0) { return Promise.resolve(null); } const pendingBufferViews = []; if (accessorDef.bufferView !== void 0) { pendingBufferViews.push(this.getDependency("bufferView", accessorDef.bufferView)); } else { pendingBufferViews.push(null); } if (accessorDef.sparse !== void 0) { pendingBufferViews.push(this.getDependency("bufferView", accessorDef.sparse.indices.bufferView)); pendingBufferViews.push(this.getDependency("bufferView", accessorDef.sparse.values.bufferView)); } return Promise.all(pendingBufferViews).then(function(bufferViews) { const bufferView = bufferViews[0]; const itemSize = WEBGL_TYPE_SIZES[accessorDef.type]; const TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; const elementBytes = TypedArray.BYTES_PER_ELEMENT; const itemBytes = elementBytes * itemSize; const byteOffset = accessorDef.byteOffset || 0; const byteStride = accessorDef.bufferView !== void 0 ? json.bufferViews[accessorDef.bufferView].byteStride : void 0; const normalized = accessorDef.normalized === true; let array, bufferAttribute; if (byteStride && byteStride !== itemBytes) { const ibSlice = Math.floor(byteOffset / byteStride); const ibCacheKey = "InterleavedBuffer:" + accessorDef.bufferView + ":" + accessorDef.componentType + ":" + ibSlice + ":" + accessorDef.count; let ib = parser.cache.get(ibCacheKey); if (!ib) { array = new TypedArray(bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes); ib = new THREE.InterleavedBuffer(array, byteStride / elementBytes); parser.cache.add(ibCacheKey, ib); } bufferAttribute = new THREE.InterleavedBufferAttribute(ib, itemSize, byteOffset % byteStride / elementBytes, normalized); } else { if (bufferView === null) { array = new TypedArray(accessorDef.count * itemSize); } else { array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize); } bufferAttribute = new THREE.BufferAttribute(array, itemSize, normalized); } if (accessorDef.sparse !== void 0) { const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; const TypedArrayIndices = WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType]; const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; const sparseIndices = new TypedArrayIndices(bufferViews[1], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices); const sparseValues = new TypedArray(bufferViews[2], byteOffsetValues, accessorDef.sparse.count * itemSize); if (bufferView !== null) { bufferAttribute = new THREE.BufferAttribute(bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized); } for (let i = 0, il = sparseIndices.length; i < il; i++) { const index = sparseIndices[i]; bufferAttribute.setX(index, sparseValues[i * itemSize]); if (itemSize >= 2) bufferAttribute.setY(index, sparseValues[i * itemSize + 1]); if (itemSize >= 3) bufferAttribute.setZ(index, sparseValues[i * itemSize + 2]); if (itemSize >= 4) bufferAttribute.setW(index, sparseValues[i * itemSize + 3]); if (itemSize >= 5) throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse THREE.BufferAttribute."); } } return bufferAttribute; }); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures * @param {number} textureIndex * @return {Promise} */ loadTexture(textureIndex) { const json = this.json; const options = this.options; const textureDef = json.textures[textureIndex]; const source = json.images[textureDef.source]; let loader = this.textureLoader; if (source.uri) { const handler = options.manager.getHandler(source.uri); if (handler !== null) loader = handler; } return this.loadTextureImage(textureIndex, source, loader); } loadTextureImage(textureIndex, source, loader) { const parser = this; const json = this.json; const options = this.options; const textureDef = json.textures[textureIndex]; const cacheKey = (source.uri || source.bufferView) + ":" + textureDef.sampler; if (this.textureCache[cacheKey]) { return this.textureCache[cacheKey]; } const URL = self.URL || self.webkitURL; let sourceURI = source.uri || ""; let isObjectURL = false; let hasAlpha = true; const isJPEG = sourceURI.search(/\.jpe?g($|\?)/i) > 0 || sourceURI.search(/^data\:image\/jpeg/) === 0; if (source.mimeType === "image/jpeg" || isJPEG) hasAlpha = false; if (source.bufferView !== void 0) { sourceURI = parser.getDependency("bufferView", source.bufferView).then(function(bufferView) { if (source.mimeType === "image/png") { const colorType = new DataView(bufferView, 25, 1).getUint8(0, false); hasAlpha = colorType === 6 || colorType === 4 || colorType === 3; } isObjectURL = true; const blob = new Blob([bufferView], { type: source.mimeType }); sourceURI = URL.createObjectURL(blob); return sourceURI; }); } else if (source.uri === void 0) { throw new Error("THREE.GLTFLoader: Image " + textureIndex + " is missing URI and bufferView"); } const promise = Promise.resolve(sourceURI).then(function(sourceURI2) { return new Promise(function(resolve, reject) { let onLoad = resolve; if (loader.isImageBitmapLoader === true) { onLoad = function(imageBitmap) { const texture = new THREE.Texture(imageBitmap); texture.needsUpdate = true; resolve(texture); }; } loader.load(resolveURL(sourceURI2, options.path), onLoad, void 0, reject); }); }).then(function(texture) { if (isObjectURL === true) { URL.revokeObjectURL(sourceURI); } texture.flipY = false; if (textureDef.name) texture.name = textureDef.name; if (!hasAlpha) texture.format = THREE.RGBFormat; const samplers = json.samplers || {}; const sampler = samplers[textureDef.sampler] || {}; texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || THREE.LinearFilter; texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || THREE.LinearMipmapLinearFilter; texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || THREE.RepeatWrapping; texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || THREE.RepeatWrapping; parser.associations.set(texture, { type: "textures", index: textureIndex }); return texture; }).catch(function() { console.error("THREE.GLTFLoader: Couldn't load texture", sourceURI); return null; }); this.textureCache[cacheKey] = promise; return promise; } /** * Asynchronously assigns a texture to the given material parameters. * @param {Object} materialParams * @param {string} mapName * @param {Object} mapDef * @return {Promise} */ assignTexture(materialParams, mapName, mapDef) { const parser = this; return this.getDependency("texture", mapDef.index).then(function(texture) { if (mapDef.texCoord !== void 0 && mapDef.texCoord != 0 && !(mapName === "aoMap" && mapDef.texCoord == 1)) { console.warn("THREE.GLTFLoader: Custom UV set " + mapDef.texCoord + " for texture " + mapName + " not yet supported."); } if (parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]) { const transform = mapDef.extensions !== void 0 ? mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] : void 0; if (transform) { const gltfReference = parser.associations.get(texture); texture = parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(texture, transform); parser.associations.set(texture, gltfReference); } } materialParams[mapName] = texture; return texture; }); } /** * Assigns final material to a THREE.Mesh, THREE.Line, or THREE.Points instance. The instance * already has a material (generated from the glTF material options alone) * but reuse of the same glTF material may require multiple threejs materials * to accommodate different primitive types, defines, etc. New materials will * be created if necessary, and reused from a cache. * @param {Object3D} mesh THREE.Mesh, THREE.Line, or THREE.Points instance. */ assignFinalMaterial(mesh) { const geometry = mesh.geometry; let material = mesh.material; const useVertexTangents = geometry.attributes.tangent !== void 0; const useVertexColors = geometry.attributes.color !== void 0; const useFlatShading = geometry.attributes.normal === void 0; if (mesh.isPoints) { const cacheKey = "PointsMaterial:" + material.uuid; let pointsMaterial = this.cache.get(cacheKey); if (!pointsMaterial) { pointsMaterial = new THREE.PointsMaterial(); THREE.Material.prototype.copy.call(pointsMaterial, material); pointsMaterial.color.copy(material.color); pointsMaterial.map = material.map; pointsMaterial.sizeAttenuation = false; this.cache.add(cacheKey, pointsMaterial); } material = pointsMaterial; } else if (mesh.isLine) { const cacheKey = "LineBasicMaterial:" + material.uuid; let lineMaterial = this.cache.get(cacheKey); if (!lineMaterial) { lineMaterial = new THREE.LineBasicMaterial(); THREE.Material.prototype.copy.call(lineMaterial, material); lineMaterial.color.copy(material.color); this.cache.add(cacheKey, lineMaterial); } material = lineMaterial; } if (useVertexTangents || useVertexColors || useFlatShading) { let cacheKey = "ClonedMaterial:" + material.uuid + ":"; if (material.isGLTFSpecularGlossinessMaterial) cacheKey += "specular-glossiness:"; if (useVertexTangents) cacheKey += "vertex-tangents:"; if (useVertexColors) cacheKey += "vertex-colors:"; if (useFlatShading) cacheKey += "flat-shading:"; let cachedMaterial = this.cache.get(cacheKey); if (!cachedMaterial) { cachedMaterial = material.clone(); if (useVertexColors) cachedMaterial.vertexColors = true; if (useFlatShading) cachedMaterial.flatShading = true; if (useVertexTangents) { if (cachedMaterial.normalScale) cachedMaterial.normalScale.y *= -1; if (cachedMaterial.clearcoatNormalScale) cachedMaterial.clearcoatNormalScale.y *= -1; } this.cache.add(cacheKey, cachedMaterial); this.associations.set(cachedMaterial, this.associations.get(material)); } material = cachedMaterial; } if (material.aoMap && geometry.attributes.uv2 === void 0 && geometry.attributes.uv !== void 0) { geometry.setAttribute("uv2", geometry.attributes.uv); } mesh.material = material; } getMaterialType() { return THREE.MeshStandardMaterial; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials * @param {number} materialIndex * @return {Promise} */ loadMaterial(materialIndex) { const parser = this; const json = this.json; const extensions = this.extensions; const materialDef = json.materials[materialIndex]; let materialType; const materialParams = {}; const materialExtensions = materialDef.extensions || {}; const pending = []; if (materialExtensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]) { const sgExtension = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]; materialType = sgExtension.getMaterialType(); pending.push(sgExtension.extendParams(materialParams, materialDef, parser)); } else if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) { const kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT]; materialType = kmuExtension.getMaterialType(); pending.push(kmuExtension.extendParams(materialParams, materialDef, parser)); } else { const metallicRoughness = materialDef.pbrMetallicRoughness || {}; materialParams.color = new THREE.Color(1, 1, 1); materialParams.opacity = 1; if (Array.isArray(metallicRoughness.baseColorFactor)) { const array = metallicRoughness.baseColorFactor; materialParams.color.fromArray(array); materialParams.opacity = array[3]; } if (metallicRoughness.baseColorTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture)); } materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1; materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1; if (metallicRoughness.metallicRoughnessTexture !== void 0) { pending.push(parser.assignTexture(materialParams, "metalnessMap", metallicRoughness.metallicRoughnessTexture)); pending.push(parser.assignTexture(materialParams, "roughnessMap", metallicRoughness.metallicRoughnessTexture)); } materialType = this._invokeOne(function(ext) { return ext.getMaterialType && ext.getMaterialType(materialIndex); }); pending.push(Promise.all(this._invokeAll(function(ext) { return ext.extendMaterialParams && ext.extendMaterialParams(materialIndex, materialParams); }))); } if (materialDef.doubleSided === true) { materialParams.side = THREE.DoubleSide; } const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; if (alphaMode === ALPHA_MODES.BLEND) { materialParams.transparent = true; materialParams.depthWrite = false; } else { materialParams.format = THREE.RGBFormat; materialParams.transparent = false; if (alphaMode === ALPHA_MODES.MASK) { materialParams.alphaTest = materialDef.alphaCutoff !== void 0 ? materialDef.alphaCutoff : 0.5; } } if (materialDef.normalTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) { pending.push(parser.assignTexture(materialParams, "normalMap", materialDef.normalTexture)); materialParams.normalScale = new THREE.Vector2(1, -1); if (materialDef.normalTexture.scale !== void 0) { materialParams.normalScale.set(materialDef.normalTexture.scale, -materialDef.normalTexture.scale); } } if (materialDef.occlusionTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) { pending.push(parser.assignTexture(materialParams, "aoMap", materialDef.occlusionTexture)); if (materialDef.occlusionTexture.strength !== void 0) { materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; } } if (materialDef.emissiveFactor !== void 0 && materialType !== THREE.MeshBasicMaterial) { materialParams.emissive = new THREE.Color().fromArray(materialDef.emissiveFactor); } if (materialDef.emissiveTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) { pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture)); } return Promise.all(pending).then(function() { let material; if (materialType === GLTFMeshStandardSGMaterial) { material = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(materialParams); } else { material = new materialType(materialParams); } if (materialDef.name) material.name = materialDef.name; if (material.map) material.map.encoding = THREE.sRGBEncoding; if (material.emissiveMap) material.emissiveMap.encoding = THREE.sRGBEncoding; assignExtrasToUserData(material, materialDef); parser.associations.set(material, { type: "materials", index: materialIndex }); if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef); return material; }); } /** When THREE.Object3D instances are targeted by animation, they need unique names. */ createUniqueName(originalName) { const sanitizedName = THREE.PropertyBinding.sanitizeNodeName(originalName || ""); let name = sanitizedName; for (let i = 1; this.nodeNamesUsed[name]; ++i) { name = sanitizedName + "_" + i; } this.nodeNamesUsed[name] = true; return name; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry * * Creates BufferGeometries from primitives. * * @param {Array} primitives * @return {Promise>} */ loadGeometries(primitives) { const parser = this; const extensions = this.extensions; const cache = this.primitiveCache; function createDracoPrimitive(primitive) { return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(primitive, parser).then(function(geometry) { return addPrimitiveAttributes(geometry, primitive, parser); }); } const pending = []; for (let i = 0, il = primitives.length; i < il; i++) { const primitive = primitives[i]; const cacheKey = createPrimitiveKey(primitive); const cached = cache[cacheKey]; if (cached) { pending.push(cached.promise); } else { let geometryPromise; if (primitive.extensions && primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) { geometryPromise = createDracoPrimitive(primitive); } else { geometryPromise = addPrimitiveAttributes(new THREE.BufferGeometry(), primitive, parser); } cache[cacheKey] = { primitive, promise: geometryPromise }; pending.push(geometryPromise); } } return Promise.all(pending); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes * @param {number} meshIndex * @return {Promise} */ loadMesh(meshIndex) { const parser = this; const json = this.json; const extensions = this.extensions; const meshDef = json.meshes[meshIndex]; const primitives = meshDef.primitives; const pending = []; for (let i = 0, il = primitives.length; i < il; i++) { const material = primitives[i].material === void 0 ? createDefaultMaterial(this.cache) : this.getDependency("material", primitives[i].material); pending.push(material); } pending.push(parser.loadGeometries(primitives)); return Promise.all(pending).then(function(results) { const materials = results.slice(0, results.length - 1); const geometries = results[results.length - 1]; const meshes = []; for (let i = 0, il = geometries.length; i < il; i++) { const geometry = geometries[i]; const primitive = primitives[i]; let mesh; const material = materials[i]; if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === void 0) { mesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh(geometry, material) : new THREE.Mesh(geometry, material); if (mesh.isSkinnedMesh === true && !mesh.geometry.attributes.skinWeight.normalized) { mesh.normalizeSkinWeights(); } if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) { mesh.geometry = toTrianglesDrawMode(mesh.geometry, THREE.TriangleStripDrawMode); } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) { mesh.geometry = toTrianglesDrawMode(mesh.geometry, THREE.TriangleFanDrawMode); } } else if (primitive.mode === WEBGL_CONSTANTS.LINES) { mesh = new THREE.LineSegments(geometry, material); } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) { mesh = new THREE.Line(geometry, material); } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) { mesh = new THREE.LineLoop(geometry, material); } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) { mesh = new THREE.Points(geometry, material); } else { throw new Error("THREE.GLTFLoader: Primitive mode unsupported: " + primitive.mode); } if (Object.keys(mesh.geometry.morphAttributes).length > 0) { updateMorphTargets(mesh, meshDef); } mesh.name = parser.createUniqueName(meshDef.name || "mesh_" + meshIndex); assignExtrasToUserData(mesh, meshDef); if (primitive.extensions) addUnknownExtensionsToUserData(extensions, mesh, primitive); parser.assignFinalMaterial(mesh); meshes.push(mesh); } if (meshes.length === 1) { return meshes[0]; } const group = new THREE.Group(); for (let i = 0, il = meshes.length; i < il; i++) { group.add(meshes[i]); } return group; }); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras * @param {number} cameraIndex * @return {Promise} */ loadCamera(cameraIndex) { let camera; const cameraDef = this.json.cameras[cameraIndex]; const params = cameraDef[cameraDef.type]; if (!params) { console.warn("THREE.GLTFLoader: Missing camera parameters."); return; } if (cameraDef.type === "perspective") { camera = new THREE.PerspectiveCamera(THREE.MathUtils.radToDeg(params.yfov), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6); } else if (cameraDef.type === "orthographic") { camera = new THREE.OrthographicCamera(-params.xmag, params.xmag, params.ymag, -params.ymag, params.znear, params.zfar); } if (cameraDef.name) camera.name = this.createUniqueName(cameraDef.name); assignExtrasToUserData(camera, cameraDef); return Promise.resolve(camera); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins * @param {number} skinIndex * @return {Promise} */ loadSkin(skinIndex) { const skinDef = this.json.skins[skinIndex]; const skinEntry = { joints: skinDef.joints }; if (skinDef.inverseBindMatrices === void 0) { return Promise.resolve(skinEntry); } return this.getDependency("accessor", skinDef.inverseBindMatrices).then(function(accessor) { skinEntry.inverseBindMatrices = accessor; return skinEntry; }); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations * @param {number} animationIndex * @return {Promise} */ loadAnimation(animationIndex) { const json = this.json; const animationDef = json.animations[animationIndex]; const pendingNodes = []; const pendingInputAccessors = []; const pendingOutputAccessors = []; const pendingSamplers = []; const pendingTargets = []; for (let i = 0, il = animationDef.channels.length; i < il; i++) { const channel = animationDef.channels[i]; const sampler = animationDef.samplers[channel.sampler]; const target = channel.target; const name = target.node !== void 0 ? target.node : target.id; const input = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.input] : sampler.input; const output = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.output] : sampler.output; pendingNodes.push(this.getDependency("node", name)); pendingInputAccessors.push(this.getDependency("accessor", input)); pendingOutputAccessors.push(this.getDependency("accessor", output)); pendingSamplers.push(sampler); pendingTargets.push(target); } return Promise.all([Promise.all(pendingNodes), Promise.all(pendingInputAccessors), Promise.all(pendingOutputAccessors), Promise.all(pendingSamplers), Promise.all(pendingTargets)]).then(function(dependencies) { const nodes = dependencies[0]; const inputAccessors = dependencies[1]; const outputAccessors = dependencies[2]; const samplers = dependencies[3]; const targets = dependencies[4]; const tracks = []; for (let i = 0, il = nodes.length; i < il; i++) { const node = nodes[i]; const inputAccessor = inputAccessors[i]; const outputAccessor = outputAccessors[i]; const sampler = samplers[i]; const target = targets[i]; if (node === void 0) continue; node.updateMatrix(); node.matrixAutoUpdate = true; let TypedKeyframeTrack; switch (PATH_PROPERTIES[target.path]) { case PATH_PROPERTIES.weights: TypedKeyframeTrack = THREE.NumberKeyframeTrack; break; case PATH_PROPERTIES.rotation: TypedKeyframeTrack = THREE.QuaternionKeyframeTrack; break; case PATH_PROPERTIES.position: case PATH_PROPERTIES.scale: default: TypedKeyframeTrack = THREE.VectorKeyframeTrack; break; } const targetName = node.name ? node.name : node.uuid; const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear; const targetNames = []; if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) { node.traverse(function(object) { if (object.isMesh === true && object.morphTargetInfluences) { targetNames.push(object.name ? object.name : object.uuid); } }); } else { targetNames.push(targetName); } let outputArray = outputAccessor.array; if (outputAccessor.normalized) { const scale = getNormalizedComponentScale(outputArray.constructor); const scaled = new Float32Array(outputArray.length); for (let j = 0, jl = outputArray.length; j < jl; j++) { scaled[j] = outputArray[j] * scale; } outputArray = scaled; } for (let j = 0, jl = targetNames.length; j < jl; j++) { const track = new TypedKeyframeTrack(targetNames[j] + "." + PATH_PROPERTIES[target.path], inputAccessor.array, outputArray, interpolation); if (sampler.interpolation === "CUBICSPLINE") { track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) { const interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; return new interpolantType(this.times, this.values, this.getValueSize() / 3, result); }; track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; } tracks.push(track); } } const name = animationDef.name ? animationDef.name : "animation_" + animationIndex; return new THREE.AnimationClip(name, void 0, tracks); }); } createNodeMesh(nodeIndex) { const json = this.json; const parser = this; const nodeDef = json.nodes[nodeIndex]; if (nodeDef.mesh === void 0) return null; return parser.getDependency("mesh", nodeDef.mesh).then(function(mesh) { const node = parser._getNodeRef(parser.meshCache, nodeDef.mesh, mesh); if (nodeDef.weights !== void 0) { node.traverse(function(o) { if (!o.isMesh) return; for (let i = 0, il = nodeDef.weights.length; i < il; i++) { o.morphTargetInfluences[i] = nodeDef.weights[i]; } }); } return node; }); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy * @param {number} nodeIndex * @return {Promise} */ loadNode(nodeIndex) { const json = this.json; const extensions = this.extensions; const parser = this; const nodeDef = json.nodes[nodeIndex]; const nodeName = nodeDef.name ? parser.createUniqueName(nodeDef.name) : ""; return (function() { const pending = []; const meshPromise = parser._invokeOne(function(ext) { return ext.createNodeMesh && ext.createNodeMesh(nodeIndex); }); if (meshPromise) { pending.push(meshPromise); } if (nodeDef.camera !== void 0) { pending.push(parser.getDependency("camera", nodeDef.camera).then(function(camera) { return parser._getNodeRef(parser.cameraCache, nodeDef.camera, camera); })); } parser._invokeAll(function(ext) { return ext.createNodeAttachment && ext.createNodeAttachment(nodeIndex); }).forEach(function(promise) { pending.push(promise); }); return Promise.all(pending); })().then(function(objects) { let node; if (nodeDef.isBone === true) { node = new THREE.Bone(); } else if (objects.length > 1) { node = new THREE.Group(); } else if (objects.length === 1) { node = objects[0]; } else { node = new THREE.Object3D(); } if (node !== objects[0]) { for (let i = 0, il = objects.length; i < il; i++) { node.add(objects[i]); } } if (nodeDef.name) { node.userData.name = nodeDef.name; node.name = nodeName; } assignExtrasToUserData(node, nodeDef); if (nodeDef.extensions) addUnknownExtensionsToUserData(extensions, node, nodeDef); if (nodeDef.matrix !== void 0) { const matrix = new THREE.Matrix4(); matrix.fromArray(nodeDef.matrix); node.applyMatrix4(matrix); } else { if (nodeDef.translation !== void 0) { node.position.fromArray(nodeDef.translation); } if (nodeDef.rotation !== void 0) { node.quaternion.fromArray(nodeDef.rotation); } if (nodeDef.scale !== void 0) { node.scale.fromArray(nodeDef.scale); } } parser.associations.set(node, { type: "nodes", index: nodeIndex }); return node; }); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes * @param {number} sceneIndex * @return {Promise} */ loadScene(sceneIndex) { const json = this.json; const extensions = this.extensions; const sceneDef = this.json.scenes[sceneIndex]; const parser = this; const scene = new THREE.Group(); if (sceneDef.name) scene.name = parser.createUniqueName(sceneDef.name); assignExtrasToUserData(scene, sceneDef); if (sceneDef.extensions) addUnknownExtensionsToUserData(extensions, scene, sceneDef); const nodeIds = sceneDef.nodes || []; const pending = []; for (let i = 0, il = nodeIds.length; i < il; i++) { pending.push(buildNodeHierachy(nodeIds[i], scene, json, parser)); } return Promise.all(pending).then(function() { return scene; }); } } function buildNodeHierachy(nodeId, parentObject, json, parser) { const nodeDef = json.nodes[nodeId]; return parser.getDependency("node", nodeId).then(function(node) { if (nodeDef.skin === void 0) return node; let skinEntry; return parser.getDependency("skin", nodeDef.skin).then(function(skin) { skinEntry = skin; const pendingJoints = []; for (let i = 0, il = skinEntry.joints.length; i < il; i++) { pendingJoints.push(parser.getDependency("node", skinEntry.joints[i])); } return Promise.all(pendingJoints); }).then(function(jointNodes) { node.traverse(function(mesh) { if (!mesh.isMesh) return; const bones = []; const boneInverses = []; for (let j = 0, jl = jointNodes.length; j < jl; j++) { const jointNode = jointNodes[j]; if (jointNode) { bones.push(jointNode); const mat = new THREE.Matrix4(); if (skinEntry.inverseBindMatrices !== void 0) { mat.fromArray(skinEntry.inverseBindMatrices.array, j * 16); } boneInverses.push(mat); } else { console.warn('THREE.GLTFLoader: Joint "%s" could not be found.', skinEntry.joints[j]); } } mesh.bind(new THREE.Skeleton(bones, boneInverses), mesh.matrixWorld); }); return node; }); }).then(function(node) { parentObject.add(node); const pending = []; if (nodeDef.children) { const children = nodeDef.children; for (let i = 0, il = children.length; i < il; i++) { const child = children[i]; pending.push(buildNodeHierachy(child, node, json, parser)); } } return Promise.all(pending); }); } function computeBounds(geometry, primitiveDef, parser) { const attributes = primitiveDef.attributes; const box = new THREE.Box3(); if (attributes.POSITION !== void 0) { const accessor = parser.json.accessors[attributes.POSITION]; const min = accessor.min; const max = accessor.max; if (min !== void 0 && max !== void 0) { box.set(new THREE.Vector3(min[0], min[1], min[2]), new THREE.Vector3(max[0], max[1], max[2])); if (accessor.normalized) { const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]); box.min.multiplyScalar(boxScale); box.max.multiplyScalar(boxScale); } } else { console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION."); return; } } else { return; } const targets = primitiveDef.targets; if (targets !== void 0) { const maxDisplacement = new THREE.Vector3(); const vector = new THREE.Vector3(); for (let i = 0, il = targets.length; i < il; i++) { const target = targets[i]; if (target.POSITION !== void 0) { const accessor = parser.json.accessors[target.POSITION]; const min = accessor.min; const max = accessor.max; if (min !== void 0 && max !== void 0) { vector.setX(Math.max(Math.abs(min[0]), Math.abs(max[0]))); vector.setY(Math.max(Math.abs(min[1]), Math.abs(max[1]))); vector.setZ(Math.max(Math.abs(min[2]), Math.abs(max[2]))); if (accessor.normalized) { const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]); vector.multiplyScalar(boxScale); } maxDisplacement.max(vector); } else { console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION."); } } } box.expandByVector(maxDisplacement); } geometry.boundingBox = box; const sphere = new THREE.Sphere(); box.getCenter(sphere.center); sphere.radius = box.min.distanceTo(box.max) / 2; geometry.boundingSphere = sphere; } function addPrimitiveAttributes(geometry, primitiveDef, parser) { const attributes = primitiveDef.attributes; const pending = []; function assignAttributeAccessor(accessorIndex, attributeName) { return parser.getDependency("accessor", accessorIndex).then(function(accessor) { geometry.setAttribute(attributeName, accessor); }); } for (const gltfAttributeName in attributes) { const threeAttributeName = ATTRIBUTES[gltfAttributeName] || gltfAttributeName.toLowerCase(); if (threeAttributeName in geometry.attributes) continue; pending.push(assignAttributeAccessor(attributes[gltfAttributeName], threeAttributeName)); } if (primitiveDef.indices !== void 0 && !geometry.index) { const accessor = parser.getDependency("accessor", primitiveDef.indices).then(function(accessor2) { geometry.setIndex(accessor2); }); pending.push(accessor); } assignExtrasToUserData(geometry, primitiveDef); computeBounds(geometry, primitiveDef, parser); return Promise.all(pending).then(function() { return primitiveDef.targets !== void 0 ? addMorphTargets(geometry, primitiveDef.targets, parser) : geometry; }); } function toTrianglesDrawMode(geometry, drawMode) { let index = geometry.getIndex(); if (index === null) { const indices = []; const position = geometry.getAttribute("position"); if (position !== void 0) { for (let i = 0; i < position.count; i++) { indices.push(i); } geometry.setIndex(indices); index = geometry.getIndex(); } else { console.error("THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."); return geometry; } } const numberOfTriangles = index.count - 2; const newIndices = []; if (drawMode === THREE.TriangleFanDrawMode) { for (let i = 1; i <= numberOfTriangles; i++) { newIndices.push(index.getX(0)); newIndices.push(index.getX(i)); newIndices.push(index.getX(i + 1)); } } else { for (let i = 0; i < numberOfTriangles; i++) { if (i % 2 === 0) { newIndices.push(index.getX(i)); newIndices.push(index.getX(i + 1)); newIndices.push(index.getX(i + 2)); } else { newIndices.push(index.getX(i + 2)); newIndices.push(index.getX(i + 1)); newIndices.push(index.getX(i)); } } } if (newIndices.length / 3 !== numberOfTriangles) { console.error("THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles."); } const newGeometry = geometry.clone(); newGeometry.setIndex(newIndices); return newGeometry; } THREE.GLTFLoader = GLTFLoader; })(); } }); // plugin/defer.ts var deferred = []; function defer(lambda) { deferred.push(lambda); } function deferDelete(deletable) { defer(() => deletable.delete()); return deletable; } function runDeferred() { for (let lambda of deferred.reverse()) lambda(); } // plugin/parse_gltf.ts if (THREE["GLTFLoader"] == void 0) init_GLTFLoader(); async function parseGltf(file) { let loadingManager = new THREE.LoadingManager(); let gltfLoader = createGltfLoader(loadingManager); let gltf = await parseGltfWithLoader(gltfLoader, file); return gltf; } function createGltfLoader(loadingManager = void 0) { let _GLTFLoaderClass = THREE["GLTFLoader"]; let loader = new _GLTFLoaderClass(loadingManager); return loader; } function parseGltfWithLoader(loader, file) { return new Promise((resolve, reject) => loader.parse(file.content, PathModule.dirname(file.path) + PathModule.sep, resolve, reject)); } // plugin/util.ts function isPluginInstalled(pluginId) { return Plugins.installed.some((p) => p.id === pluginId && p.disabled !== true); } function showPlugin(pluginId) { Plugins.dialog.component.data.selected_plugin = Plugins.all.find((p) => p.id === pluginId); Plugins.dialog.show(); } function valuesAndIndices(array) { return array.map((v, i) => [v, i]); } function imageBitmapToDataUri(imageBitmap, type = "image/png", quality) { let canvas = document.createElement("canvas"); canvas.width = imageBitmap.width; canvas.height = imageBitmap.height; let ctx = canvas.getContext("2d"); if (ctx == void 0) throw new Error("Failed to get 2D context"); ctx.drawImage(imageBitmap, 0, 0); return canvas.toDataURL(type, quality); } function arrayEquals(a, b) { return !a.some((v, i) => b[i] !== v); } function modulo(a, b) { return (a % b + b) % b; } function eulerDegreesFromQuat(quat) { return new THREE.Euler().setFromQuaternion(quat).toVector3().multiplyScalar(180 / Math.PI); } // plugin/vector_hash_map.ts var VectorHashMap = class { backingMap; constructor() { this.backingMap = {}; } has(key) { return this.getKeyValuePair(key) != void 0; } get(key) { return this.getKeyValuePair(key)?.[1]; } set(key, value) { let bucket = this.getBucket(key); if (bucket == void 0) { this.backingMap[this.getHashCode(key)] = [[key, value]]; return; } let keyValuePair = this.getKeyValuePair(key); if (keyValuePair == void 0) { bucket.push([key, value]); return; } keyValuePair[1] = value; } remove(key) { this.getBucket(key)?.remove(this.getKeyValuePair(key)); } getHashCode(key) { let hash = 2166136261; for (let component of key) { let component32 = component | 0; for (let i = 0; i < 4; i++) { let byte = component32 >>> i * 8 & 255; hash ^= byte; hash = Math.imul(hash, 16777619); } } return hash >>> 0; } getBucket(key) { return this.backingMap[this.getHashCode(key)]; } getKeyValuePair(key) { return this.getBucket(key)?.find(([k, v]) => k.every((c, i) => c === key[i])); } }; // plugin/import_gltf.ts async function importGltf(options) { let gltf = await parseGltf(options.file); if (options.cameras === "NOT_INSTALLED" && gltf.cameras.length !== 0) return "UNSUPPORTED_CAMERAS"; let content = { groups: [], elements: [], textures: [], animations: [], uvOutOfBounds: false, usesRepeatingWrapMode: false, unsupportedArmatures: false, texturesById: {}, textureCacheKeys: await prepareTextureCacheKeys(gltf) }; if (options.undoable) { let rootGroup = Outliner.root.find((n) => n instanceof Group); Undo.initEdit({ outliner: true, selection: true, group: rootGroup, elements: content.elements, textures: content.textures, animations: content.animations }); } let sceneRoot = gltf.scene; importNode(sceneRoot, options, content); content.usesRepeatingWrapMode = gltf.parser.json.samplers?.some((s) => s.wrapS == void 0 || s.wrapT == void 0 || s.wrapS === 10497 || s.wrapT === 10497) ?? false; if (options.selectResult) { Outliner.selected.empty(); Outliner.selected.push(...content.elements); Group.all.forEach((g) => g.unselect()); content.groups.forEach((g) => g.multiSelect()); } if (options.undoable) Undo.finishEdit("Import glTF"); return content; } function importNode(node, options, content) { switch (node.type) { case "Group": if (node.parent != void 0) return importMeshPrimitives(node, node.children, options, content); // else it's the root, treat as group // fall through... case "Object3D": return importGroup(node, options, content); case "Mesh": case "SkinnedMesh": return importSingleMesh(node, options, content); default: console.warn(`[gltf_importer]: Skipping unknown node type "${node.type}"`); return null; } } function importGroup(node, options, content) { let isRoot = node.parent == void 0; let group = null; if (options.groups && !isRoot) { group = new Group({ name: node.userData.name || node.name || "group", origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(), rotation: eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray() }); group.init(); group.createUniqueName(); group.openUp(); content.groups.push(group); } for (let child of node.children) { let result = importNode(child, options, content); result?.addTo(group ?? "root"); } return group; } function importSingleMesh(node, options, content) { return importMeshPrimitives(node, [node], options, content); } function importMeshPrimitives(node, primitives, options, content) { let mesh = new Mesh({ name: node.userData.name || node.name || "mesh", origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(), rotation: eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray(), vertices: {} }); content.elements.push(mesh); let scale = node.getWorldScale(new THREE.Vector3()).multiplyScalar(options.scale); let primitiveTextures = primitives.map((p) => importTexture(p.material, options, content)); let uniqueVertices = []; let uniqueVertexIndices = new VectorHashMap(); let primitiveToUniqueVertexIndices = []; for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) { primitiveToUniqueVertexIndices[primitiveIndex] = []; for (let vertexIndex = 0; vertexIndex < primitive.geometry.attributes.position.count; vertexIndex++) { let x = primitive.geometry.attributes.position.array[vertexIndex * 3]; let y = primitive.geometry.attributes.position.array[vertexIndex * 3 + 1]; let z = primitive.geometry.attributes.position.array[vertexIndex * 3 + 2]; let vertex = [ x * scale.x, y * scale.y, z * scale.z ]; if (!uniqueVertexIndices.has(vertex)) { let newUniqueVertexIndex = uniqueVertices.push(vertex) - 1; uniqueVertexIndices.set(vertex, newUniqueVertexIndex); } primitiveToUniqueVertexIndices[primitiveIndex].push(uniqueVertexIndices.get(vertex)); } } let vertexKeys = Array.from({ length: uniqueVertices.length }, () => bbuid(4)); mesh.vertices = Object.fromEntries(uniqueVertices.map((v, i) => [vertexKeys[i], v])); let faces = []; for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) { if (primitive.geometry.index == void 0) continue; for (let faceIndex = 0; faceIndex < primitive.geometry.index.count / 3; faceIndex++) { let texture = primitiveTextures[primitiveIndex]; let uvWidth = texture?.uv_width ?? Project?.texture_width ?? 16; let uvHeight = texture?.uv_height ?? Project?.texture_height ?? 16; let v1Uv, v2Uv, v3Uv; let v1Idx = primitive.geometry.index.array[faceIndex * 3]; let v2Idx = primitive.geometry.index.array[faceIndex * 3 + 1]; let v3Idx = primitive.geometry.index.array[faceIndex * 3 + 2]; let v1Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v1Idx]]; let v2Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v2Idx]]; let v3Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v3Idx]]; let faceVertexKeys = [v1Key, v2Key, v3Key]; if (primitive.geometry.attributes.uv != void 0) { let uvComponents = primitive.geometry.attributes.uv.array; v1Uv = [uvComponents[v1Idx * 2], uvComponents[v1Idx * 2 + 1]]; v2Uv = [uvComponents[v2Idx * 2], uvComponents[v2Idx * 2 + 1]]; v3Uv = [uvComponents[v3Idx * 2], uvComponents[v3Idx * 2 + 1]]; } else { v1Uv = [0, 0]; v2Uv = [1, 0]; v3Uv = [0, 1]; } let v1UvScaled = [v1Uv[0] * uvWidth, v1Uv[1] * uvHeight]; let v2UvScaled = [v2Uv[0] * uvWidth, v2Uv[1] * uvHeight]; let v3UvScaled = [v3Uv[0] * uvWidth, v3Uv[1] * uvHeight]; let uv = { [v1Key]: v1UvScaled, [v2Key]: v2UvScaled, [v3Key]: v3UvScaled }; content.uvOutOfBounds ||= [...v1Uv, ...v2Uv, ...v3Uv].some((x) => x < 0 || x > 1); let facesMergedIntoQuad = options.mergeQuads && (() => { if (faces.length < 1) return false; let lastFace = faces[faces.length - 1]; if (lastFace.vertices.length !== 3) return false; let nonSharedVertexKeys = []; let sharedVertexKeys = []; for (let vertKey of lastFace.vertices) (faceVertexKeys.includes(vertKey) ? sharedVertexKeys : nonSharedVertexKeys).push(vertKey); if (sharedVertexKeys.length !== 2 || nonSharedVertexKeys.length !== 1) return false; if (sharedVertexKeys.some((vk) => !arrayEquals(uv[vk], lastFace.uv[vk]))) return false; let face1VertAafterB = (faceVertexKeys.indexOf(sharedVertexKeys[0]) + 1) % 3 === faceVertexKeys.indexOf(sharedVertexKeys[1]); let face2VertAafterB = (lastFace.vertices.indexOf(sharedVertexKeys[0]) + 1) % 3 === lastFace.vertices.indexOf(sharedVertexKeys[1]); if (face1VertAafterB === face2VertAafterB) return false; let newVertexKey = nonSharedVertexKeys[0]; let face2VertBeforeNewVert = faceVertexKeys[modulo(faceVertexKeys.indexOf(newVertexKey) - 1, 3)]; let face1VertBeforeNewVertIndex = lastFace.vertices.indexOf(face2VertBeforeNewVert); lastFace.vertices.splice(face1VertBeforeNewVertIndex, 0, newVertexKey); lastFace.uv[newVertexKey] = uv[newVertexKey]; return true; })(); if (!facesMergedIntoQuad) { faces.push(new MeshFace(mesh, { vertices: faceVertexKeys, uv, texture })); } } } mesh.addFaces(...faces); mesh.init(); return mesh; } async function prepareTextureCacheKeys(gltf) { let textureCache = gltf.parser.textureCache; let textures = await Promise.all(Object.values(textureCache)); let cacheKeys = Object.keys(textureCache).map((key) => key.substring(0, key.lastIndexOf(":"))); let textureCacheKeys = Object.fromEntries(cacheKeys.map((key, i) => [textures[i].uuid, key])); return textureCacheKeys; } function importTexture(threeMaterial, options, content) { let threeTexture = threeMaterial?.map; if (threeTexture == void 0) return void 0; if (content.texturesById[threeTexture.uuid] !== void 0) { let bbTexture2 = content.texturesById[threeTexture.uuid] ?? void 0; if (threeMaterial?.side !== THREE.FrontSide && bbTexture2 != void 0) bbTexture2.render_sides = "double"; return bbTexture2; } let cacheKey = content.textureCacheKeys[threeTexture.uuid]; let bbTexture = null; if (cacheKey == void 0) { } else if (isStringNumber(cacheKey)) { if (!(threeTexture.image instanceof ImageBitmap)) { console.warn("Imported texture has unknown format: ", threeTexture.image); } else { let dataUri = imageBitmapToDataUri(threeTexture.image, "image/png", 1); bbTexture = new Texture().fromDataURL(dataUri); } } else if (cacheKey.startsWith("data:")) { bbTexture = new Texture().fromDataURL(cacheKey); } else { let absoluteTexturePath = PathModule.join(PathModule.dirname(options.file.path), cacheKey); bbTexture = new Texture().fromPath(absoluteTexturePath); } if (bbTexture != void 0) { bbTexture.name = threeTexture.name || "texture", bbTexture.add(false); content.textures.push(bbTexture); if (threeMaterial?.side !== THREE.FrontSide && bbTexture != void 0) bbTexture.render_sides = "double"; } content.texturesById[threeTexture.uuid] = bbTexture; return bbTexture ?? void 0; } // plugin/plugin.ts BBPlugin.register("gltf_importer", { title: "glTF Importer", author: "0x13F", description: "Import .GLTF and .GLB models", icon: "icon.png", creation_date: "2025-09-25", version: "1.1.0", variant: "desktop", min_version: "4.12.6", has_changelog: false, tags: ["Format: Generic Model", "Importer"], repository: "https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/gltf_importer", onload() { deferDelete(new Action("import_gltf", { name: "Import glTF Model", icon: "icon-gltf", category: "file", condition: { modes: ["edit"], method: () => Format?.meshes }, click() { importGltfDialog.show(); } })); let importMenu = MenuBar.menus.file.structure.find((x) => x["id"] === "import"); let importMenuChildren = importMenu.children; let objImportItemIndex = importMenuChildren.findIndex((x) => (typeof x === "string" ? x : x["id"]).startsWith("import_obj")); importMenuChildren.splice(objImportItemIndex, 0, "import_gltf"); defer(() => importMenuChildren.splice(importMenuChildren.indexOf("import_gltf"), 1)); let importGltfDialog = deferDelete(new Dialog("import_gltf_dialog", { title: "Import glTF", form: { ["file"]: { type: "file", label: "glTF File", return_as: "file", extensions: ["gltf", "glb"], resource_id: "gltf", filetype: "glTF Model", readtype: "buffer" }, ["scale"]: { type: "number", label: "Scale", value: Settings.get("model_export_scale") }, ["groups"]: { type: "checkbox", label: "Import Groups", value: false }, // TODO: enable // ['cameras']: { // type: 'checkbox', // label: 'Import Cameras', // value: isPluginInstalled('cameras'), // }, // ['animations']: { // type: 'checkbox', // label: 'Import Animations', // value: true, // }, // ['quads']: { // type: 'checkbox', // label: 'Merge Quads', // value: true, // }, ["info_sep"]: "_", ["info"]: { type: "info", text: "It is currently not possible to import armatures, animations or cameras." } }, onConfirm(formOptions) { if (formOptions.file == void 0) return false; let importOptions = { file: formOptions.file, scale: formOptions.scale, groups: formOptions.groups, cameras: formOptions.cameras, animations: formOptions.animations, mergeQuads: formOptions.quads, undoable: true, selectResult: true }; if (formOptions.cameras && !isPluginInstalled("cameras")) importOptions.cameras = "NOT_INSTALLED"; importGltf(importOptions).then(async (content) => { if (content === "UNSUPPORTED_CAMERAS") { importGltfDialog.show(); warnAboutCameras(); return; } if (content.unsupportedArmatures) await warnAboutUnsupportedArmatures(); if (content.usesRepeatingWrapMode && content.uvOutOfBounds) warnAboutRepeatingTextures(); }); } })); window["importGltf"] = importGltf; defer(() => delete window["importGltf"]); }, onunload() { runDeferred(); } }); function warnAboutUnsupportedArmatures() { return new Promise((resolve, reject) => { Blockbench.showMessageBox({ title: "Armatures not supported", message: "The imported glTF model makes use of armatures. The version of Blockbench you are currently using does not support armatures. If you want to import armatures from models, please update to the lastest version of Blockbench.", icon: "warning", width: 520 }, () => resolve()); }); } function warnAboutRepeatingTextures() { if (isPluginInstalled("repeating_textures")) { if (!Settings.get("repeating_textures")) { Blockbench.showMessageBox({ title: "Repeating Textures not enabled", message: "The imported glTF model makes use of repeating textures. Repeating textures is are currently disabled. Would you like to enable them now?", icon: "warning", width: 520, buttons: ["dialog.yes", "dialog.no"] }, (result) => { if (result === 0) { BarItems["toggle_repeating_textures"].trigger(); Blockbench.showQuickMessage("Repeating Textures enabled"); } }); } } else { Blockbench.showMessageBox({ title: "Repeating Textures plugin not installed", message: 'The imported glTF model makes use of repeating textures. Blockbench does not support this by default, so the model may appear incorrect. Would you like to install the "Repeating Textures" plugin to fix this?', icon: "warning", width: 520, buttons: ["dialog.yes", "dialog.no"] }, (result) => { if (result === 0) showPlugin("repeating_textures"); }); } } function warnAboutCameras() { Blockbench.showMessageBox({ title: "Cameras plugin not installed", message: 'The imported glTF model contains cameras which you have chosen to import, but the "Cameras" plugin is not currently installed. Would you like to install the "Cameras" plugin now?', icon: "warning", width: 520, buttons: ["dialog.yes", "dialog.no"] }, (result) => { if (result === 0) showPlugin("cameras"); }); } })(); ================================================ FILE: plugins/gltf_importer/members.yml ================================================ maintainers: - mr0x13f developers: - mr0x13f ================================================ FILE: plugins/gltf_importer/src/.gitignore ================================================ node_modules ================================================ FILE: plugins/gltf_importer/src/README.md ================================================ # glTF Importer A plugin to import glTF models into Blockbench. The approach is to use THREE.js GLTFLoader to import the glTF into a THREE.js scene, which we then use to create new objects in Blockbench. ## Development ### Local development setup From `plugins/gltf_importer/src/` run: ```sh npm install npm run build ``` Watch for changes using `npm run dev`. In Blockbench install from file `../gltf_importer.js`. ### Package patches This project uses `patch-package` to add fixes to the `blockbench-types` package. These should be applied automatically when running `npm install`, but you can apply the patch manually by running `npx patch-package`. The patch file is located at `patches/blockbench-types+5.0.0-beta.0.patch`. To change the patch file, make changes in your `node_modules/blockbench-types` directory, then run `npm run patch` to regenerate the patch file. ================================================ FILE: plugins/gltf_importer/src/package.json ================================================ { "name": "gltf_importer", "main": "plugin/plugin.ts", "type": "module", "scripts": { "build": "esbuild plugin/plugin.ts --bundle --outfile=../gltf_importer.js", "dev": "esbuild plugin/plugin.ts --bundle --outfile=../gltf_importer.js --watch", "patch": "patch-package blockbench-types", "postinstall": "patch-package" }, "dependencies": { "blockbench-types": "5.0.0-beta.0" }, "devDependencies": { "@types/three": "^0.179.0", "esbuild": "^0.25.9", "patch-package": "^8.0.0" } } ================================================ FILE: plugins/gltf_importer/src/patches/blockbench-types+5.0.0-beta.0.patch ================================================ diff --git a/node_modules/blockbench-types/custom/mesh.d.ts b/node_modules/blockbench-types/custom/mesh.d.ts index fb315a5..98c1dcb 100644 --- a/node_modules/blockbench-types/custom/mesh.d.ts +++ b/node_modules/blockbench-types/custom/mesh.d.ts @@ -20,7 +20,7 @@ interface MeshOptions { interface MeshFaceOptions extends FaceOptions { vertices: string[] - uv: { [vkey: string]: ArrayVector2 } + uv?: { [vkey: string]: ArrayVector2 } } declare class MeshFace extends Face { constructor(mesh: Mesh, data: MeshFaceOptions) diff --git a/node_modules/blockbench-types/generated/plugin_loader.d.ts b/node_modules/blockbench-types/generated/plugin_loader.d.ts index 33ea480..ae9db47 100644 --- a/node_modules/blockbench-types/generated/plugin_loader.d.ts +++ b/node_modules/blockbench-types/generated/plugin_loader.d.ts @@ -126,6 +126,7 @@ interface PluginOptions { bug_tracker?: string; contributors?: string[]; disabled?: boolean; + creation_date: string | number; /** * Runs when the plugin loads */ ================================================ FILE: plugins/gltf_importer/src/plugin/GLTFLoader.js ================================================ /* Three.js glTF Model Loader https://github.com/mrdoob/three.js Copyright © 2010-2021 three.js authors 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. */ ( function () { class GLTFLoader extends THREE.Loader { constructor( manager ) { super( manager ); this.dracoLoader = null; this.ktx2Loader = null; this.meshoptDecoder = null; this.pluginCallbacks = []; this.register( function ( parser ) { return new GLTFMaterialsClearcoatExtension( parser ); } ); this.register( function ( parser ) { return new GLTFTextureBasisUExtension( parser ); } ); this.register( function ( parser ) { return new GLTFTextureWebPExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsTransmissionExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsVolumeExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsIorExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsSpecularExtension( parser ); } ); this.register( function ( parser ) { return new GLTFLightsExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMeshoptCompression( parser ); } ); } load( url, onLoad, onProgress, onError ) { const scope = this; let resourcePath; if ( this.resourcePath !== '' ) { resourcePath = this.resourcePath; } else if ( this.path !== '' ) { resourcePath = this.path; } else { resourcePath = THREE.LoaderUtils.extractUrlBase( url ); } // Tells the LoadingManager to track an extra item, which resolves after // the model is fully loaded. This means the count of items loaded will // be incorrect, but ensures manager.onLoad() does not fire early. this.manager.itemStart( url ); const _onError = function ( e ) { if ( onError ) { onError( e ); } else { console.error( e ); } scope.manager.itemError( url ); scope.manager.itemEnd( url ); }; const loader = new THREE.FileLoader( this.manager ); loader.setPath( this.path ); loader.setResponseType( 'arraybuffer' ); loader.setRequestHeader( this.requestHeader ); loader.setWithCredentials( this.withCredentials ); loader.load( url, function ( data ) { try { scope.parse( data, resourcePath, function ( gltf ) { onLoad( gltf ); scope.manager.itemEnd( url ); }, _onError ); } catch ( e ) { _onError( e ); } }, onProgress, _onError ); } setDRACOLoader( dracoLoader ) { this.dracoLoader = dracoLoader; return this; } setDDSLoader() { throw new Error( 'THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".' ); } setKTX2Loader( ktx2Loader ) { this.ktx2Loader = ktx2Loader; return this; } setMeshoptDecoder( meshoptDecoder ) { this.meshoptDecoder = meshoptDecoder; return this; } register( callback ) { if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) { this.pluginCallbacks.push( callback ); } return this; } unregister( callback ) { if ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) { this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); } return this; } parse( data, path, onLoad, onError ) { let content; const extensions = {}; const plugins = {}; if ( typeof data === 'string' ) { content = data; } else { const magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) ); if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { try { extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); } catch ( error ) { if ( onError ) onError( error ); return; } content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content; } else { content = THREE.LoaderUtils.decodeText( new Uint8Array( data ) ); } } const json = JSON.parse( content ); if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); return; } const parser = new GLTFParser( json, { path: path || this.resourcePath || '', crossOrigin: this.crossOrigin, requestHeader: this.requestHeader, manager: this.manager, ktx2Loader: this.ktx2Loader, meshoptDecoder: this.meshoptDecoder } ); parser.fileLoader.setRequestHeader( this.requestHeader ); for ( let i = 0; i < this.pluginCallbacks.length; i ++ ) { const plugin = this.pluginCallbacks[ i ]( parser ); plugins[ plugin.name ] = plugin; // Workaround to avoid determining as unknown extension // in addUnknownExtensionsToUserData(). // Remove this workaround if we move all the existing // extension handlers to plugin system extensions[ plugin.name ] = true; } if ( json.extensionsUsed ) { for ( let i = 0; i < json.extensionsUsed.length; ++ i ) { const extensionName = json.extensionsUsed[ i ]; const extensionsRequired = json.extensionsRequired || []; switch ( extensionName ) { case EXTENSIONS.KHR_MATERIALS_UNLIT: extensions[ extensionName ] = new GLTFMaterialsUnlitExtension(); break; case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: extensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension(); break; case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); break; case EXTENSIONS.KHR_TEXTURE_TRANSFORM: extensions[ extensionName ] = new GLTFTextureTransformExtension(); break; case EXTENSIONS.KHR_MESH_QUANTIZATION: extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); break; default: if ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) { console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); } } } } parser.setExtensions( extensions ); parser.setPlugins( plugins ); parser.parse( onLoad, onError ); } } /* GLTFREGISTRY */ function GLTFRegistry() { let objects = {}; return { get: function ( key ) { return objects[ key ]; }, add: function ( key, object ) { objects[ key ] = object; }, remove: function ( key ) { delete objects[ key ]; }, removeAll: function () { objects = {}; } }; } /*********************************/ /********** EXTENSIONS ***********/ /*********************************/ const EXTENSIONS = { KHR_BINARY_GLTF: 'KHR_binary_glTF', KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat', KHR_MATERIALS_IOR: 'KHR_materials_ior', KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', KHR_MATERIALS_SPECULAR: 'KHR_materials_specular', KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission', KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', KHR_MATERIALS_VOLUME: 'KHR_materials_volume', KHR_TEXTURE_BASISU: 'KHR_texture_basisu', KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', EXT_TEXTURE_WEBP: 'EXT_texture_webp', EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression' }; /** * Punctual Lights Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual */ class GLTFLightsExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; // THREE.Object3D instance caches this.cache = { refs: {}, uses: {} }; } _markDefs() { const parser = this.parser; const nodeDefs = this.parser.json.nodes || []; for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { const nodeDef = nodeDefs[ nodeIndex ]; if ( nodeDef.extensions && nodeDef.extensions[ this.name ] && nodeDef.extensions[ this.name ].light !== undefined ) { parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light ); } } } _loadLight( lightIndex ) { const parser = this.parser; const cacheKey = 'light:' + lightIndex; let dependency = parser.cache.get( cacheKey ); if ( dependency ) return dependency; const json = parser.json; const extensions = json.extensions && json.extensions[ this.name ] || {}; const lightDefs = extensions.lights || []; const lightDef = lightDefs[ lightIndex ]; let lightNode; const color = new THREE.Color( 0xffffff ); if ( lightDef.color !== undefined ) color.fromArray( lightDef.color ); const range = lightDef.range !== undefined ? lightDef.range : 0; switch ( lightDef.type ) { case 'directional': lightNode = new THREE.DirectionalLight( color ); lightNode.target.position.set( 0, 0, - 1 ); lightNode.add( lightNode.target ); break; case 'point': lightNode = new THREE.PointLight( color ); lightNode.distance = range; break; case 'spot': lightNode = new THREE.SpotLight( color ); lightNode.distance = range; // Handle spotlight properties. lightDef.spot = lightDef.spot || {}; lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; lightNode.angle = lightDef.spot.outerConeAngle; lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; lightNode.target.position.set( 0, 0, - 1 ); lightNode.add( lightNode.target ); break; default: throw new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type ); } // Some lights (e.g. spot) default to a position other than the origin. Reset the position // here, because node-level parsing will only override position if explicitly specified. lightNode.position.set( 0, 0, 0 ); lightNode.decay = 2; if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; lightNode.name = parser.createUniqueName( lightDef.name || 'light_' + lightIndex ); dependency = Promise.resolve( lightNode ); parser.cache.add( cacheKey, dependency ); return dependency; } createNodeAttachment( nodeIndex ) { const self = this; const parser = this.parser; const json = parser.json; const nodeDef = json.nodes[ nodeIndex ]; const lightDef = nodeDef.extensions && nodeDef.extensions[ this.name ] || {}; const lightIndex = lightDef.light; if ( lightIndex === undefined ) return null; return this._loadLight( lightIndex ).then( function ( light ) { return parser._getNodeRef( self.cache, lightIndex, light ); } ); } } /** * Unlit Materials Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit */ class GLTFMaterialsUnlitExtension { constructor() { this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; } getMaterialType() { return THREE.MeshBasicMaterial; } extendParams( materialParams, materialDef, parser ) { const pending = []; materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); materialParams.opacity = 1.0; const metallicRoughness = materialDef.pbrMetallicRoughness; if ( metallicRoughness ) { if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { const array = metallicRoughness.baseColorFactor; materialParams.color.fromArray( array ); materialParams.opacity = array[ 3 ]; } if ( metallicRoughness.baseColorTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); } } return Promise.all( pending ); } } /** * Clearcoat Materials Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat */ class GLTFMaterialsClearcoatExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; if ( extension.clearcoatFactor !== undefined ) { materialParams.clearcoat = extension.clearcoatFactor; } if ( extension.clearcoatTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) ); } if ( extension.clearcoatRoughnessFactor !== undefined ) { materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; } if ( extension.clearcoatRoughnessTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) ); } if ( extension.clearcoatNormalTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) ); if ( extension.clearcoatNormalTexture.scale !== undefined ) { const scale = extension.clearcoatNormalTexture.scale; // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 materialParams.clearcoatNormalScale = new THREE.Vector2( scale, - scale ); } } return Promise.all( pending ); } } /** * Transmission Materials Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission * Draft: https://github.com/KhronosGroup/glTF/pull/1698 */ class GLTFMaterialsTransmissionExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; if ( extension.transmissionFactor !== undefined ) { materialParams.transmission = extension.transmissionFactor; } if ( extension.transmissionTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) ); } return Promise.all( pending ); } } /** * Materials Volume Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume */ class GLTFMaterialsVolumeExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; materialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0; if ( extension.thicknessTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) ); } materialParams.attenuationDistance = extension.attenuationDistance || 0; const colorArray = extension.attenuationColor || [ 1, 1, 1 ]; materialParams.attenuationTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] ); return Promise.all( pending ); } } /** * Materials ior Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior */ class GLTFMaterialsIorExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_IOR; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const extension = materialDef.extensions[ this.name ]; materialParams.ior = extension.ior !== undefined ? extension.ior : 1.5; return Promise.resolve(); } } /** * Materials specular Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular */ class GLTFMaterialsSpecularExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; materialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0; if ( extension.specularTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) ); } const colorArray = extension.specularColorFactor || [ 1, 1, 1 ]; materialParams.specularTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] ); if ( extension.specularColorTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'specularTintMap', extension.specularColorTexture ).then( function ( texture ) { texture.encoding = THREE.sRGBEncoding; } ) ); } return Promise.all( pending ); } } /** * BasisU THREE.Texture Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu */ class GLTFTextureBasisUExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_TEXTURE_BASISU; } loadTexture( textureIndex ) { const parser = this.parser; const json = parser.json; const textureDef = json.textures[ textureIndex ]; if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) { return null; } const extension = textureDef.extensions[ this.name ]; const source = json.images[ extension.source ]; const loader = parser.options.ktx2Loader; if ( ! loader ) { if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' ); } else { // Assumes that the extension is optional and that a fallback texture is present return null; } } return parser.loadTextureImage( textureIndex, source, loader ); } } /** * WebP THREE.Texture Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp */ class GLTFTextureWebPExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.EXT_TEXTURE_WEBP; this.isSupported = null; } loadTexture( textureIndex ) { const name = this.name; const parser = this.parser; const json = parser.json; const textureDef = json.textures[ textureIndex ]; if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { return null; } const extension = textureDef.extensions[ name ]; const source = json.images[ extension.source ]; let loader = parser.textureLoader; if ( source.uri ) { const handler = parser.options.manager.getHandler( source.uri ); if ( handler !== null ) loader = handler; } return this.detectSupport().then( function ( isSupported ) { if ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader ); if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { throw new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' ); } // Fall back to PNG or JPEG. return parser.loadTexture( textureIndex ); } ); } detectSupport() { if ( ! this.isSupported ) { this.isSupported = new Promise( function ( resolve ) { const image = new Image(); // Lossy test image. Support for lossy images doesn't guarantee support for all // WebP images, unfortunately. image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; image.onload = image.onerror = function () { resolve( image.height === 1 ); }; } ); } return this.isSupported; } } /** * meshopt BufferView Compression Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression */ class GLTFMeshoptCompression { constructor( parser ) { this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; this.parser = parser; } loadBufferView( index ) { const json = this.parser.json; const bufferView = json.bufferViews[ index ]; if ( bufferView.extensions && bufferView.extensions[ this.name ] ) { const extensionDef = bufferView.extensions[ this.name ]; const buffer = this.parser.getDependency( 'buffer', extensionDef.buffer ); const decoder = this.parser.options.meshoptDecoder; if ( ! decoder || ! decoder.supported ) { if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { throw new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' ); } else { // Assumes that the extension is optional and that fallback buffer data is present return null; } } return Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) { const byteOffset = extensionDef.byteOffset || 0; const byteLength = extensionDef.byteLength || 0; const count = extensionDef.count; const stride = extensionDef.byteStride; const result = new ArrayBuffer( count * stride ); const source = new Uint8Array( res[ 0 ], byteOffset, byteLength ); decoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter ); return result; } ); } else { return null; } } } /* BINARY EXTENSION */ const BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; const BINARY_EXTENSION_HEADER_LENGTH = 12; const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; class GLTFBinaryExtension { constructor( data ) { this.name = EXTENSIONS.KHR_BINARY_GLTF; this.content = null; this.body = null; const headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); this.header = { magic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ), version: headerView.getUint32( 4, true ), length: headerView.getUint32( 8, true ) }; if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); } else if ( this.header.version < 2.0 ) { throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); } const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; const chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); let chunkIndex = 0; while ( chunkIndex < chunkContentsLength ) { const chunkLength = chunkView.getUint32( chunkIndex, true ); chunkIndex += 4; const chunkType = chunkView.getUint32( chunkIndex, true ); chunkIndex += 4; if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { const contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); this.content = THREE.LoaderUtils.decodeText( contentArray ); } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; this.body = data.slice( byteOffset, byteOffset + chunkLength ); } // Clients must ignore chunks with unknown types. chunkIndex += chunkLength; } if ( this.content === null ) { throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); } } } /** * DRACO THREE.Mesh Compression Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression */ class GLTFDracoMeshCompressionExtension { constructor( json, dracoLoader ) { if ( ! dracoLoader ) { throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); } this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; this.json = json; this.dracoLoader = dracoLoader; this.dracoLoader.preload(); } decodePrimitive( primitive, parser ) { const json = this.json; const dracoLoader = this.dracoLoader; const bufferViewIndex = primitive.extensions[ this.name ].bufferView; const gltfAttributeMap = primitive.extensions[ this.name ].attributes; const threeAttributeMap = {}; const attributeNormalizedMap = {}; const attributeTypeMap = {}; for ( const attributeName in gltfAttributeMap ) { const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; } for ( const attributeName in primitive.attributes ) { const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); if ( gltfAttributeMap[ attributeName ] !== undefined ) { const accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; const componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; attributeTypeMap[ threeAttributeName ] = componentType; attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; } } return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { return new Promise( function ( resolve ) { dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { for ( const attributeName in geometry.attributes ) { const attribute = geometry.attributes[ attributeName ]; const normalized = attributeNormalizedMap[ attributeName ]; if ( normalized !== undefined ) attribute.normalized = normalized; } resolve( geometry ); }, threeAttributeMap, attributeTypeMap ); } ); } ); } } /** * THREE.Texture Transform Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform */ class GLTFTextureTransformExtension { constructor() { this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; } extendTexture( texture, transform ) { if ( transform.texCoord !== undefined ) { console.warn( 'THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.' ); } if ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) { // See https://github.com/mrdoob/three.js/issues/21819. return texture; } texture = texture.clone(); if ( transform.offset !== undefined ) { texture.offset.fromArray( transform.offset ); } if ( transform.rotation !== undefined ) { texture.rotation = transform.rotation; } if ( transform.scale !== undefined ) { texture.repeat.fromArray( transform.scale ); } texture.needsUpdate = true; return texture; } } /** * Specular-Glossiness Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness */ /** * A sub class of StandardMaterial with some of the functionality * changed via the `onBeforeCompile` callback * @pailhead */ class GLTFMeshStandardSGMaterial extends THREE.MeshStandardMaterial { constructor( params ) { super(); this.isGLTFSpecularGlossinessMaterial = true; //various chunks that need replacing const specularMapParsFragmentChunk = [ '#ifdef USE_SPECULARMAP', ' uniform sampler2D specularMap;', '#endif' ].join( '\n' ); const glossinessMapParsFragmentChunk = [ '#ifdef USE_GLOSSINESSMAP', ' uniform sampler2D glossinessMap;', '#endif' ].join( '\n' ); const specularMapFragmentChunk = [ 'vec3 specularFactor = specular;', '#ifdef USE_SPECULARMAP', ' vec4 texelSpecular = texture2D( specularMap, vUv );', ' texelSpecular = sRGBToLinear( texelSpecular );', ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', ' specularFactor *= texelSpecular.rgb;', '#endif' ].join( '\n' ); const glossinessMapFragmentChunk = [ 'float glossinessFactor = glossiness;', '#ifdef USE_GLOSSINESSMAP', ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', ' glossinessFactor *= texelGlossiness.a;', '#endif' ].join( '\n' ); const lightPhysicalFragmentChunk = [ 'PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', 'material.roughness += geometryRoughness;', 'material.roughness = min( material.roughness, 1.0 );', 'material.specularColor = specularFactor;' ].join( '\n' ); const uniforms = { specular: { value: new THREE.Color().setHex( 0xffffff ) }, glossiness: { value: 1 }, specularMap: { value: null }, glossinessMap: { value: null } }; this._extraUniforms = uniforms; this.onBeforeCompile = function ( shader ) { for ( const uniformName in uniforms ) { shader.uniforms[ uniformName ] = uniforms[ uniformName ]; } shader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' ).replace( 'uniform float metalness;', 'uniform float glossiness;' ).replace( '#include ', specularMapParsFragmentChunk ).replace( '#include ', glossinessMapParsFragmentChunk ).replace( '#include ', specularMapFragmentChunk ).replace( '#include ', glossinessMapFragmentChunk ).replace( '#include ', lightPhysicalFragmentChunk ); }; Object.defineProperties( this, { specular: { get: function () { return uniforms.specular.value; }, set: function ( v ) { uniforms.specular.value = v; } }, specularMap: { get: function () { return uniforms.specularMap.value; }, set: function ( v ) { uniforms.specularMap.value = v; if ( v ) { this.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps } else { delete this.defines.USE_SPECULARMAP; } } }, glossiness: { get: function () { return uniforms.glossiness.value; }, set: function ( v ) { uniforms.glossiness.value = v; } }, glossinessMap: { get: function () { return uniforms.glossinessMap.value; }, set: function ( v ) { uniforms.glossinessMap.value = v; if ( v ) { this.defines.USE_GLOSSINESSMAP = ''; this.defines.USE_UV = ''; } else { delete this.defines.USE_GLOSSINESSMAP; delete this.defines.USE_UV; } } } } ); delete this.metalness; delete this.roughness; delete this.metalnessMap; delete this.roughnessMap; this.setValues( params ); } copy( source ) { super.copy( source ); this.specularMap = source.specularMap; this.specular.copy( source.specular ); this.glossinessMap = source.glossinessMap; this.glossiness = source.glossiness; delete this.metalness; delete this.roughness; delete this.metalnessMap; delete this.roughnessMap; return this; } } class GLTFMaterialsPbrSpecularGlossinessExtension { constructor() { this.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS; this.specularGlossinessParams = [ 'color', 'map', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity', 'emissive', 'emissiveIntensity', 'emissiveMap', 'bumpMap', 'bumpScale', 'normalMap', 'normalMapType', 'displacementMap', 'displacementScale', 'displacementBias', 'specularMap', 'specular', 'glossinessMap', 'glossiness', 'alphaMap', 'envMap', 'envMapIntensity', 'refractionRatio' ]; } getMaterialType() { return GLTFMeshStandardSGMaterial; } extendParams( materialParams, materialDef, parser ) { const pbrSpecularGlossiness = materialDef.extensions[ this.name ]; materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); materialParams.opacity = 1.0; const pending = []; if ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) { const array = pbrSpecularGlossiness.diffuseFactor; materialParams.color.fromArray( array ); materialParams.opacity = array[ 3 ]; } if ( pbrSpecularGlossiness.diffuseTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) ); } materialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 ); materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; materialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 ); if ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) { materialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor ); } if ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) { const specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; pending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) ); pending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) ); } return Promise.all( pending ); } createMaterial( materialParams ) { const material = new GLTFMeshStandardSGMaterial( materialParams ); material.fog = true; material.color = materialParams.color; material.map = materialParams.map === undefined ? null : materialParams.map; material.lightMap = null; material.lightMapIntensity = 1.0; material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap; material.aoMapIntensity = 1.0; material.emissive = materialParams.emissive; material.emissiveIntensity = 1.0; material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap; material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap; material.bumpScale = 1; material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap; material.normalMapType = THREE.TangentSpaceNormalMap; if ( materialParams.normalScale ) material.normalScale = materialParams.normalScale; material.displacementMap = null; material.displacementScale = 1; material.displacementBias = 0; material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap; material.specular = materialParams.specular; material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap; material.glossiness = materialParams.glossiness; material.alphaMap = null; material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap; material.envMapIntensity = 1.0; material.refractionRatio = 0.98; return material; } } /** * THREE.Mesh Quantization Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization */ class GLTFMeshQuantizationExtension { constructor() { this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; } } /*********************************/ /********** INTERPOLATION ********/ /*********************************/ // Spline Interpolation // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation class GLTFCubicSplineInterpolant extends THREE.Interpolant { constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { super( parameterPositions, sampleValues, sampleSize, resultBuffer ); } copySampleValue_( index ) { // Copies a sample value to the result buffer. See description of glTF // CUBICSPLINE values layout in interpolate_() function below. const result = this.resultBuffer, values = this.sampleValues, valueSize = this.valueSize, offset = index * valueSize * 3 + valueSize; for ( let i = 0; i !== valueSize; i ++ ) { result[ i ] = values[ offset + i ]; } return result; } } GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; GLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) { const result = this.resultBuffer; const values = this.sampleValues; const stride = this.valueSize; const stride2 = stride * 2; const stride3 = stride * 3; const td = t1 - t0; const p = ( t - t0 ) / td; const pp = p * p; const ppp = pp * p; const offset1 = i1 * stride3; const offset0 = offset1 - stride3; const s2 = - 2 * ppp + 3 * pp; const s3 = ppp - pp; const s0 = 1 - s2; const s1 = s3 - pp + p; // Layout of keyframe output values for CUBICSPLINE animations: // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] for ( let i = 0; i !== stride; i ++ ) { const p0 = values[ offset0 + i + stride ]; // splineVertex_k const m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) const p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 const m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; } return result; }; const _q = new THREE.Quaternion(); class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { interpolate_( i1, t0, t, t1 ) { const result = super.interpolate_( i1, t0, t, t1 ); _q.fromArray( result ).normalize().toArray( result ); return result; } } /*********************************/ /********** INTERNALS ************/ /*********************************/ /* CONSTANTS */ const WEBGL_CONSTANTS = { FLOAT: 5126, //FLOAT_MAT2: 35674, FLOAT_MAT3: 35675, FLOAT_MAT4: 35676, FLOAT_VEC2: 35664, FLOAT_VEC3: 35665, FLOAT_VEC4: 35666, LINEAR: 9729, REPEAT: 10497, SAMPLER_2D: 35678, POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6, UNSIGNED_BYTE: 5121, UNSIGNED_SHORT: 5123 }; const WEBGL_COMPONENT_TYPES = { 5120: Int8Array, 5121: Uint8Array, 5122: Int16Array, 5123: Uint16Array, 5125: Uint32Array, 5126: Float32Array }; const WEBGL_FILTERS = { 9728: THREE.NearestFilter, 9729: THREE.LinearFilter, 9984: THREE.NearestMipmapNearestFilter, 9985: THREE.LinearMipmapNearestFilter, 9986: THREE.NearestMipmapLinearFilter, 9987: THREE.LinearMipmapLinearFilter }; const WEBGL_WRAPPINGS = { 33071: THREE.ClampToEdgeWrapping, 33648: THREE.MirroredRepeatWrapping, 10497: THREE.RepeatWrapping }; const WEBGL_TYPE_SIZES = { 'SCALAR': 1, 'VEC2': 2, 'VEC3': 3, 'VEC4': 4, 'MAT2': 4, 'MAT3': 9, 'MAT4': 16 }; const ATTRIBUTES = { POSITION: 'position', NORMAL: 'normal', TANGENT: 'tangent', TEXCOORD_0: 'uv', TEXCOORD_1: 'uv2', COLOR_0: 'color', WEIGHTS_0: 'skinWeight', JOINTS_0: 'skinIndex' }; const PATH_PROPERTIES = { scale: 'scale', translation: 'position', rotation: 'quaternion', weights: 'morphTargetInfluences' }; const INTERPOLATION = { CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each // keyframe track will be initialized with a default interpolation type, then modified. LINEAR: THREE.InterpolateLinear, STEP: THREE.InterpolateDiscrete }; const ALPHA_MODES = { OPAQUE: 'OPAQUE', MASK: 'MASK', BLEND: 'BLEND' }; /* UTILITY FUNCTIONS */ function resolveURL( url, path ) { // Invalid URL if ( typeof url !== 'string' || url === '' ) return ''; // Host Relative URL if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); } // Absolute URL http://,https://,// if ( /^(https?:)?\/\//i.test( url ) ) return url; // Data URI if ( /^data:.*,.*$/i.test( url ) ) return url; // Blob URL if ( /^blob:.*$/i.test( url ) ) return url; // Relative URL return path + url; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material */ function createDefaultMaterial( cache ) { if ( cache[ 'DefaultMaterial' ] === undefined ) { cache[ 'DefaultMaterial' ] = new THREE.MeshStandardMaterial( { color: 0xFFFFFF, emissive: 0x000000, metalness: 1, roughness: 1, transparent: false, depthTest: true, side: THREE.FrontSide } ); } return cache[ 'DefaultMaterial' ]; } function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { // Add unknown glTF extensions to an object's userData. for ( const name in objectDef.extensions ) { if ( knownExtensions[ name ] === undefined ) { object.userData.gltfExtensions = object.userData.gltfExtensions || {}; object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; } } } /** * @param {Object3D|Material|BufferGeometry} object * @param {GLTF.definition} gltfDef */ function assignExtrasToUserData( object, gltfDef ) { if ( gltfDef.extras !== undefined ) { if ( typeof gltfDef.extras === 'object' ) { Object.assign( object.userData, gltfDef.extras ); } else { console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); } } } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets * * @param {BufferGeometry} geometry * @param {Array} targets * @param {GLTFParser} parser * @return {Promise} */ function addMorphTargets( geometry, targets, parser ) { let hasMorphPosition = false; let hasMorphNormal = false; for ( let i = 0, il = targets.length; i < il; i ++ ) { const target = targets[ i ]; if ( target.POSITION !== undefined ) hasMorphPosition = true; if ( target.NORMAL !== undefined ) hasMorphNormal = true; if ( hasMorphPosition && hasMorphNormal ) break; } if ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry ); const pendingPositionAccessors = []; const pendingNormalAccessors = []; for ( let i = 0, il = targets.length; i < il; i ++ ) { const target = targets[ i ]; if ( hasMorphPosition ) { const pendingAccessor = target.POSITION !== undefined ? parser.getDependency( 'accessor', target.POSITION ) : geometry.attributes.position; pendingPositionAccessors.push( pendingAccessor ); } if ( hasMorphNormal ) { const pendingAccessor = target.NORMAL !== undefined ? parser.getDependency( 'accessor', target.NORMAL ) : geometry.attributes.normal; pendingNormalAccessors.push( pendingAccessor ); } } return Promise.all( [ Promise.all( pendingPositionAccessors ), Promise.all( pendingNormalAccessors ) ] ).then( function ( accessors ) { const morphPositions = accessors[ 0 ]; const morphNormals = accessors[ 1 ]; if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; geometry.morphTargetsRelative = true; return geometry; } ); } /** * @param {Mesh} mesh * @param {GLTF.Mesh} meshDef */ function updateMorphTargets( mesh, meshDef ) { mesh.updateMorphTargets(); if ( meshDef.weights !== undefined ) { for ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) { mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; } } // .extras has user-defined data, so check that .extras.targetNames is an array. if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { const targetNames = meshDef.extras.targetNames; if ( mesh.morphTargetInfluences.length === targetNames.length ) { mesh.morphTargetDictionary = {}; for ( let i = 0, il = targetNames.length; i < il; i ++ ) { mesh.morphTargetDictionary[ targetNames[ i ] ] = i; } } else { console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); } } } function createPrimitiveKey( primitiveDef ) { const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; let geometryKey; if ( dracoExtension ) { geometryKey = 'draco:' + dracoExtension.bufferView + ':' + dracoExtension.indices + ':' + createAttributesKey( dracoExtension.attributes ); } else { geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; } return geometryKey; } function createAttributesKey( attributes ) { let attributesKey = ''; const keys = Object.keys( attributes ).sort(); for ( let i = 0, il = keys.length; i < il; i ++ ) { attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; } return attributesKey; } function getNormalizedComponentScale( constructor ) { // Reference: // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data switch ( constructor ) { case Int8Array: return 1 / 127; case Uint8Array: return 1 / 255; case Int16Array: return 1 / 32767; case Uint16Array: return 1 / 65535; default: throw new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' ); } } /* GLTF PARSER */ class GLTFParser { constructor( json = {}, options = {} ) { this.json = json; this.extensions = {}; this.plugins = {}; this.options = options; // loader object cache this.cache = new GLTFRegistry(); // associations between Three.js objects and glTF elements this.associations = new Map(); // THREE.BufferGeometry caching this.primitiveCache = {}; // THREE.Object3D instance caches this.meshCache = { refs: {}, uses: {} }; this.cameraCache = { refs: {}, uses: {} }; this.lightCache = { refs: {}, uses: {} }; this.textureCache = {}; // Track node names, to ensure no duplicates this.nodeNamesUsed = {}; // Use an THREE.ImageBitmapLoader if imageBitmaps are supported. Moves much of the // expensive work of uploading a texture to the GPU off the main thread. if ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) { this.textureLoader = new THREE.ImageBitmapLoader( this.options.manager ); } else { this.textureLoader = new THREE.TextureLoader( this.options.manager ); } this.textureLoader.setCrossOrigin( this.options.crossOrigin ); this.textureLoader.setRequestHeader( this.options.requestHeader ); this.fileLoader = new THREE.FileLoader( this.options.manager ); this.fileLoader.setResponseType( 'arraybuffer' ); if ( this.options.crossOrigin === 'use-credentials' ) { this.fileLoader.setWithCredentials( true ); } } setExtensions( extensions ) { this.extensions = extensions; } setPlugins( plugins ) { this.plugins = plugins; } parse( onLoad, onError ) { const parser = this; const json = this.json; const extensions = this.extensions; // Clear the loader cache this.cache.removeAll(); // Mark the special nodes/meshes in json for efficient parse this._invokeAll( function ( ext ) { return ext._markDefs && ext._markDefs(); } ); Promise.all( this._invokeAll( function ( ext ) { return ext.beforeRoot && ext.beforeRoot(); } ) ).then( function () { return Promise.all( [ parser.getDependencies( 'scene' ), parser.getDependencies( 'animation' ), parser.getDependencies( 'camera' ) ] ); } ).then( function ( dependencies ) { const result = { scene: dependencies[ 0 ][ json.scene || 0 ], scenes: dependencies[ 0 ], animations: dependencies[ 1 ], cameras: dependencies[ 2 ], asset: json.asset, parser: parser, userData: {} }; addUnknownExtensionsToUserData( extensions, result, json ); assignExtrasToUserData( result, json ); Promise.all( parser._invokeAll( function ( ext ) { return ext.afterRoot && ext.afterRoot( result ); } ) ).then( function () { onLoad( result ); } ); } ).catch( onError ); } /** * Marks the special nodes/meshes in json for efficient parse. */ _markDefs() { const nodeDefs = this.json.nodes || []; const skinDefs = this.json.skins || []; const meshDefs = this.json.meshes || []; // Nothing in the node definition indicates whether it is a THREE.Bone or an // THREE.Object3D. Use the skins' joint references to mark bones. for ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { const joints = skinDefs[ skinIndex ].joints; for ( let i = 0, il = joints.length; i < il; i ++ ) { nodeDefs[ joints[ i ] ].isBone = true; } } // Iterate over all nodes, marking references to shared resources, // as well as skeleton joints. for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { const nodeDef = nodeDefs[ nodeIndex ]; if ( nodeDef.mesh !== undefined ) { this._addNodeRef( this.meshCache, nodeDef.mesh ); // Nothing in the mesh definition indicates whether it is // a THREE.SkinnedMesh or THREE.Mesh. Use the node's mesh reference // to mark THREE.SkinnedMesh if node has skin. if ( nodeDef.skin !== undefined ) { meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; } } if ( nodeDef.camera !== undefined ) { this._addNodeRef( this.cameraCache, nodeDef.camera ); } } } /** * Counts references to shared node / THREE.Object3D resources. These resources * can be reused, or "instantiated", at multiple nodes in the scene * hierarchy. THREE.Mesh, Camera, and Light instances are instantiated and must * be marked. Non-scenegraph resources (like Materials, Geometries, and * Textures) can be reused directly and are not marked here. * * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. */ _addNodeRef( cache, index ) { if ( index === undefined ) return; if ( cache.refs[ index ] === undefined ) { cache.refs[ index ] = cache.uses[ index ] = 0; } cache.refs[ index ] ++; } /** Returns a reference to a shared resource, cloning it if necessary. */ _getNodeRef( cache, index, object ) { if ( cache.refs[ index ] <= 1 ) return object; const ref = object.clone(); ref.name += '_instance_' + cache.uses[ index ] ++; return ref; } _invokeOne( func ) { const extensions = Object.values( this.plugins ); extensions.push( this ); for ( let i = 0; i < extensions.length; i ++ ) { const result = func( extensions[ i ] ); if ( result ) return result; } return null; } _invokeAll( func ) { const extensions = Object.values( this.plugins ); extensions.unshift( this ); const pending = []; for ( let i = 0; i < extensions.length; i ++ ) { const result = func( extensions[ i ] ); if ( result ) pending.push( result ); } return pending; } /** * Requests the specified dependency asynchronously, with caching. * @param {string} type * @param {number} index * @return {Promise} */ getDependency( type, index ) { const cacheKey = type + ':' + index; let dependency = this.cache.get( cacheKey ); if ( ! dependency ) { switch ( type ) { case 'scene': dependency = this.loadScene( index ); break; case 'node': dependency = this.loadNode( index ); break; case 'mesh': dependency = this._invokeOne( function ( ext ) { return ext.loadMesh && ext.loadMesh( index ); } ); break; case 'accessor': dependency = this.loadAccessor( index ); break; case 'bufferView': dependency = this._invokeOne( function ( ext ) { return ext.loadBufferView && ext.loadBufferView( index ); } ); break; case 'buffer': dependency = this.loadBuffer( index ); break; case 'material': dependency = this._invokeOne( function ( ext ) { return ext.loadMaterial && ext.loadMaterial( index ); } ); break; case 'texture': dependency = this._invokeOne( function ( ext ) { return ext.loadTexture && ext.loadTexture( index ); } ); break; case 'skin': dependency = this.loadSkin( index ); break; case 'animation': dependency = this.loadAnimation( index ); break; case 'camera': dependency = this.loadCamera( index ); break; default: throw new Error( 'Unknown type: ' + type ); } this.cache.add( cacheKey, dependency ); } return dependency; } /** * Requests all dependencies of the specified type asynchronously, with caching. * @param {string} type * @return {Promise>} */ getDependencies( type ) { let dependencies = this.cache.get( type ); if ( ! dependencies ) { const parser = this; const defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; dependencies = Promise.all( defs.map( function ( def, index ) { return parser.getDependency( type, index ); } ) ); this.cache.add( type, dependencies ); } return dependencies; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views * @param {number} bufferIndex * @return {Promise} */ loadBuffer( bufferIndex ) { const bufferDef = this.json.buffers[ bufferIndex ]; const loader = this.fileLoader; if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); } // If present, GLB container is required to be the first buffer. if ( bufferDef.uri === undefined && bufferIndex === 0 ) { return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); } const options = this.options; return new Promise( function ( resolve, reject ) { loader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); } ); } ); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views * @param {number} bufferViewIndex * @return {Promise} */ loadBufferView( bufferViewIndex ) { const bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { const byteLength = bufferViewDef.byteLength || 0; const byteOffset = bufferViewDef.byteOffset || 0; return buffer.slice( byteOffset, byteOffset + byteLength ); } ); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors * @param {number} accessorIndex * @return {Promise} */ loadAccessor( accessorIndex ) { const parser = this; const json = this.json; const accessorDef = this.json.accessors[ accessorIndex ]; if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { // Ignore empty accessors, which may be used to declare runtime // information about attributes coming from another source (e.g. Draco // compression extension). return Promise.resolve( null ); } const pendingBufferViews = []; if ( accessorDef.bufferView !== undefined ) { pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); } else { pendingBufferViews.push( null ); } if ( accessorDef.sparse !== undefined ) { pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); } return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { const bufferView = bufferViews[ 0 ]; const itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; const TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. const elementBytes = TypedArray.BYTES_PER_ELEMENT; const itemBytes = elementBytes * itemSize; const byteOffset = accessorDef.byteOffset || 0; const byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; const normalized = accessorDef.normalized === true; let array, bufferAttribute; // The buffer is not interleaved if the stride is the item size in bytes. if ( byteStride && byteStride !== itemBytes ) { // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own THREE.InterleavedBuffer // This makes sure that IBA.count reflects accessor.count properly const ibSlice = Math.floor( byteOffset / byteStride ); const ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; let ib = parser.cache.get( ibCacheKey ); if ( ! ib ) { array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); // Integer parameters to IB/IBA are in array elements, not bytes. ib = new THREE.InterleavedBuffer( array, byteStride / elementBytes ); parser.cache.add( ibCacheKey, ib ); } bufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, byteOffset % byteStride / elementBytes, normalized ); } else { if ( bufferView === null ) { array = new TypedArray( accessorDef.count * itemSize ); } else { array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); } bufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized ); } // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors if ( accessorDef.sparse !== undefined ) { const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; const TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; const sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); const sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); if ( bufferView !== null ) { // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. bufferAttribute = new THREE.BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); } for ( let i = 0, il = sparseIndices.length; i < il; i ++ ) { const index = sparseIndices[ i ]; bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse THREE.BufferAttribute.' ); } } return bufferAttribute; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures * @param {number} textureIndex * @return {Promise} */ loadTexture( textureIndex ) { const json = this.json; const options = this.options; const textureDef = json.textures[ textureIndex ]; const source = json.images[ textureDef.source ]; let loader = this.textureLoader; if ( source.uri ) { const handler = options.manager.getHandler( source.uri ); if ( handler !== null ) loader = handler; } return this.loadTextureImage( textureIndex, source, loader ); } loadTextureImage( textureIndex, source, loader ) { const parser = this; const json = this.json; const options = this.options; const textureDef = json.textures[ textureIndex ]; const cacheKey = ( source.uri || source.bufferView ) + ':' + textureDef.sampler; if ( this.textureCache[ cacheKey ] ) { // See https://github.com/mrdoob/three.js/issues/21559. return this.textureCache[ cacheKey ]; } const URL = self.URL || self.webkitURL; let sourceURI = source.uri || ''; let isObjectURL = false; let hasAlpha = true; const isJPEG = sourceURI.search( /\.jpe?g($|\?)/i ) > 0 || sourceURI.search( /^data\:image\/jpeg/ ) === 0; if ( source.mimeType === 'image/jpeg' || isJPEG ) hasAlpha = false; if ( source.bufferView !== undefined ) { // Load binary image data from bufferView, if provided. sourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) { if ( source.mimeType === 'image/png' ) { // Inspect the PNG 'IHDR' chunk to determine whether the image could have an // alpha channel. This check is conservative — the image could have an alpha // channel with all values == 1, and the indexed type (colorType == 3) only // sometimes contains alpha. // // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header const colorType = new DataView( bufferView, 25, 1 ).getUint8( 0, false ); hasAlpha = colorType === 6 || colorType === 4 || colorType === 3; } isObjectURL = true; const blob = new Blob( [ bufferView ], { type: source.mimeType } ); sourceURI = URL.createObjectURL( blob ); return sourceURI; } ); } else if ( source.uri === undefined ) { throw new Error( 'THREE.GLTFLoader: Image ' + textureIndex + ' is missing URI and bufferView' ); } const promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) { return new Promise( function ( resolve, reject ) { let onLoad = resolve; if ( loader.isImageBitmapLoader === true ) { onLoad = function ( imageBitmap ) { const texture = new THREE.Texture( imageBitmap ); texture.needsUpdate = true; resolve( texture ); }; } loader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject ); } ); } ).then( function ( texture ) { // Clean up resources and configure THREE.Texture. if ( isObjectURL === true ) { URL.revokeObjectURL( sourceURI ); } texture.flipY = false; if ( textureDef.name ) texture.name = textureDef.name; // When there is definitely no alpha channel in the texture, set THREE.RGBFormat to save space. if ( ! hasAlpha ) texture.format = THREE.RGBFormat; const samplers = json.samplers || {}; const sampler = samplers[ textureDef.sampler ] || {}; texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter; texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipmapLinearFilter; texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping; texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping; parser.associations.set( texture, { type: 'textures', index: textureIndex } ); return texture; } ).catch( function () { console.error( 'THREE.GLTFLoader: Couldn\'t load texture', sourceURI ); return null; } ); this.textureCache[ cacheKey ] = promise; return promise; } /** * Asynchronously assigns a texture to the given material parameters. * @param {Object} materialParams * @param {string} mapName * @param {Object} mapDef * @return {Promise} */ assignTexture( materialParams, mapName, mapDef ) { const parser = this; return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { // Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured // However, we will copy UV set 0 to UV set 1 on demand for aoMap if ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) { console.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' ); } if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { const transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; if ( transform ) { const gltfReference = parser.associations.get( texture ); texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); parser.associations.set( texture, gltfReference ); } } materialParams[ mapName ] = texture; return texture; } ); } /** * Assigns final material to a THREE.Mesh, THREE.Line, or THREE.Points instance. The instance * already has a material (generated from the glTF material options alone) * but reuse of the same glTF material may require multiple threejs materials * to accommodate different primitive types, defines, etc. New materials will * be created if necessary, and reused from a cache. * @param {Object3D} mesh THREE.Mesh, THREE.Line, or THREE.Points instance. */ assignFinalMaterial( mesh ) { const geometry = mesh.geometry; let material = mesh.material; const useVertexTangents = geometry.attributes.tangent !== undefined; const useVertexColors = geometry.attributes.color !== undefined; const useFlatShading = geometry.attributes.normal === undefined; if ( mesh.isPoints ) { const cacheKey = 'PointsMaterial:' + material.uuid; let pointsMaterial = this.cache.get( cacheKey ); if ( ! pointsMaterial ) { pointsMaterial = new THREE.PointsMaterial(); THREE.Material.prototype.copy.call( pointsMaterial, material ); pointsMaterial.color.copy( material.color ); pointsMaterial.map = material.map; pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px this.cache.add( cacheKey, pointsMaterial ); } material = pointsMaterial; } else if ( mesh.isLine ) { const cacheKey = 'LineBasicMaterial:' + material.uuid; let lineMaterial = this.cache.get( cacheKey ); if ( ! lineMaterial ) { lineMaterial = new THREE.LineBasicMaterial(); THREE.Material.prototype.copy.call( lineMaterial, material ); lineMaterial.color.copy( material.color ); this.cache.add( cacheKey, lineMaterial ); } material = lineMaterial; } // Clone the material if it will be modified if ( useVertexTangents || useVertexColors || useFlatShading ) { let cacheKey = 'ClonedMaterial:' + material.uuid + ':'; if ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:'; if ( useVertexTangents ) cacheKey += 'vertex-tangents:'; if ( useVertexColors ) cacheKey += 'vertex-colors:'; if ( useFlatShading ) cacheKey += 'flat-shading:'; let cachedMaterial = this.cache.get( cacheKey ); if ( ! cachedMaterial ) { cachedMaterial = material.clone(); if ( useVertexColors ) cachedMaterial.vertexColors = true; if ( useFlatShading ) cachedMaterial.flatShading = true; if ( useVertexTangents ) { // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 if ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1; if ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1; } this.cache.add( cacheKey, cachedMaterial ); this.associations.set( cachedMaterial, this.associations.get( material ) ); } material = cachedMaterial; } // workarounds for mesh and geometry if ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) { geometry.setAttribute( 'uv2', geometry.attributes.uv ); } mesh.material = material; } getMaterialType() { return THREE.MeshStandardMaterial; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials * @param {number} materialIndex * @return {Promise} */ loadMaterial( materialIndex ) { const parser = this; const json = this.json; const extensions = this.extensions; const materialDef = json.materials[ materialIndex ]; let materialType; const materialParams = {}; const materialExtensions = materialDef.extensions || {}; const pending = []; if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) { const sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ]; materialType = sgExtension.getMaterialType(); pending.push( sgExtension.extendParams( materialParams, materialDef, parser ) ); } else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { const kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; materialType = kmuExtension.getMaterialType(); pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); } else { // Specification: // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material const metallicRoughness = materialDef.pbrMetallicRoughness || {}; materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); materialParams.opacity = 1.0; if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { const array = metallicRoughness.baseColorFactor; materialParams.color.fromArray( array ); materialParams.opacity = array[ 3 ]; } if ( metallicRoughness.baseColorTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); } materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); } materialType = this._invokeOne( function ( ext ) { return ext.getMaterialType && ext.getMaterialType( materialIndex ); } ); pending.push( Promise.all( this._invokeAll( function ( ext ) { return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams ); } ) ) ); } if ( materialDef.doubleSided === true ) { materialParams.side = THREE.DoubleSide; } const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; if ( alphaMode === ALPHA_MODES.BLEND ) { materialParams.transparent = true; // See: https://github.com/mrdoob/three.js/issues/17706 materialParams.depthWrite = false; } else { materialParams.format = THREE.RGBFormat; materialParams.transparent = false; if ( alphaMode === ALPHA_MODES.MASK ) { materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; } } if ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 materialParams.normalScale = new THREE.Vector2( 1, - 1 ); if ( materialDef.normalTexture.scale !== undefined ) { materialParams.normalScale.set( materialDef.normalTexture.scale, - materialDef.normalTexture.scale ); } } if ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); if ( materialDef.occlusionTexture.strength !== undefined ) { materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; } } if ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) { materialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor ); } if ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) ); } return Promise.all( pending ).then( function () { let material; if ( materialType === GLTFMeshStandardSGMaterial ) { material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams ); } else { material = new materialType( materialParams ); } if ( materialDef.name ) material.name = materialDef.name; // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. if ( material.map ) material.map.encoding = THREE.sRGBEncoding; if ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding; assignExtrasToUserData( material, materialDef ); parser.associations.set( material, { type: 'materials', index: materialIndex } ); if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); return material; } ); } /** When THREE.Object3D instances are targeted by animation, they need unique names. */ createUniqueName( originalName ) { const sanitizedName = THREE.PropertyBinding.sanitizeNodeName( originalName || '' ); let name = sanitizedName; for ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) { name = sanitizedName + '_' + i; } this.nodeNamesUsed[ name ] = true; return name; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry * * Creates BufferGeometries from primitives. * * @param {Array} primitives * @return {Promise>} */ loadGeometries( primitives ) { const parser = this; const extensions = this.extensions; const cache = this.primitiveCache; function createDracoPrimitive( primitive ) { return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ].decodePrimitive( primitive, parser ).then( function ( geometry ) { return addPrimitiveAttributes( geometry, primitive, parser ); } ); } const pending = []; for ( let i = 0, il = primitives.length; i < il; i ++ ) { const primitive = primitives[ i ]; const cacheKey = createPrimitiveKey( primitive ); // See if we've already created this geometry const cached = cache[ cacheKey ]; if ( cached ) { // Use the cached geometry if it exists pending.push( cached.promise ); } else { let geometryPromise; if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { // Use DRACO geometry if available geometryPromise = createDracoPrimitive( primitive ); } else { // Otherwise create a new geometry geometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser ); } // Cache this geometry cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; pending.push( geometryPromise ); } } return Promise.all( pending ); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes * @param {number} meshIndex * @return {Promise} */ loadMesh( meshIndex ) { const parser = this; const json = this.json; const extensions = this.extensions; const meshDef = json.meshes[ meshIndex ]; const primitives = meshDef.primitives; const pending = []; for ( let i = 0, il = primitives.length; i < il; i ++ ) { const material = primitives[ i ].material === undefined ? createDefaultMaterial( this.cache ) : this.getDependency( 'material', primitives[ i ].material ); pending.push( material ); } pending.push( parser.loadGeometries( primitives ) ); return Promise.all( pending ).then( function ( results ) { const materials = results.slice( 0, results.length - 1 ); const geometries = results[ results.length - 1 ]; const meshes = []; for ( let i = 0, il = geometries.length; i < il; i ++ ) { const geometry = geometries[ i ]; const primitive = primitives[ i ]; // 1. create THREE.Mesh let mesh; const material = materials[ i ]; if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === undefined ) { // .isSkinnedMesh isn't in glTF spec. See ._markDefs() mesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh( geometry, material ) : new THREE.Mesh( geometry, material ); if ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) { // we normalize floating point skin weight array to fix malformed assets (see #15319) // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs mesh.normalizeSkinWeights(); } if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) { mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleStripDrawMode ); } else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) { mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleFanDrawMode ); } } else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) { mesh = new THREE.LineSegments( geometry, material ); } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) { mesh = new THREE.Line( geometry, material ); } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) { mesh = new THREE.LineLoop( geometry, material ); } else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) { mesh = new THREE.Points( geometry, material ); } else { throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); } if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { updateMorphTargets( mesh, meshDef ); } mesh.name = parser.createUniqueName( meshDef.name || 'mesh_' + meshIndex ); assignExtrasToUserData( mesh, meshDef ); if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive ); parser.assignFinalMaterial( mesh ); meshes.push( mesh ); } if ( meshes.length === 1 ) { return meshes[ 0 ]; } const group = new THREE.Group(); for ( let i = 0, il = meshes.length; i < il; i ++ ) { group.add( meshes[ i ] ); } return group; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras * @param {number} cameraIndex * @return {Promise} */ loadCamera( cameraIndex ) { let camera; const cameraDef = this.json.cameras[ cameraIndex ]; const params = cameraDef[ cameraDef.type ]; if ( ! params ) { console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); return; } if ( cameraDef.type === 'perspective' ) { camera = new THREE.PerspectiveCamera( THREE.MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); } else if ( cameraDef.type === 'orthographic' ) { camera = new THREE.OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar ); } if ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name ); assignExtrasToUserData( camera, cameraDef ); return Promise.resolve( camera ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins * @param {number} skinIndex * @return {Promise} */ loadSkin( skinIndex ) { const skinDef = this.json.skins[ skinIndex ]; const skinEntry = { joints: skinDef.joints }; if ( skinDef.inverseBindMatrices === undefined ) { return Promise.resolve( skinEntry ); } return this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) { skinEntry.inverseBindMatrices = accessor; return skinEntry; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations * @param {number} animationIndex * @return {Promise} */ loadAnimation( animationIndex ) { const json = this.json; const animationDef = json.animations[ animationIndex ]; const pendingNodes = []; const pendingInputAccessors = []; const pendingOutputAccessors = []; const pendingSamplers = []; const pendingTargets = []; for ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) { const channel = animationDef.channels[ i ]; const sampler = animationDef.samplers[ channel.sampler ]; const target = channel.target; const name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. const input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; const output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; pendingNodes.push( this.getDependency( 'node', name ) ); pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); pendingSamplers.push( sampler ); pendingTargets.push( target ); } return Promise.all( [ Promise.all( pendingNodes ), Promise.all( pendingInputAccessors ), Promise.all( pendingOutputAccessors ), Promise.all( pendingSamplers ), Promise.all( pendingTargets ) ] ).then( function ( dependencies ) { const nodes = dependencies[ 0 ]; const inputAccessors = dependencies[ 1 ]; const outputAccessors = dependencies[ 2 ]; const samplers = dependencies[ 3 ]; const targets = dependencies[ 4 ]; const tracks = []; for ( let i = 0, il = nodes.length; i < il; i ++ ) { const node = nodes[ i ]; const inputAccessor = inputAccessors[ i ]; const outputAccessor = outputAccessors[ i ]; const sampler = samplers[ i ]; const target = targets[ i ]; if ( node === undefined ) continue; node.updateMatrix(); node.matrixAutoUpdate = true; let TypedKeyframeTrack; switch ( PATH_PROPERTIES[ target.path ] ) { case PATH_PROPERTIES.weights: TypedKeyframeTrack = THREE.NumberKeyframeTrack; break; case PATH_PROPERTIES.rotation: TypedKeyframeTrack = THREE.QuaternionKeyframeTrack; break; case PATH_PROPERTIES.position: case PATH_PROPERTIES.scale: default: TypedKeyframeTrack = THREE.VectorKeyframeTrack; break; } const targetName = node.name ? node.name : node.uuid; const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear; const targetNames = []; if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) { // Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh. node.traverse( function ( object ) { if ( object.isMesh === true && object.morphTargetInfluences ) { targetNames.push( object.name ? object.name : object.uuid ); } } ); } else { targetNames.push( targetName ); } let outputArray = outputAccessor.array; if ( outputAccessor.normalized ) { const scale = getNormalizedComponentScale( outputArray.constructor ); const scaled = new Float32Array( outputArray.length ); for ( let j = 0, jl = outputArray.length; j < jl; j ++ ) { scaled[ j ] = outputArray[ j ] * scale; } outputArray = scaled; } for ( let j = 0, jl = targetNames.length; j < jl; j ++ ) { const track = new TypedKeyframeTrack( targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], inputAccessor.array, outputArray, interpolation ); // Override interpolation with custom factory method. if ( sampler.interpolation === 'CUBICSPLINE' ) { track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { // A CUBICSPLINE keyframe in glTF has three output values for each input value, // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() // must be divided by three to get the interpolant's sampleSize argument. const interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; return new interpolantType( this.times, this.values, this.getValueSize() / 3, result ); }; // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; } tracks.push( track ); } } const name = animationDef.name ? animationDef.name : 'animation_' + animationIndex; return new THREE.AnimationClip( name, undefined, tracks ); } ); } createNodeMesh( nodeIndex ) { const json = this.json; const parser = this; const nodeDef = json.nodes[ nodeIndex ]; if ( nodeDef.mesh === undefined ) return null; return parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { const node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); // if weights are provided on the node, override weights on the mesh. if ( nodeDef.weights !== undefined ) { node.traverse( function ( o ) { if ( ! o.isMesh ) return; for ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) { o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; } } ); } return node; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy * @param {number} nodeIndex * @return {Promise} */ loadNode( nodeIndex ) { const json = this.json; const extensions = this.extensions; const parser = this; const nodeDef = json.nodes[ nodeIndex ]; // reserve node's name before its dependencies, so the root has the intended name. const nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : ''; return function () { const pending = []; const meshPromise = parser._invokeOne( function ( ext ) { return ext.createNodeMesh && ext.createNodeMesh( nodeIndex ); } ); if ( meshPromise ) { pending.push( meshPromise ); } if ( nodeDef.camera !== undefined ) { pending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) { return parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera ); } ) ); } parser._invokeAll( function ( ext ) { return ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex ); } ).forEach( function ( promise ) { pending.push( promise ); } ); return Promise.all( pending ); }().then( function ( objects ) { let node; // .isBone isn't in glTF spec. See ._markDefs if ( nodeDef.isBone === true ) { node = new THREE.Bone(); } else if ( objects.length > 1 ) { node = new THREE.Group(); } else if ( objects.length === 1 ) { node = objects[ 0 ]; } else { node = new THREE.Object3D(); } if ( node !== objects[ 0 ] ) { for ( let i = 0, il = objects.length; i < il; i ++ ) { node.add( objects[ i ] ); } } if ( nodeDef.name ) { node.userData.name = nodeDef.name; node.name = nodeName; } assignExtrasToUserData( node, nodeDef ); if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); if ( nodeDef.matrix !== undefined ) { const matrix = new THREE.Matrix4(); matrix.fromArray( nodeDef.matrix ); node.applyMatrix4( matrix ); } else { if ( nodeDef.translation !== undefined ) { node.position.fromArray( nodeDef.translation ); } if ( nodeDef.rotation !== undefined ) { node.quaternion.fromArray( nodeDef.rotation ); } if ( nodeDef.scale !== undefined ) { node.scale.fromArray( nodeDef.scale ); } } parser.associations.set( node, { type: 'nodes', index: nodeIndex } ); return node; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes * @param {number} sceneIndex * @return {Promise} */ loadScene( sceneIndex ) { const json = this.json; const extensions = this.extensions; const sceneDef = this.json.scenes[ sceneIndex ]; const parser = this; // THREE.Loader returns THREE.Group, not Scene. // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 const scene = new THREE.Group(); if ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name ); assignExtrasToUserData( scene, sceneDef ); if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); const nodeIds = sceneDef.nodes || []; const pending = []; for ( let i = 0, il = nodeIds.length; i < il; i ++ ) { pending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) ); } return Promise.all( pending ).then( function () { return scene; } ); } } function buildNodeHierachy( nodeId, parentObject, json, parser ) { const nodeDef = json.nodes[ nodeId ]; return parser.getDependency( 'node', nodeId ).then( function ( node ) { if ( nodeDef.skin === undefined ) return node; // build skeleton here as well let skinEntry; return parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) { skinEntry = skin; const pendingJoints = []; for ( let i = 0, il = skinEntry.joints.length; i < il; i ++ ) { pendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) ); } return Promise.all( pendingJoints ); } ).then( function ( jointNodes ) { node.traverse( function ( mesh ) { if ( ! mesh.isMesh ) return; const bones = []; const boneInverses = []; for ( let j = 0, jl = jointNodes.length; j < jl; j ++ ) { const jointNode = jointNodes[ j ]; if ( jointNode ) { bones.push( jointNode ); const mat = new THREE.Matrix4(); if ( skinEntry.inverseBindMatrices !== undefined ) { mat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 ); } boneInverses.push( mat ); } else { console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinEntry.joints[ j ] ); } } mesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld ); } ); return node; } ); } ).then( function ( node ) { // build node hierachy parentObject.add( node ); const pending = []; if ( nodeDef.children ) { const children = nodeDef.children; for ( let i = 0, il = children.length; i < il; i ++ ) { const child = children[ i ]; pending.push( buildNodeHierachy( child, node, json, parser ) ); } } return Promise.all( pending ); } ); } /** * @param {BufferGeometry} geometry * @param {GLTF.Primitive} primitiveDef * @param {GLTFParser} parser */ function computeBounds( geometry, primitiveDef, parser ) { const attributes = primitiveDef.attributes; const box = new THREE.Box3(); if ( attributes.POSITION !== undefined ) { const accessor = parser.json.accessors[ attributes.POSITION ]; const min = accessor.min; const max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. if ( min !== undefined && max !== undefined ) { box.set( new THREE.Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), new THREE.Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) ); if ( accessor.normalized ) { const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); box.min.multiplyScalar( boxScale ); box.max.multiplyScalar( boxScale ); } } else { console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); return; } } else { return; } const targets = primitiveDef.targets; if ( targets !== undefined ) { const maxDisplacement = new THREE.Vector3(); const vector = new THREE.Vector3(); for ( let i = 0, il = targets.length; i < il; i ++ ) { const target = targets[ i ]; if ( target.POSITION !== undefined ) { const accessor = parser.json.accessors[ target.POSITION ]; const min = accessor.min; const max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. if ( min !== undefined && max !== undefined ) { // we need to get max of absolute components because target weight is [-1,1] vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); if ( accessor.normalized ) { const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); vector.multiplyScalar( boxScale ); } // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets // are used to implement key-frame animations and as such only two are active at a time - this results in very large // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size. maxDisplacement.max( vector ); } else { console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); } } } // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets. box.expandByVector( maxDisplacement ); } geometry.boundingBox = box; const sphere = new THREE.Sphere(); box.getCenter( sphere.center ); sphere.radius = box.min.distanceTo( box.max ) / 2; geometry.boundingSphere = sphere; } /** * @param {BufferGeometry} geometry * @param {GLTF.Primitive} primitiveDef * @param {GLTFParser} parser * @return {Promise} */ function addPrimitiveAttributes( geometry, primitiveDef, parser ) { const attributes = primitiveDef.attributes; const pending = []; function assignAttributeAccessor( accessorIndex, attributeName ) { return parser.getDependency( 'accessor', accessorIndex ).then( function ( accessor ) { geometry.setAttribute( attributeName, accessor ); } ); } for ( const gltfAttributeName in attributes ) { const threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); // Skip attributes already provided by e.g. Draco extension. if ( threeAttributeName in geometry.attributes ) continue; pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); } if ( primitiveDef.indices !== undefined && ! geometry.index ) { const accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { geometry.setIndex( accessor ); } ); pending.push( accessor ); } assignExtrasToUserData( geometry, primitiveDef ); computeBounds( geometry, primitiveDef, parser ); return Promise.all( pending ).then( function () { return primitiveDef.targets !== undefined ? addMorphTargets( geometry, primitiveDef.targets, parser ) : geometry; } ); } /** * @param {BufferGeometry} geometry * @param {Number} drawMode * @return {BufferGeometry} */ function toTrianglesDrawMode( geometry, drawMode ) { let index = geometry.getIndex(); // generate index if not present if ( index === null ) { const indices = []; const position = geometry.getAttribute( 'position' ); if ( position !== undefined ) { for ( let i = 0; i < position.count; i ++ ) { indices.push( i ); } geometry.setIndex( indices ); index = geometry.getIndex(); } else { console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); return geometry; } } // const numberOfTriangles = index.count - 2; const newIndices = []; if ( drawMode === THREE.TriangleFanDrawMode ) { // gl.TRIANGLE_FAN for ( let i = 1; i <= numberOfTriangles; i ++ ) { newIndices.push( index.getX( 0 ) ); newIndices.push( index.getX( i ) ); newIndices.push( index.getX( i + 1 ) ); } } else { // gl.TRIANGLE_STRIP for ( let i = 0; i < numberOfTriangles; i ++ ) { if ( i % 2 === 0 ) { newIndices.push( index.getX( i ) ); newIndices.push( index.getX( i + 1 ) ); newIndices.push( index.getX( i + 2 ) ); } else { newIndices.push( index.getX( i + 2 ) ); newIndices.push( index.getX( i + 1 ) ); newIndices.push( index.getX( i ) ); } } } if ( newIndices.length / 3 !== numberOfTriangles ) { console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); } // build final geometry const newGeometry = geometry.clone(); newGeometry.setIndex( newIndices ); return newGeometry; } THREE.GLTFLoader = GLTFLoader; } )(); ================================================ FILE: plugins/gltf_importer/src/plugin/defer.ts ================================================ let deferred: (()=>void)[] = []; // Runs a lambda when the plugin is unloaded export function defer(lambda: ()=>void) { deferred.push(lambda); } // Deletes a Deletable when the plugin is unloaded export function deferDelete(deletable: T): T { defer(() => deletable.delete()); return deletable; } // Call this when the plugin is unloaded export function runDeferred() { for (let lambda of deferred.reverse()) lambda(); } // Removes a HTML element once the plugin is unloaded export function deferRemoveElement(element: HTMLElement): HTMLElement { defer(() => element.parentElement?.removeChild(element)); return element; } ================================================ FILE: plugins/gltf_importer/src/plugin/global.d.ts ================================================ import 'blockbench-types'; import * as THREE_ from 'three'; declare global { type BBAnimation = _Animation; // Fix THREE declare namespace THREE { export type * from 'three'; } const THREE: typeof THREE_; } ================================================ FILE: plugins/gltf_importer/src/plugin/import_gltf.ts ================================================ import { GLTF, parseGltf } from './parse_gltf'; import { arrayEquals, eulerDegreesFromQuat, imageBitmapToDataUri, modulo, valuesAndIndices } from './util'; import { VectorHashMap } from './vector_hash_map'; export type ImportOptions = { file: Filesystem.FileResult, scale: number, groups: boolean, cameras: boolean|'NOT_INSTALLED', animations: boolean, mergeQuads: boolean, undoable: boolean, selectResult: boolean, }; export type ImportedContent = { // Used for undo system groups: Group[], elements: OutlinerElement[], textures: Texture[], animations: BBAnimation[], // Used for displaying warnings uvOutOfBounds: boolean, usesRepeatingWrapMode: boolean, unsupportedArmatures: boolean, // To keep track of which THREE texture corresponds to which Blockbench texture texturesById: {[textureId: string]: Texture|null}; // Each THREE texture's cache key, containing source information textureCacheKeys: {[textureId: string]: string}; }; // MARK: 🟥 gltf export async function importGltf(options: ImportOptions): Promise { // TODO: cameras! // TODO: animations! // TODO: armatures! let gltf = await parseGltf(options.file); // console.log('gltf', gltf); // TODO: remove // Stop early if cameras are enabled, but not installed, and the model does include cameras if (options.cameras === 'NOT_INSTALLED' && gltf.cameras.length !== 0) return 'UNSUPPORTED_CAMERAS'; // Keep track of all the things we importeNd let content: ImportedContent = { groups: [], elements: [], textures: [], animations: [], uvOutOfBounds: false, usesRepeatingWrapMode: false, unsupportedArmatures: false, texturesById: {}, textureCacheKeys: await prepareTextureCacheKeys(gltf), }; if (options.undoable) { let rootGroup = Outliner.root.find(n => n instanceof Group); Undo.initEdit({ outliner: true, selection: true, group: rootGroup, elements: content.elements, textures: content.textures, animations: content.animations, }); } // Navigate node tree and import what we find let sceneRoot = gltf.scene as unknown as THREE.Group; importNode(sceneRoot, options, content); // Check if any samplers use the repeating wrap mode content.usesRepeatingWrapMode = gltf.parser.json.samplers?.some((s: any) => s.wrapS == undefined || s.wrapT == undefined || s.wrapS === 10497 || s.wrapT === 10497 ) ?? false; // Select all the elements we imported if (options.selectResult) { Outliner.selected.empty(); Outliner.selected.push(...content.elements); Group.all.forEach(g => g.unselect()); content.groups.forEach(g => g.multiSelect()); } if (options.undoable) Undo.finishEdit('Import glTF'); return content; } // MARK: 🟥 node function importNode(node: THREE.Object3D, options: ImportOptions, content: ImportedContent): Group|Mesh|null { switch (node.type) { case 'Group': // If this is not the root, it's representing one mesh with multiple primitives if (node.parent != undefined) return importMeshPrimitives(node as THREE.Group, node.children as THREE.Mesh[], options, content); // else it's the root, treat as group // fall through... case 'Object3D': return importGroup(node, options, content); case 'Mesh': case 'SkinnedMesh': return importSingleMesh(node as THREE.Mesh, options, content); default: console.warn(`[gltf_importer]: Skipping unknown node type "${node.type}"`); return null; } } // MARK: 🟥 group function importGroup(node: THREE.Object3D, options: ImportOptions, content: ImportedContent): Group|null { let isRoot = node.parent == undefined; let group: Group|null = null; // Only create outliner group if the option is enabled and if the current node is not the root if (options.groups && !isRoot) { group = new Group({ name: node.userData.name || node.name || 'group', origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(), rotation: eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray() as ArrayVector3, }); group.init(); group.createUniqueName(); group.openUp(); content.groups.push(group); } // Child nodes for (let child of node.children) { let result = importNode(child, options, content); result?.addTo(group ?? 'root'); } return group; } // MARK: 🟥 mesh function importSingleMesh(node: THREE.Mesh, options: ImportOptions, content: ImportedContent): Mesh { return importMeshPrimitives(node, [node], options, content); } // Meshes in glTFs are made of one or more primitives which can have different materials // THREE.js turns this into a Group with multiple meshes // In Blockbench we would like this to be one mesh again, and just set the different textures on the faces // We also de-duplicate vertices across primitives function importMeshPrimitives(node: THREE.Object3D, primitives: THREE.Mesh[], options: ImportOptions, content: ImportedContent): Mesh { // Take info like name and origin from the encompassing group let mesh = new Mesh({ name: node.userData.name || node.name || 'mesh', origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(), rotation: eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray() as ArrayVector3, vertices: {}, }); content.elements.push(mesh); let scale = node.getWorldScale(new THREE.Vector3()).multiplyScalar(options.scale); // Lookup of primitive to texture let primitiveTextures = primitives.map(p => importTexture((p.material as any), options, content)); // Potentially confusing terms: // Original Vertex: Vertex from incoming glTF vertex buffer // Unique Vertex: Vertex with unique position, to be used for the Blockbench mesh result // Vertex Index/Indices: Index of a vertex, either from the vertex buffer, or in the unique vertices list // Unique Vertex Key: The string key that Blockbench came up with for a *unique* vertex // Unique vertex positions let uniqueVertices: ArrayVector3[] = []; // Hash map of position to index into uniqueVertices // i.e. uniqueVertexIndices.get([x,y,z]) -> index into uniqueVertices let uniqueVertexIndices = new VectorHashMap(); // Lookup of primitive's original vertex index to index into uniqueVertices // i.e. primitiveToUniqueVertexIndices[primitiveIndex][vertexIndex] -> index into uniqueVertices let primitiveToUniqueVertexIndices: number[][] = []; // TODO: also de-duplicate on vertex weights! Probably make the key [x,y,z, bone0,... weight0...] // De-duplicate, scale and merge primitives for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) { primitiveToUniqueVertexIndices[primitiveIndex] = []; for (let vertexIndex = 0; vertexIndex < primitive.geometry.attributes.position.count; vertexIndex++ ) { let x = primitive.geometry.attributes.position.array[vertexIndex*3]; let y = primitive.geometry.attributes.position.array[vertexIndex*3 + 1]; let z = primitive.geometry.attributes.position.array[vertexIndex*3 + 2]; // Apply scale let vertex: ArrayVector3 = [ x * scale.x, y * scale.y, z * scale.z, ]; // If this is a new position, add it to unique vertices if (!uniqueVertexIndices.has(vertex)) { let newUniqueVertexIndex = uniqueVertices.push(vertex) - 1; uniqueVertexIndices.set(vertex, newUniqueVertexIndex); } // Remember the unique vertex index for the original vertex index into this primitive primitiveToUniqueVertexIndices[primitiveIndex].push(uniqueVertexIndices.get(vertex)!); } } // Blockbench seems to like to reorder vertices randomly if we give it vertices with Mesh.addVertices() // So we create vertex keys and add them ourselves let vertexKeys = Array.from({ length: uniqueVertices.length }, () => bbuid(4)); mesh.vertices = Object.fromEntries(uniqueVertices.map((v,i) => [vertexKeys[i], v])); let faces: MeshFace[] = []; // TODO: auto uv if not present somehow? // Construct faces by using the primitive's original vertex index to look up UV and unique vertex key for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) { if (primitive.geometry.index == undefined) continue; // I guess indices are optional? seems weird for (let faceIndex = 0; faceIndex < primitive.geometry.index.count/3; faceIndex++ ) { let texture = primitiveTextures[primitiveIndex]; let uvWidth = texture?.uv_width ?? Project?.texture_width ?? 16; let uvHeight = texture?.uv_height ?? Project?.texture_height ?? 16; let v1Uv: ArrayVector2, v2Uv: ArrayVector2, v3Uv: ArrayVector2; // Original vertex index let v1Idx = primitive.geometry.index.array[faceIndex*3]; let v2Idx = primitive.geometry.index.array[faceIndex*3 + 1]; let v3Idx = primitive.geometry.index.array[faceIndex*3 + 2]; // Unique vertex keys let v1Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v1Idx]]; let v2Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v2Idx]]; let v3Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v3Idx]]; let faceVertexKeys = [v1Key, v2Key, v3Key] // UV (optional apparently) if (primitive.geometry.attributes.uv != undefined) { let uvComponents = primitive.geometry.attributes.uv.array; v1Uv = [ uvComponents[v1Idx*2] , uvComponents[v1Idx*2 + 1] ]; v2Uv = [ uvComponents[v2Idx*2] , uvComponents[v2Idx*2 + 1] ]; v3Uv = [ uvComponents[v3Idx*2] , uvComponents[v3Idx*2 + 1] ]; } else { // TODO: this currently doesn't allow for merging into quad // maybe fill missing uvs after creating primitive // then the quads are already created // or find Blockbench auto uv function v1Uv = [0,0]; v2Uv = [1,0]; v3Uv = [0,1]; } let v1UvScaled: ArrayVector2 = [ v1Uv[0] * uvWidth, v1Uv[1] * uvHeight ]; let v2UvScaled: ArrayVector2 = [ v2Uv[0] * uvWidth, v2Uv[1] * uvHeight ]; let v3UvScaled: ArrayVector2 = [ v3Uv[0] * uvWidth, v3Uv[1] * uvHeight ]; let uv = { [v1Key]: v1UvScaled, [v2Key]: v2UvScaled, [v3Key]: v3UvScaled, }; // Remember whether any UV component is outside 0..1 content.uvOutOfBounds ||= [ ...v1Uv, ...v2Uv, ...v3Uv ].some(x => x < 0 || x > 1); // TODO: Improvement for quad merging: // Currently we only merge quads of subsequent faces. // We could allow non-subsequent faces by having a map of // vertex keys to faces that use that vertex key. // Then for any triangle, we look up all the faces that use any of its vertices // to get a set of candidate triangles for merging into a quad // TODO: the option to merge quads is currently commented out in the import form // Try merging into quad with previous face let facesMergedIntoQuad = options.mergeQuads && (() => { if (faces.length < 1) return false; // Can't be first face let lastFace = faces[faces.length - 1]; if (lastFace.vertices.length !== 3) return false; // Previous face must be a tri // because Blockbench doesn't support n-gons let nonSharedVertexKeys: string[] = []; let sharedVertexKeys: string[] = []; for (let vertKey of lastFace.vertices) (faceVertexKeys.includes(vertKey) ? sharedVertexKeys : nonSharedVertexKeys).push(vertKey); if (sharedVertexKeys.length !== 2 || nonSharedVertexKeys.length !== 1) return false; // Faces must share exactly 2 vertices if (sharedVertexKeys.some(vk => !arrayEquals(uv[vk], lastFace.uv[vk]))) return false; // UVs of shared vertices must be identical let face1VertAafterB = ( faceVertexKeys.indexOf(sharedVertexKeys[0]) + 1) % 3 === faceVertexKeys.indexOf(sharedVertexKeys[1]); let face2VertAafterB = (lastFace.vertices.indexOf(sharedVertexKeys[0]) + 1) % 3 === lastFace.vertices.indexOf(sharedVertexKeys[1]); if (face1VertAafterB === face2VertAafterB) return false; // The order of the shared vertices should be reversed let newVertexKey = nonSharedVertexKeys[0]; // TODO: // Validate normals are (roughly) the same (coplanar) // by finding the first face's normal and projecting the new vertex onto it (dot product) // If the resulting projected length is greater than 0, the two faces are not coplanar // TODO: consider checking rough shape, could eliminate n-gon fans // TODO: if a third triangle in a row is connect, maybe consider it an n-gon fan and dont merge? // Find where in the last face to insert the new vertex let face2VertBeforeNewVert = faceVertexKeys[modulo(faceVertexKeys.indexOf(newVertexKey) - 1, 3)]; let face1VertBeforeNewVertIndex = lastFace.vertices.indexOf(face2VertBeforeNewVert); // Expand previous face into quad lastFace.vertices.splice(face1VertBeforeNewVertIndex, 0, newVertexKey); lastFace.uv[newVertexKey] = uv[newVertexKey]; return true; })(); // If not quad, create new face if (!facesMergedIntoQuad) { faces.push(new MeshFace(mesh, { vertices: faceVertexKeys, uv: uv, texture: texture, })); } } } mesh.addFaces(...faces); mesh.init(); return mesh; } // MARK: 🟥 textures async function prepareTextureCacheKeys(gltf: GLTF): Promise<{[textureId: string]: string}> { // The GLTF loader's internal texture cache holds information // on texture's sources inside the cache keys // We extract these keys so we can later use it to load the textures ourselves let textureCache = (gltf.parser as any).textureCache as {[textureCacheKey: string]: Promise}; // Await all the texture promises let textures = await Promise.all(Object.values(textureCache)); // Strip suffix (probably the sampler index or something, don't care) let cacheKeys = Object.keys(textureCache).map(key => key.substring(0, key.lastIndexOf(':'))); let textureCacheKeys = Object.fromEntries(cacheKeys.map((key, i) => [textures[i].uuid, key])); return textureCacheKeys; } function importTexture(threeMaterial: THREE.MeshStandardMaterial|undefined, options: ImportOptions, content: ImportedContent): Texture|undefined { let threeTexture = threeMaterial?.map; // No texture if (threeTexture == undefined) return undefined; // Already imported if (content.texturesById[threeTexture.uuid] !== undefined) { let bbTexture = content.texturesById[threeTexture.uuid] ?? undefined; // Make double-sided if necesary if (threeMaterial?.side !== THREE.FrontSide && bbTexture != undefined) bbTexture.render_sides = 'double'; return bbTexture; } let cacheKey = content.textureCacheKeys[threeTexture.uuid]; let bbTexture: Texture|null = null; // No cache key means no texture if (cacheKey == undefined) { // If the cache key is a number, that means the texture is embedded in a buffer } else if (isStringNumber(cacheKey)) { if (!(threeTexture.image instanceof ImageBitmap)) { console.warn('Imported texture has unknown format: ', threeTexture.image); } else { let dataUri = imageBitmapToDataUri(threeTexture.image, 'image/png', 1); bbTexture = new Texture().fromDataURL(dataUri); } // Embededd data uri } else if (cacheKey.startsWith('data:')) { bbTexture = new Texture().fromDataURL(cacheKey); // Otherwise the texture is from a file } else { let absoluteTexturePath = PathModule.join(PathModule.dirname(options.file.path), cacheKey); bbTexture = new Texture().fromPath(absoluteTexturePath); } // TODO: are we sure it cant still be some other stupid thing? if (bbTexture != undefined) { bbTexture.name = threeTexture.name || 'texture', bbTexture.add(false); content.textures.push(bbTexture); // Make double-sided if necesary if (threeMaterial?.side !== THREE.FrontSide && bbTexture != undefined) bbTexture.render_sides = 'double'; } content.texturesById[threeTexture.uuid] = bbTexture; return bbTexture ?? undefined; } ================================================ FILE: plugins/gltf_importer/src/plugin/parse_gltf.ts ================================================ // Import ONLY the types import type { GLTFLoader as _GLTFLoader, GLTF as _GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js'; // Import the actual loader, unless something else already did if (THREE['GLTFLoader'] == undefined) require('./GLTFLoader.js'); type GLTFLoaderConstructor = { new (loadingManager: THREE.LoadingManager|undefined): GLTFLoader; }; export type GLTFLoader = _GLTFLoader; export type GLTF = _GLTF; export async function parseGltf(file: Filesystem.FileResult): Promise { let loadingManager = new THREE.LoadingManager(); let gltfLoader = createGltfLoader(loadingManager); let gltf = await parseGltfWithLoader(gltfLoader, file); return gltf; } export function createGltfLoader(loadingManager: THREE.LoadingManager|undefined = undefined): GLTFLoader { let _GLTFLoaderClass = THREE['GLTFLoader'] as GLTFLoaderConstructor; let loader = new _GLTFLoaderClass(loadingManager); return loader; } export function parseGltfWithLoader(loader: _GLTFLoader, file: Filesystem.FileResult): Promise { return new Promise((resolve, reject) => loader.parse(file.content!, PathModule.dirname(file.path) + PathModule.sep, resolve, reject)); } ================================================ FILE: plugins/gltf_importer/src/plugin/plugin.ts ================================================ import { defer, deferDelete, runDeferred } from './defer'; import { importGltf, ImportOptions } from './import_gltf'; import { isPluginInstalled, showPlugin } from './util'; // MARK: 🟥 plugin BBPlugin.register('gltf_importer', { title: 'glTF Importer', author: '0x13F', description: 'Import .GLTF and .GLB models', icon: 'icon.png', creation_date: '2025-09-25', version: '1.1.0', variant: 'desktop', min_version: '4.12.6', has_changelog: false, tags: [ 'Format: Generic Model', 'Importer' ], repository: 'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/gltf_importer', onload() { // MARK: 🟩 action deferDelete(new Action('import_gltf', { name: 'Import glTF Model', icon: 'icon-gltf', category: 'file', condition: { modes: ['edit'], method: () => Format?.meshes, }, click() { importGltfDialog.show(); }, })); // Insert import action into import menu before OBJ let importMenu = MenuBar.menus.file.structure.find(x => x['id'] === 'import') as CustomMenuItem; let importMenuChildren = importMenu.children as MenuItem[]; let objImportItemIndex = importMenuChildren.findIndex(x => (typeof x === 'string' ? x : x['id']).startsWith('import_obj')); importMenuChildren.splice(objImportItemIndex, 0, 'import_gltf'); defer(() => importMenuChildren.splice(importMenuChildren.indexOf('import_gltf'), 1)); // MARK: 🟩 dialog type ImportGltfFormResult = { file?: Filesystem.FileResult, scale: number, groups: boolean, cameras: boolean, animations: boolean, quads: boolean, }; let importGltfDialog = deferDelete(new Dialog('import_gltf_dialog', { title: 'Import glTF', form: { ['file']: { type: 'file', label: 'glTF File', return_as: 'file', extensions: ['gltf', 'glb'], resource_id: 'gltf', filetype: 'glTF Model', readtype: 'buffer', }, ['scale']: { type: 'number', label: 'Scale', value: Settings.get('model_export_scale'), }, ['groups']: { type: 'checkbox', label: 'Import Groups', value: false, }, // TODO: enable // ['cameras']: { // type: 'checkbox', // label: 'Import Cameras', // value: isPluginInstalled('cameras'), // }, // ['animations']: { // type: 'checkbox', // label: 'Import Animations', // value: true, // }, // ['quads']: { // type: 'checkbox', // label: 'Merge Quads', // value: true, // }, ['info_sep']: '_', ['info']: { type: 'info', text: 'It is currently not possible to import armatures, animations or cameras.', }, }, onConfirm(formOptions: ImportGltfFormResult) { if (formOptions.file == undefined) return false; let importOptions: ImportOptions = { file: formOptions.file!, scale: formOptions.scale, groups: formOptions.groups, cameras: formOptions.cameras, animations: formOptions.animations, mergeQuads: formOptions.quads, undoable: true, selectResult: true, } // Return early if the model contains cameras to import but it's not installed if (formOptions.cameras && !isPluginInstalled('cameras')) importOptions.cameras = 'NOT_INSTALLED'; importGltf(importOptions) .then(async content => { if (content === 'UNSUPPORTED_CAMERAS') { importGltfDialog.show(); warnAboutCameras(); return; } if (content.unsupportedArmatures) await warnAboutUnsupportedArmatures(); if (content.usesRepeatingWrapMode && content.uvOutOfBounds) warnAboutRepeatingTextures(); }); }, })); // Allow other plugins to access the import function window['importGltf'] = importGltf; defer(() => delete window['importGltf']); }, onunload() { runDeferred(); }, }); // MARK: 🟥 warnings function warnAboutUnsupportedArmatures(): Promise { return new Promise((resolve, reject) => { Blockbench.showMessageBox({ title: 'Armatures not supported', message: 'The imported glTF model makes use of armatures. ' + 'The version of Blockbench you are currently using does not support armatures. ' + 'If you want to import armatures from models, please update to the lastest version of Blockbench.', icon: 'warning', width: 520, }, () => resolve()); }); } function warnAboutRepeatingTextures() { if (isPluginInstalled('repeating_textures')) { if (!Settings.get('repeating_textures')) { // Installed but disabled, suggest enabling Blockbench.showMessageBox({ title: 'Repeating Textures not enabled', message: 'The imported glTF model makes use of repeating textures. ' + 'Repeating textures is are currently disabled. ' + 'Would you like to enable them now?', icon: 'warning', width: 520, buttons: ['dialog.yes', 'dialog.no'], }, (result: number) => { if (result === 0) { (BarItems['toggle_repeating_textures'] as Action).trigger(); Blockbench.showQuickMessage('Repeating Textures enabled'); } }); } // Not installed, suggest installing } else { Blockbench.showMessageBox({ title: 'Repeating Textures plugin not installed', message: 'The imported glTF model makes use of repeating textures. ' + 'Blockbench does not support this by default, so the model may appear incorrect. ' + 'Would you like to install the "Repeating Textures" plugin to fix this?', icon: 'warning', width: 520, buttons: ['dialog.yes', 'dialog.no'], }, (result: number) => { if (result === 0) showPlugin('repeating_textures'); }); } } function warnAboutCameras() { Blockbench.showMessageBox({ title: 'Cameras plugin not installed', message: 'The imported glTF model contains cameras which you have chosen to import, ' + 'but the "Cameras" plugin is not currently installed. ' + 'Would you like to install the "Cameras" plugin now?', icon: 'warning', width: 520, buttons: ['dialog.yes', 'dialog.no'], }, (result: number) => { if (result === 0) showPlugin('cameras'); }); } ================================================ FILE: plugins/gltf_importer/src/plugin/util.ts ================================================ export function isPluginInstalled(pluginId: string): boolean { return Plugins.installed.some(p => p.id === pluginId && p.disabled !== true); } export function showPlugin(pluginId: string) { Plugins.dialog.component.data.selected_plugin = Plugins.all.find(p => p.id === pluginId); Plugins.dialog.show(); } export function valuesAndIndices(array: T[]): [T, number][] { return array.map((v, i) => [v, i] as [T, number]); } export function imageBitmapToDataUri(imageBitmap: ImageBitmap, type = 'image/png', quality?: number): string { let canvas = document.createElement('canvas'); canvas.width = imageBitmap.width; canvas.height = imageBitmap.height; let ctx = canvas.getContext('2d'); if (ctx == undefined) throw new Error('Failed to get 2D context'); ctx.drawImage(imageBitmap, 0, 0); return canvas.toDataURL(type, quality); } export function arrayEquals(a: any[], b: any[]): boolean { return !a.some((v, i) => b[i] !== v); } // Actual proper modulo, not the fake % remainder bs // Allows negative values of 'a' to wrap correctly export function modulo(a: number, b: number): number { return ((a % b) + b) % b; } export function eulerDegreesFromQuat(quat: THREE.Quaternion): THREE.Vector3 { return new THREE.Euler().setFromQuaternion(quat).toVector3().multiplyScalar(180/Math.PI); } ================================================ FILE: plugins/gltf_importer/src/plugin/vector_hash_map.ts ================================================ // Hash map that hashes lists of numbers by their components instead of their object reference // Used for de-duplicating vertices export class VectorHashMap { backingMap: {[hash: number]: [TKey, TValue][]}; constructor() { this.backingMap = {}; } has(key: TKey): boolean { return this.getKeyValuePair(key) != undefined; } get(key: TKey): TValue|undefined { return this.getKeyValuePair(key)?.[1]; } set(key: TKey, value: TValue) { let bucket = this.getBucket(key); if (bucket == undefined) { this.backingMap[this.getHashCode(key)] = [ [key, value] ]; return; } let keyValuePair = this.getKeyValuePair(key); if (keyValuePair == undefined) { bucket.push([key, value]); return; } keyValuePair[1] = value; } remove(key: TKey) { this.getBucket(key)?.remove(this.getKeyValuePair(key)); } getHashCode(key: TKey): number { // FNV-1a hash let hash = 2166136261; // 32-bit FNV offset basis for (let component of key) { // Break number into 4 bytes to ensure uniqueness let component32 = component | 0; // force to 32-bit int for (let i = 0; i < 4; i++) { let byte = (component32 >>> (i * 8)) & 0xff; hash ^= byte; hash = Math.imul(hash, 16777619); // FNV prime } } return hash >>> 0; // Return as unsigned 32-bit int } getBucket(key: TKey): [TKey, TValue][]|undefined { return this.backingMap[this.getHashCode(key)]; } getKeyValuePair(key: TKey): [TKey, TValue]|undefined { return this.getBucket(key)?.find(([k,v]) => k.every((c,i) => c === key[i])); } } ================================================ FILE: plugins/gltf_importer/src/tsconfig.json ================================================ { "compilerOptions": { "types": ["blockbench-types"], "target": "es2023", "module": "es2022", "moduleResolution": "node", "lib": ["ES2023", "DOM", "DOM.Iterable"], "rootDir": "plugin", "strictNullChecks": true, }, "exclude": [ "node_modules" ] } ================================================ FILE: plugins/grayscale_preview.js ================================================ /// (function() { let toggle, css; Plugin.register('grayscale_preview', { title: 'Grayscale Preview', icon: 'filter_b_and_w', author: 'JannisX11', description: 'Adds a Grayscale preview mode. The mode can be toggled from the View menu.', tags: ['Viewport'], version: '1.0.0', min_version: '4.3.0', variant: 'both', onload() { toggle = new Toggle('grayscale_preview', { name: 'Grayscale Preview', icon: 'filter_b_and_w', category: 'view', onChange(value) { Interface.work_screen.classList.toggle('grayscale_view', value) } }) MenuBar.addAction(toggle, 'view.5') css = Blockbench.addCSS(` #work_screen.grayscale_view #preview canvas { filter: grayscale(1); } #work_screen.grayscale_view #uv_frame img { filter: grayscale(1); } `) }, onunload() { toggle.delete() css.delete() } }); })() ================================================ FILE: plugins/ground_plane_editor.js ================================================ (async function() { let aboutAction, groundPlaneAction, groundPlaneDialog; const id = "ground_plane_editor" const name = "Ground Plane Editor" const icon = "icon-format_free" const author = "SirJain" // Store the ground plane material in a dialog let groundPlane = Canvas.ground_plane.material // localStorage variables let localStorageColor = localStorage.getItem("groundPlaneColor") let localStorageOpacity = localStorage.getItem("groundPlaneOpacity") const links = { twitter: "https://www.twitter.com/SirJain2", discordlink: "https://discord.gg/wM4CKTbFVN" } // Register plugin Plugin.register(id, { title: name, icon, author, description: "Edits the opacity and color of the ground plane feature in Blockbench.", about: "This simple plugin allows you to customize the ground plane feature in Blockbench; more specifically, the opacity and color.\n## How to use\nTo use this plugin, simply go to `Tools > Ground Plane Editor`, fill out the appropriate categories, and hit `Done`. You can choose to edit either the color, the opacity, or both!\n\nPlease report any bugs or suggestions you may have.", tags: ["Ground Plane", "Animation", "Customization"], version: "1.1.1", min_version: "4.2.0", variant: "both", oninstall() { showAbout(true) Blockbench.showQuickMessage("Successfully Installed Ground Plane Editor!"); }, onuninstall() { Blockbench.showQuickMessage("Uninstalled Ground Plane Editor"); }, onload() { addAbout() // Handles the ground plane on loading the plugin groundPlane.transparent = true; if (localStorageColor) groundPlane.color.setHex(JSON.parse(localStorageColor)) else groundPlane.color.setHex(parseInt("#21252B".substring(1), 16)) if (localStorageOpacity) groundPlane.opacity = localStorageOpacity / 255 else groundPlane.opacity = 1 groundPlaneAction = new Action({ name: "Edit Ground Plane", id: "edit_ground_plane_action", icon: icon, condition: () => Format?.id !== "image", click: () => openDialog() }) MenuBar.addAction(groundPlaneAction, "tools") }, onunload() { aboutAction.delete() groundPlaneAction.delete() // Reset values if plugin is uninstalled localStorage.removeItem("groundPlaneColor") localStorage.removeItem("groundPlaneOpacity") groundPlane.color.setHex(parseInt("#21252B".substring(1), 16)) groundPlane.opacity = 1 MenuBar.removeAction(`help.about_plugins.about_${id}`) } }) function openDialog() { groundPlaneDialog = new Dialog("ground_plane_dialog", { name: "Edit Ground Plane", part_order: ["form", "lines", "component"], form: { color: { label: "Color", value: getPlaneColor(), type: "color" }, opacity: { label: "Opacity", value: getPlaneOpacity(), type: "range", min: 60, max: 255, step: 1 }, actions: { type: 'buttons', buttons: ['Reset Values'], click() { groundPlane.color.setHex(parseInt("#21252B".substring(1), 16)) groundPlane.opacity = 1 groundPlaneDialog.hide() localStorage.setItem("groundPlaneColor", groundPlane.color) localStorage.setItem("groundPlaneOpacity", groundPlane.opacity) Blockbench.showQuickMessage("Reset ground plane values!", 1500) } } }, onConfirm(formData) { const planeColor = parseInt(formData.color.toHexString().substring(1), 16) groundPlane.color.setHex(planeColor) groundPlane.opacity = formData.opacity / 255 localStorage.setItem("groundPlaneColor", planeColor) localStorage.setItem("groundPlaneOpacity", formData.opacity) console.log(groundPlane.color) Blockbench.showQuickMessage("Updated ground plane values!", 1500) } }).show() } function getPlaneColor() { return '#' + groundPlane.color.getHexString() } function getPlaneOpacity() { return groundPlane.opacity * 255; } // Adds about dialog function addAbout() { let about = MenuBar.menus.help.structure.find(e => e.id === "about_plugins") if (!about) { about = new Action("about_plugins", { name: "About Plugins...", icon: "info", children: [] }) MenuBar.addAction(about, "help") } aboutAction = new Action(`about_${id}`, { name: `About ${name}...`, icon, click: () => showAbout() }) about.children.push(aboutAction) } function showAbout(banner) { const infoBox = new Dialog({ id: "about", title: name, width: 780, buttons: [], lines: [`
  • ${banner ? `` : ""}

    ${name}

    This plugin is used for changing the opacity and color of the ground plane feature in Blockbench.

    Worth noting:

    - There is currently no way to revert back to the default ground plane. However, adding this feature is planned. For now you'll have to uninstall the plugin and restart Blockbench to revert back to the default.

    - Just like the default ground plane, changing it's properties in one tab will update in other tabs as well.

    How to use:

    To use this plugin, simply go to Tools > Ground Plane Editor, fill out the appropriate categories, and hit Done. You can choose to edit either the color, the opacity, or both!

    Please report any bugs or suggestions you may have to make this plugin more enjoyable for everyone.


    `] }).show() $("dialog#about .dialog_title").html(` ${icon} ${name} `) } })() ================================================ FILE: plugins/guessing_game.js ================================================ (function() { var Game; Plugin.register('guessing_game', { title: 'The Guessing Game', icon: 'casino', author: 'JannisX11', description: 'Play the guessing game in Blockbench with your friends', version: '1.0.0', variant: 'both', onload() { //Patch Chat.processMessage = function(data) { if (!EditSession.hosting) { EditSession.host.send({ type: 'chat_input', data, sender: EditSession.peer.id }) return; } //Host Only Blockbench.dispatchEvent('process_chat_message', data) EditSession.sendAll('chat_message', data) Chat.addMessage(data) } Chat.addMessage = function(message) { if (!(message instanceof Chat.Message)) { message = new Chat.Message(message) } if (!message.text) return; Chat.history.push(message) Vue.nextTick(() => { $('#chat_history').scrollTop(10000) }) if (!document.hasFocus() && !message.self) { Blockbench.notification(message.author ? message.author+':' : 'Chat', message.text) } return message; } //Setup var GameClient = { is_creator: false, } var keywords = [ 'Blockbench', 'Fire', 'Volcano', 'Traveling', 'Batman', 'Gun', 'Folder', //Tech 'Computer', 'Monitor', 'Camera', 'Laptop', 'Tripod', 'Lamp', 'Lever', 'Floppy Disk', 'Playstation', 'Cable', 'Fire Extinguisher', 'Electric Guitar', 'Cinema', //Food 'Cake', 'Apple', 'Plate', 'Fork', 'Knive', 'Cup', 'Pizza', 'Vending Machine', 'Avocado', 'Sausage', 'Cheeseburger', 'Hot Dog', 'Ketchup', 'Pumpkin', //Vehicles 'Car', 'Pickup Truck', 'Forklift', 'Tractor', 'Plane', 'Crane', 'Excavator', 'Bus', 'Wheelchair', 'Bulldozer', 'Golf Cart', 'Bicycle', 'Monster Truck', 'Roller Coaster', 'Helicopter', 'Motorbike', 'Spaceship', 'Train', 'Delivery Truck', //Buildings 'House', 'Castle', 'Eiffel Tower', 'Barn', 'Cabin', 'Bridge', 'Tower Bridge', //Pop Culture 'R2D2', 'Tardis', 'T-Rex', 'Ring', 'Portal Gun', 'Mario', 'DeLorean', 'X Wing', //Nature 'Tree', 'Mountain', 'Snowflake', 'Cactus', 'Bug', 'Cloud', 'Bone', //Items 'Eraser', 'Pen', 'Compass', 'Toilet Paper', 'Phone', 'Gift', 'Ball', 'Ziptie', 'Candle', 'Traffic Cone', 'Key', 'Candy', 'Suitcase', 'Cheese Grater', //Tools 'Bucket', 'Hammer', 'Brush', 'Knive', 'Tape Measure', 'Sickle', 'Scissors', 'Crescent Wrench', //Minecraft 'Creeper', 'Zombie', 'Ghast', 'Beacon', 'Ravager', 'Pickage', 'Sword', 'Battle Axe', 'Axe', //Animals 'Cow', 'Fox', 'Scarecrow', 'Bird', 'Parrot', 'Bee', 'Bear', 'Cat', 'Human', 'Eagle', 'Hedgehog', 'Snail', 'Giraffe', //Body 'Mustache', 'Head', 'Hand', 'Foot', 'Tooth', 'Mouth', 'Heart', //Cloths 'Pants', 'Jacket', 'Backpack', 'Hat', 'Baseball Cap', 'Sneakers', 'Boots', 'Umbrella', 'Mask', 'Glasses', ] Game = {}; Game.interface = { setup: function() { var GI = Game.interface; var body = $('#page_wrapper'); if (GI.isSetup) return; body.append(``) //WordDisplay GI.word = $(`
    `) body.append(GI.word) //Sounds GI.bling = document.createElement('AUDIO') GI.bling.src = 'https://blockbench.net/api/guessing_game/bling.mp3'; GI.tada = document.createElement('AUDIO') GI.tada.src = 'https://blockbench.net/api/guessing_game/tada.mp3'; //Scoreboard GI.scoreboard = $(`
    `) $('#status_bar').append(GI.scoreboard) GI.isSetup = true; }, updateScoreboard: function(data) { Game.interface.scoreboard.empty() data.forEach(tag => { Game.interface.scoreboard.append(`
  • ${tag.score}
    ${tag.name}
  • `) }) }, displayWord: function(word) { Game.interface.word.text(word) }, progress: function(data) { clearInterval(Game.interface.interval) if (data.progress !== undefined) { Blockbench.setProgress(data.progress) } if (data.time) { var progress = data.progress; if (progress === undefined) progress = 1; var increment = (progress ? -1 : 1) / (data.time/(100/6)) Game.interface.interval = setInterval(function() { progress += increment; if (progress < 0 || progress > 1) { progress = Math.clamp(progress, 0, 1); clearInterval(Game.interface.interval) } Blockbench.setProgress(progress) }, 100/6) } } } Blockbench.on('create_session', (d1) => { //Host Game.interface.setup() var timeout; Game.users = {}; Game.creator = false; Game.round = 0; Game.rounds = 0; Game.rightGuesses = 0; var GameTiming = {} var completed_characters = 0; var completed_word; var complete_interval; //window.Game = Game; //User class GameUser { constructor(data) { this.id = data.id; this.score = 0; this.isCreating = false; this.isHost = !!data.isHost; this.conn = data.conn; this.name = data.name; this.client = data.client /* */ } toString() { return this.name; } startTurn() { Game.creator = this; Chat.processMessage({text: `${this.name} is now modeling!`, color: 'blue', author: 'GAME'}) this.sendData('start_turn', {word: Game.word}) if (!this.hasEverCreated) { this.sendChatMessage({text: 'You will get 4 points if your model is guessed', color: 'yellow', author: 'GAME'}) } this.hasEverCreated = true this.isCreating = true this.hasCreated = true return this; } sendData(key, data) { //Host to User if (this.isHost) { clientAction(key, data) } else { this.conn.send({ type: key, fromHost: EditSession.hosting, hostOnly: true, sender: EditSession.peer.id, data: data }); } } sendChatMessage(data) { this.sendData('chat_message', data) } guess() { if (this.isCreating) { this.sendChatMessage({text: 'You cannot guess your own word', author: 'GAME'}) return false; } if (this.hasGuessed) { this.sendChatMessage({text: 'You have already guessed the word', author: 'GAME'}) return false; } Chat.processMessage({text: this.name + ' guessed the word!', color: 'green', author: 'GAME'}) this.sendChatMessage({text: 'The correct word was: ' + Game.word, author: 'GAME'}); this.sendData('sound', {sound: 'bling'}); this.hasGuessed = true; Game.rightGuesses++; if (Game.rightGuesses === 1) { this.score += 11; Game.creator.score += 4; } else if (Game.rightGuesses <= 3) { this.score += 8; } else { this.score += 5; } Game.updateScoreboard() var user_left; Game.perUser(user => { if (!user.hasGuessed && !user.isCreating) { user_left = user; } }) if (!user_left) { stopCreation() } return true; } quit() { delete Game.users[this.id]; } } //Rounds function startGame(formData) { Game.guessing_time = formData.guessing_time*60 Game.rounds = formData.rounds Game.running = true; Game.round = 0; Game.allClients('setup_game', {}) startRound() } function startRound() { Game.round++; if (Game.round == 1) { Chat.processMessage({text: `Be the first player to guess the word and get 11 points! The second and third player get 8 points, everyone else 5.`, color: 'yellow', author: 'GAME'}); } else { Chat.processMessage({text: `Starting round number ${Game.round}!`, color: 'blue', author: 'GAME'}); } Game.perUser(user => { delete user.hasCreated; }) startCreation() } function startCreation() { //Reset Game.rightGuesses = 0; //Randomize var free = []; var user_nr = 1; Game.perUser(user => { delete user.hasGuessed; if (user.hasCreated) { user_nr++; } else { free.push(user); } }) if (free.length === 0) return false; var next = free.random() newProject(Formats.free, true); Prop.file_name = Project.name = `The Guessing Game - Round ${Game.round} of ${Game.rounds}, Player ${user_nr} (${next.name})` EditSession.initNewModel(true) var word = keywords.random() Game.word = word completed_word = word.replace(/[A-Za-z0-9]/g, '_') completed_characters = 0; Game.allClients('display_word', completed_word) next.startTurn(word) Game.allClients('display_progress', {progress: 1, time: Game.guessing_time*1000}) var interval_time = (Game.guessing_time*2) / word.length GameTiming.completing = setInterval(completeWord, interval_time*1000) GameTiming.timeout = setTimeout(stopCreation, Game.guessing_time*1000) return true; } function completeWord() { completed_characters++; var index = Math.floor(Math.random()*Game.word.length); completed_word = completed_word.substr(0, index) + Game.word[index] + completed_word.substr(index+1) Game.allClients('display_word', completed_word) } function stopCreation() { clearTimeout(GameTiming.timeout) clearInterval(GameTiming.completing) Game.allClients('display_progress', {progress: 0}) Game.allClients('end_turn', {word: Game.word}) delete Game.word; Game.creator.isCreating = false; delete Game.creator; setTimeout(function() { if (!startCreation()) { if (Game.round < Game.rounds) { startRound() } else { endGame() } } }, 5000) Game.allClients('display_progress', {progress: 0, time: 5000}) } function endGame() { var highscore = 0; var winner; Game.perUser(user => { if (user.score >= highscore) { highscore = user.score; winner = user; } delete user.hasGuessed; delete user.hasCreated; delete user.isCreating; }) Game.allClients('sound', {sound: 'tada'}); Chat.processMessage({text: `The game ended. The winner is "${winner}" with ${highscore} points. Congratulations!`, color: 'orange', author: 'GAME'}) setTimeout(function() { newProject(Formats.free, true); EditSession.initNewModel(true) Game.allClients('display_progress', {progress: 0}) dialog.show() Game.perUser(user => { user.score = 0; }) Game.updateScoreboard() Game.running = false; }, 6000) Game.allClients('display_progress', {progress: 1, time: 6000}) } //Dist Game.perUser = function(cb) { var i = 0; for (var id in Game.users) { var user = Game.users[id] cb(user, i) i++; } } Game.allClients = function(key, data) { EditSession.sendAll(key, data) clientAction(key, data) } Game.wordMatches = function(word) { if (!Game.word || typeof word !== 'string') return; word = word.trim().toLowerCase().replace(/[-_]{1}/g, ' ') return word && Game.word.toLowerCase() === word } Blockbench.on('process_chat_message', message => { if (!Game.running) return; var user = Game.users[message.sender] if (Game.wordMatches(message.text)) { message.text = ''; Game.users[message.sender].guess() } }) Game.displayWord = function(word) { Game.allClients('display_word', word) } Game.updateScoreboard = function() { var data = [] Game.perUser((user) => { data.push({name: user.name, score: user.score}) }) data.sort((a, b) => b.score - a.score); Game.allClients('update_scoreboard', data) }; //Users Game.users[EditSession.peer.id] = EditSession.clients[EditSession.peer.id].game_user = new GameUser({ id: EditSession.peer.id, name: EditSession.username, isHost: true, client: EditSession.clients[EditSession.peer.id] }) Game.updateScoreboard() Blockbench.on('user_joins_session', (client) => { if (Game.running) { client.conn.send({ type: 'add_chat_message', fromHost: true, sender: EditSession.peer.id, data: {content: 'You cannot join this session', color: 'red'} }); } else { Game.users[client.conn.peer] = client.game_user = new GameUser({ id: client.id, name: client.name, conn: client.conn, client }) Game.updateScoreboard() } }) Blockbench.on('user_leaves_session', (d2) => { if (Game.users[d2.conn.peer]) { Game.users[d2.conn.peer].quit() Game.updateScoreboard() } }) var dialog = new Dialog({ id: 'guessing_game', title: 'Guessing Game Controls', buttons: ['Start Game', 'Cancel'], form: { token: {label: 'Session Token', value: d1.token, readonly: true}, guessing_time: {label: 'Guess Time (m)', type: 'number', value: 2, min: 0.4, max: 8, step: 0.1}, rounds: {label: 'Rounds', type: 'number', value: 3, min: 1, max: 12}, }, onConfirm: function(formData) { startGame(formData) this.hide() }, onCancel: function() { EditSession.quit() this.hide() } }).show() $('#blackout').css('z-index', '15'); }) Blockbench.on('join_session', () => { Game.interface.setup() }) function clientAction(key, data) { if (key === 'setup_game') { GameClient.isPlaying = true; } else if (key === 'update_scoreboard') { Game.interface.updateScoreboard(data) } else if (key === 'init_model') { setTimeout(() => { Prop.file_name = data.name; }, 12) } else if (key === 'display_progress') { Game.interface.progress(data) } else if (key === 'display_word') { if (!GameClient.is_creator || !data.includes('_')) { Game.interface.displayWord(data) } } else if (key === 'start_turn') { GameClient.is_creator = true; Game.interface.displayWord(data.word) Blockbench.showQuickMessage(`It's your turn! Build "${data.word}"`, 1600) } else if (key === 'end_turn') { GameClient.is_creator = false; Blockbench.showQuickMessage(`The round has ended! The word was "${data.word}"`, 1800) Game.interface.displayWord('') } else if (key === 'sound') { switch (data.sound) { case 'bling': Game.interface.bling.play(); break; case 'tada': Game.interface.tada.play(); break; } } } Blockbench.on('send_session_data', (tag) => { if (GameClient.isPlaying && ['edit', 'undo', 'redo'].includes(tag.type)) { if (!GameClient.is_creator) { tag.type = 'intervened'; } } }) Blockbench.on('finished_edit', tag => { if (!tag.remote && GameClient.isPlaying && !GameClient.is_creator) { var entry = Undo.history[Undo.history.length-1] Undo.loadSave(entry.before, entry.post) Blockbench.showQuickMessage(`It's not your turn!`, 1200) } }) Blockbench.on('receive_session_data', (tag) => { if (tag.fromHost && !EditSession.hosting) { clientAction(tag.type, tag.data) } else if (!tag.fromHost && EditSession.hosting) { } }) Blockbench.on('quit_session', (tag) => { Game.interface.updateScoreboard([]) }) }, onunload() { if (Game.interface.isSetup) { Game.interface.scoreboard.detach(); Game.interface.word.detach(); } } }); })() /* Timer schneller ablaufen wenn erraten wurde Open window again when clicking edit session dima didnt get a word show word after round in chat as well */ ================================================ FILE: plugins/highlight_generator.js ================================================ (function(){ let button; Plugin.register('highlight_generator', { title: 'Highlight Mod Shape Generator', author: 'ThatGravyBoat', description: 'Generates Shape JSONs for the Highlight mod. Mod can be found at: https://links.resourcefulbees.com/highlight', icon: 'fa-cube', version: '1.0.0', variant: 'both', tags: ["Minecraft: Java Edition"], onload(){ button = new Action("export_highlight", { name : 'Export Highlight', description : 'Exports Highlight mod shape JSON', icon : 'fa-file-export', click: function(){ Blockbench.export({ type : 'Highlight Shape Export', extensions: ['json'], savetype: 'text', content: generateFile() }); } }); MenuBar.addAction(button, "file.export"); }, onunload(){ button.delete(); } }); function generateFile(){ let data = []; for (let cube of Cube.all) { const formattedLines = cube.getGlobalVertexPositions().map(point => point.map(value => value / 16.0)); const convertedVertices = [ [formattedLines[2], formattedLines[3], formattedLines[6], formattedLines[7]], [formattedLines[0], formattedLines[1], formattedLines[4], formattedLines[5]] ] for (let convertedVertex of convertedVertices) { for (let edge of createHorizontalEdges(convertedVertex)) { let topFace = [] topFace.push(...edge[0]) topFace.push(...edge[1]) if (!data.includes(topFace)) { data.push(topFace) } } data.push(null) } for (let edge of createVerticalEdges(convertedVertices[0], convertedVertices[1])) { let topFace = [] topFace.push(...edge[0]) topFace.push(...edge[1]) if (!data.includes(topFace)) { data.push(topFace) } } data.push(null) } data.pop() // The json is formatted below like this so its easier to read as each "section" will be seperated by a newline. let output = `{\n "lines": [\n` for (let datum of data) { if (datum == null) { output += `\n` } else { output += ` [${datum[0]}, ${datum[1]}, ${datum[2]}, ${datum[3]}, ${datum[4]}, ${datum[5]}],\n` } } return output.substr(0, output.length - 2) + `\n ]\n}`; } function createHorizontalEdges(vertices) { return [[vertices[2], vertices[3]], [vertices[2], vertices[1]], [vertices[1], vertices[0]], [vertices[3], vertices[0]]] } function createVerticalEdges(top, bottom) { return [[bottom[3], top[3]], [bottom[2], top[2]], [bottom[1], top[1]], [bottom[0], top[0]]] } })(); ================================================ FILE: plugins/hytale_avatar_loader/LICENSE.MD ================================================ MIT License Copyright (c) 2026 PasteDev 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. ================================================ FILE: plugins/hytale_avatar_loader/about.md ================================================

    A Blockbench plugin for Hytale that loads complete avatar models with automatic texture processing and gradient map application.

    Features:

    • Automatic avatar loading from local Hytale JSON files or crafthead.net
    • Automatic gradient map application to grayscale textures
    • Preserves existing colors (like gold details) while applying gradients only to grayscale areas
    • Processes all avatar components (skin, hair, eyes, clothing, accessories) in one operation
    • Automatic import of default Hytale character animations

    Usage:

    1. Open Blockbench and ensure you're using the Hytale Character format
    2. Go to File → Import → Load Hytale Avatar
    3. Select your avatar JSON file from the CachedPlayerSkins folder
    4. Or File → Import → Load Hytale Avatar from URL
    5. Select the extracted Assets folder when prompted
    6. To change the Assets folder locations:
    7. Go to File → Preferences → Change Hytale Assets Folder

    Note: The plugin requires file system access permissions to function properly.

    ================================================ FILE: plugins/hytale_avatar_loader/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2026-01-16", "author": "PasteDev", "categories": [ { "title": "Features", "list": [ "Initial release of Hytale Avatar Loader", "Load complete Hytale avatars from JSON files", "Automatic gradient map processing for greyscale textures", "Smart color preservation - maintains existing colors (like gold accents) while applying gradient maps", "Batch processing of all avatar components (skin, hair, eyes, clothing, accessories)", "Timestamped temporary folders to prevent overwriting when loading multiple avatars", "Support for all Hytale avatar components including body characteristics, haircuts, eyes, facial features, clothing, and accessories", "Automatic detection of material types and appropriate gradient set application", "Face and ear textures automatically use body characteristic skin color" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2026-01-18", "author": "PasteDev", "categories": [ { "title": "Features", "list": [ "Automatic animation import from Assets\\Common\\Characters\\Animations\\Default", "Imports all default Hytale character animations (excluding FPS variants)" ] } ] }, "1.1.1": { "title": "1.1.1", "date": "2026-01-22", "author": "PasteDev", "categories": [ { "title": "Improvements", "list": [ "Added Resolve Textures action for texture groups tied to avatar collections", "Resolve button now appears only when groups exist and hides after resolving", "UI and texture handling refactors to reduce duplicated logic" ] } ] }, "1.1.2": { "title": "1.1.2", "date": "2026-02-04", "author": "PasteDev", "categories": [ { "title": "Fixes", "list": [ "Ensure avatar collections always show in the outliner", "Prevent duplicate Resolve Textures buttons in the textures toolbar", "Normalize bone offsets on attachment import for correct positioning", "Support for Hytale Models plugin v0.7.0" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2026-02-04", "author": "KevinLWorthington", "categories": [ { "title": "Download Avatar from crafthead.net", "list": [ "Added ability to fetch avatars directly from crafthead.net by username", "Asset path is now saved using LocalStorage", "Asset path can be changed in File > Preferences > Change Hytale Assets Folder" ] } ] } } ================================================ FILE: plugins/hytale_avatar_loader/hytale_avatar_loader.js ================================================ let loadAction; let loadFromUrlAction; let changeAssetsFolderAction; let resolveTexturesAction; const links = { website: { text: "By Pastelito", link: "https://pastelito.dev/", icon: "far.fa-copy", colour: "#33E38E" }, twitter: { text: "Twitter", link: "https://x.com/MrPastelitoo_", icon: "fab.fa-x-twitter", colour: "#1DA1F2" } } Plugin.register('hytale_avatar_loader', { title: 'Hytale Avatar Loader', author: 'PasteDev', description: 'Loads Hytale avatar models with textures and colors from local JSON files or from crafthead.net', icon: 'icon.png', version: '1.2.0', min_version: '5.0.7', variant: 'desktop', tags: ['Hytale'], website: "https://pastelito.dev", creation_date: "2026-01-16", onload() { if (window.hytaleAvatarLoaderInitialized) return; window.hytaleAvatarLoaderInitialized = true; Blockbench.addCSS(` .action_load_avatar .icon { filter: brightness(1.2) contrast(1.1) !important; } `); const loadAvatarIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAAZQTFRFAAAAAAAApWe5zwAAAAJ0Uk5TAP9bkSK1AAAAj0lEQVR4nI3PQQ6CUAwE0KkkskRPwE3waOrN0HuY2Bv8sCAujDjTSkBX/s1Lmml/a+DrrgZUt9ZIPWzPK8bNhTQFon6sYVGRQx9MENUT4BQmRHuPIhPieIL6GCT2CpSHG/O74taUab/AbhXVjV806z+++7QR9MP8rfgsEZsRreZ5ClHU8xTPUzxPWRqSuMjfxpJZMWa9gqsAAAAASUVORK5CYII='; loadAction = new Action('load_avatar', { name: 'Load Hytale Avatar', description: 'Loads a complete Hytale avatar from a JSON file', icon: loadAvatarIcon, condition: {formats: ['hytale_character']}, click: function() { function expandPath(path) { if (path.includes('%appdata%')) { try { const appDataPath = SystemInfo.appdata_directory || ''; return path.replace(/%appdata%/gi, appDataPath); } catch (err) { return path; } } return path; } function getPathModule() { try { return requireNativeModule('path'); } catch (err) { try { return require('path'); } catch (e) { return null; } } } const pathModule = getPathModule(); if (!pathModule) { Blockbench.showMessageBox({ title: 'Error', message: 'Could not load path module. This plugin requires the desktop version of Blockbench.', buttons: ['OK'] }); return; } const pathJoin = pathModule.join; const skinFolderPath = expandPath('%appdata%\\Hytale\\UserData\\CachedPlayerSkins'); Blockbench.showMessageBox({ title: 'Select Avatar JSON File', message: '**Step 1: Select your avatar JSON file**\n\n' + 'Navigate to the following folder and select your avatar JSON file:\n\n' + '📁 `%appdata%\\Hytale\\UserData\\CachedPlayerSkins`\n\n' + 'The JSON file contains all your avatar customizations.', buttons: ['OK'] }, () => { Blockbench.import({ type: 'json', extensions: ['json'], multiple: false, title: 'Select Avatar JSON File', startpath: skinFolderPath }, async (files) => { if (!files || files.length === 0) return; const jsonFile = files[0]; let avatarData; try { if (jsonFile.content) { avatarData = JSON.parse(jsonFile.content); } else { throw new Error('Could not read file content'); } } catch (err) { Blockbench.showMessageBox({ title: 'Error', message: `Error reading JSON file: ${err.message}`, buttons: ['OK'] }); return; } const cachedAssetsPath = localStorage.getItem('hytale_assets_path'); if (cachedAssetsPath) { loadAvatar(avatarData, cachedAssetsPath).catch((err) => { Blockbench.showMessageBox({ title: 'Error', message: `Error loading avatar: ${err.message}`, buttons: ['OK'] }); }); } else { const assetsZipPath = expandPath('%appdata%\\Hytale\\install\\release\\package\\game\\latest'); Blockbench.showMessageBox({ title: 'Select Assets Folder', message: '**Step 2: Select the extracted Assets folder**\n\n' + '**Instructions:**\n\n' + '1. Extract `Assets.zip` from:\n' + ' 📁 `%appdata%\\Hytale\\install\\release\\package\\game\\latest`\n\n' + '2. Navigate to the extracted Assets folder\n\n' + '3. Select the Assets folder when prompted\n\n' + '⚠️ **Important:** You must extract Assets.zip first before selecting the folder.\n\n' + 'This path will be saved for future use.', buttons: ['OK'] }, () => { if (typeof Blockbench.pickDirectory === 'function') { const assetsDir = Blockbench.pickDirectory({ title: 'Select Assets Folder (extracted)', resource_id: 'avatar_assets_folder' }); if (!assetsDir) { Blockbench.showMessageBox({ title: 'Error', message: 'You must select the Assets folder', buttons: ['OK'] }); return; } localStorage.setItem('hytale_assets_path', assetsDir); loadAvatar(avatarData, assetsDir).catch((err) => { Blockbench.showMessageBox({ title: 'Error', message: `Error loading avatar: ${err.message}`, buttons: ['OK'] }); }); } }); } }); }); } }); loadFromUrlAction = new Action('load_avatar_from_url', { name: 'Load Hytale Avatar with Username', description: 'Loads a Hytale avatar from crafthead.net', icon: 'cloud_download', condition: {formats: ['hytale_character']}, click: async function() { function expandPath(path) { if (path.includes('%appdata%')) { try { const appDataPath = SystemInfo.appdata_directory || ''; return path.replace(/%appdata%/gi, appDataPath); } catch (err) { return path; } } return path; } const username = await new Promise((resolve) => { const dialog = new Dialog({ id: 'hytale_username_dialog', title: 'Load Avatar from Crafthead', form: { username: {label: 'Username', type: 'text', value: ''} }, onConfirm(formData) { dialog.hide(); resolve(formData.username); }, onCancel() { dialog.hide(); resolve(null); } }); dialog.show(); }); if (!username || !username.trim()) { Blockbench.showMessageBox({ title: 'No Username', message: 'Please enter a username to load.', buttons: ['OK'] }); return; } try { Blockbench.showStatusMessage('Fetching avatar data...', 2000); const url = `https://crafthead.net/hytale/profile/${encodeURIComponent(username.trim())}`; const response = await fetch(url); if (!response.ok) { throw new Error(`Failed to fetch avatar: ${response.status} ${response.statusText}`); } const data = await response.json(); // Extract the skin data from the crafthead response const avatarData = data.skin || data; if (!avatarData || typeof avatarData !== 'object') { throw new Error('Invalid avatar data received from server'); } const cachedAssetsPath = localStorage.getItem('hytale_assets_path'); if (cachedAssetsPath) { loadAvatar(avatarData, cachedAssetsPath).catch((err) => { Blockbench.showMessageBox({ title: 'Error', message: `Error loading avatar: ${err.message}`, buttons: ['OK'] }); }); } else { const assetsZipPath = expandPath('%appdata%\\Hytale\\install\\release\\package\\game\\latest'); Blockbench.showMessageBox({ title: 'Select Assets Folder', message: '**Select the extracted Assets folder**\n\n' + '**Instructions:**\n\n' + '1. Extract `Assets.zip` from:\n' + ' 📁 `%appdata%\\Hytale\\install\\release\\package\\game\\latest`\n\n' + '2. Navigate to the extracted Assets folder\n\n' + '3. Select the Assets folder when prompted\n\n' + '⚠️ **Important:** You must extract Assets.zip first before selecting the folder.\n\n' + 'This path will be saved for future use.', buttons: ['OK'] }, () => { if (typeof Blockbench.pickDirectory === 'function') { const assetsDir = Blockbench.pickDirectory({ title: 'Select Assets Folder (extracted)', resource_id: 'avatar_assets_folder' }); if (!assetsDir) { Blockbench.showMessageBox({ title: 'Error', message: 'You must select the Assets folder', buttons: ['OK'] }); return; } localStorage.setItem('hytale_assets_path', assetsDir); loadAvatar(avatarData, assetsDir).catch((err) => { Blockbench.showMessageBox({ title: 'Error', message: `Error loading avatar: ${err.message}`, buttons: ['OK'] }); }); } }); } } catch (err) { Blockbench.showMessageBox({ title: 'Error Loading Avatar', message: `Failed to load avatar from URL: ${err.message}`, buttons: ['OK'] }); console.error('Error loading avatar from URL:', err); } } }); changeAssetsFolderAction = new Action('change_hytale_assets_folder', { name: 'Change Hytale Assets Folder', description: 'Change the location of the Hytale assets folder', icon: 'folder_open', condition: {formats: ['hytale_character']}, click: function() { function expandPath(path) { if (path.includes('%appdata%')) { try { const appDataPath = SystemInfo.appdata_directory || ''; return path.replace(/%appdata%/gi, appDataPath); } catch (err) { return path; } } return path; } function wrapPathForMessage(path, maxLength) { if (!path || !maxLength) return path; const parts = path.split('\\'); const lines = []; let currentLine = ''; for (const part of parts) { const nextLine = currentLine ? `${currentLine}\\${part}` : part; if (nextLine.length > maxLength && currentLine) { lines.push(currentLine); currentLine = part; } else { currentLine = nextLine; } } if (currentLine) lines.push(currentLine); return lines.join('\n'); } const currentPath = localStorage.getItem('hytale_assets_path'); const assetsZipPath = expandPath('%appdata%\\Hytale\\install\\release\\package\\game\\latest'); const displayCurrentPath = currentPath ? wrapPathForMessage(currentPath, 48) : ''; const message = currentPath ? `**Current Assets Folder:**\n${displayCurrentPath}\n\n**Instructions:**\n\n1. Extract \`Assets.zip\` from:\n 📁 \`%appdata%\\Hytale\\install\\release\\package\\game\\latest\`\n\n2. Select the extracted Assets folder when prompted` : '**Instructions:**\n\n1. Extract `Assets.zip` from:\n 📁 `%appdata%\\Hytale\\install\\release\\package\\game\\latest`\n\n2. Select the extracted Assets folder when prompted'; Blockbench.showMessageBox({ title: 'Change Assets Folder', message: message, buttons: ['OK'] }, () => { if (typeof Blockbench.pickDirectory === 'function') { const assetsDir = Blockbench.pickDirectory({ title: 'Select Assets Folder (extracted)', resource_id: 'avatar_assets_folder' }); if (!assetsDir) { return; } localStorage.setItem('hytale_assets_path', assetsDir); Blockbench.showMessageBox({ title: 'Success', message: `Assets folder updated to:\n${wrapPathForMessage(assetsDir, 48)}`, buttons: ['OK'] }); } }); } }); MenuBar.addAction(loadAction, 'file.import'); MenuBar.addAction(loadFromUrlAction, 'file.import'); MenuBar.addAction(changeAssetsFolderAction, 'file.preferences'); function getTextureGroupsFromCollections() { if (typeof Collection === 'undefined' || !Collection.all || typeof TextureGroup === 'undefined' || !TextureGroup.all) return []; const groups = []; for (const collection of Collection.all) { const group = TextureGroup.all.find(tg => tg.name === collection.name); if (group) groups.push(group); } return groups; } function getTexturesFromGroups(groups) { if (!groups || groups.length === 0) return []; const textures = []; for (const group of groups) { const groupTextures = typeof group.getTextures === 'function' ? group.getTextures() : Texture.all.filter(t => t.group === group.uuid); textures.push(...groupTextures); } return textures.filter(Boolean); } function resolveMissingTextures() { const collectionGroups = getTextureGroupsFromCollections(); if (!collectionGroups || collectionGroups.length === 0) { Blockbench.showMessageBox({ title: 'Resolve Textures', message: 'No texture groups were found.', buttons: ['OK'] }); return; } const groupTextures = getTexturesFromGroups(collectionGroups); Undo.initEdit({ textures: groupTextures, texture_groups: collectionGroups }); for (const group of collectionGroups) { const textures = typeof group.getTextures === 'function' ? group.getTextures() : Texture.all.filter(t => t.group === group.uuid); group.remove(); for (const texture of textures) { texture.group = ''; } } Undo.finishEdit('Resolve texture groups'); Blockbench.showStatusMessage('Resolved texture groups', 3000); if (typeof BARS !== 'undefined' && typeof BARS.updateConditions === 'function') { BARS.updateConditions(); } } if (typeof BarItems !== 'undefined' && BarItems.resolve_textures_hytale_avatar) { BarItems.resolve_textures_hytale_avatar.delete(); } resolveTexturesAction = new Action('resolve_textures_hytale_avatar', { name: 'Resolve Textures', description: 'Resolve missing texture paths', icon: 'fa-leaf', category: 'textures', condition: () => getTextureGroupsFromCollections().length > 0, click: resolveMissingTextures }); resolveTexturesAction.uniqueNode = true; function addResolveButtonToTexturesToolbar() { const texturesPanel = Panels.textures || Interface?.Panels?.textures; const panelToolbar = texturesPanel?.toolbars?.[0]; const listToolbar = (typeof Toolbars !== 'undefined' && Toolbars.texturelist) ? Toolbars.texturelist : null; const toolbar = panelToolbar || listToolbar; if (!toolbar) return false; const actionId = resolveTexturesAction?.id || 'resolve_textures_hytale_avatar'; const removeDuplicates = (tb) => { if (!tb || !tb.children) return; const dupes = tb.children.filter(child => child && child.id === actionId); for (const child of dupes) { tb.remove(child, false); } tb.remove(resolveTexturesAction, false); }; removeDuplicates(panelToolbar); removeDuplicates(listToolbar); if (!toolbar.children.includes(resolveTexturesAction)) { toolbar.add(resolveTexturesAction, 3); } return true; } let resolveToolbarAttempts = 0; const resolveToolbarInterval = setInterval(() => { if (addResolveButtonToTexturesToolbar() || resolveToolbarAttempts > 50) { clearInterval(resolveToolbarInterval); } resolveToolbarAttempts++; }, 200); }, onunload() { if (loadAction) loadAction.delete(); if (loadFromUrlAction) loadFromUrlAction.delete(); if (changeAssetsFolderAction) changeAssetsFolderAction.delete(); if (resolveTexturesAction) resolveTexturesAction.delete(); window.hytaleAvatarLoaderInitialized = false; } }); function getPath() { if (typeof require !== 'undefined') { try { return require('path'); } catch (err) { } } return null; } function parseJsonFile(file) { if (file && file.content) { try { return JSON.parse(file.content); } catch (err) { } } return null; } function ensureDir(fsSync, dir) { if (!fsSync.existsSync(dir)) { fsSync.mkdirSync(dir, { recursive: true }); } } function getRelativePathFromCommon(texturePath, commonPath) { let relativePath = texturePath; if (relativePath.startsWith(commonPath)) { relativePath = relativePath.substring(commonPath.length); if (relativePath.startsWith('/') || relativePath.startsWith('\\')) { relativePath = relativePath.substring(1); } } return relativePath; } function getOutputPathFromTexture(texturePath, commonPath, tempDir, pathJoin) { const normalizedPath = getRelativePathFromCommon(texturePath, commonPath).replace(/\\/g, '/'); const pathParts = normalizedPath.split('/').filter(p => p); const fileName = pathParts.pop(); const outputDir = pathJoin(tempDir, ...pathParts); const outputPath = pathJoin(outputDir, fileName); return { outputDir, outputPath }; } function updateTextureUv(texture) { if (!texture) return; let width = texture.width; let height = texture.height; if ((!width || !height) && texture.img && texture.img.width && texture.img.height) { width = texture.img.width; height = texture.img.height; texture.width = width; texture.height = height; } if (width && height) { if (texture.uv_width !== width || texture.uv_height !== height) { texture.uv_width = width; texture.uv_height = height; } } } function scheduleTextureUvUpdates(textures, delays, postUpdate) { const run = () => { for (const tex of textures) { updateTextureUv(tex); } if (postUpdate) postUpdate(); }; for (const delay of delays) { setTimeout(run, delay); } } async function loadAvatar(avatarData, assetsBasePath) { try { Blockbench.showStatusMessage('Loading avatar...', 2000); if (Format.id !== 'hytale_character') { if (typeof Format.select === 'function') { Format.select('hytale_character'); await new Promise(resolve => setTimeout(resolve, 500)); } } if (typeof Project.newProject === 'function') { Project.newProject('hytale_character'); await new Promise(resolve => setTimeout(resolve, 300)); } if (Project.name !== undefined) { Project.name = 'Avatar'; } const path = getPath(); if (!path) { Blockbench.showMessageBox({ title: 'Error', message: 'Path module is not available. This plugin requires the desktop version of Blockbench.', buttons: ['OK'] }); return; } const pathJoin = path.join; const fs = requireNativeModule('fs'); function findAssetsPath(basePath) { const normalizedPath = basePath.replace(/\\/g, '/'); if (normalizedPath.endsWith('Assets') || normalizedPath.endsWith('Assets/')) { return basePath; } if (normalizedPath.includes('Assets/') || normalizedPath.includes('Assets\\')) { const assetsIndex = Math.max(normalizedPath.lastIndexOf('Assets/'), normalizedPath.lastIndexOf('Assets\\')); if (assetsIndex !== -1) { const assetsPath = basePath.substring(0, assetsIndex + 'Assets'.length); const cosmeticsPath = pathJoin(assetsPath, 'Cosmetics', 'CharacterCreator'); if (fs.existsSync(cosmeticsPath)) { return assetsPath; } } } const possiblePaths = [ pathJoin(basePath, 'Assets'), pathJoin(basePath, '..', 'Assets'), pathJoin(basePath, '..', '..', 'Assets'), pathJoin(basePath, '..', '..', '..', 'Assets') ]; for (const possiblePath of possiblePaths) { if (fs.existsSync(possiblePath)) { const cosmeticsPath = pathJoin(possiblePath, 'Cosmetics', 'CharacterCreator'); if (fs.existsSync(cosmeticsPath)) { return possiblePath; } } } return null; } const actualAssetsPath = findAssetsPath(assetsBasePath); if (!actualAssetsPath) { Blockbench.showMessageBox({ title: 'Error: Assets Folder Not Found', message: `**Could not find the Assets folder**\n\n` + `**Selected path:**\n\`${assetsBasePath}\`\n\n` + `**Please verify:**\n\n` + `• You selected the extracted Assets folder (not the zip file)\n` + `• The folder contains: \`Cosmetics\\CharacterCreator\\\`\n` + `• The folder contains: \`Common\\\`\n\n` + `The Assets folder should be extracted from Assets.zip.`, buttons: ['OK'] }); return; } const characterCreatorPath = pathJoin(actualAssetsPath, 'Cosmetics', 'CharacterCreator'); if (!fs.existsSync(characterCreatorPath)) { Blockbench.showMessageBox({ title: 'Error: CharacterCreator Folder Not Found', message: `**Could not find CharacterCreator folder**\n\n` + `**Assets path:**\n\`${actualAssetsPath}\`\n\n` + `**Expected path:**\n\`${characterCreatorPath}\`\n\n` + `Please verify that the Assets folder is correctly extracted from Assets.zip.`, buttons: ['OK'] }); return; } const mappingFiles = { 'haircut': 'Haircuts.json', 'pants': 'Pants.json', 'overpants': 'Overpants.json', 'undertop': 'Undertops.json', 'overtop': 'Overtops.json', 'shoes': 'Shoes.json', 'headAccessory': 'HeadAccessory.json', 'faceAccessory': 'FaceAccessory.json', 'earAccessory': 'EarAccessory.json', 'gloves': 'Gloves.json', 'cape': 'Capes.json', 'face': 'Faces.json', 'eyes': 'Eyes.json', 'eyebrows': 'Eyebrows.json', 'facialHair': 'FacialHair.json', 'bodyCharacteristic': 'BodyCharacteristics.json', 'ears': 'Ears.json', 'mouth': 'Mouths.json', 'underwear': 'Underwear.json' }; const mappingFilePaths = []; for (const [key, fileName] of Object.entries(mappingFiles)) { const filePath = pathJoin(characterCreatorPath, fileName); mappingFilePaths.push(filePath); } const hairColorsPath = pathJoin(characterCreatorPath, 'HairColors.json'); const eyeColorsPath = pathJoin(characterCreatorPath, 'EyeColors.json'); const genericColorsPath = pathJoin(characterCreatorPath, 'GenericColors.json'); const gradientSetsPath = pathJoin(characterCreatorPath, 'GradientSets.json'); Blockbench.read([hairColorsPath, eyeColorsPath, genericColorsPath, gradientSetsPath, ...mappingFilePaths], { readtype: 'text' }, (files) => { const mappings = {}; const parsedFiles = files.map(parseJsonFile); const hairColors = parsedFiles[0]; const eyeColors = parsedFiles[1]; const genericColors = parsedFiles[2]; const gradientSets = parsedFiles[3]; const mappingKeys = Object.keys(mappingFiles); for (let i = 0; i < mappingKeys.length; i++) { const mappingData = parsedFiles[i + 4]; if (mappingData) { mappings[mappingKeys[i]] = mappingData; } } if (Object.keys(mappings).length === 0) { Blockbench.showMessageBox({ title: 'Error: Mapping Files Not Found', message: `**Could not load mapping files**\n\n` + `**Searched path:**\n\`${characterCreatorPath}\`\n\n` + `**Please verify:**\n\n` + `• The Assets folder contains \`Cosmetics\\CharacterCreator\\\`\n` + `• The CharacterCreator folder contains JSON mapping files\n` + `• The Assets folder was correctly extracted from Assets.zip`, buttons: ['OK'] }); return; } continueLoadingAvatar(avatarData, actualAssetsPath, mappings, pathJoin, hairColors, eyeColors, genericColors, gradientSets); }); } catch (err) { throw err; } } function getGradientSetForField(field, item, gradientSets, variantItem = null, itemId = null) { if (!gradientSets || !Array.isArray(gradientSets)) { return null; } const findSet = (id) => gradientSets.find(gs => gs.Id === id); const fieldToGradientSet = { 'bodyCharacteristic': 'Skin', 'haircut': 'Hair', 'eyebrows': 'Hair', 'eyes': 'Eyes_Gradient', 'facialHair': 'Hair' }; const gradientSetId = fieldToGradientSet[field]; if (gradientSetId) { const found = findSet(gradientSetId); if (found) return found; } const itemToUse = variantItem || item; if (itemToUse && itemToUse.GradientSet) { const found = findSet(itemToUse.GradientSet); if (found) return found; } if (itemToUse && itemToUse.MaterialType) { const found = findSet(itemToUse.MaterialType); if (found) return found; } const clothingFields = new Set([ 'undertop', 'overtop', 'pants', 'overpants', 'shoes', 'gloves', 'cape', 'headAccessory', 'faceAccessory', 'earAccessory', 'underwear' ]); if (clothingFields.has(field)) { const checkGradientSet = (searchText) => { const lowerText = searchText.toLowerCase(); const matchers = [ ['Colored_Cotton', (t) => t.includes('colored_cotton') || t.includes('coloredcotton') || t.includes('colored_')], ['Shiny_Fabric', (t) => t.includes('shiny_fabric') || t.includes('shinyfabric')], ['Fantasy_Cotton', (t) => t.includes('fantasy_cotton') || t.includes('fantasycotton') || (t.includes('fantasy') && !t.includes('dark'))], ['Pastel_Cotton', (t) => t.includes('pastel_cotton') || t.includes('pastelcotton') || t.includes('pastel')], ['Faded_Leather', (t) => t.includes('faded_leather') || t.includes('fadedleather') || t.includes('leather')], ['Flashy_Synthetic', (t) => t.includes('flashy_synthetic') || t.includes('flashysynthetic') || t.includes('synthetic')], ['Jean_Generic', (t) => t.includes('jean') || t.includes('jeans') || t.includes('denim')], ['Fantasy_Cotton_Dark', (t) => t.includes('dark_fantasy') || t.includes('darkfantasy')], ['Ornamented_Metal', (t) => t.includes('ornamented_metal') || t.includes('ornamentedmetal') || t.includes('metal')], ['Rotten_Fabric', (t) => t.includes('rotten_fabric') || t.includes('rottenfabric')] ]; for (const [id, test] of matchers) { if (test(lowerText)) return findSet(id); } return null; }; const greyscaleTexture = itemToUse ? itemToUse.GreyscaleTexture : null; const itemIdToCheck = itemId || (item ? item.Id : null); if (greyscaleTexture) { const textureGradient = checkGradientSet(greyscaleTexture); if (textureGradient) { return textureGradient; } } if (itemIdToCheck) { const itemGradient = checkGradientSet(itemIdToCheck); if (itemGradient) { return itemGradient; } } const defaultGradientSet = gradientSets.find(gs => gs.Id === 'Colored_Cotton'); if (defaultGradientSet) { return defaultGradientSet; } } return null; } function applyGradientMap(baseImagePath, gradientMapPath, outputPath, fs, pathJoin) { return new Promise((resolve, reject) => { try { const fsSync = requireNativeModule('fs'); const baseBuffer = fsSync.readFileSync(baseImagePath); const gradientBuffer = fsSync.readFileSync(gradientMapPath); const baseBlob = new Blob([baseBuffer], { type: 'image/png' }); const gradientBlob = new Blob([gradientBuffer], { type: 'image/png' }); const baseUrl = URL.createObjectURL(baseBlob); const gradientUrl = URL.createObjectURL(gradientBlob); const baseCanvas = document.createElement('canvas'); const baseCtx = baseCanvas.getContext('2d'); const baseImg = new Image(); baseImg.onload = () => { baseCanvas.width = baseImg.width; baseCanvas.height = baseImg.height; baseCtx.drawImage(baseImg, 0, 0); const baseImageData = baseCtx.getImageData(0, 0, baseCanvas.width, baseCanvas.height); const gradientCanvas = document.createElement('canvas'); const gradientCtx = gradientCanvas.getContext('2d'); const gradientImg = new Image(); gradientImg.onload = () => { gradientCanvas.width = 256; gradientCanvas.height = 1; gradientCtx.drawImage(gradientImg, 0, 0, 256, 1); const gradientMapData = gradientCtx.getImageData(0, 0, 256, 1); const outputCanvas = document.createElement('canvas'); const outputCtx = outputCanvas.getContext('2d'); outputCanvas.width = baseCanvas.width; outputCanvas.height = baseCanvas.height; const outputImageData = outputCtx.createImageData(baseCanvas.width, baseCanvas.height); const isColorfulTexture = baseImagePath.toLowerCase().includes('colorful.png'); const basePathLower = baseImagePath.toLowerCase().replace(/\\/g, '/'); const isSkinTexture = basePathLower.includes('player_textures') || basePathLower.includes('faces') || basePathLower.includes('ears') || basePathLower.includes('mouths') || basePathLower.includes('makeup') || basePathLower.includes('cosmetics/head') || basePathLower.includes('earring'); const grayscaleThreshold = 1; const whiteThreshold = 255; for (let i = 0; i < baseImageData.data.length; i += 4) { const r = baseImageData.data[i]; const g = baseImageData.data[i + 1]; const b = baseImageData.data[i + 2]; const a = baseImageData.data[i + 3]; const minChannel = Math.min(r, g, b); const maxChannel = Math.max(r, g, b); const avgChannel = (r + g + b) / 3; const isWhite = minChannel >= whiteThreshold && avgChannel >= whiteThreshold; if (isColorfulTexture) { const luminance = Math.round( r * 0.299 + g * 0.587 + b * 0.114 ); if (luminance >= whiteThreshold) { outputImageData.data[i] = 255; outputImageData.data[i + 1] = 255; outputImageData.data[i + 2] = 255; outputImageData.data[i + 3] = a; } else { const gradientIndex = Math.min(255, Math.max(0, luminance)) * 4; outputImageData.data[i] = gradientMapData.data[gradientIndex]; outputImageData.data[i + 1] = gradientMapData.data[gradientIndex + 1]; outputImageData.data[i + 2] = gradientMapData.data[gradientIndex + 2]; outputImageData.data[i + 3] = a; } } else { if (isWhite && !isSkinTexture) { outputImageData.data[i] = r; outputImageData.data[i + 1] = g; outputImageData.data[i + 2] = b; outputImageData.data[i + 3] = a; } else { const isGrayscale = (maxChannel - minChannel) <= grayscaleThreshold; if (isGrayscale) { const luminance = Math.round( r * 0.299 + g * 0.587 + b * 0.114 ); const gradientIndex = Math.min(255, Math.max(0, luminance)) * 4; outputImageData.data[i] = gradientMapData.data[gradientIndex]; outputImageData.data[i + 1] = gradientMapData.data[gradientIndex + 1]; outputImageData.data[i + 2] = gradientMapData.data[gradientIndex + 2]; outputImageData.data[i + 3] = a; } else { outputImageData.data[i] = r; outputImageData.data[i + 1] = g; outputImageData.data[i + 2] = b; outputImageData.data[i + 3] = a; } } } } outputCtx.putImageData(outputImageData, 0, 0); outputCanvas.toBlob((blob) => { URL.revokeObjectURL(baseUrl); URL.revokeObjectURL(gradientUrl); if (!blob) { reject(new Error('Failed to create blob from canvas')); return; } const reader = new FileReader(); reader.onload = () => { try { const pathModule = requireNativeModule('path'); const outputDir = pathModule.dirname(outputPath); if (!fsSync.existsSync(outputDir)) { fsSync.mkdirSync(outputDir, { recursive: true }); } const buffer = Buffer.from(reader.result); fsSync.writeFileSync(outputPath, buffer); resolve(); } catch (err) { reject(err); } }; reader.onerror = () => { reject(new Error('Failed to read blob')); }; reader.readAsArrayBuffer(blob); }, 'image/png'); }; gradientImg.onerror = () => { URL.revokeObjectURL(baseUrl); URL.revokeObjectURL(gradientUrl); reject(new Error('Failed to load gradient image')); }; gradientImg.src = gradientUrl; }; baseImg.onerror = () => { URL.revokeObjectURL(baseUrl); URL.revokeObjectURL(gradientUrl); reject(new Error('Failed to load base image')); }; baseImg.src = baseUrl; } catch (err) { reject(err); } }); } async function processTexturesWithGradientMaps(itemInfo, assetsBasePath, gradientSets, mappings, pathJoin, fs) { const parentDir = pathJoin(assetsBasePath, '..'); const baseTempDir = pathJoin(parentDir, 'temp_avatar_loader'); const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_').substring(0, 19); const tempDir = pathJoin(baseTempDir, timestamp); try { ensureDir(fs, baseTempDir); ensureDir(fs, tempDir); } catch (err) { throw new Error(`Failed to create temp directory: ${err.message}`); } const processedTextures = new Map(); let processedCount = 0; let skippedCount = 0; let bodyCharacteristicColor = null; for (const info of itemInfo) { if (info.field === 'bodyCharacteristic' && info.color) { bodyCharacteristicColor = info.color; } if (!info.texturePath) { skippedCount++; continue; } if (!fs.existsSync(info.texturePath)) { skippedCount++; continue; } if (!info.color) { const item = info.item || (info.field !== 'bodyCharacteristic' && mappings[info.field] ? mappings[info.field].find(i => i.Id === info.itemId) : null); const variantItem = info.variantItem; const itemToUse = variantItem || item; let gradientSetToUse = null; let colorToUse = null; if (itemToUse && itemToUse.GradientSet) { gradientSetToUse = gradientSets.find(gs => gs.Id === itemToUse.GradientSet); if (gradientSetToUse && bodyCharacteristicColor) { colorToUse = bodyCharacteristicColor; } } else if ((info.field === 'face' || info.field === 'ears') && bodyCharacteristicColor) { gradientSetToUse = gradientSets.find(gs => gs.Id === 'Skin'); colorToUse = bodyCharacteristicColor; } if (gradientSetToUse && colorToUse && gradientSetToUse.Gradients && gradientSetToUse.Gradients[colorToUse]) { const gradient = gradientSetToUse.Gradients[colorToUse]; const gradientMapPath = pathJoin(assetsBasePath, 'Common', gradient.Texture); if (fs.existsSync(gradientMapPath) && fs.existsSync(info.texturePath)) { const commonPath = pathJoin(assetsBasePath, 'Common'); const { outputDir, outputPath } = getOutputPathFromTexture(info.texturePath, commonPath, tempDir, pathJoin); try { ensureDir(fs, outputDir); await applyGradientMap(info.texturePath, gradientMapPath, outputPath, fs, pathJoin); info.texturePath = outputPath; processedTextures.set(info.texturePath, outputPath); processedCount++; } catch (err) { } continue; } } const commonPath = pathJoin(assetsBasePath, 'Common'); const { outputDir, outputPath } = getOutputPathFromTexture(info.texturePath, commonPath, tempDir, pathJoin); try { ensureDir(fs, outputDir); const fsSync = requireNativeModule('fs'); fsSync.copyFileSync(info.texturePath, outputPath); info.texturePath = outputPath; processedTextures.set(info.texturePath, outputPath); processedCount++; } catch (err) { } continue; } const item = info.item || (info.field !== 'bodyCharacteristic' && mappings[info.field] ? mappings[info.field].find(i => i.Id === info.itemId) : null); const variantItem = info.variantItem; const gradientSet = getGradientSetForField(info.field, item, gradientSets, variantItem, info.itemId); if (!gradientSet || !gradientSet.Gradients) { skippedCount++; continue; } const gradient = gradientSet.Gradients[info.color]; if (!gradient || !gradient.Texture) { skippedCount++; continue; } const gradientMapPath = pathJoin(assetsBasePath, 'Common', gradient.Texture); if (!fs.existsSync(gradientMapPath)) { skippedCount++; continue; } if (!fs.existsSync(info.texturePath)) { skippedCount++; continue; } const commonPath = pathJoin(assetsBasePath, 'Common'); const { outputDir, outputPath } = getOutputPathFromTexture(info.texturePath, commonPath, tempDir, pathJoin); try { ensureDir(fs, outputDir); await applyGradientMap(info.texturePath, gradientMapPath, outputPath, fs, pathJoin); info.texturePath = outputPath; processedTextures.set(info.texturePath, outputPath); processedCount++; } catch (err) { if (err.message && err.message.includes('No image processing library')) { throw err; } } } return processedTextures; } async function continueLoadingAvatar(avatarData, assetsBasePath, mappings, pathJoin, hairColors, eyeColors, genericColors, gradientSets) { try { const loadOrder = [ 'bodyCharacteristic', 'underwear', 'pants', 'undertop', 'overtop', 'overpants', 'shoes', 'face', 'eyes', 'eyebrows', 'mouth', 'ears', 'haircut', 'facialHair', 'headAccessory', 'faceAccessory', 'earAccessory', 'gloves', 'cape' ]; const modelPaths = []; const texturePaths = []; const itemInfo = []; for (const field of loadOrder) { const value = avatarData[field]; if (!value) continue; const { itemId, color, variant } = parseValue(value); if (field === 'bodyCharacteristic') { const commonPath = pathJoin(assetsBasePath, 'Common'); const modelPath = pathJoin(commonPath, 'Characters', 'Player.blockymodel'); modelPaths.push(modelPath); let texturePath = null; if (itemId === 'Muscular') { texturePath = pathJoin(commonPath, 'Characters', 'Player_Textures', 'Player_Muscular_Greyscale.png'); } else if (itemId === 'Default') { texturePath = pathJoin(commonPath, 'Characters', 'Player_Textures', 'Player_Greyscale.png'); } itemInfo.push({ field, itemId, color, variant, modelPath, texturePath, item: null, variantItem: null }); if (texturePath) { texturePaths.push(texturePath); } continue; } const mapping = mappings[field]; if (!mapping) { continue; } const item = mapping.find(i => i.Id === itemId); if (!item) { continue; } let modelPath = null; let texturePath = null; if (variant && item.Variants && item.Variants[variant]) { const variantItem = item.Variants[variant]; modelPath = variantItem.Model; if (variantItem.Textures && typeof variantItem.Textures === 'object' && !Array.isArray(variantItem.Textures) && color) { if (variantItem.Textures[color]) { texturePath = variantItem.Textures[color].Texture; } else { const availableColors = Object.keys(variantItem.Textures); if (availableColors.length > 0) { texturePath = variantItem.Textures[availableColors[0]].Texture; } } } if (!texturePath && variantItem.GreyscaleTexture) { texturePath = variantItem.GreyscaleTexture; } } else { modelPath = item.Model; if (item.Textures && typeof item.Textures === 'object' && !Array.isArray(item.Textures) && color) { if (item.Textures[color]) { texturePath = item.Textures[color].Texture; } else { const availableColors = Object.keys(item.Textures); if (availableColors.length > 0) { texturePath = item.Textures[availableColors[0]].Texture; } } } if (!texturePath && item.GreyscaleTexture) { texturePath = item.GreyscaleTexture; } } if (modelPath) { const commonPath = pathJoin(assetsBasePath, 'Common'); const fullModelPath = pathJoin(commonPath, modelPath); modelPaths.push(fullModelPath); const fullTexturePath = texturePath ? pathJoin(commonPath, texturePath) : null; let variantItem = null; if (variant && item.Variants && item.Variants[variant]) { variantItem = item.Variants[variant]; } itemInfo.push({ field, itemId, color, variant, modelPath: fullModelPath, texturePath: fullTexturePath, item: item, variantItem: variantItem }); if (texturePath) { texturePaths.push(fullTexturePath); } } } const fs = requireNativeModule('fs'); if (gradientSets && fs) { try { await processTexturesWithGradientMaps(itemInfo, assetsBasePath, gradientSets, mappings, pathJoin, fs); Blockbench.showStatusMessage('Gradientmaps processed successfully', 2000); } catch (err) { Blockbench.showStatusMessage(`Error processing gradientmaps: ${err.message}`, 3000); } } Blockbench.read(modelPaths, { readtype: 'text' }, async (modelFiles) => { await loadAllModels(modelFiles, itemInfo, pathJoin, assetsBasePath); }); } catch (err) { throw err; } } function parseValue(value) { const parts = value.split('.'); const itemId = parts[0]; let color = null; let variant = null; if (parts.length === 2) { color = parts[1]; } else if (parts.length === 3) { color = parts[1]; variant = parts[2]; } else if (parts.length > 3) { color = parts[1]; variant = parts.slice(2).join('.'); } return { itemId, color, variant }; } function normalizeBoneOffsets(nodes) { if (!Array.isArray(nodes)) return; for (const node of nodes) { if (!node) continue; if (node.shape && node.shape.type === 'none' && node.shape.offset) { node.shape.offset = { x: 0, y: 0, z: 0 }; } if (node.children && Array.isArray(node.children)) { normalizeBoneOffsets(node.children); } } } async function loadAllModels(modelFiles, itemInfo, pathJoin, assetsBasePath) { const isMainModel = (field) => field === 'bodyCharacteristic'; for (let i = 0; i < modelFiles.length && i < itemInfo.length; i++) { const modelFile = modelFiles[i]; const info = itemInfo[i]; if (!modelFile || !modelFile.content) { continue; } try { const modelData = JSON.parse(modelFile.content); const texturePath = info.texturePath; if (isMainModel(info.field)) { await loadMainModel(modelData, texturePath, modelFile.path, info); } else { await loadAttachmentModel(modelData, texturePath, modelFile.path, info); } } catch (err) { } } try { if (typeof Canvas.updateView === 'function' && Project.root) { Canvas.updateView(); } await loadAnimations(pathJoin, assetsBasePath); Blockbench.showStatusMessage('Avatar loaded successfully', 3000); } catch (err) { Blockbench.showStatusMessage('Avatar processed', 3000); } } async function loadAnimations(pathJoin, assetsBasePath) { try { const fs = requireNativeModule('fs'); if (!fs) return; const animationsPath = pathJoin(assetsBasePath, 'Common', 'Characters', 'Animations', 'Default'); if (!fs.existsSync(animationsPath)) { return; } const files = fs.readdirSync(animationsPath); const animationFiles = files.filter(file => file.endsWith('.blockyanim') && !file.endsWith('_FPS.blockyanim') ); if (animationFiles.length === 0) { return; } const animationPaths = animationFiles.map(file => pathJoin(animationsPath, file)); Blockbench.read(animationPaths, { readtype: 'text' }, (files) => { for (const file of files) { if (!file || !file.content) continue; try { const content = JSON.parse(file.content); parseAnimationFile(file, content); } catch (err) { console.error(`Error parsing animation ${file.path}:`, err); } } }); } catch (err) { console.error('Error loading animations:', err); } } function parseAnimationFile(file, content) { const FPS = 60; const Animation = window.Animation; if (!Animation) { console.error('Animation class not available'); return; } function pathToName(path, includeExtension) { if (typeof window.pathToName === 'function') { return window.pathToName(path, includeExtension); } const parts = (path || '').split(/[/\\]/); const fileName = parts[parts.length - 1] || ''; if (includeExtension) { return fileName; } return fileName.replace(/\.[^.]*$/, ''); } const animation = new Animation({ name: pathToName(file.name || file.path, false), length: content.duration / FPS, loop: content.holdLastKeyframe ? "hold" : "loop", path: file.path, snapping: FPS }); const quaternion = new THREE.Quaternion(); const euler = new THREE.Euler(0, 0, 0, "ZYX"); for (const name in content.nodeAnimations) { const anim_data = content.nodeAnimations[name]; const group_name = name; const group = Group.all.find((g) => g.name == group_name); const uuid = group ? group.uuid : guid(); const ba = new BoneAnimator(uuid, animation, group_name); animation.animators[uuid] = ba; const anim_channels = [ { channel: "rotation", keyframes: anim_data.orientation }, { channel: "position", keyframes: anim_data.position }, { channel: "scale", keyframes: anim_data.shapeStretch }, { channel: "visibility", keyframes: anim_data.shapeVisible } ]; for (const { channel, keyframes } of anim_channels) { if (!keyframes || keyframes.length == 0) continue; for (const kf_data of keyframes) { let data_point; if (channel == "visibility") { data_point = { visibility: kf_data.delta }; } else { const delta = kf_data.delta; if (channel == "rotation") { quaternion.set(delta.x, delta.y, delta.z, delta.w); euler.setFromQuaternion(quaternion.normalize(), "ZYX"); data_point = { x: Math.radToDeg(euler.x), y: Math.radToDeg(euler.y), z: Math.radToDeg(euler.z) }; } else { data_point = { x: delta.x, y: delta.y, z: delta.z }; } } ba.addKeyframe({ time: kf_data.time / FPS, channel, interpolation: kf_data.interpolationType == "smooth" ? "catmullrom" : "linear", data_points: [data_point] }); } } } animation.add(false); if (!Animation.selected && Animator.open) { animation.select(); } } function loadMainModel(modelData, texturePath, filePath, info) { if (!modelData || !modelData.nodes || !Array.isArray(modelData.nodes)) { return; } if (typeof Codecs === 'undefined' || !Codecs.blockymodel) { return; } try { const content = Codecs.blockymodel.parse(modelData, filePath, {}); if (!content || !content.new_groups) { return; } let texturesToUse = []; if (texturePath) { try { let existingTexture = Texture.all.find(t => t.path === texturePath); if (existingTexture) { updateTextureUv(existingTexture); texturesToUse.push(existingTexture); } else { const texture = new Texture().fromPath(texturePath).add(false, true); scheduleTextureUvUpdates([texture], [100, 300, 500, 1000], () => { if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') { Canvas.updateAllFaces(); } }); texturesToUse.push(texture); } } catch (err) { } } if (content.new_textures && content.new_textures.length > 0) { if (texturePath) { for (const tex of content.new_textures) { if (tex.path !== texturePath && typeof tex.remove === 'function') { tex.remove(true); } else if (tex.path === texturePath) { updateTextureUv(tex); if (texturesToUse.length === 0) { texturesToUse.push(tex); } } } } else { for (const tex of content.new_textures) { updateTextureUv(tex); } if (texturesToUse.length === 0) { texturesToUse = content.new_textures; } } } scheduleTextureUvUpdates(texturesToUse, [300, 600, 1000], () => { if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') { Canvas.updateAllFaces(); } }); if (texturesToUse.length > 0) { const primaryTexture = texturesToUse[0]; const existingDefault = Texture.all.find(t => t.use_as_default); if (existingDefault && existingDefault !== primaryTexture) { existingDefault.use_as_default = false; } primaryTexture.use_as_default = true; if (typeof primaryTexture.setAsDefaultTexture === 'function') { primaryTexture.setAsDefaultTexture(); } if (typeof Cube !== 'undefined' && Cube.all) { const primaryTextureUuid = primaryTexture.uuid; for (const cube of Cube.all) { for (const faceKey of ['north', 'south', 'east', 'west', 'up', 'down']) { if (cube.faces && cube.faces[faceKey]) { const face = cube.faces[faceKey]; if (face.texture === null || face.texture === undefined) { face.texture = primaryTextureUuid; } } } } } setTimeout(() => { try { if (typeof Canvas !== 'undefined' && Canvas) { if (typeof Canvas.updateAllFaces === 'function') { Canvas.updateAllFaces(primaryTexture); } if (typeof Canvas.updateView === 'function' && Canvas.viewport) { Canvas.updateView(); } if (typeof Canvas.updateSelection === 'function') { Canvas.updateSelection(); } } } catch (err) { } }, 300); } } catch (err) { } } function loadAttachmentModel(modelData, texturePath, filePath, info) { if (!modelData || !modelData.nodes || !Array.isArray(modelData.nodes)) { return; } if (typeof Codecs === 'undefined' || !Codecs.blockymodel) { return; } const collectionName = info.itemId; const attachmentName = collectionName; try { normalizeBoneOffsets(modelData.nodes); const content = Codecs.blockymodel.parse(modelData, filePath, {attachment: attachmentName}); if (!content || !content.new_groups) { return; } const newGroups = content.new_groups; const rootGroups = newGroups.filter(group => !newGroups.includes(group.parent)); if (rootGroups.length === 0) { return; } if (content.new_textures && content.new_textures.length > 0) { for (const tex of content.new_textures) { if (texturePath && tex.path !== texturePath && typeof tex.remove === 'function') { tex.remove(true); } } } const collection = new Collection({ name: collectionName, children: rootGroups.map(g => g.uuid), export_codec: 'blockymodel', visibility: true }); collection.add(); collection.export_path = filePath; let texturesToProcess = []; if (texturePath) { try { let existingTexture = Texture.all.find(t => t.path === texturePath); if (existingTexture) { updateTextureUv(existingTexture); texturesToProcess.push(existingTexture); } else { const texture = new Texture().fromPath(texturePath).add(false); scheduleTextureUvUpdates([texture], [100, 300, 500, 1000], () => { if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') { Canvas.updateAllFaces(); } }); texturesToProcess.push(texture); } } catch (err) { } } else if (content.new_textures && content.new_textures.length > 0) { const matchingTexture = content.new_textures.find(t => t.path === texturePath); if (matchingTexture) { updateTextureUv(matchingTexture); texturesToProcess = [matchingTexture]; } else { const firstTexture = content.new_textures[0]; updateTextureUv(firstTexture); texturesToProcess = [firstTexture]; } } if (texturesToProcess.length > 0) { let textureGroup = TextureGroup.all.find(tg => tg.name === attachmentName); if (!textureGroup) { textureGroup = new TextureGroup({ name: attachmentName }); textureGroup.folded = true; textureGroup.add(); } for (const tex of texturesToProcess) { tex.group = textureGroup.uuid; updateTextureUv(tex); } scheduleTextureUvUpdates(texturesToProcess, [300, 600, 1000], () => { if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') { Canvas.updateAllFaces(); } }); let texture = texturesToProcess.find(t => t.name && t.name.startsWith(attachmentName)) || texturesToProcess[0]; if (texture && texture.uuid) { collection.texture = texture.uuid; } } Canvas.updateAllFaces(); } catch (err) { } } ================================================ FILE: plugins/hytale_bridge/about.md ================================================ This plugin is intended to be used with the Blockbench Bridge Hytale plugin installed. You cannot connect to Hytale without it. You can install it [here on CurseForge](https://www.curseforge.com/hytale/mods/bbb). Hytale Bridge allows to edit Hytale's Common assets (`.blockymodel` & `.png` files specifically) without leaving Blockbench, even on remote servers! You can connect to Hytale by running `/blockbench` in the console or as a player with the correct permissions in your server. You will receive an authorisation key which you can input alongside the server's connection address to form a bridge and sync all files! Once connected, you'll see all of the asset packs installed on your world, including all of their Common files. You're then free to open any model/texture into blockbench or save any of your creations into your own asset packs. Folder creation/management is also supported, so just Blockbench can manage your entire Common directory! Note this plugin is still in beta and some minor bugs are to be expected. I have many more ideas on how to further improve this project, and I'd love to hear all of your thoughts and feedback. ### Usage 1. Go to the Hytale File Browser Panel > click on Connect to Hytale 2. Input the server address and the key provided by Hytale to connect. 3. Left/Right click folders and files to interact 4. Request files at any time by going to File > Request Hytale Files ================================================ FILE: plugins/hytale_bridge/changelog.json ================================================ { "0.1.0": { "title": "0.1.0", "date": "2026-02-10", "author": "Tazer", "categories": [ { "title": "Features", "list": [ "Initial release!" ] } ] }, "0.1.1": { "title": "0.1.1", "date": "2026-02-22", "author": "Tazer", "categories": [ { "title": "Changes", "list": [ "Changed default port in connection dialog to 5520, to match Hytale's", "Updated some descriptions to match the Hytale plugin better" ] } ] } } ================================================ FILE: plugins/hytale_bridge/hytale_bridge.js ================================================ let net, fs; let requestFileTreeAction, connectToHytaleAction; let panel, menu; let usedAddress = 'localhost:5520'; const bridgeState = { client: null, uuid: null, buffer: '' }; const MESSAGES = { CREATE: 'create', COMMAND: 'command', CREATED: 'created', FILE_TREE: 'fileTree', FILE: 'file', UPDATE: 'update' }; const COMMANDS = { FILE_TREE: 'fileTree', FILE: 'file', SAVE: 'save', RENAME_FOLDER: 'renameFolder', DELETE_FOLDER: 'deleteFolder', RENAME_FILE: 'renameFile', DELETE_FILE: 'deleteFile', DISCONNECT: 'disconnect' }; const EXTENSIONS = { MODEL: '.blockymodel', TEXTURE: '.png' } function is(name, extension) { return name.endsWith(extension); } BBPlugin.register("hytale_bridge", { title: "Hytale Bridge", author: "Tazer", icon: "icon.png", version: "0.1.1", description: "A Hytale/Blockbench plugin that bridges the two together seamlessly and effortlessly", tags: ["Hytale"], dependencies: ["hytale_plugin"], variant: "desktop", min_version: "5.0.7", creation_date: "2026-02-10", await_loading: true, has_changelog: true, repository: "https://github.com/tazercopter/Hytale-Blockbench-Bridge", bug_tracker: "https://github.com/tazercopter/Hytale-Blockbench-Bridge/issues", onload() { createPanel(); net = require('net', { message: "This permission is required to connect to the remote Hytale server socket.", optional: false }) fs = require('fs', { message: "This permission is required to access stored files and encode their data when uploading.", optional: false }) requestFileTreeAction = new Action('request_file_tree', { name: 'Request Hytale Files', icon: 'cloud_download', click() { if (bridgeState.client) requestFileTree(); } }); MenuBar.addAction(requestFileTreeAction, 'file'); connectToHytaleAction = new Action('connect_to_hytale', { name: 'Connect to Hytale', icon: 'add', click() { menu.connect(); } }); MenuBar.addAction(connectToHytaleAction, 'file'); }, onunload() { if (panel) panel.delete(); if (requestFileTreeAction) requestFileTreeAction.delete(); if (connectToHytaleAction) connectToHytaleAction.delete(); if (bridgeState.client) { sendDisconnect(); bridgeState.client.end(); } } }); function createPanel() { panel = new Panel({ id: 'hytale_file_browser', name: 'Hytale File Browser', icon: 'folder_open', resizable: true, growable: true, expand_button: true, default_side: 'left', default_position: { slot: 'left_bar', float_position: [0, 0], float_size: [300, 800], height: 400, }, component: { template: `
    {{ n.type==='folder' ? (n.expanded ? '📂' : '📁') : (n.fileType==='png' ? '🖼️' : n.fileType==='blockymodel' ? '🧊' : '📄') }} {{ n.name }}
    {{ item.label }}
    `, data() { return { connected: false, packs: {}, packNames: [], selectedPack: null, renderNodes: [], packData: {}, contextMenu: {} }; }, methods: { toggleConnection() { if (this.connected) { sendDisconnect(); bridgeState.client.end(); } else { this.connect(); } }, connect() { new Dialog({ title: 'Connect', form: { address: { label: 'Address', type: 'text', value: usedAddress }, key: { label: 'Key', type: 'text', value: '' } }, onConfirm: (formData) => { usedAddress = formData.address; connectToSocket(formData); } }).show(); }, getPackState(pack) { if (!this.packData[pack]) { this.packData[pack] = { expanded: new Set(), scroll: 0 }; } return this.packData[pack]; }, saveScrollPosition() { const el = this.$refs.treeScroll; if (!el || !this.selectedPack) return; this.getPackState(this.selectedPack).scroll = el.scrollTop; }, restoreScrollPosition() { const el = this.$refs.treeScroll; if (!el || !this.selectedPack) return; el.scrollTop = this.getPackState(this.selectedPack).scroll || 0; }, onPackChange() { this.rebuildTree(); }, updateFileTrees(newPacks) { this.packs = newPacks; this.packNames = Object.keys(newPacks); // mark disconnected when no packs this.connected = this.packNames.length > 0; if (!this.packNames.includes(this.selectedPack)) { this.selectedPack = this.packNames[0]; } this.rebuildTree(); }, rebuildTree() { this.renderNodes = []; const pack = this.packs[this.selectedPack]; if (!pack || !pack.entries) return; this.walkEntries(pack.entries, 0, ''); this.$nextTick(this.restoreScrollPosition); }, walkEntries(entries, level, basePath) { const state = this.getPackState(this.selectedPack); const names = Object.keys(entries); names.sort((a, b) => { const aIsFile = entries[a] === true; const bIsFile = entries[b] === true; if (aIsFile !== bIsFile) { return aIsFile ? 1 : -1; } return a.localeCompare(b); }); for (const name of names) { const value = entries[name]; const path = basePath ? basePath + '/' + name : name; const isFile = value === true; let fileType = ''; if (isFile) { if (is(name, EXTENSIONS.TEXTURE)) fileType = 'png'; else if (is(name, EXTENSIONS.MODEL)) fileType = 'blockymodel'; } const expanded = state.expanded.has(path); this.renderNodes.push({ name, path, level, type: isFile ? 'file' : 'folder', expanded, fileType, packImmutable: this.packs[this.selectedPack].immutable === true }); if (!isFile && expanded) { this.walkEntries(value, level + 1, path); } } }, onNodeClick(node) { this.hideContextMenu(); if (node.type === 'folder') { const state = this.getPackState(this.selectedPack); node.expanded = !node.expanded; if (node.expanded) { state.expanded.add(node.path); } else { state.expanded.delete(node.path); } this.rebuildTree(); } else { requestFile(node.path, this.selectedPack); } }, hideContextMenu() { this.contextMenu.visible = false; }, onNodeRightClick(node, event) { // TODO: override asset option? if (node.packImmutable) return; const options = []; if (node.type === 'folder') { options.push( { label: 'Save Model', action: () => this.rightClickFolderSaveModel(node) }, { label: 'Save Texture', action: () => this.rightClickFolderSaveTexture(node) }, { label: 'Rename Folder', action: () => this.rightClickFolderRename(node) }, { label: 'Delete Folder', action: () => this.rightClickFolderDelete(node) } ); } else { options.push( { label: 'Rename File', action: () => this.rightClickFileRename(node) }, { label: 'Delete File', action: () => this.rightClickFileDelete(node) } ); } this.contextMenu = { visible: true, x: event.clientX, y: event.clientY, options }; }, onPanelRightClick(event) { if (!this.connected || this.packs[this.selectedPack].immutable) return; const options = [ { label: 'Save Model', action: () => this.rightClickFolderSaveModel({ path: '' }) }, { label: 'Save Texture', action: () => this.rightClickFolderSaveTexture({ path: '' }) } ]; this.contextMenu = { visible: true, x: event.clientX, y: event.clientY, options }; }, rightClickFolderSaveModel({ path }) { const filePath = (path === '' ? '' : path + '/') + Project.name + '.blockymodel'; const nameDialog = new Dialog({ title: 'Save Model', width: 150, form: { file: { label: 'File', type: 'text', value: filePath } }, onConfirm: (formData) => { if (!is(formData.file, EXTENSIONS.MODEL)) { Blockbench.showMessageBox({ title: 'Error', message: 'Invalid file name given' }); return; } sendCommand(COMMANDS.SAVE, { path: formData.file, pack: this.selectedPack, // json blockymodel data data: Codecs.blockymodel.compile() }); this.applyUpdate(this.selectedPack, [formData.file], []) } }); nameDialog.show(); }, rightClickFolderSaveTexture({ path }) { const texture = Texture.selected; if (!texture) { Blockbench.showMessageBox({ title: 'No Texture Selected', message: 'Please select a texture to save.' }); return; } const filePath = (path === '' ? '' : path + '/') + texture.name; const nameDialog = new Dialog({ title: 'Save Texture', width: 150, form: { file: { label: 'File', type: 'text', value: filePath } }, onConfirm: (formData) => { if (!is(formData.file, EXTENSIONS.TEXTURE)) { Blockbench.showMessageBox({ title: 'Error', message: 'Invalid file name given' }); return; } const source = texture.source; let data; if (source.startsWith("data")) { data = source.split(',')[1]; } else { data = fs.readFileSync(source.split('?')[0]).toString('base64'); } sendCommand(COMMANDS.SAVE, { path: formData.file, pack: this.selectedPack, // base64 png data data: data }); this.applyUpdate(this.selectedPack, [formData.file], []) } }); nameDialog.show(); }, rightClickFolderRename(node) { const nameDialog = new Dialog({ title: 'Rename Folder', width: 150, form: { name: { label: 'Name', type: 'text', value: node.name } }, onConfirm: (formData) => { sendCommand(COMMANDS.RENAME_FOLDER, { path: node.path, pack: this.selectedPack, name: formData.name }); // move all nodes inside? } }); nameDialog.show(); }, rightClickFolderDelete(node) { sendCommand(COMMANDS.DELETE_FOLDER, { path: node.path, pack: this.selectedPack }); // delete all nodes inside? }, rightClickFileRename(node) { const nameDialog = new Dialog({ title: 'Rename File', width: 150, form: { name: { label: 'Name', type: 'text', value: node.name } }, onConfirm: (formData) => { sendCommand(COMMANDS.RENAME_FILE, { path: node.path, pack: this.selectedPack, name: formData.name }); const newPath = node.path.split('/').slice(0, -1).concat(formData.name).join('/'); this.applyUpdate(this.selectedPack, [newPath], [node.path]) } }); nameDialog.show(); }, rightClickFileDelete(node) { sendCommand(COMMANDS.DELETE_FILE, { path: node.path, pack: this.selectedPack }); this.applyUpdate(this.selectedPack, [], [node.path]) }, addFile(pack, path) { const parts = path.split('/'); const name = parts.pop(); let current = pack.entries; for (const part of parts) { if (!current[part] || current[part] === true) { current[part] = {}; } current = current[part]; } current[name] = true; }, deleteFile(pack, path) { const parts = path.split('/'); const name = parts.pop(); let current = pack.entries; for (const part of parts) { if (!current[part] || current[part] === true) return; current = current[part]; } delete current[name]; }, applyUpdate(pack, added, deleted) { pack = this.packs[pack]; if (!pack) return; added?.forEach(path => { this.addFile(pack, path); }); deleted?.forEach(path => { this.deleteFile(pack, path); }); this.rebuildTree(); } }, created() { menu = this; } } }); } function connectToSocket({ address, key }) { if (bridgeState.client) bridgeState.client.end(); bridgeState.client = new net.Socket(); const ip = address.split(":")[0]; const port = address.split(":")[1]; bridgeState.client.connect(port, ip, () => { bridgeState.client.write(JSON.stringify({ type: MESSAGES.CREATE, key }) + '\n'); }); bridgeState.client.on('close', () => { Blockbench.showMessageBox({ title: 'Disconnected!', message: 'The Hytale bridge was closed.' }); menu.updateFileTrees({}); }); bridgeState.client.on('error', (err) => { Blockbench.showMessageBox({ title: 'Error!', message: 'An error occurred with the bridge.' }); }); bridgeState.client.on('data', data => { bridgeState.buffer += data.toString(); let i; while ((i = bridgeState.buffer.indexOf('\n')) !== -1) { const raw = bridgeState.buffer.slice(0, i); bridgeState.buffer = bridgeState.buffer.slice(i + 1); if (!raw.trim()) continue; const message = JSON.parse(raw); switch (message.type) { case MESSAGES.CREATED: { bridgeState.uuid = message.uuid; requestFileTree(); // POPUP break; } case MESSAGES.FILE_TREE: { menu.updateFileTrees(message.packs); break; } case MESSAGES.FILE: { openFile(message); break; } case MESSAGES.UPDATE: { menu.applyUpdate(message.pack, message.added, message.deleted); break; } default: console.log("Unknown message type received from server", message.type); } } }); } function sendCommand(command, data = {}) { if (!bridgeState.client) return; bridgeState.client.write(JSON.stringify({ type: MESSAGES.COMMAND, uuid: bridgeState.uuid, command, ...data }) + '\n'); } function sendDisconnect() { sendCommand(COMMANDS.DISCONNECT); } function requestFileTree() { sendCommand(COMMANDS.FILE_TREE); } function requestFile(path, pack) { sendCommand(COMMANDS.FILE, { path, pack }); } function openFile(message) { if (is(message.path, EXTENSIONS.MODEL)) { try { Codecs.blockymodel.load(message.data, { path: message.path, origin: 'Hytale Bridge' }); } catch { // POPUP } } else if (is(message.path, EXTENSIONS.TEXTURE)) { try { if (!Project) return; const name = message.path.split('/').pop(); const dataUrl = 'data:image/png;base64,' + message.data; // get or create texture let texture = Texture.all.find(t => t.name === name); if (!texture) { texture = new Texture({ name }); texture.add(false); } texture.fromDataURL(dataUrl); texture.load(() => { // update uv size let size = [texture.width, texture.display_height]; let frames = texture.frameCount; if (settings.detect_flipbook_textures.value == false || frames <= 2 || frames % 1) { size[1] = texture.height; } texture.uv_width = size[0]; texture.uv_height = size[1]; texture.select(); Canvas.updateAll(); // POPUP }); Canvas.updateAll(); } catch { } } } ================================================ FILE: plugins/hytale_hitbox_helper/about.md ================================================ **Hytale Hitbox Helper** is a dedicated plugin for Blockbench designed to streamline the creation and export of collision hitboxes for Hytale. ## Features * **Dedicated Format:** Adds a new "Hytale Hitbox" project type. * **Quick Add:** One-click button to add a standard 32x32x32 hitbox. * **Multiple Hitboxes:** It supports adding multiple Hitboxes. * **Smart Export:** * Exports strictly to Hytale's `.json` format. * Only exports elements named "hitbox" (case insensitive). * Automatic coordinate conversion (32 BB units = 1.0 Hytale unit). * **References:** You can import other reference block mode models; they do not interfere with the hitbox. ## References Models If you go to **File > Import** you can Import a model to use it as reference, it has to be (.blockymodel) It wont be imported. ## How to Use 1. Go to **File > New** and select **Hytale Hitbox**. 2. Use the **Add Hitbox** button in the "Add Element" menu (sidebar). 3. Resize and position your hitboxes as needed. * *Note: Ensure the elements are named "hitbox" in the outliner.* 4. Go to **File > Export > Export Hytale Hitbox (.json)** ================================================ FILE: plugins/hytale_hitbox_helper/hytale_hitbox_helper.js ================================================ (function() { let export_action; let add_hitbox_action; let import_reference_action; let original_conditions = {}; const HITBOX_FORMAT_ID = 'hytale_hitbox'; const actions_to_hide = [ 'import_project', 'import_bbmodel', 'import_obj', 'import_gltf', 'import_image', 'extrude_texture' ]; function generateHitboxTexture() { const canvas = document.createElement('canvas'); const size = 128; canvas.width = size; canvas.height = size; const ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, size, size); ctx.strokeStyle = '#ff0000'; const lineWidth = 2; ctx.lineWidth = lineWidth; const offset = lineWidth / 2; ctx.strokeRect(offset, offset, size - lineWidth, size - lineWidth); return canvas.toDataURL('image/png'); } BBPlugin.register('hytale_hitbox_helper', { title: 'Hytale Hitbox Helper', author: 'Marck.A.A', icon: 'icon.png', description: 'Tool to create easy Hytale hitboxes exportable to JSON.', min_version: '4.8.0', version: '1.0.1', variant: 'both', onload() { const format = new ModelFormat(HITBOX_FORMAT_ID, { name: 'Hytale Hitbox', description: 'A simple format for creating Hytale hitboxes, exportable to JSON.', icon: 'icon-format_hytale', category: 'hytale', target: 'Hytale', block_size: 32, centered_grid: true, optional_box_uv: true, box_uv: false, single_texture: false, uv_rotation: true, per_texture_uv_size: true, bone_rig: true, rotate_cubes: false, onActivation() { document.body.classList.add('hytale_hitbox_mode'); let existing_tex = Texture.all.find(t => t.id === 'hitbox_wireframe_tex'); if (existing_tex) { existing_tex.fromDataURL(generateHitboxTexture()); } Blockbench.showQuickMessage("Hytale Hitbox Mode Active"); }, onDeactivation() { document.body.classList.remove('hytale_hitbox_mode'); } }); Blockbench.addCSS(` body.hytale_hitbox_mode #panel_textures, body.hytale_hitbox_mode #panel_uv { display: none !important; } `); actions_to_hide.forEach(action_id => { if (BarItems[action_id]) { original_conditions[action_id] = BarItems[action_id].condition; BarItems[action_id].condition = () => { if (Format.id === HITBOX_FORMAT_ID) return false; return Condition(original_conditions[action_id]); }; } }); import_reference_action = new Action('import_hytale_reference', { name: 'Import Reference (.blockymodel)', icon: 'fa-file-import', category: 'file', condition: () => Format.id === HITBOX_FORMAT_ID, click: function() { Blockbench.import({ extensions: ['blockymodel'], type: 'Blockymodel Reference', readtype: 'text', multiple: true }, function(files) { if (!files || files.length === 0) return; if (!Codecs.blockymodel) { Blockbench.showMessageBox({ title: 'Missing Plugin', message: 'The official Hytale plugin is required to read .blockymodel files.' }); return; } let imported_root_groups = []; let original_id = Format.id; Undo.initEdit({outliner: true}); Format.id = 'hytale_prop'; files.forEach(file => { try { let json = JSON.parse(file.content); let content = Codecs.blockymodel.parse(json, file.path, { import_to_current_project: true }); if (content && content.new_groups) { let new_groups = content.new_groups; let imported_tex = content.new_textures && content.new_textures.length > 0 ? content.new_textures[0] : null; new_groups.forEach(g => { if (!new_groups.includes(g.parent)) { imported_root_groups.push(g); } if (imported_tex) { g.children.forEach(child => { if (child instanceof Cube) { for (const key in child.faces) { child.faces[key].texture = imported_tex.uuid; } } }); } }); } } catch (err) { console.error("Error importing file:", file.name, err); } }); Format.id = original_id; if (imported_root_groups.length > 0) { Undo.finishEdit('Import Reference (Base)'); setTimeout(() => { Undo.initEdit({outliner: true, elements: [], groups: []}); unselectAll(); let ref_group = Group.all.find(g => g.name.toLowerCase() === 'reference'); if (!ref_group) { ref_group = new Group({ name: 'reference', isOpen: true }).init(); } imported_root_groups.forEach(g => { g.addTo(ref_group); }); unselectAll(); Undo.finishEdit('Format Reference'); Canvas.updateAllFaces(); Blockbench.showQuickMessage('Reference imported, textured and grouped!'); }, 50); } else { Undo.cancelEdit(); } }); } }); add_hitbox_action = new Action('add_hytale_hitbox', { name: 'Add Hitbox', icon: 'fa-cube', category: 'edit', condition: () => Format.id === HITBOX_FORMAT_ID, click: function() { let hitbox_texture = Texture.all.find(t => t.id === 'hitbox_wireframe_tex'); if (!hitbox_texture) { hitbox_texture = new Texture({ id: 'hitbox_wireframe_tex', name: 'Hitbox Wireframe' }).add(); hitbox_texture.fromDataURL(generateHitboxTexture()); } const mesh = new Cube({ name: 'hitbox', color: 2, from: [-16, 0, -16], to: [16, 32, 16], autouv: 0 }); for (const key in mesh.faces) { mesh.faces[key].texture = hitbox_texture.uuid; mesh.faces[key].uv = [0, 0, 16, 16]; } mesh.init(); Undo.initEdit({elements: [mesh], textures: [hitbox_texture], outliner: true}); Undo.finishEdit('Add Hytale Hitbox'); Canvas.updateAllFaces(); } }); BarItems.add_element.side_menu.addAction(add_hitbox_action); MenuBar.menus.file.addAction(import_reference_action, 'import'); export_action = new Action('export_hytale_hitbox', { name: 'Export Hytale Hitbox (.json)', icon: 'fa-file-export', category: 'file', condition: () => Format.id === HITBOX_FORMAT_ID, click: function() { exportHytaleHitbox(); } }); MenuBar.menus.file.addAction(export_action, 'export'); }, onunload() { actions_to_hide.forEach(action_id => { if (BarItems[action_id] && original_conditions[action_id] !== undefined) { BarItems[action_id].condition = original_conditions[action_id]; } }); export_action.delete(); add_hitbox_action.delete(); import_reference_action.delete(); } }); function exportHytaleHitbox() { const hitboxes = Cube.all.filter(cube => cube.name.toLowerCase() === 'hitbox' && cube.export ); if (hitboxes.length === 0) { Blockbench.showMessageBox({ title: 'No Hitboxes found', message: 'No elements called "hitbox" were found to export.' }); return; } let json_output = { "Boxes": [] }; hitboxes.forEach(cube => { json_output.Boxes.push({ "Min": { "X": (cube.from[0] + 16) / 32, "Y": cube.from[1] / 32, "Z": (cube.from[2] + 16) / 32 }, "Max": { "X": (cube.to[0] + 16) / 32, "Y": cube.to[1] / 32, "Z": (cube.to[2] + 16) / 32 } }); }); const content = JSON.stringify(json_output, null, 2); Blockbench.export({ type: 'JSON Model', extensions: ['json'], name: Project.name || 'hitbox', content: content, resource_id: 'hytale_hitbox' }); } })(); ================================================ FILE: plugins/hytale_plugin/about.md ================================================ This plugin adds support for the `.blockymodel` and `.blockyanim` file formats that can be used to create and edit models for Hytale. Select a Hytale format from the start screen and click Create New Model to get started! ## Features ### Hytale modeling support * Support for opening, editing, and saving models for Hytale * A customized workspace and validation to ensure models are created in a compatible way * Automatic UV sizes that are locked to face dimensions to ensure UV consistency * The stretch tool and sliders can be used to adjust cube sizes without affecting UV * Attachment support built on collections. Attachments are anything from hairstyles to clothing items and weapons that can alter the design of a character. ### Hytale animation support * Support for animations for Hytale models * Visibility keyframes * UV Offset keyframes * Quaternion-based interpolation * Keyframe-wrapping for looping animations ### Quality-of-life features that the Hytale team uses! * Hytale preview scene and player reference model, to use as a size reference * UV Cycling: Click in the UV editor multiple times to cycle between overlapping faces at that spot * Hold Alt while moving elements to duplicate them * A thicker and always visible pivot marker to ensure the pivot point is well visible. The group pivot is also shown when editing child cubes, so you always know where geometry will rotate from when animating. * Clear, outline-only UV editor mode to make it easier to work with overlapping UVs. Enable UV Outline Only in the settings * Copy-Paste with Magenta Alpha setting, to improve copy-pasting from and to Photoshop (which doesn't support copy pasting with transparency) * Toggle to lock attachments from editing, hiding them from the outliner and viewport selection * Reload all attachments action to quickly refresh attachment geometry from disk ## Usage tips ### Guidelines * As a size reference, the center grid in a new Hytale project represents one block in-game. This measures either 32 pixels for props and blocks or 64 pixels for characters and attachments. Hytale preview scene and player model reference can be enabled from the Preview Options menu and are another useful size reference. * Models should not have more than 255 nodes. Nodes are a concept in the Hytale model format, each group counts as a node, and each cube/quad counts except if it's the first cube in a respective group. The number of nodes can be seen by clicking on the element counter above the outliner. * Scale keyframes animate the stretch value of the attached cube. When animating scale, counter-animate the position if you want to scale from the side, and keep in mind that child bones and other cubes are not affected by the scale. * UVs must always match the dimensions of their face, the format does not consider custom UV sizes. ### Notes about nodes and shapes Hytale's Blockymodel format works slightly different from how Blockbench usually works. In Edit mode this difference is not noticable and hidden by the importer and exporter. However, in animations, some features may behave differently due to this. Hytale uses "Nodes", which are a combination of a group (for the transformation and hierarchy) and a cube (for the visual part). Position and Rotation animations target the group, so all child groups and cubes inherit it. However, Scale, Visibility and UV Offset only target the Shape itself, so it only applies to the cube. In practice, in your Blockbench project, this cube is the first cube that is a direct child of the group and does not have its own rotation. This cube gets exported as the shape of a node and is targeted by its animations and not counted as an extra node towards the node count limit. If there are more cubes or they have their own rotation, they will get exported as separate nodes. ================================================ FILE: plugins/hytale_plugin/changelog.json ================================================ { "0.1.0": { "title": "0.1.0", "date": "2025-10-20", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Initial release!" ] }, { "title": "Fixes", "list": [ "Fixed plugin not existing" ] } ] }, "0.2.0": { "title": "0.2.0", "date": "2025-11-16", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Blockymodel file format support (.blockymodel)", "Animation import and export with 60 FPS support (.blockyanim)", "Auto import textures and animations when opening models", "Attachment loading system", "Quad support in blockymodel import", "Action to create quads", "Cube properties support (shading mode, double-sided)", "Smooth quaternion interpolation for animations" ] }, { "title": "Improvements", "list": [ "Auto UV always enabled for consistent texture mapping", "Block size set to 32 to match Hytale coordinates" ] }, { "title": "Fixes", "list": [ "Fixed animation export format issues", "Fixed importing of removed faces" ] } ] }, "0.3.0": { "title": "0.3.0", "date": "2025-12-16", "author": "JannisX11 & Kanno", "categories": [ { "title": "Features", "list": [ "Added multiple model formats (Hytale Character, Hytale Prop)", "Added visibility keyframe support for animating element visibility", "Added node count validation with 255 node limit warning", "Added custom always-visible pivot marker", "Added setting to preview texture when selected", "Added UV face cycling - click overlapping faces to cycle through them", "Added isPiece flag on folders", "Added workaround setting for transparency issues in Photoshop", "Display node count in model stats" ] }, { "title": "Improvements", "list": [ "Auto find textures for models", "Improved animation import and saving workflow", "Attachment system improvements - export, quick save, and reload actions", "Format auto-detection based on file path", "Removed separate attachment format - now integrated into main formats", "Keep auto UV on to ensure consistent pixel ratio" ] }, { "title": "Fixes", "list": [ "Fixed attachment root bone offset", "Fixed attachment texture loading issues", "Fixed attachment export issue", "Fixed stretch animations displaying incorrectly", "Fixed UV cycle not working with fast texture switching", "Fixed forced auto UV applying in other formats", "Fixed texture selection issue on import" ] } ] }, "0.3.1": { "title": "0.3.1", "date": "2025-12-16", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed handling of transparent faces in bbmodel export" ] } ] }, "0.3.2": { "title": "0.3.2", "date": "2025-12-19", "author": "JannisX11 & Kanno", "categories": [ { "title": "Features", "list": [ "Group pivot is now visible when editing cubes underneath it", "Added settings to customize the group pivot indicator", "Support for duplicate node names in animations", "Collection panel can now default to open via settings", "Added format page note with UV size information" ] }, { "title": "Improvements", "list": [ "Clarity and visibility improvements in UV editor", "Improved import, export, and counting of main shapes" ] }, { "title": "Fixes", "list": [ "Fixed animation saving bug", "Fixed UV cycling issue when editing UV", "Fixed stretched cube resize drift", "Fixed Auto UV issues", "Temporarily disabled stretch resize code to fix UV issue" ] } ] }, "0.4.0": { "title": "0.4.0 - Early Access", "date": "2025-12-22", "author": "JannisX11 & Kanno", "categories": [ { "title": "This plugin is now Open Source and in Early Access 🎉", "list": [ "Licensed under the GNU General Public License", "Copyright © 2025 Hypixel Studios Canada inc." ] }, { "title": "Features", "list": [ "Toggle to lock attachments from editing", "Reload all attachments action", "Deleting a collection now removes its attachment" ] }, { "title": "Improvements", "list": [ "Hide pivot marker in paint mode", "UV outline only now defaults to off", "Static box naming to avoid duplicate animations" ] }, { "title": "Fixes", "list": [ "Fixed UV export rounding issue", "Fixed Auto UV boundary clamping", "Fixed unique name handling when grouping" ] } ] }, "0.4.1": { "title": "0.4.1", "date": "2025-12-31", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed an issue with cubes that are not in a group not being exported", "Fixed import and export of quads", "Disabled inflate slider in Hytale projects", "Fixed issue where project name changes to attachment name when saving collection", "Improved rotation euler rounding", "Fixed textures assigned per face having an effect on the model. Textures can only be assigned per model or attachment.", "Added metadata to let Blockbench recommend the plugin for specific file types" ] } ] }, "0.5.0": { "title": "0.5.0", "date": "2026-01-03", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added Hytale preview scene, can be selected from Preview Options", "Added Hytale Player as a size reference, can be switched on from Preview Options" ] }, { "title": "Fixes", "list": [ "Fix missing resize handles for transforming layers", "Update tutorial links on format page", "Fix typo in about page" ] } ] }, "0.6.0": { "title": "0.6.0", "date": "2026-01-11", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Cube sizes are now limited to full integers by default. This can be disabled in the settings, however it is recommended to leave it on and use stretch instead.", "Added a validator to flag textures with the wrong pixel density. In the future, UV size will automatically adapt to texture size.", "Added info about scale keyframes to about page" ] }, { "title": "Fixes", "list": [ "Unless attachments are loaded, UI will now adapt single-texture workflow", "Fixed a preview issue with rotation keyframes", "Quads are no longer created with Box UV enabled if Box UV is the project default, and can no longer be set to Box UV", "Fixed settings categories" ] } ] }, "0.6.1": { "title": "0.6.1", "date": "2026-01-12", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed an issue with pixel density when generating a template" ] } ] }, "0.6.2": { "title": "0.6.2", "date": "2026-01-25", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed issue with saving multiple animations at once", "Fixed visibility keyframe applying to child nodes", "Fixed broken UV when importing attachment with default UV mode set to Box UV", "Fixed texture update issue in UV editor when switching textures", "Fixed animation length rounding issue in export", "Fixed Hytale formats being hidden in Streamer Mode", "Fixed group pivot marker appearing in screenshots" ] } ] }, "0.7.0": { "title": "0.7.0", "date": "2026-02-02", "author": "JannisX11", "categories": [ { "title": "Changes", "list": [ "Added UV Offset animation channel", "Groups now share the same marker color as their main cube when opening blockymodel", "Node visibility is now exported to and imported from blockymodels" ] }, { "title": "Fixes", "list": [ "Fixed an issue where some attachment models imported with incorrect node offsets", "Fixed export toggle not affecting which nodes are exported", "Fixed pivot marker appearing at the pivot of the wrong group in some scenarios", "Improved compatibility with Code View plugin" ] } ] }, "0.8.0": { "title": "0.8.0", "date": "2026-02-07", "author": "Kanno & JannisX11", "categories": [ { "title": "Features", "list": [ "Added shortcut to hold Alt while moving elements to duplicate them" ] }, { "title": "Fixes", "list": [ "Fixed an issue with the import offset of hairstyle attachments" ] } ] }, "0.8.1": { "title": "0.8.1", "date": "2026-02-16", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Float values are no longer allowed in UV offset keyframes and are now rounded to fix compatibility", "Fixed offset issues in saving attachment models", "Fixed duplicated rotation when importing attachments", "Fixed Alt + drag to duplicate still being active with no keybinding set" ] } ] }, "0.8.2": { "title": "0.8.2", "date": "2026-02-26", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added setting 'Auto-load Hytale Animations'" ] }, { "title": "Fixes", "list": [ "Fixed stretch keyframes always importing with uniform toggle enabled", "Fixed issue where saving an animation would omit nodes that are missing in the current model" ] } ] }, "0.8.3": { "title": "0.8.3", "date": "2026-03-08", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added toast notification to explain per-shape keyframes not applying." ] }, { "title": "Fixes", "list": [ "Fixed Alt + drag to duplicate activating when not in edit mode", "Fixed blockymodel export failing in certain configurations" ] } ] }, "0.8.4": { "title": "0.8.4", "date": "2026-03-24", "author": "JannisX11", "categories": [ { "title": "Changes", "list": [ "Utilize new Blockbench 5.1 feature to mark collections as saved or unsaved", "Added Import Attachment option to File > Import menu" ] }, { "title": "Fixes", "list": [ "Compatibility with Blockbench 5.1 changes to quaternions", "Fixed issue with importing animations in models with duplicate bone names", "Fixed Reload Attachment option showing up in unrelated formats" ] } ] }, "0.8.5": { "title": "0.8.5", "date": "2026-03-24", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed 5.1 compatibility issue", "Fixed compile animation issue" ] } ] }, "0.8.6": { "title": "0.8.6 (internal-only)", "date": "2026-04-02", "author": "Kanno", "categories": [ { "title": "Features", "list": [ "Added UV Canvas Resize tool to crop and resize texture canvas" ] } ] }, "0.9.0": { "title": "0.9.0", "date": "2026-04-12", "author": "Kanno, JannisX11", "categories": [ { "title": "Features", "list": [ "Added UV Canvas Resize tool to crop and resize texture canvas", "Added tool to change cube orientation while remaining static", "Pressing the Brush Tool keybinding repeatedly now cycles through brush presets" ] }, { "title": "Fixes", "list": [ "Fixed copy-pasting texture with magenta Photoshop fix using the selected texture instead of UV editor texture", "Fixed NaN export in animation if position or scale keyframe has non-numeric value" ] } ] }, "0.9.1": { "title": "0.9.1", "date": "2026-04-15", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Switching brush presets is no longer assigned to the brush key by default, but can be reassigned in the keybinding settings" ] } ] } } ================================================ FILE: plugins/hytale_plugin/hytale_plugin.js ================================================ (() => { // src/cleanup.ts var list = []; function track(...items) { list.push(...items); } function cleanup() { for (let deletable of list) { try { deletable.delete(); } catch (error) { console.error(error); } } list.empty(); } // src/config.ts var Config = { json_compile_options: { indentation: " ", final_newline: false } }; // src/util.ts function qualifiesAsMainShape(object) { return object instanceof Cube && object.rotation.allEqual(0); } function cubeIsQuad(cube) { if (!cube.size().some((val) => val == 0)) return false; let faces = Object.keys(cube.faces).filter((fkey) => cube.faces[fkey].texture !== null); if (faces.length > 1) return false; return true; } function getMainShape(group) { return group.children.find(qualifiesAsMainShape); } // src/blockymodel.ts function discoverTexturePaths(dirname, modelName) { let fs = requireNativeModule("fs"); let paths = []; let dirFiles = fs.readdirSync(dirname); for (let fileName of dirFiles) { if (fileName.match(/\.png$/i) && (fileName.startsWith(modelName) || fileName == "Texture.png")) { paths.push(PathModule.join(dirname, fileName)); } } let texturesFolderPath = PathModule.join(dirname, `${modelName}_Textures`); if (fs.existsSync(texturesFolderPath) && fs.statSync(texturesFolderPath).isDirectory()) { let folderFiles = fs.readdirSync(texturesFolderPath); for (let fileName of folderFiles) { if (fileName.match(/\.png$/i)) { paths.push(PathModule.join(texturesFolderPath, fileName)); } } } return [...new Set(paths)]; } function loadTexturesFromPaths(paths, preferredName) { const textures = []; for (let texturePath of paths) { let texture = Texture.all.find((t) => t.path == texturePath); if (!texture) { texture = new Texture().fromPath(texturePath).add(false, true); } textures.push(texture); } if (textures.length > 0) { let primary = preferredName && textures.find((t) => t.name.startsWith(preferredName)) || textures[0]; if (!Texture.all.find((t) => t.use_as_default)) { primary.use_as_default = true; } } return textures; } function promptForTextures(dirname) { Blockbench.showMessageBox({ title: "Import Textures", message: "No textures were found for this model. How would you like to import textures?", buttons: ["Select Files", "Select Folder", "Skip"] }, (choice) => { let project = Project; if (choice === 2 || !project) return; if (choice === 0) { Blockbench.import({ resource_id: "texture", extensions: ["png"], type: "PNG Textures", multiple: true, readtype: "image", startpath: dirname }, (files) => { if (Project !== project || files.length === 0) return; let paths = files.map((f) => f.path).filter((p) => !!p); loadTexturesFromPaths(paths); }); } else if (choice === 1) { let folderPath = Blockbench.pickDirectory({ title: "Select Texture Folder", startpath: dirname, resource_id: "texture" }); if (folderPath && Project === project) { let fs = requireNativeModule("fs"); let files = fs.readdirSync(folderPath); let pngFiles = files.filter((f) => f.match(/\.png$/i)); if (pngFiles.length === 0) { Blockbench.showQuickMessage("No PNG files found in selected folder"); return; } let paths = pngFiles.map((f) => PathModule.join(folderPath, f)); loadTexturesFromPaths(paths); } } }); } function setupBlockymodelCodec() { let codec = new Codec("blockymodel", { name: "Hytale Blockymodel", extension: "blockymodel", remember: true, support_partial_export: true, load_filter: { type: "json", extensions: ["blockymodel"] }, load(model, file, args = {}) { let path_segments = file.path && file.path.split(/[\\\/]/); let format = this.format; if (model.format) { if (model.format == "prop") { format = Formats.hytale_prop; } } else { if (path_segments && path_segments.includes("Blocks")) { format = Formats.hytale_prop; } } if (!args.import_to_current_project) { setupProject(format); } if (path_segments && isApp && this.remember && !file.no_file) { path_segments[path_segments.length - 1] = path_segments.last().split(".")[0]; Project.name = path_segments.findLast((p) => p != "Model" && p != "Models" && p != "Attachments") ?? "Model"; Project.export_path = file.path; } this.parse(model, file.path, args); if (file.path && isApp && this.remember && !file.no_file) { addRecentProject({ name: Project.name, path: Project.export_path, icon: Format.icon }); let project = Project; setTimeout(() => { if (Project == project) updateRecentProjectThumbnail(); }, 500); } Settings.updateSettingsInProfiles(); }, // MARK: Compile compile(options = {}) { let model = { nodes: [], format: Format.id == "hytale_prop" ? "prop" : "character", lod: "auto" }; let node_id = 1; let formatVector = (input) => { return new oneLiner({ x: input[0], y: input[1], z: input[2] }); }; function turnNodeIntoBox(node, cube, original_element) { let size = cube.size(); let stretch = cube.stretch.slice(); let offset = [ Math.lerp(cube.from[0], cube.to[0], 0.5) - original_element.origin[0], Math.lerp(cube.from[1], cube.to[1], 0.5) - original_element.origin[1], Math.lerp(cube.from[2], cube.to[2], 0.5) - original_element.origin[2] ]; node.shape.type = "box"; node.shape.settings.size = formatVector(size); node.shape.offset = formatVector(offset); if (cubeIsQuad(cube)) { node.shape.type = "quad"; let used_face = Object.keys(cube.faces).find((fkey) => cube.faces[fkey].texture != null); let normal = "+Z"; switch (used_face) { case "west": normal = "-X"; break; case "east": normal = "+X"; break; case "down": normal = "-Y"; break; case "up": normal = "+Y"; break; case "north": normal = "-Z"; break; case "south": normal = "+Z"; break; } node.shape.settings.normal = normal; delete node.shape.settings.size.z; if (normal.endsWith("X")) { node.shape.settings.size.x = size[2]; } else if (normal.endsWith("Y")) { node.shape.settings.size.y = size[2]; } } node.shape.stretch = formatVector(stretch); node.shape.visible = cube.visibility; node.shape.doubleSided = cube.double_sided == true; node.shape.shadingMode = cube.shading_mode; node.shape.unwrapMode = "custom"; if (cube == original_element) { node.shape.settings.isStaticBox = true; } const BBToHytaleDirection = { north: "back", south: "front", west: "left", east: "right", up: "top", down: "bottom" }; for (let fkey in cube.faces) { let flipMinMax = function(axis) { if (axis == 0 /* X */) { flip_x = !flip_x; if (flip_x) { uv_x = Math.max(face.uv[0], face.uv[2]); } else { uv_x = Math.min(face.uv[0], face.uv[2]); } } else { flip_y = !flip_y; if (flip_y) { uv_y = Math.max(face.uv[1], face.uv[3]); } else { uv_y = Math.min(face.uv[1], face.uv[3]); } } }; let face = cube.faces[fkey]; if (face.texture == null) continue; let direction = BBToHytaleDirection[fkey]; if (node.shape.type == "quad") direction = "front"; let flip_x = false; let flip_y = false; let uv_x = Math.min(face.uv[0], face.uv[2]); let uv_y = Math.min(face.uv[1], face.uv[3]); let UVAxis; ((UVAxis2) => { UVAxis2[UVAxis2["X"] = 0] = "X"; UVAxis2[UVAxis2["Y"] = 1] = "Y"; })(UVAxis || (UVAxis = {})); let mirror_x = false; let mirror_y = false; if (face.uv[0] > face.uv[2]) { mirror_x = true; flipMinMax(0 /* X */); } if (face.uv[1] > face.uv[3]) { mirror_y = true; flipMinMax(1 /* Y */); } let uv_rot = 0; switch (face.rotation) { case 90: { uv_rot = 270; if ((mirror_x || mirror_y) && !(mirror_x && mirror_y)) { uv_rot = 90; } flipMinMax(1 /* Y */); break; } case 180: { uv_rot = 180; flipMinMax(1 /* Y */); flipMinMax(0 /* X */); break; } case 270: { uv_rot = 90; if ((mirror_x || mirror_y) && !(mirror_x && mirror_y)) { uv_rot = 270; } flipMinMax(0 /* X */); break; } } let layout_face = { offset: new oneLiner({ x: Math.round(uv_x), y: Math.round(uv_y) }), mirror: new oneLiner({ x: mirror_x, y: mirror_y }), angle: uv_rot }; node.shape.textureLayout[direction] = layout_face; } } function getNodeOffset(group, include_original_offset = true) { let cube = getMainShape(group); if (cube) { let center_pos = cube.from.slice().V3_add(cube.to).V3_divide(2, 2, 2); center_pos.V3_subtract(group.origin); return center_pos; } else if (include_original_offset) { return group.original_offset; } else { return [0, 0, 0]; } } function compileNode(element, name = element.name) { if (!element.export) return void 0; if (!options.attachment) { let collection = Collection.all.find((c) => c.contains(element)); if (collection) return; } let euler = Reusable.euler1.set( Math.degToRad(element.rotation[0]), Math.degToRad(element.rotation[1]), Math.degToRad(element.rotation[2]), element.scene_object.rotation.order ); let quaternion = Reusable.quat1.setFromEuler(euler); let orientation = new oneLiner({ x: quaternion.x, y: quaternion.y, z: quaternion.z, w: quaternion.w }); let origin = element.origin.slice(); let offset = element instanceof Group ? getNodeOffset(element) : [0, 0, 0]; if (element.parent instanceof Group) { origin.V3_subtract(element.parent.origin); let parent_offset = getNodeOffset(element.parent, !options.attachment); if (parent_offset) { origin.V3_subtract(parent_offset); } } if (options.attachment && element instanceof Group && element.is_piece && element.original_position?.some((v) => v)) { origin = element.original_position; } let node = { id: node_id.toString(), name: name.replace(/^.+:/, ""), position: formatVector(origin), orientation, shape: { type: "none", offset: formatVector(offset), stretch: formatVector([1, 1, 1]), settings: { isPiece: element instanceof Group && element.is_piece || false }, textureLayout: {}, unwrapMode: "custom", visible: element.visibility, doubleSided: false, shadingMode: "flat" } }; node_id++; if (element instanceof Cube) { turnNodeIntoBox(node, element, element); } else if ("children" in element) { let shape_count = 0; let child_cube_count = 0; for (let child of element.children ?? []) { if (!child.export) continue; let result; if (qualifiesAsMainShape(child) && shape_count == 0) { turnNodeIntoBox(node, child, element); shape_count++; } else if (child instanceof Cube) { child_cube_count++; result = compileNode(child, child.name + "--C" + child_cube_count); } else if (child instanceof Group) { result = compileNode(child); } if (result) { if (!node.children) node.children = []; node.children.push(result); } } } return node; } let nodes = Outliner.root.filter((node) => node instanceof Group || node instanceof Cube); if (options.attachment instanceof Collection) { let in_collection = options.attachment.getChildren(); nodes = in_collection.filter((g) => { return g instanceof Group; }); } for (let node of nodes) { let compiled = compileNode(node); if (compiled) model.nodes.push(compiled); } if (options.raw) { return model; } else { return compileJSON(model, Config.json_compile_options); } }, // MARK: Parse parse(model, path, args = {}) { function parseVector(vec, fallback = [0, 0, 0]) { if (!vec) return fallback; return Object.values(vec).slice(0, 3); } const new_groups = []; const existing_groups = Group.all.slice(); function parseNode(node, parent_node, parent_group = "root", parent_offset) { if (args.attachment) { let attachment_node; if (args.attachment && node.shape?.settings?.isPiece === true && existing_groups.length) { let node_name = node.name; attachment_node = existing_groups.find((g) => g.name == node_name); } if (attachment_node) { parent_group = attachment_node; parent_node = null; } } let quaternion = new THREE.Quaternion(); quaternion.set(node.orientation.x, node.orientation.y, node.orientation.z, node.orientation.w); let rotation_euler = new THREE.Euler().setFromQuaternion(quaternion.normalize(), "ZYX"); let name = node.name; let offset = node.shape?.offset ? parseVector(node.shape?.offset) : [0, 0, 0]; let origin = parseVector(node.position); let original_position; let rotation = [ Math.roundTo(Math.radToDeg(rotation_euler.x), 3), Math.roundTo(Math.radToDeg(rotation_euler.y), 3), Math.roundTo(Math.radToDeg(rotation_euler.z), 3) ]; if (args.attachment && !parent_node && parent_group instanceof Group) { let reference_node = getMainShape(parent_group) ?? parent_group; original_position = origin; origin = reference_node.origin.slice(); } else if (parent_offset && parent_group instanceof Group) { origin.V3_add(parent_offset); origin.V3_add(parent_group.origin); } let group = null; if (!node.shape?.settings?.isStaticBox) { group = new Group({ name, autouv: 1, origin, rotation, visibility: node.shape?.visible != false }); new_groups.push(group); group.addTo(parent_group); if (!parent_node && args.attachment) { group.name = args.attachment + ":" + group.name; group.color = 1; group.rotation.V3_set(0, 0, 0); } group.init(); let custom_data = { is_piece: node.shape?.settings?.isPiece ?? false, original_position, original_offset: offset }; group.extend(custom_data); } else { name = name.replace(/--C\d+$/, ""); } if (node.shape.type != "none") { let switchIndices = function(arr, i1, i2) { temp = arr[i1]; arr[i1] = arr[i2]; arr[i2] = temp; }, resetFace = function(face_name) { cube.faces[face_name].texture = null; cube.faces[face_name].uv = [0, 0, 0, 0]; }; let size = parseVector(node.shape.settings.size); let stretch = parseVector(node.shape.stretch, [1, 1, 1]); if (node.shape.type == "quad") { let axis = node.shape.settings.normal?.substring(1) ?? "Z"; if (axis == "X") { size = [0, size[1], size[0]]; } else if (axis == "Y") { size.splice("XYZ".indexOf(axis), 0, 0); } else if (axis == "Z") { size[2] = 0; } } let cube = new Cube({ name, autouv: 1, box_uv: false, visibility: node.shape.visible != false, rotation: [0, 0, 0], stretch, from: [ -size[0] / 2 + origin[0] + offset[0], -size[1] / 2 + origin[1] + offset[1], -size[2] / 2 + origin[2] + offset[2] ], to: [ size[0] / 2 + origin[0] + offset[0], size[1] / 2 + origin[1] + offset[1], size[2] / 2 + origin[2] + offset[2] ] }); if (group) { group.color = cube.color; cube.origin.V3_set( Math.lerp(cube.from[0], cube.to[0], 0.5), Math.lerp(cube.from[1], cube.to[1], 0.5), Math.lerp(cube.from[2], cube.to[2], 0.5) ); } else { cube.extend({ origin, rotation }); } cube.extend({ // @ts-ignore shading_mode: node.shape.shadingMode, double_sided: node.shape.doubleSided }); let temp; let HytaleDirection; ((HytaleDirection2) => { HytaleDirection2["back"] = "back"; HytaleDirection2["front"] = "front"; HytaleDirection2["left"] = "left"; HytaleDirection2["right"] = "right"; HytaleDirection2["top"] = "top"; HytaleDirection2["bottom"] = "bottom"; })(HytaleDirection || (HytaleDirection = {})); const HytaleToBBDirection = { back: "north", front: "south", left: "west", right: "east", top: "up", bottom: "down" }; const normal_faces = { "-X": "west", "+X": "east", "-Y": "down", "+Y": "up", "-Z": "north", "+Z": "south" }; if (node.shape.settings.size) { let parseUVVector = function(vec, fallback = [0, 0]) { if (!vec) return fallback; return Object.values(vec).slice(0, 2); }; let normal_face = node.shape.type == "quad" && normal_faces[node.shape.settings.normal]; for (let key in HytaleDirection) { let face_name = HytaleToBBDirection[key]; let uv_source = node.shape.textureLayout[key]; if (normal_face == face_name) { if (face_name != "south") resetFace("south"); uv_source = node.shape.textureLayout["front"]; } if (!uv_source) { resetFace(face_name); continue; } let uv_offset = parseUVVector(uv_source.offset); let uv_size = [ size[0], size[1] ]; let uv_mirror = [ uv_source.mirror.x ? -1 : 1, uv_source.mirror.y ? -1 : 1 ]; let uv_rotation = uv_source.angle; switch (key) { case "left": { uv_size[0] = size[2]; break; } case "right": { uv_size[0] = size[2]; break; } case "top": { uv_size[1] = size[2]; break; } case "bottom": { uv_size[1] = size[2]; break; } } let result = [0, 0, 0, 0]; switch (uv_rotation) { case 90: { switchIndices(uv_size, 0, 1); switchIndices(uv_mirror, 0, 1); uv_mirror[0] *= -1; result = [ uv_offset[0], uv_offset[1] + uv_size[1] * uv_mirror[1], uv_offset[0] + uv_size[0] * uv_mirror[0], uv_offset[1] ]; break; } case 270: { switchIndices(uv_size, 0, 1); switchIndices(uv_mirror, 0, 1); uv_mirror[1] *= -1; result = [ uv_offset[0] + uv_size[0] * uv_mirror[0], uv_offset[1], uv_offset[0], uv_offset[1] + uv_size[1] * uv_mirror[1] ]; break; } case 180: { uv_mirror[0] *= -1; uv_mirror[1] *= -1; result = [ uv_offset[0] + uv_size[0] * uv_mirror[0], uv_offset[1] + uv_size[1] * uv_mirror[1], uv_offset[0], uv_offset[1] ]; break; } case 0: { result = [ uv_offset[0], uv_offset[1], uv_offset[0] + uv_size[0] * uv_mirror[0], uv_offset[1] + uv_size[1] * uv_mirror[1] ]; break; } } cube.faces[face_name].rotation = uv_rotation; cube.faces[face_name].uv = result; } } cube.addTo(group || parent_group).init(); } if (node.children?.length && group instanceof Group) { if (args.attachment && node.shape.settings.isPiece) { offset = [0, 0, 0]; } for (let child of node.children) { parseNode(child, node, group, offset); } } } for (let node of model.nodes) { parseNode(node, null); } let new_textures = []; if (isApp && path) { let project = Project; let dirname = PathModule.dirname(path); let model_file_name = pathToName(path, false); let fs = requireNativeModule("fs"); let texture_paths = discoverTexturePaths(dirname, model_file_name); if (texture_paths.length > 0 && !args.attachment) { new_textures = loadTexturesFromPaths(texture_paths, Project.name); } else if (texture_paths.length > 0) { new_textures = loadTexturesFromPaths(texture_paths); } if (new_textures.length === 0 && !args.attachment) { setTimeout(() => { if (Project !== project) return; promptForTextures(dirname); }, 100); } if (!args?.attachment && settings.auto_load_hytale_animations.value) { let listener = Blockbench.on("select_mode", ({ mode }) => { if (mode.id != "animate" || project != Project) return; listener.delete(); let anim_path = PathModule.resolve(dirname, "../Animations/"); try { let anim_folders = fs.existsSync(anim_path) ? fs.readdirSync(anim_path) : []; for (let folder of anim_folders) { if (folder.includes(".")) continue; let path2 = PathModule.resolve(anim_path, folder); let anim_files = fs.readdirSync(path2); for (let file_name of anim_files) { if (file_name.match(/\.blockyanim$/i)) { let file_path = PathModule.resolve(path2, file_name); let content = fs.readFileSync(file_path, "utf-8"); let json = autoParseJSON(content); parseAnimationFile({ name: file_name, path: file_path }, json); } } } } catch (err) { console.error(err); } }); } } return { new_groups, new_textures }; }, // MARK: Other async export(options) { if (Object.keys(this.export_options).length) { let result = await this.promptExportOptions(); if (result === null) return; } Blockbench.export({ resource_id: "model", type: this.name, extensions: [this.extension], name: this.fileName(), startpath: this.startPath(), content: this.compile(options), custom_writer: isApp ? (a, b) => this.write(a, b) : null }, (path) => this.afterDownload(path)); }, async exportCollection(collection) { this.context = collection; await this.export({ attachment: collection }); if ("saved" in collection) collection.saved = true; this.context = null; }, async writeCollection(collection) { this.context = collection; this.write(this.compile({ attachment: collection }), collection.export_path); if ("saved" in collection) collection.saved = true; this.context = null; } }); let export_action = new Action("export_blockymodel", { name: "Export Hytale Blockymodel", description: "Export a blockymodel file", icon: "icon-format_hytale", category: "file", condition: { formats: FORMAT_IDS }, click: function() { codec.export(); } }); codec.export_action = export_action; track(codec, export_action); MenuBar.menus.file.addAction(export_action, "export.1"); let hook = Blockbench.on("quick_save_model", () => { if (FORMAT_IDS.includes(Format.id) == false) return; for (let collection of Collection.all) { if (collection.export_codec != codec.id) continue; codec.writeCollection(collection); } }); track(hook); return codec; } // src/formats.ts var FORMAT_IDS = [ "hytale_character", "hytale_prop" ]; function setupFormats() { let codec = setupBlockymodelCodec(); let common = { category: "hytale", target: "Hytale", codec, forward_direction: "+z", single_texture_default: true, animation_files: true, animation_grouping: "custom", animation_mode: true, bone_rig: true, centered_grid: true, box_uv: false, optional_box_uv: true, box_uv_float_size: true, integer_size: true, uv_rotation: true, rotate_cubes: true, per_texture_uv_size: true, texture_wrap_default: "clamp", stretch_cubes: true, model_identifier: false, animation_loop_wrapping: true, quaternion_interpolation: true, onActivation() { settings.shading.set(false); Panels.animations.inside_vue.$data.group_animations_by_file = false; } }; let format_page = { content: [ { type: "h3", text: tl("mode.start.format.informations") }, { text: `* One texture can be applied to a model at a time * UV sizes are linked to the size of each cube and cannot be modified, except by stretching the cube * Models can have a maximum of 255 nodes`.replace(/(\t| {4,4})+/g, "") }, { type: "h3", text: tl("mode.start.format.resources") }, { text: [ "* [Modeling Overview and Style Guide](https://hytale.com/news/2025/12/an-introduction-to-making-models-for-hytale)", "* [Modeling Tutorial](https://youtu.be/Q07i3wmGy0Y)" ].join("\n") } ] }; let format_character = new ModelFormat("hytale_character", { name: "Hytale Character", description: "Create character and attachment models using Hytale's blockymodel format", icon: "icon-format_hytale", format_page, block_size: 64, ...common // TODO: Auto-reload attachments on tab switch. Needs dirty tracking and setting toggle to avoid losing unsaved changes /* onActivation() { common.onActivation?.(); setTimeout(() => reload_all_attachments?.click(), 0); } */ }); let format_prop = new ModelFormat("hytale_prop", { name: "Hytale Prop", description: "Create prop models using Hytale's blockymodel format", icon: "icon-format_hytale", format_page, block_size: 32, ...common }); let int_setting = new Setting("hytale_integer_size", { name: "Hytale Integer Size", category: "edit", description: "Restrict cube sizes in hytale formats to full integers. Float values are technically supported but make UV mapping more difficult. Using stretch is recommended instead.", type: "toggle", value: true }); track(int_setting); const integer_size = { get: () => int_setting.value }; Object.defineProperty(format_character, "integer_size", integer_size); Object.defineProperty(format_prop, "integer_size", integer_size); const single_texture = { get: () => Collection.all.length == 0 }; Object.defineProperty(format_character, "single_texture", single_texture); Object.defineProperty(format_prop, "single_texture", single_texture); codec.format = format_character; format_character.codec = codec; format_prop.codec = codec; track(format_character); track(format_prop); Language.addTranslations("en", { "format_category.hytale": "Hytale" }); } function isHytaleFormat() { return Format && FORMAT_IDS.includes(Format.id); } // src/name_overlap.ts var Animation = window.Animation; function copyAnimationToGroupsWithSameName(animation, source_group) { let source_animator = animation.getBoneAnimator(source_group); let other_groups = Group.all.filter((g) => g.name == source_group.name && g != source_group); for (let group2 of other_groups) { let animator2 = animation.getBoneAnimator(group2); for (let channel in animator2.channels) { if (animator2[channel] instanceof Array) animator2[channel].empty(); } source_animator.keyframes.forEach((kf) => { animator2.addKeyframe(kf, guid()); }); } } function setupNameOverlap() { Blockbench.on("finish_edit", (arg) => { if (isHytaleFormat() && arg.aspects.keyframes && Animation.selected) { let changes = false; let groups = {}; if (Timeline.selected_animator) { groups[Timeline.selected_animator.name] = [ Timeline.selected_animator.group ]; } for (let group of Group.all) { if (!groups[group.name]) groups[group.name] = []; groups[group.name].push(group); } for (let name in groups) { if (groups[name].length >= 2) { copyAnimationToGroupsWithSameName(Animation.selected, groups[name][0]); if (!changes && groups[name].find((g) => g.selected)) changes = true; } } if (changes) { Animator.preview(); } } }); let bone_animator_select_original = BoneAnimator.prototype.select; BoneAnimator.prototype.select = function select(group_is_selected) { if (!this.getGroup()) { unselectAllElements(); return this; } if (this.group.locked) return; for (var key in this.animation.animators) { this.animation.animators[key].selected = false; } if (group_is_selected !== true && this.group) { this.group.select(); } GeneralAnimator.prototype.select.call(this); if (this[Toolbox.selected.animation_channel] && (Timeline.selected.length == 0 || Timeline.selected[0].animator != this) && !Blockbench.hasFlag("loading_selection_save")) { var nearest; this[Toolbox.selected.animation_channel].forEach((kf) => { if (Math.abs(kf.time - Timeline.time) < 2e-3) { nearest = kf; } }); if (nearest) { nearest.select(); } } if (this.group && this.group.parent && this.group.parent !== "root") { this.group.parent.openUp(); } return this; }; track({ delete() { BoneAnimator.prototype.select = bone_animator_select_original; } }); let setting = new Setting("hytale_duplicate_bone_names", { name: "Duplicate Bone Names", category: "edit", description: "Allow creating duplicate groups names in Hytale formats. Multiple groups with the same name can be used to apply animations to multiple nodes at once.", type: "toggle", value: false }); let override = Group.addBehaviorOverride({ condition: () => isHytaleFormat() && setting.value == true, priority: 2, behavior: { unique_name: false } }); track(override, setting); } // src/blockyanim.ts var FPS = 60; var Animation2 = window.Animation; function parseAnimationFile(file, content) { let animation = new Animation2({ name: pathToName(file.name, false), length: content.duration / FPS, loop: content.holdLastKeyframe ? "hold" : "loop", path: file.path, snapping: FPS }); let quaternion = new THREE.Quaternion(); let euler = new THREE.Euler(0, 0, 0, "ZYX"); for (let name in content.nodeAnimations) { let anim_data = content.nodeAnimations[name]; let group_name = name; let group = Group.all.find((g) => g.name == group_name); let uuid = group ? group.uuid : guid(); let ba = new BoneAnimator(uuid, animation, group_name); animation.animators[uuid] = ba; ba.group = group; const anim_channels = [ { channel: "rotation", keyframes: anim_data.orientation }, { channel: "position", keyframes: anim_data.position }, { channel: "scale", keyframes: anim_data.shapeStretch }, { channel: "visibility", keyframes: anim_data.shapeVisible }, { channel: "uv_offset", keyframes: anim_data.shapeUvOffset } ]; for (let { channel, keyframes } of anim_channels) { if (!keyframes || keyframes.length == 0) continue; for (let kf_data of keyframes) { let data_point; if (channel == "visibility") { data_point = { visibility: kf_data.delta }; } else if (channel == "uv_offset") { let delta = kf_data.delta; data_point = { x: delta.x, y: -delta.y }; } else { let delta = kf_data.delta; if (channel == "rotation") { quaternion.set(delta.x, delta.y, delta.z, delta.w); euler.setFromQuaternion(quaternion.normalize(), "ZYX"); data_point = { x: Math.radToDeg(euler.x), y: Math.radToDeg(euler.y), z: Math.radToDeg(euler.z) }; } else { data_point = { x: delta.x, y: delta.y, z: delta.z }; } } let kf = ba.addKeyframe({ time: kf_data.time / FPS, channel, interpolation: kf_data.interpolationType == "smooth" ? "catmullrom" : "linear", data_points: [data_point] }); if (channel == "scale") { kf.uniform = data_point.x == data_point.y && data_point.x == data_point.z; } } } if (group) copyAnimationToGroupsWithSameName(animation, group); } animation.add(false); if (!Animation2.selected && Animator.open) { animation.select(); } } function compileAnimationFile(animation) { const nodeAnimations = {}; const file = { formatVersion: 1, duration: Math.round(animation.length * FPS) || FPS * 2, holdLastKeyframe: animation.loop == "hold", nodeAnimations }; const channels = { position: "position", rotation: "orientation", scale: "shapeStretch", visibility: "shapeVisible", uv_offset: "shapeUvOffset" }; for (let uuid in animation.animators) { let animator = animation.animators[uuid]; let name = animator.name; let node_data = {}; let has_data = false; for (let channel in channels) { let timeline; let hytale_channel_key = channels[channel]; timeline = timeline = node_data[hytale_channel_key] = []; let keyframe_list = animator[channel] && Array.isArray(animator[channel]) ? animator[channel].slice() : []; keyframe_list.sort((a, b) => a.time - b.time); for (let kf of keyframe_list) { let data_point = kf.data_points[0]; let delta; if (channel == "visibility") { delta = data_point.visibility; } else if (channel == "uv_offset") { delta = { x: Math.round(parseFloat(data_point.x)), y: -Math.round(parseFloat(data_point.y)) }; delta = new oneLiner(delta); } else { if (channel == "rotation") { let euler = new THREE.Euler( Math.degToRad(kf.calc("x")), Math.degToRad(kf.calc("y")), Math.degToRad(kf.calc("z")), Format.euler_order ); let quaternion = new THREE.Quaternion().setFromEuler(euler); delta = { x: quaternion.x, y: quaternion.y, z: quaternion.z, w: quaternion.w }; } else { delta = { x: kf.calc("x"), y: kf.calc("y"), z: kf.calc("z") }; } delta = new oneLiner(delta); } let kf_output = { time: Math.round(kf.time * FPS), delta, interpolationType: kf.interpolation == "catmullrom" ? "smooth" : "linear" }; if (channel == "uv_offset") console.log(kf_output); timeline.push(kf_output); has_data = true; } } if (has_data) { if (!node_data.shapeUvOffset) { node_data.shapeUvOffset = []; } nodeAnimations[name] = node_data; } } return file; } function setupAnimationCodec() { BarItems.load_animation_file.click = function(...args) { if (FORMAT_IDS.includes(Format.id)) { Filesystem.importFile({ resource_id: "blockyanim", extensions: ["blockyanim"], type: "Blockyanim", multiple: true }, async function(files) { for (let file of files) { let content = autoParseJSON(file.content); parseAnimationFile(file, content); } }); return; } else { this.dispatchEvent("use"); this.onClick(...args); this.dispatchEvent("used"); } }; let export_anim = new Action("export_blockyanim", { name: "Export Blockyanim", icon: "cinematic_blur", condition: { formats: FORMAT_IDS, selected: { animation: true } }, click() { let animation; animation = Animation2.selected; let content = compileJSON(compileAnimationFile(animation), Config.json_compile_options); Filesystem.exportFile({ resource_id: "blockyanim", type: "Blockyanim", extensions: ["blockyanim"], name: animation.name, content }); } }); track(export_anim); MenuBar.menus.animation.addAction(export_anim); Panels.animations.toolbars[0].add(export_anim, "4"); let handler = Filesystem.addDragHandler("blockyanim", { extensions: ["blockyanim"], readtype: "text", condition: { modes: ["animate"] } }, async function(files) { for (let file of files) { let content = autoParseJSON(file.content); parseAnimationFile(file, content); } }); track(handler); let original_save = Animation2.prototype.save; Animation2.prototype.save = function(...args) { if (!FORMAT_IDS.includes(Format.id)) { return original_save.call(this, ...args); } let animation; animation = this; let content = compileJSON(compileAnimationFile(animation), Config.json_compile_options); if (isApp && this.path) { Blockbench.writeFile(this.path, { content }, (real_path) => { this.saved = true; this.saved_name = this.name; this.path = real_path; }); } else { Blockbench.export({ resource_id: "blockyanim", type: "Blockyanim", extensions: ["blockyanim"], name: animation.name, startpath: this.path, content }, (real_path) => { if (isApp) this.path == real_path; this.saved = true; }); } return this; }; track({ delete() { Animation2.prototype.save = original_save; } }); let save_all_listener = BarItems.save_all_animations.on("use", () => { if (!isHytaleFormat()) return; Animation2.all.forEach((animation) => { if (!animation.saved) animation.save(); }); return false; }); track(save_all_listener); let original_condition = BarItems.export_animation_file.condition; BarItems.export_animation_file.condition = () => { return Condition(original_condition) && !FORMAT_IDS.includes(Format.id); }; track({ delete() { BarItems.export_animation_file.condition = original_condition; } }); let setting = new Setting("auto_load_hytale_animations", { name: "Auto-load Hytale Animations", description: "Automatically load blockyanim files when opening a Hytale model", category: "edit", type: "toggle", value: true }); track(setting); } // src/texture.ts function updateUVSize(texture) { let size = [texture.width, texture.display_height]; let frames = texture.frameCount; if (settings.detect_flipbook_textures.value == false || frames <= 2 || frames % 1) { size[1] = texture.height; } texture.uv_width = size[0]; texture.uv_height = size[1]; } function setupTextureHandling() { let setting = new Setting("preview_selected_texture", { name: "Preview Selected Texture", description: "When selecting a texture in a Hytale format, preview the texture on the model instantly", category: "preview", type: "toggle", value: true }); track(setting); let handler = Blockbench.on("select_texture", (arg) => { if (!isHytaleFormat()) return; if (setting.value == false) return; let texture = arg.texture; let texture_group = texture.getGroup(); if (texture_group) { let collection = Collection.all.find((c) => c.name == texture_group.name); if (collection) { collection.texture = texture.uuid; Canvas.updateAllFaces(texture); } } else { texture.setAsDefaultTexture(); } UVEditor.vue.updateTexture(); }); track(handler); } // src/attachment_texture.ts function getCollection(cube) { return Collection.all.find((c) => c.contains(cube)); } function processAttachmentTextures(attachmentName, newTextures) { let textureGroup = new TextureGroup({ name: attachmentName }); textureGroup.folded = true; textureGroup.add(); if (newTextures.length === 0) return ""; for (let tex of newTextures) { tex.group = textureGroup.uuid; updateUVSize(tex); } let texture = newTextures.find((t) => t.name.startsWith(attachmentName)) ?? newTextures[0]; return texture.uuid; } function setupAttachmentTextures() { let textureProperty = new Property(Collection, "string", "texture", { condition: { formats: FORMAT_IDS } }); track(textureProperty); let originalGetTexture = CubeFace.prototype.getTexture; CubeFace.prototype.getTexture = function(...args) { if (isHytaleFormat()) { if (this.texture == null) return null; let collection = getCollection(this.cube); if (collection && "texture" in collection) { if (collection.texture) { let texture = Texture.all.find((t) => t.uuid == collection.texture); if (texture) return texture; } return null; } return Texture.getDefault(); } return originalGetTexture.call(this, ...args); }; track({ delete() { CubeFace.prototype.getTexture = originalGetTexture; } }); let assignTexture = { id: "set_texture", name: "menu.cube.texture", icon: "collections", condition: { formats: FORMAT_IDS }, children(context) { function applyTexture(textureValue, undoMessage) { Undo.initEdit({ collections: Collection.selected }); for (let collection of Collection.selected) { collection.texture = textureValue; } Undo.finishEdit(undoMessage); Canvas.updateAllFaces(); } let arr = [ { icon: "crop_square", name: Format.single_texture_default ? "menu.cube.texture.default" : "menu.cube.texture.blank", click() { applyTexture("", "Unassign texture from collection"); } } ]; Texture.all.forEach((t) => { arr.push({ name: t.name, // @ts-expect-error icon: t.img, marked: t.uuid == context.texture, click() { applyTexture(t.uuid, "Apply texture to collection"); } }); }); return arr; } }; Collection.menu.addAction(assignTexture); track({ delete() { Collection.menu.removeAction("set_texture"); } }); } // src/attachments.ts var reload_all_attachments; function setupAttachments() { setupAttachmentTextures(); let shared_delete = SharedActions.add("delete", { subject: "collection", priority: 1, condition: () => Prop.active_panel == "collections" && isHytaleFormat() && Collection.selected.some((c) => c.export_codec === "blockymodel"), run() { let collections = Collection.selected.slice(); let remove_elements = []; let remove_groups = []; let textures = []; let texture_groups = []; for (let collection of collections) { if (collection.export_codec === "blockymodel") { for (let child of collection.getAllChildren()) { child = child; (child instanceof Group ? remove_groups : remove_elements).safePush(child); } let texture_group = TextureGroup.all.find((tg) => tg.name === collection.name); if (texture_group) { let textures2 = Texture.all.filter((t) => t.group === texture_group.uuid); textures.safePush(...textures2); texture_groups.push(texture_group); } } } Undo.initEdit({ collections, groups: remove_groups, elements: remove_elements, outliner: true, // @ts-expect-error texture_groups, textures }); collections.forEach((c) => Collection.all.remove(c)); collections.empty(); textures.forEach((t) => t.remove(true)); textures.empty(); texture_groups.forEach((t) => t.remove()); texture_groups.empty(); remove_groups.forEach((group) => group.remove()); remove_groups.empty(); remove_elements.forEach((element) => element.remove()); remove_elements.empty(); updateSelection(); Undo.finishEdit("Remove attachment"); } }); track(shared_delete); let import_as_attachment = new Action("import_as_hytale_attachment", { name: "Import Attachment", icon: "fa-hat-cowboy", condition: { formats: FORMAT_IDS }, click() { Filesystem.importFile({ extensions: ["blockymodel"], type: "Blockymodel", multiple: true, startpath: Project.export_path.replace(/[\\\/]\w+.\w+$/, "") + osfs + "Attachments" }, (files) => { for (let file of files) { let json = autoParseJSON(file.content); let attachment_name = file.name.replace(/\.\w+$/, ""); let content = Codecs.blockymodel.parse(json, file.path, { attachment: attachment_name }); let name = file.name.split(".")[0]; let new_groups = content.new_groups; let root_groups = new_groups.filter((group) => !new_groups.includes(group.parent)); let collection = new Collection({ name, children: root_groups.map((g) => g.uuid), export_codec: "blockymodel", visibility: true }).add(); collection.export_path = file.path; let texturesToProcess = content.new_textures; if (texturesToProcess.length === 0) { let dirname = PathModule.dirname(file.path); let texturePaths = discoverTexturePaths(dirname, attachment_name); for (let texPath of texturePaths) { let tex = new Texture().fromPath(texPath).add(false); texturesToProcess.push(tex); } } let textureUuid = processAttachmentTextures(attachment_name, texturesToProcess); if (textureUuid) { collection.texture = textureUuid; } Canvas.updateAllFaces(); } }); } }); track(import_as_attachment); let toolbar = Panels.collections.toolbars[0]; toolbar.add(import_as_attachment); MenuBar.menus.file.addAction(import_as_attachment, "import"); function reloadAttachment(collection) { for (let child of collection.getChildren()) { child.remove(); } Filesystem.readFile([collection.export_path], {}, ([file]) => { let json = autoParseJSON(file.content); let content = Codecs.blockymodel.parse(json, file.path, { attachment: collection.name }); let new_groups = content.new_groups; let root_groups = new_groups.filter((group) => !new_groups.includes(group.parent)); collection.extend({ children: root_groups.map((g) => g.uuid) }).add(); Canvas.updateAllFaces(); }); } let reload_attachment_action = new Action("reload_hytale_attachment", { name: "Reload Attachment", icon: "refresh", condition: () => Collection.selected.length && Modes.edit && isHytaleFormat(), click() { for (let collection of Collection.selected) { reloadAttachment(collection); } } }); Collection.menu.addAction(reload_attachment_action, 10); track(reload_attachment_action); reload_all_attachments = new Action("reload_all_hytale_attachments", { name: "Reload All Attachments", icon: "sync", condition: { formats: FORMAT_IDS }, click() { for (let collection of Collection.all.filter((c) => c.export_path)) { reloadAttachment(collection); } } }); track(reload_all_attachments); toolbar.add(reload_all_attachments); } // src/animations.ts function setupAnimation() { function displayVisibility(animator) { let group = animator.getGroup(); let main_shape = getMainShape(group); if (!main_shape) return; let scene_object = main_shape.scene_object; if (animator.muted.visibility) { scene_object.visible = group.visibility; return; } let previous_keyframe; let previous_time = -Infinity; for (let keyframe of animator.visibility) { if (keyframe.time <= Timeline.time && keyframe.time > previous_time) { previous_keyframe = keyframe; previous_time = keyframe.time; } } if (previous_keyframe && scene_object) { scene_object.visible = previous_keyframe.data_points[0]?.visibility != false; } else if (scene_object) { scene_object.visible = group.visibility; } } BoneAnimator.addChannel("visibility", { name: "Visibility", mutable: true, transform: false, max_data_points: 1, condition: { formats: FORMAT_IDS }, displayFrame(animator, multiplier) { displayVisibility(animator); } }); let vis_property = new Property(KeyframeDataPoint, "boolean", "visibility", { label: "Visibility", condition: (point) => point.keyframe.channel == "visibility", default: true }); track(vis_property); let on_exit_anim_mode = Blockbench.on("unselect_mode", (arg) => { if (isHytaleFormat() && arg.mode?.id == "animate") { Canvas.updateVisibility(); } }); track(vis_property, on_exit_anim_mode); function displayUVOffset(animator) { let group = animator.getGroup(); let cube = getMainShape(group); if (!cube) return; let updateUV = (offset) => { if (offset) { offset = offset.map((v) => Math.round(v)); } if (!offset || !offset[0] && !offset[1]) { if (!cube.mesh.userData.uv_anim_offset) { return; } else { cube.mesh.userData.uv_anim_offset = false; } } else { cube.mesh.userData.uv_anim_offset = true; } offset = offset ?? [0, 0]; let fix_uvs = {}; for (let fkey in cube.faces) { fix_uvs[fkey] = cube.faces[fkey].uv.slice(); cube.faces[fkey].uv[0] += offset[0]; cube.faces[fkey].uv[1] += offset[1]; cube.faces[fkey].uv[2] += offset[0]; cube.faces[fkey].uv[3] += offset[1]; } Cube.preview_controller.updateUV(cube); for (let fkey in cube.faces) { cube.faces[fkey].uv.replace(fix_uvs[fkey]); } }; if (animator.muted.uv_offset) { updateUV(); return; } let previous_keyframe; let previous_time = -Infinity; for (let keyframe of animator.uv_offset) { if (keyframe.time <= Timeline.time && keyframe.time > previous_time) { previous_keyframe = keyframe; previous_time = keyframe.time; } } if (previous_keyframe) { updateUV(previous_keyframe.getArray()); } else if (true) { updateUV(); } } BoneAnimator.addChannel("uv_offset", { name: "UV Offset", mutable: true, transform: true, max_data_points: 1, condition: { formats: FORMAT_IDS }, displayFrame(animator, multiplier) { displayUVOffset(animator); } }); let original_condition = KeyframeDataPoint.properties.z.condition; KeyframeDataPoint.properties.z.condition = (point) => { if (point.keyframe.channel == "uv_offset") return false; return Condition(original_condition, point); }; function weightedCubicBezier(t) { let P0 = 0, P1 = 0.05, P2 = 0.95, P3 = 1; let W0 = 2, W1 = 1, W2 = 2, W3 = 1; let b0 = (1 - t) ** 3; let b1 = 3 * (1 - t) ** 2 * t; let b2 = 3 * (1 - t) * t ** 2; let b3 = t ** 3; let w0 = b0 * W0; let w1 = b1 * W1; let w2 = b2 * W2; let w3 = b3 * W3; let numerator = w0 * P0 + w1 * P1 + w2 * P2 + w3 * P3; let denominator = w0 + w1 + w2 + w3; return numerator / denominator; } let on_interpolate = Blockbench.on("interpolate_keyframes", (arg) => { if (!isHytaleFormat()) return; if (!arg.use_quaternions || !arg.t || arg.t == 1) return; if (arg.keyframe_before.interpolation != "catmullrom" || arg.keyframe_after.interpolation != "catmullrom") return; return { t: weightedCubicBezier(arg.t) }; }); track(on_interpolate); let original_display_scale = BoneAnimator.prototype.displayScale; let original_display_rotation = BoneAnimator.prototype.displayRotation; let original_show_default_pose = Animator.showDefaultPose; BoneAnimator.prototype.displayScale = function displayScale(array, multiplier = 1) { if (!array) return this; if (isHytaleFormat()) { let target_shape = getMainShape(this.group); if (target_shape) { let initial_stretch = target_shape.stretch.slice(); target_shape.stretch.V3_set([ initial_stretch[0] * (1 + (array[0] - 1) * multiplier), initial_stretch[1] * (1 + (array[1] - 1) * multiplier), initial_stretch[2] * (1 + (array[2] - 1) * multiplier) ]); Cube.preview_controller.updateGeometry(target_shape); target_shape.stretch.V3_set(initial_stretch); } return this; } return original_display_scale.call(this, array, multiplier); }; if (Blockbench.isOlderThan("5.1.0")) { BoneAnimator.prototype.displayRotation = function displayRotation(array, multiplier = 1) { if (isHytaleFormat() && array) { let bone = this.group.scene_object; let euler = Reusable.euler1.set( Math.degToRad(array[0]) * multiplier, Math.degToRad(array[1]) * multiplier, Math.degToRad(array[2]) * multiplier, bone.rotation.order ); let q2 = Reusable.quat2.setFromEuler(euler); bone.quaternion.multiply(q2); return this; } return original_display_rotation.call(this, array, multiplier); }; } Animator.showDefaultPose = function(reduced_updates, ...args) { original_show_default_pose(reduced_updates, ...args); if (isHytaleFormat()) { for (let cube of Cube.all) { Cube.preview_controller.updateGeometry(cube); } } }; track({ delete() { BoneAnimator.prototype.displayScale = original_display_scale; if (Blockbench.isOlderThan("5.1.0-beta.4")) { BoneAnimator.prototype.displayRotation = original_display_rotation; } Animator.showDefaultPose = original_show_default_pose; } }); const per_shape_channels = /* @__PURE__ */ new Set(["scale", "visibility", "uv_offset"]); const on_init_edit = Blockbench.on("init_edit", (arg) => { if (arg.aspects.keyframes?.length == 1 && per_shape_channels.has(arg.aspects.keyframes[0].channel)) { let kf = arg.aspects.keyframes[0]; let group = kf.animator.group; if (!group.name) return; let shape = getMainShape(group); if (shape) return; if (document.getElementById("toast_notification_list").children.length) return; Blockbench.showToastNotification({ // @ts-expect-error id: "hytale_no_connected_shape_toast", text: `The group "${group.name}" has no connected shape, so the ${kf.channel} animation will not apply. Click to learn more.`, icon: "fa-cube", expire: 20 * 1e3, click: () => { Blockbench.showMessageBox({ title: "No connected shape", icon: "info", width: 500, message: `Scale, visibility, and UV animations only apply to one cube that's directly connected to the group. No shape is directly connected to this group. For Hytale, the first cube inside a group qualifies as directly connected if it matches the following criteria: * The cube must be directly parented to the group * The rotation value of the cube itself must be 0` }); return true; } }); } }); track(on_init_edit); } // src/element.ts function setupElements() { let property_shading_mode = new Property(Cube, "enum", "shading_mode", { default: "flat", values: ["flat", "standard", "fullbright", "reflective"], condition: { formats: FORMAT_IDS }, inputs: { element_panel: { input: { label: "Shading Mode", type: "select", options: { flat: "Flat", standard: "Standard", fullbright: "Always Lit", reflective: "Reflective" } }, onChange() { } } } }); track(property_shading_mode); let property_double_sided = new Property(Cube, "boolean", "double_sided", { condition: { formats: FORMAT_IDS }, inputs: { element_panel: { input: { label: "Double Sided", type: "checkbox" }, onChange() { Canvas.updateView({ elements: Cube.all, element_aspects: { transform: true } }); } } } }); track(property_double_sided); let is_piece_property = new Property(Group, "boolean", "is_piece", { condition: { formats: FORMAT_IDS }, inputs: { element_panel: { input: { label: "Attachment Piece", type: "checkbox", description: "When checked, the node will be attached to a node of the same name when displayed as an attachment in-game." } } } }); track(is_piece_property); let original_position_property = new Property(Group, "vector", "original_position", { condition: { formats: FORMAT_IDS } }); track(original_position_property); let original_offset_property = new Property(Group, "vector", "original_offset", { condition: { formats: FORMAT_IDS } }); track(original_offset_property); let add_quad_action = new Action("hytale_add_quad", { name: "Add Quad", icon: "highlighter_size_5", category: "edit", condition: { formats: FORMAT_IDS, modes: ["edit"] }, click() { let color = Math.floor(Math.random() * markerColors.length); let initial = "pos_z"; function runEdit(amended, normal) { Undo.initEdit({ outliner: true, elements: [], selection: true }, amended); let base_quad = new Cube({ autouv: settings.autouv.value ? 1 : 0, // @ts-ignore double_sided: true, box_uv: false, color }).init(); base_quad.mapAutoUV(); let group = getCurrentGroup(); if (group) { base_quad.addTo(group); if (settings.inherit_parent_color.value) base_quad.color = group.color; } let texture = Texture.all.length && Format.single_texture ? Texture.getDefault().uuid : false; for (let face in base_quad.faces) { base_quad.faces[face].texture = null; } let size = [8, 8, 8]; let positive = normal.startsWith("pos"); switch (normal[4]) { case "x": { base_quad.faces.west.texture = positive ? null : texture; base_quad.faces.east.texture = positive ? texture : null; size[0] = 0; break; } case "y": { base_quad.faces.down.texture = positive ? null : texture; base_quad.faces.up.texture = positive ? texture : null; size[1] = 0; break; } case "z": { base_quad.faces.north.texture = positive ? null : texture; base_quad.faces.south.texture = positive ? texture : null; size[2] = 0; break; } } base_quad.extend({ from: [-size[0] / 2, 0, -size[2] / 2], to: [size[0] / 2, size[1], size[2] / 2] }); let fkey = Object.keys(base_quad.faces).find((fkey2) => base_quad.faces[fkey2].texture != null); UVEditor.getSelectedFaces(base_quad, true).replace([fkey]); base_quad.select(); Canvas.updateView({ elements: [base_quad], element_aspects: { transform: true, geometry: true, faces: true } }); Undo.finishEdit("Add quad", { outliner: true, elements: selected, selection: true }); Vue.nextTick(function() { if (settings.create_rename.value) { base_quad.rename(); } }); } runEdit(false, initial); Undo.amendEdit({ normal: { type: "inline_select", value: initial, label: "Normal", options: { "pos_x": "+X", "neg_x": "-X", "pos_y": "+Y", "neg_y": "-Y", "pos_z": "+Z", "neg_z": "-Z" } } }, (form) => { runEdit(true, form.normal); }); } }); track(add_quad_action); let add_element_menu = BarItems.add_element.side_menu; add_element_menu.addAction(add_quad_action); let set_uv_mode_original = Cube.prototype.setUVMode; Cube.prototype.setUVMode = function(box_uv, ...args) { if (isHytaleFormat()) { if (cubeIsQuad(this) && box_uv) return; } return set_uv_mode_original.call(this, box_uv, ...args); }; track({ delete() { Cube.prototype.setUVMode = set_uv_mode_original; } }); let inflate_condition_original = BarItems.slider_inflate.condition; BarItems.slider_inflate.condition = () => { if (isHytaleFormat()) return false; return Condition(inflate_condition_original); }; track({ delete() { BarItems.slider_inflate.condition = inflate_condition_original; } }); Blockbench.on("finish_edit", (arg) => { if (!FORMAT_IDS.includes(Format.id)) return; if (arg.aspects?.elements) { let uv_changes = false; for (let element of arg.aspects.elements) { if (element instanceof Cube == false) continue; if (!element.autouv) { element.autouv = 1; element.mapAutoUV(); element.preview_controller.updateUV(element); uv_changes = true; } if (element.inflate) { element.inflate = 0; element.preview_controller.updateGeometry(element); TickUpdates.selection = true; } } if (uv_changes) { UVEditor.vue.$forceUpdate(); } } }); } // src/uv_cycling.ts var cycleState = null; var CLICK_THRESHOLD = 0; function screenToUV(event) { return UVEditor.getBrushCoordinates(event, UVEditor.texture); } function isPointInRect(x, y, rect) { const minX = Math.min(rect.ax, rect.bx); const maxX = Math.max(rect.ax, rect.bx); const minY = Math.min(rect.ay, rect.by); const maxY = Math.max(rect.ay, rect.by); return x >= minX && x <= maxX && y >= minY && y <= maxY; } function getFacesAtUVPosition(uvX, uvY) { const faces = []; for (const cube of Cube.all) { if (!cube.visibility) continue; for (const faceKey in cube.faces) { const face = cube.faces[faceKey]; if (face.enabled === false) continue; const rect = face.getBoundingRect(); if (isPointInRect(uvX, uvY, rect)) { faces.push({ cube, faceKey }); } } } faces.sort((a, b) => { if (a.cube.name !== b.cube.name) { return a.cube.name.localeCompare(b.cube.name); } return a.faceKey.localeCompare(b.faceKey); }); const currentSelectedFaces = UVEditor.selected_faces || []; const currentCube = Cube.selected[0]; if (currentCube && currentSelectedFaces.length > 0) { const currentFaceKey = currentSelectedFaces[0]; const currentIndex = faces.findIndex( (f) => f.cube.uuid === currentCube.uuid && f.faceKey === currentFaceKey ); if (currentIndex > 0) { return [...faces.slice(currentIndex), ...faces.slice(0, currentIndex)]; } } return faces; } function selectFace(cube, faceKey) { cube.select(); UVEditor.getSelectedFaces(cube, true).replace([faceKey]); UVEditor.vue.$forceUpdate(); Canvas.updateView({ elements: [cube], element_aspects: { faces: true } }); } function setupUVCycling() { const uvPanel = Panels.uv; if (!uvPanel) return; function initializeClickHandler() { const uv_viewport = uvPanel.node?.querySelector("#uv_viewport"); if (!uv_viewport) return false; let pendingClick = null; function handleMouseDown(event) { if (!FORMAT_IDS.includes(Format.id)) return; if (Modes.paint) return; if (event.button !== 0) return; pendingClick = { uvPos: screenToUV(event) }; } function handleMouseUp(event) { if (!pendingClick) return; if (event.button !== 0) return; const uvPos = screenToUV(event); pendingClick = null; const isSamePosition = cycleState !== null && Math.abs(uvPos.x - cycleState.lastClickX) <= CLICK_THRESHOLD && Math.abs(uvPos.y - cycleState.lastClickY) <= CLICK_THRESHOLD; if (isSamePosition && cycleState) { cycleState.currentIndex = (cycleState.currentIndex + 1) % cycleState.facesAtPosition.length; const { cube, faceKey } = cycleState.facesAtPosition[cycleState.currentIndex]; setTimeout(() => selectFace(cube, faceKey), 50); } else { const faces = getFacesAtUVPosition(uvPos.x, uvPos.y); if (faces.length > 1) { cycleState = { lastClickX: uvPos.x, lastClickY: uvPos.y, currentIndex: 0, facesAtPosition: faces }; } else { cycleState = null; } } } uv_viewport.addEventListener("mousedown", handleMouseDown); uv_viewport.addEventListener("mouseup", handleMouseUp); track({ delete() { uv_viewport.removeEventListener("mousedown", handleMouseDown); uv_viewport.removeEventListener("mouseup", handleMouseUp); } }); return true; } if (uvPanel.node && initializeClickHandler()) return; let attempts = 0; const interval = setInterval(() => { attempts++; if (uvPanel.node && initializeClickHandler()) { clearInterval(interval); } else if (attempts >= 50) { clearInterval(interval); } }, 100); track({ delete() { clearInterval(interval); } }); } // src/validation.ts var MAX_NODE_COUNT = 255; function getNodeCount() { let node_count = 0; for (let group of Group.all) { if (group.export == false) return; if (Collection.all.find((c) => c.contains(group))) continue; node_count++; let main_shape = getMainShape(group); for (let cube of group.children) { if (cube instanceof Cube == false || cube.export == false) continue; if (cube == main_shape) continue; node_count++; } } return node_count; } function setupChecks() { let check = new ValidatorCheck("hytale_node_count", { update_triggers: ["update_selection"], condition: { formats: FORMAT_IDS }, run() { let node_count = getNodeCount(); if (node_count > MAX_NODE_COUNT) { this.fail({ message: `The model contains ${node_count} nodes, which exceeds the maximum of ${MAX_NODE_COUNT} that Hytale will display.` }); } } }); check.name = "Hytale Node Count"; track(check); let uv_check = new ValidatorCheck("hytale_uv_size", { update_triggers: ["update_selection"], condition: { formats: FORMAT_IDS }, run() { for (let texture of Texture.all) { if (texture.uv_width != texture.width || texture.uv_height != texture.height) { this.fail({ message: `The texture ${texture.name} has a resolution (${texture.width}x${texture.height}) that does not match its UV size (${texture.uv_width}x${texture.uv_height}). Ensure that your pixel density is 64 for characters and 32 for props.`, buttons: [ { name: "Fix UV Size", icon: "build", click() { updateUVSize(texture); texture.select(); } } ] }); } } } }); uv_check.name = "Hytale UV Size"; track(uv_check); let listener = Blockbench.on("display_model_stats", ({ stats }) => { if (!FORMAT_IDS.includes(Format.id)) return; let node_count = getNodeCount(); stats.splice(0, 0, { label: "Nodes", value: node_count + " / " + MAX_NODE_COUNT }); }); track(listener); } // package.json var package_default = { name: "hytale-blockbench-plugin", version: "0.9.1", description: "Create models and animations for Hytale", main: "src/plugin.ts", type: "module", scripts: { build: "esbuild src/plugin.ts --bundle --loader:.png=dataurl --outfile=dist/hytale_plugin.js", dev: "esbuild src/plugin.ts --bundle --loader:.png=dataurl --outfile=dist/hytale_plugin.js --watch" }, author: "JannisX11, Kanno", license: "GPL-3.0", dependencies: { "blockbench-types": "^5.1.0" }, devDependencies: { esbuild: "^0.25.9" } }; // src/photoshop_copy_paste.ts function setupPhotoshopTools() { let setting = new Setting("copy_paste_magenta_alpha", { name: "Copy-Paste with Magenta Alpha", description: "Copy image selections with magenta background and remove magenta when pasting to help transfer transparency to Photoshop", type: "toggle", category: "paint", value: false }); track(setting); let shared_copy = SharedActions.add("copy", { subject: "image_content_photoshop", condition: () => Prop.active_panel == "uv" && Modes.paint && UVEditor.texture && FORMAT_IDS.includes(Format.id) && setting.value == true, priority: 2, run(event, cut) { let texture = UVEditor.texture; let selection = texture.selection; let { canvas, ctx, offset } = texture.getActiveCanvas(); if (selection.override != null) { Clipbench.image = { x: offset[0], y: offset[1], frame: texture.currentFrame, data: "" }; } else { let rect = selection.getBoundingRect(); let copy_canvas = document.createElement("canvas"); let copy_ctx = copy_canvas.getContext("2d"); copy_canvas.width = rect.width; copy_canvas.height = rect.height; selection.maskCanvas(copy_ctx, [rect.start_x, rect.start_y]); copy_ctx.drawImage(canvas, -rect.start_x + offset[0], -rect.start_y + offset[1]); Clipbench.image = { x: rect.start_x, y: rect.start_y, frame: texture.currentFrame, data: "" }; canvas = copy_canvas; } let canvas_copy_magenta = document.createElement("canvas"); let copy_ctx_magenta = canvas_copy_magenta.getContext("2d"); canvas_copy_magenta.width = canvas.width; canvas_copy_magenta.height = canvas.height; copy_ctx_magenta.fillStyle = "#ff00ff"; copy_ctx_magenta.fillRect(0, 0, canvas.width, canvas.height); copy_ctx_magenta.drawImage(canvas, 0, 0); canvas = canvas_copy_magenta; Clipbench.image.data = canvas.toDataURL("image/png", 1); if (isApp) { let clipboard = requireNativeModule("clipboard"); let img = nativeImage.createFromDataURL(Clipbench.image.data); clipboard.writeImage(img); } else { canvas.toBlob((blob) => { navigator.clipboard.write([ new ClipboardItem({ [blob.type]: blob }) ]); }); } if (cut) { SharedActions.runSpecific("delete", "image_content", event, { message: "Cut texture selection" }); } } }); track(shared_copy); let shared_paste = SharedActions.add("paste", { subject: "image_content_photoshop", condition: () => Prop.active_panel == "uv" && Modes.paint && UVEditor.texture && FORMAT_IDS.includes(Format.id) && setting.value == true, priority: 2, run(event) { let texture = UVEditor.texture; async function loadFromDataUrl(data_url) { let frame = new CanvasFrame(); await frame.loadFromURL(data_url); Undo.initEdit({ textures: [texture], bitmap: true }); if (!texture.layers_enabled) { texture.flags.add("temporary_layers"); texture.activateLayers(false); } let offset; if (Clipbench.image) { offset = [Math.clamp(Clipbench.image.x, 0, texture.width), Math.clamp(Clipbench.image.y, 0, texture.height)]; offset[0] = Math.clamp(offset[0], 0, texture.width - frame.width); offset[1] = Math.clamp(offset[1], 0, texture.height - frame.height); } let old_frame = Clipbench.image?.frame || 0; if (old_frame || texture.currentFrame) { offset[1] += texture.display_height * ((texture.currentFrame || 0) - old_frame); } let layer = new TextureLayer({ name: "pasted", offset }, texture); let image_data = frame.ctx.getImageData(0, 0, frame.width, frame.height); for (let i = 0; i < image_data.data.length; i += 4) { if (image_data.data[i] == 255 && image_data.data[i + 1] == 0 && image_data.data[i + 2] == 255) { image_data.data[i + 0] = 0; image_data.data[i + 1] = 0; image_data.data[i + 2] = 0; image_data.data[i + 3] = 0; } } layer.setSize(frame.width, frame.height); layer.ctx.putImageData(image_data, 0, 0); if (!offset) layer.center(); layer.addForEditing(); layer.setLimbo(); texture.updateChangesAfterEdit(); Undo.finishEdit("Paste into texture"); if (Toolbox.selected.id != "selection_tool") BarItems.move_layer_tool.select(); updateInterfacePanels(); BARS.updateConditions(); } if (isApp) { let clipboard = requireNativeModule("clipboard"); var image = clipboard.readImage().toDataURL(); loadFromDataUrl(image); } else { navigator.clipboard.read().then((content) => { if (content && content[0] && content[0].types.includes("image/png")) { content[0].getType("image/png").then((blob) => { let url = URL.createObjectURL(blob); loadFromDataUrl(url); }); } }).catch(() => { }); } } }); track(shared_paste); } // src/pivot_marker.ts var ThickLineAxisHelper = class ThickLineAxisHelper2 extends THREE.LineSegments { constructor(size = 1) { let a = 0.04, b = 0.025; let vertices = [ 0, a, 0, size, a, 0, 0, 0, b, size, 0, b, 0, 0, -b, size, 0, -b, 0, 0, a, 0, size, a, b, 0, 0, b, size, 0, -b, 0, 0, -b, size, 0, a, 0, 0, a, 0, size, 0, b, 0, 0, b, size, 0, -b, 0, 0, -b, size ]; let geometry = new THREE.BufferGeometry(); geometry.setAttribute("position", new THREE.Float32BufferAttribute(vertices, 3)); let material = new THREE.LineBasicMaterial({ vertexColors: true }); super(geometry, material); this.updateColors(); material.transparent = true; material.depthTest = false; this.renderOrder = 800; } updateColors() { let colors = [ ...gizmo_colors.r.toArray(), ...gizmo_colors.r.toArray(), ...gizmo_colors.r.toArray(), ...gizmo_colors.r.toArray(), ...gizmo_colors.r.toArray(), ...gizmo_colors.r.toArray(), ...gizmo_colors.g.toArray(), ...gizmo_colors.g.toArray(), ...gizmo_colors.g.toArray(), ...gizmo_colors.g.toArray(), ...gizmo_colors.g.toArray(), ...gizmo_colors.g.toArray(), ...gizmo_colors.b.toArray(), ...gizmo_colors.b.toArray(), ...gizmo_colors.b.toArray(), ...gizmo_colors.b.toArray(), ...gizmo_colors.b.toArray(), ...gizmo_colors.b.toArray() ]; this.geometry.setAttribute("color", new THREE.Float32BufferAttribute(colors, 3)); } }; ThickLineAxisHelper.prototype.constructor = ThickLineAxisHelper; var CustomPivotMarker = class { original_helpers; constructor() { this.original_helpers = Canvas.pivot_marker.children.slice(); let [helper1, helper2] = this.original_helpers; let helper1_new = new ThickLineAxisHelper(1); let helper2_new = new ThickLineAxisHelper(1); helper1_new.rotation.copy(helper1.rotation); helper2_new.rotation.copy(helper2.rotation); Canvas.pivot_marker.children.empty(); Canvas.pivot_marker.add(helper1_new, helper2_new); } delete() { Canvas.pivot_marker.children.empty(); Canvas.pivot_marker.add(...this.original_helpers); } }; var GroupPivotIndicator = class { dot; listener; cameraListener; setting; constructor() { this.setting = new Setting("show_group_pivot_indicator", { name: "Show Group Pivot Indicator", description: "Show a dot in Edit mode indicating the rotation pivot point for animations", category: "preview", type: "toggle", value: true }); let geometry = new THREE.SphereGeometry(0.65, 12, 12); let material = new THREE.MeshBasicMaterial({ color: this.getAccentColor(), transparent: true, opacity: 0.9, depthTest: false }); this.dot = new THREE.Mesh(geometry, material); this.dot.renderOrder = 900; this.dot.visible = false; Canvas.scene.add(this.dot); Canvas.gizmos.push(this.dot); this.listener = Blockbench.on("update_selection", () => this.update()); this.cameraListener = Blockbench.on("update_camera_position", () => this.updateScale()); this.update(); } updateScale() { if (!this.dot.visible) return; let scale = Preview.selected.calculateControlScale(this.dot.position) || 0.8; this.dot.scale.setScalar(scale * 0.7); } getAccentColor() { let cssColor = getComputedStyle(document.body).getPropertyValue("--color-accent").trim(); return new THREE.Color(cssColor || "#3e90ff"); } update() { if (!this.setting.value) { this.dot.visible = false; return; } if (Modes.paint) { this.dot.visible = false; return; } let group = this.getRelevantGroup(); if (!group) { this.dot.visible = false; return; } this.dot.material.color.copy(this.getAccentColor()); let mesh = group.mesh; if (mesh) { let worldPos = new THREE.Vector3(); mesh.getWorldPosition(worldPos); this.dot.position.copy(worldPos); this.dot.visible = true; this.updateScale(); } else { this.dot.visible = false; } } getRelevantGroup() { let sel = Outliner.selected[0]; if (!sel) return null; while (sel.parent instanceof OutlinerNode && sel.parent.selected) { sel = sel.parent; } if (sel instanceof Group) { return sel; } if (sel.parent instanceof Group) { return sel.parent; } return null; } delete() { Canvas.scene.remove(this.dot); this.dot.geometry.dispose(); this.dot.material.dispose(); this.listener.delete(); this.cameraListener.delete(); this.setting.delete(); } }; // src/outliner_filter.ts var HIDDEN_CLASS = "hytale_attachment_hidden"; var attachmentsHidden = false; var visibilityUpdatePending = false; function scheduleVisibilityUpdate() { if (!attachmentsHidden || visibilityUpdatePending) return; visibilityUpdatePending = true; requestAnimationFrame(() => { visibilityUpdatePending = false; applyOutlinerVisibility(); }); } function getAttachmentUUIDs() { let uuids = []; if (!Collection.all?.length) return uuids; for (let collection of Collection.all) { for (let child of collection.getChildren()) { uuids.push(child.uuid); if ("children" in child && Array.isArray(child.children)) { collectChildUUIDs(child, uuids); } } } return uuids; } function collectChildUUIDs(parent, uuids) { for (let child of parent.children) { if (child instanceof OutlinerNode) { uuids.push(child.uuid); if ("children" in child && Array.isArray(child.children)) { collectChildUUIDs(child, uuids); } } } } function applyOutlinerVisibility() { if (!isHytaleFormat()) return; const outlinerNode = Panels.outliner?.node; if (!outlinerNode) return; if (!attachmentsHidden) { outlinerNode.querySelectorAll(`.${HIDDEN_CLASS}`).forEach((el) => { el.classList.remove(HIDDEN_CLASS); }); for (let collection of Collection.all ?? []) { for (let child of collection.getChildren()) { unlockRecursive(child); } } return; } const uuids = getAttachmentUUIDs(); for (let uuid of uuids) { let node = outlinerNode.querySelector(`[id="${uuid}"]`); if (node) { node.classList.add(HIDDEN_CLASS); } let element = OutlinerNode.uuids[uuid]; if (element) { element.locked = true; } } } function unlockRecursive(node) { node.locked = false; if ("children" in node && Array.isArray(node.children)) { for (let child of node.children) { if (child instanceof OutlinerNode) { unlockRecursive(child); } } } } function setupOutlinerFilter() { let style = Blockbench.addCSS(` .outliner_node.${HIDDEN_CLASS} { display: none !important; } /* Lock overlay on attachment toggle when active */ .tool[toolbar_item="toggle_attachment_editing"].enabled .fa-paperclip::after { content: "lock"; font-family: "Material Icons"; font-size: 14px; position: absolute; bottom: -1px; right: -3px; text-shadow: -1.5px -1.5px 0 var(--color-accent), 1.5px -1.5px 0 var(--color-accent), -1.5px 1.5px 0 var(--color-accent), 1.5px 1.5px 0 var(--color-accent), 0px -1.5px 0 var(--color-accent), 0px 1.5px 0 var(--color-accent), -1.5px 0px 0 var(--color-accent), 1.5px 0px 0 var(--color-accent); } .tool[toolbar_item="toggle_attachment_editing"] .fa-paperclip { position: relative; } `); StateMemory.init("hytale_attachments_hidden", "boolean"); attachmentsHidden = StateMemory.get("hytale_attachments_hidden") ?? false; let toggle = new Toggle("toggle_attachment_editing", { name: "Toggle Attachment Editing", description: "Lock or unlock attachment elements for editing", icon: "fa-paperclip", category: "view", condition: { formats: FORMAT_IDS }, default: attachmentsHidden, onChange(value) { attachmentsHidden = value; StateMemory.set("hytale_attachments_hidden", value); applyOutlinerVisibility(); } }); let outlinerPanel = Panels.outliner; if (outlinerPanel && outlinerPanel.toolbars.length > 0) { outlinerPanel.toolbars[0].add(toggle, -1); } let hookFinishedEdit = Blockbench.on("finished_edit", scheduleVisibilityUpdate); let hookSelectMode = Blockbench.on("select_mode", scheduleVisibilityUpdate); let hookSelection = Blockbench.on("update_selection", scheduleVisibilityUpdate); if (attachmentsHidden) { setTimeout(applyOutlinerVisibility, 100); } track(toggle, hookFinishedEdit, hookSelectMode, hookSelection, style, { delete() { Panels.outliner?.node?.querySelectorAll(`.${HIDDEN_CLASS}`).forEach((el) => { el.classList.remove(HIDDEN_CLASS); }); } }); } // src/uv_outline.ts var UV_OUTLINE_CSS = ` body.hytale-format[mode=edit] #uv_frame .uv_resize_corner, body.hytale-format[mode=edit] #uv_frame .uv_resize_side, body.hytale-format[mode=edit] #uv_frame #uv_scale_handle, body.hytale-format[mode=edit] #uv_frame #uv_selection_frame { display: none; } body.hytale-format #uv_frame.overlay_mode { --uv-line-width: 2px; } body.hytale-format #uv_frame.overlay_mode .cube_uv_face { border-color: transparent !important; } body.hytale-format #uv_frame.overlay_mode .cube_uv_face::before { content: ''; position: absolute; top: -1px; left: -1px; right: -1px; bottom: -1px; border: 1px solid var(--color-text); pointer-events: none; } body.hytale-format #uv_frame.overlay_mode .cube_uv_face.selected:not(.unselected) { outline: none; } body.hytale-uv-outline-only #uv_frame { --color-uv-background: transparent; --color-uv-background-hover: transparent; } body.hytale-uv-outline-only #uv_frame .cube_uv_face { border-color: transparent !important; } body.hytale-uv-outline-only #uv_frame .cube_uv_face::before { content: ''; position: absolute; top: -1px; left: -1px; right: -1px; bottom: -1px; border: 1px solid var(--color-text); pointer-events: none; } body.hytale-uv-outline-only #uv_frame .cube_uv_face:hover::before { border-color: var(--color-accent); } body.hytale-uv-outline-only #uv_frame:not(.overlay_mode) .cube_uv_face.selected:not(.unselected)::before { top: -2px; left: -2px; right: -2px; bottom: -2px; border-width: 2px; border-color: var(--color-accent); } body.hytale-uv-outline-only #uv_frame .mesh_uv_face polygon { stroke-width: 1px; } body.hytale-uv-outline-only #uv_frame:not(.overlay_mode) .mesh_uv_face.selected polygon { stroke-width: 2px; } body.hytale-uv-outline-only #uv_frame .selection_rectangle { background-color: transparent; } `; function updateHytaleFormatClass() { document.body.classList.toggle("hytale-format", isHytaleFormat()); } function setupUVOutline() { const style = Blockbench.addCSS(UV_OUTLINE_CSS); track(style); const setting = new Setting("uv_outline_only", { name: "UV Outline Only", description: "Show only outlines for UV faces instead of filled overlays", category: "edit", value: false, onChange(value) { document.body.classList.toggle("hytale-uv-outline-only", value); } }); track(setting); const selectProjectListener = Blockbench.on("select_project", updateHytaleFormatClass); track(selectProjectListener); document.body.classList.toggle("hytale-uv-outline-only", settings.uv_outline_only?.value ?? true); updateHytaleFormatClass(); } // src/temp_fixes.js function setupTempFixes() { if (!Blockbench.isOlderThan("5.0.7")) return; Cube.prototype.mapAutoUV = function(options = {}) { if (this.box_uv) return; var scope = this; if (scope.autouv === 2) { var all_faces = ["north", "south", "west", "east", "up", "down"]; let offset = Format.centered_grid ? 8 : 0; all_faces.forEach(function(side) { var uv = scope.faces[side].uv.slice(); let texture = scope.faces[side].getTexture(); let uv_width = Project.getUVWidth(texture); let uv_height = Project.getUVHeight(texture); switch (side) { case "north": uv = [ uv_width - (scope.to[0] + offset), uv_height - scope.to[1], uv_width - (scope.from[0] + offset), uv_height - scope.from[1] ]; break; case "south": uv = [ scope.from[0] + offset, uv_height - scope.to[1], scope.to[0] + offset, uv_height - scope.from[1] ]; break; case "west": uv = [ scope.from[2] + offset, uv_height - scope.to[1], scope.to[2] + offset, uv_height - scope.from[1] ]; break; case "east": uv = [ uv_width - (scope.to[2] + offset), uv_height - scope.to[1], uv_width - (scope.from[2] + offset), uv_height - scope.from[1] ]; break; case "up": uv = [ scope.from[0] + offset, scope.from[2] + offset, scope.to[0] + offset, scope.to[2] + offset ]; break; case "down": uv = [ scope.from[0] + offset, uv_height - (scope.to[2] + offset), scope.to[0] + offset, uv_height - (scope.from[2] + offset) ]; break; } if (Math.max(uv[0], uv[2]) > uv_width) { let offset2 = Math.max(uv[0], uv[2]) - uv_width; uv[0] -= offset2; uv[2] -= offset2; } if (Math.min(uv[0], uv[2]) < 0) { let offset2 = Math.min(uv[0], uv[2]); uv[0] = Math.clamp(uv[0] - offset2, 0, uv_width); uv[2] = Math.clamp(uv[2] - offset2, 0, uv_width); } if (Math.max(uv[1], uv[3]) > uv_height) { let offset2 = Math.max(uv[1], uv[3]) - uv_height; uv[1] -= offset2; uv[3] -= offset2; } if (Math.min(uv[1], uv[3]) < 0) { let offset2 = Math.min(uv[1], uv[3]); uv[1] = Math.clamp(uv[1] - offset2, 0, uv_height); uv[3] = Math.clamp(uv[3] - offset2, 0, uv_height); } scope.faces[side].uv = uv; }); scope.preview_controller.updateUV(scope); } else if (scope.autouv === 1) { let calcAutoUV = function(fkey, dimension_axes, world_directions) { let size = dimension_axes.map((axis) => scope.size(axis)); let face = scope.faces[fkey]; size[0] = Math.abs(size[0]); size[1] = Math.abs(size[1]); let sx = face.uv[0]; let sy = face.uv[1]; let previous_size = face.uv_size; let rot = face.rotation; let texture = face.getTexture(); let uv_width = Project.getUVWidth(texture); let uv_height = Project.getUVHeight(texture); if (rot === 90 || rot === 270) { size.reverse(); dimension_axes.reverse(); world_directions.reverse(); } if (rot == 180) { world_directions[0] *= -1; world_directions[1] *= -1; } size[0] = Math.clamp(size[0], -uv_width, uv_width) * (Math.sign(previous_size[0]) || 1); size[1] = Math.clamp(size[1], -uv_height, uv_height) * (Math.sign(previous_size[1]) || 1); if (options && typeof options.axis == "number") { if (options.axis == dimension_axes[0] && options.direction == world_directions[0]) { sx += previous_size[0] - size[0]; } if (options.axis == dimension_axes[1] && options.direction == world_directions[1]) { sy += previous_size[1] - size[1]; } } if (sx < 0) sx = 0; if (sy < 0) sy = 0; let endx = sx + size[0]; let endy = sy + size[1]; if (endx > uv_width) { sx = uv_width - (endx - sx); endx = uv_width; } if (endy > uv_height) { sy = uv_height - (endy - sy); endy = uv_height; } return [sx, sy, endx, endy]; }; scope.faces.north.uv = calcAutoUV("north", [0, 1], [1, 1]); scope.faces.east.uv = calcAutoUV("east", [2, 1], [1, 1]); scope.faces.south.uv = calcAutoUV("south", [0, 1], [-1, 1]); scope.faces.west.uv = calcAutoUV("west", [2, 1], [-1, 1]); scope.faces.up.uv = calcAutoUV("up", [0, 2], [-1, -1]); scope.faces.down.uv = calcAutoUV("down", [0, 2], [-1, 1]); scope.preview_controller.updateUV(scope); } }; BarItems.group_elements.click = function() { Undo.initEdit({ outliner: true, groups: [] }); let add_group = Group.first_selected; if (!add_group && Outliner.selected.length) { add_group = Outliner.selected.last(); } let new_name = add_group?.name; let base_group = new Group({ origin: add_group ? add_group.origin : void 0, name: ["cube", "mesh"].includes(new_name) ? void 0 : new_name }); base_group.sortInBefore(add_group); base_group.isOpen = true; base_group.init(); if (base_group.getTypeBehavior("unique_name")) { base_group.createUniqueName(); } Outliner.selected.concat(Group.multi_selected).forEach((s) => { if (s.parent?.selected) return; s.addTo(base_group); s.preview_controller.updateTransform(s); }); base_group.select(); Undo.finishEdit("Add group", { outliner: true, groups: [base_group] }); Vue.nextTick(function() { updateSelection(); if (settings.create_rename.value) { base_group.rename(); } base_group.showInOutliner(); Blockbench.dispatchEvent("group_elements", { object: base_group }); }); }; } // src/references/player.json var player_default = { texture_size: [256, 128], cubes: [ { position: [-12.74, 45.10128, -8.82], size: [25.48, 11.79744, 17.64], faces: { north: { uv: [68, 115, 94, 127] }, east: { uv: [50, 115, 68, 127] }, south: { uv: [24, 115, 50, 127] }, west: { uv: [6, 115, 24, 127] }, up: { uv: [216, 83, 242, 101] }, down: { uv: [216, 101, 242, 119] } } }, { position: [-13, 55, -9], size: [26, 16, 18], faces: { north: { uv: [68, 99, 94, 115] }, east: { uv: [50, 99, 68, 115] }, south: { uv: [24, 99, 50, 115] }, west: { uv: [6, 99, 24, 115] }, up: { uv: [52, 58, 78, 76] }, down: { uv: [52, 58, 78, 76] } } }, { position: [-13.72, 68.22, -9.5], size: [27.44, 21.56, 19], faces: { north: { uv: [71, 77, 99, 99] }, east: { uv: [51, 77, 71, 99] }, south: { uv: [23, 77, 51, 99] }, west: { uv: [3, 77, 23, 99] }, up: { uv: [23, 57, 51, 77] }, down: { uv: [51, 57, 79, 77] } } }, { position: [-15, 93, -13], size: [30, 28, 28], faces: { north: { uv: [86, 28, 116, 56] }, east: { uv: [58, 28, 86, 56] }, south: { uv: [28, 28, 58, 56] }, west: { uv: [0, 28, 28, 56] }, up: { uv: [28, 0, 58, 28] }, down: { uv: [58, 0, 88, 28] } } }, { position: [-7.5, 85.04378, -5.5], size: [15, 17.91244, 11], faces: { north: { uv: [106, 63, 121, 76] }, east: { uv: [95, 63, 106, 76] }, south: { uv: [80, 63, 95, 76] }, west: { uv: [95, 63, 106, 76] }, down: { uv: [30, 63, 45, 74] } } }, { position: [-20.10255, 68.71157, -7.1452], size: [7.84, 20, 12], origin: [-16.18255, 78.71157, -1.1452], rotation: [0.6131, -6.9732, -5.0374], faces: { north: { uv: [149, 12, 157, 32] }, east: { uv: [137, 12, 149, 32] }, south: { uv: [129, 12, 137, 32] }, west: { uv: [117, 12, 129, 32] }, up: { uv: [129, 12, 117, 4] }, down: { uv: [137, 0, 145, 12] } } }, { position: [-21.73964, 52.77981, -7.33636], size: [8, 16, 12], origin: [-17.73964, 60.77981, -1.33636], rotation: [0.6131, -6.9732, -5.0374], faces: { north: { uv: [149, 32, 157, 48] }, east: { uv: [137, 32, 149, 48] }, south: { uv: [129, 32, 137, 48] }, west: { uv: [117, 32, 129, 48] }, up: { uv: [149, 26, 157, 38] }, down: { uv: [129, 26, 137, 38] } } }, { position: [-23.86423, 41.82928, -8.47444], size: [10, 12, 14], origin: [-18.86423, 47.82928, -1.47444], rotation: [0.6131, -6.9732, -5.0374], faces: { north: { uv: [165, 48, 155, 60] }, east: { uv: [141, 48, 155, 60] }, south: { uv: [131, 48, 141, 60] }, west: { uv: [117, 48, 131, 60] }, up: { uv: [118, 33, 128, 47] }, down: { uv: [155, 70, 141, 60] } } }, { position: [20.10255, 68.71157, -7.1452], size: [-7.84, 20, 12], origin: [16.18255, 78.71157, -1.1452], rotation: [0.6131, 6.9732, 5.0374], faces: { north: { uv: [149, 12, 157, 32] }, east: { uv: [137, 12, 149, 32] }, south: { uv: [129, 12, 137, 32] }, west: { uv: [117, 12, 129, 32] }, up: { uv: [129, 12, 117, 4] }, down: { uv: [137, 0, 145, 12] } } }, { position: [21.73964, 52.77982, -7.33636], size: [-8, 16, 12], origin: [17.73964, 60.77982, -1.33636], rotation: [0.6131, 6.9732, 5.0374], faces: { north: { uv: [149, 32, 157, 48] }, east: { uv: [137, 32, 149, 48] }, south: { uv: [129, 32, 137, 48] }, west: { uv: [117, 32, 129, 48] }, up: { uv: [149, 26, 157, 38] }, down: { uv: [129, 26, 137, 38] } } }, { position: [23.86423, 41.82928, -8.47444], size: [-10, 12, 14], origin: [18.86423, 47.82928, -1.47444], rotation: [0.6131, 6.9732, 5.0374], faces: { north: { uv: [165, 48, 155, 60] }, east: { uv: [141, 48, 155, 60] }, south: { uv: [131, 48, 141, 60] }, west: { uv: [117, 48, 131, 60] }, up: { uv: [118, 33, 128, 47] }, down: { uv: [155, 70, 141, 60] } } }, { position: [-12.40001, 29, -5], size: [9.8, 20, 12], origin: [-7.50001, 39, 1], rotation: [0, -2.1999, 0], faces: { north: { uv: [155, 77, 145, 97] }, east: { uv: [133, 77, 145, 97] }, south: { uv: [123, 77, 133, 97] }, west: { uv: [111, 77, 123, 97] }, down: { uv: [123, 93, 133, 105] } } }, { position: [-12.50001, 5, -5], size: [10, 24, 12], origin: [-7.50001, 17, 1], rotation: [0, -2.1999, 0], faces: { north: { uv: [145, 97, 155, 121] }, east: { uv: [133, 97, 145, 121] }, south: { uv: [123, 97, 133, 121] }, west: { uv: [111, 97, 123, 121] }, up: { uv: [123, 85, 133, 97] }, down: { uv: [221, 37, 209, 27] } } }, { position: [-14.22678, 0.2, -6.50147], size: [13.3, 7.6, 19], origin: [-7.57678, 4, 2.99853], rotation: [0, -2.1999, 0], faces: { north: { uv: [215, 55, 223, 41] }, east: { uv: [223, 33, 243, 41] }, south: { uv: [251, 55, 243, 41] }, west: { uv: [223, 55, 243, 63] }, up: { uv: [243, 55, 223, 41] }, down: { uv: [223, 77, 243, 63] } } }, { position: [12.4, 29, -5], size: [-9.8, 20, 12], origin: [7.5, 39, 1], rotation: [0, 2.1999, 0], faces: { north: { uv: [190, 77, 200, 97] }, east: { uv: [178, 77, 190, 97] }, south: { uv: [168, 77, 178, 97] }, west: { uv: [156, 77, 168, 97] }, down: { uv: [168, 105, 178, 93] } } }, { position: [12.5, 5, -5], size: [-10, 24, 12], origin: [7.5, 17, 1], rotation: [0, 2.1999, 0], faces: { north: { uv: [190, 97, 200, 121] }, east: { uv: [178, 97, 190, 121] }, south: { uv: [178, 97, 168, 121] }, west: { uv: [156, 97, 168, 121] }, up: { uv: [178, 86, 168, 98] }, down: { uv: [221, 37, 209, 27] } } }, { position: [14.22677, 0.2, -6.50147], size: [-13.3, 7.6, 19], origin: [7.57677, 4, 2.99853], rotation: [0, 2.1999, 0], faces: { north: { uv: [215, 24, 223, 10] }, east: { uv: [223, 2, 243, 10] }, south: { uv: [251, 24, 243, 10] }, west: { uv: [223, 24, 243, 32] }, up: { uv: [243, 24, 223, 10] }, down: { uv: [223, 77, 243, 63] } } } ] }; // src/references/player.png var player_default2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACACAYAAADktbcKAAADDElEQVR4nOzdMW7TUBzH8YfUC3TqkqEbC1eAjYtE4gBRzhHlAJVyChbW9AZMIDEwREKwWOICoCAVqRKlcWw/2/l9PkuntnFTffMS+/19VSpbr9e/ygiapilj2O12L8rMbbfb/z5nq9Vq9seY6qoAsQQARtL3aniz2bReiQkABBOAC9T2leWcVw4ugwBAMAGAYAIAwQQAggkABBMAGMhzV1DW/n3/umJTACCYAND5lart99s7MB0CAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAYyHN7HkwFBkYlABBMAKCjOW+Hvqp9r77FYlESPBxn7akw9trThhUABBMACCYAEEwAYCRTuCejAMBIXAgEjEoAIJgAQDABgI7mfPGVAEAwAYBgAgDBBAAG4vbgwKQJAAQTAAgmABBMACCYAEAwAaAcDoc/X2vNazzndBXDEAAIJgAQTAAgmABAMAGAYAIAwQQABjKL24NPYTY5MI5BVwCXfuNRF6wwd94CQDABgGACcIGG/lxnuVye9dZut9t5yzQxAgDBBACCCUBHXSa/PmzDPUWXMxzOVkxT0zRlbAIAwQQAggkABBMACCYAEEwAIJgA0Jor+i6HAEAwAYBgAgDBBACCCQAEE4CObLRhzh798/Y9w6/2jL42u+tOMfUZg22fr1OPp+3f8dSfezy+OT7mcsGsACCYAEAwAYBgAgDBBACCCQAM6PWbd1XujnW/vzvrbIUAQDABgGACAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQ7FEANpvN3z3FfUwIPk5qrTVZt6+JwLUer3HiTIEVAAQTABjQl0/7MmUCAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQ7MkAfHj/sfTh+uZnqaH5/rX0odbjhSmwAoBgAgDBBACCCQAM6NuPz5Oe/SgAEOzJOr16+bbzVOCj65vbUkN/ZwFuSw33+ztTgRmdFQAEEwAIJgAQTAAgmABAMJ9EQ7DfAAAA//+uHsCBAAAABklEQVQDADCBnIyfROhlAAAAAElFTkSuQmCC"; // src/references/default.json var default_default = { fov: 70, preview_models: [ { id: "hytale_default", texture: "hytale/default/default.png", texture_size: [32, 32], prefabs: { grass_block: { position: [-8, 0, -8], size: [16, 16, 16], faces: { north: { uv: [0, 16, 16, 32] }, south: { uv: [0, 16, 16, 32] }, east: { uv: [0, 16, 16, 32] }, west: { uv: [0, 16, 16, 32] }, up: { uv: [0, 0, 16, 16] }, down: { uv: [16, 16, 32, 32] } } } }, cubes: [ { prefab: "grass_block", offset: [0, -1, 0], offset_space: "block" }, { prefab: "grass_block", offset: [-1, -1, 0], offset_space: "block" }, { prefab: "grass_block", offset: [1, -1, 1], offset_space: "block" }, { prefab: "grass_block", offset: [1, -1, 0], offset_space: "block" }, { prefab: "grass_block", offset: [1, -1, -1], offset_space: "block" }, { prefab: "grass_block", offset: [0, -1, 1], offset_space: "block" }, { prefab: "grass_block", offset: [-1, -1, -1], offset_space: "block" }, { prefab: "grass_block", offset: [0, -1, -1], offset_space: "block" }, { prefab: "grass_block", offset: [-1, -1, 1], offset_space: "block" }, { prefab: "grass_block", offset: [2, -1, 0], offset_space: "block" }, { prefab: "grass_block", offset: [2, -1, 1], offset_space: "block" }, { prefab: "grass_block", offset: [2, -1, -1], offset_space: "block" }, { prefab: "grass_block", offset: [-2, -1, -1], offset_space: "block" }, { prefab: "grass_block", offset: [-2, -1, 0], offset_space: "block" }, { prefab: "grass_block", offset: [-2, -1, 1], offset_space: "block" }, { prefab: "grass_block", offset: [0, -1, -2], offset_space: "block" }, { prefab: "grass_block", offset: [-1, -1, -2], offset_space: "block" }, { prefab: "grass_block", offset: [1, -1, -2], offset_space: "block" }, { prefab: "grass_block", offset: [-1, -1, 2], offset_space: "block" }, { prefab: "grass_block", offset: [1, -1, 2], offset_space: "block" }, { prefab: "grass_block", offset: [0, -1, 2], offset_space: "block" }, { prefab: "grass_block", offset: [3, -2, 0], offset_space: "block" }, { prefab: "grass_block", offset: [3, -2, 1], offset_space: "block" }, { prefab: "grass_block", offset: [3, -2, -1], offset_space: "block" }, { prefab: "grass_block", offset: [-3, -2, -1], offset_space: "block" }, { prefab: "grass_block", offset: [-3, -2, 0], offset_space: "block" }, { prefab: "grass_block", offset: [-3, -2, 1], offset_space: "block" }, { prefab: "grass_block", offset: [0, -2, -3], offset_space: "block" }, { prefab: "grass_block", offset: [-1, -2, -3], offset_space: "block" }, { prefab: "grass_block", offset: [1, -2, -3], offset_space: "block" }, { prefab: "grass_block", offset: [-1, -2, 3], offset_space: "block" }, { prefab: "grass_block", offset: [1, -2, 3], offset_space: "block" }, { prefab: "grass_block", offset: [0, -2, 3], offset_space: "block" }, { prefab: "grass_block", offset: [2, -2, -2], offset_space: "block" }, { prefab: "grass_block", offset: [-2, -2, 2], offset_space: "block" }, { prefab: "grass_block", offset: [2, -2, 2], offset_space: "block" }, { prefab: "grass_block", offset: [-2, -2, -2], offset_space: "block" } ] } ] }; // src/references/default/default.png var default_default2 = "data:image/png;base64,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"; // src/preview_scenes.ts function setupPreviewScenes() { PreviewScene.menu_categories.hytale = { _label: "Hytale" }; let base_path = "https://cdn.jsdelivr.net/gh/JannisX11/hytale-blockbench-plugin/src/references/default/"; default_default.preview_models.forEach((model) => model.texture = default_default2); new PreviewScene("hytale_default", { ...default_default, name: "Hytale", category: "hytale", cubemap: [ base_path + "skybox_0.webp", base_path + "skybox_1.webp", base_path + "skybox_2.webp", base_path + "skybox_3.webp", base_path + "skybox_4.webp", base_path + "skybox_5.webp" ] }); let player_model = new PreviewModel("hytale_player", { ...player_default, texture: player_default2 }); ViewOptionsDialog.form_config.hytale_player = { label: "Hytale Player", type: "checkbox", style: "toggle_switch", condition: { formats: FORMAT_IDS } }; if (!ViewOptionsDialog.form) { ViewOptionsDialog.build(); } else { ViewOptionsDialog.form.buildForm(); } ViewOptionsDialog.form.on("change", (arg) => { if (arg.result.hytale_player) { player_model.enable(); updateSizes(); } else { player_model.disable(); } }); function updateSizes() { let block_size = Format?.block_size ?? 64; player_model.model_3d.scale.set(block_size / 64, block_size / 64, block_size / 64); player_model.model_3d.position.x = -block_size; let model = PreviewModel.models.hytale_default; model.model_3d.scale.set(block_size / 16, block_size / 16, block_size / 16); } track(Blockbench.on("select_format", updateSizes)); } // src/uv_canvas_resize.ts var CROP_CSS = ` .uv_crop_overlay { position: absolute; inset: 0; pointer-events: none; z-index: 20; } .uv_crop_box { position: absolute; border: 2px dashed var(--color-accent); box-sizing: border-box; pointer-events: auto; cursor: move; } .uv_crop_shade { position: absolute; background: rgba(0, 0, 0, 0.5); pointer-events: none; } .uv_crop_handle { position: absolute; width: 10px; height: 10px; background: var(--color-accent); border: 1px solid var(--color-light); box-sizing: border-box; pointer-events: auto; } .uv_crop_handle.corner { width: 12px; height: 12px; } .uv_crop_handle.nw { top: -6px; left: -6px; cursor: nwse-resize; } .uv_crop_handle.n { top: -5px; left: 50%; transform: translateX(-50%); cursor: ns-resize; } .uv_crop_handle.ne { top: -6px; right: -6px; cursor: nesw-resize; } .uv_crop_handle.e { top: 50%; right: -5px; transform: translateY(-50%); cursor: ew-resize; } .uv_crop_handle.se { bottom: -6px; right: -6px; cursor: nwse-resize; } .uv_crop_handle.s { bottom: -5px; left: 50%; transform: translateX(-50%); cursor: ns-resize; } .uv_crop_handle.sw { bottom: -6px; left: -6px; cursor: nesw-resize; } .uv_crop_handle.w { top: 50%; left: -5px; transform: translateY(-50%); cursor: ew-resize; } .uv_crop_grid { position: absolute; inset: 0; pointer-events: none; overflow: hidden; } .uv_crop_grid_line { position: absolute; background: rgba(255, 255, 255, 0.2); } .uv_crop_grid_line.h { left: 0; right: 0; height: 1px; } .uv_crop_grid_line.v { top: 0; bottom: 0; width: 1px; } .uv_crop_width { position: absolute; top: -4%; left: 50%; color: var(--color-light); font-size: 24px; font-weight: 500; white-space: nowrap; pointer-events: none; transform-origin: center bottom; } .uv_crop_height { position: absolute; left: -4%; top: 50%; color: var(--color-light); font-size: 24px; font-weight: 500; white-space: nowrap; pointer-events: none; transform-origin: right center; } `; var UVCropTool = class { overlay = null; cropBox = null; uvFrame = null; bounds = { left: 0, top: 0, right: 64, bottom: 64 }; dragging = null; dragStart = { x: 0, y: 0 }; boundsStart = { left: 0, top: 0, right: 0, bottom: 0 }; texture = null; active = false; unwatchers = []; onDeactivate = null; constructor(onDeactivate) { this.onDeactivate = onDeactivate || null; } activate() { const uvVue = UVEditor.vue; this.texture = uvVue?.texture || Texture.getDefault(); if (!this.texture) { Blockbench.showQuickMessage("No texture selected", 2e3); return; } this.uvFrame = Panels.uv?.node?.querySelector("#uv_frame"); if (!this.uvFrame) { Blockbench.showQuickMessage("UV panel not found", 2e3); return; } this.active = true; this.bounds = { left: 0, top: 0, right: this.texture.uv_width, bottom: this.texture.uv_height }; this.createOverlay(); this.updateDisplay(); this.addEventListeners(); } deactivate() { if (!this.active) return; this.active = false; this.removeOverlay(); this.removeEventListeners(); this.hideQuickMessage(); this.onDeactivate?.(); } createOverlay() { if (!this.uvFrame) return; this.overlay = document.createElement("div"); this.overlay.className = "uv_crop_overlay"; for (const pos of ["top", "right", "bottom", "left"]) { const shade = document.createElement("div"); shade.className = `uv_crop_shade shade_${pos}`; this.overlay.appendChild(shade); } this.cropBox = document.createElement("div"); this.cropBox.className = "uv_crop_box"; this.cropBox.innerHTML = `
    `; this.overlay.appendChild(this.cropBox); this.uvFrame.appendChild(this.overlay); Blockbench.showQuickMessage("Enter to apply, Esc to cancel, Shift for fine control", 36e5); } hideQuickMessage() { const el = document.getElementById("quick_message_box"); if (el) el.remove(); } removeOverlay() { this.overlay?.remove(); this.overlay = null; this.cropBox = null; } getScale() { const vue = UVEditor.vue; return vue?.inner_width / (this.texture?.uv_width || 64) || 1; } getInnerOffset() { const vue = UVEditor.vue; return { x: vue?.inner_left || 0, y: vue?.inner_top || 0 }; } uvToScreen(uvX, uvY) { const scale = this.getScale(); const offset = this.getInnerOffset(); return { x: offset.x + uvX * scale, y: offset.y + uvY * scale }; } updateDisplay() { if (!this.overlay || !this.cropBox || !this.uvFrame) return; const topLeft = this.uvToScreen(this.bounds.left, this.bounds.top); const bottomRight = this.uvToScreen(this.bounds.right, this.bounds.bottom); const left = topLeft.x, top = topLeft.y; const width = bottomRight.x - topLeft.x, height = bottomRight.y - topLeft.y; Object.assign(this.cropBox.style, { left: `${left}px`, top: `${top}px`, width: `${width}px`, height: `${height}px` }); const frameWidth = this.uvFrame.clientWidth; const frameHeight = this.uvFrame.clientHeight; const shades = { top: { left: "0", top: "0", right: "0", height: `${Math.max(0, top)}px` }, bottom: { left: "0", bottom: "0", right: "0", height: `${Math.max(0, frameHeight - top - height)}px` }, left: { left: "0", top: `${Math.max(0, top)}px`, width: `${Math.max(0, left)}px`, height: `${height}px` }, right: { right: "0", top: `${Math.max(0, top)}px`, width: `${Math.max(0, frameWidth - left - width)}px`, height: `${height}px` } }; for (const [pos, styles] of Object.entries(shades)) { const el = this.overlay.querySelector(`.shade_${pos}`); if (el) Object.assign(el.style, styles); } const uvFactor = this.texture ? this.texture.width / this.texture.uv_width : 1; const pixelWidth = Math.round((this.bounds.right - this.bounds.left) * uvFactor); const pixelHeight = Math.round((this.bounds.bottom - this.bounds.top) * uvFactor); const widthEl = this.cropBox.querySelector(".uv_crop_width"); if (widthEl) { widthEl.textContent = `${pixelWidth}px`; widthEl.style.fontSize = "14px"; widthEl.style.transform = `translateX(-50%) translateY(calc(-100% - 4px))`; } const heightEl = this.cropBox.querySelector(".uv_crop_height"); if (heightEl) { heightEl.textContent = `${pixelHeight}px`; heightEl.style.fontSize = "14px"; heightEl.style.transform = `translateX(calc(-100% - 4px)) translateY(-50%)`; } this.updateGrid(width, height); } updateGrid(boxWidth, boxHeight) { if (!this.cropBox || !this.texture) return; const grid = this.cropBox.querySelector(".uv_crop_grid"); if (!grid) return; grid.innerHTML = ""; const uvFactor = this.texture.width / this.texture.uv_width; const gridStep = 32 / uvFactor; const scale = this.getScale(); const cropWidth = this.bounds.right - this.bounds.left; const cropHeight = this.bounds.bottom - this.bounds.top; const firstV = Math.ceil(this.bounds.left / gridStep) * gridStep; for (let uv = firstV; uv < this.bounds.right; uv += gridStep) { if (uv <= this.bounds.left) continue; const pct = (uv - this.bounds.left) / cropWidth * 100; const line = document.createElement("div"); line.className = "uv_crop_grid_line v"; line.style.left = `${pct}%`; grid.appendChild(line); } const firstH = Math.ceil(this.bounds.top / gridStep) * gridStep; for (let uv = firstH; uv < this.bounds.bottom; uv += gridStep) { if (uv <= this.bounds.top) continue; const pct = (uv - this.bounds.top) / cropHeight * 100; const line = document.createElement("div"); line.className = "uv_crop_grid_line h"; line.style.top = `${pct}%`; grid.appendChild(line); } } handleMouseDown = (e) => { if (!this.active) return; if (e.button === 1) return; const target = e.target; if (target.classList.contains("uv_crop_handle")) { this.dragging = target.dataset.handle; } else if (target.classList.contains("uv_crop_box") || target.closest(".uv_crop_box")) { if (target.tagName === "BUTTON") return; this.dragging = "move"; } else { return; } e.preventDefault(); e.stopPropagation(); this.dragStart = { x: e.clientX, y: e.clientY }; this.boundsStart = { ...this.bounds }; document.addEventListener("mousemove", this.handleMouseMove); document.addEventListener("mouseup", this.handleMouseUp); }; handleMouseMove = (e) => { if (!this.dragging || !this.texture) return; const scale = this.getScale(); const dx = (e.clientX - this.dragStart.x) / scale; const dy = (e.clientY - this.dragStart.y) / scale; const minSize = 1; const b = this.boundsStart; const handlers = { move: () => { this.bounds = { left: b.left + dx, right: b.right + dx, top: b.top + dy, bottom: b.bottom + dy }; }, nw: () => { this.bounds.left = Math.min(b.left + dx, b.right - minSize); this.bounds.top = Math.min(b.top + dy, b.bottom - minSize); }, n: () => { this.bounds.top = Math.min(b.top + dy, b.bottom - minSize); }, ne: () => { this.bounds.right = Math.max(b.right + dx, b.left + minSize); this.bounds.top = Math.min(b.top + dy, b.bottom - minSize); }, e: () => { this.bounds.right = Math.max(b.right + dx, b.left + minSize); }, se: () => { this.bounds.right = Math.max(b.right + dx, b.left + minSize); this.bounds.bottom = Math.max(b.bottom + dy, b.top + minSize); }, s: () => { this.bounds.bottom = Math.max(b.bottom + dy, b.top + minSize); }, sw: () => { this.bounds.left = Math.min(b.left + dx, b.right - minSize); this.bounds.bottom = Math.max(b.bottom + dy, b.top + minSize); }, w: () => { this.bounds.left = Math.min(b.left + dx, b.right - minSize); } }; handlers[this.dragging](); if (!e.shiftKey) { this.snapToGrid(); } this.snapToEdges(); this.updateDisplay(); }; // Snap bounds to 32px grid increments snapToGrid() { if (!this.texture) return; const uvFactor = this.texture.width / this.texture.uv_width; const gridStep = 32 / uvFactor; const snap = (val) => Math.round(val / gridStep) * gridStep; this.bounds.left = snap(this.bounds.left); this.bounds.right = snap(this.bounds.right); this.bounds.top = snap(this.bounds.top); this.bounds.bottom = snap(this.bounds.bottom); } // Magnetic snap to original canvas edges snapToEdges() { if (!this.texture) return; const snapThreshold = 3; const edges = { left: 0, top: 0, right: this.texture.uv_width, bottom: this.texture.uv_height }; if (Math.abs(this.bounds.left - edges.left) < snapThreshold) this.bounds.left = edges.left; if (Math.abs(this.bounds.left - edges.right) < snapThreshold) this.bounds.left = edges.right; if (Math.abs(this.bounds.right - edges.left) < snapThreshold) this.bounds.right = edges.left; if (Math.abs(this.bounds.right - edges.right) < snapThreshold) this.bounds.right = edges.right; if (Math.abs(this.bounds.top - edges.top) < snapThreshold) this.bounds.top = edges.top; if (Math.abs(this.bounds.top - edges.bottom) < snapThreshold) this.bounds.top = edges.bottom; if (Math.abs(this.bounds.bottom - edges.top) < snapThreshold) this.bounds.bottom = edges.top; if (Math.abs(this.bounds.bottom - edges.bottom) < snapThreshold) this.bounds.bottom = edges.bottom; } handleMouseUp = () => { this.dragging = null; document.removeEventListener("mousemove", this.handleMouseMove); document.removeEventListener("mouseup", this.handleMouseUp); }; handleKeyDown = (e) => { if (!this.active) return; if (e.key === "Enter") { e.preventDefault(); e.stopPropagation(); this.apply(); } else if (e.key === "Escape") { e.preventDefault(); e.stopPropagation(); this.deactivate(); } }; addEventListeners() { this.overlay?.addEventListener("mousedown", this.handleMouseDown); this.uvFrame?.addEventListener("wheel", () => this.updateDisplay()); document.addEventListener("keydown", this.handleKeyDown); Blockbench.on("resize_window", this.updateDisplay.bind(this)); const vue = UVEditor.vue; if (vue?.$watch) { for (const prop of ["zoom", "inner_left", "inner_top"]) { this.unwatchers.push(vue.$watch(prop, () => this.updateDisplay())); } this.unwatchers.push(vue.$watch("texture", () => this.deactivate())); } } removeEventListeners() { this.overlay?.removeEventListener("mousedown", this.handleMouseDown); document.removeEventListener("mousemove", this.handleMouseMove); document.removeEventListener("mouseup", this.handleMouseUp); document.removeEventListener("keydown", this.handleKeyDown); Blockbench.removeListener("resize_window", this.updateDisplay); this.unwatchers.forEach((fn) => fn()); this.unwatchers = []; } // Crops textures and adjusts UVs based on context (attachment vs main model) apply() { if (!this.texture) return; const selectedTexture = this.texture; const textureGroupUuid = selectedTexture.group; const isAttachmentTexture = !!textureGroupUuid; let texturesToCrop; let elementsToAffect; if (isAttachmentTexture) { texturesToCrop = Texture.all.filter((t) => t.group === textureGroupUuid); const relatedCollections = Collection.all.filter((c) => { const collectionTexUuid = c.texture; return texturesToCrop.some((t) => t.uuid === collectionTexUuid); }); elementsToAffect = Outliner.elements.filter( (el) => relatedCollections.some((c) => c.contains(el)) ); } else { const collectionTextureUuids = new Set( Collection.all.map((c) => c.texture).filter(Boolean) ); texturesToCrop = Texture.all.filter( (t) => !t.group && !collectionTextureUuids.has(t.uuid) ); elementsToAffect = Outliner.elements.filter( (el) => !Collection.all.some((c) => c.contains(el)) ); } if (texturesToCrop.length === 0) { Blockbench.showQuickMessage("No textures to crop", 2e3); return; } const refUvFactor = selectedTexture.width / selectedTexture.uv_width; const newWidth = Math.round((this.bounds.right - this.bounds.left) * refUvFactor); const newHeight = Math.round((this.bounds.bottom - this.bounds.top) * refUvFactor); if (newWidth < 1 || newHeight < 1) { Blockbench.showQuickMessage("Invalid crop size", 2e3); return; } Undo.initEdit({ textures: texturesToCrop, bitmap: true }); for (const texture of texturesToCrop) { const uvFactor = texture.width / texture.uv_width; const pixelLeft = Math.round(this.bounds.left * uvFactor); const pixelTop = Math.round(this.bounds.top * uvFactor); const pixelWidth = Math.round((this.bounds.right - this.bounds.left) * uvFactor); const pixelHeight = Math.round((this.bounds.bottom - this.bounds.top) * uvFactor); const tempCanvas = document.createElement("canvas"); tempCanvas.width = texture.width; tempCanvas.height = texture.height; tempCanvas.getContext("2d").drawImage(texture.img, 0, 0); texture.width = texture.canvas.width = pixelWidth; texture.height = texture.canvas.height = pixelHeight; const ctx = texture.ctx; ctx.clearRect(0, 0, pixelWidth, pixelHeight); ctx.imageSmoothingEnabled = false; ctx.drawImage(tempCanvas, -pixelLeft, -pixelTop); texture.uv_width = pixelWidth / uvFactor; texture.uv_height = pixelHeight / uvFactor; texture.updateChangesAfterEdit(); } Undo.finishEdit(isAttachmentTexture ? "Crop attachment texture" : "Crop model textures"); const cubes = elementsToAffect.filter((el) => el instanceof Cube && !!el.faces); if (cubes.length && (this.bounds.left || this.bounds.top)) { Undo.initEdit({ elements: cubes }); const offsetX = this.bounds.left; const offsetY = this.bounds.top; for (const cube of cubes) { if (cube.box_uv) { cube.uv_offset[0] -= offsetX; cube.uv_offset[1] -= offsetY; } else { for (const key in cube.faces) { const uv = cube.faces[key].uv; uv[0] -= offsetX; uv[1] -= offsetY; uv[2] -= offsetX; uv[3] -= offsetY; } } } Canvas.updateView({ elements: cubes, element_aspects: { uv: true } }); Undo.finishEdit("Adjust UV after cropping"); } UVEditor.vue.$forceUpdate(); this.deactivate(); } }; var cropTool = null; var resizeToggle = null; function setupUVCanvasResize() { const style = Blockbench.addCSS(CROP_CSS); track(style); cropTool = new UVCropTool(() => { resizeToggle?.set(false); }); let originalReverseSelect = UVEditor.reverseSelect; UVEditor.reverseSelect = function(...args) { if (cropTool.active) return; originalReverseSelect.call(UVEditor, ...args); }; track({ delete() { UVEditor.reverseSelect = originalReverseSelect; } }); resizeToggle = new Toggle("hytale_resize_uv_canvas", { name: "Resize UV Canvas", icon: "crop", category: "uv", condition: { formats: FORMAT_IDS, modes: ["edit"] }, onChange: (value) => { if (value) { cropTool?.activate(); } else { cropTool?.deactivate(); } } }); track(resizeToggle); Toolbars.uv_editor?.add(resizeToggle, 1); track(Blockbench.on("select_mode", () => { cropTool?.deactivate(); resizeToggle?.set(false); })); track({ delete: () => { cropTool?.deactivate(); cropTool = null; resizeToggle = null; } }); } // src/alt_duplicate.ts function setupAltDuplicate() { const keybindItem = new KeybindItem("hytale_duplicate_drag_modifier", { name: "Duplicate While Dragging", description: "Hold this key while dragging the gizmo to duplicate", keybind: new Keybind({ key: 18 }), category: "edit" }); track(keybindItem); let isDragging = false; let modifierWasPressed = false; let isCombinedUndoActive = false; let combinedUndoCubesBefore = 0; let combinedUndoGroups = []; let originalInitEdit = null; let originalFinishEdit = null; function isModifierPressed(event) { const kb = keybindItem.keybind; if (kb.key === 18 || kb.alt) return event.altKey || Pressing.overrides.alt; if (kb.key === 17 || kb.ctrl) return event.ctrlKey || Pressing.overrides.ctrl; if (kb.key === 16 || kb.shift) return event.shiftKey || Pressing.overrides.shift; if (kb.key === 91 || kb.ctrl) return event.metaKey || Pressing.overrides.ctrl; } function isModifierKey(event) { const kb = keybindItem.keybind; return event.keyCode === kb.key || event.key === "Alt" && (kb.key === 18 || kb.alt) || event.key === "Control" && (kb.key === 17 || kb.ctrl) || event.key === "Shift" && (kb.key === 16 || kb.shift); } function duplicateGroups() { const allNewGroups = []; const oldSelectedGroups = Group.multi_selected.slice(); Group.multi_selected.empty(); for (const group of oldSelectedGroups) { group.selected = false; const newGroup = group.duplicate(); newGroup.forEachChild((g) => allNewGroups.push(g), Group, true); newGroup.multiSelect(); allNewGroups.push(newGroup); } return allNewGroups; } function duplicateElements() { Outliner.selected.slice().forEach((obj, i) => { if (obj.parent instanceof OutlinerElement && obj.parent.selected) return; Outliner.selected[i] = obj.duplicate(); }); } function performDuplicationForCombinedUndo(shouldInitEdit) { const hasGroups = Group.all.some((g) => g.selected); const hasElements = Outliner.selected.length > 0; if (!hasGroups && !hasElements) return false; combinedUndoCubesBefore = Outliner.elements.length; combinedUndoGroups = []; originalInitEdit = Undo.initEdit.bind(Undo); originalFinishEdit = Undo.finishEdit.bind(Undo); if (shouldInitEdit) { originalInitEdit({ outliner: true, elements: [], groups: [], selection: true }); } Undo.initEdit = () => { }; Undo.finishEdit = () => { }; if (hasGroups) { combinedUndoGroups = duplicateGroups(); } else { duplicateElements(); } updateSelection(); isCombinedUndoActive = true; return true; } function finishCombinedUndo() { if (!isCombinedUndoActive) return; isCombinedUndoActive = false; if (originalInitEdit) Undo.initEdit = originalInitEdit; if (originalFinishEdit) Undo.finishEdit = originalFinishEdit; originalInitEdit = null; originalFinishEdit = null; Undo.finishEdit("Duplicate and move", { outliner: true, elements: Outliner.elements.slice(combinedUndoCubesBefore), groups: combinedUndoGroups, selection: true }); } function onMouseDown(event) { if (isCombinedUndoActive) return; const axis = Transformer?.axis; const hasSelection = Outliner.selected.length > 0 || Group.all.some((g) => g.selected); const isTransformTool = Toolbox.selected?.id === "move_tool" || Toolbox.selected?.id === "rotate_tool"; if (!axis || !hasSelection || !isTransformTool || !Modes.edit) return; if (isModifierPressed(event)) { event.stopImmediatePropagation(); if (!performDuplicationForCombinedUndo(true)) return; isDragging = true; modifierWasPressed = true; setTimeout(() => { event.target?.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true, cancelable: true, clientX: event.clientX, clientY: event.clientY, button: event.button, buttons: event.buttons, view: window, pointerId: 1, pointerType: "mouse" })); }, 0); } else { isDragging = true; modifierWasPressed = false; } } function onKeyDown(event) { if (!isDragging || !isModifierKey(event) || modifierWasPressed) return; const isTransformTool = Toolbox.selected?.id === "move_tool" || Toolbox.selected?.id === "rotate_tool"; if (!isTransformTool || !Modes.edit) return; modifierWasPressed = true; const shouldInitEdit = isCombinedUndoActive; if (isCombinedUndoActive) finishCombinedUndo(); performDuplicationForCombinedUndo(shouldInitEdit); } function onKeyUp(event) { if (isModifierKey(event)) modifierWasPressed = false; } function onMouseUp() { isDragging = false; modifierWasPressed = false; if (isCombinedUndoActive) setTimeout(finishCombinedUndo, 0); } const events = [ ["pointerdown", onMouseDown], ["pointerup", onMouseUp], ["mouseup", onMouseUp], ["keydown", onKeyDown], ["keyup", onKeyUp] ]; events.forEach(([type, handler]) => document.addEventListener(type, handler, true)); track({ delete: () => events.forEach(([type, handler]) => document.removeEventListener(type, handler, true)) }); } // src/change_orientation.ts function canChangeParentGroup(cube) { let parent = cube.parent; if (parent instanceof Group == false || !parent.selected) return false; if (parent.children.find((c) => c instanceof Cube == false || !c.selected)) return false; return true; } function changeCubeOrientation(axis, direction) { let affected_groups = []; let changed_groups = []; for (let cube of Cube.selected) { if (canChangeParentGroup(cube)) affected_groups.safePush(cube.parent); } Undo.initEdit({ elements: Cube.selected, groups: affected_groups }); for (let cube of Cube.selected) { let flip_direction = direction == -1; if (axis == 1) flip_direction = !flip_direction; let node_to_rotate = canChangeParentGroup(cube) ? cube.parent : cube; let quat_initial = Reusable.quat2.copy(node_to_rotate.mesh.quaternion); cube.roll(axis, flip_direction ? 3 : 1, node_to_rotate.origin); if (changed_groups.includes(node_to_rotate)) { continue; } else if (node_to_rotate instanceof Group) { changed_groups.push(node_to_rotate); } let change_euler = Reusable.euler1.set(0, 0, 0); change_euler[getAxisLetter(axis)] = Math.degToRad(-direction * 90); node_to_rotate.mesh.quaternion.multiplyQuaternions(quat_initial, Reusable.quat1.setFromEuler(change_euler)); let new_rotation = node_to_rotate.mesh.rotation.toArray().slice(0, 3).map((r) => Math.radToDeg(r)); node_to_rotate.rotation.V3_set(new_rotation.map((r) => Math.roundTo(r, 2))); node_to_rotate.preview_controller.updateTransform(node_to_rotate); } ; Undo.finishEdit("Change cube orientation"); updateSelection(); } function setupChangeOrientation() { let action = new Action("change_cube_orientation", { name: "Change Orientation", icon: "screen_rotation_up", condition: { modes: ["edit"], selected: { cube: true } }, children: [ { id: "x_plus", name: "X+", icon: "rotate_right", color: "x", click() { changeCubeOrientation(0, 1); } }, { id: "x_minus", name: "X-", icon: "rotate_left", color: "x", click() { changeCubeOrientation(0, -1); } }, { id: "y_plus", name: "Y+", icon: "rotate_right", color: "y", click() { changeCubeOrientation(1, 1); } }, { id: "y_minus", name: "Y-", icon: "rotate_left", color: "y", click() { changeCubeOrientation(1, -1); } }, { id: "z_plus", name: "Z+", icon: "rotate_right", color: "z", click() { changeCubeOrientation(2, 1); } }, { id: "z_minus", name: "Z-", icon: "rotate_left", color: "z", click() { changeCubeOrientation(2, -1); } } ], click(e) { new Menu("change_cube_orientation", this.children, {}).open(e.target); } }); for (let item of action.children) { action.addSubKeybind(item.id, item.name, null, item.click); } MenuBar.menus.transform.addAction(action); track(action); } // src/shortcuts.ts function setupShortcuts() { const brush_tool = BarItems.brush_tool; let last_brush_preset = Painter.default_brush_presets[0]; let selecting = false; brush_tool.addSubKeybind("switch_preset", "Switch Preset", null, (event) => { if (Toolbox.selected == brush_tool && !selecting) { let options = brush_tool.side_menu.structure(); options = options.slice(0, -2); let index = options.findIndex((option) => option.name == last_brush_preset?.name); let next_index = (index + 1) % options.length; let next_option = options[next_index]; next_option.click(null, event); Blockbench.showQuickMessage(`Brush ${next_index + 1}: ${tl(next_option.name)}`); } }); let select_listener = brush_tool.on("select", () => { selecting = true; setTimeout(() => selecting = false, 60); }); let originalApplyBrushPreset = Painter.loadBrushPreset; Painter.loadBrushPreset = function(preset) { last_brush_preset = preset; originalApplyBrushPreset.call(Painter, preset); }; track({ delete() { select_listener.delete(); delete brush_tool.sub_keybinds.switch_preset; Painter.loadBrushPreset = originalApplyBrushPreset; } }); } // src/plugin.ts BBPlugin.register("hytale_plugin", { title: "Hytale Models", author: "JannisX11, Kanno", icon: "icon.png", version: package_default.version, description: "Create models and animations for Hytale", tags: ["Hytale"], variant: "both", min_version: "5.0.5", await_loading: true, has_changelog: true, creation_date: "2025-12-22", contributes: { formats: FORMAT_IDS, open_extensions: ["blockymodel"] }, repository: "https://github.com/JannisX11/hytale-blockbench-plugin", bug_tracker: "https://github.com/JannisX11/hytale-blockbench-plugin/issues", contributors: ["Hedaox", "MelodicAlbuild"], onload() { setupFormats(); setupElements(); setupAnimation(); setupAnimationCodec(); setupAttachments(); setupOutlinerFilter(); setupChecks(); setupPhotoshopTools(); setupUVCycling(); setupTextureHandling(); setupAltDuplicate(); setupNameOverlap(); setupUVOutline(); setupTempFixes(); setupChangeOrientation(); setupPreviewScenes(); setupUVCanvasResize(); setupShortcuts(); let panel_setup_listener; function showCollectionPanel() { const local_storage_key = "hytale_plugin:collection_panel_setup"; if (localStorage.getItem(local_storage_key)) return true; if (!Modes.edit) return false; if (Panels.collections.slot == "hidden") { Panels.collections.moveTo("right_bar"); } if (Panels.collections.folded) { Panels.collections.fold(); } if (panel_setup_listener) { panel_setup_listener.delete(); panel_setup_listener = void 0; } localStorage.setItem(local_storage_key, "true"); return true; } if (!showCollectionPanel()) { panel_setup_listener = Blockbench.on("select_mode", showCollectionPanel); } let on_finish_edit = Blockbench.on("generate_texture_template", (arg) => { for (let element of arg.elements) { if (typeof element.autouv != "number") continue; element.autouv = 1; } }); track(on_finish_edit); let pivot_marker = new CustomPivotMarker(); track(pivot_marker); let group_pivot_indicator = new GroupPivotIndicator(); track(group_pivot_indicator); }, onunload() { cleanup(); } }); })(); //! Copyright (C) 2025 Hypixel Studios Canada inc. //! Licensed under the GNU General Public License, see LICENSE.MD ================================================ FILE: plugins/image_centering.js ================================================ (async function() { let aboutAction; const id = "image_centering"; const name = "Image Centering"; const icon = "center_focus_strong"; const author = "SirJain"; let button; const links = { twitter: "https://twitter.com/SirJain2", discord: "https://discord.gg/wM4CKTbFVN" } Plugin.register(id, { title: name, icon, author, description: "Adds a button and a keybind that centers the image viewport in an Image format.", about: "This plugin adds a button that allows you to reset your viewport in the Image format.\n## How to use\nTo use this plugin, go to the brush toolbar (top of the image mode) and click the `Center Image Viewport` button. If it doesn't show up, make sure you are in the Image format. If you are, you can add the tool using the `Customize Toolbar` option. There will be a confirmation message displayed on-screen once you center the viewport.\n\nPlease report any bugs or suggestions you may have.", tags: ["Format: Image", "UX"], version: "1.1.1", min_version: "4.4.0", variant: "both", oninstall: () => showAbout(true), onload() { addAboutButton(); button = new Action("image_center_button", { name: "Center Image Viewport", icon: icon, description: "Center the viewport of your image", condition: () => Format?.id == "image", click: () => center(), keybind: new Keybind({key: 'c', shift: false}) }) Toolbars.brush.add(button); }, onunload() { aboutAction.delete(); button.delete(); MenuBar.removeAction(`help.about_plugins.about_${id}`); Blockbench.showQuickMessage("Uninstalled Image Centering plugin", 2000); } }) // Resets everything - calls the function that resets the position and the zoom function center() { setViewport(); setZoom(); Blockbench.showQuickMessage("Centered viewport!", 1500); } // Resets the viewport position function setViewport() { let uv_viewport = UVEditor.vue.$refs.viewport; if (!uv_viewport) return; UVEditor.setZoom(Project.uv_viewport.zoom); Vue.nextTick(() => { uv_viewport.scrollLeft = Project.uv_viewport.offset[0] * UVEditor.vue.inner_width + UVEditor.width/2; uv_viewport.scrollTop = Project.uv_viewport.offset[1] * UVEditor.vue.inner_height + UVEditor.height/2; }) } // Resets the zoom of the viewport function setZoom(zoom) { let max_zoom = Math.round((UVEditor.vue.texture ? UVEditor.vue.texture.height : Project.texture_width) * 32 / UVEditor.width); zoom = Math.clamp(zoom, 0.85, Math.clamp(max_zoom, 16, 64)); UVEditor.vue.zoom = zoom; Project.uv_viewport.zoom = UVEditor.zoom; Vue.nextTick(() => { if (Painter.selection.overlay) UVEditor.updatePastingOverlay(); }) } // Adds an about button for more plugin information function addAboutButton() { let about = MenuBar.menus.help.structure.find(e => e.id === "about_plugins"); if (!about) { about = new Action("about_plugins", { name: "About Plugins...", icon: "info", children: [] }) MenuBar.addAction(about, "help"); } aboutAction = new Action(`about_${id}`, { name: `About ${name}...`, icon, click: () => showAbout() }) about.children.push(aboutAction); } // Shows the about dialog function showAbout(banner) { const infoBox = new Dialog({ id: "about", title: name, width: 780, buttons: [], lines: [`
  • ${banner ? `` : ""}

    ${name}

    Adds a button that centers the image viewport in an Image format.

    Worth noting:

    - You need to be in the Image format for this plugin to work.

    - You can add or remove the button from the toolbar using the Customize Toolbar button.

    How to use:

    To use this plugin, go to the brush toolbar (top of the image mode) and click the Center Image Viewport button. There will be a confirmation message displayed on-screen once you center the viewport. You can also use the c keybind.


    `] }).show() $("dialog#about .dialog_title").html(` ${icon} ${name} `) } })() ================================================ FILE: plugins/java_block_sequencer/about.md ================================================ # Java Block Sequencer v1.0.0 Adds the option to turn animation keyframes into a sequence of Minecraft block/item models. This will not export any item definition files for the exported models, so these must be referenced manually in a resource pack. Requires Minecraft 1.21.11 or later. ## How it works The Java Block Sequencer (JBS) introduces a format which adds the `Java Block Sequence` button to the Animate tab. The JBS exports Java Block models similar to how the OBJ Animation Exporter tool by JannisX11 exports OBJ models. Whenever an animation is exported with JBS, each frame goes through 6 stages: - create undo state for model - resolve model tree into cubes - bake transforms into outliner - save model to zip archive under the selected animation name - undo changes ## How to use Start by creating a new model or converting an existing cube-based project into a **Java Block Sequence**. Create an animation. Right-click your animation. Click **Export Java Block Sequence** from the drop-down menu. Each model will be displayed in-game based on settings in the Display tab. ## Troubleshooting - If the exported models aren't getting rotated or positioned properly, make sure the groups/bones used in your animation have been checked (`Export: On`) in the outliner. ================================================ FILE: plugins/java_block_sequencer/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2025-12-14", "author": "Jatzylap", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] } } ================================================ FILE: plugins/java_block_sequencer/java_block_sequencer.js ================================================ (function() { let codec, format, export_action; const description = 'Exports an animation into a sequence of Minecraft block/item models.' const icon = 'icon.png' BBPlugin.register('java_block_sequencer', { title: 'Java Block Sequencer', icon, author: 'Jatzylap', description, tags: ["Minecraft: Java Edition", "Exporter", "Animation"], version: '1.0.0', min_version: '5.0.5', variant: 'both', creation_date: "2025-12-27", has_changelog: true, repository: "https://github.com/Jatzylap/Java-Block-Sequencer", onload() { codec = Codecs.java_block; // Defaults to 1.21.11+ format format = new ModelFormat({ id: "java_block_sequence", name: "Java Block Sequence", extension: "json", icon: "icon-objects", category: "minecraft", format_page: { component: { methods: { create: () => format.new() }, template: `

    ${description}

    Target : Minecraft: Java Edition

    About:

    • Adds the option to turn an animation into a sequence of Minecraft block/item models.
    • This will not export any item definition files for the exported models, so these must be referenced manually in a resource pack.
    • Requires Minecraft 1.21.11 or later.

    How to use:

    • Create a new model or convert an existing cube-based project into a Java Block Sequence.
    • Create an animation.
    • Right-click your animation.
    • Click Export Java Block Sequence from the drop-down menu.
    • Each model will be displayed in-game based on settings in the Display tab.

    Troubleshooting:

    • If the exported models aren't getting rotated or positioned properly, make sure the groups/bones used in your Java Block Sequence have been checked (Export: On) in the outliner.

    ` } }, render_sides: "front", model_identifier: false, parent_model_id: true, vertex_color_ambient_occlusion: true, bone_rig: true, rotate_cubes: true, optional_box_uv: true, uv_rotation: true, java_cube_shading_properties: true, java_face_properties: true, cullfaces: true, animated_textures: true, select_texture_for_particles: true, texture_mcmeta: true, display_mode: true, animation_mode: true, texture_folder: true, animation_controllers: true, animation_files: true, codec }) codec.format = format; export_anim_action = new Action('export_java_block_sequence', { name: 'Export Java Block sequence', description: 'Export animation into Java Block models', icon: 'icon-objects', category: 'animation', condition: () => Modes.animate && Animation.selected, click() { new Dialog({ id: 'export_java_block_sequence', title: 'Export Java Block Sequence', form: { length: {label: 'Length', type: 'number', value: Animation.selected.length, min: 0, max: 10000}, fps: {label: 'FPS', type: 'number', value: Animation.selected.snapping, min: 1, max: 1000}, }, onConfirm({length, fps}) { let archive = new JSZip(); Timeline.setTime(0); for (let frame = 0; frame <= length * fps; frame++) { Timeline.setTime(frame / fps); Animator.preview(); let elements = Outliner.elements; Undo.initEdit({elements, outliner: true, groups: Group.all}); let animatable_elements = Outliner.elements.filter(el => el.constructor.animator); [...Group.all, ...animatable_elements].forEach(node => { let offset_rotation = [0, 0, 0]; let offset_position = [0, 0, 0]; let offset_scale = [1, 1, 1]; Animator.animations.forEach(animation => { if (animation.playing) { let animator = animation.getBoneAnimator(node); let multiplier = animation.blend_weight ? Math.clamp(Animator.MolangParser.parse(animation.blend_weight), 0, Infinity) : 1; if (node instanceof Group) { if (animator.channels.rotation) { let rotation = animator.interpolate('rotation'); if (rotation instanceof Array) offset_rotation.V3_add(rotation.map(v => v * multiplier)); } if (animator.channels.position) { let position = animator.interpolate('position'); if (position instanceof Array) offset_position.V3_add(position.map(v => v * multiplier)); } if (animator.channels.scale) { let scale = animator.interpolate('scale'); if (scale instanceof Array) offset_scale.V3_multiply(scale.map(v => v * multiplier)); } } } }); // Rotation if (node.getTypeBehavior('rotatable')) { node.rotation[0] += offset_rotation[0]; node.rotation[1] += offset_rotation[1]; node.rotation[2] += offset_rotation[2]; } // Position, Scale function offset(node) { if (node instanceof Group) { node.origin.V3_add(offset_position); node.children.forEach(offset); } else { if (node.from) node.from.V3_add(offset_position); if (node.to) node.to.V3_add(offset_position); if (node.origin && node.origin !== node.from) node.origin.V3_add(offset_position); // Scale let before_from = node.from; let before_to = node.to; let before_origin = node.origin; let new_origin = node.parent.origin; new_origin.forEach(function(ogn, i) { if (node.from) { node.from[i] = (before_from[i] - node.inflate - ogn) * offset_scale[i]; node.from[i] = node.from[i] + node.inflate + ogn; } if (node.to) { node.to[i] = (before_to[i] + node.inflate - ogn) * offset_scale[i]; node.to[i] = node.to[i] - node.inflate + ogn; if (Format.integer_size) { node.to[i] = node.from[i] + Math.round(node.to[i] - node.from[i]) } } if (node.origin) { node.origin[i] = (before_origin[i] - ogn) * offset_scale[i]; node.origin[i] = node.origin[i] + ogn; } }); } } // Resolve mesh positions from bones function resolve(node) { var array = node.children.slice(); var index = node.getParentArray().indexOf(node) let all_elements = []; let all_groups = [node]; node.forEachChild(obj => { if (obj instanceof Group == false) { all_elements.push(obj); } else { all_groups.push(obj); } }); array.forEach((obj) => { obj.addTo(node.parent, index) if ((obj instanceof Cube && Format.rotate_cubes) || (obj instanceof OutlinerElement && obj.getTypeBehavior('rotatable')) || (obj instanceof Group && Format.bone_rig)) { let quat = new THREE.Quaternion().copy(obj.mesh.quaternion); quat.premultiply(obj.mesh.parent.quaternion); let e = new THREE.Euler().setFromQuaternion(quat, obj.mesh.rotation.order); obj.extend({ rotation: [ Math.roundTo(Math.radToDeg(e.x), 4), Math.roundTo(Math.radToDeg(e.y), 4), Math.roundTo(Math.radToDeg(e.z), 4), ] }); } if (obj.mesh) { let pos = new THREE.Vector3().copy(obj.mesh.position); pos.applyQuaternion(node.mesh.quaternion).sub(obj.mesh.position); let diff = pos.toArray(); if (obj.from) obj.from.V3_add(diff); if (obj.to) obj.to.V3_add(diff); if (obj.getTypeBehavior('rotatable') || obj instanceof Group) obj.origin.V3_add(diff); if (obj instanceof Group) { obj.forEachChild(child => { if (child instanceof Mesh) { for (let vkey in child.vertices) { child.vertices[vkey].V3_add(diff); } } if (child instanceof Cube) child.from.V3_add(diff); if (child.to) child.to.V3_add(diff); if (child.origin) child.origin.V3_add(diff); }); } } }); Canvas.updateView({elements: array, element_aspects: {transform: true}}); } offset(node); resolve(node); }); let javablockmodel = codec.compile(Project); archive.file(`${frame}.json`, javablockmodel); Undo.finishEdit(`Java Block Sequence Cache`); Undo.undo(); } archive.generateAsync({type: 'blob'}).then(content => { Blockbench.export({ resource_id: 'model', type: 'Zip Archive', extensions: ['zip'], name: Animation.selected.name, content: content, savetype: 'zip' }); }); } }).show(); } }); export_model_action = new Action({ id: 'export_blockmodel', icon: 'icon-format_block', category: 'file', condition: () => Format == format, click: function () { codec.export(); } }) import_model_action = new Action('import_java_block_model', { icon: 'assessment', category: 'file', condition: () => Format == format, click: function () { Blockbench.import({ resource_id: 'model', extensions: ['json'], type: codec.name, multiple: true, }, function(files) { files.forEach(file => { var model = autoParseJSON(file.content, {file_path: file.path}) codec.parse(model, file.path, { import_to_current_project: true }) }) }) } }) Animation.prototype.menu.addAction(export_anim_action, '-1'); MenuBar.addAction(export_model_action, "file.export.0") MenuBar.addAction(import_model_action, "file.import.0") }, onunload() { codec.delete(); format.delete(); export_action.delete(); } }); })() ================================================ FILE: plugins/java_block_sequencer/members.yml ================================================ maintainers: - Jatzylap ================================================ FILE: plugins/let_there_be_noise/about.md ================================================ ## How to use Let There Be Noise 1. Select a texture in the textures panel in Paint Mode 2. Click the Image dropdown in the toolbar 3. Adjust the settings: - **Amount** = Strength of the noise applied - **Coverage** = Percentage of pixels affected in the image or selection - **Seed** = The seed for the noise applied allows for deterministic noise across texture variants - **Mode** = Uniform by default, provides additional options. Selecting **per channel** allows you to **apply/filter** noise to targeted colour channels 4: Click **Confirm** to apply the changes to the texture/selection ### Per Channel Mode - As listed above in mode, **per channel** applies noise to specific RGBA channels individually. This is intended for editing packed textures like MERS without affecting other colour channels. ### Additional features - Supports selections, select an area first to apply noise within that region ================================================ FILE: plugins/let_there_be_noise/let_there_be_noise.js ================================================ (function() { let dialog = null; let preview = null; let previewCtx = null; let original = null; Plugin.register('let_there_be_noise', { title: 'Let there Be Noise', author: 'Momoko', icon: 'grain', description: 'Adds a noise adding function to BlockBench, supports selections and colour channels', version: '1.0.0', min_version: '4.8.0', variant: 'both', tags: ['Texture', 'Paint', 'Tool'], creation_date: '2026-03-25', onload() { this.action = new Action('add_noise.apply', { name: 'Add Noise', description: 'Apply noise to the currently selected texture', icon: 'grain', category: 'textures', click: () => { const tex = Texture.getDefault() || Texture.all[0]; if(!tex) { Blockbench.showQuickMessage('No texture Selected or Found', 2000); return; } //guard for versions of BlockBench that may not have getActiveCanvas() 4 ctx const active = tex.getActiveCanvas ? tex.getActiveCanvas() : tex; const canvas = active.canvas || tex.canvas; const ctx = active.ctx || tex.ctx; original = ctx.getImageData(0,0, tex.width, tex.height); if(dialog) dialog.hide(); dialog = new Dialog({ id: 'add_noise.dialog', title: 'Add Noise', width: 500, form: { //source used for checkerboard via https://css-tricks.com/ preview_box: { type: 'info', text: '
    ' }, amount: { label: 'Amount', type: 'range', min: 0, max: 100, value: 20, step: 1, full_width: true }, coverage: { label: 'Coverage', type: 'range', min: 0, max: 100, value: 100, step: 1, full_width: true }, seed: { label: 'Seed', type: 'number', value: 1, step: 1, min: 0 }, mode_separator: { type: 'info', text: '
    ' }, channel_mode: { label: 'Mode', type: 'select', options: { 'uniform': 'Uniform (All Channels)', 'individual': 'Per-Channel Control' }, value: 'uniform' }, channel_separator: { type: 'info', text: '

    Channel Control

    ', condition: (form) => form.channel_mode === 'individual' }, red_channel: { label: 'Red Channel (Metalness)', type: 'checkbox', value: true, condition: (form) => form.channel_mode === 'individual' }, green_channel: { label: 'Green Channel (Emissive)', type: 'checkbox', value: false, condition: (form) => form.channel_mode === 'individual' }, blue_channel: { label: 'Blue Channel (Roughness)', type: 'checkbox', value: false, condition: (form) => form.channel_mode === 'individual' }, alpha_channel: { label: 'Alpha Channel (Subsurface)', type: 'checkbox', value: false, condition: (form) => form.channel_mode === 'individual' } }, onFormChange: function(data) { refreshPreview(tex, data); }, onConfirm: function(data) { applyNoise(tex, data); dialog.hide(); }, onCancel: function() { dialog.hide(); }, onOpen: function() { setTimeout(function() { preview = document.getElementById('add_noise_preview'); if(preview) { previewCtx = preview.getContext('2d'); preview.width = tex.width; preview.height = tex.height; preview.style.width = '400px'; preview.style.height = 'auto'; preview.style.aspectRatio = preview.width + ' / ' + preview.height; refreshPreview(tex, dialog.getFormResult()); }}, 100);}});dialog.show();}}); MenuBar.addAction(this.action, 'image'); }, onunload() { if (this.action) this.action.delete(); if(dialog) dialog.hide(); }}); function getSelectedBounds(tex){ if(!tex.selection || tex.selection.override === true) return null; const arr = tex.selection.array; const width = tex.width; const height = tex.height; if(!arr || arr.length !== width * height) return null; let minX = width, minY = height, maxX = -1, maxY = -1; for(let i = 0; i < arr.length; i++) { if(arr[i] > 0){ const x = i % width; const y = (i / width) | 0; if(x < minX) minX = x; if(y < minY) minY = y; if(x > maxX) maxX = x; if(y > maxY) maxY = y; }} if(maxX < 0) return null; return{x:minX, y:minY, w:(maxX - minX + 1), h:(maxY - minY + 1)}; } function refreshPreview(tex, data){ if(!previewCtx || !original) return; const result = processNoise(tex, data, original, true); previewCtx.putImageData(result, 0, 0); } function applyNoise(tex, data) { const active = tex.getActiveCanvas ? tex.getActiveCanvas() : tex; const canvas = active.canvas || tex.canvas; const ctx = canvas.getContext('2d'); Undo.initEdit({ textures: [tex], bitmap: true }); const src = ctx.getImageData(0,0,tex.width,tex.height); const result = processNoise(tex, data, src, true); ctx.putImageData(result, 0, 0); tex.updateChangesAfterEdit(); Undo.finishEdit('Add noise'); } function processNoise(tex, data, srcData, useSelect) { const rng = mulberry32(seedTo32(data.seed)); const out = new Uint8ClampedArray(srcData.data); const amount = Number(data.amount) || 0; const coverage = (Number(data.coverage) || 0) / 100; const isIndividualMode = data.channel_mode === 'individual'; const channels = { r: isIndividualMode ? (data.red_channel === true) : true, g: isIndividualMode ? (data.green_channel === true) : true, b: isIndividualMode ? (data.blue_channel === true) : true, a: isIndividualMode ? (data.alpha_channel === true) : false }; let select = (tex.selection && tex.selection.override !== true) ? tex.selection.array : null; if(select && select.length !== srcData.width * srcData.height) select = null; const tex_w = srcData.width; let x0 = 0, y0 = 0, w0 = srcData.width, h0 = srcData.height; const bounds = getSelectedBounds(tex); if(!bounds) select = null; if(bounds) { x0 = bounds.x; y0 = bounds.y; w0 = bounds.w; h0 = bounds.h; } for(let y = 0; y < srcData.height; y++){ for(let x = 0; x < srcData.width; x++){ const p = (y * srcData.width + x) * 4; const coverageVal = rng(); const nr = (rng() * 2 - 1) * amount; const ng = (rng() * 2 - 1) * amount; const nb = (rng() * 2 - 1) * amount; const na = (rng() * 2 - 1) * amount; if(useSelect && bounds){ if(x < x0 || y < y0 || x >= (x0 + w0) || y >= (y0 + h0)) continue; } if(select && useSelect) { const gi = y * tex_w + x; if(select[gi] <= 0) continue;} if(coverageVal > coverage) continue; if(isIndividualMode) { if(channels.r) out[p] = clamp(out[p] + nr); if(channels.g) out[p + 1] = clamp(out[p + 1] + ng); if(channels.b) out[p + 2] = clamp(out[p + 2] + nb); if(channels.a) out[p + 3] = clamp(out[p + 3] + na); } else { out[p] = clamp(out[p] + nr); out[p + 1] = clamp(out[p + 1] + nr); out[p + 2] = clamp(out[p + 2] + nr); } }} return new ImageData(out, srcData.width, srcData.height); } function clamp(v){ return v < 0 ? 0 : (v > 255 ? 255 : v); } function seedTo32(seed){ seed = Number(seed) || 0; seed = seed | 0; return seed >>> 0; } //mulberry function rng https://github.com/cprosche/mulberry32 function mulberry32(a){ return function() { a |= 0; a = (a + 0x6D2B79F5) | 0; let t = Math.imul(a ^ (a >>> 15), 1 | a); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; } } })(); ================================================ FILE: plugins/light_tracer_uploader.js ================================================ (function() { let action, setting_login; async function getToken(login, password) { var data = new FormData() data.append('login', login) data.append('password', password) let result = await $.ajax({ url: 'https://lighttracer.org/app/generate/', data: data, cache: false, contentType: false, processData: false, type: 'POST' }) if (result && result.message && result.message.token) { settings.light_tracer_login.value = login; return result.message.token; } else { Blockbench.showMessageBox({ title: 'Failed to Upload Model', icon: 'error', message: (result && result.message) ? result.message : 'Cannot connect to server', }) console.error(result) } } async function uploadLightTracerModel() { if (Cube.all.length === 0) return; let login = Settings.get('light_tracer_login'); var dialog = new Dialog({ id: 'light_tracer_uploader', title: 'Upload To Light Tracer', width: 540, form: { login: {label: 'Email', value: login}, password: {label: 'Password', value: '', type: 'password'}, info: {label: ' ', nocolon: true, type: 'info', text: 'Don\'t have an account? [Sign up](https://lighttracer.org/accounts/signup/)'}, name: {label: 'Name', value: Project.name}, description: {label: 'Description', type: 'textarea'}, public: {label: 'Public', type: 'checkbox'}, }, onConfirm: async function(formResult) { if (!formResult.login || !formResult.password) { Blockbench.showQuickMessage('Email and password are required') return; } dialog.hide(); Blockbench.showQuickMessage('Uploading... this may take a few moments...', 3000) let token = await getToken(formResult.login, formResult.password); if (!token) return; var data = new FormData() data.append('login', formResult.login); data.append('token', token); data.append('name', formResult.name); data.append('description', formResult.description); data.append('public', formResult.public); Codecs.gltf.compile({animations: false}, (content) => { var blob = new Blob([content], {type: "text/plain;charset=utf-8"}); var file = new File([blob], 'model.gltf'); data.append('file', file); $.ajax({ url: 'https://lighttracer.org/app/model/', data: data, cache: false, contentType: false, processData: false, type: 'POST', success: function(response) { let link = `https://lighttracer.org/dash/model/${response.id}`; Blockbench.showMessageBox({ title: 'Model uploaded to Light Tracer', message: `[${formResult.name}](${link})`, }) }, error: function(response) { Blockbench.showMessageBox({ title: 'Failed to Upload Model', icon: 'error', message: `Unable to upload model`, }) console.error(response); } }) }) } }) dialog.show(); } Plugin.register('light_tracer_uploader', { title: 'Light Tracer Uploader', icon: 'fas.fa-feather', author: 'JannisX11', description: 'Upload models to Light Tracer to share them or to create renders', version: '0.0.1', variant: 'both', onload() { action = new Action({ id: 'upload_light_tracer', name: 'Upload to Light Tracer', icon: 'fas.fa-feather', category: 'file', click: () => { uploadLightTracerModel(); } }); MenuBar.addAction(action, 'file.export'); setting_login = new Setting('light_tracer_login', { name: 'Light Tracer Email', description: 'Light Tracer login email address', category: 'export', value: '', type: 'text' }); }, onunload() { action.delete(); setting_login.delete(); } }) })() ================================================ FILE: plugins/live_dev_reloader/about.md ================================================

    This plugin adds a way to edit both plugin and theme files in a text editor of your choice, and have them automatically update inside Blockbench upon you saving the file.

    When a plugin file is being watched for changes, it's about.md file will be automatically watched for changes too.

    Theme files support both .bbtheme and .css files being watched.

    How to use

    Watching files

    To watch a file, have a theme or plugin file ready, then go to Help > Developer > Live Dev Reloader. From here, select Watch plugin or theme file, then select your plugin or theme file.

    Unwatching files

    To stop watching a file, go to Help > Developer > Live Dev Reloader and select Stop watching plugin or theme file.

    Persistent mode

    To have a plugin or theme continue to be watched next time Blockbench is loaded, enable persistent mode. This can be found at Help > Developer > Live Dev Reloader > Persist after restart.

    ================================================ FILE: plugins/live_dev_reloader/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2024-01-20", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.0.1": { "title": "1.0.1", "date": "2024-06-08", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed reloading themes that change the viewport size causing the viewport to render incorrectly", "Fixed theme name in theme reload logging" ] } ] }, "1.0.2": { "title": "1.0.2", "date": "2025-06-03", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed \"Plugin not installed\" when Live Dev Reloader loads before the watched plugin" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] } ] } } ================================================ FILE: plugins/live_dev_reloader/live_dev_reloader.js ================================================ let fs, actions, watching, message, styles, unwatchAction, rewatchAction const id = "live_dev_reloader" const name = "Live Dev Reloader" const icon = "refresh" Plugin.register(id, { title: name, icon: "icon.png", author: "Ewan Howell", description: "Edit plugins and themes live in any text editor and have them automatically update in Blockbench.", tags: ["Plugins", "Themes", "Blockbench"], version: "1.1.0", min_version: "5.0.0", variant: "desktop", website: "https://ewanhowell.com/plugins/live-dev-reloader/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/live_dev_reloader", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Live Dev Reloader]", creation_date: "2024-01-20", has_changelog: true, onload() { let toggle actions = [ new Action("live_dev_reloader_watch", { plugin: id, name: "Watch plugin or theme file", icon: "visibility", description: "Watch a plugin or theme file and reload it in Blockbench when changes are made", condition: () => !watching, click() { Blockbench.import({ extensions: ["js", "bbtheme", "css"], type: "Plugin or Theme", }, files => watch(files[0].path)) } }), toggle = new Toggle("live_dev_reloader_persist", { name: "Persist after restart", description: "The file should continue being watched after a Blockbench restart", icon, onChange(state) { localStorage.setItem("live_dev_reloader_persist", state) } }) ] setTimeout(() => { const file = localStorage.getItem("live_dev_reloader_file") if (localStorage.getItem("live_dev_reloader_file") && localStorage.getItem("live_dev_reloader_persist") === "true") { toggle.set(true) if (localStorage.getItem("live_dev_reloader_stopped") === "true") rewatch() else watch(file, true) } else if (localStorage.getItem("live_dev_reloader_stopped") === "true") rewatch() }, 0) MenuBar.addAction({ name, id, children: actions, icon, }, "help.developer.1") }, onunload() { actions.forEach(e => e.delete()) if (fs) { unwatch("reload") } MenuBar.removeAction(`help.developer.${id}`) } }) function getFS() { fs = require("fs", { message: "This permission is required to load and detect changes in plugin and theme files on your computer.", optional: false }) if (!fs) { throw new Error("fs access denied") } } function watch(file, first) { getFS() if (!fs.existsSync(file)) { localStorage.removeItem("live_dev_reloader_file") unwatch("force") return Blockbench.showQuickMessage(`Stopped watching. File not found: ${PathModule.basename(file)}`, 3000) } fs.watchFile(file, { interval: 100 }, (...args) => update(...args, true)) fs.watchFile(PathModule.join(PathModule.dirname(file), "about.md"), { interval: 100 }, update) watching = file update({ mtime: 1 }, { mtime: 0 }, true, true) localStorage.setItem("live_dev_reloader_file", file) Blockbench.showQuickMessage(`Watching file: ${PathModule.basename(file)}`, 3000) if (unwatchAction) { unwatchAction.delete() actions.splice(actions.indexOf(unwatchAction), 1) } unwatchAction = new Action("live_dev_reloader_unwatch", { plugin: id, name: "Stop watching plugin or theme file", icon: "visibility_off", description: `Currently watching: ${file}`, condition: () => watching, click: () => unwatch("manual") }) actions.unshift(unwatchAction) localStorage.setItem("live_dev_reloader_stopped", false) } function unwatch(type) { getFS() if (watching) { fs.unwatchFile(watching) fs.unwatchFile(PathModule.join(PathModule.dirname(watching), "about.md")) } styles?.delete() message?.close() if (type === "force") localStorage.removeItem("live_dev_reloader_file") else if (type === "manual") { localStorage.setItem("live_dev_reloader_stopped", true) rewatch() Blockbench.showQuickMessage(`Stopped watching ${PathModule.basename(watching)}`, 3000) } else if (type === "reload") { if (watching && localStorage.getItem("live_dev_reloader_persist") === "true") localStorage.setItem("live_dev_reloader_stopped", false) else localStorage.setItem("live_dev_reloader_stopped", true) } watching = false } function rewatch() { getFS() if (rewatchAction) { rewatchAction.delete() actions.splice(actions.indexOf(rewatchAction), 1) } const file = localStorage.getItem("live_dev_reloader_file") if (fs.existsSync(file)) { rewatchAction = new Action("live_dev_reloader_rewatch", { plugin: id, name: `Rewatch ${PathModule.basename(file)}`, description: `Rewatch the file: ${file}`, icon, condition: () => !watching && localStorage.getItem("live_dev_reloader_stopped") === "true" && localStorage.getItem("live_dev_reloader_file"), click: () => watch(file) }) actions.push(rewatchAction) } } async function update(curr, prev, main, first) { getFS() if (main && curr.mtimeMs === 0) { Blockbench.showQuickMessage(`Stopped watching. File not found: ${PathModule.basename(watching)}`, 3000) return unwatch("force") } else if (curr.mtime > prev.mtime) { message?.close() styles?.delete() if (watching.endsWith(".js")) { const id = PathModule.basename(watching, ".js") const plugin = Plugins.all.find(e => e.id === id && e.source === "file") if (!plugin) return message = Blockbench.showMessageBox({ title: "Plugin not installed", message: `Please install the ${id} plugin so that it can be watched for live changes.\n\nPlugin location: ${watching}`, buttons: ["Install Plugin", "Stop Watching", "dialog.close"] }, button => { if (button === 0) Blockbench.read(watching, {}, f => new Plugin().loadFromFile(f[0], true)) else if (button === 1) unwatch("force") }) if (first) return plugin.reload() console.log(`Plugin reloaded: ${id}`) } else { let css = fs.readFileSync(watching) let name if (watching.endsWith(".bbtheme")) { try { const data = JSON.parse(css) name = data.name css = `body{` if (data.main_font) css += `--font-custom-main: ${data.main_font};` if (data.headline_font) css += `--font-custom-headline: ${data.headline_font};` if (data.code_font) css += `--font-custom-code: ${data.code_font};` if (data.colors) for (const [id, col] of Object.entries(data.colors)) { css += `--color-${id}: ${col} !important;` } css += "}" if (data.borders) { const borders = (await fetch("css/general.css").then(e => e.text()).catch(() => "")).match(/(?<=\/\* Theme Borders \*\/)(?:.|\r\n|\r)*?(?=\/\*|$)/) if (borders) css += borders[0].replace(/([\n\r\t]|\.theme_borders)/g, "") css += "body #plugin_list > li {border: 1px solid var(--color-border);margin: 0;" } css += data.css ?? "" } catch (err) { return message = Blockbench.showMessageBox({ title: "Invalid JSON", message: `Invalid JSON in theme ${PathModule.basename(watching)}:\n${err.message}\n\nTheme location: ${watching}`, buttons: ["Stop Watching", "dialog.close"] }, button => { if (button === 0) unwatch("force") }) } } styles = Blockbench.addCSS(css) resizeWindow() console.log(`Theme reloaded: ${name ?? PathModule.basename(watching).split(".").slice(0, -1).join(".")}`) } } } ================================================ FILE: plugins/mc_text_generator.js ================================================ (async function() { // Global variables let aboutAction let textLength, textGroup, randNum, letterGroup, yOffset, numLines // Plugin information variables const id = "mc_text_generator" const name = "Text Generator" const icon = "text_format" const author = "SirJain" // Links used in about dialog const links = { twitter: "https://twitter.com/SirJain2", discord: "https://discord.gg/wM4CKTbFVN", website: "https://sirjain0.github.io/" } // Register the plugin Plugin.register(id, { title: name, icon, author, description: "Generates blocky text in cubes.", about: "This plugin adds a button under the `Tools` menu that allows you to generate Minecraft-like text.\n## How to use\nTo use this plugin, go to `Tools > Generate Text`. Simply enter some text, configure your settings how you like, and press `Generate`!\n\nPlease report any bugs or suggestions you may have.", tags: ["Deprecated", "Minecraft", "Font"], version: "2.0.1", min_version: "4.2.0", variant: "both", oninstall: () => showAbout(true), onload() { addAboutButton() // Define the dialog const generateTextDialog = new Blockbench.Dialog("generate_text_dialog", { name: "Generate Text", icon: icon, buttons: ["Generate", "Cancel"], lines: [` `], form: { input: { label: "Enter Text", type: "text", full_width: true, value: "", description: "The text that will be converted into 3D geometry." }, divider: "_", letterSpace: { label: "Letter Spacing", type: "number", min: 0, value: 0.3, description: "The amount of space between each letter." }, wordSpace: { label: "Word Spacing", type: "number", value: 1, min: 0, description: "The amount of space between words." }, depth: { label: "Depth", type: "number", min: 0, value: 4, description: "The thickness of the letters. If 0, the letters will appear flat." }, rotation: { label: "Rotation", type: "range", min: -45, value: 0, max: 45, step: 22.5, description: "The rotation of the text." }, generateLayer: { label: "Generate Layer", type: "checkbox", value: false, condition: formData => formData.depth === 0, description: "Generates a second layer to the text which can be used for stuff like dropshadows." }, checkboxSpacer: "_", javaCheckbox: { label: "Show Java Block/Item Warnings", type: "checkbox", value: true, description: "If enabled, Blockbench will show an error box if text exceeds the 48x48x48 pixel limit in the Java Block/Item format. It is highly recommended to leave this on." }, bedrockCheckbox: { label: "Show Bedrock Block Warnings", type: "checkbox", value: true, description: "If enabled, Blockbench will show an error box if text exceeds the 30x30x30 pixel limit in the Bedrock Block format. It is highly recommended to leave this on." } }, onConfirm(formData) { // Check - Did the user leave fields blank? if (formData.input == "") { Blockbench.showMessageBox({ title: "No valid text", message: "Make sure you don't leave the text field blank." }) generateTextDialog.hide() } // Run if everything is okay else { generateTextDialog.hide() // Character maps - each array in the 'cubes' component represents a cube. const charMap = { a: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [3, 0, 0, 5, 8, formData.depth], [2, 3, 0, 3, 5, formData.depth] ] }, b: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [2, 0, 0, 3, 2, formData.depth], [2, 3, 0, 3, 5, formData.depth], [3, 3.5, 0, 4, 4.5, formData.depth], [3, 0, 0, 5, 3.5, formData.depth], [3, 4.5, 0, 5, 8, formData.depth], ] }, c: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 5, 8, formData.depth], [2, 0, 0, 5, 2, formData.depth] ] }, d: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 0, 0, 4, 2, formData.depth], [2, 6, 0, 4, 8, formData.depth], [3, 2, 0, 4, 6, formData.depth], [4, 1, 0, 5, 7, formData.depth], ] }, e: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 5, 8, formData.depth], [2, 3, 0, 4, 5, formData.depth], [2, 0, 0, 5, 2, formData.depth] ] }, f: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 5, 8, formData.depth], [2, 3, 0, 4, 5, formData.depth] ] }, g: { width: 5, cubes: [ [0, 2, 0, 2, 8, formData.depth], [0, 0, 0, 5, 2, formData.depth], [3, 2, 0, 5, 4, formData.depth], [2, 6, 0, 5, 8, formData.depth], ] }, h: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [3, 0, 0, 5, 8, formData.depth], [2, 3, 0, 3, 5, formData.depth] ] }, i: { width: 2, cubes: [ [0, 0, 0, 2, 8, formData.depth] ] }, j: { width: 5, cubes: [ [0, 0, 0, 5, 2, formData.depth], [3, 2, 0, 5, 8, formData.depth], [1, 6, 0, 3, 8, formData.depth] ] }, k: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 2.5, 0, 3, 5.5, formData.depth], [3, 0, 0, 4, 8, formData.depth], [4, 5, 0, 5, 8, formData.depth], [4, 0, 0, 5, 3, formData.depth], ] }, l: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 0, 0, 5, 2, formData.depth] ] }, m: { width: 7, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 3, 0, 3, 7, formData.depth], [3, 2, 0, 4, 6, formData.depth], [4, 3, 0, 5, 7, formData.depth], [5, 0, 0, 7, 8, formData.depth], ] }, n: { width: 6, cubes: [ [0, 0, 0, 2, 8, formData.depth], [4, 0, 0, 6, 8, formData.depth], [2, 3, 0, 3, 6, formData.depth], [3, 2, 0, 4, 5, formData.depth], ] }, o: { width: 6, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 4, 8, formData.depth], [4, 0, 0, 6, 8, formData.depth], [2, 0, 0, 4, 2, formData.depth] ] }, p: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [3, 3, 0, 5, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [2, 3, 0, 3, 5, formData.depth] ] }, q: { width: 5.5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [3, 0, 0, 5, 8, formData.depth], [2, 0, 0, 3, 2, formData.depth], [3.5, -0.5, 0, 5.5, 3.5, formData.depth] ] }, r: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [2, 3, 0, 3, 5, formData.depth], [3, 4, 0, 5, 8, formData.depth], [3, 0, 0, 5, 3, formData.depth], [3, 3, 0, 4, 4, formData.depth], ] }, s: { width: 5, cubes: [ [0, 0, 0, 5, 2, formData.depth], [0, 3, 0, 5, 5, formData.depth], [0, 6, 0, 5, 8, formData.depth], [3, 2, 0, 5, 3, formData.depth], [0, 5, 0, 2, 6, formData.depth], ] }, "$": { width: 5, cubes: [ [0, 0, 0, 5, 2, formData.depth], [0, 3, 0, 5, 5, formData.depth], [0, 6, 0, 5, 8, formData.depth], [1.5, 8, 0, 3.5, 9, formData.depth], [1.5, -1, 0, 3.5, 0, formData.depth], [3, 2, 0, 5, 3, formData.depth], [0, 5, 0, 2, 6, formData.depth], ] }, t: { width: 5, cubes: [ [1.5, 0, 0, 3.5, 6, formData.depth], [0, 6, 0, 5, 8, formData.depth], ] }, u: { width: 6, cubes: [ [0, 0, 0, 2, 8, formData.depth], [4, 0, 0, 6, 8, formData.depth], [2, 0, 0, 4, 2, formData.depth] ] }, v: { width: 5.75, cubes: [ [0, 4, 0, 2, 8, formData.depth], [3.75, 4, 0, 5.75, 8, formData.depth], [0.75, 2, 0, 5, 4, formData.depth], [1.75, 0, 0, 3.75, 2, formData.depth], ] }, w: { width: 6.5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [4.5, 0, 0, 6.5, 8, formData.depth], [2, 1, 0, 2.5, 4, formData.depth], [4, 1, 0, 4.5, 4, formData.depth], [2.5, 2, 0, 4, 6, formData.depth], ] }, x: { width: 5, cubes: [ [0, 0, 0, 2, 2.75, formData.depth], [0, 5.25, 0, 2, 8, formData.depth], [3, 5.25, 0, 5, 8, formData.depth], [3, 0, 0, 5, 2.75, formData.depth], [1.25, 2.25, 0, 3.75, 5.75, formData.depth], ] }, y: { width: 5, cubes: [ [0, 4, 0, 2, 8, formData.depth], [3, 4, 0, 5, 8, formData.depth], [1.25, 0, 0, 3.75, 5, formData.depth], ] }, z: { width: 5, cubes: [ [0, 0, 0, 5, 2, formData.depth], [0, 6, 0, 5, 8, formData.depth], [0, 2, 0, 2, 3, formData.depth], [1, 3, 0, 3, 4, formData.depth], [2, 4, 0, 4, 5, formData.depth], [3, 5, 0, 5, 6, formData.depth], ] }, 0: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [3, 0, 0, 5, 8, formData.depth], [2, 0, 0, 3, 2, formData.depth] ] }, 1: { width: 3, cubes: [ [0, 5, 0, 1, 7, formData.depth], [1, 0, 0, 3, 8, formData.depth], ] }, 2: { width: 5, cubes: [ [0, 0, 0, 5, 2, formData.depth], [0, 3, 0, 5, 5, formData.depth], [0, 6, 0, 5, 8, formData.depth], [0, 2, 0, 2, 3, formData.depth], [3, 5, 0, 5, 6, formData.depth], ] }, 3: { width: 5, cubes: [ [0, 0, 0, 5, 2, formData.depth], [0, 3, 0, 5, 5, formData.depth], [0, 6, 0, 5, 8, formData.depth], [3, 2, 0, 5, 3, formData.depth], [3, 5, 0, 5, 6, formData.depth], ] }, 4: { width: 5, cubes: [ [0, 3, 0, 2, 8, formData.depth], [2, 3, 0, 3, 5, formData.depth], [3, 0, 0, 5, 8, formData.depth], ] }, 5: { width: 5, cubes: [ [0, 0, 0, 4.25, 2, formData.depth], [0, 3, 0, 4.25, 5, formData.depth], [0, 6, 0, 5, 8, formData.depth], [3, 2, 0, 4.25, 3, formData.depth], [0, 5, 0, 2, 6, formData.depth], [4.25, 0.5, 0, 5, 4.5, formData.depth], ] }, 6: { width: 5, cubes: [ [0, 0, 0, 5, 2, formData.depth], [0, 3, 0, 5, 5, formData.depth], [0, 6, 0, 5, 8, formData.depth], [3, 2, 0, 5, 3, formData.depth], [0, 2, 0, 2, 3, formData.depth], [0, 5, 0, 2, 6, formData.depth], ] }, 7: { width: 5, cubes: [ [0, 6, 0, 5, 8, formData.depth], [3, 0, 0, 5, 6, formData.depth], ] }, 8: { width: 5, cubes: [ [0, 0, 0, 2, 8, formData.depth], [3, 0, 0, 5, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [2, 0, 0, 3, 2, formData.depth], [2, 3, 0, 3, 5, formData.depth], ] }, 9: { width: 5, cubes: [ [0, 6, 0, 5, 8, formData.depth], [0, 3, 0, 3, 5, formData.depth], [0, 0, 0, 3, 2, formData.depth], [0, 5, 0, 2, 6, formData.depth], [3, 0, 0, 5, 6, formData.depth], ] }, ".": { width: 3, cubes: [ [0, 0, 0, 2, 2, formData.depth] ] }, "!": { width: 2, cubes: [ [0, 0, 0, 2, 2, formData.depth], [0, 4, 0, 2, 8, formData.depth] ] }, "-": { width: 4, cubes: [ [0, 3, 0, 4, 5, formData.depth] ] }, "+": { width: 4, cubes: [ [0, 3.25, 0, 4, 4.75, formData.depth], [1.25, 2, 0, 2.75, 6, formData.depth] ] }, ":": { width: 2, cubes: [ [0, 0, 0, 2, 2, formData.depth], [0, 4, 0, 2, 6, formData.depth] ] }, ";": { width: 2, cubes: [ [0, 4, 0, 2, 6, formData.depth], [0, -1, 0, 2, 2, formData.depth] ] }, ",": { width: 2, cubes: [ [0, -1, 0, 2, 2, formData.depth] ] }, "'": { width: 2, cubes: [ [0, 6, 0, 2, 9, formData.depth] ] }, "?": { width: 4, cubes: [ [1, 0, 0, 3, 2, formData.depth], [1, 3, 0, 3, 5, formData.depth], [0, 6, 0, 4, 8, formData.depth], [2, 5, 0, 4, 6, formData.depth] ] }, "[": { width: 3, cubes: [ [0, 0, 0, 2, 8, formData.depth], [2, 6, 0, 3, 8, formData.depth], [2, 0, 0, 3, 2, formData.depth] ] }, "(": { width: 3, cubes: [ [0, 1, 0, 2, 7, formData.depth], [1, 6, 0, 3, 8, formData.depth], [1, 0, 0, 3, 2, formData.depth] ] }, "]": { width: 3, cubes: [ [1, 0, 0, 3, 8, formData.depth], [0, 6, 0, 1, 8, formData.depth], [0, 0, 0, 1, 2, formData.depth] ] }, ")": { width: 3, cubes: [ [1, 1, 0, 3, 7, formData.depth], [0, 6, 0, 2, 8, formData.depth], [0, 0, 0, 2, 2, formData.depth] ] }, "/": { width: 6, cubes: [ [0, 0, 0, 3, 2, formData.depth], [1, 2, 0, 4, 4, formData.depth], [2, 4, 0, 5, 6, formData.depth], [3, 6, 0, 6, 8, formData.depth], ] }, " ": { width: formData.wordSpace, cubes: [] } } let offset = 0 yOffset = 0 let textCube, layerCube textLength = 0 let invalidCubeCount = 0 numLines = 1 Undo.initEdit({group: textGroup, elements: [], outliner: true}) textGroup = new Group({name: 'text_' + formData.input}).init() layerBaseGroup = new Group('layer_base') /* Double for-loop that handles the generation of text. Outer for loop iterates through each character. Inner for loop iterates through each cube array in the char map. */ for (const char of formData.input.toLowerCase()) { // Check for an invalid character if (!charMap.hasOwnProperty(char) && char !== "\\") { Blockbench.showQuickMessage("Invalid Character(s) Detected", 1300) invalidCubeCount++ continue } if (char === "\\") { yOffset += 10 offset = 0 numLines++ continue } letterGroup = new Group('character_' + char).init() layerGroup = new Group('layer_character_' + char) randNum = getRandomInt(8) for (const cube of charMap[char].cubes) { textCube = new Cube({ name: "text_" + formData.input, from: [cube[0] + offset, cube[1] - yOffset, cube[2]], to: [cube[3] + offset, cube[4] - yOffset, cube[5]], rotation: [formData.rotation, 0, 0], color: randNum }).addTo(letterGroup).init() textCube.flip(0, 2.0, true) // Generate layer if user checked the box if (formData.generateLayer == true && formData.depth == 0) { layerGroup.init() layerBaseGroup.init() layerCube = new Cube({ name: "text_" + formData.input + "_layer", from: [cube[0] + 0.2 + offset, cube[1] - 0.2 - yOffset, cube[2] + 0.2], to: [cube[3] + offset + 0.2, cube[4] - 0.2 - yOffset, cube[5] + 0.2], rotation: [formData.rotation, 0, 0], color: randNum }).addTo(layerGroup).init() layerCube.flip(0, 2.0, true) layerGroup.addTo(layerBaseGroup) layerBaseGroup.addTo(textGroup) } } offset += charMap[char].width + formData.letterSpace textLength += charMap[char].width + formData.letterSpace letterGroup.addTo(textGroup) } textGroup.openUp().select() centerText() Canvas.updateView({groups: [textGroup, Group.selected], transform: true}); Undo.finishEdit("Generated Text", {elements: selected, group: textGroup, outliner: true}); // Alter quick message based on if there are invalid cubes if (invalidCubeCount == 0) { Blockbench.showQuickMessage("Generated text: '" + formData.input + "'") } else { Blockbench.showQuickMessage("Generated text: '" + formData.input + "'. Skipped over invalid character(s).") } } // Check for format restrictions if ( Format?.id === "java_block" && formData.javaCheckbox == true && (textLength - formData.letterSpace >= 48 || 9*numLines >= 48) ) showRestrictionWarning("`48x48x48`") else if ( Format?.id === "bedrock_block" && formData.bedrockCheckbox == true && (textLength - formData.letterSpace >= 30 || 9*numLines >= 30) ) showRestrictionWarning("`30x30x30`") } }) const textAction = new Action({ id: "generate_text_action", name: "Generate Text", icon: icon, description: "Input some text and let Blockbench generate the letters.", condition: () => Format?.id !== "image" && Format?.id !== "skin", click: () => generateTextDialog.show() }) MenuBar.addAction(textAction, "tools") }, onunload() { Blockbench.showQuickMessage("Uninstalled " + name, 2000) aboutAction.delete() MenuBar.removeAction(`help.about_plugins.about_${id}`) MenuBar.removeAction("tools.generate_text_action") } }) // Generate random int (called for marker colors) function getRandomInt(max) { return Math.floor(Math.random() * max); } // Center selected elements on all axes function centerText() { centerElements(0) centerElements(1) centerElements(2) } // Add about button function addAboutButton() { let about = MenuBar.menus.help.structure.find(e => e.id === "about_plugins") if (!about) { about = new Action("about_plugins", { name: "About Plugins...", icon: "info", children: [] }) MenuBar.addAction(about, "help") } aboutAction = new Action(`about_${id}`, { name: `About ${name}...`, icon, click: () => showAbout() }) about.children.push(aboutAction) } // Show a message box if the format has size restrictions function showRestrictionWarning(units) { Blockbench.showMessageBox({ title: "Format restrictions", message: "The format you are in restricts all models to " + units + " units. Your text exceeds that limit. Please make your text smaller using `Transform -> Scale`, otherwise it will break in-game.

    Your text has still been generated." }) } // Show about dialog function showAbout(banner) { const infoBox = new Dialog({ id: "about", title: name, width: 780, buttons: [], lines: [`
  • ${banner ? `` : ""}

    ${name}

    Generates blocky text in cubes.

    Worth noting:

    - Some formats may break the look of the text because of size restrictions.

    - Text generated by this plugin is NOT from official Minecraft font files, but simply a replica. Fonts may not be completely accurate to the original Minecraft font.

    - To make new lines: Type \\

    How to use:

    To use this plugin, go to Tools > Generate Text. Simply enter some text, configure your settings how you like, and press Generate!


    `] }).show() $("dialog#about .dialog_title").html(` ${icon} ${name} `) } })() ================================================ FILE: plugins/menu_icon_exporter/LICENSE.md ================================================ MIT License Copyright (c) 2025 NET 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. ================================================ FILE: plugins/menu_icon_exporter/about.md ================================================ # Menu Icon Exporter Export Blockbench models as PNG icons with stable camera framing, live preview, and full manual camera controls. ![Menu Icon Exporter Preview](https://raw.githubusercontent.com/HMC-Studios/Menu-Icon-Exporter/main/images/plugin_example.png) ## Highlights - Auto-frame model with stable reset behavior - Manual camera controls: zoom, rotate X/Y/Z, pan X/Y - Size presets: 16, 32, 48, 64, 128, plus custom - Background options: transparent, white, black, gray, custom color - Export quality options: Standard (4x), High (8x), Ultra (16x) - Save mode options for ask-each-time or auto-save folder - Workspace-aware auto-save folder defaults when using the Workspaces plugin - Workspace rename-safe preferences so renamed workspaces keep the same saved default folder - Two view modes: Float (dialog window) and Panel (sidebar) ## Usage - Float: File -> Export -> Export Menu Icon - Panel: File -> Export -> Icon Exporter Panel - Switch between Float and Panel using the mode bar at the top of any view ## Notes PNG output works across Blockbench formats and platforms. Platform-specific size, naming, and folder rules still apply. When Workspaces is installed, save mode and output folder preferences are remembered per active workspace, including workspace renames. by NET ================================================ FILE: plugins/menu_icon_exporter/menu_icon_exporter.js ================================================ // ========================= // Plugin state // ========================= let iconExporterAction; let iconExporterPanel = null; let iconExporterPanelVue = null; let iconExporterPanelRequestedMode = 'panel'; const PLUGIN_BROWSER_ICON = 'icon.svg'; const ACTION_ICON = 'data:image/png;base64,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'; let activeResetButton = null; let cachedToolbarIconDataUrl = null; let toolbarIconDataUrlPromise = null; const WORLD_UP = new THREE.Vector3(0, 1, 0); let dialogCameraRestoreState = null; let dialogDefaultFramedCameraState = null; let isolatedDialogPreview = null; const EXPORT_PREFS_KEY = 'menu_icon_exporter_export_prefs_v2'; const DEFAULT_EXPORT_PREFS = Object.freeze({ save_mode: 'ask_dialog', output_folder: '', icon_size: '', custom_size: 48, background: 'transparent', custom_color: '#ff0000', quality: 'high' }); let cachedExportPrefsText = ''; const EXPORT_PREFS_LAST_WORKSPACE_KEY = 'menu_icon_exporter_last_workspace_v1'; const EXPORT_PREFS_WORKSPACES_SNAPSHOT_KEY = 'menu_icon_exporter_workspaces_snapshot_v1'; function getWorkspaceState() { if (typeof localStorage === 'undefined') return null; try { let raw = localStorage.getItem('workspaces'); if (!raw) return []; let parsed = JSON.parse(raw); if (!Array.isArray(parsed)) return []; return parsed .map((workspace, index) => { let name = workspace && typeof workspace.name === 'string' ? workspace.name.trim() : ''; let projects = workspace && Array.isArray(workspace.projects) ? workspace.projects : []; let projectSignature = '[]'; try { projectSignature = JSON.stringify(projects); } catch (error) { projectSignature = '[]'; } return { name: name, active: workspace && workspace.active === true, index: index, projectSignature: projectSignature }; }) .filter(workspace => !!workspace.name); } catch (error) { return []; } } function getActiveWorkspaceName(workspaceState = null) { let state = Array.isArray(workspaceState) ? workspaceState : getWorkspaceState(); if (!Array.isArray(state) || !state.length) return null; let activeWorkspace = state.find(workspace => workspace.active === true); if (!activeWorkspace) return null; if (activeWorkspace.name === 'Default') return null; return activeWorkspace.name; } function loadWorkspaceSnapshot() { if (typeof localStorage === 'undefined') return []; try { let raw = localStorage.getItem(EXPORT_PREFS_WORKSPACES_SNAPSHOT_KEY); if (!raw) return []; let parsed = JSON.parse(raw); if (!Array.isArray(parsed)) return []; return parsed .filter(workspace => workspace && typeof workspace.name === 'string' && typeof workspace.index === 'number') .map(workspace => ({ name: workspace.name, index: workspace.index, projectSignature: typeof workspace.projectSignature === 'string' ? workspace.projectSignature : '[]' })); } catch (error) { return []; } } function saveWorkspaceSnapshot(workspaceState = []) { if (typeof localStorage === 'undefined') return; try { let snapshot = workspaceState.map(workspace => ({ name: workspace.name, index: workspace.index, projectSignature: workspace.projectSignature })); localStorage.setItem(EXPORT_PREFS_WORKSPACES_SNAPSHOT_KEY, JSON.stringify(snapshot)); } catch (error) { } } function migrateWorkspacePrefsOnRename(workspaceState = []) { if (typeof localStorage === 'undefined') return; if (!Array.isArray(workspaceState) || !workspaceState.length) return; let previousState = loadWorkspaceSnapshot(); if (!previousState.length) return; let currentNames = new Set(workspaceState.map(workspace => workspace.name)); let previousNames = new Set(previousState.map(workspace => workspace.name)); let removed = previousState.filter(workspace => workspace.name !== 'Default' && !currentNames.has(workspace.name)); let added = workspaceState.filter(workspace => workspace.name !== 'Default' && !previousNames.has(workspace.name)); if (removed.length !== 1 || added.length !== 1) return; let previousWorkspace = removed[0]; let currentWorkspace = added[0]; if (previousWorkspace.index !== currentWorkspace.index) return; if (previousWorkspace.projectSignature !== currentWorkspace.projectSignature) return; let previousKey = `${EXPORT_PREFS_KEY}::${previousWorkspace.name}`; let currentKey = `${EXPORT_PREFS_KEY}::${currentWorkspace.name}`; if (localStorage.getItem(currentKey) !== null) return; let previousValue = localStorage.getItem(previousKey); if (typeof previousValue === 'string') { localStorage.setItem(currentKey, previousValue); } } function getExportPrefsKey() { let workspaceState = getWorkspaceState(); let workspaceName = getActiveWorkspaceName(workspaceState); if (typeof localStorage !== 'undefined') { try { migrateWorkspacePrefsOnRename(workspaceState); let previousActiveWorkspace = localStorage.getItem(EXPORT_PREFS_LAST_WORKSPACE_KEY) || ''; if (workspaceName && previousActiveWorkspace && workspaceName !== previousActiveWorkspace) { let previousStillExists = Array.isArray(workspaceState) && workspaceState.some(workspace => workspace.name === previousActiveWorkspace); if (!previousStillExists) { let previousKey = `${EXPORT_PREFS_KEY}::${previousActiveWorkspace}`; let currentKey = `${EXPORT_PREFS_KEY}::${workspaceName}`; if (localStorage.getItem(currentKey) === null) { let previousValue = localStorage.getItem(previousKey); if (typeof previousValue === 'string') { localStorage.setItem(currentKey, previousValue); } } } } localStorage.setItem(EXPORT_PREFS_LAST_WORKSPACE_KEY, workspaceName || ''); saveWorkspaceSnapshot(Array.isArray(workspaceState) ? workspaceState : []); } catch (error) { } } if (!workspaceName) return EXPORT_PREFS_KEY; return `${EXPORT_PREFS_KEY}::${workspaceName}`; } const PLUGIN_REPOSITORY = 'https://github.com/HMC-Studios/Menu-Icon-Exporter'; const PLUGIN_BUG_TRACKER = 'https://github.com/HMC-Studios/Menu-Icon-Exporter/issues'; const PLUGIN_ABOUT = `Export Blockbench models as PNG icons with stable camera framing. ![Menu Icon Exporter Preview](https://raw.githubusercontent.com/HMC-Studios/Menu-Icon-Exporter/main/images/plugin_example.png) ### Highlights - Auto-frame model with stable reset behavior - Manual camera controls (zoom, pan, rotate X/Y/Z) - Live preview while adjusting controls - 16/32/48/64/128 presets plus custom size - Transparent, solid, or custom background color - Export quality multipliers (4x, 8x, 16x) - Save mode options (ask each time or auto-save folder) - Two view modes: Float (dialog), Panel (sidebar) PNG output works across Blockbench formats and platforms. Platform-specific size, naming, and folder rules still apply.`; // ========================= // Export preferences // ========================= function canUseAppFileSystem() { return typeof require === 'function' || typeof requireNativeModule === 'function'; } let _pluginDialog = null; function _getDialog() { if (_pluginDialog) return _pluginDialog; try { _pluginDialog = require('dialog'); } catch (e) {} return _pluginDialog; } function isBlockbench5OrNewer() { return typeof Blockbench !== 'undefined' && typeof Blockbench.isNewerThan === 'function' && Blockbench.isNewerThan('4.99'); } function getNativeModule(moduleName, options = null) { let moduleRef = null; if (typeof requireNativeModule === 'function') { try { moduleRef = options ? requireNativeModule(moduleName, options) : requireNativeModule(moduleName); } catch (error) { } } if (!moduleRef && typeof require === 'function') { try { moduleRef = require(moduleName); } catch (error) { } } return moduleRef; } function normalizeExportPrefs(source = {}) { let s = source || {}; let saveMode = s.save_mode === 'auto_folder' ? 'auto_folder' : 'ask_dialog'; let outputFolder = typeof s.output_folder === 'string' ? s.output_folder.trim() : ''; if (!canUseAppFileSystem()) { saveMode = 'ask_dialog'; outputFolder = ''; } let validSizes = ['16', '32', '48', '64', '128', 'custom']; let iconSize = validSizes.includes(String(s.icon_size)) ? String(s.icon_size) : ''; let customSize = (typeof s.custom_size === 'number' && s.custom_size >= 8 && s.custom_size <= 512) ? s.custom_size : 48; let validBgs = ['transparent', 'white', 'black', 'gray', 'custom']; let background = validBgs.includes(s.background) ? s.background : 'transparent'; let customColor = (typeof s.custom_color === 'string' && /^#[0-9a-fA-F]{6}$/.test(s.custom_color)) ? s.custom_color : '#ff0000'; let validQualities = ['standard', 'high', 'ultra']; let quality = validQualities.includes(s.quality) ? s.quality : 'high'; return { save_mode: saveMode, output_folder: outputFolder, icon_size: iconSize, custom_size: customSize, background: background, custom_color: customColor, quality: quality }; } function loadExportPrefs() { try { let prefsKey = getExportPrefsKey(); let raw = localStorage.getItem(prefsKey); let normalized = normalizeExportPrefs(raw ? JSON.parse(raw) : DEFAULT_EXPORT_PREFS); cachedExportPrefsText = JSON.stringify(normalized); return normalized; } catch (error) { let normalized = normalizeExportPrefs(DEFAULT_EXPORT_PREFS); cachedExportPrefsText = JSON.stringify(normalized); return normalized; } } function saveExportPrefs(source = {}) { let normalized = normalizeExportPrefs(source); let serialized = JSON.stringify(normalized); if (serialized === cachedExportPrefsText) return; cachedExportPrefsText = serialized; try { let prefsKey = getExportPrefsKey(); localStorage.setItem(prefsKey, serialized); } catch (error) { } } // ========================= // Plugin registration // ========================= Plugin.register('menu_icon_exporter', { title: 'Menu Icon Exporter', author: 'NET', description: 'Export perfect menu/item icons with advanced camera controls', icon: PLUGIN_BROWSER_ICON, about: PLUGIN_ABOUT, repository: PLUGIN_REPOSITORY, bug_tracker: PLUGIN_BUG_TRACKER, version: '1.0.0', min_version: '4.8.0', variant: 'both', tags: ['Minecraft', 'Utility', 'Export'], onload() { this.iconExporterAction = new Action('export_menu_icon', { name: 'Export Menu Icon', description: 'Export model as a menu/item icon with automatic framing', icon: ACTION_ICON, category: 'file', click: openIconExporterDialog }); this.openPanelAction = new Action('open_icon_exporter_panel', { name: 'Icon Exporter Panel', description: 'Open the icon exporter as a sidebar panel', icon: ACTION_ICON, category: 'file', click: () => switchToPanel() }); MenuBar.addAction(this.iconExporterAction, 'file.export'); MenuBar.addAction(this.openPanelAction, 'file.export'); applyToolbarActionIcon(this.iconExporterAction); }, onunload() { stopCameraWatcher(); activeResetButton = null; restoreDialogCameraState(); disposeIsolatedDialogPreview(); clearDialogCameraState(); this.iconExporterAction?.delete(); this.openPanelAction?.delete(); destroyIconExporterPanel(); } }); // ========================= // Panel helpers // ========================= function getIconExporterPanel() { if (iconExporterPanel) return iconExporterPanel; if (Interface && Interface.Panels && Interface.Panels.menu_icon_exporter_panel) { return Interface.Panels.menu_icon_exporter_panel; } return null; } function panelIsFloating(panel) { if (!panel) return false; try { if (typeof panel.isInSidebar === 'function') return !panel.isInSidebar(); } catch (e) {} try { if (panel.position_data && panel.position_data.slot) { return String(panel.position_data.slot).toLowerCase().includes('float'); } } catch (e) {} return false; } function refreshPanelLayout() { try { if (typeof Interface.updateSidebars === 'function') { Interface.updateSidebars(); } else if (typeof updateInterfacePanels === 'function') { updateInterfacePanels(); } } catch (e) {} applyResponsivePanelFill(); setTimeout(applyResponsivePanelFill, 0); } let miePanelResizeObserver = null; let miePanelObservedNode = null; let isApplyingMiePanelFill = false; function disconnectMiePanelResizeObserver() { if (miePanelResizeObserver) { try { miePanelResizeObserver.disconnect(); } catch (e) {} } miePanelResizeObserver = null; miePanelObservedNode = null; } function ensureMiePanelResizeObserver(panel) { if (typeof ResizeObserver !== 'function' || !panel || !panel.node) return; if (miePanelObservedNode === panel.node && miePanelResizeObserver) return; disconnectMiePanelResizeObserver(); try { miePanelObservedNode = panel.node; miePanelResizeObserver = new ResizeObserver(() => { if (typeof requestAnimationFrame === 'function') { requestAnimationFrame(applyResponsivePanelFill); } else { applyResponsivePanelFill(); } }); miePanelResizeObserver.observe(panel.node); } catch (e) {} } function applyResponsivePanelFill() { if (isApplyingMiePanelFill) return; isApplyingMiePanelFill = true; let panel = getIconExporterPanel(); if (!panel) { isApplyingMiePanelFill = false; return; } try { ensureMiePanelResizeObserver(panel); let panelNode = panel.node; if (!panelNode) return; let bodyNode = panelNode.querySelector('.mie_panel_body'); if (!bodyNode) return; let panelRect = panelNode.getBoundingClientRect(); let bodyRect = bodyNode.getBoundingClientRect(); if (!panelRect || !bodyRect) return; let topOffset = Math.max(0, bodyRect.top - panelRect.top); let availableHeight = Math.floor(panelRect.height - topOffset - 2); if (Number.isFinite(availableHeight) && availableHeight > 80) { bodyNode.style.height = availableHeight + 'px'; bodyNode.style.maxHeight = availableHeight + 'px'; bodyNode.style.overflowY = 'auto'; bodyNode.style.overflowX = 'hidden'; } } catch (e) { } finally { isApplyingMiePanelFill = false; } } function movePanelToSlot(targetSlot) { let panel = getIconExporterPanel(); if (!panel) return false; let slotNames = [targetSlot]; if (targetSlot === 'right_bar') slotNames.push('right'); if (targetSlot === 'left_bar') slotNames.push('left'); if (targetSlot === 'float') slotNames.push('floating'); let done = false; for (let slot of slotNames) { if (done) break; try { if (typeof panel.moveTo === 'function') { panel.moveTo(slot); done = true; } } catch (e) {} } if (!done) { for (let slot of slotNames) { if (done) break; try { if (typeof panel.customizePosition === 'function') { let opts = { slot: slot, folded: false }; if (slot === 'float' || slot === 'floating') { opts.float_position = [120, 80]; opts.float_size = [400, 700]; } panel.customizePosition(opts); done = true; } } catch (e) {} } } try { if (typeof panel.setupFloatHandles === 'function') panel.setupFloatHandles(); } catch (e) {} try { if (typeof panel.updateSlot === 'function') panel.updateSlot(); if (typeof panel.update === 'function') panel.update(); } catch (e) {} try { if (typeof panel.show === 'function') panel.show(); if (typeof panel.select === 'function') panel.select(); else if (typeof panel.selectTab === 'function') panel.selectTab(panel); } catch (e) {} refreshPanelLayout(); return done; } function destroyIconExporterPanel() { disconnectMiePanelResizeObserver(); if (iconExporterPanelVue) { iconExporterPanelVue = null; } let panel = getIconExporterPanel(); if (panel) { try { if (typeof panel.delete === 'function') panel.delete(); } catch (e) {} } iconExporterPanel = null; } function collectCurrentFormState() { let prefs = loadExportPrefs(); return { auto_frame: true, zoom_level: 1.0, rotate_x: 0, rotate_y: 0, rotate_z: 0, pan_x: 0, pan_y: 0, icon_size: prefs.icon_size || getRecommendedSize(), custom_size: prefs.custom_size, background: prefs.background, custom_color: prefs.custom_color, quality: prefs.quality, save_mode: prefs.save_mode, output_folder: prefs.output_folder, filename: getDefaultFilename() }; } function getDefaultFilename() { if (!Project || !Project.name) return 'icon'; let name = Project.name; name = name.replace(/\.geo\.json$/i, '').replace(/\.geo$/i, ''); name = name.replace(/\.[^.]+$/, ''); name = name.replace(/[^a-zA-Z0-9_-]/g, '_'); return name + '_icon'; } function switchToFloat() { destroyIconExporterPanel(); openIconExporterDialog(); } function switchToPanel() { createIconExporterPanel('panel'); } function getSlotForMode(mode) { return 'right_bar'; } function createIconExporterPanel(mode) { iconExporterPanelRequestedMode = mode; let targetSlot = getSlotForMode(mode); if (iconExporterPanel) { let panel = getIconExporterPanel(); if (panel) { movePanelToSlot(targetSlot); if (iconExporterPanelVue) { iconExporterPanelVue.currentMode = mode; } return; } } let panelStyle = document.getElementById('menu_icon_exporter_panel_style'); if (panelStyle) panelStyle.remove(); panelStyle = document.createElement('style'); panelStyle.id = 'menu_icon_exporter_panel_style'; panelStyle.textContent = ` .mie_panel_body { padding: 4px 6px; font-size: 12px; width: 100%; box-sizing: border-box; overflow-y: auto !important; overflow-x: hidden !important; } .mie_section_header { display: flex; align-items: center; justify-content: space-between; padding: 6px 8px; cursor: pointer; background: rgba(255,255,255,0.03); user-select: none; border: 1px solid rgba(255,255,255,0.08); border-radius: 6px; margin-bottom: 2px; } .mie_section_header:hover { background: rgba(255,255,255,0.06); } .mie_section_header h4 { margin: 0; font-size: 12px; font-weight: 600; } .mie_section_body { padding: 4px 6px 6px; width: 100%; box-sizing: border-box; } .mie_row { display: flex; align-items: center; min-height: 28px; margin-bottom: 4px; gap: 6px; width: 100%; box-sizing: border-box; } .mie_row label { flex: 0 0 auto; min-width: 55px; font-size: 11px; color: var(--color-subtle_text); white-space: nowrap; line-height: 28px; } .mie_row select, .mie_row input[type="text"], .mie_row input[type="number"] { flex: 1 1 0; min-width: 0; width: 0; background: var(--color-back); border: 1px solid var(--color-border); color: var(--color-text); padding: 5px 6px; border-radius: 5px; font-size: 11px; box-sizing: border-box; height: 28px; } .mie_row input[type="checkbox"] { flex: 0 0 auto; width: 16px; height: 16px; margin: 0; } .mie_row input[type="range"] { flex: 1 1 0; min-width: 0; width: 0; height: 18px; } .mie_row .mie_range_val { flex: 0 0 24px; text-align: right; font-size: 11px; font-variant-numeric: tabular-nums; line-height: 28px; } .mie_preview_canvas { display: block; width: 128px; height: 128px; border: 1px solid rgba(255,255,255,0.12); border-radius: 6px; image-rendering: pixelated; margin: 0 auto 4px; box-sizing: border-box; } .mie_btn { display: block; width: 100%; padding: 6px 8px; border: 1px solid rgba(255,255,255,0.14); border-radius: 6px; cursor: pointer; font-size: 11px; font-weight: 600; text-align: center; background: var(--color-button); color: var(--color-text); box-sizing: border-box; margin-bottom: 2px; } .mie_btn:hover { background: var(--color-accent); color: #fff; } .mie_btn_primary { background: linear-gradient(180deg, #4f95f7, #3e7ad6); color: #fff; } .mie_btn_primary:hover { background: linear-gradient(180deg, #5fa3ff, #4a88e8); } .mie_mode_bar { display: flex; gap: 3px; margin-bottom: 4px; width: 100%; box-sizing: border-box; } .mie_mode_btn { flex: 1 1 0; padding: 4px 3px; border: 1px solid rgba(255,255,255,0.1); border-radius: 5px; cursor: pointer; font-size: 10px; font-weight: 600; text-align: center; background: rgba(255,255,255,0.04); color: var(--color-subtle_text); min-width: 0; } .mie_mode_btn:hover { background: rgba(255,255,255,0.08); color: var(--color-text); } .mie_mode_btn.active { background: var(--color-accent); color: #fff; border-color: var(--color-accent); } .mie_arrow { transition: transform 0.15s; font-size: 14px; } .mie_arrow.collapsed { transform: rotate(-90deg); } .mie_folder_row { display: flex; align-items: center; min-height: 28px; gap: 6px; margin-bottom: 4px; width: 100%; box-sizing: border-box; } .mie_folder_row label { flex: 0 0 auto; min-width: 55px; font-size: 11px; color: var(--color-subtle_text); white-space: nowrap; line-height: 28px; } .mie_folder_row input { flex: 1 1 0; min-width: 0; width: 0; background: var(--color-back); border: 1px solid var(--color-border); color: var(--color-text); padding: 5px 6px; border-radius: 5px; font-size: 11px; box-sizing: border-box; height: 28px; } .mie_folder_row i { flex: 0 0 auto; cursor: pointer; font-size: 18px; opacity: 0.7; line-height: 28px; padding: 4px; pointer-events: auto; position: relative; z-index: 2; } .mie_folder_row i:hover { opacity: 1; } `; document.head.appendChild(panelStyle); iconExporterPanel = new Panel({ id: 'menu_icon_exporter_panel', name: 'Icon Exporter', icon: 'photo_camera', default_side: 'right', expand_button: true, folded: false, resizable: true, growable: true, min_height: 300, onResize() { applyResponsivePanelFill(); if (iconExporterPanelVue) { if (typeof iconExporterPanelVue.layoutPanel === 'function') iconExporterPanelVue.layoutPanel(); else if (typeof iconExporterPanelVue.refreshPreview === 'function') iconExporterPanelVue.refreshPreview(); } }, onFold() { applyResponsivePanelFill(); }, component: { name: 'icon-exporter-panel', template: `
    Float
    Panel

    Preview

    expand_more
    {{ previewSizeText }}

    Camera Controls

    expand_more
    {{ formatVal(zoom_level) }}
    {{ rotate_x }}
    {{ rotate_y }}
    {{ rotate_z }}
    {{ pan_x }}
    {{ pan_y }}

    Export Settings

    expand_more
    folderclear
    `, data() { let state = collectCurrentFormState(); return { sections: { preview: true, camera: true, export: true }, currentMode: iconExporterPanelRequestedMode || 'panel', auto_frame: state.auto_frame, zoom_level: state.zoom_level, rotate_x: state.rotate_x, rotate_y: state.rotate_y, rotate_z: state.rotate_z, pan_x: state.pan_x, pan_y: state.pan_y, icon_size: state.icon_size, custom_size: state.custom_size, background: state.background, custom_color: state.custom_color, quality: state.quality, save_mode: state.save_mode, output_folder: state.output_folder, filename: state.filename, panelPreviewIsolated: null, panelBaseCameraPosition: null, panelBaseCameraTarget: null, panelBaseCameraUp: null, panelDefaultFramedState: null }; }, computed: { previewSizeText() { let s = this.icon_size === 'custom' ? this.custom_size : parseInt(this.icon_size); return s + '×' + s + ' pixels'; }, hasManualAdjustments() { return this.zoom_level !== 1.0 || this.rotate_x !== 0 || this.rotate_y !== 0 || this.rotate_z !== 0 || this.pan_x !== 0 || this.pan_y !== 0; }, canAutoSave() { return canUseAppFileSystem(); } }, methods: { formatVal(v) { let n = Number(v); if (Math.abs(n - Math.round(n)) < 0.0001) return String(Math.round(n)); return String(Math.round(n * 100) / 100); }, switchToFloat() { switchToFloat(); }, switchToPanel() { this.currentMode = 'panel'; movePanelToSlot(getSlotForMode('panel')); }, getFormData() { return { icon_size: this.icon_size, custom_size: this.custom_size, background: this.background, custom_color: this.custom_color, auto_frame: this.auto_frame, zoom_level: this.zoom_level, rotate_x: this.rotate_x, rotate_y: this.rotate_y, rotate_z: this.rotate_z, pan_x: this.pan_x, pan_y: this.pan_y, quality: this.quality, save_mode: this.save_mode, output_folder: this.output_folder, filename: this.filename }; }, onCameraChange() { this.applyCameraFromState(); this.refreshPreview(); }, onSettingChange() { saveExportPrefs(this.getFormData()); this.refreshPreview(); }, onSaveModeChange() { saveExportPrefs(this.getFormData()); }, applyCameraFromState() { let preview = this.panelPreviewIsolated || getSelectedPreview(); if (!preview || !preview.camera) return; if (!this.panelBaseCameraPosition || !this.panelBaseCameraTarget || !this.panelBaseCameraUp) { this.captureBaseCamera(); } let camera = preview.camera; let values = { zoom_level: this.zoom_level, rotate_x: this.rotate_x, rotate_y: this.rotate_y, rotate_z: this.rotate_z, pan_x: this.pan_x, pan_y: this.pan_y }; let newTarget = this.panelBaseCameraTarget.clone(); let baseOffset = this.panelBaseCameraPosition.clone().sub(this.panelBaseCameraTarget); let baseUpNormal = this.panelBaseCameraUp.clone().normalize(); let forward = this.panelBaseCameraTarget.clone().sub(this.panelBaseCameraPosition).normalize(); let right = forward.clone().cross(baseUpNormal); if (right.lengthSq() === 0) right.set(1, 0, 0); else right.normalize(); newTarget.add(right.multiplyScalar(values.pan_x * 2.0)); newTarget.add(baseUpNormal.clone().multiplyScalar(values.pan_y * 2.0)); let rotatedOffset = baseOffset.clone(); let rotY = THREE.MathUtils.degToRad(values.rotate_y); let rotX = THREE.MathUtils.degToRad(values.rotate_x); let rotZ = THREE.MathUtils.degToRad(values.rotate_z); if (rotY !== 0) rotatedOffset.applyQuaternion(new THREE.Quaternion().setFromAxisAngle(baseUpNormal, rotY)); if (rotX !== 0) { let pitchAxis = baseUpNormal.clone().cross(rotatedOffset).normalize(); if (pitchAxis.lengthSq() > 0) rotatedOffset.applyQuaternion(new THREE.Quaternion().setFromAxisAngle(pitchAxis, rotX)); } rotatedOffset.multiplyScalar(values.zoom_level); let newPos = newTarget.clone().add(rotatedOffset); camera.position.copy(newPos); let upVec = baseUpNormal.clone(); if (rotZ !== 0) { let fwdAxis = newTarget.clone().sub(newPos).normalize(); if (fwdAxis.lengthSq() > 0) upVec.applyQuaternion(new THREE.Quaternion().setFromAxisAngle(fwdAxis, rotZ)); } camera.up.copy(upVec); if (preview.controls && preview.controls.target) preview.controls.target.copy(newTarget); camera.lookAt(newTarget); if (camera.updateProjectionMatrix) camera.updateProjectionMatrix(); if (preview.controls && preview.controls.update) preview.controls.update(); if (typeof preview.render === 'function') preview.render(); }, captureBaseCamera() { let preview = this.panelPreviewIsolated || getSelectedPreview(); if (!preview || !preview.camera) return; let camera = preview.camera; this.panelBaseCameraPosition = camera.position.clone(); this.panelBaseCameraTarget = getCurrentPreviewTarget(camera, preview); camera.up.copy(WORLD_UP); if (preview.controls && preview.controls.target) preview.controls.target.copy(this.panelBaseCameraTarget); camera.lookAt(this.panelBaseCameraTarget); if (camera.updateProjectionMatrix) camera.updateProjectionMatrix(); if (preview.controls && preview.controls.update) preview.controls.update(); if (typeof preview.render === 'function') preview.render(); this.panelBaseCameraUp = WORLD_UP.clone(); }, resetCamera() { this.zoom_level = 1.0; this.rotate_x = 0; this.rotate_y = 0; this.rotate_z = 0; this.pan_x = 0; this.pan_y = 0; this.auto_frame = true; this.panelBaseCameraPosition = null; this.panelBaseCameraTarget = null; this.panelBaseCameraUp = null; let preview = this.panelPreviewIsolated || getSelectedPreview(); let mainPreview = Preview.selected || getSelectedPreview(); if (mainPreview && preview && mainPreview !== preview) { let freshState = captureCameraState(mainPreview); if (freshState) applyCameraState(freshState, preview); } frameModelForIcon(this.getFormData()).then(() => { this.panelDefaultFramedState = captureCameraState(preview); this.captureBaseCamera(); this.refreshPreview(); }); }, refreshPreview() { this.$nextTick(() => { let canvas = this.$refs.panelPreviewCanvas; if (!canvas) return; let formData = this.getFormData(); generateLivePreview(canvas, formData, this.panelPreviewIsolated); }); }, layoutPanel() { this.$nextTick(() => { let canvas = this.$refs.panelPreviewCanvas; if (!canvas || !this.sections.preview) { return; } let body = this.$el; if (!body) return; let bodyHeight = body.clientHeight; let bodyWidth = body.clientWidth; if (!bodyHeight || !bodyWidth) return; let otherHeight = 0; let children = body.children; for (let i = 0; i < children.length; i++) { let child = children[i]; if (child === canvas) continue; if (child.contains && child.contains(canvas)) { continue; } otherHeight += child.offsetHeight + 2; } let previewTextAndBtn = 0; let canvasParent = canvas.parentElement; if (canvasParent) { let siblings = canvasParent.children; for (let i = 0; i < siblings.length; i++) { if (siblings[i] !== canvas) { previewTextAndBtn += siblings[i].offsetHeight + 2; } } } let available = bodyHeight - otherHeight - previewTextAndBtn - 16; let maxByWidth = bodyWidth - 24; let size = Math.max(64, Math.min(available, maxByWidth, 400)); canvas.style.width = size + 'px'; canvas.style.height = size + 'px'; this.refreshPreview(); }); }, browseFolder() { if (!isApp) return; let dlg = _getDialog(); if (!dlg) return; let result = dlg.showOpenDialogSync({ properties: ['openDirectory'], title: 'Select Output Folder' }); if (result && result[0]) { this.output_folder = result[0]; saveExportPrefs(this.getFormData()); } }, doExport() { if (!Format || !Project || !Project.elements || Project.elements.length === 0) { Blockbench.showMessageBox({ title: 'No Model', message: 'Please load a model first before exporting an icon.', icon: 'warning' }); return; } let formData = this.getFormData(); saveExportPrefs(formData); generateIcon(formData, null, false); }, initPreview() { let mainPreview = Preview.selected; if (!mainPreview) return; try { this.panelPreviewIsolated = new Preview({ id: 'menu_icon_exporter_panel_live_' + Date.now(), antialias: true, offscreen: true }); } catch (e) { this.panelPreviewIsolated = null; return; } if (Preview.selected !== mainPreview) { mainPreview.select(); } if (typeof this.panelPreviewIsolated.resize === 'function') { this.panelPreviewIsolated.resize(1024, 1024); } else if (this.panelPreviewIsolated.canvas) { this.panelPreviewIsolated.canvas.width = 1024; this.panelPreviewIsolated.canvas.height = 1024; } if (typeof this.panelPreviewIsolated.setProjectionMode === 'function' && typeof mainPreview.isOrtho === 'boolean') { this.panelPreviewIsolated.setProjectionMode(mainPreview.isOrtho); } if (mainPreview.camera && typeof this.panelPreviewIsolated.setFOV === 'function' && mainPreview.camera.fov) { this.panelPreviewIsolated.setFOV(mainPreview.camera.fov); } if (this.panelPreviewIsolated.camera && this.panelPreviewIsolated.camera.isPerspectiveCamera) { this.panelPreviewIsolated.camera.aspect = 1; if (this.panelPreviewIsolated.camera.updateProjectionMatrix) this.panelPreviewIsolated.camera.updateProjectionMatrix(); } let initialState = captureCameraState(mainPreview); if (initialState) applyCameraState(initialState, this.panelPreviewIsolated); if (typeof this.panelPreviewIsolated.render === 'function') this.panelPreviewIsolated.render(); this.captureBaseCamera(); this.panelDefaultFramedState = captureCameraState(this.panelPreviewIsolated); this.applyCameraFromState(); this.refreshPreview(); }, disposePreview() { if (this.panelPreviewIsolated) { try { this.panelPreviewIsolated.delete(); } catch (e) {} this.panelPreviewIsolated = null; } } }, mounted() { iconExporterPanelVue = this; this._mieResizeHandler = () => { applyResponsivePanelFill(); if (iconExporterPanelVue) iconExporterPanelVue.layoutPanel(); }; window.addEventListener('resize', this._mieResizeHandler, true); this.$nextTick(() => { this.initPreview(); applyResponsivePanelFill(); setTimeout(() => { applyResponsivePanelFill(); this.layoutPanel(); }, 50); setTimeout(() => { applyResponsivePanelFill(); this.layoutPanel(); }, 200); setTimeout(() => this.layoutPanel(), 500); }); }, beforeDestroy() { if (this._mieResizeHandler) { window.removeEventListener('resize', this._mieResizeHandler, true); this._mieResizeHandler = null; } this.disposePreview(); iconExporterPanelVue = null; } } }); setTimeout(() => { let panel = getIconExporterPanel(); if (panel) { if (panel.folded !== undefined) panel.folded = false; movePanelToSlot(targetSlot); applyResponsivePanelFill(); } }, 100); setTimeout(() => { movePanelToSlot(targetSlot); applyResponsivePanelFill(); }, 300); setTimeout(applyResponsivePanelFill, 500); } // ========================= // Preview and camera utilities // ========================= function getToolbarIconDataUrl() { if (cachedToolbarIconDataUrl) { return cachedToolbarIconDataUrl; } if (isBlockbench5OrNewer()) { return null; } let iconPath = getPluginRuntimeIconPath(); if (!iconPath || typeof iconPath !== 'string' || iconPath.startsWith('http')) { return null; } let cleanPath = iconPath.split('?')[0]; let fsModule = getNativeModule('fs'); if (!fsModule || !fsModule.existsSync(cleanPath)) { return null; } let mimeType = cleanPath.toLowerCase().endsWith('.svg') ? 'image/svg+xml' : 'image/png'; let encoded = fsModule.readFileSync(cleanPath).toString('base64'); cachedToolbarIconDataUrl = `data:${mimeType};base64,${encoded}`; return cachedToolbarIconDataUrl; } function readBlobAsDataUrl(blob) { return new Promise((resolve) => { if (typeof FileReader === 'undefined' || !blob) { resolve(null); return; } let reader = new FileReader(); reader.onload = function() { resolve(typeof reader.result === 'string' ? reader.result : null); }; reader.onerror = function() { resolve(null); }; try { reader.readAsDataURL(blob); } catch (error) { resolve(null); } }); } function getToolbarIconDataUrlAsync() { if (cachedToolbarIconDataUrl) { return Promise.resolve(cachedToolbarIconDataUrl); } if (toolbarIconDataUrlPromise) { return toolbarIconDataUrlPromise; } let syncIcon = getToolbarIconDataUrl(); if (syncIcon) { return Promise.resolve(syncIcon); } let iconPath = getPluginRuntimeIconPath(); if (!iconPath || typeof iconPath !== 'string' || !/^https?:\/\//i.test(iconPath) || typeof fetch !== 'function') { return Promise.resolve(null); } toolbarIconDataUrlPromise = fetch(iconPath, {cache: 'no-store'}) .then(response => { if (!response || !response.ok || typeof response.blob !== 'function') { return null; } return response.blob(); }) .then(blob => readBlobAsDataUrl(blob)) .then(dataUrl => { if (typeof dataUrl === 'string' && dataUrl.startsWith('data:image/')) { cachedToolbarIconDataUrl = dataUrl; return dataUrl; } return null; }) .catch(() => null) .finally(() => { toolbarIconDataUrlPromise = null; }); return toolbarIconDataUrlPromise; } function applyToolbarActionIcon(action) { if (!action || typeof action.setIcon !== 'function') { return; } let syncIcon = getToolbarIconDataUrl(); if (syncIcon) { action.setIcon(syncIcon); return; } getToolbarIconDataUrlAsync().then(dataUrl => { if (dataUrl) { action.setIcon(dataUrl); } }); } function getPluginRuntimeIconPath() { if (typeof Plugins === 'undefined' || !Plugins || !Array.isArray(Plugins.all)) { return null; } let pluginInstance = Plugins.all.find(plugin => plugin && plugin.id === 'menu_icon_exporter'); if (!pluginInstance || typeof pluginInstance.getIcon !== 'function') { return null; } let iconPath = pluginInstance.getIcon(); if (!iconPath || typeof iconPath !== 'string') { return null; } if (!/^https?:\/\//i.test(iconPath) && typeof pluginInstance.path === 'string' && /^https?:\/\//i.test(pluginInstance.path)) { try { iconPath = new URL(iconPath, pluginInstance.path).toString(); } catch (error) { } } return iconPath; } function getSelectedPreview() { if (typeof Preview === 'undefined') return null; return Preview.selected || null; } function getActiveCameraPreview() { return isolatedDialogPreview || getSelectedPreview(); } function disposeIsolatedDialogPreview() { if (!isolatedDialogPreview) return; try { isolatedDialogPreview.delete(); } catch (error) { } isolatedDialogPreview = null; } function getCurrentPreviewTarget(camera, previewRef = null) { let preview = previewRef || getSelectedPreview(); if (preview && preview.controls && preview.controls.target) { return preview.controls.target.clone(); } let direction = new THREE.Vector3(0, 0, -1); if (typeof camera.getWorldDirection === 'function') { camera.getWorldDirection(direction); } return camera.position.clone().add(direction.multiplyScalar(16)); } function captureCameraState(previewRef = null) { let preview = previewRef || getSelectedPreview(); if (!preview || !preview.camera) { return null; } let camera = preview.camera; return { position: camera.position.clone(), target: getCurrentPreviewTarget(camera, preview), up: WORLD_UP.clone() }; } function cloneCameraState(state) { if (!state) return null; return { position: state.position.clone(), target: state.target.clone(), up: state.up.clone() }; } function applyCameraState(state, previewRef = null) { let preview = previewRef || getSelectedPreview(); if (!state || !preview || !preview.camera) { return; } let camera = preview.camera; camera.position.copy(state.position); camera.up.copy(state.up); if (preview.controls && preview.controls.target) { preview.controls.target.copy(state.target); } camera.lookAt(state.target); if (camera.updateProjectionMatrix) { camera.updateProjectionMatrix(); } if (preview.controls && preview.controls.update) { preview.controls.update(); } if (typeof preview.render === 'function') { preview.render(); } } function flattenCameraUp(previewRef = null) { let preview = previewRef || getSelectedPreview(); if (!preview || !preview.camera) { return; } let camera = preview.camera; let target = getCurrentPreviewTarget(camera, preview); camera.up.copy(WORLD_UP); if (preview.controls && preview.controls.target) { preview.controls.target.copy(target); } camera.lookAt(target); if (camera.updateProjectionMatrix) { camera.updateProjectionMatrix(); } if (preview.controls && preview.controls.update) { preview.controls.update(); } if (typeof preview.render === 'function') { preview.render(); } } function createIsolatedDialogPreview() { disposeIsolatedDialogPreview(); let selectedPreview = getSelectedPreview(); if (!selectedPreview) return null; try { isolatedDialogPreview = new Preview({ id: `menu_icon_exporter_live_${Date.now()}`, antialias: true, offscreen: true }); } catch (error) { isolatedDialogPreview = null; return null; } if (typeof isolatedDialogPreview.resize === 'function') { isolatedDialogPreview.resize(1024, 1024); } else if (isolatedDialogPreview.canvas) { isolatedDialogPreview.canvas.width = 1024; isolatedDialogPreview.canvas.height = 1024; } if (typeof isolatedDialogPreview.setProjectionMode === 'function' && typeof selectedPreview.isOrtho === 'boolean') { isolatedDialogPreview.setProjectionMode(selectedPreview.isOrtho); } if (selectedPreview.camera && typeof isolatedDialogPreview.setFOV === 'function' && selectedPreview.camera.fov) { isolatedDialogPreview.setFOV(selectedPreview.camera.fov); } if (isolatedDialogPreview.camera && isolatedDialogPreview.camera.isPerspectiveCamera) { isolatedDialogPreview.camera.aspect = 1; if (isolatedDialogPreview.camera.updateProjectionMatrix) { isolatedDialogPreview.camera.updateProjectionMatrix(); } } let initialState = captureCameraState(selectedPreview); if (initialState) { applyCameraState(initialState, isolatedDialogPreview); } if (typeof isolatedDialogPreview.render === 'function') { isolatedDialogPreview.render(); } return isolatedDialogPreview; } function clearDialogCameraState() { dialogCameraRestoreState = null; dialogDefaultFramedCameraState = null; } function restoreDialogCameraState() { if (!dialogCameraRestoreState) return; applyCameraState(dialogCameraRestoreState); dialogCameraRestoreState = null; } // ========================= // Dialog geometry helpers // ========================= function clampNumber(value, min, max) { return Math.min(Math.max(value, min), max); } function getDialogElement(dialog) { if (!dialog) return null; return dialog.object || null; } function getDialogReferenceBox(dialogEl) { if (!dialogEl) return null; return dialogEl.querySelector('.dialog_content') || dialogEl; } function getElementRectSafe(element) { if (!element || !element.isConnected) return null; return element.getBoundingClientRect(); } function getNumericStyleValue(element, propertyName) { if (!element) return 0; let computed = window.getComputedStyle(element); let value = parseFloat(computed.getPropertyValue(propertyName)); return Number.isFinite(value) ? value : 0; } function getDialogViewportBox(dialogEl) { if (!dialogEl) return null; let content = dialogEl.querySelector('.dialog_content') || dialogEl; let rect = getElementRectSafe(content); if (!rect) return null; let paddingTop = getNumericStyleValue(content, 'padding-top'); let paddingRight = getNumericStyleValue(content, 'padding-right'); let paddingBottom = getNumericStyleValue(content, 'padding-bottom'); let paddingLeft = getNumericStyleValue(content, 'padding-left'); return { element: content, rect, innerTop: rect.top + paddingTop, innerRight: rect.right - paddingRight, innerBottom: rect.bottom - paddingBottom, innerLeft: rect.left + paddingLeft, innerWidth: Math.max(0, rect.width - paddingLeft - paddingRight), innerHeight: Math.max(0, rect.height - paddingTop - paddingBottom) }; } // ========================= // Dialog normalization // ========================= function normalizeDialogInnerWidth(dialog, selector, options = {}) { let dialogEl = getDialogElement(dialog); if (!dialogEl) return; let target = dialogEl.querySelector(selector); if (!target) return; let { minWidth = 200, maxPasses = 4, tolerance = 1, mode = 'balance', debug = false } = options; let pass = 0; function log(...args) { if (debug) { console.log('[normalizeDialogInnerWidth]', ...args); } } function measureAndApply() { let refBox = getDialogReferenceBox(dialogEl); if (!refBox || !target.isConnected) return; let refRect = refBox.getBoundingClientRect(); let targetRect = target.getBoundingClientRect(); let leftGap = targetRect.left - refRect.left; let rightGap = refRect.right - targetRect.right; log('pass', pass + 1, { leftGap, rightGap, targetWidth: targetRect.width, refWidth: refRect.width }); let shrinkAmount = 0; if (mode === 'balance') { shrinkAmount = leftGap - rightGap; } else if (mode === 'contain') { if (targetRect.right > refRect.right) { shrinkAmount = targetRect.right - refRect.right; } } else if (typeof mode === 'function') { shrinkAmount = Number(mode({ dialog, dialogEl, target, refRect, targetRect, leftGap, rightGap })) || 0; } if (shrinkAmount > tolerance) { let newWidth = clampNumber(targetRect.width - shrinkAmount, minWidth, refRect.width); target.style.setProperty('width', `${newWidth}px`, 'important'); target.style.setProperty('max-width', `${newWidth}px`, 'important'); log('applied width', newWidth); pass++; if (pass < maxPasses) { requestAnimationFrame(measureAndApply); } } else { log('no adjustment needed'); } } requestAnimationFrame(measureAndApply); } function clearNormalizedDialogInnerWidth(dialog, selector) { let dialogEl = getDialogElement(dialog); if (!dialogEl) return; let target = dialogEl.querySelector(selector); if (!target) return; target.style.removeProperty('width'); target.style.removeProperty('max-width'); } function normalizeDialogInnerHeight(dialog, selector, options = {}) { let dialogEl = getDialogElement(dialog); if (!dialogEl) return; let target = dialogEl.querySelector(selector); if (!target) return; let { minHeight = 120, maxPasses = 4, tolerance = 1, mode = 'contain', debug = false } = options; let pass = 0; function log(...args) { if (debug) { console.log('[normalizeDialogInnerHeight]', ...args); } } function measureAndApply() { if (!target.isConnected) return; let viewport = getDialogViewportBox(dialogEl); let targetRect = getElementRectSafe(target); if (!viewport || !targetRect) return; let topGap = targetRect.top - viewport.innerTop; let bottomGap = viewport.innerBottom - targetRect.bottom; log('pass', pass + 1, { topGap, bottomGap, targetHeight: targetRect.height, viewportHeight: viewport.innerHeight }); let shrinkAmount = 0; if (mode === 'balance') { shrinkAmount = topGap - bottomGap; } else if (mode === 'contain') { if (targetRect.bottom > viewport.innerBottom) { shrinkAmount = targetRect.bottom - viewport.innerBottom; } } else if (typeof mode === 'function') { shrinkAmount = Number(mode({ dialog, dialogEl, target, viewport, targetRect, topGap, bottomGap })) || 0; } if (shrinkAmount > tolerance) { let newHeight = clampNumber(targetRect.height - shrinkAmount, minHeight, viewport.innerHeight); target.style.setProperty('height', `${newHeight}px`, 'important'); target.style.setProperty('max-height', `${newHeight}px`, 'important'); target.style.setProperty('overflow', 'auto', 'important'); log('applied height', newHeight); pass++; if (pass < maxPasses) { requestAnimationFrame(measureAndApply); } } else { log('no adjustment needed'); } } requestAnimationFrame(measureAndApply); } function clearNormalizedDialogInnerHeight(dialog, selector) { let dialogEl = getDialogElement(dialog); if (!dialogEl) return; let target = dialogEl.querySelector(selector); if (!target) return; target.style.removeProperty('height'); target.style.removeProperty('max-height'); target.style.removeProperty('overflow'); } function normalizeDialogInnerSize(dialog, selector, options = {}) { let { width = null, height = null } = options; if (width) { normalizeDialogInnerWidth(dialog, selector, width); } if (height) { normalizeDialogInnerHeight(dialog, selector, height); } } function clearNormalizedDialogInnerSize(dialog, selector) { clearNormalizedDialogInnerWidth(dialog, selector); clearNormalizedDialogInnerHeight(dialog, selector); } function syncConditionalBars(dialog) { if (!dialog || !dialog.object) return; let formResult = {}; try { formResult = dialog.getFormResult(); } catch (e) { return; } let csBar = dialog.object.querySelector('.form_bar_custom_size'); if (csBar) csBar.classList.toggle('mie_show', formResult.icon_size === 'custom'); let ccBar = dialog.object.querySelector('.form_bar_custom_color'); if (ccBar) ccBar.classList.toggle('mie_show', formResult.background === 'custom'); } function alignAutoFrameWithZoom(dialog) { if (!dialog || !dialog.object) return; let zoomInput = dialog.object.querySelector('.form_bar_zoom_level input[type="range"]'); let autoBar = dialog.object.querySelector('.form_bar_auto_frame'); let autoCheckbox = dialog.object.querySelector('.form_bar_auto_frame input[type="checkbox"]'); if (!zoomInput || !autoBar || !autoCheckbox) return; autoCheckbox.style.removeProperty('transform'); let zoomRect = zoomInput.getBoundingClientRect(); let autoBarRect = autoBar.getBoundingClientRect(); let checkRect = autoCheckbox.getBoundingClientRect(); let deltaX = zoomRect.left - checkRect.left; let zoomCenterY = autoBarRect.top + autoBarRect.height / 2; let checkCenterY = checkRect.top + checkRect.height / 2; let deltaY = (zoomCenterY - checkCenterY) - 14; if (!isFinite(deltaX) || !isFinite(deltaY)) return; deltaX = clampNumber(Math.round(deltaX), -120, 120); deltaY = clampNumber(Math.round(deltaY), -24, 24); autoCheckbox.style.setProperty('transform', `translate(${deltaX}px, ${deltaY}px)`); } // ========================= // Plugin-specific wrappers // ========================= function normalizeIconExporterDialog(dialog) { normalizeDialogInnerSize(dialog, '.icon_exporter_layout_container', { width: { minWidth: 320, maxPasses: 5, tolerance: 1, mode: 'balance' }, height: { minHeight: 220, maxPasses: 4, tolerance: 1, mode: 'contain' } }); } function clearNormalizedIconExporterDialog(dialog) { clearNormalizedDialogInnerSize(dialog, '.icon_exporter_layout_container'); } // ========================= // Dialog layout and lifecycle // ========================= function applyDialogBottomLayout(dialog, bottomContainer = null) { if (!dialog || !dialog.object) return; let targetContainer = bottomContainer || dialog.object.querySelector('.export_bottom_section'); if (!targetContainer) return; function moveToBottomSection(settingKey) { let formNode = dialog.object.querySelector(`.form_bar_${settingKey}`); if (!formNode) { let settingNode = dialog.object.querySelector(`[data-setting="${settingKey}"]`); if (settingNode) { formNode = settingNode.closest('.form_element') || settingNode.closest('.form_bar') || settingNode.closest('.form_group') || settingNode; } } if (!formNode || !formNode.parentNode) return; if (formNode.parentNode !== targetContainer) { targetContainer.appendChild(formNode); } } moveToBottomSection('icon_size'); moveToBottomSection('custom_size'); moveToBottomSection('background'); moveToBottomSection('custom_color'); moveToBottomSection('quality'); moveToBottomSection('save_mode'); moveToBottomSection('output_folder'); moveToBottomSection('filename'); } function openIconExporterDialog() { if (!Format || !Project || !Project.elements || Project.elements.length === 0) { Blockbench.showMessageBox({ title: 'No Model', message: 'Please load a model first before exporting an icon.', icon: 'warning' }); return; } dialogCameraRestoreState = captureCameraState(); dialogDefaultFramedCameraState = null; createIsolatedDialogPreview(); if (isolatedDialogPreview) { dialogDefaultFramedCameraState = captureCameraState(isolatedDialogPreview); } let previewSize = 256; activeResetButton = null; baseCameraPosition = null; baseCameraTarget = null; baseCameraUp = null; lastAutoFrameState = true; lastCameraValues = { zoom_level: 1.0, rotate_x: 0, rotate_y: 0, rotate_z: 0, pan_x: 0, pan_y: 0 }; let outputPrefs = loadExportPrefs(); let bottomMetaSection = null; let previewCanvas = document.createElement('canvas'); previewCanvas.id = 'live_icon_preview_canvas'; previewCanvas.width = previewSize; previewCanvas.height = previewSize; previewCanvas.style.display = 'block'; previewCanvas.style.border = '1px solid rgba(255, 255, 255, 0.12)'; previewCanvas.style.borderRadius = '10px'; let previewSection = Interface.createElement('div', { class: 'preview_section', style: 'text-align: center;' }, [ Interface.createElement('h3', { class: 'preview_title', style: 'margin: 0 0 12px 0; color: var(--color-text);' }, 'Live Preview'), previewCanvas, Interface.createElement('div', { id: 'preview_info_text', style: 'margin-top: 10px; color: var(--color-subtle_text); font-size: 12px; letter-spacing: 0.2px;' }, '64×64 pixels') ]); let dialog = new Dialog({ id: 'icon_exporter_dialog', title: 'Menu Icon Exporter', width: 1120, form: { layout_wrapper: { type: 'info', text: '' }, settings_column: { type: 'info', text: getFormatSpecificInfo() }, icon_size: { label: 'Icon Size', type: 'select', options: { '16': '16×16 - Tiny (UI elements)', '32': '32×32 - Small (inventory icons)', '48': '48×48 - Medium (item icons)', '64': '64×64 - Large (block icons)', '128': '128×128 - Extra Large (detailed icons)', 'custom': 'Custom Size...' }, value: outputPrefs.icon_size || getRecommendedSize(), onChange(formResult) { updateLivePreview(dialog, formResult); } }, custom_size: { label: 'Custom Size (pixels)', type: 'number', value: outputPrefs.custom_size, min: 8, max: 512, onChange(formResult) { updateLivePreview(dialog, formResult); } }, background: { label: 'Background', type: 'select', options: { 'transparent': 'Transparent', 'white': 'White (#FFFFFF)', 'black': 'Black (#000000)', 'gray': 'Gray (#808080)', 'custom': 'Custom Color' }, value: outputPrefs.background, description: 'Background color for the exported icon', onChange(formResult) { updateLivePreview(dialog, formResult); } }, custom_color: { label: 'Custom Background Color', type: 'color', value: outputPrefs.custom_color, description: 'Pick any color from the gradient spectrum' }, auto_frame: { label: 'Auto-frame Model', type: 'checkbox', value: true, description: 'Automatically center and zoom to fit the model perfectly' }, zoom_level: { label: 'Zoom Level', type: 'range', min: 0.5, max: 3.0, step: 0.1, value: 1.0, description: 'Manually adjust zoom (0.5 = close, 3.0 = far)' }, rotate_x: { label: 'X-Axis Rotation', type: 'range', min: -180, max: 180, step: 5, value: 0, description: 'Rotate model around X-axis' }, rotate_y: { label: 'Y-Axis Rotation', type: 'range', min: -180, max: 180, step: 5, value: 0, description: 'Rotate model around Y-axis' }, rotate_z: { label: 'Z-Axis Rotation', type: 'range', min: -180, max: 180, step: 5, value: 0, description: 'Rotate model around Z-axis' }, pan_x: { label: 'Pan Left/Right', type: 'range', min: -50, max: 50, step: 1, value: 0, description: 'Pan view horizontally in orthographic mode' }, pan_y: { label: 'Pan Up/Down', type: 'range', min: -50, max: 50, step: 1, value: 0, description: 'Pan view vertically in orthographic mode' }, quality: { label: 'Export Quality', type: 'select', options: { 'standard': 'Standard (4x render)', 'high': 'High Quality (8x render)', 'ultra': 'Ultra Quality (16x render)' }, value: outputPrefs.quality, description: 'Higher quality takes longer but produces sharper icons' }, save_mode: { label: 'Save Mode', type: 'select', options: canUseAppFileSystem() ? { 'ask_dialog': 'Ask every export', 'auto_folder': 'Auto-save to folder' } : { 'ask_dialog': 'Ask every export' }, value: outputPrefs.save_mode, description: 'Choose whether to use the save dialog or save directly' }, output_folder: { label: 'Output Folder', type: 'folder', value: outputPrefs.output_folder, condition: (formResult) => formResult.save_mode === 'auto_folder', description: 'Used when Save Mode is set to Auto-save to folder' }, filename: { label: 'Filename (without .png)', type: 'text', value: function() { let name = Project.name || 'model'; name = name.replace(/\.geo\.json$/i, '').replace(/\.geo$/i, ''); name = name.replace(/\.[^.]+$/, ''); name = name.replace(/[^a-zA-Z0-9_-]/g, '_'); return name + '_icon'; }() } }, buttons: ['dialog.confirm', 'dialog.cancel'], onConfirm(formData) { stopCameraWatcher(); activeResetButton = null; clearNormalizedIconExporterDialog(dialog); let resolvedFormData = resolveFormData(dialog, formData); saveExportPrefs(resolvedFormData); let restoreState = cloneCameraState(dialogCameraRestoreState); generateIcon(resolvedFormData, restoreState, true); return true; }, onCancel() { stopCameraWatcher(); activeResetButton = null; clearNormalizedIconExporterDialog(dialog); restoreDialogCameraState(); disposeIsolatedDialogPreview(); clearDialogCameraState(); return true; }, onFormChange(formData) { syncConditionalBars(dialog); let resolvedFormData = resolveFormData(dialog, dialog.getFormResult()); saveExportPrefs(resolvedFormData); applyDialogBottomLayout(dialog, bottomMetaSection); handleFormCameraChange(dialog, resolvedFormData); requestAnimationFrame(() => { normalizeIconExporterDialog(dialog); requestAnimationFrame(() => { alignAutoFrameWithZoom(dialog); }); }); } }); let preLayoutHideStyle = document.getElementById('menu_icon_exporter_dialog_prehide'); if (preLayoutHideStyle) { preLayoutHideStyle.remove(); } preLayoutHideStyle = document.createElement('style'); preLayoutHideStyle.id = 'menu_icon_exporter_dialog_prehide'; preLayoutHideStyle.textContent = '#icon_exporter_dialog { opacity: 0 !important; }'; document.head.appendChild(preLayoutHideStyle); dialog.show(); setTimeout(() => { try { let existingStyle = document.getElementById('menu_icon_exporter_dialog_style'); if (existingStyle) { existingStyle.remove(); } let style = document.createElement('style'); style.id = 'menu_icon_exporter_dialog_style'; style.textContent = ` #icon_exporter_dialog .form_bar.form_bar_custom_size:not(.mie_show) { display: none !important; } #icon_exporter_dialog .export_bottom_section .form_bar.form_bar_custom_size:not(.mie_show) { display: none !important; } #icon_exporter_dialog .form_bar.form_bar_custom_color:not(.mie_show) { display: none !important; } #icon_exporter_dialog .export_bottom_section .form_bar.form_bar_custom_color:not(.mie_show) { display: none !important; } #icon_exporter_dialog, #icon_exporter_dialog .dialog_content, #icon_exporter_dialog .form_wrapper, #icon_exporter_dialog .form { box-sizing: border-box !important; max-width: 100% !important; } #icon_exporter_dialog .dialog_content { padding: 10px 12px !important; box-sizing: border-box !important; } #icon_exporter_dialog .icon_exporter_layout_container { display: flex !important; flex-direction: column !important; gap: 10px !important; box-sizing: border-box !important; padding: 0 !important; overflow: hidden !important; } #icon_exporter_dialog .icon_exporter_top_section { display: flex !important; flex-direction: row !important; align-items: flex-start !important; gap: 14px !important; width: 100% !important; min-width: 0 !important; box-sizing: border-box !important; } #icon_exporter_dialog .icon_exporter_left_column { flex: 1 1 0 !important; min-width: 0 !important; display: flex !important; flex-direction: column !important; gap: 4px !important; box-sizing: border-box !important; overflow: hidden !important; } #icon_exporter_dialog .form_part, #icon_exporter_dialog .form_element:not(.preview_section), #icon_exporter_dialog .form_bar:not(.preview_section), #icon_exporter_dialog .form_group:not(.preview_section) { box-sizing: border-box !important; border-radius: 10px !important; background: rgba(255, 255, 255, 0.02) !important; border: 1px solid rgba(255, 255, 255, 0.06) !important; padding: 5px 9px !important; margin: 0 !important; width: 100% !important; min-width: 0 !important; } #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame { display: flex !important; flex-flow: row nowrap !important; align-items: center !important; } #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame > label.name_space_left { float: none !important; flex: 0 0 auto !important; width: var(--max_label_width, 180px) !important; box-sizing: content-box !important; } #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame > input[type="checkbox"] { flex: 0 0 auto !important; } #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame > .dialog_form_description { flex: 0 0 auto !important; margin-left: auto !important; padding-top: 0 !important; height: auto !important; align-self: center !important; } #icon_exporter_dialog .preview_section { flex: 0 0 300px !important; width: 300px !important; box-sizing: border-box !important; background: rgba(255, 255, 255, 0.02) !important; border: 1px solid rgba(255, 255, 255, 0.08) !important; border-radius: 12px !important; padding: 10px !important; margin: 0 !important; } #icon_exporter_dialog .preview_section canvas, #icon_exporter_dialog #live_icon_preview_canvas { display: block !important; width: 100% !important; height: auto !important; margin: 0 auto !important; box-sizing: border-box !important; } #icon_exporter_dialog .export_bottom_section { width: 100% !important; min-width: 0 !important; display: flex !important; flex-direction: column !important; gap: 4px !important; box-sizing: border-box !important; margin: 0 !important; overflow: hidden !important; } #icon_exporter_dialog .export_bottom_section .form_part, #icon_exporter_dialog .export_bottom_section .form_element, #icon_exporter_dialog .export_bottom_section .form_bar, #icon_exporter_dialog .export_bottom_section .form_group { margin: 0 !important; width: 100% !important; min-width: 0 !important; box-sizing: border-box !important; } #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) { display: grid !important; grid-template-columns: minmax(0, var(--max_label_width, 180px)) minmax(0, 1fr) auto !important; align-items: center !important; column-gap: 10px !important; } #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) > .name_space_left { grid-column: 1 !important; min-width: 0 !important; overflow: hidden !important; text-overflow: ellipsis !important; } #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) > .dialog_form_description { grid-column: 3 !important; justify-self: start !important; margin-left: 4px !important; } #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) select, #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) input[type="text"], #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) input[type="number"], #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) .dark_bordered { grid-column: 2 !important; width: 100% !important; min-width: 0 !important; box-sizing: border-box !important; } #icon_exporter_dialog .export_bottom_section .form_bar_output_folder { display: flex !important; align-items: center !important; gap: 6px !important; min-width: 0 !important; } #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > * { flex: 0 0 auto !important; align-self: center !important; margin: 0 !important; } #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > .name_space_left { flex: 0 0 var(--max_label_width, 180px) !important; min-width: 0 !important; overflow: hidden !important; text-overflow: ellipsis !important; } #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > input, #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > .input_wrapper { flex: 1 1 0 !important; min-width: 0 !important; width: 100% !important; box-sizing: border-box !important; } #icon_exporter_dialog .export_bottom_section .form_bar_output_folder input[type="text"], #icon_exporter_dialog .export_bottom_section .form_bar_output_folder .dark_bordered { width: 100% !important; min-width: 0 !important; box-sizing: border-box !important; } #icon_exporter_dialog .dialog_form_description { flex: 0 0 auto !important; margin-right: 0 !important; } #icon_exporter_dialog .form_bar_layout_wrapper { display: none !important; } #icon_exporter_dialog .preview_title { font-size: 18px !important; font-weight: 600 !important; letter-spacing: 0.2px !important; } #icon_exporter_dialog .range_input_label { min-width: 34px !important; text-align: right !important; font-variant-numeric: tabular-nums !important; opacity: 0.9 !important; } #icon_exporter_dialog .form_element input[type="text"], #icon_exporter_dialog .form_element input[type="number"], #icon_exporter_dialog .form_element .dark_bordered, #icon_exporter_dialog .form_element select { border-radius: 10px !important; } @media (max-width: 980px) { #icon_exporter_dialog .icon_exporter_top_section { flex-direction: column !important; } #icon_exporter_dialog .preview_section { flex: 0 1 auto !important; max-width: 100% !important; min-width: 0 !important; } } `; document.head.appendChild(style); let formContainer = dialog.object.querySelector('.form_wrapper') || dialog.object.querySelector('.dialog_content') || dialog.object.querySelector('form') || dialog.object.querySelector('.dialog_wrapper'); if (formContainer) { formContainer.classList.add('icon_exporter_layout_container'); let modeBar = document.createElement('div'); modeBar.className = 'mie_dialog_mode_bar'; modeBar.style.cssText = 'display:flex;gap:4px;margin-bottom:8px;'; let floatBtn = document.createElement('div'); floatBtn.textContent = 'Float'; floatBtn.className = 'mie_mode_btn active'; floatBtn.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:var(--color-accent);color:#fff;border-color:var(--color-accent);'; let panelBtn = document.createElement('div'); panelBtn.textContent = 'Panel'; panelBtn.className = 'mie_mode_btn'; panelBtn.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:rgba(255,255,255,0.04);color:var(--color-subtle_text);'; panelBtn.addEventListener('click', () => { dialog.cancel(); switchToPanel(); }); modeBar.appendChild(floatBtn); modeBar.appendChild(panelBtn); formContainer.appendChild(modeBar); let topSection = Interface.createElement('div', { class: 'icon_exporter_top_section' }); let leftColumn = Interface.createElement('div', { class: 'icon_exporter_left_column' }); previewSection.className = 'preview_section'; let formElements = Array.from( formContainer.querySelectorAll('.form_element, .form_bar, .form_group') ); formElements.forEach(element => { if (!element.classList.contains('preview_section')) { element.classList.add('form_part'); leftColumn.appendChild(element); } }); topSection.appendChild(leftColumn); topSection.appendChild(previewSection); formContainer.appendChild(topSection); bottomMetaSection = Interface.createElement('div', { class: 'export_bottom_section' }); formContainer.appendChild(bottomMetaSection); applyDialogBottomLayout(dialog, bottomMetaSection); normalizeIconExporterDialog(dialog); } else { let dialogContent = dialog.object.querySelector('.dialog_content'); if (dialogContent) { dialogContent.classList.add('icon_exporter_layout_container'); let modeBar2 = document.createElement('div'); modeBar2.className = 'mie_dialog_mode_bar'; modeBar2.style.cssText = 'display:flex;gap:4px;margin-bottom:8px;'; let floatBtn2 = document.createElement('div'); floatBtn2.textContent = 'Float'; floatBtn2.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:var(--color-accent);color:#fff;border-color:var(--color-accent);'; let panelBtn2 = document.createElement('div'); panelBtn2.textContent = 'Panel'; panelBtn2.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:rgba(255,255,255,0.04);color:var(--color-subtle_text);'; panelBtn2.addEventListener('click', () => { dialog.cancel(); switchToPanel(); }); modeBar2.appendChild(floatBtn2); modeBar2.appendChild(panelBtn2); dialogContent.appendChild(modeBar2); let topSection = Interface.createElement('div', { class: 'icon_exporter_top_section' }); let leftColumn = Interface.createElement('div', { class: 'icon_exporter_left_column' }); previewSection.className = 'preview_section'; let formElements = Array.from( dialogContent.querySelectorAll('.form_element, .form_bar, .form_group') ); formElements.forEach(element => { if (!element.classList.contains('preview_section')) { element.classList.add('form_part'); leftColumn.appendChild(element); } }); topSection.appendChild(leftColumn); topSection.appendChild(previewSection); dialogContent.appendChild(topSection); bottomMetaSection = Interface.createElement('div', { class: 'export_bottom_section' }); dialogContent.appendChild(bottomMetaSection); applyDialogBottomLayout(dialog, bottomMetaSection); normalizeIconExporterDialog(dialog); } } (function fixFolderBrowseButton() { let folderBar = dialog.object.querySelector('.form_bar_output_folder'); if (!folderBar) return; let inputWrapper = folderBar.querySelector('.input_wrapper'); if (!inputWrapper) return; let folderIcon = inputWrapper.querySelector('i.material-icons'); if (!folderIcon) return; folderBar.insertBefore(folderIcon, inputWrapper.nextSibling); folderIcon.style.cursor = 'pointer'; folderIcon.addEventListener('click', function(e) { e.stopPropagation(); inputWrapper.click(); }); })(); let resetButton = document.createElement('button'); resetButton.type = 'button'; resetButton.textContent = 'Reset Camera to Auto-Frame'; resetButton.style.cssText = 'margin: 8px 0 12px 0; padding: 8px 14px; background: linear-gradient(180deg, #4f95f7, #3e7ad6); color: white; border: 1px solid rgba(255,255,255,0.14); border-radius: 999px; font-size: 12px; font-weight: 600; letter-spacing: 0.2px; cursor: pointer;'; resetButton.disabled = true; resetButton.style.opacity = '0.5'; resetButton.style.cursor = 'not-allowed'; activeResetButton = resetButton; resetButton.onclick = function(event) { if (event && typeof event.preventDefault === 'function') { event.preventDefault(); } if (event && typeof event.stopPropagation === 'function') { event.stopPropagation(); } stopCameraWatcher(); let formData = resolveFormData(dialog, dialog.getFormResult()); let resetValues = { ...formData, auto_frame: true, zoom_level: 1.0, rotate_x: 0, rotate_y: 0, rotate_z: 0, pan_x: 0, pan_y: 0 }; dialog.setFormValues(resetValues, false); syncRangeLabels(dialog, resetValues); let appliedValues = resolveFormData(dialog, resetValues); baseCameraPosition = null; baseCameraTarget = null; baseCameraUp = null; lastAutoFrameState = appliedValues.auto_frame; function finalizeReset() { adjustCameraManually(appliedValues); lastCameraValues = getCameraValues(appliedValues); updateResetButtonState(appliedValues); updateLivePreview(dialog, appliedValues); } if (dialogDefaultFramedCameraState) { applyCameraState(cloneCameraState(dialogDefaultFramedCameraState), getActiveCameraPreview()); captureBaseCameraState(); finalizeReset(); } else { frameModelForIcon(appliedValues).then(() => { dialogDefaultFramedCameraState = captureCameraState(getActiveCameraPreview()); finalizeReset(); }); } }; let panUpBar = dialog.object.querySelector('.form_bar_pan_y'); let leftColumnContainer = panUpBar && panUpBar.parentNode ? panUpBar.parentNode : ( dialog.object.querySelector('.form') || formContainer ); if (leftColumnContainer) { let buttonContainer = document.createElement('div'); buttonContainer.style.cssText = 'margin: 15px 0; text-align: center;'; buttonContainer.appendChild(resetButton); if (panUpBar) { if (panUpBar.parentNode === leftColumnContainer && panUpBar.nextSibling) { leftColumnContainer.insertBefore(buttonContainer, panUpBar.nextSibling); } else { leftColumnContainer.appendChild(buttonContainer); } } else { leftColumnContainer.appendChild(buttonContainer); } } } finally { requestAnimationFrame(() => { normalizeIconExporterDialog(dialog); syncConditionalBars(dialog); requestAnimationFrame(() => { alignAutoFrameWithZoom(dialog); if (preLayoutHideStyle && preLayoutHideStyle.parentNode) { preLayoutHideStyle.parentNode.removeChild(preLayoutHideStyle); } if (dialog.object) { dialog.object.style.opacity = '1'; } }); }); } (async () => { let formData = resolveFormData(dialog, dialog.getFormResult()); if (formData.auto_frame) { if (isolatedDialogPreview && dialogDefaultFramedCameraState) { applyCameraState(cloneCameraState(dialogDefaultFramedCameraState), isolatedDialogPreview); captureBaseCameraState(); } else { await frameModelForIcon(formData); dialogDefaultFramedCameraState = captureCameraState(getActiveCameraPreview()); } } adjustCameraManually(formData); if (!dialogDefaultFramedCameraState) { dialogDefaultFramedCameraState = captureCameraState(getActiveCameraPreview()); } lastCameraValues = getCameraValues(formData); updateResetButtonState(formData); await updateLivePreview(dialog, formData); syncConditionalBars(dialog); requestAnimationFrame(() => { alignAutoFrameWithZoom(dialog); }); })(); }, 0); } // ========================= // Dialog form and preview helpers // ========================= function getFormatSpecificInfo() { if (!Format) return 'Compatible with all model formats'; switch(Format.id) { case 'bedrock': case 'bedrock_block': return '💡 Perfect for Bedrock item textures (16×16 recommended for game compatibility)'; case 'java_block': return '💡 Ideal for Java item models (16×16 standard, 32×32 for detailed items)'; case 'skin': return '💡 Great for skin previews (64×64 recommended for face icons)'; case 'free': return '💡 Generic model export (any size works, 64×64+ recommended)'; default: return '💡 Compatible with all model formats (choose size based on intended use)'; } } function getRecommendedSize() { if (!Format) return '48'; switch(Format.id) { case 'bedrock': case 'bedrock_block': case 'java_block': return '16'; case 'skin': return '64'; default: return '48'; } } function resolveFormData(dialog, formData = {}) { let fromDialog = {}; if (dialog && typeof dialog.getFormResult === 'function') { try { fromDialog = dialog.getFormResult() || {}; } catch (error) { fromDialog = {}; } } function value(key, fallback) { if (Object.prototype.hasOwnProperty.call(formData, key) && formData[key] !== undefined) { return formData[key]; } if (Object.prototype.hasOwnProperty.call(fromDialog, key) && fromDialog[key] !== undefined) { return fromDialog[key]; } return fallback; } return { icon_size: value('icon_size', getRecommendedSize()), custom_size: value('custom_size', 48), background: value('background', 'transparent'), custom_color: value('custom_color', '#ff0000'), auto_frame: value('auto_frame', true), zoom_level: value('zoom_level', 1.0), rotate_x: value('rotate_x', 0), rotate_y: value('rotate_y', 0), rotate_z: value('rotate_z', 0), pan_x: value('pan_x', 0), pan_y: value('pan_y', 0), quality: value('quality', 'high'), save_mode: value('save_mode', 'ask_dialog'), output_folder: value('output_folder', ''), filename: value('filename', 'icon') }; } function formatRangeDisplayValue(value) { let number = Number(value); if (!Number.isFinite(number)) return '0'; if (Math.abs(number - Math.round(number)) < 0.000001) { return String(Math.round(number)); } return String(Math.round(number * 100) / 100); } function syncRangeLabels(dialog, values) { if (!dialog || !dialog.object) return; let rangeKeys = ['zoom_level', 'rotate_x', 'rotate_y', 'rotate_z', 'pan_x', 'pan_y']; rangeKeys.forEach(key => { let container = dialog.object.querySelector(`.form_bar_${key}`); if (!container) { let settingNode = dialog.object.querySelector(`[data-setting="${key}"]`); if (!settingNode) return; container = settingNode.closest('.form_element') || settingNode.closest('.form_bar') || settingNode; } let labelNode = container.querySelector('.range_input_label'); if (labelNode) { labelNode.textContent = formatRangeDisplayValue(values[key]); } }); } async function updateLivePreview(dialog, formData) { let resolvedFormData = resolveFormData(dialog, formData); let iconSize = resolvedFormData.icon_size === 'custom' ? parseInt(resolvedFormData.custom_size) : parseInt(resolvedFormData.icon_size); if (!Number.isFinite(iconSize) || iconSize <= 0) { iconSize = 48; } let infoElement = document.getElementById('preview_info_text'); if (infoElement) { infoElement.textContent = `${iconSize}×${iconSize} pixels`; } let canvas = document.getElementById('live_icon_preview_canvas'); if (canvas) { generateLivePreview(canvas, resolvedFormData); } } function hideSceneHelpers() { let hidden = {}; if (typeof three_grid !== 'undefined' && three_grid) { hidden.gridWasVisible = three_grid.visible; three_grid.visible = false; } if (typeof Transformer !== 'undefined' && Transformer) { hidden.transformerWasVisible = Transformer.visible; Transformer.visible = false; } if (typeof Canvas !== 'undefined' && Canvas.outlines) { hidden.outlinesWasVisible = Canvas.outlines.visible; Canvas.outlines.visible = false; } return hidden; } function restoreSceneHelpers(hidden) { if (!hidden) return; if (hidden.gridWasVisible !== undefined && typeof three_grid !== 'undefined' && three_grid) { three_grid.visible = hidden.gridWasVisible; } if (hidden.transformerWasVisible !== undefined && typeof Transformer !== 'undefined' && Transformer) { Transformer.visible = hidden.transformerWasVisible; } if (hidden.outlinesWasVisible !== undefined && typeof Canvas !== 'undefined' && Canvas.outlines) { Canvas.outlines.visible = hidden.outlinesWasVisible; } } function getPreviewSourceCanvas(overridePreview) { let hidden = hideSceneHelpers(); try { if (overridePreview && overridePreview.canvas) { if (typeof overridePreview.render === 'function') overridePreview.render(); return overridePreview.canvas; } if (isolatedDialogPreview && isolatedDialogPreview.canvas) { if (typeof isolatedDialogPreview.render === 'function') { isolatedDialogPreview.render(); } return isolatedDialogPreview.canvas; } if (typeof Preview !== 'undefined' && Preview.selected) { if (typeof Preview.selected.render === 'function') { Preview.selected.render(); } return Preview.selected.canvas; } let sourceCanvas = document.querySelector('#preview canvas'); if (!sourceCanvas) { sourceCanvas = document.querySelector('.preview canvas'); } return sourceCanvas; } finally { restoreSceneHelpers(hidden); } } function getBackgroundStyle(background) { switch(background) { case 'white': return '#FFFFFF'; case 'black': return '#000000'; case 'gray': return '#808080'; case 'transparent': default: return 'repeating-conic-gradient(#CCC 0% 25%, #FFF 0% 50%) 50% / 10px 10px'; } } function generateLivePreview(canvas, formData, overridePreview) { if (!canvas) return; let ctx = canvas.getContext('2d'); let previewSize = canvas.width; let iconSize = formData.icon_size === 'custom' ? parseInt(formData.custom_size) : parseInt(formData.icon_size); if (!Number.isFinite(iconSize) || iconSize <= 0) { iconSize = 48; } let qualityMultiplier; switch(formData.quality) { case 'standard': qualityMultiplier = 4; break; case 'high': qualityMultiplier = 8; break; case 'ultra': qualityMultiplier = 16; break; default: qualityMultiplier = 8; } ctx.clearRect(0, 0, previewSize, previewSize); if (formData.background === 'transparent') { let checkerSize = Math.max(8, iconSize / 8); ctx.fillStyle = '#f0f0f0'; ctx.fillRect(0, 0, previewSize, previewSize); ctx.fillStyle = '#e0e0e0'; for (let x = 0; x < previewSize; x += checkerSize) { for (let y = 0; y < previewSize; y += checkerSize) { if ((x / checkerSize + y / checkerSize) % 2) { ctx.fillRect(x, y, checkerSize, checkerSize); } } } } else if (formData.background === 'custom') { ctx.fillStyle = formData.custom_color || '#ff0000'; ctx.fillRect(0, 0, previewSize, previewSize); } else { ctx.fillStyle = getBackgroundColor(formData.background); ctx.fillRect(0, 0, previewSize, previewSize); } let sourceCanvas = getPreviewSourceCanvas(overridePreview); if (sourceCanvas) { let tempCanvas = document.createElement('canvas'); let tempCtx = tempCanvas.getContext('2d'); let renderSize = Math.max(1, Math.floor(iconSize * qualityMultiplier)); tempCanvas.width = renderSize; tempCanvas.height = renderSize; tempCtx.imageSmoothingEnabled = true; tempCtx.imageSmoothingQuality = formData.quality === 'ultra' ? 'high' : 'medium'; let sourceWidth = sourceCanvas.width; let sourceHeight = sourceCanvas.height; let sourceSize = Math.min(sourceWidth, sourceHeight); let sourceX = (sourceWidth - sourceSize) / 2; let sourceY = (sourceHeight - sourceSize) / 2; try { tempCtx.drawImage(sourceCanvas, sourceX, sourceY, sourceSize, sourceSize, 0, 0, renderSize, renderSize); ctx.imageSmoothingEnabled = true; ctx.imageSmoothingQuality = 'high'; ctx.drawImage(tempCanvas, 0, 0, previewSize, previewSize); } catch (error) { ctx.fillStyle = '#333'; ctx.fillRect(0, 0, previewSize, previewSize); ctx.fillStyle = '#fff'; ctx.font = '12px Arial'; ctx.textAlign = 'center'; ctx.fillText('Error rendering preview', previewSize/2, previewSize/2 - 10); ctx.fillText(error.message, previewSize/2, previewSize/2 + 10); } } else { ctx.fillStyle = '#333'; ctx.fillRect(0, 0, previewSize, previewSize); ctx.fillStyle = '#fff'; ctx.font = '14px Arial'; ctx.textAlign = 'center'; ctx.fillText('No preview available', previewSize/2, previewSize/2 - 10); ctx.font = '10px Arial'; ctx.fillText('Make sure model is visible', previewSize/2, previewSize/2 + 10); } } // ========================= // Icon generation orchestration // ========================= async function generateIcon(formData, restoreState = null, cleanupDialogPreview = false) { try { let iconSize = formData.icon_size === 'custom' ? parseInt(formData.custom_size) : parseInt(formData.icon_size); let filename = formData.filename || 'icon'; if (!filename.endsWith('.png')) { filename += '.png'; } Blockbench.setStatusBarText('Preparing camera view...'); Blockbench.setProgress(0.1); if (formData.auto_frame) { await frameModelForIcon(formData); } Blockbench.setStatusBarText('Adjusting camera settings...'); Blockbench.setProgress(0.3); await new Promise(resolve => setTimeout(resolve, 200)); Blockbench.setStatusBarText('Capturing high-quality screenshot...'); Blockbench.setProgress(0.5); await captureIcon(formData, iconSize, filename); Blockbench.setStatusBarText('Export complete!'); Blockbench.setProgress(1); setTimeout(() => { Blockbench.setProgress(); Blockbench.setStatusBarText(); }, 1000); } catch (error) { Blockbench.setProgress(); Blockbench.setStatusBarText(); Blockbench.showMessageBox({ title: 'Export Failed', message: 'Failed to generate icon: ' + error.message, icon: 'error' }); } finally { if (restoreState) { applyCameraState(restoreState); } if (cleanupDialogPreview) { disposeIsolatedDialogPreview(); clearDialogCameraState(); } } } // ========================= // Camera interaction controls // ========================= let baseCameraPosition = null; let baseCameraTarget = null; let baseCameraUp = null; let lastAutoFrameState = true; let lastCameraValues = { zoom_level: 1.0, rotate_x: 0, rotate_y: 0, rotate_z: 0, pan_x: 0, pan_y: 0 }; let cameraWatchInterval = null; function getCameraValues(cameraData) { return { zoom_level: parseFloat(cameraData.zoom_level) || 1.0, rotate_x: parseFloat(cameraData.rotate_x) || 0, rotate_y: parseFloat(cameraData.rotate_y) || 0, rotate_z: parseFloat(cameraData.rotate_z) || 0, pan_x: parseFloat(cameraData.pan_x) || 0, pan_y: parseFloat(cameraData.pan_y) || 0 }; } function cameraValuesChanged(a, b) { return a.zoom_level !== b.zoom_level || a.rotate_x !== b.rotate_x || a.rotate_y !== b.rotate_y || a.rotate_z !== b.rotate_z || a.pan_x !== b.pan_x || a.pan_y !== b.pan_y; } function hasManualCameraAdjustments(values) { return values.zoom_level !== 1.0 || values.rotate_x !== 0 || values.rotate_y !== 0 || values.rotate_z !== 0 || values.pan_x !== 0 || values.pan_y !== 0; } function updateResetButtonState(cameraData) { if (!activeResetButton) return; let values = getCameraValues(cameraData); let isActive = hasManualCameraAdjustments(values); activeResetButton.disabled = !isActive; activeResetButton.style.opacity = isActive ? '1' : '0.5'; activeResetButton.style.cursor = isActive ? 'pointer' : 'not-allowed'; } function captureBaseCameraState() { let preview = getActiveCameraPreview(); if (!preview || !preview.camera) { return false; } let camera = preview.camera; baseCameraPosition = camera.position.clone(); baseCameraTarget = getCurrentPreviewTarget(camera, preview); camera.up.copy(WORLD_UP); if (preview.controls && preview.controls.target) { preview.controls.target.copy(baseCameraTarget); } camera.lookAt(baseCameraTarget); if (camera.updateProjectionMatrix) { camera.updateProjectionMatrix(); } if (preview.controls && preview.controls.update) { preview.controls.update(); } if (typeof preview.render === 'function') { preview.render(); } baseCameraUp = WORLD_UP.clone(); return true; } function handleFormCameraChange(dialog, formData) { let resolvedFormData = resolveFormData(dialog, formData); let currentValues = getCameraValues(resolvedFormData); let autoFrameChanged = resolvedFormData.auto_frame !== lastAutoFrameState; lastAutoFrameState = resolvedFormData.auto_frame; if (autoFrameChanged && resolvedFormData.auto_frame) { let activePreview = getActiveCameraPreview(); function applyAutoFramedState() { baseCameraPosition = null; baseCameraTarget = null; baseCameraUp = null; captureBaseCameraState(); adjustCameraManually(currentValues); lastCameraValues = currentValues; updateResetButtonState(currentValues); updateLivePreview(dialog, resolvedFormData); } if (dialogDefaultFramedCameraState) { applyCameraState(cloneCameraState(dialogDefaultFramedCameraState), activePreview); applyAutoFramedState(); } else if (isolatedDialogPreview) { dialogDefaultFramedCameraState = captureCameraState(activePreview); applyAutoFramedState(); } else { frameModelForIcon(resolvedFormData).then(() => { dialogDefaultFramedCameraState = captureCameraState(activePreview); applyAutoFramedState(); }); } return; } if (cameraValuesChanged(currentValues, lastCameraValues)) { adjustCameraManually(currentValues); lastCameraValues = currentValues; } updateResetButtonState(currentValues); updateLivePreview(dialog, resolvedFormData); } function startCameraWatcher() { if (cameraWatchInterval) { clearInterval(cameraWatchInterval); cameraWatchInterval = null; } } function stopCameraWatcher() { if (cameraWatchInterval) { clearInterval(cameraWatchInterval); cameraWatchInterval = null; } } function adjustCameraManually(cameraData) { let preview = getActiveCameraPreview(); if (preview && preview.camera) { let camera = preview.camera; if (!baseCameraPosition || !baseCameraTarget || !baseCameraUp) { if (!captureBaseCameraState()) { return; } } let values = getCameraValues(cameraData); let zoomLevel = values.zoom_level; let rotateX = THREE.MathUtils.degToRad(values.rotate_x); let rotateY = THREE.MathUtils.degToRad(values.rotate_y); let rotateZ = THREE.MathUtils.degToRad(values.rotate_z); let newTarget = baseCameraTarget.clone(); let baseOffset = baseCameraPosition.clone().sub(baseCameraTarget); let baseUpNormal = baseCameraUp.clone().normalize(); let forward = baseCameraTarget.clone().sub(baseCameraPosition).normalize(); let right = forward.clone().cross(baseUpNormal); if (right.lengthSq() === 0) { right.set(1, 0, 0); } else { right.normalize(); } let panScale = 2.0; newTarget.add(right.multiplyScalar(values.pan_x * panScale)); newTarget.add(baseUpNormal.clone().multiplyScalar(values.pan_y * panScale)); let rotatedOffset = baseOffset.clone(); if (rotateY !== 0) { let yawQuaternion = new THREE.Quaternion().setFromAxisAngle(baseUpNormal, rotateY); rotatedOffset.applyQuaternion(yawQuaternion); } if (rotateX !== 0) { let pitchAxis = baseUpNormal.clone().cross(rotatedOffset).normalize(); if (pitchAxis.lengthSq() > 0) { let pitchQuaternion = new THREE.Quaternion().setFromAxisAngle(pitchAxis, rotateX); rotatedOffset.applyQuaternion(pitchQuaternion); } } rotatedOffset.multiplyScalar(zoomLevel); let newPosition = newTarget.clone().add(rotatedOffset); camera.position.copy(newPosition); let upVector = baseUpNormal.clone(); if (rotateZ !== 0) { let forwardAxis = newTarget.clone().sub(newPosition).normalize(); if (forwardAxis.lengthSq() > 0) { let rollQuaternion = new THREE.Quaternion().setFromAxisAngle(forwardAxis, rotateZ); upVector.applyQuaternion(rollQuaternion); } } camera.up.copy(upVector); if (preview.controls && preview.controls.target) { preview.controls.target.copy(newTarget); } camera.lookAt(newTarget); if (camera.updateProjectionMatrix) { camera.updateProjectionMatrix(); } if (preview.controls && preview.controls.update) { preview.controls.update(); } if (typeof preview.render === 'function') { preview.render(); setTimeout(() => { let canvas = document.getElementById('live_icon_preview_canvas'); if (canvas) { generateLivePreview(canvas, cameraData); } }, 100); } } else { } } function frameModelForIcon(formData = {}, skipZoom = false) { return new Promise((resolve) => { if (isolatedDialogPreview) { baseCameraPosition = null; baseCameraTarget = null; baseCameraUp = null; captureBaseCameraState(); if (typeof isolatedDialogPreview.render === 'function') { isolatedDialogPreview.render(); } resolve(); return; } let originalSelection = null; try { let allElements = Project.elements.filter(element => element.visibility !== false); if (allElements.length === 0) { resolve(); return; } if (typeof Outliner !== 'undefined' && Outliner.selected) { originalSelection = Outliner.selected.slice(); Outliner.selected.splice(0); allElements.forEach(element => { Outliner.selected.push(element); }); } if (typeof BarItems !== 'undefined' && BarItems.focus_on_selection) { let mockEvent = { ctrlKey: false, type: 'click' }; if (typeof BarItems.focus_on_selection.click === 'function') { BarItems.focus_on_selection.click(mockEvent); } } setTimeout(() => { if (getSelectedPreview() && getSelectedPreview().camera) { captureBaseCameraState(); if (typeof getSelectedPreview().render === 'function') { getSelectedPreview().render(); } } if (originalSelection && typeof Outliner !== 'undefined' && Outliner.selected) { Outliner.selected.splice(0); originalSelection.forEach(element => { Outliner.selected.push(element); }); } resolve(); }, 200); } catch (error) { if (originalSelection && typeof Outliner !== 'undefined' && Outliner.selected) { Outliner.selected.splice(0); originalSelection.forEach(element => { Outliner.selected.push(element); }); } resolve(); } }); } // ========================= // Capture and export pipeline // ========================= function getBackgroundColor(background) { switch(background) { case 'white': return '#FFFFFF'; case 'black': return '#000000'; case 'gray': return '#808080'; case 'transparent': default: return null; } } async function captureIcon(formData, iconSize, filename) { return new Promise((resolve, reject) => { try { let multiplier; switch(formData.quality) { case 'standard': multiplier = 4; break; case 'high': multiplier = 8; break; case 'ultra': multiplier = 16; break; default: multiplier = 8; } let captureSize = iconSize * multiplier; let captureCompleted = false; let fallbackTimer = null; if (isolatedDialogPreview) { captureFromCanvas(formData, iconSize, filename); resolve(); return; } function finishCapture(fn) { if (captureCompleted) return; captureCompleted = true; if (fallbackTimer) { clearTimeout(fallbackTimer); } fn(); resolve(); } if (typeof MediaRecorder !== 'undefined' && typeof MediaRecorder.capture === 'function') { fallbackTimer = setTimeout(() => { finishCapture(() => { captureFromCanvas(formData, iconSize, filename); }); }, 3000); MediaRecorder.capture({ type: 'image', width: captureSize, height: captureSize, callback: function(blob) { if (blob && blob.size > 0) { finishCapture(() => { processImageBlob(blob, formData, iconSize, filename); }); } else { finishCapture(() => { captureFromCanvas(formData, iconSize, filename); }); } } }); } else { captureFromCanvas(formData, iconSize, filename); resolve(); } } catch (error) { reject(error); } }); } function captureFromCanvas(formData, iconSize, filename) { try { let sourceCanvas = getPreviewSourceCanvas(); if (!sourceCanvas) { throw new Error('Could not find preview canvas'); } let multiplier; switch(formData.quality) { case 'standard': multiplier = 4; break; case 'high': multiplier = 8; break; case 'ultra': multiplier = 16; break; default: multiplier = 8; } let captureSize = iconSize * multiplier; let tempCanvas = document.createElement('canvas'); tempCanvas.width = captureSize; tempCanvas.height = captureSize; let ctx = tempCanvas.getContext('2d'); if (formData.background === 'custom') { ctx.fillStyle = formData.custom_color || '#ff0000'; ctx.fillRect(0, 0, captureSize, captureSize); } else { let bgColor = getBackgroundColor(formData.background); if (bgColor) { ctx.fillStyle = bgColor; ctx.fillRect(0, 0, captureSize, captureSize); } } ctx.imageSmoothingEnabled = true; ctx.imageSmoothingQuality = formData.quality === 'ultra' ? 'high' : 'medium'; let sourceWidth = sourceCanvas.width; let sourceHeight = sourceCanvas.height; let sourceSize = Math.min(sourceWidth, sourceHeight); let sourceX = (sourceWidth - sourceSize) / 2; let sourceY = (sourceHeight - sourceSize) / 2; ctx.drawImage(sourceCanvas, sourceX, sourceY, sourceSize, sourceSize, 0, 0, captureSize, captureSize); resizeAndExport(tempCanvas, iconSize, filename, formData); } catch (error) { Blockbench.showMessageBox({ title: 'Capture Failed', message: 'Could not capture the model view. Please ensure a model is loaded and visible.', icon: 'error' }); } } function processImageBlob(blob, formData, iconSize, filename) { let img = new Image(); img.onload = function() { let canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; let ctx = canvas.getContext('2d'); if (formData.background === 'custom') { ctx.fillStyle = formData.custom_color || '#ff0000'; ctx.fillRect(0, 0, canvas.width, canvas.height); } else { let bgColor = getBackgroundColor(formData.background); if (bgColor) { ctx.fillStyle = bgColor; ctx.fillRect(0, 0, canvas.width, canvas.height); } } ctx.drawImage(img, 0, 0); resizeAndExport(canvas, iconSize, filename, formData); URL.revokeObjectURL(img.src); }; img.onerror = function() { captureFromCanvas(formData, iconSize, filename); }; img.src = URL.createObjectURL(blob); } function resizeAndExport(sourceCanvas, targetSize, filename, formData = {}) { try { let currentCanvas = sourceCanvas; let currentSize = Math.max(sourceCanvas.width, sourceCanvas.height); while (currentSize > targetSize * 2) { let nextSize = Math.max(Math.floor(currentSize * 0.5), targetSize); let stepCanvas = document.createElement('canvas'); stepCanvas.width = nextSize; stepCanvas.height = nextSize; let stepCtx = stepCanvas.getContext('2d'); stepCtx.imageSmoothingEnabled = true; stepCtx.imageSmoothingQuality = 'high'; stepCtx.drawImage(currentCanvas, 0, 0, nextSize, nextSize); currentCanvas = stepCanvas; currentSize = nextSize; } let finalCanvas = document.createElement('canvas'); finalCanvas.width = targetSize; finalCanvas.height = targetSize; let ctx = finalCanvas.getContext('2d'); if (targetSize <= 32) { ctx.imageSmoothingEnabled = false; } else { ctx.imageSmoothingEnabled = true; ctx.imageSmoothingQuality = 'high'; } ctx.drawImage(currentCanvas, 0, 0, targetSize, targetSize); finalCanvas.toBlob(function(blob) { exportFinalImage(blob, filename, targetSize, formData); }, 'image/png'); } catch (error) { Blockbench.showMessageBox({ title: 'Resize Error', message: 'Failed to resize image: ' + error.message, icon: 'error' }); } } function getNormalizedExportName(filename) { let name = typeof filename === 'string' ? filename.trim() : 'icon'; if (!name) { name = 'icon'; } name = name.replace(/[/\\:*?"<>|]/g, '_'); if (!name.toLowerCase().endsWith('.png')) { name += '.png'; } return name; } function writeDataUrlToOutputFolder(dataURL, outputFolder, filename) { if (!canUseAppFileSystem()) { throw new Error('Auto-save is only available in the desktop app'); } let folderPath = typeof outputFolder === 'string' ? outputFolder.trim() : ''; if (!folderPath) { throw new Error('No output folder selected'); } let fsModule = getNativeModule('fs', { scope: folderPath, message: 'This permission is required to save exported icons to your selected output folder.' }); let pathModule = getNativeModule('path'); if (!fsModule) { throw new Error('File system permission was denied'); } if (!pathModule) { throw new Error('Path module is unavailable'); } if (!fsModule.existsSync(folderPath)) { throw new Error('Selected output folder does not exist'); } let folderStats = fsModule.statSync(folderPath); if (!folderStats || !folderStats.isDirectory()) { throw new Error('Selected output path is not a folder'); } let fileName = getNormalizedExportName(filename); let fullPath = pathModule.join(folderPath, fileName); let commaIndex = typeof dataURL === 'string' ? dataURL.indexOf(',') : -1; if (commaIndex === -1) { throw new Error('Invalid image data'); } let base64Data = dataURL.slice(commaIndex + 1); fsModule.writeFileSync(fullPath, base64Data, 'base64'); return fullPath; } function exportFinalImage(blob, filename, iconSize, formData = {}) { try { if (!blob) { throw new Error('No image data generated'); } let reader = new FileReader(); reader.onload = function() { let dataURL = reader.result; let exportPrefs = normalizeExportPrefs(formData); let fileNameWithExtension = getNormalizedExportName(filename); let baseName = fileNameWithExtension.replace(/\.png$/i, ''); let preferredFolder = exportPrefs.output_folder; let shouldAutoSave = exportPrefs.save_mode === 'auto_folder' && !!preferredFolder; if (shouldAutoSave) { try { let savedPath = writeDataUrlToOutputFolder(dataURL, preferredFolder, fileNameWithExtension); Blockbench.showMessageBox({ title: 'Export Complete', message: `${iconSize}×${iconSize} icon exported successfully.`, icon: 'check' }); Blockbench.showQuickMessage('Saved to: ' + savedPath, 3000); return; } catch (error) { Blockbench.showQuickMessage('Auto-save failed, opening save dialog'); } } let startPath = undefined; if (preferredFolder) { let sep = preferredFolder.includes('\\') ? '\\' : '/'; startPath = preferredFolder + sep + fileNameWithExtension; } Blockbench.export({ type: 'PNG Image', extensions: ['png'], name: baseName, content: dataURL, savetype: 'image', startpath: startPath }, function(path) { if (path) { Blockbench.showMessageBox({ title: 'Export Complete', message: `${iconSize}×${iconSize} icon exported successfully.`, icon: 'check' }); } else { Blockbench.showQuickMessage('Export cancelled'); } }); }; reader.onerror = function() { throw new Error('Failed to read image data'); }; reader.readAsDataURL(blob); } catch (error) { Blockbench.showMessageBox({ title: 'Export Error', message: 'Failed to export icon: ' + error.message, icon: 'error' }); } } ================================================ FILE: plugins/mesh_tools/about.md ================================================
    This plugin adds **powerful** mesh modeling tools, operators, and generators into to your Blockbench. By installing the plugin, you get:
    hub Bridge Edge Loops NEW
    change_circle To Sphere
    blur_on Laplacian Smooth
    control_camera Poke Faces
    Triangles To Quadrilaterals
    pie_chart_outline Triangulate Faces
    map UV Mapping
    view_in_ar Project From View DEPRECATED
    open_with Cubic Projection
    unfold_more_double Expand Selection
    unfold_less_double Shrink Selection
    content_cut Subdivide
    vertical_split Split Edges
    scatter_plot Scatter
    Array
    Boolean NEW EXPERIMENTAL
    terrain Terrain
    draw Terrain Style Editor
    format_size Text Mesh
    XYZ Math Surface
    Quick Primitives
    offline_bolt Polyhedron
    offline_bolt Torus Knot
    ### Modeling Tools For applying modifications on selected vertices, edges or faces.
    hub Bridge Edge Loops NEW
    Access From:
    MTools

    Connects multiple edge loops with faces.

    Input
    Result
    Results with Blend Path enabled.
    Input
    Result
    change_circle To Sphere
    Access From:
    MTools

    Casts selected vertices into a smooth, spherical shape with adjustable influence.

    Input
    Result
    Input
    Result
    blur_on Laplacian Smooth
    Access From:
    MTools

    Smoothens selected vertices by averaging the position of neighboring vertices.

    Input
    Result
    control_camera Poke Faces
    Access From:
    MTools

    Generates a fan out of a face.

    Input
    Result
    Triangles To Quadrilaterals
    Access From:
    MTools

    Attempts to merge adjacent triangles into quadrilaterals.

    Input
    Result
    pie_chart_outline Triangulate Faces
    Access From:
    MTools

    Splits selected faces into triangles.

    Input
    Result
    view_in_ar Project From View DEPRECATED
    Access From:
    MTools
    map UV Mapping

    Projects the selected faces to the UV map from the camera. Use built-in under UV > UV Project from View

    Mesh
    UV
    open_with Cubic Projection
    Access From:
    MTools
    map UV Mapping

    Unwraps the UV map from the 6 sides of a cube.

    Mesh
    UV
    unfold_more_double Expand Selection
    Access From:
    MTools

    Expands the selection with neighboring vertices.

    unfold_less_double Shrink Selection
    Access From:
    MTools

    Shrinks the selection with neighboring vertices.

    ### Modeling Operators For applying modifications on selected meshes.
    content_cut Subdivide
    Access From:
    MTools Operators

    Splits the faces of a mesh into smaller faces, giving it a smooth appearance.

    Input
    Result
    vertical_split Split Edges
    Access From:
    MTools Operators

    Splits and duplicates edges within a mesh, breaking 'links' between faces around those split edges.

    scatter_plot Scatter
    Access From:
    MTools Operators

    Scatters selected meshes on the active mesh.

    Array
    Access From:
    MTools Operators

    Generates an array of copies of the base object, with each copy being offset from the previous one.

    Boolean NEW EXPERIMENTAL
    Access From:
    MTools Operators

    Performs a boolean operation on two selected meshes.

    Result with boolean operation "Subtraction (A - B)".
    Input
    Result
    Result with boolean operation "Intersection (A ∩ B)".
    Input
    Result
    ### Mesh Generators For procedural mesh generation
    terrain Terrain
    Access From:
    MTools Generate

    Generates terrains procedurally with fully customized settings.

    draw Terrain Style Editor
    Access From:
    MTools Generate

    Configure the Custom color gradient style of the terrain generator.

    format_size Text Mesh
    Access From:
    MTools Generate

    Converts text into a 3D object, ideal for creating signs or logos.

    "Butcher" expressed in Chinese
    XYZ Math Surface
    Access From:
    MTools Generate

    Generates an xyz surface based on mathematical equations containing 23 pre-built presets!

    Twisted Torus Preset
    offline_bolt Polyhedron
    Access From:
    MTools Generate
    Quick Primitives

    Generate a polyhedron such as an Icosahedron, a Dodecahedron, an Octahedron or a Tetrahedron.

    Icosahedron
    offline_bolt Torus Knot
    Access From:
    MTools Generate
    Quick Primitives

    Generate a Torus Knot with fully customized settings.

    −   Malik12tree
    ================================================ FILE: plugins/mesh_tools/changelog.json ================================================ { "2.0.0": { "title": "2.0.0", "date": "2024-03-21", "author": "Malik12tree", "categories": [ { "title": "Features", "list": [ "Added new Bridge Edge Loops action" ] }, { "title": "Changes", "list": [ "Triangles To Quadrilaterals: Improved algorithm", "Scatter: Scattered elements more accurately follow surface rotation", "Expand/Shrink Selection: Extend functionality in face and edge selection modes", "Text Mesh: Support loading OpenType font files", "XYZ Surface Generator: Include variables as sliders" ] } ] }, "2.0.1": { "title": "2.0.1", "date": "2024-05-10", "author": "Malik12tree", "categories": [ { "title": "Changes", "list": [ "Scatter: Added additional scatter settings" ] }, { "title": "Fixes", "list": [ "Scatter: Fixed issue with undoing group creation", "Bridge Edge Loops: Fix issue with choosing best followup twist offset" ] } ] }, "2.0.2": { "title": "2.0.2", "date": "2024-05-11", "author": "Malik12tree", "categories": [ { "title": "Fixes", "list": [ "Text Mesh: Fixed issue where fonts wouldn't load" ] } ] }, "2.1.0": { "title": "2.1.0", "date": "2025-03-16", "author": "Malik12tree", "categories": [ { "title": "Features", "list": [ "Added new Boolean operations action" ] }, { "title": "Changes", "list": [ "Enhance amend edit menus" ] }, { "title": "Fixes", "list": [ "Fixed amend edits for Poke and Triangles To Quadrilaterals actions" ] }, { "title": "Deprecations", "list": [ "UV Project From View: Deprecated in favor of UV > UV Project from View" ] } ] } } ================================================ FILE: plugins/mesh_tools/mesh_tools.js ================================================ (()=>{var C0=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ui=C0(()=>{});var _o={bevel:{docs:{private:!0},name:"Bevel",icon:"rounded_corner",description:"Chamfers selected edges",selection_mode:["edge"]},laplacian_smooth:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"laplacian_smooth_before.png",caption:"word.before"},{type:"image",src:"laplacian_smooth_after.png",caption:"word.after"}]}]},name:"Laplacian Smooth",icon:"blur_on",description:"Smoothens selected vertices by averaging the position of neighboring vertices."},to_sphere:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"to_sphere_1_before.png",caption:"word.before"},{type:"image",src:"to_sphere_1_after.png",caption:"word.after"}]},{type:"inset_row",items:[{type:"image",src:"to_sphere_2_before.png",caption:"word.before"},{type:"image",src:"to_sphere_2_after.png",caption:"word.after"}]}]},name:"To Sphere",icon:"change_circle",description:"Casts selected vertices into a smooth, spherical shape with adjustable influence."},bridge_edge_loops:{docs:{flags:{new:!0},lines:[{type:"inset_row",items:[{type:"image",src:"bridge_edge_loops_before.png",caption:"word.before"},{type:"image",src:"bridge_edge_loops_1_after.png",caption:"word.after"}]},"Results with Blend Path enabled.",{type:"inset_row",items:[{type:"image",src:"bridge_edge_loops_before.png",caption:"word.before"},{type:"image",src:"bridge_edge_loops_2_after.png",caption:"word.after"}]}]},name:"Bridge Edge Loops",icon:"hub",description:"Connects multiple edge loops with faces.",selection_mode:["edge","face"]},poke:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"poke_before.png",caption:"word.before"},{type:"image",src:"poke_after.png",caption:"word.after"}]}]},name:"Poke Faces",icon:"control_camera",description:"Generates a fan out of a face.",selection_mode:"face"},tris_to_quad:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"tris_to_quad_before.png",caption:"word.before"},{type:"image",src:"tris_to_quad_after.png",caption:"word.after"}]}]},name:"Triangles To Quadrilaterals",icon:"fas.fa-external-link-square-alt",description:"Attempts to merge adjacent triangles into quadrilaterals.",selection_mode:"face"},triangulate:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"triangulate_before.png",caption:"word.before"},{type:"image",src:"triangulate_after.png",caption:"word.after"}]}]},name:"Triangulate Faces",icon:"pie_chart_outline",description:"Splits selected faces into triangles.",selection_mode:"face"},uv_project_view:{docs:{flags:{deprecated:!0},lines:[{type:"inset_row",items:[{type:"image",src:"uv_project_view_solid.png",caption:"word.mesh"},{type:"image",src:"uv_project_view_uv.png",caption:"word.uv"}]}]},name:"Project From View",icon:"view_in_ar",description:"Projects the selected faces to the UV map from the camera. Use built-in under UV > UV Project from View"},uv_turnaround_projection:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"uv_turnaround_projection_solid.png",caption:"word.mesh"},{type:"image",src:"uv_turnaround_projection_uv.png",caption:"word.uv"}]}]},name:"Cubic Projection",icon:"open_with",description:"Unwraps the UV map from the 6 sides of a cube."},uv_mapping:{name:"UV Mapping",icon:"map",children:["uv_project_view","uv_turnaround_projection"]},expand_selection:{name:"Expand Selection",icon:"unfold_more_double",description:"Expands the selection with neighboring vertices.",keybind:{key:"l",ctrl:!0}},shrink_selection:{name:"Shrink Selection",icon:"unfold_less_double",description:"Shrinks the selection with neighboring vertices.",keybind:{key:"k",ctrl:!0}},tools:{name:"MTools",icon:"fas.fa-vector-square",condition:"NON_OBJECT_MODE",children:["bridge_edge_loops","to_sphere","laplacian_smooth","_","poke","tris_to_quad","triangulate","_","uv_mapping","_","expand_selection","shrink_selection"]},operators:{name:"MTools Operators",icon:"fas.fa-vector-square",condition:"OBJECT_MODE",children:["subdivide","split_edges","_","scatter","array_elements","_","boolean"]},subdivide:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"subdivide_before.png",caption:"word.before"},{type:"image",src:"subdivide_after.png",caption:"word.after"}]}]},name:"Subdivide",icon:"content_cut",description:"Splits the faces of a mesh into smaller faces, giving it a smooth appearance."},split_edges:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"split_edges.png"}]}]},name:"Split Edges",icon:"vertical_split",description:"Splits and duplicates edges within a mesh, breaking 'links' between faces around those split edges."},scatter:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"scatter.png"}]}]},name:"Scatter",description:"Scatters selected meshes on the active mesh.",icon:"scatter_plot"},array_elements:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"array.png"}]}]},name:"Array",icon:"fas.fa-layer-group",description:"Generates an array of copies of the base object, with each copy being offset from the previous one."},boolean:{name:"Boolean",icon:"fas.fa-object-group",description:"Performs a boolean operation on two selected meshes.",docs:{flags:{new:!0,experimental:!0},lines:['Result with boolean operation "Subtraction (A - B)".',{type:"inset_row",items:[{type:"image",src:"boolean_before.png",caption:"word.before"},{type:"image",src:"boolean_1_after.png",caption:"word.after"}]},'Result with boolean operation "Intersection (A \u2229 B)".',{type:"inset_row",items:[{type:"image",src:"boolean_before.png",caption:"word.before"},{type:"image",src:"boolean_2_after.png",caption:"word.after"}]}]}},generators:{name:"MTools Generate",icon:"fas.fa-vector-square",condition:"MESH",children:["terrain_action","terrainse","_","textmesh","xyzmathsurfacefunction","quickprimitives"]},terrain_action:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"terrain_solid.png"},{type:"image",src:"terrain_wire.png"}]}]},name:"Terrain",icon:"terrain",description:"Generates terrains procedurally with fully customized settings."},terrainse:{name:"Terrain Style Editor",icon:"draw",description:"Configure the Custom color gradient style of the terrain generator."},textmesh:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"text.png",caption:'"Butcher" expressed in Chinese'}]}]},name:"Text Mesh",icon:"format_size",description:"Converts text into a 3D object, ideal for creating signs or logos."},xyzmathsurfacefunction:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"xyz.png",caption:"Twisted Torus Preset"}]}]},name:"XYZ Math Surface",icon:"fas.fa-brain",description:"Generates an xyz surface based on mathematical equations containing 23 pre-built presets!"},quickprimitives:{name:"Quick Primitives",icon:"fas.fa-shapes",children:["polyhedron","torusknot"]},polyhedron:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"polyhedron.png",caption:"Icosahedron"}]}]},name:"Polyhedron",icon:"offline_bolt",description:"Generate a polyhedron such as an Icosahedron, a Dodecahedron, an Octahedron or a Tetrahedron."},torusknot:{docs:{lines:[{type:"inset_row",items:[{type:"image",src:"torus_knot.png"}]}]},name:"Torus Knot",icon:"offline_bolt",description:"Generate a Torus Knot with fully customized settings."}};var Ri="",M0="",_r=class{constructor(t){this.id=t}#e(){return this.id.startsWith("@")}qualifyKey(t){return this.#e()?`${this.id}/${t}`:`@${this.id}/${t}`}set(t,r){t=this.qualifyKey(t),localStorage.setItem(t,JSON.stringify(r))}delete(t){t=this.qualifyKey(t),localStorage.removeItem(t)}has(t){return t=this.qualifyKey(t),localStorage.hasOwnProperty(t)}get(t){t=this.qualifyKey(t);let r=localStorage.getItem(t);return r!=null?JSON.parse(r):null}update(t,r,n){let i=this.get(t)??n,s=r(i);return this.set(t,s)}},ln=new _r(Ri),Bi=new _r(M0),cn=class e extends _r{in(t){return Bi.update(this.id,r=>(r.safePush(t),r),[]),new e(this.qualifyKey(t))}constructor(t){console.assert(t!=Ri,`QualifiedStorage: id cannot be equal to ${JSON.stringify(Ri)}`),super(t)}set(t,r){ln.update(this.id,n=>(n.safePush(t),n),[]),super.set(t,r)}delete(t){ln.update(this.id,r=>{let n=r.indexOf(t);return n!=-1&&r.splice(n,1),r},[]),super.delete(t)}getAllKeys(){return ln.get(this.id)??[]}clear(){for(let r of this.getAllKeys())super.delete(r);let t=Bi.get(this.id)??[];for(let r of t)new e(this.qualifyKey(r)).clear();ln.delete(this.id),Bi.delete(this.id)}};var Xt="mesh_tools",un=new cn(Xt);var qn=_o,k0={MESH:{modes:["edit"],features:["meshes"]},OBJECT_MODE:{modes:["edit"],features:["meshes"],method:()=>Mesh.selected.length&&BarItems.selection_mode.value=="object"},NON_OBJECT_MODE:{modes:["edit"],features:["meshes"],method:()=>Mesh.selected.length&&BarItems.selection_mode.value!="object"}},Et=e=>e=="_"?e:`@${Xt}/${e}`;function P(e,t){console.assert(e in qn,e);let r=Object.assign({click:t},qn[e]);if(r.plugin=Xt,r.children&&(r.children=r.children.map(Et)),typeof r.condition=="string"&&(r.condition=k0[r.condition]),r.selection_mode){let n=r.condition;r.condition=()=>Mesh.selected.length&&(r.selection_mode instanceof Array?r.selection_mode.includes(BarItems.selection_mode.value):BarItems.selection_mode.value==r.selection_mode)&&Condition(n)}return r.keybind&&(r.keybind=new Keybind(r.keybind)),new Action(Et(e),r)}function wo(e){let t=-1,r=1/0;for(let n=0;nr){if(e.length==1)return e[0];if(e.length==0)return null;let r=null,n=1/0;for(let i of e){let s=t(i);s<=n&&(r=i,n=s)}return r}function fn(e,t,r){return e.map((n,i)=>Math.lerp(n,t[i],r))}function Oi(e,t=2){let r=[];for(let n=0;n=e.length;)t-=e.length;let r=[];for(let n=0;n{s in r||(r[s]=[]),i.vertices.forEach(o=>{o!=s&&r[s].safePush(o)})})}return r}static VertexFaces(t){let r={};for(let n in t.faces){let i=t.faces[n];for(let s of i.vertices)r[s]??=[],r[s].safePush(i)}return r}static EdgeFaces(t){let r={};for(let n in t.faces){let i=t.faces[n],s=i.getSortedVertices();for(let o=0;o0||s>0||o>0;return!(a&&l)}function L0(e){if(e.length<=2)return!0;let t=0;for(let r=0;r=0}function P0(e){if(e.length<3)throw new Error("projectIntoOwnPlane(): Polygon should have 3 or more vertices!");let t=new THREE.Plane;return t.setFromCoplanarPoints(e[0],e[1],e[2]),N0(e,t)}function N0(e,t){let r=Ni(t.normal,I0),n=B0.setFromEuler(r);return n.invert(),e instanceof Array?e.map(i=>(ut.copy(i),ut.applyQuaternion(n),new THREE.Vector2(ut.x,ut.z))):(ut.copy(e),ut.applyQuaternion(n),new THREE.Vector2(ut.x,ut.z))}function Io(e){let t=e.map(l=>l.V3_toThree()),r=Array.from(Array(t.length).keys()),n=[],i=P0(t),s=L0(i),o=100,a=0;for(;r.length>3&&a<=o;){for(let l=0;l=0)continue;let m=!1;for(let h=0;hg-h)),r.splice(l,1);break}}a++}return n.push(r.sort((l,u)=>u-l)),n}function Bo(e,t,r,n){let i=e.project(t);return i.x=(i.x+1)/2*r,i.y=-(i.y-1)/2*n,i}function Ro(){return Math.min(Project._texture_width,Project._texture_height)}function dn(e){return[e[0],e[1]]}function mn(e){let t=e.uv,r=[0,0,0],n=0;for(let i in t){let s=t[i];r.V3_add(s),n++}return r.V3_divide(n+1e-5),dn(r)}function Yt(e,t){return Object.defineProperty(e,t,{configurable:!1,writable:!1}),e}function Uo(e){return e.split(/[_\s]+/g).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Oo(e){for(let r=0;r0;if(t!==void 0&&u!==t)return!1;t=u}return!0}function vn(e,t){let r=[],n=[],i=new Set;for(let s in e.faces){let o=e.faces[s];if(o.vertices.length<2)continue;!o.vertices.some(u=>!t.has(u))&&r.push(s);let l=o.getSortedVertices();for(let u=0;uNumber.MIN_VALUE?(a.add(e),zo(a,r,e,a)):a.copy(e),o=a.distanceTo(r)}return o*.5*s}function H0(e,t,r){for(let n=0;nh.slice()),r=r.map(h=>h.slice());let c=Ho(t,r,e);jt(r,c);let f=r.map(h=>h.slice().reverse()).reverse(),q=Ho(t,f,e);jt(f,q),Vo(e,t,u?r:f)0&&g.negate();let x=V0(n,h,i,g)*l;p=h.clone(),p.setLength(x),p.add(n),d=g.clone(),d.setLength(x),d.add(i)}let m=[];jt(r,s);for(let h=0;ha.vertices[v[0]]))};let q=Ui(u,d=>d.centroid.length());u.remove(q);let p=[q];for(a.addVertices(p[0].centroid.toArray());u.length;){let d=p.last(),v=Ui(u,m=>m.centroid.distanceToSquared(d.centroid));p.push(v),u.remove(v)}for(let d=0;d{Go(!1,2,0,!0,!0,1,!1),Undo.amendEdit({num_cuts:{type:"number",label:"Number Of Cuts",min:1,value:1},twist:{type:"number",label:"Twist",value:0},blend_influence:{type:"range",label:"Smoothness",value:100,min:-200,max:200},blend_path:{type:"checkbox",label:"Blend Path",value:!0},cut_holes:{type:"checkbox",label:"Cut Holes",value:!0,condition:()=>BarItems.selection_mode.value=="face"}},e=>{Go(!0,e.num_cuts+1,e.twist,e.cut_holes,e.blend_path,e.blend_influence/100,e.reverse)})});function Vo(e,t,r){let n=0;for(let i=0;ii){jt(t,1);continue e}}o<=i&&(n=s,i=o),jt(t,1)}return n}var yu=P("expand_selection",()=>{Mesh.selected.forEach(e=>{let t=Me.VertexVertices(e),r=e.getSelectedVertices(),n=new Set(r);for(let i of r){let s=t[i];if(s)for(let o of s)n.add(o)}Kt(e,n)}),Canvas.updateView({elements:Mesh.selected,selection:!0})});function Wo(e=!1,t=1,r=1){Undo.initEdit({elements:Mesh.selected,selection:!0},e),Mesh.selected.forEach(n=>{if(!t||!r)return;let{vertices:i}=n,s=Me.VertexVertices(n),o=n.getSelectedVertices(),a={};for(let l=0;lMath.lerp(q,f[p],t))}}}),Undo.finishEdit("MTools: Laplacian Smooth selected vertices"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var Tu=P("laplacian_smooth",()=>{Wo(),Undo.amendEdit({influence:{type:"range",value:100,label:"Influence",min:0,max:100},iterations:{type:"range",value:1,label:"Iterations",min:1,max:10}},e=>Wo(!0,e.influence/100,e.iterations))});function Xo(e,t,r,n){Undo.initEdit({elements:e,selection:!0},r),e.forEach((i,s)=>{t[s].forEach(a=>{let l=i.faces[a],u=l.getNormal(!0).V3_multiply(n),c=i.addVertices(l.getCenter().V3_add(u))[0],f=l.getSortedVertices();for(let q=0;q{let e=Mesh.selected.slice(),t=e.map(r=>r.getSelectedFaces().slice());Xo(e,t,!1,0),Undo.amendEdit({depth:{type:"number",value:0,label:"Depth"}},r=>{Xo(e,t,!0,r.depth)})});var Mu=P("shrink_selection",()=>{Mesh.selected.forEach(e=>{let t=Me.VertexVertices(e),r=e.getSelectedVertices(),n=new Set(r);for(let i of r){let s=t[i];for(let o of s)if(!n.has(o)){n.delete(i);break}}Kt(e,n)}),Canvas.updateView({elements:Mesh.selected,selection:!0})});function jo(e,t=100){t/=100,Undo.initEdit({elements:Mesh.selected,selection:!0},e),Mesh.selected.forEach(r=>{let n=[0,0,0],i=r.getSelectedVertices(),s=[],o=[0,0,0];i.forEach(a=>{s.push(r.vertices[a]),n.V3_add(r.vertices[a])}),n.V3_divide(i.length);for(let a=0;a<3;a++)s.sort((l,u)=>l[a]-u[a]),o[a]=s.last()[a]-s[0][a];o.V3_divide(2),i.forEach(a=>{let l=r.vertices[a],u=l.V3_subtract(n).V3_toThree().normalize().toArray().V3_multiply(o).V3_add(n).V3_toThree(),c=l.V3_add(n).V3_toThree().lerp(u,t).toArray();r.vertices[a]=c})}),Undo.finishEdit("MTools: Spherize mesh selection"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var Iu=P("to_sphere",()=>{jo(!1,100),Undo.amendEdit({influence:{type:"range",value:100,label:"Influence",min:0,max:100}},e=>{jo(!0,e.influence)})});var Uu=P("triangulate",()=>{Undo.initEdit({elements:Mesh.selected,selection:!0}),Mesh.selected.forEach(e=>{e.getSelectedFaces().forEach(t=>{let r=e.faces[t],n=r.getSortedVertices();if(!(n.length<=3)){let i=Io(n.map(s=>e.vertices[s]),r.getNormal(!0));for(let s=0;s{let a=t[o];a.forEach(l=>{let u=s.faces[l];if(!u||u.vertices.length!=3)return;let c=u.getSortedVertices().slice(),f=u.getNormal(!0),q=[],p=[],d=[],v=[];for(let w=0;w<3;w++){let F=u.getAdjacentFace(w);if(!F)continue;let C=F.face,M=F.key,k=F.edge;if(C.vertices.length==3){if(p.length>1&&p.last()==p[w])break;a.includes(M)&&(p.push(C),q.push(k),d.push(M),v.push(w))}}let m=p.map(w=>u.getAngleTo(w)),h=wo(m);if(h==-1)return;let g=m[h],x=p[h],b=d[h],y=q[h];if(g>r)return;let _=x.getSortedVertices().slice(),T=c.find(w=>!_.includes(w));if(!T)return;_.splice(v[h]+1,0,T);let S=new MeshFace(s,{vertices:_}),E=S.getNormal(!0);if(Oo(S.getSortedVertices().map(w=>s.vertices[w]))){if(E.V3_toThree().dot(f.V3_toThree())<0&&S.invert(),n){for(let w of y)if(!(Math.roundTo(u.uv[w][0],5)==Math.roundTo(x.uv[w][0],5)&&Math.roundTo(u.uv[w][1],5)==Math.roundTo(x.uv[w][1],5)))return}S.uv=x.uv,u.uv[T]instanceof Array&&(S.uv[T]=u.uv[T]);for(let w of S.vertices)S.uv[w]??=[0,0];S.texture=u.texture,s.addFaces(S),delete s.faces[b],delete s.faces[l]}})}),Undo.finishEdit("MTools: Convert selected Triangles to Quads"),Canvas.updateView({elements:e,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var Pu=P("tris_to_quad",()=>{let e=Mesh.selected.slice(),t=e.map(r=>r.getSelectedFaces().slice());Yo(e,t,45,!0,!1),Undo.amendEdit({max_angle:{label:"Max Angle",value:45,min:0,max:180,type:"range"},ignore_disjoint_uvs:{label:"Ignore Disjoint UVs",value:!0,type:"checkbox"}},r=>Yo(e,t,r.max_angle,r.ignore_disjoint_uvs,!0))});var zu=P("uv_mapping");var xn=un.in("dont_show_again_info_storage");function yn(e,t,r){if(xn.has(e))return;let n=Blockbench.showMessageBox({title:t,message:r,icon:"info",checkboxes:{dont_show_again:{value:!1,text:"dialog.dontshowagain"}},buttons:["dialog.ok"]},(i,{dont_show_again:s})=>{s&&xn.set(e,!0)})}function Ko(e,t,r){return xn.has(e)?!0:new Promise(n=>{Blockbench.showMessageBox({title:t,message:r,icon:"warning",checkboxes:{dont_show_again:{value:!1,text:"dialog.dontshowagain"}},buttons:["dialog.ok","dialog.cancel"]},(i,{dont_show_again:s})=>{s&&xn.set(e,!0),n(i===0)})})}function bn(e,t=2e3){throw Blockbench.showQuickMessage(e,t),e}function Zo(e,t,r){let{width:n,height:i,camera:s}=e;Undo.initEdit({elements:Mesh.selected,selection:!0,uv_only:!0,uv_mode:!0},r);let o=t?i/n:Math.max(n,i)/Math.min(n,i);Mesh.selected.forEach(a=>{a.getSelectedFaces().forEach(l=>{let u=a.faces[l];u.vertices.forEach(c=>{let f=a.mesh.localToWorld(a.vertices[c].V3_toThree()),q=Bo(f,s,n,i);u.uv[c]=[q.x/n*Project.texture_width,q.y/i*Project.texture_height*o]})})}),Undo.finishEdit("MTools: Unwrap mesh face selection uv from view",{uv_only:!0,uv_mode:!0}),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0}),updateSelection()}var ju=P("uv_project_view",()=>{let e=Canvas.getHoveredPreview();Zo(e,!0,!1),yn("uv_project_view","Deprecation Notice","UV Project View is deprecated and will be removed from MTools. It's now built into Blockbench under
    UV > UV Project from View."),Undo.amendEdit({preserve_aspect:{type:"checkbox",value:!0,label:"Preserve Aspect"}},t=>Zo(e,t.preserve_aspect,!0))});function Qo(e,t,r){Undo.initEdit({elements:Mesh.selected,selection:!0,uv_only:!0,uv_mode:!0},r),Mesh.selected.forEach(n=>{if(n.getSelectedFaces().length){let i=[],s={min:[0,0,0],max:[0,0,0]},o={"1,0,0":[],"-1,0,0":[],"0,1,0":[],"0,-1,0":[],"0,0,1":[],"0,0,-1":[]};n.getSelectedFaces().forEach(c=>{let f=n.faces[c],q=f.getNormal(!0);f.vertices.forEach(g=>{i.push(n.vertices[g])});let p=q[0],d=q[1],v=q[2],m=[0,0,0],h=Math.max(Math.abs(q[0]),Math.abs(q[1]),Math.abs(q[2]));h==p*Math.sign(q[0])?m=[Math.sign(p),0,0]:h==d*Math.sign(q[1])?m=[0,Math.sign(d),0]:h==v*Math.sign(q[2])&&(m=[0,0,Math.sign(v)]),f.vertices.length>=3&&o[m.toString()].push(c)});for(let c=0;c<3;c++)i.sort((f,q)=>q[c]-f[c]),s.max[c]=i[0][c]+1e-4,s.min[c]=i.last()[c]-i[0][c]+1e-4;let a=0,l=Ro(),u=1-e/100;for(let c in o)a++,o[c].forEach(f=>{let q=n.faces[f],p=c.replace("-","").replaceAll(",","");p=p=="100"?[2,1]:p=="010"?[0,2]:[0,1],q.vertices.forEach(d=>{let v=[(s.max[p[0]]-n.vertices[d][p[0]]+1e-4)*u/-s.min[p[0]],(s.max[p[1]]-n.vertices[d][p[1]]+1e-4)*u/-s.min[p[1]]];t&&(v[0]*=.33,v[1]*=.33,v[0]-=1e-4,v[1]-=1e-4,v[0]+=a%3*.33,v[1]+=a>3?.33:0),v[0]*=l,v[1]*=l,n.faces[f].uv[d]=v})})}}),Undo.finishEdit("MTools: Unwrap mesh face selection (cubic projection)",{uv_only:!0,uv_mode:!0}),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0}),updateSelection()}var Zu=P("uv_turnaround_projection",()=>{Qo(.1,!0,!1),Undo.amendEdit({margin:{type:"number",value:0,label:"Margin",min:0,max:100},split:{type:"checkbox",label:"Split",value:!0}},e=>{Qo(e.margin,e.split,!0)})});var e9=P("tools");function Jo(e,t=[1,0,0],r=1,n=!1){t=t.V3_toThree();let i=[];Undo.initEdit({elements:i,selection:!0},n),e.forEach(s=>{let o=new THREE.Vector3;s.mesh.geometry.boundingBox.getSize(o);for(let a=0;a{let e=Mesh.selected;e.forEach(t=>{t.mesh.geometry.computeBoundingBox()}),Jo(e),Undo.amendEdit({x:{type:"number",value:1,label:"OffsetX",step:.1},y:{type:"number",value:0,label:"OffsetY",step:.1},z:{type:"number",value:0,label:"OffsetZ",step:.1},count:{type:"number",value:1,label:"Count",min:0,max:50}},t=>{Jo(e,[t.x,t.y,t.z],t.count,!0)})});var $o={"word.before":"Input","word.after":"Result","word.mesh":"Mesh","word.uv":"UV"};function i3(){return $o}function s3(e){return e.replace(/[a-zA-Z_][a-zA-Z0-9_\.]+/g,t=>i3($o)[t]??t)}var o3=e=>`https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/${e}?raw=true`;function a3({src:e,caption:t=""}){return`
    ${s3(t)}
    `}function l3(e){return`${e}`}function c3({items:e}){return`
    ${e.map(t=>`
    ${Gi(t)}
    `).join(` `)}
    `}function Gi(e){if(typeof e=="string")return e;switch(e.type){case"image":return a3(e);case"overflow":return l3(e);case"inset_row":return c3(e);default:throw new Error(`Unknown line type: ${e.type}`)}}var u3=new THREE.Euler,q3=new THREE.Vector3,f3=new THREE.Vector3,p3=new THREE.Vector3,h3=new THREE.Vector3,d3=new THREE.Vector3;function e1(e,t,{density:r=3,min_distance:n=0,scale:i=100,min_scale:s=100,scale_factor:o=50,rotation:a=0,rotation_factor:l=0},u=!1){let c=[];i/=100,s/=100,o/=100,l/=100;let f=n**2;Undo.initEdit({outliner:!0,elements:[],selection:!0},u);let q=e.mesh,p=q.geometry.getIndex(),d=q.geometry.getAttribute("position"),v=p.count,m=[];for(let g=0;gI.distanceToSquared(E){g.addTo(h)}),h.init(),Undo.finishEdit("MTools: Scatter meshes",{outliner:!0,elements:c,selection:!0}),Canvas.updateAll()}var c9=P("scatter",function(){if(Mesh.selected.length<2){Blockbench.showQuickMessage("At least two meshes must be selected");return}yn("scatter_pivot","Good To Know",["Scattered meshes are relative to their pivot points on the target surface.",Gi({type:"inset_row",items:[{type:"image",src:"scatter_pivot_1.png",caption:"Pivot point located on the bottom"},{type:"image",src:"scatter_pivot_2.png",caption:"Pivot point located far down"}]})].join(` `));let e=Mesh.selected.last();e.unselect();let t=Mesh.selected.slice();e1(e,t,{}),Undo.amendEdit({density:{type:"number",value:3,label:"Max Density",min:0,max:256},min_distance:{type:"number",value:0,label:"Min Distance",min:0},scale:{type:"range",value:100,label:"Scale",min:0,max:100},min_scale:{type:"range",value:100,label:"Min Scale",min:0,max:100},scale_factor:{type:"range",value:50,label:"Scale Randomness",min:0,max:100},rotation:{type:"range",value:0,label:"Max Rotation",min:0,max:180},rotation_factor:{type:"range",value:0,label:"Rotation Randomness",min:0,max:100}},r=>{e1(e,t,r,!0)})});var ke=class e{static all=[];constructor(t,r){this.key=r,this.bbFace=t,this.facePoint=t.getCenter(),this.uuid=guid(),this.facePointKey=t.mesh.addVertices(this.facePoint)[0],this.edgePoints=[],this.vertices=[],e.all.push(this)}for(t){return this.bbFace.vertices.includes(t)}},Ve=class e{static all=[];constructor(t,r,n,i){this.vertexA=t,this.vertexB=r,this.uuid=guid(),this.center=i,this.edgePoint=n,e.all.push(this)}equals(t){return t.vertexA==this.vertexA&&t.vertexB==this.vertexB||t.vertexA==this.vertexB&&t.vertexB==this.vertexA}equalsV(t,r){return t==this.vertexA&&r==this.vertexB||t==this.vertexB&&r==this.vertexA}equalsU(t){return this.uuid==t.uuid}for(t){return this.vertexA==t||this.vertexB==t}},qt=class e{static all=[];static reset(){e.all=[]}constructor(t,r,n){this.vertexA=t,this.vertexB=r,this.faces=[],this.indices=n.indices,this.center=n?n.center:null,e.all.push(this)}equals(t){return t.vertexA==this.vertexA&&t.vertexB==this.vertexB||t.vertexA==this.vertexB&&t.vertexB==this.vertexA}equalsV(t,r){return t==this.vertexA&&r==this.vertexB||t==this.vertexB&&r==this.vertexA}};function t1(e=30,t=!1){e=Math.degToRad(e),Undo.initEdit({elements:Mesh.selected,selection:!0},t),Mesh.selected.forEach(r=>{qt.reset();let n=r.faces;for(let s in n){let o=n[s],a=o.getSortedVertices(),l=a.length;if(!(l<=2))for(let u=0;um.equalsV(c,f));if(p){if(p.faces.length>=2)throw Blockbench.showQuickMessage("Error: non-manifold meshes are not allowed",2e3),new Error("non-manifold meshes are not allowed");p.faces.push(o);continue}let d=[];d[0]=o.vertices.findIndex(m=>m==c),d[1]=o.vertices.findIndex(m=>m==f);let v=new qt(c,f,{center:q,indices:d});v.faces=[o]}}let i=qt.all.length;for(let s=0;s{t1(180),Undo.amendEdit({angle:{label:"Angle",type:"range",value:180,min:0,max:180}},e=>{t1(e.angle,!0)})});var v9=P("subdivide",()=>{Undo.initEdit({elements:Mesh.selected,selection:!0}),Mesh.selected.forEach(e=>{Ve.all=[],ke.all=[];let t=Object.keys(e.vertices),{faces:r}=e;for(let o in r){let a=r[o],l=a.getSortedVertices(),u=l.length;if(u<3)continue;let c=new ke(a,o);c.vertices=l;for(let f=0;fm.equalsV(q,p))??new Ve(q,p,null,d);c.edgePoints.push(v)}}let n=Ve.all.length;for(let o=0;oa.equalsU(p))&&(l.V3_add(q.facePoint),c++)}c<2?a.edgePoint=a.center:(a.edgePoint=l.V3_divide(c),a.edgePoint.V3_add(a.center).V3_divide(2)),a.edgePointKey=e.addVertices(a.edgePoint)[0]}let i=t.length;for(let o=0;o_.equalsV(q,p)).edgePointKey,h=q,g=a.edgePoints.find(_=>_.equalsV(q,d)).edgePointKey,x=new MeshFace(e,l).extend({vertices:[g,h,m,v]});x.uv[a.facePointKey]=mn(l);let b=[0,0,0].V3_add(l.uv[q]).V3_add(l.uv[p]);b.V3_divide(2);let y=[0,0,0].V3_add(l.uv[q]).V3_add(l.uv[d]);y.V3_divide(2),x.uv[m]=dn(b),x.uv[g]=dn(y),e.addFaces(x)}delete e.faces[a.key]}}),Undo.finishEdit("MTools: Subdivide selected meshes"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})});var Sn=new THREE.Vector3;Object.assign(THREE.Triangle,{getInterpolation(e,t,r,n,i,s,o,a){return THREE.Triangle.getBarycoord(e,t,r,n,Sn)===null?(a.x=0,a.y=0,"z"in a&&(a.z=0),"w"in a&&(a.w=0),null):(a.setScalar(0),a.addScaledVector(i,Sn.x),a.addScaledVector(s,Sn.y),a.addScaledVector(o,Sn.z),a)}});var{BufferAttribute:Qe,BufferGeometry:x3,Matrix3:r1,Matrix4:qe,Mesh:Vi,Vector3:B,ACESFilmicToneMapping:I9,AddEquation:B9,AddOperation:R9,AdditiveAnimationBlendMode:U9,AdditiveBlending:O9,AlphaFormat:D9,AlwaysDepth:L9,AlwaysStencilFunc:P9,AmbientLight:N9,AmbientLightProbe:z9,AnimationClip:G9,AnimationLoader:V9,AnimationMixer:H9,AnimationObjectGroup:W9,AnimationUtils:X9,ArcCurve:j9,ArrayCamera:Y9,ArrowHelper:K9,Audio:Z9,AudioAnalyser:Q9,AudioContext:J9,AudioListener:$9,AudioLoader:e8,AxesHelper:t8,BackSide:n1,BasicDepthPacking:r8,BasicShadowMap:n8,Bone:i8,BooleanKeyframeTrack:s8,Box2:o8,Box3:xe,Box3Helper:a8,BoxGeometry:l8,BoxHelper:c8,BufferGeometryLoader:u8,ByteType:q8,Cache:f8,Camera:p8,CameraHelper:h8,CanvasTexture:d8,CatmullRomCurve3:m8,CineonToneMapping:v8,CircleGeometry:g8,ClampToEdgeWrapping:x8,Clock:y8,Color:y3,ColorKeyframeTrack:b8,CompressedTexture:S8,CompressedTextureLoader:T8,ConeGeometry:_8,CubeCamera:w8,CubeReflectionMapping:E8,CubeRefractionMapping:A8,CubeTexture:C8,CubeTextureLoader:F8,CubeUVReflectionMapping:M8,CubicBezierCurve:k8,CubicBezierCurve3:I8,CubicInterpolant:B8,CullFaceBack:R8,CullFaceFront:U8,CullFaceFrontBack:O8,CullFaceNone:D8,Curve:L8,CurvePath:P8,CustomBlending:N8,CylinderGeometry:z8,Cylindrical:G8,DataTexture:b3,DataTextureLoader:V8,DataUtils:H8,DecrementStencilOp:W8,DecrementWrapStencilOp:X8,DefaultLoadingManager:j8,DepthFormat:Y8,DepthStencilFormat:K8,DepthTexture:Z8,DirectionalLight:Q8,DirectionalLightHelper:J8,DiscreteInterpolant:$8,DodecahedronGeometry:eq,DoubleSide:kr,DstAlphaFactor:tq,DstColorFactor:rq,DynamicCopyUsage:nq,DynamicDrawUsage:iq,DynamicReadUsage:sq,EdgesGeometry:oq,EllipseCurve:aq,EqualDepth:lq,EqualStencilFunc:cq,EquirectangularReflectionMapping:uq,EquirectangularRefractionMapping:qq,Euler:fq,EventDispatcher:pq,ExtrudeGeometry:hq,FileLoader:dq,Float16BufferAttribute:mq,Float32BufferAttribute:vq,Float64BufferAttribute:gq,FloatType:S3,Fog:xq,FogExp2:yq,FrontSide:Wi,Frustum:T3,GLBufferAttribute:bq,GLSL1:Sq,GLSL3:Tq,GreaterDepth:_q,GreaterEqualDepth:wq,GreaterEqualStencilFunc:Eq,GreaterStencilFunc:Aq,GridHelper:Cq,Group:Fq,HalfFloatType:Mq,HemisphereLight:kq,HemisphereLightHelper:Iq,HemisphereLightProbe:Bq,IcosahedronGeometry:Rq,ImageBitmapLoader:Uq,ImageLoader:Oq,ImageUtils:Dq,IncrementStencilOp:Lq,IncrementWrapStencilOp:Pq,InstancedBufferAttribute:Nq,InstancedBufferGeometry:zq,InstancedInterleavedBuffer:Gq,InstancedMesh:Vq,Int16BufferAttribute:Hq,Int32BufferAttribute:Wq,Int8BufferAttribute:Xq,IntType:jq,InterleavedBuffer:Yq,InterleavedBufferAttribute:Kq,Interpolant:Zq,InterpolateDiscrete:Qq,InterpolateLinear:Jq,InterpolateSmooth:$q,InvertStencilOp:ef,KeepStencilOp:tf,KeyframeTrack:rf,LOD:nf,LatheGeometry:sf,Layers:of,LessDepth:af,LessEqualDepth:lf,LessEqualStencilFunc:cf,LessStencilFunc:uf,Light:qf,LightProbe:ff,Line:pf,Line3:ge,LineBasicMaterial:hf,LineCurve:df,LineCurve3:mf,LineDashedMaterial:vf,LineLoop:gf,LineSegments:xf,LinearEncoding:yf,LinearFilter:bf,LinearInterpolant:Sf,LinearMipMapLinearFilter:Tf,LinearMipMapNearestFilter:_f,LinearMipmapLinearFilter:wf,LinearMipmapNearestFilter:Ef,LinearToneMapping:Af,Loader:Cf,LoaderUtils:Ff,LoadingManager:Mf,LoopOnce:kf,LoopPingPong:If,LoopRepeat:Bf,LuminanceAlphaFormat:Rf,LuminanceFormat:Uf,MOUSE:Of,Material:Df,MaterialLoader:Lf,MathUtils:Pf,MaxEquation:Nf,MeshBasicMaterial:zf,MeshDepthMaterial:Gf,MeshDistanceMaterial:Vf,MeshLambertMaterial:Hf,MeshMatcapMaterial:Wf,MeshNormalMaterial:Xf,MeshPhongMaterial:jf,MeshPhysicalMaterial:Yf,MeshStandardMaterial:Kf,MeshToonMaterial:Zf,MinEquation:Qf,MirroredRepeatWrapping:Jf,MixOperation:$f,MultiplyBlending:ep,MultiplyOperation:tp,NearestFilter:rp,NearestMipMapLinearFilter:np,NearestMipMapNearestFilter:ip,NearestMipmapLinearFilter:sp,NearestMipmapNearestFilter:op,NeverDepth:ap,NeverStencilFunc:lp,NoBlending:cp,NoToneMapping:up,NormalAnimationBlendMode:qp,NormalBlending:fp,NotEqualDepth:pp,NotEqualStencilFunc:hp,NumberKeyframeTrack:dp,Object3D:mp,ObjectLoader:vp,ObjectSpaceNormalMap:gp,OctahedronGeometry:xp,OneFactor:yp,OneMinusDstAlphaFactor:bp,OneMinusDstColorFactor:Sp,OneMinusSrcAlphaFactor:Tp,OneMinusSrcColorFactor:_p,OrthographicCamera:wp,PCFShadowMap:Ep,PCFSoftShadowMap:Ap,PMREMGenerator:Cp,Path:Fp,PerspectiveCamera:Mp,Plane:Zt,PlaneGeometry:kp,PlaneHelper:Ip,PointLight:Bp,PointLightHelper:Rp,Points:Up,PointsMaterial:Op,PolarGridHelper:Dp,PolyhedronGeometry:Lp,PositionalAudio:Pp,PropertyBinding:Np,PropertyMixer:zp,QuadraticBezierCurve:Gp,QuadraticBezierCurve3:Vp,Quaternion:Hp,QuaternionKeyframeTrack:Wp,QuaternionLinearInterpolant:Xp,REVISION:i1,RGBADepthPacking:jp,RGBAFormat:_3,RGBAIntegerFormat:Yp,RGBA_ASTC_10x10_Format:Kp,RGBA_ASTC_10x5_Format:Zp,RGBA_ASTC_10x6_Format:Qp,RGBA_ASTC_10x8_Format:Jp,RGBA_ASTC_12x10_Format:$p,RGBA_ASTC_12x12_Format:eh,RGBA_ASTC_4x4_Format:th,RGBA_ASTC_5x4_Format:rh,RGBA_ASTC_5x5_Format:nh,RGBA_ASTC_6x5_Format:ih,RGBA_ASTC_6x6_Format:sh,RGBA_ASTC_8x5_Format:oh,RGBA_ASTC_8x6_Format:ah,RGBA_ASTC_8x8_Format:lh,RGBA_BPTC_Format:ch,RGBA_ETC2_EAC_Format:uh,RGBA_PVRTC_2BPPV1_Format:qh,RGBA_PVRTC_4BPPV1_Format:fh,RGBA_S3TC_DXT1_Format:ph,RGBA_S3TC_DXT3_Format:hh,RGBA_S3TC_DXT5_Format:dh,RGB_ETC1_Format:mh,RGB_ETC2_Format:vh,RGB_PVRTC_2BPPV1_Format:gh,RGB_PVRTC_4BPPV1_Format:xh,RGB_S3TC_DXT1_Format:yh,RGFormat:bh,RGIntegerFormat:Sh,RawShaderMaterial:Th,Ray:Tn,Raycaster:_h,RectAreaLight:wh,RedFormat:Eh,RedIntegerFormat:w3,ReinhardToneMapping:Ah,RepeatWrapping:Ch,ReplaceStencilOp:Fh,ReverseSubtractEquation:Mh,RingGeometry:kh,Scene:Ih,ShaderChunk:Bh,ShaderLib:Rh,ShaderMaterial:Uh,ShadowMaterial:Oh,Shape:Dh,ShapeGeometry:Lh,ShapePath:Ph,ShapeUtils:Nh,ShortType:zh,Skeleton:Gh,SkeletonHelper:Vh,SkinnedMesh:Hh,Sphere:Hi,SphereGeometry:Wh,Spherical:Xh,SphericalHarmonics3:jh,SplineCurve:Yh,SpotLight:Kh,SpotLightHelper:Zh,Sprite:Qh,SpriteMaterial:Jh,SrcAlphaFactor:$h,SrcAlphaSaturateFactor:ed,SrcColorFactor:td,StaticCopyUsage:rd,StaticDrawUsage:nd,StaticReadUsage:id,StereoCamera:sd,StreamCopyUsage:od,StreamDrawUsage:ad,StreamReadUsage:ld,StringKeyframeTrack:cd,SubtractEquation:ud,SubtractiveBlending:qd,TOUCH:fd,TangentSpaceNormalMap:pd,TetrahedronGeometry:hd,Texture:dd,TextureLoader:md,TorusGeometry:vd,TorusKnotGeometry:gd,Triangle:oe,TriangleFanDrawMode:xd,TriangleStripDrawMode:yd,TrianglesDrawMode:bd,TubeGeometry:Sd,UVMapping:Td,Uint16BufferAttribute:_d,Uint32BufferAttribute:wd,Uint8BufferAttribute:Ed,Uint8ClampedBufferAttribute:Ad,Uniform:Cd,UniformsLib:Fd,UniformsUtils:Md,UnsignedByteType:kd,UnsignedInt248Type:Id,UnsignedIntType:E3,UnsignedShort4444Type:Bd,UnsignedShort5551Type:Rd,UnsignedShortType:Ud,VSMShadowMap:Od,Vector2:Ie,Vector4:Je,VectorKeyframeTrack:Dd,VideoTexture:Ld,WebGL1Renderer:Pd,WebGLCubeRenderTarget:Nd,WebGLMultipleRenderTargets:zd,WebGLRenderTarget:Gd,WebGLRenderer:Vd,WireframeGeometry:Hd,ZeroCurvatureEnding:Wd,ZeroFactor:Xd,ZeroSlopeEnding:jd,ZeroStencilOp:Yd,sRGBEncoding:Kd}=window.THREE;var s1=Math.pow(2,-24),_n=Symbol("SKIP_GENERATION");function A3(e){return e.index?e.index.count:e.attributes.position.count}function He(e){return A3(e)/3}function C3(e,t=ArrayBuffer){return e>65535?new Uint32Array(new t(4*e)):new Uint16Array(new t(2*e))}function o1(e,t){if(!e.index){let r=e.attributes.position.count,n=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=C3(r,n);e.setIndex(new Qe(i,1));for(let s=0;sl-u);for(let l=0;lo.offset-a.offset),i=n[n.length-1];i.count=Math.min(r-i.offset,i.count);let s=0;return n.forEach(({count:o})=>s+=o),r!==s}function wn(e,t,r,n,i){let s=1/0,o=1/0,a=1/0,l=-1/0,u=-1/0,c=-1/0,f=1/0,q=1/0,p=1/0,d=-1/0,v=-1/0,m=-1/0;for(let h=t*6,g=(t+r)*6;hl&&(l=_),xd&&(d=x);let T=e[h+2],S=e[h+3],E=T-S,w=T+S;Eu&&(u=w),Tv&&(v=T);let F=e[h+4],C=e[h+5],M=F-C,k=F+C;Mc&&(c=k),Fm&&(m=F)}n[0]=s,n[1]=o,n[2]=a,n[3]=l,n[4]=u,n[5]=c,i[0]=f,i[1]=q,i[2]=p,i[3]=d,i[4]=v,i[5]=m}function l1(e,t=null,r=null,n=null){let i=e.attributes.position,s=e.index?e.index.array:null,o=He(e),a=i.normalized,l;t===null?(l=new Float32Array(o*6),r=0,n=o):(l=t,r=r||0,n=n||o);let u=i.array,c=i.offset||0,f=3;i.isInterleavedBufferAttribute&&(f=i.data.stride);let q=["getX","getY","getZ"];for(let p=r;pS&&(S=y),_>S&&(S=_);let E=(S-T)/2,w=x*2;l[v+w+0]=T+E,l[v+w+1]=E+(Math.abs(T)+E)*s1}}return l}function Z(e,t,r){return r.min.x=t[e],r.min.y=t[e+1],r.min.z=t[e+2],r.max.x=t[e+3],r.max.y=t[e+4],r.max.z=t[e+5],r}function Yi(e){let t=-1,r=-1/0;for(let n=0;n<3;n++){let i=e[n+3]-e[n];i>r&&(r=i,t=n)}return t}function Ki(e,t){t.set(e)}function Zi(e,t,r){let n,i;for(let s=0;s<3;s++){let o=s+3;n=e[s],i=t[s],r[s]=ni?n:i}}function Ir(e,t,r){for(let n=0;n<3;n++){let i=t[e+2*n],s=t[e+2*n+1],o=i-s,a=i+s;or[n+3]&&(r[n+3]=a)}}function Qt(e){let t=e[3]-e[0],r=e[4]-e[1],n=e[5]-e[2];return 2*(t*r+r*n+n*t)}var $e=32,M3=(e,t)=>e.candidate-t.candidate,ft=new Array($e).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),En=new Float32Array(6);function q1(e,t,r,n,i,s){let o=-1,a=0;if(s===0)o=Yi(t),o!==-1&&(a=(t[o]+t[o+3])/2);else if(s===1)o=Yi(e),o!==-1&&(a=k3(r,n,i,o));else if(s===2){let l=Qt(e),u=1.25*i,c=n*6,f=(n+i)*6;for(let q=0;q<3;q++){let p=t[q],m=(t[q+3]-p)/$e;if(i<$e/4){let h=[...ft];h.length=i;let g=0;for(let b=c;b=T.candidate?Ir(b,r,T.rightCacheBounds):(Ir(b,r,T.leftCacheBounds),T.count++)}}for(let b=0;b=$e&&(_=$e-1);let T=ft[_];T.count++,Ir(x,r,T.bounds)}let h=ft[$e-1];Ki(h.bounds,h.rightCacheBounds);for(let x=$e-2;x>=0;x--){let b=ft[x],y=ft[x+1];Zi(b.bounds,y.rightCacheBounds,b.rightCacheBounds)}let g=0;for(let x=0;x<$e-1;x++){let b=ft[x],y=b.count,_=b.bounds,S=ft[x+1].rightCacheBounds;y!==0&&(g===0?Ki(_,En):Zi(_,En,En)),g+=y;let E=0,w=0;g!==0&&(E=Qt(En)/l);let F=i-g;F!==0&&(w=Qt(S)/l);let C=1+1.25*(E*g+w*F);C=l;)a--;if(o=l;)a--;if(oI3)throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return Br[r+6]=u/4,u=Qi(u,a),Br[r+7]=l,u}}function B3(e,t){let r=(e.index?e.index.count:e.attributes.position.count)/3,n=r>2**16,i=n?4:2,s=t?new SharedArrayBuffer(r*i):new ArrayBuffer(r*i),o=n?new Uint32Array(s):new Uint16Array(s);for(let a=0,l=o.length;a=s&&(h=!0,o&&(console.warn(`MeshBVH: Max depth of ${s} reached when generating BVH. Consider increasing maxDepth.`),console.warn(q))),T<=a||E>=s)return x(_+T),y.offset=_,y.count=T,y;let w=q1(y.boundingData,S,t,_,T,l);if(w.axis===-1)return x(_+T),y.offset=_,y.count=T,y;let F=d(f,p,t,_,T,w);if(F===_||F===_+T)x(_+T),y.offset=_,y.count=T;else{y.splitAxis=w.axis;let C=new Jt,M=_,k=F-_;y.left=C,wn(t,M,k,C.boundingData,m),b(C,M,k,m,E+1);let I=new Jt,L=F,V=T-k;y.right=I,wn(t,L,V,I.boundingData,m),b(I,L,V,m,E+1)}return y}}function v1(e,t){let r=e.geometry;t.indirect&&(e._indirectBuffer=B3(r,t.useSharedArrayBuffer),a1(r,t.range)&&!t.verbose&&console.warn('MeshBVH: Provided geometry contains groups or a range that do not fully span the vertex contents while using the "indirect" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),e._indirectBuffer||o1(r,t);let n=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=l1(r),s=t.indirect?Xi(r,t.range):ji(r,t.range);e._roots=s.map(o=>{let a=R3(e,i,o.offset,o.count,t),l=Fn(a),u=new n(32*l);return m1(0,a,u),u})}var Se=class{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(t,r){let n=1/0,i=-1/0;for(let s=0,o=t.length;si?l:i}this.min=n,this.max=i}setFromPoints(t,r){let n=1/0,i=-1/0;for(let s=0,o=r.length;si?l:i}this.min=n,this.max=i}isSeparated(t){return this.min>t.max||t.min>this.max}};Se.prototype.setFromBox=function(){let e=new B;return function(r,n){let i=n.min,s=n.max,o=1/0,a=-1/0;for(let l=0;l<=1;l++)for(let u=0;u<=1;u++)for(let c=0;c<=1;c++){e.x=i.x*l+s.x*(1-l),e.y=i.y*u+s.y*(1-u),e.z=i.z*c+s.z*(1-c);let f=r.dot(e);o=Math.min(f,o),a=Math.max(f,a)}this.min=o,this.max=a}}();var _m=function(){let e=new Se;return function(r,n){let i=r.points,s=r.satAxes,o=r.satBounds,a=n.points,l=n.satAxes,u=n.satBounds;for(let c=0;c<3;c++){let f=o[c],q=s[c];if(e.setFromPoints(q,a),f.isSeparated(e))return!1}for(let c=0;c<3;c++){let f=u[c],q=l[c];if(e.setFromPoints(q,i),f.isSeparated(e))return!1}}}();var U3=function(){let e=new B,t=new B,r=new B;return function(i,s,o){let a=i.start,l=e,u=s.start,c=t;r.subVectors(a,u),e.subVectors(i.end,i.start),t.subVectors(s.end,s.start);let f=r.dot(c),q=c.dot(l),p=c.dot(c),d=r.dot(l),m=l.dot(l)*p-q*q,h,g;m!==0?h=(f*q-d*p)/m:h=0,g=(f+h*q)/p,o.x=h,o.y=g}}(),Ur=function(){let e=new Ie,t=new B,r=new B;return function(i,s,o,a){U3(i,s,e);let l=e.x,u=e.y;if(l>=0&&l<=1&&u>=0&&u<=1){i.at(l,o),s.at(u,a);return}else if(l>=0&&l<=1){u<0?s.at(0,a):s.at(1,a),i.closestPointToPoint(a,!0,o);return}else if(u>=0&&u<=1){l<0?i.at(0,o):i.at(1,o),s.closestPointToPoint(o,!0,a);return}else{let c;l<0?c=i.start:c=i.end;let f;u<0?f=s.start:f=s.end;let q=t,p=r;if(i.closestPointToPoint(f,!0,t),s.closestPointToPoint(c,!0,r),q.distanceToSquared(f)<=p.distanceToSquared(c)){o.copy(q),a.copy(f);return}else{o.copy(c),a.copy(p);return}}}}(),g1=function(){let e=new B,t=new B,r=new Zt,n=new ge;return function(s,o){let{radius:a,center:l}=s,{a:u,b:c,c:f}=o;if(n.start=u,n.end=c,n.closestPointToPoint(l,!0,e).distanceTo(l)<=a||(n.start=u,n.end=f,n.closestPointToPoint(l,!0,e).distanceTo(l)<=a)||(n.start=c,n.end=f,n.closestPointToPoint(l,!0,e).distanceTo(l)<=a))return!0;let v=o.getPlane(r);if(Math.abs(v.distanceToPoint(l))<=a){let h=v.projectPoint(l,t);if(o.containsPoint(h))return!0}return!1}}();var O3=1e-15;function Ji(e){return Math.abs(e)new B),this.satBounds=new Array(4).fill().map(()=>new Se),this.points=[this.a,this.b,this.c],this.sphere=new Hi,this.plane=new Zt,this.needsUpdate=!0}intersectsSphere(t){return g1(t,this)}update(){let t=this.a,r=this.b,n=this.c,i=this.points,s=this.satAxes,o=this.satBounds,a=s[0],l=o[0];this.getNormal(a),l.setFromPoints(a,i);let u=s[1],c=o[1];u.subVectors(t,r),c.setFromPoints(u,i);let f=s[2],q=o[2];f.subVectors(r,n),q.setFromPoints(f,i);let p=s[3],d=o[3];p.subVectors(n,t),d.setFromPoints(p,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(a,t),this.needsUpdate=!1}};he.prototype.closestPointToSegment=function(){let e=new B,t=new B,r=new ge;return function(i,s=null,o=null){let{start:a,end:l}=i,u=this.points,c,f=1/0;for(let q=0;q<3;q++){let p=(q+1)%3;r.start.copy(u[q]),r.end.copy(u[p]),Ur(r,i,e,t),c=e.distanceToSquared(t),c=2){(b===1?h.start:h.end).copy(p),x=2;break}if(x++,x===2&&b===-1)break}}return x}return function(m,h=null,g=!1){this.needsUpdate&&this.update(),m.isExtendedTriangle?m.needsUpdate&&m.update():(e.copy(m),e.update(),m=e);let x=this.plane,b=m.plane;if(Math.abs(x.normal.dot(b.normal))>1-1e-10){let y=this.satBounds,_=this.satAxes;r[0]=m.a,r[1]=m.b,r[2]=m.c;for(let E=0;E<4;E++){let w=y[E],F=_[E];if(n.setFromPoints(F,r),w.isSeparated(n))return!1}let T=m.satBounds,S=m.satAxes;t[0]=this.a,t[1]=this.b,t[2]=this.c;for(let E=0;E<4;E++){let w=T[E],F=S[E];if(n.setFromPoints(F,t),w.isSeparated(n))return!1}for(let E=0;E<4;E++){let w=_[E];for(let F=0;F<4;F++){let C=S[F];if(s.crossVectors(w,C),n.setFromPoints(s,t),i.setFromPoints(s,r),n.isSeparated(i))return!1}}return h&&(g||console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),h.start.set(0,0,0),h.end.set(0,0,0)),!0}else{let y=d(this,b,f);if(y===1&&m.containsPoint(f.end))return h&&(h.start.copy(f.end),h.end.copy(f.end)),!0;if(y!==2)return!1;let _=d(m,x,q);if(_===1&&this.containsPoint(q.end))return h&&(h.start.copy(q.end),h.end.copy(q.end)),!0;if(_!==2)return!1;if(f.delta(a),q.delta(l),a.dot(l)<0){let M=q.start;q.start=q.end,q.end=M}let T=f.start.dot(a),S=f.end.dot(a),E=q.start.dot(a),w=q.end.dot(a),F=S0?h.start.copy(f.start):h.start.copy(q.start),u.subVectors(f.end,q.end),u.dot(a)<0?h.end.copy(f.end):h.end.copy(q.end)),!0)}}}();he.prototype.distanceToPoint=function(){let e=new B;return function(r){return this.closestPointToPoint(r,e),r.distanceTo(e)}}();he.prototype.distanceToTriangle=function(){let e=new B,t=new B,r=["a","b","c"],n=new ge,i=new ge;return function(o,a=null,l=null){let u=a||l?n:null;if(this.intersectsTriangle(o,u))return(a||l)&&(a&&u.getCenter(a),l&&u.getCenter(l)),0;let c=1/0;for(let f=0;f<3;f++){let q,p=r[f],d=o[p];this.closestPointToPoint(d,e),q=d.distanceToSquared(e),qnew B),this.satAxes=new Array(3).fill().map(()=>new B),this.satBounds=new Array(3).fill().map(()=>new Se),this.alignedSatBounds=new Array(3).fill().map(()=>new Se),this.needsUpdate=!1,t&&this.min.copy(t),r&&this.max.copy(r),n&&this.matrix.copy(n)}set(t,r,n){this.min.copy(t),this.max.copy(r),this.matrix.copy(n),this.needsUpdate=!0}copy(t){this.min.copy(t.min),this.max.copy(t.max),this.matrix.copy(t.matrix),this.needsUpdate=!0}};ne.prototype.update=function(){return function(){let t=this.matrix,r=this.min,n=this.max,i=this.points;for(let u=0;u<=1;u++)for(let c=0;c<=1;c++)for(let f=0;f<=1;f++){let q=1*u|2*c|4*f,p=i[q];p.x=u?n.x:r.x,p.y=c?n.y:r.y,p.z=f?n.z:r.z,p.applyMatrix4(t)}let s=this.satBounds,o=this.satAxes,a=i[0];for(let u=0;u<3;u++){let c=o[u],f=s[u],q=1<new ge),r=new Array(12).fill().map(()=>new ge),n=new B,i=new B;return function(o,a=0,l=null,u=null){if(this.needsUpdate&&this.update(),this.intersectsBox(o))return(l||u)&&(o.getCenter(i),this.closestPointToPoint(i,n),o.closestPointToPoint(n,i),l&&l.copy(n),u&&u.copy(i)),0;let c=a*a,f=o.min,q=o.max,p=this.points,d=1/0;for(let m=0;m<8;m++){let h=p[m];i.copy(h).clamp(f,q);let g=h.distanceToSquared(i);if(gnew he)}},ye=new $i;var es=class{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;let t=[],r=null;this.setBuffer=n=>{r&&t.push(r),r=n,this.float32Array=new Float32Array(n),this.uint16Array=new Uint16Array(n),this.uint32Array=new Uint32Array(n)},this.clearBuffer=()=>{r=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,t.length!==0&&this.setBuffer(t.pop())}}},W=new es;var ht,er,$t=[],kn=new pt(()=>new xe);function x1(e,t,r,n,i,s){ht=kn.getPrimitive(),er=kn.getPrimitive(),$t.push(ht,er),W.setBuffer(e._roots[t]);let o=ts(0,e.geometry,r,n,i,s);W.clearBuffer(),kn.releasePrimitive(ht),kn.releasePrimitive(er),$t.pop(),$t.pop();let a=$t.length;return a>0&&(er=$t[a-1],ht=$t[a-2]),o}function ts(e,t,r,n,i=null,s=0,o=0){let{float32Array:a,uint16Array:l,uint32Array:u}=W,c=e*2;if(re(c,l)){let q=ae(e,u),p=fe(c,l);return Z(e,a,ht),n(q,p,!1,o,s+e,ht)}else{let w=function(C){let{uint16Array:M,uint32Array:k}=W,I=C*2;for(;!re(I,M);)C=de(C),I=C*2;return ae(C,k)},F=function(C){let{uint16Array:M,uint32Array:k}=W,I=C*2;for(;!re(I,M);)C=me(C,k),I=C*2;return ae(C,k)+fe(I,M)},q=de(e),p=me(e,u),d=q,v=p,m,h,g,x;if(i&&(g=ht,x=er,Z(d,a,g),Z(v,a,x),m=i(g),h=i(x),h(Or.copy(t).clamp(c.min,c.max),Or.distanceToSquared(t)),intersectsBounds:(c,f,q)=>q{c.closestPointToPoint(t,Or);let q=t.distanceToSquared(Or);return q=169,Ft=new B,Mt=new B,kt=new B,In=new Ie,Bn=new Ie,Rn=new Ie,b1=new B,S1=new B,T1=new B,Dr=new B;function P3(e,t,r,n,i,s,o,a){let l;if(s===n1?l=e.intersectTriangle(n,r,t,!0,i):l=e.intersectTriangle(t,r,n,s!==kr,i),l===null)return null;let u=e.origin.distanceTo(i);return ua?null:{distance:u,point:i.clone()}}function N3(e,t,r,n,i,s,o,a,l,u,c){Ft.fromBufferAttribute(t,s),Mt.fromBufferAttribute(t,o),kt.fromBufferAttribute(t,a);let f=P3(e,Ft,Mt,kt,Dr,l,u,c);if(f){let q=new B;oe.getBarycoord(Dr,Ft,Mt,kt,q),n&&(In.fromBufferAttribute(n,s),Bn.fromBufferAttribute(n,o),Rn.fromBufferAttribute(n,a),f.uv=oe.getInterpolation(Dr,Ft,Mt,kt,In,Bn,Rn,new Ie)),i&&(In.fromBufferAttribute(i,s),Bn.fromBufferAttribute(i,o),Rn.fromBufferAttribute(i,a),f.uv1=oe.getInterpolation(Dr,Ft,Mt,kt,In,Bn,Rn,new Ie)),r&&(b1.fromBufferAttribute(r,s),S1.fromBufferAttribute(r,o),T1.fromBufferAttribute(r,a),f.normal=oe.getInterpolation(Dr,Ft,Mt,kt,b1,S1,T1,new B),f.normal.dot(e.direction)>0&&f.normal.multiplyScalar(-1));let p={a:s,b:o,c:a,normal:new B,materialIndex:0};oe.getNormal(Ft,Mt,kt,p.normal),f.face=p,f.faceIndex=s,L3&&(f.barycoord=q)}return f}function tr(e,t,r,n,i,s,o){let a=n*3,l=a+0,u=a+1,c=a+2,f=e.index;e.index&&(l=f.getX(l),u=f.getX(u),c=f.getX(c));let{position:q,normal:p,uv:d,uv1:v}=e.attributes,m=N3(r,q,p,d,v,l,u,c,t,s,o);return m?(m.faceIndex=n,i&&i.push(m),m):null}function Q(e,t,r,n){let i=e.a,s=e.b,o=e.c,a=t,l=t+1,u=t+2;r&&(a=r.getX(a),l=r.getX(l),u=r.getX(u)),i.x=n.getX(a),i.y=n.getY(a),i.z=n.getZ(a),s.x=n.getX(l),s.y=n.getY(l),s.z=n.getZ(l),o.x=n.getX(u),o.y=n.getY(u),o.z=n.getZ(u)}function _1(e,t,r,n,i,s,o,a){let{geometry:l,_indirectBuffer:u}=e;for(let c=n,f=n+i;c_&&(_=C),MT&&(T=M),kS&&(S=k)}return l[q+0]!==x||l[q+1]!==b||l[q+2]!==y||l[q+3]!==_||l[q+4]!==T||l[q+5]!==S?(l[q+0]=x,l[q+1]=b,l[q+2]=y,l[q+3]=_,l[q+4]=T,l[q+5]=S,!0):!1}else{let h=q+8,g=o[q+6],x=h+p,b=g+p,y=d,_=!1,T=!1;t?y||(_=t.has(x),T=t.has(b),y=!_&&!T):(_=!0,T=!0);let S=y||_,E=y||T,w=!1;S&&(w=f(h,p,y));let F=!1;E&&(F=f(g,p,y));let C=w||F;if(C)for(let M=0;M<3;M++){let k=h+M,I=g+M,L=l[k],V=l[k+3],G=l[I],H=l[I+3];l[q+M]=LH?V:H}return C}}}function Ae(e,t,r,n,i){let s,o,a,l,u,c,f=1/r.direction.x,q=1/r.direction.y,p=1/r.direction.z,d=r.origin.x,v=r.origin.y,m=r.origin.z,h=t[e],g=t[e+3],x=t[e+1],b=t[e+3+1],y=t[e+2],_=t[e+3+2];return f>=0?(s=(h-d)*f,o=(g-d)*f):(s=(g-d)*f,o=(h-d)*f),q>=0?(a=(x-v)*q,l=(b-v)*q):(a=(b-v)*q,l=(x-v)*q),s>l||a>o||((a>s||isNaN(s))&&(s=a),(l=0?(u=(y-m)*p,c=(_-m)*p):(u=(_-m)*p,c=(y-m)*p),s>c||u>o)?!1:((u>s||s!==s)&&(s=u),(c=n)}function C1(e,t,r,n,i,s,o,a){let{geometry:l,_indirectBuffer:u}=e;for(let c=n,f=n+i;c=0,v,m;d?(v=de(e),m=me(e,l)):(v=me(e,l),m=de(e));let g=Ae(v,o,n,i,s)?ss(v,t,r,n,i,s):null;if(g){let y=g.point[q];if(d?y<=o[m+f]:y>=o[m+f+3])return g}let b=Ae(m,o,n,i,s)?ss(m,t,r,n,i,s):null;return g&&b?g.distance<=b.distance?g:b:g||b||null}}var Un=new xe,rr=new he,nr=new he,Lr=new qe,B1=new ne,On=new ne;function R1(e,t,r,n){W.setBuffer(e._roots[t]);let i=os(0,e,r,n);return W.clearBuffer(),i}function os(e,t,r,n,i=null){let{float32Array:s,uint16Array:o,uint32Array:a}=W,l=e*2;if(i===null&&(r.boundingBox||r.computeBoundingBox(),B1.set(r.boundingBox.min,r.boundingBox.max,n),i=B1),re(l,o)){let c=t.geometry,f=c.index,q=c.attributes.position,p=r.index,d=r.attributes.position,v=ae(e,a),m=fe(l,o);if(Lr.copy(n).invert(),r.boundsTree)return Z(e,s,On),On.matrix.copy(Lr),On.needsUpdate=!0,r.boundsTree.shapecast({intersectsBounds:g=>On.intersectsBox(g),intersectsTriangle:g=>{g.a.applyMatrix4(n),g.b.applyMatrix4(n),g.c.applyMatrix4(n),g.needsUpdate=!0;for(let x=v*3,b=(m+v)*3;xas.distanceToBox(y),intersectsBounds:(y,_,T)=>T{if(t.boundsTree)return t.boundsTree.shapecast({boundsTraverseOrder:S=>Pr.distanceToBox(S),intersectsBounds:(S,E,w)=>w{for(let w=S,F=S+E;w_&&(_=k),IT&&(T=I),LS&&(S=L)}}return l[q+0]!==x||l[q+1]!==b||l[q+2]!==y||l[q+3]!==_||l[q+4]!==T||l[q+5]!==S?(l[q+0]=x,l[q+1]=b,l[q+2]=y,l[q+3]=_,l[q+4]=T,l[q+5]=S,!0):!1}else{let h=q+8,g=o[q+6],x=h+p,b=g+p,y=d,_=!1,T=!1;t?y||(_=t.has(x),T=t.has(b),y=!_&&!T):(_=!0,T=!0);let S=y||_,E=y||T,w=!1;S&&(w=f(h,p,y));let F=!1;E&&(F=f(g,p,y));let C=w||F;if(C)for(let M=0;M<3;M++){let k=h+M,I=g+M,L=l[k],V=l[k+3],G=l[I],H=l[I+3];l[q+M]=LH?V:H}return C}}}function D1(e,t,r,n,i,s,o){W.setBuffer(e._roots[t]),ls(0,e,r,n,i,s,o),W.clearBuffer()}function ls(e,t,r,n,i,s,o){let{float32Array:a,uint16Array:l,uint32Array:u}=W,c=e*2;if(re(c,l)){let q=ae(e,u),p=fe(c,l);C1(t,r,n,q,p,i,s,o)}else{let q=de(e);Ae(q,a,n,s,o)&&ls(q,t,r,n,i,s,o);let p=me(e,u);Ae(p,a,n,s,o)&&ls(p,t,r,n,i,s,o)}}var X3=["x","y","z"];function L1(e,t,r,n,i,s){W.setBuffer(e._roots[t]);let o=cs(0,e,r,n,i,s);return W.clearBuffer(),o}function cs(e,t,r,n,i,s){let{float32Array:o,uint16Array:a,uint32Array:l}=W,u=e*2;if(re(u,a)){let f=ae(e,l),q=fe(u,a);return F1(t,r,n,f,q,i,s)}else{let f=An(e,l),q=X3[f],d=n.direction[q]>=0,v,m;d?(v=de(e),m=me(e,l)):(v=me(e,l),m=de(e));let g=Ae(v,o,n,i,s)?cs(v,t,r,n,i,s):null;if(g){let y=g.point[q];if(d?y<=o[m+f]:y>=o[m+f+3])return g}let b=Ae(m,o,n,i,s)?cs(m,t,r,n,i,s):null;return g&&b?g.distance<=b.distance?g:b:g||b||null}}var Ln=new xe,ir=new he,sr=new he,Nr=new qe,P1=new ne,Pn=new ne;function N1(e,t,r,n){W.setBuffer(e._roots[t]);let i=us(0,e,r,n);return W.clearBuffer(),i}function us(e,t,r,n,i=null){let{float32Array:s,uint16Array:o,uint32Array:a}=W,l=e*2;if(i===null&&(r.boundingBox||r.computeBoundingBox(),P1.set(r.boundingBox.min,r.boundingBox.max,n),i=P1),re(l,o)){let c=t.geometry,f=c.index,q=c.attributes.position,p=r.index,d=r.attributes.position,v=ae(e,a),m=fe(l,o);if(Nr.copy(n).invert(),r.boundsTree)return Z(e,s,Pn),Pn.matrix.copy(Nr),Pn.needsUpdate=!0,r.boundsTree.shapecast({intersectsBounds:g=>Pn.intersectsBox(g),intersectsTriangle:g=>{g.a.applyMatrix4(n),g.b.applyMatrix4(n),g.c.applyMatrix4(n),g.needsUpdate=!0;for(let x=v,b=m+v;xqs.distanceToBox(y),intersectsBounds:(y,_,T)=>T{if(t.boundsTree){let T=t.boundsTree;return T.shapecast({boundsTraverseOrder:S=>zr.distanceToBox(S),intersectsBounds:(S,E,w)=>w{for(let w=S,F=S+E;wnew xe),or=new xe,ar=new xe,fs=new xe,ps=new xe,hs=!1;function V1(e,t,r,n){if(hs)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");hs=!0;let i=e._roots,s=t._roots,o,a=0,l=0,u=new qe().copy(r).invert();for(let c=0,f=i.length;cl.slice()),index:o?o.array.slice():null,indirectBuffer:s?s.slice():null}:a={roots:i,index:o?o.array:null,indirectBuffer:s},a}static deserialize(t,r,n={}){n={setIndex:!0,indirect:!!t.indirectBuffer,...n};let{index:i,roots:s,indirectBuffer:o}=t,a=new e(r,{...n,[_n]:!0});if(a._roots=s,a._indirectBuffer=o||null,n.setIndex){let l=r.getIndex();if(l===null){let u=new Qe(t.index,1,!1);r.setIndex(u)}else l.array!==i&&(l.array.set(i),l.needsUpdate=!0)}return a}get indirect(){return!!this._indirectBuffer}constructor(t,r={}){if(t.isBufferGeometry){if(t.index&&t.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.")}else throw new Error("MeshBVH: Only BufferGeometries are supported.");if(r=Object.assign({...Q3,[_n]:!1},r),r.useSharedArrayBuffer&&!G1())throw new Error("MeshBVH: SharedArrayBuffer is not available.");this.geometry=t,this._roots=null,this._indirectBuffer=null,r[_n]||(v1(this,r),!t.boundingBox&&r.setBoundingBox&&(t.boundingBox=this.getBoundingBox(new xe))),this.resolveTriangleIndex=r.indirect?n=>this._indirectBuffer[n]:n=>n}refit(t=null){return(this.indirect?O1:A1)(this,t)}traverse(t,r=0){let n=this._roots[r],i=new Uint32Array(n),s=new Uint16Array(n);o(0);function o(a,l=0){let u=a*2,c=s[u+15]===65535;if(c){let f=i[a+6],q=s[u+14];t(l,c,new Float32Array(n,a*4,6),f,q)}else{let f=a+32/4,q=i[a+6],p=i[a+7];t(l,c,new Float32Array(n,a*4,6),p)||(o(f,l+1),o(q,l+1))}}}raycast(t,r=Wi,n=0,i=1/0){let s=this._roots,o=this.geometry,a=[],l=r.isMaterial,u=Array.isArray(r),c=o.groups,f=l?r.side:r,q=this.indirect?D1:k1;for(let p=0,d=s.length;pf(q,p,d,v,m)?!0:n(q,p,this,a,d,v,r)}else o||(a?o=(f,q,p,d)=>n(f,q,this,a,p,d,r):o=(f,q,p)=>p);let l=!1,u=0,c=this._roots;for(let f=0,q=c.length;f{let v=this.resolveTriangleIndex(d);Q(o,v*3,a,l)}:d=>{Q(o,d*3,a,l)},c=ye.getPrimitive(),f=t.geometry.index,q=t.geometry.attributes.position,p=t.indirect?d=>{let v=t.resolveTriangleIndex(d);Q(c,v*3,f,q)}:d=>{Q(c,d*3,f,q)};if(s){let d=(v,m,h,g,x,b,y,_)=>{for(let T=h,S=h+g;TGn.intersectsBox(n),intersectsTriangle:n=>Gn.intersectsTriangle(n)})}intersectsSphere(t){return this.shapecast({intersectsBounds:r=>t.intersectsBox(r),intersectsTriangle:r=>r.intersectsSphere(t)})}closestPointToGeometry(t,r,n={},i={},s=0,o=1/0){return(this.indirect?z1:U1)(this,t,r,n,i,s,o)}closestPointToPoint(t,r={},n=0,i=1/0){return y1(this,t,r,n,i)}getBoundingBox(t){return t.makeEmpty(),this._roots.forEach(n=>{Z(0,new Float32Array(n),H1),t.union(H1)}),t}};var W1=` // A stack of uint32 indices can can store the indices for // a perfectly balanced tree with a depth up to 31. Lower stack // depth gets higher performance. // // However not all trees are balanced. Best value to set this to // is the trees max depth. #ifndef BVH_STACK_DEPTH #define BVH_STACK_DEPTH 60 #endif #ifndef INFINITY #define INFINITY 1e20 #endif // Utilities uvec4 uTexelFetch1D( usampler2D tex, uint index ) { uint width = uint( textureSize( tex, 0 ).x ); uvec2 uv; uv.x = index % width; uv.y = index / width; return texelFetch( tex, ivec2( uv ), 0 ); } ivec4 iTexelFetch1D( isampler2D tex, uint index ) { uint width = uint( textureSize( tex, 0 ).x ); uvec2 uv; uv.x = index % width; uv.y = index / width; return texelFetch( tex, ivec2( uv ), 0 ); } vec4 texelFetch1D( sampler2D tex, uint index ) { uint width = uint( textureSize( tex, 0 ).x ); uvec2 uv; uv.x = index % width; uv.y = index / width; return texelFetch( tex, ivec2( uv ), 0 ); } vec4 textureSampleBarycoord( sampler2D tex, vec3 barycoord, uvec3 faceIndices ) { return barycoord.x * texelFetch1D( tex, faceIndices.x ) + barycoord.y * texelFetch1D( tex, faceIndices.y ) + barycoord.z * texelFetch1D( tex, faceIndices.z ); } void ndcToCameraRay( vec2 coord, mat4 cameraWorld, mat4 invProjectionMatrix, out vec3 rayOrigin, out vec3 rayDirection ) { // get camera look direction and near plane for camera clipping vec4 lookDirection = cameraWorld * vec4( 0.0, 0.0, - 1.0, 0.0 ); vec4 nearVector = invProjectionMatrix * vec4( 0.0, 0.0, - 1.0, 1.0 ); float near = abs( nearVector.z / nearVector.w ); // get the camera direction and position from camera matrices vec4 origin = cameraWorld * vec4( 0.0, 0.0, 0.0, 1.0 ); vec4 direction = invProjectionMatrix * vec4( coord, 0.5, 1.0 ); direction /= direction.w; direction = cameraWorld * direction - origin; // slide the origin along the ray until it sits at the near clip plane position origin.xyz += direction.xyz * near / dot( direction, lookDirection ); rayOrigin = origin.xyz; rayDirection = direction.xyz; } `;var X1=` #ifndef TRI_INTERSECT_EPSILON #define TRI_INTERSECT_EPSILON 1e-5 #endif // Raycasting bool intersectsBounds( vec3 rayOrigin, vec3 rayDirection, vec3 boundsMin, vec3 boundsMax, out float dist ) { // https://www.reddit.com/r/opengl/comments/8ntzz5/fast_glsl_ray_box_intersection/ // https://tavianator.com/2011/ray_box.html vec3 invDir = 1.0 / rayDirection; // find intersection distances for each plane vec3 tMinPlane = invDir * ( boundsMin - rayOrigin ); vec3 tMaxPlane = invDir * ( boundsMax - rayOrigin ); // get the min and max distances from each intersection vec3 tMinHit = min( tMaxPlane, tMinPlane ); vec3 tMaxHit = max( tMaxPlane, tMinPlane ); // get the furthest hit distance vec2 t = max( tMinHit.xx, tMinHit.yz ); float t0 = max( t.x, t.y ); // get the minimum hit distance t = min( tMaxHit.xx, tMaxHit.yz ); float t1 = min( t.x, t.y ); // set distance to 0.0 if the ray starts inside the box dist = max( t0, 0.0 ); return t1 >= dist; } bool intersectsTriangle( vec3 rayOrigin, vec3 rayDirection, vec3 a, vec3 b, vec3 c, out vec3 barycoord, out vec3 norm, out float dist, out float side ) { // https://stackoverflow.com/questions/42740765/intersection-between-line-and-triangle-in-3d vec3 edge1 = b - a; vec3 edge2 = c - a; norm = cross( edge1, edge2 ); float det = - dot( rayDirection, norm ); float invdet = 1.0 / det; vec3 AO = rayOrigin - a; vec3 DAO = cross( AO, rayDirection ); vec4 uvt; uvt.x = dot( edge2, DAO ) * invdet; uvt.y = - dot( edge1, DAO ) * invdet; uvt.z = dot( AO, norm ) * invdet; uvt.w = 1.0 - uvt.x - uvt.y; // set the hit information barycoord = uvt.wxy; // arranged in A, B, C order dist = uvt.z; side = sign( det ); norm = side * normalize( norm ); // add an epsilon to avoid misses between triangles uvt += vec4( TRI_INTERSECT_EPSILON ); return all( greaterThanEqual( uvt, vec4( 0.0 ) ) ); } bool intersectTriangles( // geometry info and triangle range sampler2D positionAttr, usampler2D indexAttr, uint offset, uint count, // ray vec3 rayOrigin, vec3 rayDirection, // outputs inout float minDistance, inout uvec4 faceIndices, inout vec3 faceNormal, inout vec3 barycoord, inout float side, inout float dist ) { bool found = false; vec3 localBarycoord, localNormal; float localDist, localSide; for ( uint i = offset, l = offset + count; i < l; i ++ ) { uvec3 indices = uTexelFetch1D( indexAttr, i ).xyz; vec3 a = texelFetch1D( positionAttr, indices.x ).rgb; vec3 b = texelFetch1D( positionAttr, indices.y ).rgb; vec3 c = texelFetch1D( positionAttr, indices.z ).rgb; if ( intersectsTriangle( rayOrigin, rayDirection, a, b, c, localBarycoord, localNormal, localDist, localSide ) && localDist < minDistance ) { found = true; minDistance = localDist; faceIndices = uvec4( indices.xyz, i ); faceNormal = localNormal; side = localSide; barycoord = localBarycoord; dist = localDist; } } return found; } bool intersectsBVHNodeBounds( vec3 rayOrigin, vec3 rayDirection, sampler2D bvhBounds, uint currNodeIndex, out float dist ) { uint cni2 = currNodeIndex * 2u; vec3 boundsMin = texelFetch1D( bvhBounds, cni2 ).xyz; vec3 boundsMax = texelFetch1D( bvhBounds, cni2 + 1u ).xyz; return intersectsBounds( rayOrigin, rayDirection, boundsMin, boundsMax, dist ); } // use a macro to hide the fact that we need to expand the struct into separate fields #define bvhIntersectFirstHit( bvh, rayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist ) _bvhIntersectFirstHit( bvh.position, bvh.index, bvh.bvhBounds, bvh.bvhContents, rayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist ) bool _bvhIntersectFirstHit( // bvh info sampler2D bvh_position, usampler2D bvh_index, sampler2D bvh_bvhBounds, usampler2D bvh_bvhContents, // ray vec3 rayOrigin, vec3 rayDirection, // output variables split into separate variables due to output precision inout uvec4 faceIndices, inout vec3 faceNormal, inout vec3 barycoord, inout float side, inout float dist ) { // stack needs to be twice as long as the deepest tree we expect because // we push both the left and right child onto the stack every traversal int ptr = 0; uint stack[ BVH_STACK_DEPTH ]; stack[ 0 ] = 0u; float triangleDistance = INFINITY; bool found = false; while ( ptr > - 1 && ptr < BVH_STACK_DEPTH ) { uint currNodeIndex = stack[ ptr ]; ptr --; // check if we intersect the current bounds float boundsHitDistance; if ( ! intersectsBVHNodeBounds( rayOrigin, rayDirection, bvh_bvhBounds, currNodeIndex, boundsHitDistance ) || boundsHitDistance > triangleDistance ) { continue; } uvec2 boundsInfo = uTexelFetch1D( bvh_bvhContents, currNodeIndex ).xy; bool isLeaf = bool( boundsInfo.x & 0xffff0000u ); if ( isLeaf ) { uint count = boundsInfo.x & 0x0000ffffu; uint offset = boundsInfo.y; found = intersectTriangles( bvh_position, bvh_index, offset, count, rayOrigin, rayDirection, triangleDistance, faceIndices, faceNormal, barycoord, side, dist ) || found; } else { uint leftIndex = currNodeIndex + 1u; uint splitAxis = boundsInfo.x & 0x0000ffffu; uint rightIndex = boundsInfo.y; bool leftToRight = rayDirection[ splitAxis ] >= 0.0; uint c1 = leftToRight ? leftIndex : rightIndex; uint c2 = leftToRight ? rightIndex : leftIndex; // set c2 in the stack so we traverse it later. We need to keep track of a pointer in // the stack while we traverse. The second pointer added is the one that will be // traversed first ptr ++; stack[ ptr ] = c2; ptr ++; stack[ ptr ] = c1; } } return found; } `;var Lg=` ${W1} ${X1} `;var j1=Math.pow(10,-Math.log10(1e-6)),$3=5e-7*j1;function Re(e){return~~(e*j1+$3)}function Y1(e){return`${Re(e.x)},${Re(e.y)}`}function ds(e){return`${Re(e.x)},${Re(e.y)},${Re(e.z)}`}function K1(e){return`${Re(e.x)},${Re(e.y)},${Re(e.z)},${Re(e.w)}`}function Z1(e,t,r){r.direction.subVectors(t,e).normalize();let n=e.dot(r.direction);return r.origin.copy(e).addScaledVector(r.direction,-n),r}function Vn(){return typeof SharedArrayBuffer<"u"}function Q1(e){if(e.buffer instanceof SharedArrayBuffer)return e;let t=e.constructor,r=e.buffer,n=new SharedArrayBuffer(r.byteLength),i=new Uint8Array(r);return new Uint8Array(n).set(i,0),new t(n)}function e5(e,t=ArrayBuffer){return e>65535?new Uint32Array(new t(4*e)):new Uint16Array(new t(2*e))}function J1(e,t){if(!e.index){let r=e.attributes.position.count,n=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=e5(r,n);e.setIndex(new Qe(i,1));for(let s=0;sl.end)){if(l.end=c.end)s(c.end,l.end)||e.splice(a+1,0,{start:c.end,end:l.end,index:l.index}),l.end=c.start,c.start=0,c.end=0;else if(l.start>=c.start&&l.end<=c.end)s(l.end,c.end)||t.splice(u+1,0,{start:l.end,end:c.end,index:c.index}),c.end=l.start,l.start=0,l.end=0;else if(l.start<=c.start&&l.end<=c.end){let f=l.end;l.end=c.start,c.start=f}else if(l.start>=c.start&&l.end>=c.end){let f=c.end;c.end=l.start,l.start=f}else throw new Error}if(r.has(l.index)||r.set(l.index,[]),r.has(c.index)||r.set(c.index,[]),r.get(l.index).push(c.index),r.get(c.index).push(l.index),o(c)&&(t.splice(u,1),u--),o(l)){e.splice(a,1),a--;break}}}i(e),i(t);function i(a){for(let l=0;l1e-5;return l.direction.angleTo(u.direction)>1e-4||c}function a(l,u){let c=l.origin.distanceTo(u.origin),f=l.direction.angleTo(u.direction);return c/1e-5+f/1e-4}}};var vs=new B,gs=new B,Wn=new Tn;function na(e,t,r){let n=e.attributes,i=e.index,s=n.position,o=new Map,a=new Map,l=Array.from(t),u=new Hn;for(let c=0,f=l.length;cb&&([x,b]=[b,x]),Wn.direction.dot(g.direction)<0?h.reverse.push({start:x,end:b,index:q}):h.forward.push({start:x,end:b,index:q})}return a.forEach(({forward:c,reverse:f},q)=>{ra(c,f,o,r),c.length===0&&f.length===0&&a.delete(q)}),{disjointConnectivityMap:o,fragmentMap:a}}var i5=new Ie,xs=new B,s5=new Je,ys=["","",""],Xn=class{constructor(t=null){this.data=null,this.disjointConnections=null,this.unmatchedDisjointEdges=null,this.unmatchedEdges=-1,this.matchedEdges=-1,this.useDrawRange=!0,this.useAllAttributes=!1,this.matchDisjointEdges=!1,this.degenerateEpsilon=1e-8,t&&this.updateFrom(t)}getSiblingTriangleIndex(t,r){let n=this.data[t*3+r];return n===-1?-1:~~(n/3)}getSiblingEdgeIndex(t,r){let n=this.data[t*3+r];return n===-1?-1:n%3}getDisjointSiblingTriangleIndices(t,r){let n=t*3+r,i=this.disjointConnections.get(n);return i?i.map(s=>~~(s/3)):[]}getDisjointSiblingEdgeIndices(t,r){let n=t*3+r,i=this.disjointConnections.get(n);return i?i.map(s=>s%3):[]}isFullyConnected(){return this.unmatchedEdges===0}updateFrom(t){let{useAllAttributes:r,useDrawRange:n,matchDisjointEdges:i,degenerateEpsilon:s}=this,o=r?x:g,a=new Map,{attributes:l}=t,u=r?Object.keys(l):null,c=t.index,f=l.position,q=lr(t),p=q,d=0;n&&(d=t.drawRange.start,t.drawRange.count!==1/0&&(q=~~(t.drawRange.count/3)));let v=this.data;(!v||v.length<3*p)&&(v=new Int32Array(3*p)),v.fill(-1);let m=0,h=new Set;for(let b=d,y=q*3+d;b{_.forEach(({index:S})=>h.add(S)),T.forEach(({index:S})=>h.add(S))}),this.unmatchedDisjointEdges=b,this.disjointConnections=y,m=q*3-h.size}this.matchedEdges=m,this.unmatchedEdges=h.size,this.data=v;function g(b){return xs.fromBufferAttribute(f,b),ds(xs)}function x(b){let y="";for(let _=0,T=u.length;_=this._pool.length&&this._pool.push(new oe),this._pool[this._index++]}clear(){this._index=0}reset(){this._pool.length=0,this._index=0}},Yn=class{constructor(){this.trianglePool=new ws,this.triangles=[],this.normal=new B,this.coplanarTriangleUsed=!1}initialize(t){this.reset();let{triangles:r,trianglePool:n,normal:i}=this;if(Array.isArray(t))for(let s=0,o=t.length;sSs)throw new Error("Triangle Splitter: Cannot initialize with triangles that have different normals.");let l=n.getTriangle();l.copy(a),r.push(l)}else{t.getNormal(i);let s=n.getTriangle();s.copy(t),r.push(s)}}splitByTriangle(t){let{normal:r,triangles:n}=this;if(t.getNormal(Ts).normalize(),Math.abs(1-Math.abs(Ts.dot(r)))0?d.push(h):v.push(h),Math.abs(x)Hr)if(q!==-1){q=(q+1)%3;let h=0;h===q&&(h=(h+1)%3);let g=h+1;g===q&&(g=(g+1)%3);let x=i.getTriangle();x.a.copy(m[g]),x.b.copy(le.end),x.c.copy(le.start),Ue(x)||n.push(x),a.a.copy(m[h]),a.b.copy(le.start),a.c.copy(le.end),Ue(a)&&(n.splice(s,1),s--,o--)}else{let h=d.length>=2?v[0]:d[0];if(h===0){let _=le.start;le.start=le.end,le.end=_}let g=(h+1)%3,x=(h+2)%3,b=i.getTriangle(),y=i.getTriangle();m[g].distanceToSquared(le.start)r.length&&(this.expand(),r=this.array);for(let i=0,s=t.length;i=r.length;){let i={};r.push(i);for(let s in n){let o=n[s],a=new Wr(o.type);a.itemSize=o.itemSize,a.normalized=o.normalized,i[s]=a}}return r[t]}getGroupAttrArray(t,r=0){let{groupAttributes:n}=this;if(!n[0][t])throw new Error(`TypedAttributeData: Attribute with "${t}" has not been initialized`);return this.getGroupAttrSet(r)[t]}initializeArray(t,r,n,i){let{groupAttributes:s}=this,a=s[0][t];if(a){if(a.type!==r)for(let l=0,u=s.length;l{for(let n in r)r[n].clear()})}delete(t){this.groupAttributes.forEach(r=>{delete r[t]})}reset(){this.groupAttributes=[],this.groupCount=0}};var Xr=class{constructor(){this.intersectionSet={},this.ids=[]}add(t,r){let{intersectionSet:n,ids:i}=this;n[t]||(n[t]=[],i.push(t)),n[t].push(r)}};var Ce=new Tn,aa=new qe,be=new oe,rt=new B,la=new Je,ca=new Je,ua=new Je,Es=new Je,Zn=new Je,Qn=new Je,qa=new ge,As=new B,Cs=1e-8,q5=1e-15,Bt=-1,Rt=1,Jn=-2,$n=2,cr=0,It=1,ti=2,f5=1e-14,ei=null;function ks(e){ei=e}function Is(e,t){e.getMidpoint(Ce.origin),e.getNormal(Ce.direction);let r=t.raycastFirst(Ce,kr);return!!(r&&Ce.direction.dot(r.face.normal)>0)?Bt:Rt}function va(e,t){function r(){return Math.random()-.5}e.getNormal(As),Ce.direction.copy(As),e.getMidpoint(Ce.origin);let n=3,i=0,s=1/0;for(let o=0;o0)&&i++,a!==null&&(s=Math.min(s,a.distance)),s<=q5)return a.face.normal.dot(As)>0?$n:Jn;if(i/n>.5||(o-i+1)/n>.5)break}return i/n>.5?Bt:Rt}function ga(e,t){let r=new Xr,n=new Xr;return aa.copy(e.matrixWorld).invert().multiply(t.matrixWorld),e.geometry.boundsTree.bvhcast(t.geometry.boundsTree,aa,{intersectsTriangles(i,s,o,a){if(!Ue(i)&&!Ue(s)){let l=i.intersectsTriangle(s,qa,!0);if(!l){let u=i.plane,c=s.plane,f=u.normal,q=c.normal;f.dot(q)===1&&Math.abs(u.constant-c.constant){s.push(u.x),i>1&&s.push(u.y),i>2&&s.push(u.z),i>3&&s.push(u.w)};Es.set(0,0,0,0).addScaledVector(e,n.a.x).addScaledVector(t,n.a.y).addScaledVector(r,n.a.z),Zn.set(0,0,0,0).addScaledVector(e,n.b.x).addScaledVector(t,n.b.y).addScaledVector(r,n.b.z),Qn.set(0,0,0,0).addScaledVector(e,n.c.x).addScaledVector(t,n.c.y).addScaledVector(r,n.c.z),a&&(Es.normalize(),Zn.normalize(),Qn.normalize()),l(Es),o?(l(Qn),l(Zn)):(l(Zn),l(Qn))}function Ms(e,t,r,n,i,s=!1){for(let o in i){let a=t[o],l=i[o];if(!(o in t))throw new Error(`CSG Operations: Attribute ${o} no available on geometry.`);let u=a.itemSize;o==="position"?(rt.fromBufferAttribute(a,e).applyMatrix4(r),l.push(rt.x,rt.y,rt.z)):o==="normal"?(rt.fromBufferAttribute(a,e).applyNormalMatrix(n),s&&rt.multiplyScalar(-1),l.push(rt.x,rt.y,rt.z)):(l.push(a.getX(e)),u>1&&l.push(a.getY(e)),u>2&&l.push(a.getZ(e)),u>3&&l.push(a.getW(e)))}}var Rs=class{constructor(t){this.triangle=new oe().copy(t),this.intersects={}}addTriangle(t,r){this.intersects[t]=new oe().copy(r)}getIntersectArray(){let t=[],{intersects:r}=this;for(let n in r)t.push(r[n]);return t}},ri=class{constructor(){this.data={}}addTriangleIntersection(t,r,n,i){let{data:s}=this;s[t]||(s[t]=new Rs(r)),s[t].addTriangle(n,i)}getTrianglesAsArray(t=null){let{data:r}=this,n=[];if(t!==null)t in r&&n.push(r[t].triangle);else for(let i in r)n.push(r[i].triangle);return n}getTriangleIndices(){return Object.keys(this.data).map(t=>parseInt(t))}getIntersectionIndices(t){let{data:r}=this;return r[t]?Object.keys(r[t].intersects).map(n=>parseInt(n)):[]}getIntersectionsAsArray(t=null,r=null){let{data:n}=this,i=new Set,s=[],o=a=>{if(n[a])if(r!==null)n[a].intersects[r]&&s.push(n[a].intersects[r]);else{let l=n[a].intersects;for(let u in l)i.has(u)||(i.add(u),s.push(l[u]))}};if(t!==null)o(t);else for(let a in n)o(a);return s}reset(){this.data={}}},ni=class{constructor(){this.enabled=!1,this.triangleIntersectsA=new ri,this.triangleIntersectsB=new ri,this.intersectionEdges=[]}addIntersectingTriangles(t,r,n,i){let{triangleIntersectsA:s,triangleIntersectsB:o}=this;s.addTriangleIntersection(t,r,n,i),o.addTriangleIntersection(n,i,t,r)}addEdge(t){this.intersectionEdges.push(t.clone())}reset(){this.triangleIntersectsA.reset(),this.triangleIntersectsB.reset(),this.intersectionEdges=[]}init(){this.enabled&&(this.reset(),ks(this))}complete(){this.enabled&&ks(null)}};var gt=new qe,oi=new r1,Ut=new oe,ii=new oe,vt=new oe,si=new oe,Oe=[],Ot=[];function p5(e){for(let t of e)return t}function Ta(e,t,r,n,i,s={}){let{useGroups:o=!0}=s,{aIntersections:a,bIntersections:l}=ga(e,t),u=[],c=null,f;return f=o?0:-1,ba(e,t,a,r,!1,n,i,f),Sa(e,t,a,r,!1,i,f),r.findIndex(p=>p!==6&&p!==5)!==-1&&(f=o?e.geometry.groups.length||1:-1,ba(t,e,l,r,!0,n,i,f),Sa(t,e,l,r,!0,i,f)),Oe.length=0,Ot.length=0,{groups:u,materials:c}}function ba(e,t,r,n,i,s,o,a=0){let l=e.matrixWorld.determinant()<0;gt.copy(t.matrixWorld).invert().multiply(e.matrixWorld),oi.getNormalMatrix(e.matrixWorld).multiplyScalar(l?-1:1);let u=e.geometry.groupIndices,c=e.geometry.index,f=e.geometry.attributes.position,q=t.geometry.boundsTree,p=t.geometry.index,d=t.geometry.attributes.position,v=r.ids,m=r.intersectionSet;for(let h=0,g=v.length;h0;){let h=p5(v);v.delete(h),p.push(h);let g=3*h,x=c.getX(g+0),b=c.getX(g+1),y=c.getX(g+2);vt.a.fromBufferAttribute(q,x).applyMatrix4(gt),vt.b.fromBufferAttribute(q,b).applyMatrix4(gt),vt.c.fromBufferAttribute(q,y).applyMatrix4(gt);let _=Is(vt,l);Ot.length=0,Oe.length=0;for(let T=0,S=n.length;T0;){let T=p.pop();for(let S=0;S<3;S++){let E=d.getSiblingTriangleIndex(T,S);E!==-1&&v.has(E)&&(p.push(E),v.delete(E))}if(Oe.length!==0){let S=3*T,E=c.getX(S+0),w=c.getX(S+1),F=c.getX(S+2),C=o===-1?0:u[T]+o;if(vt.a.fromBufferAttribute(q,E),vt.b.fromBufferAttribute(q,w),vt.c.fromBufferAttribute(q,F),!Ue(vt))for(let M=0,k=Oe.length;M{r[n.materialIndex]=t})),r}var ai=class{constructor(){this.triangleSplitter=new Yn,this.attributeData=[],this.attributes=["position","uv","normal"],this.useGroups=!0,this.consolidateGroups=!0,this.debug=new ni}getGroupRanges(t){return!this.useGroups||t.groups.length===0?[{start:0,count:1/0,materialIndex:0}]:t.groups.map(r=>({...r}))}evaluate(t,r,n,i=new mt){let s=!0;if(Array.isArray(n)||(n=[n]),Array.isArray(i)||(i=[i],s=!1),i.length!==n.length)throw new Error("Evaluator: operations and target array passed as different sizes.");t.prepareGeometry(),r.prepareGeometry();let{triangleSplitter:o,attributeData:a,attributes:l,useGroups:u,consolidateGroups:c,debug:f}=this;for(;a.length{d5(t.geometry,h.geometry,a[g],l)}),f.init(),Ta(t,r,n,o,a,{useGroups:u}),f.complete();let q=this.getGroupRanges(t.geometry),p=_a(q,t.material),d=this.getGroupRanges(r.geometry),v=_a(d,r.material);d.forEach(h=>h.materialIndex+=p.length);let m=[...q,...d].map((h,g)=>({...h,index:g}));if(u){let h=[...p,...v];c&&(m=m.map(x=>{let b=h[x.materialIndex];return x.materialIndex=h.indexOf(b),x}).sort((x,b)=>x.materialIndex-b.materialIndex));let g=[];for(let x=0,b=h.length;x{x.material=g})}else m=[{start:0,count:1/0,index:0,materialIndex:0}],i.forEach(h=>{h.material=p[0]});return i.forEach((h,g)=>{let x=h.geometry;m5(x,a[g],m),c&&h5(x.groups)}),s?i:i[0]}evaluateHierarchy(t,r=new mt){t.updateMatrixWorld(!0);let n=(s,o)=>{let a=s.children;for(let l=0,u=a.length;l{let o=s.children,a=!1;for(let u=0,c=o.length;u{u?u=this.evaluate(u,c,c.operation):u=this.evaluate(s,c,c.operation)}),s._cachedGeometry=u.geometry,s._cachedMaterials=u.material,!0}else return a||l};return i(t),r.geometry=t._cachedGeometry,r.material=t._cachedMaterials,r}reset(){this.triangleSplitter.reset()}};function ur(e){let t=new Mesh({vertices:{}}),r=e.getAttribute("position"),n=r.count,i=[],s={};for(let o=0;o{if(!await Ko("boolean","Heads Up!","This feature is experimental and may cause unexpected behavior. Are you sure you want to continue?"))return;let t=Mesh.selected.slice();Ea(t,!1,{operation:"addition",hideMeshes:!0}),Undo.amendEdit({operation:{label:"Operation",type:"select",options:Us,value:"addition"},hideMeshes:{label:"Hide Meshes",type:"checkbox",value:!0}},r=>{Ea(t,!0,r)})});var Jx=P("operators");function Aa(e,t,r=!1){let n=[];Undo.initEdit({elements:n,selection:!0},r);let i=new THREE[e+"BufferGeometry"](t.radius,t.detail-1),s=ur(i);s.init(),n.push(s),s.select(),UVEditor.setAutoSize(null,!0,Object.keys(s.faces)),Undo.finishEdit("MTools: Generate Mesh")}var x5=new Dialog({title:"Quick Primitive [ Polyhedron ]",form:{select:{label:"Hedron",type:"select",options:{Icosahedron:"Icosahedron",Dodecahedron:"Dodecahedron",Octahedron:"Octahedron",Tetrahedron:"Tetrahedron"}},radius:{label:"Radius",value:8,type:"number"},detail:{label:"Detail",value:2,min:1,max:6,type:"number"}},onConfirm(e){Aa(e.select,e),Undo.amendEdit({radius:{label:"Radius",value:e.radius,type:"number",min:1},detail:{label:"Detail",value:e.detail,type:"range",min:1,max:6}},t=>{Aa(e.select,t,!0)})}}),ty=P("polyhedron",()=>{x5.show()});var ny=P("quickprimitives");function Ca(e,t=!1){let r=[];Undo.initEdit({elements:r,selection:!0},t);let n=new THREE.TorusKnotBufferGeometry(e.r,e.t,e.ts,e.rs,e.p,e.q),i=wa(n,!0);i.init(),r.push(i),i.select(),UVEditor.setAutoSize(null,!0,Object.keys(i.faces)),Undo.finishEdit("MTools: Generate Mesh")}var S5=new Dialog({title:"Quick Primitive [ Torus Knot ]",lines:['

    P and Q should be coprime integers meaning non should be divisible by the other.

    '],form:{r:{label:"Torus Radius",type:"number",value:8},t:{label:"Tube Radius",type:"number",value:3.4,step:.2},ts:{label:"Tubular Segments",type:"number",value:25},rs:{label:"Radial Segments",type:"number",value:5},p:{label:"P",type:"number",value:2},q:{label:"Q",type:"number",value:3}},onConfirm(e){Ca(e);let t=e;Undo.amendEdit({r:{label:"Torus Radius",type:"number",value:t.r},t:{label:"Tube Radius",type:"number",value:t.t,step:.2},ts:{label:"Tubular Segments",type:"number",value:t.ts},rs:{label:"Radial Segments",type:"number",value:t.rs},p:{label:"P",type:"number",value:t.p},q:{label:"Q",type:"number",value:t.q}},r=>{Ca(r,!0)})}}),sy=P("torusknot",()=>{S5.show()});var ce=class e{static styles={Earth:[{blend:.5,height:.2,color:new THREE.Color(.13,.36,.89)},{blend:.2,height:.375,color:new THREE.Color(.9,.86,.36)},{blend:.3,height:.5,color:new THREE.Color(.15,.87,.113)},{blend:1,height:1,color:new THREE.Color(.113,.87,.137)}],EarthMountains:[{blend:.5,height:.2,color:new THREE.Color(.13,.36,.89)},{blend:.2,height:.375,color:new THREE.Color(.9,.86,.36)},{blend:.3,height:.5,color:new THREE.Color(.15,.87,.113)},{blend:1,height:.6,color:new THREE.Color(.113,.87,.137)},{blend:.1,height:1,color:new THREE.Color(.39,.28,.12)}],Grass:[{blend:1,height:.2,color:new THREE.Color(.69,1,.11)},{blend:1,height:.375,color:new THREE.Color(.51,1,.14)},{blend:1,height:.375,color:new THREE.Color(.17,.63,.054)}],Desert:[{blend:0,height:0,color:new THREE.Color(.54,.42,.17)},{blend:.9,height:1,color:new THREE.Color(.79,.56,.25)}],Ice:[{blend:0,height:0,color:new THREE.Color(.45,.68,.86)},{blend:1,height:.5,color:new THREE.Color(.58,.77,.89)},{blend:1,height:.75,color:new THREE.Color(.83,.94,.97)},{blend:1,height:1,color:new THREE.Color(.61,.84,.94)}],Mask:[{blend:0,height:0,color:new THREE.Color(0,0,0)},{blend:1,height:1,color:new THREE.Color(1,1,1)}]};static all=[];static timeWhenDialogWasOpened=0;static genTexture(t,r,n,i=this.styles.Earth,s=!0){let o=document.createElement("canvas");o.width=t,o.height=r;let a=o.getContext("2d");for(let u=r-1;u>=0;u--)for(let c=t-1;c>=0;c--){let f=Math.clamp(n[[c,u]],0,i.last().height);for(let q=0;q=r?e:1<=r?t:(t-e)*(3-r*2)*r*r+e},grad(e,t,r){let n=this.randomAt(e,t,r)*Math.PI*2,i=Math.sin(n),s=Math.cos(n),o=i*s,a=s*s;return{x:o,y:a,z:i}},dotgrad(e,t,r,n,i,s){let o=this.grad(e,t,r),a=n-e,l=i-t,u=s-r;return a*o.x+l*o.y+u*o.z},get(e=0,t=0,r=0){e=(e+128)%128,t=(t+128)%128,r=(r+128)%128;let n=Math.floor(e),i=n+1,s=Math.floor(t),o=s+1,a=Math.floor(r),l=a+1,u=e%1,c=t%1,f=r%1,q,p,d,v;q=this.dotgrad(n,s,a,e,t,r),p=this.dotgrad(i,s,a,e,t,r);let m=this.interpolate(q,p,u);q=this.dotgrad(n,o,a,e,t,r),p=this.dotgrad(i,o,a,e,t,r);let h=this.interpolate(q,p,u),g=this.interpolate(m,h,c);d=this.dotgrad(n,s,l,e,t,r),v=this.dotgrad(i,s,l,e,t,r);let x=this.interpolate(d,v,u);d=this.dotgrad(n,o,l,e,t,r),v=this.dotgrad(i,o,l,e,t,r);let b=this.interpolate(d,v,u),y=this.interpolate(x,b,c);return this.interpolate(g,y,f)}};new ce({name:"Open Terrain",settings:{time:{label:"Time",type:"number",min:0,value:0,step:1},scale:{label:"Noise Scale",type:"number",min:0,value:25},octaves:{label:"Octaves",type:"number",min:0,value:2},persistance:{label:"Persistancy",type:"number",min:0,max:1,step:.1,value:.4},lacunarity:{label:"lacunarity",type:"number",min:0,value:3},min:{label:"Min Level",type:"number",min:0,max:.9,step:.1,value:.1}},noise(e,t){e.scale<=0&&(e.scale=1e-6);let r=e.time+ce.timeWhenDialogWasOpened,n={};for(let i=e.height-1;i>=0;i--)for(let s=e.width-1;s>=0;s--){let o=Math.pow(2,-e.persistance),a=1,l=1,u=0,c=0;for(let f=0;f1-Math.abs(r*2-1))}});new ce({name:"Mesa",settings:{time:{label:"Time",type:"number",min:0,value:0,step:1},scale:{label:"Noise Scale",type:"number",min:0,value:25},octaves:{label:"Octaves",type:"number",min:0,value:2},persistance:{label:"Persistancy",type:"number",min:0,max:1,step:.1,value:.4},lacunarity:{label:"lacunarity",type:"number",min:0,value:3}},suggested:{falloff:!0,style:"Desert"},noise:function(e){return e.max=.7,e.min=0,ce.all[0].noise(e)}});new ce({name:"River",settings:{time:{label:"Time",type:"number",min:0,value:0,step:1},scale:{label:"Noise Scale",type:"number",min:0,value:25},octaves:{label:"Octaves",type:"number",min:0,value:2},persistance:{label:"Persistancy",type:"number",min:0,max:1,step:.1,value:.4},lacunarity:{label:"lacunarity",type:"number",min:0,value:3},turbpower:{label:"Turb-Power",type:"number",min:0,value:1.3,step:.1}},suggested:{style:"Ice",multiplier:3,lacunarity:2,octaves:4},noise:function(e){return ce.all[0].noise(e,function(r,n,i){let s=n/e.width+i/e.height+e.turbpower*r;return Math.abs(Math.cos(s*Math.PI))})}});var Os={};for(let e in ce.styles)Os[e]=e;var ci={},Dt={style:{label:"Style",type:"select",options:Os},terrain:{label:"Terrain Type",type:"select"},width:{label:"Resolution X",type:"number",value:32,min:1,max:255},height:{label:"Resolution Y",type:"number",value:32,min:1,max:255},size:{label:"Size",type:"number",value:16,min:16},suggested:{label:"Update Suggested Settings",type:"checkbox",value:!0},_:"_",multiplier:{label:"Height Multiplier",type:"number",value:5,max:1/0},falloff:{label:"FallOff Map",type:"checkbox",value:!1},__:"_"};Os.custom="Custom";var Ma={};for(let e=0;eci[i].includes(o),Dt[i]=s}}Dt.terrain.options=Ma;var hy=P("terrain_action",()=>{let e;ce.timeWhenDialogWasOpened=Date.now(),new Dialog({title:"Terrain Settings",id:"terrain_settings",form:Dt,onConfirm(t){let r=ce.styles[t.style];if(t.style=="custom"){let o=localStorage.mt_customStyle;o||Blockbench.showQuickMessage("No Custom Style found, 'Earth' is used instead.",2e3);let a=JSON.parse(o);a.forEach(l=>l.color=hn(l.col)),r=a}let n=ce.all.find(o=>o.codeName==t.terrain);function i(o,a){let{width:l,height:u}=o;o.falloff=t.falloff;let c=[],f=[];Undo.initEdit({elements:c,textures:f,selection:!0},a);let q=n.noise(o),p=.5-l/2,d=.5-u/2,v=new Mesh({vertices:{}}),m=ce.genTexture(l,u,q,r,o.blending),h=[],g=0;for(let x=u-1;x>=0;x--)for(let b=l-1;b>=0;b--){let y=o.size*(b+p)/l,_=o.size*(x+d)/u,T=q[[b,x]]*o.multiplier+1,S=[y,T,_];h[g]=v.addVertices(S)[0],g++}g=0;for(let x=u-1;x>=0;x--)for(let b=l-1;b>=0;b--){if(b>0&&x>0){let y=[g,g+1,g+l+1,g+l],_={};_[h[y[0]]]=[(b-1)/l*Project._texture_width,(x-1)/u*Project._texture_height],_[h[y[1]]]=[b/l*Project._texture_width,(x-1)/u*Project._texture_height],_[h[y[2]]]=[b/l*Project._texture_width,x/u*Project._texture_height],_[h[y[3]]]=[(b-1)/l*Project._texture_width,x/u*Project._texture_height];let T=new MeshFace(v,{vertices:[h[y[3]],h[y[2]],h[y[1]],h[y[0]]],uv:_,texture:m.uuid}),S=v.addFaces(T),E=T.getSortedVertices();for(let w=0;w<4;w++){let F=v.vertices[E[w]],C=v.vertices[E[(w+1)%4]],M=[C[0]-F[0],C[2]-F[2]];if(M[0]&&M[1]==0||M[1]&&M[0]==0)continue;delete v.faces[S];let I=new MeshFace(v,{vertices:[h[y[3]],h[y[2]],h[y[0]]],uv:_,texture:m.uuid}),L=new MeshFace(v,{vertices:[h[y[1]],h[y[0]],h[y[2]]],uv:_,texture:m.uuid});v.addFaces(I),v.addFaces(L);break}}g++}v.init(),c.push(v),v.select(),f.push(m),Undo.finishEdit("MTools: Generate Terrain Mesh")}i(t,!1);let s={};s.width=Dt.width,s.height=Dt.height,s.size=Dt.size,s.multiplier=Dt.multiplier;for(let o in n.settings){let a={};for(let l in n.settings[o])l=="value"?a[l]=t[o]:l!="condition"&&(a[l]=n.settings[o][l]);s[o]=a}Undo.amendEdit(s,o=>{i(o,!0)})},onFormChange(t){if(!t.suggested||t.terrain==e)return;let r=ce.all.find(n=>n.codeName==t.terrain);e=t.terrain,this.setFormValues(r.suggested)}}).show()});var gy=P("terrainse",()=>{let e;new Dialog({title:"Terrain Generator Style Editor",buttons:["Save","Cancel"],confirmEnabled:!1,cancelIndex:1,width:650,onButton(o){o==0&&localStorage.setItem("mt_customStyle",JSON.stringify(e))},lines:[`
    `]}).show();let r=$("#tgseCanvas")[0].getContext("2d"),n=function(o){return $(document.createElement(o))};$("#tgse_levels").sortable({stop(){s()}}),$("#tgse_addlevel")[0].onclick=function(o,a,l,u=!0){let c=n("li"),f=n("span").append('delete'),q=new ColorPicker({label:!1,name:"Color",private:!0,color:a||"#fff"});q.jq.spectrum({preferredFormat:"hex",color:a||"#fff",showinput:!0,maxSelectionSize:128,resetText:tl("generic.reset"),cancelText:tl("dialog.cancel"),chooseText:tl("dialog.confirm"),hide:function(){s()},change:function(){s()},move:function(){s()}});let p=n("input").attr({type:"number",min:0,max:100,step:.5,value:typeof o=="number"?o:100}).addClass("dark_bordered focusable_input"),d=n("input").attr({type:"number",min:0,max:100,step:.5,value:typeof l=="number"?l:100}).addClass("dark_bordered focusable_input");p[0].oninput=function(){s()},d[0].oninput=function(){s()},f[0].onclick=function(){r.clearRect(0,0,256,25),c.remove(),s()},c.addClass("tgseLevel").append(f).append(q.getNode()).append("  ").append(n("label").text("At height percent of: ")).append("  ").append(p).append("  ").append(n("label").text("With blending as: ")).append("  ").append(d),$("#tgse_levels").append(c[0]),u&&s()};let i=localStorage.mt_customStyle;i?JSON.parse(i).forEach(a=>{$("#tgse_addlevel")[0].onclick(a.height*100,a.col,a.blend*100)}):($("#tgse_addlevel")[0].onclick(0,"#f00",0,!1),$("#tgse_addlevel")[0].onclick(50,"#0f0",100,!1),$("#tgse_addlevel")[0].onclick(100,"#00f",100));function s(){let o=$("#tgse_levels").children();e=[];let a=o.length;for(let u=0;u":{ha:494,x_min:29,x_max:460,o:"m 460 347 q 444 323 460 331 q 97 82 271 239 q 82 73 93 77 q 31 167 31 161 q 163 288 31 197 q 329 389 278 367 q 344 399 336 391 q 328 408 340 403 q 36 610 129 494 q 29 623 29 618 q 49 662 29 625 q 71 707 68 699 q 76 714 73 714 q 92 705 79 714 q 271 564 149 656 q 355 509 342 517 q 441 464 410 476 q 460 440 460 457 l 460 347 z "},"?":{ha:553,x_min:20,x_max:524,o:"m 524 692 q 465 517 524 593 q 354 406 458 509 q 286 288 292 346 q 283 258 285 273 q 264 240 281 246 q 233 233 244 233 q 193 235 199 233 q 176 268 176 241 q 204 397 176 349 q 293 515 249 456 q 346 650 346 585 q 310 751 346 713 q 211 790 273 790 q 99 755 161 790 q 41 720 38 720 q 20 850 20 720 q 40 873 20 859 q 264 947 146 947 q 451 877 378 947 q 524 692 524 806 m 330 77 q 305 10 330 39 q 243 -18 280 -18 q 181 10 206 -18 q 157 77 157 39 q 181 142 157 115 q 243 170 205 170 q 306 142 281 170 q 330 77 330 115 z "},"@":{ha:863,x_min:39,x_max:790,o:"m 790 510 q 755 347 790 452 q 673 224 715 224 q 610 258 618 224 q 597 285 604 285 q 557 260 598 285 q 476 235 517 235 q 333 301 386 235 q 283 456 283 363 q 338 622 283 556 q 496 692 397 692 q 603 659 553 692 q 654 627 654 627 q 669 647 669 627 q 612 800 669 732 q 469 869 553 869 q 229 742 323 869 q 144 475 144 627 q 228 206 144 318 q 472 82 321 82 q 490 71 490 82 l 490 -7 q 472 -21 490 -21 q 153 132 277 -21 q 39 475 39 275 q 157 811 39 662 q 467 971 284 971 q 725 820 642 971 q 790 510 790 701 m 652 472 q 617 555 652 522 q 532 589 582 589 q 445 553 479 589 q 411 465 411 517 q 435 379 411 415 q 509 337 462 337 q 610 376 568 337 q 652 472 652 415 z "},A:{ha:916,x_min:6,x_max:909,o:"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 z "},B:{ha:848,x_min:71,x_max:803,o:"m 803 293 q 732 90 803 175 q 541 1 656 1 q 410 3 497 1 q 279 5 323 5 q 183 3 248 5 q 87 0 119 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 269 951 148 951 q 452 950 391 950 q 679 897 594 950 q 782 697 782 833 q 755 600 782 650 q 689 524 728 549 q 669 507 669 511 q 689 492 669 503 q 772 408 741 463 q 803 293 803 353 m 612 682 q 527 811 612 778 q 358 831 475 831 q 244 814 244 831 q 242 747 244 791 q 240 679 240 702 q 241 631 240 663 q 241 582 241 598 q 395 562 241 562 q 612 682 612 562 m 631 300 q 557 412 631 382 q 411 431 510 431 q 240 412 240 431 l 240 301 q 241 227 240 277 q 243 151 243 176 q 286 141 243 144 q 415 138 330 138 q 569 165 522 138 q 631 300 631 202 z "},C:{ha:823,x_min:39,x_max:819,o:"m 819 157 q 806 134 819 149 q 478 -20 673 -20 q 153 129 275 -20 q 39 475 39 267 q 155 822 39 682 q 481 972 278 972 q 799 833 686 972 q 810 810 810 819 q 774 742 810 798 q 730 685 738 685 q 689 718 722 685 q 614 779 649 759 q 485 812 555 812 q 276 710 351 812 q 210 479 210 618 q 275 247 210 340 q 484 142 350 142 q 612 175 550 142 q 694 237 652 197 q 733 270 730 270 q 778 216 737 270 q 819 157 819 162 z "},D:{ha:945,x_min:73,x_max:905,o:"m 905 481 q 797 151 905 290 q 494 0 679 0 q 388 3 459 0 q 282 5 317 5 q 186 3 250 5 q 90 0 122 0 q 73 17 73 0 q 79 240 73 91 q 85 464 85 389 q 79 701 85 543 q 74 937 74 859 q 92 951 74 951 q 166 951 117 951 q 241 950 216 950 q 312 951 264 950 q 384 951 359 951 q 734 863 619 951 q 863 691 817 799 q 905 481 905 591 m 739 481 q 656 720 739 627 q 424 815 569 815 q 327 817 304 815 q 248 787 248 812 q 245 631 248 735 q 243 475 243 527 q 245 320 243 423 q 248 165 248 217 q 329 136 248 140 q 428 136 318 136 q 552 153 506 136 q 654 228 609 173 q 739 481 739 331 z "},E:{ha:747,x_min:68,x_max:713,o:"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 z "},F:{ha:741,x_min:68,x_max:722,o:"m 722 812 q 708 800 722 800 q 534 806 655 800 q 361 810 422 811 l 311 809 q 261 807 264 808 q 248 764 248 802 l 248 601 q 267 555 248 555 q 466 561 333 555 q 664 567 598 567 q 678 556 678 567 q 676 522 678 545 q 675 488 675 499 q 676 451 675 475 q 677 414 677 426 q 663 406 677 406 q 521 408 616 406 q 378 411 426 411 q 279 410 291 411 q 249 385 249 406 q 252 201 249 323 q 256 18 256 79 q 239 -2 256 -2 q 199 1 226 -2 q 158 4 172 4 q 123 2 146 4 q 87 0 99 0 q 71 15 71 0 q 77 241 71 90 q 83 468 83 393 q 69 922 83 538 l 69 931 q 86 947 68 945 q 172 945 92 947 q 370 945 279 943 q 682 958 492 946 q 711 936 708 960 q 714 880 711 918 q 722 812 722 828 z "},G:{ha:937,x_min:39,x_max:902,o:"m 901 33 q 884 18 902 18 q 834 38 873 18 q 785 65 795 57 q 489 -20 660 -20 q 161 130 290 -20 q 39 473 39 271 q 159 822 39 681 q 489 971 286 971 q 690 922 593 971 q 844 787 787 873 q 853 768 853 774 q 805 705 853 758 q 749 652 756 652 q 707 693 743 652 q 625 770 664 743 q 496 811 563 811 q 286 704 368 811 q 211 473 211 606 q 288 244 211 344 q 497 136 371 136 q 725 204 621 136 q 713 333 724 222 q 705 461 705 412 q 720 473 705 473 q 759 471 733 473 q 798 469 785 469 q 837 471 810 469 q 876 472 863 472 q 890 450 890 472 q 889 379 890 427 q 887 307 887 331 q 900 43 887 210 l 901 33 z "},H:{ha:994,x_min:71,x_max:926,o:"m 926 16 q 905 0 926 0 q 870 2 894 0 q 833 4 846 4 q 794 2 821 4 q 755 0 768 0 q 740 16 740 0 q 744 199 740 77 q 747 382 747 321 q 732 412 747 408 q 497 418 711 418 q 262 412 283 418 q 248 382 248 408 q 251 202 248 322 q 254 22 254 82 q 237 0 254 0 q 199 2 224 0 q 160 4 173 4 q 124 2 148 4 q 87 0 100 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 125 949 100 951 q 163 947 150 947 q 201 949 175 947 q 239 951 227 951 q 254 939 254 951 q 249 764 254 881 q 244 589 244 647 q 258 566 244 570 q 497 559 275 559 q 734 566 714 559 q 750 595 750 570 q 746 766 750 652 q 743 938 743 881 q 758 951 743 951 q 796 949 771 951 q 833 947 821 947 q 870 949 846 947 q 907 951 895 951 q 924 937 924 951 q 918 700 924 858 q 911 464 911 543 q 918 240 911 389 q 926 16 926 90 z "},I:{ha:329,x_min:71,x_max:257,o:"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 z "},J:{ha:371,x_min:5,x_max:302,o:"m 302 937 q 297 737 302 870 q 292 537 292 604 q 292 441 292 505 q 293 345 293 377 q 266 104 293 197 q 135 -96 229 -20 q 117 -106 122 -106 q 106 -98 112 -106 q 11 -1 58 -44 q 5 9 5 4 q 12 21 5 14 q 75 81 58 61 q 113 160 100 113 q 130 417 130 222 l 129 519 q 121 725 129 583 q 113 930 113 861 q 132 950 113 950 q 171 948 145 950 q 210 946 197 946 q 248 948 222 946 q 285 950 273 950 q 302 937 302 950 z "},K:{ha:828,x_min:71,x_max:821,o:"m 821 32 q 802 0 821 0 l 646 0 q 543 144 626 0 q 450 321 473 267 q 424 379 427 373 q 376 415 404 413 q 331 416 368 416 q 245 395 245 416 q 250 208 245 332 q 254 22 254 84 q 237 0 254 0 q 199 2 224 0 q 160 4 173 4 q 124 2 148 4 q 87 0 100 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 125 949 100 951 q 163 947 150 947 q 199 949 175 947 q 236 951 224 951 q 252 939 252 951 q 248 766 252 882 q 244 591 244 650 q 248 558 244 565 q 275 546 253 546 q 468 595 407 546 q 567 754 520 638 q 635 936 601 845 q 656 951 640 947 q 728 954 667 954 q 802 933 802 954 q 771 823 802 921 q 676 623 734 709 q 574 504 637 564 q 557 478 557 490 q 612 357 557 466 q 699 205 660 262 q 818 45 741 153 q 821 32 821 39 z "},L:{ha:718,x_min:71,x_max:710,o:"m 710 147 q 700 12 710 52 q 676 -7 695 -7 q 526 -2 626 -7 q 375 4 425 4 q 233 2 328 4 q 92 0 139 0 q 75 17 75 0 q 80 240 75 91 q 85 464 85 389 q 78 700 85 543 q 71 935 71 857 q 87 950 71 950 q 125 948 100 950 q 163 946 150 946 q 201 948 175 946 q 239 950 227 950 q 255 937 255 950 q 250 721 255 865 q 244 504 244 576 q 244 397 244 469 q 243 290 243 325 q 256 139 243 139 q 633 151 506 139 q 665 156 640 152 q 696 160 685 160 q 710 147 710 160 z "},M:{ha:1097,x_min:71,x_max:1024,o:"m 1024 17 q 1007 0 1024 0 q 970 2 995 0 q 933 4 945 4 q 896 2 921 4 q 859 0 871 0 q 842 22 842 0 q 847 281 842 109 q 852 539 852 453 q 847 552 852 552 q 838 545 841 552 q 674 150 803 471 q 614 -4 653 88 q 565 -13 609 -13 q 494 -1 501 -13 q 429 153 471 54 q 256 553 372 287 q 247 562 254 557 q 241 547 241 558 q 244 285 241 460 q 248 22 248 110 q 231 0 248 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 13 71 0 q 78 238 71 88 q 85 464 85 389 q 78 698 85 542 q 71 932 71 854 q 86 947 71 945 q 225 960 178 960 q 244 932 232 960 q 526 288 408 571 q 559 221 554 221 q 589 275 566 221 q 844 928 681 495 q 867 954 854 954 q 936 951 890 954 q 1006 949 983 949 q 1023 932 1023 949 q 1018 698 1023 854 q 1013 464 1013 542 q 1018 240 1013 389 q 1024 17 1024 91 z "},N:{ha:997,x_min:71,x_max:924,o:"m 924 937 q 918 701 924 859 q 913 465 913 544 q 914 244 913 391 q 916 22 916 96 q 899 0 916 0 q 868 2 888 0 q 838 4 848 4 q 804 2 827 4 q 771 0 782 0 q 742 22 759 0 q 298 611 595 220 q 244 677 252 671 q 237 650 237 677 q 241 336 237 545 q 244 22 244 127 q 231 0 244 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 14 71 0 q 78 238 71 88 q 85 464 85 389 q 79 760 85 546 q 72 926 77 815 l 71 935 q 87 946 71 945 q 157 949 132 947 q 193 954 166 949 q 228 958 215 958 q 249 939 234 958 q 726 301 405 724 q 753 271 741 283 q 758 401 758 299 q 751 665 758 489 q 745 929 745 842 q 758 951 745 951 q 795 949 770 951 q 832 947 820 947 q 871 949 845 947 q 909 951 897 951 q 924 937 924 951 z "},O:{ha:1007,x_min:41,x_max:966,o:"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 z "},P:{ha:867,x_min:68,x_max:839,o:"m 839 600 q 753 345 839 441 q 507 247 664 247 q 390 250 468 247 q 272 253 311 253 q 250 225 250 253 q 255 117 250 189 q 259 9 259 45 q 246 -2 259 -2 q 203 1 232 -2 q 160 4 174 4 q 124 2 148 4 q 89 0 100 0 q 72 21 72 0 q 78 244 72 95 q 85 468 85 393 q 69 922 85 680 l 68 932 q 86 947 68 947 q 196 947 123 947 q 307 946 270 946 q 403 949 339 946 q 498 951 467 951 q 745 850 648 951 q 839 600 839 750 m 668 590 q 613 753 668 692 q 456 817 556 817 q 345 811 425 817 q 250 800 253 806 q 245 567 245 792 q 247 481 245 538 q 249 396 249 425 q 264 387 249 390 q 471 379 301 379 q 618 438 566 379 q 668 590 668 494 z "},Q:{ha:1007,x_min:41,x_max:966,o:"m 966 478 q 859 159 966 298 q 571 -8 745 14 q 660 -144 596 -83 q 664 -153 664 -149 q 618 -175 664 -172 q 557 -175 618 -175 q 463 -172 475 -175 q 424 -7 428 -164 q 145 165 251 27 q 41 478 41 300 q 172 823 41 677 q 504 974 307 974 q 836 823 701 974 q 966 478 966 677 m 804 478 q 721 709 804 611 q 503 811 633 811 q 286 707 374 811 q 204 476 204 608 q 286 245 204 345 q 503 140 373 140 q 722 245 634 140 q 804 478 804 344 z "},R:{ha:825,x_min:68,x_max:804,o:"m 804 5 q 793 0 804 0 q 753 2 780 0 q 714 4 727 4 q 672 2 700 4 q 629 0 644 0 q 606 17 614 0 q 482 302 584 63 q 433 332 472 327 q 371 333 424 333 q 260 330 277 333 q 245 296 245 328 q 250 154 245 248 q 254 12 254 59 q 241 -2 254 -2 q 200 1 227 -2 q 158 4 172 4 q 123 2 146 4 q 87 0 99 0 q 71 16 71 0 q 78 242 71 91 q 85 468 85 393 q 69 925 85 682 l 68 936 q 97 949 68 949 q 272 952 155 949 q 446 956 388 956 q 687 884 596 956 q 787 659 787 804 q 760 500 787 558 q 654 385 732 439 q 642 368 642 376 q 723 187 642 358 q 804 5 804 16 m 618 621 q 547 785 618 743 q 359 815 495 815 q 248 798 250 815 q 243 602 243 761 l 243 472 q 252 469 245 471 q 292 466 264 468 q 431 463 356 463 q 618 621 618 463 z "},S:{ha:648,x_min:75,x_max:614,o:"m 614 883 q 576 815 600 861 q 550 755 569 794 q 539 749 546 749 q 474 773 540 749 q 365 798 408 798 q 240 688 240 798 q 328 581 240 627 q 490 493 475 505 q 578 304 578 423 q 458 65 578 153 q 193 -14 350 -14 q 114 3 119 -14 q 102 78 111 28 q 85 139 96 98 q 83 151 83 145 q 93 160 83 160 q 143 157 109 160 q 193 153 176 153 q 404 289 404 153 q 319 404 404 355 q 161 496 164 492 q 75 682 75 565 q 158 884 75 808 q 367 957 239 957 q 492 939 421 957 q 607 892 568 920 q 614 883 610 889 z "},T:{ha:713,x_min:9,x_max:701,o:"m 701 823 q 689 806 701 806 q 449 814 670 806 q 443 482 443 607 q 449 248 443 404 q 454 14 454 92 q 435 0 454 0 q 397 2 422 0 q 359 4 372 4 q 322 2 347 4 q 285 0 297 0 q 268 17 268 0 q 274 249 268 94 q 281 482 281 404 q 273 814 281 603 q 17 803 98 803 q 9 810 9 803 q 15 845 9 822 q 24 880 22 875 q 33 946 25 904 q 45 955 37 955 l 53 954 q 370 940 293 940 q 591 950 437 940 q 679 957 696 957 q 699 945 696 957 q 697 879 697 952 q 699 851 697 870 q 701 823 701 833 z "},U:{ha:917,x_min:68,x_max:848,o:"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 z "},V:{ha:860,x_min:41,x_max:818,o:"m 818 612 q 685 333 818 584 q 517 20 601 176 q 494 0 507 0 l 358 0 q 339 20 349 0 q 178 323 337 24 q 41 604 41 581 q 45 765 41 658 q 49 926 49 873 q 65 951 49 951 q 103 949 78 951 q 140 947 127 947 q 178 949 153 947 q 215 951 203 951 q 231 939 231 951 q 223 773 231 884 q 216 607 216 663 q 427 196 216 561 q 547 414 482 291 q 642 623 642 591 q 638 781 642 675 q 635 938 635 886 q 650 951 635 951 q 688 949 663 951 q 725 947 713 947 q 762 949 737 947 q 799 951 787 951 q 816 939 814 951 q 815 913 815 943 q 817 763 815 863 q 818 612 818 663 z "},W:{ha:1239,x_min:41,x_max:1198,o:"m 1198 604 q 1063 314 1198 599 q 924 18 1017 215 q 905 0 915 0 l 783 0 q 762 18 770 0 q 618 390 712 136 q 472 18 571 265 q 452 0 465 0 l 330 0 q 311 18 320 0 q 171 314 264 117 q 41 604 41 584 q 45 772 41 660 q 48 939 48 884 q 65 951 48 951 q 102 949 77 951 q 139 947 127 947 q 174 949 151 947 q 208 950 197 950 q 222 940 222 950 q 216 774 222 885 q 210 608 210 663 q 347 295 210 574 q 396 203 392 203 q 399 208 397 203 q 434 294 408 223 q 534 595 483 427 q 536 702 536 612 q 534 822 536 742 q 532 941 532 901 q 546 951 532 951 q 585 949 559 951 q 624 947 610 947 q 659 949 635 947 q 693 951 682 951 q 709 941 709 951 q 706 812 709 898 q 703 684 703 726 q 704 599 703 614 q 806 301 706 565 q 842 216 817 271 q 844 211 842 213 q 892 301 848 211 q 1026 610 1026 574 q 1020 776 1026 665 q 1014 941 1014 886 q 1019 951 1014 951 q 1060 949 1033 951 q 1100 947 1086 947 q 1137 949 1112 947 q 1175 951 1162 951 q 1192 943 1190 951 q 1192 924 1192 944 q 1195 764 1192 871 q 1198 604 1198 658 z "},X:{ha:796,x_min:39,x_max:761,o:"m 761 8 q 746 0 761 0 l 637 -1 q 628 0 629 -1 q 511 169 618 3 q 401 335 404 334 q 281 161 389 326 q 167 0 177 0 l 54 0 q 39 11 39 0 l 39 109 q 166 291 39 121 q 294 473 294 460 q 167 659 294 488 q 40 840 40 830 l 40 945 q 58 954 40 954 q 115 953 77 954 q 172 951 153 951 q 197 920 176 951 q 390 621 261 820 q 401 610 393 616 q 519 785 411 615 q 635 951 625 951 l 742 951 q 760 942 760 951 l 760 838 q 633 652 760 821 q 507 475 507 484 q 634 291 507 465 q 761 106 761 118 l 761 8 z "},Y:{ha:815,x_min:24,x_max:794,o:"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 z "},Z:{ha:701,x_min:26,x_max:662,o:"m 662 155 q 653 83 662 132 q 644 9 644 34 q 628 -5 644 -5 q 507 -3 587 -5 q 386 0 427 0 l 64 0 q 41 14 45 0 q 26 127 26 90 q 233 459 26 134 q 439 800 439 783 q 422 807 439 807 l 61 807 q 47 821 47 807 q 57 882 47 826 q 70 948 67 939 q 85 957 72 957 q 164 952 112 957 q 241 947 216 947 l 623 947 q 637 936 635 947 q 648 835 648 895 q 433 494 648 831 q 218 146 218 157 q 231 142 221 142 q 532 150 427 142 q 593 157 545 151 q 653 163 631 163 q 662 155 662 163 z "},"[":{ha:498,x_min:86,x_max:481,o:"m 481 -118 q 479 -161 481 -132 q 478 -203 478 -190 q 464 -216 478 -216 q 370 -214 433 -216 q 277 -211 308 -211 q 193 -213 249 -211 q 110 -215 138 -215 q 90 -189 90 -215 q 97 73 90 -102 q 103 336 103 248 q 95 635 103 435 q 86 934 86 834 q 107 960 86 960 q 192 958 135 960 q 277 956 248 956 q 370 958 308 956 q 464 960 433 960 q 479 946 479 960 q 480 906 479 932 q 481 865 481 879 q 467 850 481 850 q 382 854 439 850 q 296 859 325 859 q 281 859 285 859 q 261 835 263 856 q 254 637 259 811 q 249 336 249 404 q 252 64 249 230 q 258 -93 253 12 q 269 -115 260 -111 q 294 -117 273 -117 q 381 -112 323 -117 q 467 -107 438 -107 q 481 -118 481 -107 z "},"\\":{ha:397,x_min:26,x_max:370,o:"m 370 -22 q 331 -56 370 -35 q 281 -75 295 -75 l 273 -75 q 221 97 258 -42 q 103 564 206 153 q 26 895 74 674 q 68 929 34 907 q 115 950 102 951 l 122 950 q 256 454 144 891 q 370 -22 370 14 z "},"]":{ha:498,x_min:18,x_max:412,o:"m 412 934 q 404 635 412 834 q 396 336 396 435 q 402 73 396 248 q 408 -189 408 -102 q 389 -215 408 -215 q 306 -213 361 -215 q 222 -211 250 -211 q 129 -214 191 -211 q 35 -216 66 -216 q 21 -203 21 -216 q 20 -161 21 -190 q 18 -118 18 -132 q 32 -107 18 -107 q 118 -112 60 -107 q 205 -117 176 -117 q 221 -117 217 -117 q 240 -93 238 -114 q 246 64 243 -66 q 250 336 250 230 q 244 637 250 404 q 237 835 244 703 q 227 857 236 852 q 202 859 223 859 q 117 854 174 859 q 32 850 60 850 q 18 865 18 850 q 19 906 18 879 q 20 946 20 932 q 35 960 20 960 q 129 958 66 960 q 222 956 191 956 q 307 958 250 956 q 392 960 363 960 q 412 934 412 960 z "},"^":{ha:648,x_min:26,x_max:618,o:"m 618 246 q 570 218 616 240 q 541 201 566 216 q 517 187 519 187 q 317 450 494 187 q 224 313 312 445 q 125 193 144 193 q 72 225 129 193 q 26 252 26 250 q 174 478 94 353 q 257 675 214 550 q 266 688 261 688 l 373 688 q 382 675 378 688 q 463 485 404 591 q 618 246 474 464 z "},_:{ha:604,x_min:-14,x_max:609,o:"m 609 -159 q 604 -271 609 -246 q 587 -282 602 -282 q 431 -279 535 -282 q 273 -275 326 -275 q 139 -279 229 -275 q 4 -282 49 -282 q -14 -267 -14 -282 q -7 -160 -14 -211 q 4 -147 -5 -147 q 151 -151 53 -147 q 298 -154 250 -154 q 449 -152 349 -154 q 599 -150 549 -150 q 609 -159 609 -150 z "},"`":{ha:485,x_min:36,x_max:392,o:"m 391 809 q 381 774 391 803 q 368 745 372 745 q 357 744 353 745 q 43 907 119 855 q 36 915 40 909 q 76 957 42 927 q 120 987 109 987 q 245 918 136 987 q 387 822 345 855 q 391 809 392 818 z "},a:{ha:770,x_min:29,x_max:728,o:"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 z "},b:{ha:770,x_min:50,x_max:742,o:"m 742 328 q 659 94 742 193 q 437 -12 570 -12 q 282 33 349 -12 q 228 78 255 56 q 218 37 220 76 q 207 -1 216 -1 l 64 -1 q 56 7 56 -1 q 57 20 56 7 q 68 435 68 128 q 57 803 68 560 q 50 939 50 958 q 68 958 50 956 q 140 961 92 959 q 179 966 150 962 q 218 970 203 970 q 229 954 229 970 q 226 884 229 931 q 222 812 222 836 q 219 706 222 777 q 216 600 216 635 q 226 574 216 574 q 236 582 231 574 q 433 675 311 675 q 661 570 574 675 q 742 328 742 471 m 589 334 q 538 476 589 414 q 404 542 484 542 q 269 477 323 542 q 216 334 216 416 q 269 189 216 250 q 406 125 323 125 q 539 191 486 125 q 589 334 589 252 z "},c:{ha:558,x_min:26,x_max:543,o:"m 543 615 q 527 549 543 600 q 505 497 511 497 q 444 524 475 511 q 376 538 413 538 q 237 476 293 538 q 182 330 182 414 q 237 187 182 248 q 376 125 294 125 q 466 147 422 125 q 505 170 510 170 q 524 113 513 170 q 534 41 534 61 q 455 0 534 20 q 357 -17 389 -17 q 121 87 217 -17 q 26 330 26 189 q 119 574 26 474 q 355 677 214 677 q 529 629 450 677 q 543 615 543 621 z "},d:{ha:772,x_min:28,x_max:721,o:"m 721 946 q 713 684 721 859 q 705 422 705 509 q 717 17 705 155 l 718 8 q 699 -1 718 1 q 663 -1 686 -2 q 636 1 634 1 q 606 -1 626 1 q 576 -3 587 -3 q 565 44 567 -3 q 560 92 564 92 q 550 83 556 90 q 336 -17 457 -17 q 111 87 199 -17 q 28 325 28 186 q 112 568 28 469 q 342 671 200 671 q 491 621 427 671 q 549 570 520 595 q 554 579 554 572 l 554 799 q 552 867 554 821 q 550 935 550 912 q 561 951 550 951 q 635 956 586 951 q 709 960 685 960 q 721 946 721 960 m 551 329 q 501 472 551 410 q 368 538 448 538 q 231 473 285 538 q 179 326 179 412 q 233 184 179 245 q 368 121 288 121 q 503 185 450 121 q 551 329 551 245 z "},e:{ha:669,x_min:26,x_max:644,o:"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 z "},f:{ha:408,x_min:12,x_max:419,o:"m 419 869 q 407 860 419 861 q 341 854 374 857 q 282 827 302 848 q 249 644 249 791 q 319 643 271 644 q 392 642 368 642 q 408 629 408 642 q 410 573 408 610 q 411 517 411 535 q 397 504 411 504 q 326 506 374 504 q 254 509 277 509 l 254 306 q 258 162 254 258 q 261 18 261 66 q 248 0 261 0 l 123 0 q 106 21 106 0 l 106 488 q 64 505 106 506 q 17 509 20 505 q 15 534 15 511 q 14 578 15 549 q 12 623 12 608 q 98 642 12 637 q 96 712 96 685 q 139 888 96 832 q 250 966 177 938 q 387 992 316 992 q 396 985 393 992 q 408 927 397 983 q 419 869 419 871 z "},g:{ha:722,x_min:26,x_max:667,o:"m 667 632 q 665 388 667 551 q 664 143 664 224 q 595 -95 664 -18 q 363 -176 522 -176 q 114 -118 209 -176 q 99 -102 99 -109 q 119 -1 99 -109 q 129 10 121 10 q 138 7 132 10 q 342 -52 239 -52 q 453 -22 409 -52 q 504 77 504 12 q 501 140 504 91 q 310 49 426 49 q 104 139 184 49 q 26 353 26 226 q 101 572 26 481 q 307 668 180 668 q 485 582 419 668 q 500 568 496 568 q 506 580 506 568 q 505 608 506 589 q 503 637 503 627 q 511 677 503 677 q 585 665 518 677 q 657 650 651 652 q 667 632 667 646 m 504 353 q 463 481 504 429 q 343 539 417 539 q 224 481 270 539 q 183 353 183 428 q 225 225 183 279 q 343 167 271 167 q 461 225 415 167 q 504 353 504 279 z "},h:{ha:722,x_min:47,x_max:661,o:"m 661 24 q 647 -1 661 -1 q 583 -1 626 -1 q 519 0 541 0 q 503 22 503 0 q 505 121 503 55 q 507 220 507 186 q 505 314 507 251 q 503 410 503 378 q 387 532 503 532 q 290 494 350 532 q 225 421 225 454 l 225 18 q 211 -1 225 -1 q 148 -1 190 -1 q 85 0 106 0 q 69 18 69 0 l 69 346 q 60 686 69 426 q 49 925 59 767 q 47 936 47 933 q 56 950 47 947 q 132 954 67 954 q 175 959 146 954 q 216 964 203 964 q 225 951 225 964 q 220 760 225 888 q 215 568 215 632 q 220 552 215 553 q 310 623 255 581 q 450 664 376 664 q 626 588 578 664 q 661 412 661 532 q 660 347 661 391 q 659 282 659 303 q 660 153 659 239 q 661 24 661 66 z "},i:{ha:306,x_min:58,x_max:245,o:"m 245 811 q 153 728 245 728 q 58 811 58 728 q 87 873 58 848 q 153 896 115 896 q 218 872 191 896 q 245 811 245 848 m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 z "},j:{ha:307,x_min:-31,x_max:250,o:"m 250 812 q 155 730 250 730 q 90 751 115 730 q 61 812 61 773 q 90 875 61 850 q 155 897 117 897 q 221 875 194 897 q 250 812 250 850 m 241 629 q 237 495 241 585 q 233 359 233 405 q 235 211 233 310 q 236 61 236 111 q 60 -185 236 -134 q -14 -200 9 -200 q -27 -186 -24 -200 q -28 -157 -30 -176 q -26 -135 -26 -132 q -29 -108 -26 -126 q -31 -82 -31 -90 q -22 -68 -31 -70 q 64 -37 45 -56 q 87 54 87 -14 q 85 200 87 103 q 82 346 82 297 q 66 615 82 442 l 66 623 q 78 635 66 632 q 152 642 82 636 q 231 647 222 647 q 241 629 241 647 z "},k:{ha:760,x_min:68,x_max:736,o:"m 736 465 q 572 229 736 289 q 640 104 572 195 q 708 14 708 14 q 640 0 708 3 q 573 -2 595 -2 q 513 18 525 -2 q 412 176 481 73 q 265 186 404 189 l 239 186 l 239 18 q 224 -3 239 -3 q 160 -2 202 -3 q 96 -1 117 -1 q 81 25 81 -1 l 81 447 q 74 694 81 530 q 68 942 68 859 q 81 956 68 954 q 149 958 103 956 q 189 963 158 959 q 228 966 213 966 q 237 950 237 966 q 234 841 237 913 q 231 732 231 768 l 231 557 q 237 543 231 543 q 286 583 253 556 q 503 671 399 671 q 667 619 603 671 q 736 465 736 563 m 572 433 q 447 530 572 530 q 236 406 353 530 l 236 304 q 369 294 291 294 q 503 324 448 294 q 572 433 572 361 z "},l:{ha:306,x_min:66,x_max:241,o:"m 241 941 l 240 932 q 225 498 225 680 q 228 257 225 418 q 231 16 231 96 q 220 0 231 0 l 90 0 q 78 16 78 0 q 79 257 78 96 q 81 498 81 418 q 74 719 81 572 q 66 938 66 865 q 81 951 66 951 q 117 949 93 951 q 154 947 142 947 q 192 949 167 947 q 229 951 217 951 q 241 941 241 951 z "},m:{ha:1165,x_min:47,x_max:1100,o:"m 1100 25 q 1084 -1 1100 -1 q 1054 1 1074 -1 q 1022 3 1033 3 q 987 1 1010 3 q 953 0 964 0 q 939 32 939 0 q 941 125 939 63 q 943 218 943 187 q 942 410 943 390 q 913 506 937 479 q 819 534 887 534 q 723 494 777 534 q 665 410 667 451 q 663 216 663 357 q 665 117 663 183 q 668 17 668 50 q 656 -1 668 -1 q 620 1 644 -1 q 585 3 597 3 q 553 1 574 3 q 521 0 532 0 q 507 20 507 0 q 509 118 507 52 q 511 216 511 183 l 511 379 q 493 488 511 456 q 395 534 467 534 q 293 498 352 534 q 228 419 228 459 l 228 221 q 229 120 228 187 q 229 20 229 53 q 214 0 229 0 l 87 0 q 74 18 74 0 q 75 183 74 73 q 75 349 75 294 q 49 596 75 473 q 47 610 47 605 q 53 621 47 619 q 126 631 78 623 q 193 646 149 637 l 199 646 q 214 598 207 646 q 227 551 221 551 q 260 581 227 551 q 340 635 300 615 q 456 665 398 665 q 654 538 612 665 q 759 627 696 592 q 890 665 825 665 q 1064 592 1016 665 q 1099 420 1099 538 q 1097 351 1099 398 q 1096 282 1096 304 q 1098 154 1096 239 q 1100 25 1100 68 z "},n:{ha:726,x_min:43,x_max:667,o:"m 667 14 q 653 -1 667 -1 q 586 -1 631 -1 q 519 0 542 0 q 507 20 507 0 q 509 121 507 53 q 511 222 511 189 q 511 303 511 250 q 510 385 510 357 q 488 494 510 462 q 387 532 460 532 q 293 494 353 532 q 229 422 229 454 l 229 16 q 216 -1 229 -1 q 151 -1 195 -1 q 86 0 108 0 q 72 16 72 0 q 74 176 72 69 q 75 338 75 283 q 45 604 75 482 q 43 613 43 610 q 52 623 43 620 q 129 635 56 623 q 205 647 202 647 q 211 636 210 647 q 227 551 214 594 q 319 621 262 579 q 457 664 391 664 q 631 590 585 664 q 666 414 666 536 q 665 350 666 393 q 664 285 664 307 q 665 149 664 239 q 667 14 667 59 z "},o:{ha:710,x_min:26,x_max:684,o:"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 z "},p:{ha:783,x_min:50,x_max:747,o:"m 747 326 q 661 88 747 189 q 435 -18 570 -18 q 288 34 351 -18 q 231 87 259 60 q 225 77 227 85 q 224 1 224 73 l 224 -191 q 208 -212 224 -212 q 85 -210 104 -212 q 69 -192 69 -208 q 71 68 69 -105 q 72 329 72 242 q 52 628 72 488 q 50 639 50 636 q 57 648 50 646 q 132 656 83 650 q 207 668 199 668 q 222 627 218 668 q 225 574 224 600 q 229 563 225 568 q 240 572 234 566 q 432 669 335 669 q 659 564 566 669 q 747 326 747 463 m 589 329 q 538 472 589 410 q 404 538 484 538 q 275 470 326 538 q 229 328 229 409 q 277 184 229 245 q 410 118 329 118 q 540 186 487 118 q 589 329 589 250 z "},q:{ha:778,x_min:37,x_max:728,o:"m 728 642 q 726 629 728 640 q 701 241 701 500 q 706 27 701 170 q 710 -187 710 -116 q 696 -204 710 -204 q 629 -207 673 -204 q 563 -209 585 -209 q 555 -193 555 -209 l 555 75 q 551 86 555 86 q 538 75 545 83 q 340 -17 460 -17 q 121 92 210 -17 q 37 326 37 193 q 118 566 37 466 q 340 673 204 673 q 502 624 437 673 q 555 572 528 598 q 559 663 559 574 q 571 669 559 669 q 720 652 626 669 q 728 642 728 650 m 557 330 q 510 477 557 417 q 375 542 459 542 q 241 477 294 542 q 191 334 191 416 q 242 189 191 249 q 379 125 296 125 q 513 186 464 125 q 557 330 557 243 z "},r:{ha:463,x_min:41,x_max:457,o:"m 457 637 q 447 501 457 562 q 433 486 445 486 q 390 489 419 486 q 347 492 361 492 q 237 444 261 492 q 223 322 223 414 l 223 248 q 226 132 223 210 q 229 17 229 55 q 214 -1 229 -1 q 150 -1 193 -1 q 86 0 107 0 q 71 17 71 0 q 72 182 71 72 q 74 349 74 293 q 43 618 74 516 q 41 626 41 623 q 50 637 41 634 q 121 646 75 640 q 189 659 194 659 q 203 619 199 659 q 215 579 206 579 q 218 581 216 579 q 274 616 246 598 q 336 643 304 634 q 404 651 363 651 q 457 637 457 651 z "},s:{ha:415,x_min:31,x_max:387,o:"m 387 209 q 306 47 387 108 q 127 -9 233 -9 q 81 -7 87 -9 q 70 26 70 -1 q 66 71 70 41 q 62 115 62 101 q 75 127 62 124 q 100 127 83 129 q 120 125 121 125 q 248 203 248 125 q 192 272 248 241 q 87 334 100 322 q 31 460 31 382 q 107 618 31 562 q 282 669 176 669 q 296 661 292 669 q 313 606 300 652 q 326 550 326 559 q 313 541 326 543 q 225 529 269 534 q 173 472 173 515 q 228 410 173 441 q 331 345 309 365 q 387 209 387 292 z "},t:{ha:475,x_min:5,x_max:447,o:"m 447 125 q 444 84 447 110 q 440 43 441 52 q 438 28 439 31 q 425 18 435 23 q 250 -8 370 -8 q 92 136 92 -8 q 94 309 92 193 q 97 482 97 425 q 69 512 97 510 q 20 513 44 512 q 5 568 5 516 q 8 610 5 588 q 30 629 10 626 q 63 630 47 629 q 94 658 94 631 q 93 741 94 685 q 91 824 91 796 q 110 873 91 873 q 237 852 116 873 q 253 838 253 850 q 249 748 253 808 q 244 659 244 688 q 262 639 244 639 l 425 639 q 437 631 437 639 q 434 605 437 623 q 432 578 432 587 q 433 547 432 568 q 433 515 433 526 q 414 503 433 503 q 332 506 387 503 q 250 510 277 510 q 242 471 245 510 q 239 336 239 423 l 239 235 q 250 154 239 177 q 317 119 266 119 q 378 128 338 119 q 439 137 419 137 q 447 125 447 137 z "},u:{ha:766,x_min:65,x_max:697,o:"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 z "},v:{ha:703,x_min:45,x_max:654,o:"m 654 449 q 648 338 654 353 q 538 159 638 307 q 416 0 436 8 q 359 -4 407 -4 q 300 0 314 -4 q 176 153 281 6 q 61 328 73 296 q 45 460 45 370 q 46 543 45 488 q 47 627 47 599 q 62 642 47 642 q 129 640 85 642 q 196 637 174 637 q 208 624 208 637 q 205 560 208 602 q 203 496 203 517 q 210 382 203 433 q 278 256 213 356 q 359 155 344 155 q 433 254 374 155 q 496 375 492 350 q 501 492 501 409 q 497 559 501 514 q 492 626 492 604 q 503 636 492 636 q 568 638 525 636 q 633 641 612 641 q 654 449 654 641 z "},w:{ha:1013,x_min:35,x_max:979,o:"m 979 486 q 965 326 979 359 q 865 148 946 281 q 758 -1 777 3 q 704 -3 753 -3 q 665 -1 671 -3 q 504 232 644 4 q 426 104 465 168 q 345 -1 362 3 q 300 -3 339 -3 q 254 -1 260 -3 q 148 146 233 3 q 50 326 67 281 q 35 486 35 367 q 41 623 35 586 q 58 637 45 637 q 119 636 79 637 q 180 635 160 635 q 193 614 193 635 q 192 569 193 599 q 191 524 191 538 q 197 357 191 406 q 304 178 203 314 q 318 161 316 161 q 330 176 320 161 q 431 351 418 304 q 439 497 439 384 q 436 566 439 520 q 433 633 433 611 q 446 648 433 648 l 575 648 q 586 631 586 648 q 584 565 586 609 q 582 500 582 522 q 586 361 582 380 q 650 255 590 342 q 718 167 709 167 q 730 183 720 167 q 823 358 817 314 q 829 482 829 395 q 825 556 829 508 q 821 626 821 605 q 835 636 821 636 q 895 637 855 636 q 956 639 935 639 q 974 625 970 639 q 979 486 979 599 z "},x:{ha:603,x_min:26,x_max:578,o:"m 578 12 q 564 -1 578 3 q 534 -1 553 -3 q 510 0 507 0 q 446 12 456 0 q 319 193 404 74 q 301 215 303 215 q 225 111 295 215 q 139 3 154 5 q 43 0 124 0 q 26 12 26 0 l 26 86 q 117 203 26 94 q 207 323 207 312 q 117 441 207 333 q 26 561 26 550 l 26 633 q 43 647 26 647 q 94 644 60 647 q 144 642 127 642 q 161 632 154 642 q 283 450 201 570 q 301 428 300 428 q 316 446 303 428 q 446 635 355 499 q 461 644 452 644 q 511 646 478 644 q 561 647 545 647 q 578 633 578 647 l 578 562 q 487 441 578 550 q 397 322 397 333 q 487 206 397 315 q 578 85 578 97 l 578 12 z "},y:{ha:661,x_min:24,x_max:640,o:"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 z "},z:{ha:585,x_min:21,x_max:572,o:"m 572 129 q 562 81 572 125 q 550 21 551 33 q 538 -3 547 -3 q 474 0 514 -3 q 411 4 429 3 q 281 5 366 5 q 135 0 215 5 q 49 -7 35 -7 q 31 5 35 -7 q 21 81 21 38 q 22 99 21 87 q 22 115 22 110 q 37 138 22 125 q 182 292 52 151 q 368 503 248 360 l 69 503 q 58 517 58 503 q 67 575 58 536 q 75 633 75 614 q 94 642 75 642 q 208 638 132 642 q 321 635 283 635 q 530 632 507 635 q 547 618 547 630 q 539 503 547 515 q 422 369 532 493 q 207 129 351 288 q 557 135 433 135 q 572 129 572 135 z "},"{":{ha:473,x_min:33,x_max:457,o:"m 457 -204 q 447 -210 457 -207 q 336 -221 410 -221 q 179 -198 231 -221 q 102 -71 102 -163 q 123 31 102 -37 q 151 136 148 105 q 155 201 155 174 q 114 298 155 276 q 46 315 83 315 q 33 329 33 315 q 36 351 33 336 q 39 372 39 365 q 36 393 39 379 q 33 414 33 407 q 62 431 33 425 q 114 444 102 437 q 155 544 155 469 q 128 681 155 591 q 102 814 102 770 q 179 941 102 906 q 336 964 231 964 q 447 954 422 964 q 457 940 457 950 q 454 894 457 926 q 450 846 450 863 q 437 833 450 833 q 383 840 425 833 q 318 847 341 847 q 258 791 258 847 q 277 685 258 755 q 297 579 297 615 q 263 438 297 492 q 140 372 222 372 q 297 174 297 372 q 277 57 297 135 q 257 -56 257 -22 q 326 -111 257 -111 q 437 -93 376 -111 q 444 -92 441 -92 q 452 -106 450 -92 q 453 -135 454 -117 q 452 -157 452 -159 q 454 -180 452 -165 q 457 -204 457 -196 z "},"|":{ha:340,x_min:107,x_max:232,o:"m 232 -64 q 224 -79 232 -77 q 119 -95 150 -95 q 114 -82 114 -95 l 114 439 q 111 685 114 521 q 107 930 107 849 q 181 963 107 965 l 211 962 q 225 945 224 962 q 225 873 227 918 q 223 802 223 813 l 224 456 q 228 196 224 380 q 232 -64 232 25 z "},"}":{ha:473,x_min:21,x_max:444,o:"m 444 329 q 432 315 444 315 q 364 298 394 315 q 323 201 323 276 q 326 136 323 174 q 354 31 330 105 q 376 -71 376 -37 q 298 -198 376 -163 q 142 -221 247 -221 q 31 -210 68 -221 q 21 -204 21 -207 q 24 -180 21 -196 q 26 -157 26 -165 q 26 -131 26 -148 q 25 -104 25 -113 q 34 -92 25 -92 q 40 -93 35 -92 q 151 -111 117 -111 q 220 -56 220 -111 q 200 57 220 -22 q 180 174 180 135 q 338 372 180 372 q 215 438 256 372 q 180 579 180 492 q 200 685 180 615 q 220 791 220 755 q 160 847 220 847 q 95 840 137 847 q 40 833 54 833 q 28 846 28 833 q 24 894 28 863 q 21 940 21 926 q 31 954 21 950 q 142 964 56 964 q 298 941 246 964 q 376 814 376 906 q 350 681 376 770 q 323 544 323 591 q 364 444 323 469 q 415 431 376 437 q 444 414 444 425 q 441 393 444 407 q 439 372 439 379 q 441 351 439 365 q 444 329 444 336 z "},"~":{ha:676,x_min:22,x_max:665,o:"m 665 419 q 570 350 665 405 q 440 309 496 309 q 342 334 398 309 q 258 359 286 359 q 177 325 232 359 q 119 290 123 290 q 77 336 115 290 q 27 390 33 385 q 22 399 22 395 q 125 472 22 411 q 246 515 197 515 q 334 488 284 515 q 416 461 384 461 q 515 498 454 461 q 576 535 576 535 q 624 480 582 535 q 665 419 665 426 z "},\u00C4:{ha:916,x_min:6,x_max:909,o:"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 668 1017 q 644 1005 668 1005 q 583 1004 623 1005 q 524 1004 543 1004 q 507 1023 507 1004 l 506 1161 q 519 1178 506 1178 q 555 1176 531 1178 q 591 1174 579 1174 q 621 1175 602 1174 q 650 1175 641 1175 q 667 1164 667 1175 q 664 1126 667 1152 q 661 1088 661 1101 q 665 1052 661 1076 q 668 1017 668 1028 m 391 1013 q 371 1004 391 1006 q 332 1004 357 1002 q 304 1006 302 1006 q 273 1004 294 1006 q 242 1003 252 1003 q 229 1016 229 1003 q 231 1048 229 1027 q 232 1080 232 1069 q 230 1121 232 1093 q 228 1162 228 1148 q 244 1177 228 1177 q 306 1176 264 1177 q 369 1175 348 1175 q 389 1161 389 1175 q 387 1124 389 1149 q 385 1086 385 1099 q 388 1050 385 1074 q 391 1013 391 1025 z "},\u00C5:{ha:916,x_min:6,x_max:909,o:"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 721 0 q 632 207 663 205 q 493 208 608 208 l 399 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 310 819 231 606 q 267 930 267 873 q 320 1058 267 1006 q 449 1111 373 1111 q 577 1058 524 1111 q 631 930 631 1006 q 590 827 631 879 q 766 382 635 716 q 909 8 909 15 m 522 930 q 501 986 522 963 q 449 1010 480 1010 q 396 986 417 1010 q 375 930 375 963 q 397 879 375 901 q 447 857 418 857 q 500 878 478 857 q 522 930 522 899 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 z "},\u00C7:{ha:823,x_min:39,x_max:819,o:"m 819 157 q 806 134 819 149 q 478 -20 673 -20 q 153 129 275 -20 q 39 475 39 267 q 155 822 39 682 q 481 972 278 972 q 799 833 686 972 q 810 810 810 819 q 774 742 810 798 q 730 685 738 685 q 689 718 722 685 q 614 779 649 759 q 485 812 555 812 q 276 710 351 812 q 210 479 210 618 q 275 247 210 340 q 484 142 350 142 q 612 175 550 142 q 694 237 652 197 q 733 270 730 270 q 778 216 737 270 q 819 157 819 162 m 565 -77 q 516 -219 565 -165 q 377 -275 465 -275 q 309 -254 352 -275 q 264 -213 264 -233 q 298 -170 264 -211 q 336 -128 333 -128 q 338 -129 337 -128 q 399 -158 368 -158 q 443 -138 424 -158 q 461 -93 461 -117 q 430 -18 461 -52 l 522 -20 q 565 -77 536 -38 z "},\u00C9:{ha:747,x_min:68,x_max:713,o:"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 584 1151 q 434 1048 574 1123 q 265 974 298 974 q 244 1008 253 974 q 237 1053 237 1034 q 250 1065 237 1059 q 482 1213 362 1121 q 492 1219 485 1215 q 501 1213 496 1217 q 576 1160 530 1188 q 584 1151 580 1158 z "},\u00D1:{ha:997,x_min:71,x_max:924,o:"m 924 937 q 918 701 924 859 q 913 465 913 544 q 914 244 913 391 q 916 22 916 96 q 899 0 916 0 q 868 2 888 0 q 838 4 848 4 q 804 2 827 4 q 771 0 782 0 q 742 22 759 0 q 298 611 595 220 q 244 677 252 671 q 237 650 237 677 q 241 336 237 545 q 244 22 244 127 q 231 0 244 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 14 71 0 q 78 238 71 88 q 85 464 85 389 q 79 760 85 546 q 72 926 77 815 l 71 935 q 87 946 71 945 q 157 949 132 947 q 193 954 166 949 q 228 958 215 958 q 249 939 234 958 q 726 301 405 724 q 753 271 741 283 q 758 401 758 299 q 751 665 758 489 q 745 929 745 842 q 758 951 745 951 q 795 949 770 951 q 832 947 820 947 q 871 949 845 947 q 909 951 897 951 q 924 937 924 951 m 725 1037 q 667 989 725 1021 q 581 957 608 957 q 500 981 541 957 q 439 1004 459 1004 q 391 982 416 1004 q 362 960 366 960 q 349 966 354 960 q 289 1024 289 1025 q 290 1029 289 1026 q 348 1084 300 1057 q 425 1109 393 1109 q 508 1086 458 1109 q 579 1064 558 1064 q 627 1088 592 1064 q 668 1112 663 1112 l 675 1109 q 725 1037 725 1058 z "},\u00D6:{ha:1007,x_min:41,x_max:966,o:"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 713 1032 q 688 1021 713 1021 q 628 1020 668 1021 q 568 1019 588 1019 q 551 1038 551 1019 l 551 1177 q 564 1194 551 1194 q 600 1192 576 1194 q 636 1190 624 1190 q 666 1190 646 1190 q 695 1191 686 1191 q 711 1180 711 1191 q 709 1142 711 1167 q 706 1103 706 1116 q 709 1067 706 1091 q 713 1032 713 1044 m 435 1029 q 416 1019 435 1021 q 376 1019 401 1018 q 349 1021 347 1021 q 318 1020 338 1021 q 287 1019 297 1019 q 274 1031 274 1019 q 275 1063 274 1042 q 277 1095 277 1084 q 275 1136 277 1109 q 273 1177 273 1164 q 289 1192 273 1192 q 351 1192 309 1192 q 413 1191 393 1191 q 434 1177 434 1191 q 432 1139 434 1164 q 429 1102 429 1114 q 432 1065 429 1090 q 435 1029 435 1041 z "},\u00DC:{ha:917,x_min:68,x_max:848,o:"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 675 1032 q 650 1021 675 1021 q 590 1020 630 1021 q 530 1019 550 1019 q 513 1038 513 1019 l 513 1177 q 526 1194 513 1194 q 562 1192 538 1194 q 598 1190 586 1190 q 628 1190 608 1190 q 657 1191 648 1191 q 673 1180 673 1191 q 671 1142 673 1167 q 668 1103 668 1116 q 671 1067 668 1091 q 675 1032 675 1044 m 397 1029 q 378 1019 397 1021 q 338 1019 363 1018 q 311 1021 309 1021 q 280 1020 300 1021 q 249 1019 259 1019 q 236 1031 236 1019 q 237 1063 236 1042 q 239 1095 239 1084 q 237 1136 239 1109 q 235 1177 235 1164 q 251 1192 235 1192 q 313 1192 271 1192 q 375 1191 355 1191 q 396 1177 396 1191 q 394 1139 396 1164 q 391 1102 391 1114 q 394 1065 391 1090 q 397 1029 397 1041 z "},\u00E1:{ha:770,x_min:29,x_max:728,o:"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 608 897 q 458 793 597 869 q 289 720 321 720 q 268 753 277 720 q 261 798 261 780 q 274 811 261 805 q 506 958 386 867 q 516 964 509 961 q 525 958 519 963 q 600 905 554 934 q 608 897 604 903 z "},\u00E0:{ha:770,x_min:29,x_max:728,o:"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 532 797 q 523 762 532 791 q 510 733 513 733 q 498 732 495 733 q 184 895 261 843 q 178 903 182 897 q 217 945 184 915 q 262 975 251 975 q 387 906 278 975 q 528 810 486 843 q 532 797 534 806 z "},\u00E2:{ha:770,x_min:29,x_max:728,o:"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 568 768 q 533 749 566 765 q 495 733 501 733 q 368 844 475 733 q 311 783 361 840 q 250 734 269 734 q 211 750 244 734 q 177 769 177 767 q 268 878 215 812 q 322 970 307 936 q 337 981 327 981 l 408 981 q 420 970 417 981 q 473 878 431 935 q 568 768 520 824 z "},\u00E4:{ha:770,x_min:29,x_max:728,o:"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 581 747 q 556 735 581 735 q 496 734 536 735 q 436 734 456 734 q 419 753 419 734 l 418 891 q 432 908 418 908 q 468 906 444 908 q 504 904 492 904 q 534 905 514 904 q 563 905 553 905 q 579 895 579 905 q 576 856 579 882 q 574 818 574 831 q 577 782 574 806 q 581 747 581 758 m 303 743 q 283 734 303 736 q 244 734 269 732 q 216 736 214 736 q 185 734 206 736 q 155 733 165 733 q 142 746 142 733 q 143 778 142 757 q 144 810 144 799 q 142 851 144 823 q 140 892 140 878 q 157 907 140 907 q 219 906 177 907 q 281 905 260 905 q 302 891 302 905 q 299 854 302 879 q 297 817 297 829 q 300 780 297 804 q 303 743 303 755 z "},\u00E3:{ha:770,x_min:29,x_max:728,o:"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 590 817 q 532 769 590 801 q 446 737 473 737 q 365 761 406 737 q 304 785 324 785 q 256 762 281 785 q 227 740 231 740 q 214 746 219 740 q 154 804 154 806 q 155 810 154 806 q 213 864 165 838 q 290 889 258 889 q 373 867 323 889 q 444 844 423 844 q 492 868 457 844 q 533 892 528 892 l 540 889 q 590 817 590 838 z "},\u00E5:{ha:770,x_min:29,x_max:728,o:"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 542 884 q 494 771 542 818 q 379 725 446 725 q 266 771 313 725 q 218 884 218 818 q 265 998 218 951 q 379 1046 312 1046 q 494 998 447 1046 q 542 884 542 951 m 461 884 q 438 945 461 920 q 379 971 415 971 q 320 945 344 971 q 297 884 297 920 q 321 826 297 851 q 378 802 346 802 q 436 826 412 802 q 461 884 461 850 z "},\u00E7:{ha:558,x_min:26,x_max:543,o:"m 543 615 q 527 549 543 600 q 505 497 511 497 q 444 524 475 511 q 376 538 413 538 q 237 476 293 538 q 182 330 182 414 q 237 187 182 248 q 376 125 294 125 q 466 147 422 125 q 505 170 510 170 q 524 113 513 170 q 534 41 534 61 q 455 0 534 20 q 357 -17 389 -17 q 121 87 217 -17 q 26 330 26 189 q 119 574 26 474 q 355 677 214 677 q 529 629 450 677 q 543 615 543 621 m 427 -68 q 378 -211 427 -157 q 239 -267 327 -267 q 171 -246 214 -267 q 125 -205 125 -224 q 160 -161 125 -203 q 198 -120 195 -120 q 200 -121 199 -120 q 261 -150 230 -150 q 304 -130 286 -150 q 323 -85 323 -109 q 292 -10 323 -44 l 383 -12 q 427 -68 398 -30 z "},\u00E9:{ha:669,x_min:26,x_max:644,o:"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 548 897 q 398 793 538 869 q 229 720 262 720 q 208 753 217 720 q 201 798 201 780 q 214 811 201 805 q 446 958 326 867 q 456 964 449 961 q 465 958 460 963 q 541 905 494 934 q 548 897 544 903 z "},\u00E8:{ha:669,x_min:26,x_max:644,o:"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 496 797 q 487 762 496 791 q 474 733 477 733 q 463 732 459 733 q 149 895 225 843 q 142 903 146 897 q 181 945 148 915 q 226 975 215 975 q 351 906 242 975 q 492 810 450 843 q 496 797 498 806 z "},\u00EA:{ha:669,x_min:26,x_max:644,o:"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 528 768 q 493 749 526 765 q 455 733 461 733 q 328 844 435 733 q 271 783 321 840 q 210 734 229 734 q 171 750 204 734 q 137 769 137 767 q 228 878 175 812 q 282 970 267 936 q 297 981 287 981 l 368 981 q 380 970 377 981 q 433 878 391 935 q 528 768 480 824 z "},\u00EB:{ha:669,x_min:26,x_max:644,o:"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 558 747 q 534 735 558 735 q 473 734 513 735 q 414 734 433 734 q 397 753 397 734 l 396 891 q 410 908 396 908 q 445 906 421 908 q 481 904 469 904 q 511 905 492 904 q 541 905 531 905 q 557 895 557 905 q 554 856 557 882 q 551 818 551 831 q 555 782 551 806 q 558 747 558 758 m 281 743 q 261 734 281 736 q 222 734 247 732 q 194 736 192 736 q 163 734 184 736 q 132 733 142 733 q 119 746 119 733 q 121 778 119 757 q 122 810 122 799 q 120 851 122 823 q 118 892 118 878 q 134 907 118 907 q 196 906 155 907 q 259 905 238 905 q 279 891 279 905 q 277 854 279 879 q 275 817 275 829 q 278 780 275 804 q 281 743 281 755 z "},\u00ED:{ha:306,x_min:15,x_max:361,o:"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 361 897 q 212 793 351 869 q 43 720 75 720 q 22 753 31 720 q 15 798 15 780 q 28 811 15 805 q 260 958 140 867 q 270 964 262 961 q 279 958 273 963 q 354 905 308 934 q 361 897 357 903 z "},\u00EC:{ha:306,x_min:-66,x_max:290,o:"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 289 797 q 279 762 289 791 q 267 733 270 733 q 255 732 252 733 q -59 895 18 843 q -66 903 -62 897 q -26 945 -60 915 q 18 975 7 975 q 143 906 35 975 q 285 810 243 843 q 289 797 290 806 z "},\u00EE:{ha:306,x_min:-45,x_max:346,o:"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 346 764 q 312 745 344 761 q 273 729 279 729 q 146 840 254 729 q 90 779 140 836 q 28 730 47 730 q -11 746 22 730 q -45 765 -45 763 q 46 873 -7 808 q 100 966 85 932 q 115 977 105 977 l 186 977 q 199 966 195 977 q 252 873 210 931 q 346 764 298 820 z "},\u00EF:{ha:306,x_min:-71,x_max:370,o:"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 370 760 q 345 748 370 748 q 285 747 325 748 q 225 747 245 747 q 208 766 208 747 l 208 904 q 221 921 208 921 q 257 919 233 921 q 293 917 281 917 q 323 918 303 917 q 352 918 342 918 q 368 907 368 918 q 366 869 368 895 q 363 831 363 844 q 366 795 363 819 q 370 760 370 771 m 92 756 q 73 747 92 749 q 33 747 58 745 q 5 749 3 749 q -25 747 -5 749 q -56 746 -46 746 q -69 759 -69 746 q -68 791 -69 770 q -66 823 -66 812 q -68 864 -66 836 q -71 905 -71 891 q -54 920 -71 920 q 8 919 -34 920 q 70 918 50 918 q 91 904 91 918 q 89 867 91 892 q 86 829 86 842 q 89 793 86 817 q 92 756 92 768 z "},\u00F1:{ha:726,x_min:43,x_max:667,o:"m 667 14 q 653 -1 667 -1 q 586 -1 631 -1 q 519 0 542 0 q 507 20 507 0 q 509 121 507 53 q 511 222 511 189 q 511 303 511 250 q 510 385 510 357 q 488 494 510 462 q 387 532 460 532 q 293 494 353 532 q 229 422 229 454 l 229 16 q 216 -1 229 -1 q 151 -1 195 -1 q 86 0 108 0 q 72 16 72 0 q 74 176 72 69 q 75 338 75 283 q 45 604 75 482 q 43 613 43 610 q 52 623 43 620 q 129 635 56 623 q 205 647 202 647 q 211 636 210 647 q 227 551 214 594 q 319 621 262 579 q 457 664 391 664 q 631 590 585 664 q 666 414 666 536 q 665 350 666 393 q 664 285 664 307 q 665 149 664 239 q 667 14 667 59 m 581 810 q 522 762 581 794 q 436 730 464 730 q 355 754 396 730 q 294 778 315 778 q 246 755 271 778 q 218 733 221 733 q 204 739 210 733 q 144 798 144 799 q 146 803 144 800 q 203 857 156 831 q 281 882 249 882 q 364 860 314 882 q 435 838 414 838 q 483 861 448 838 q 524 885 518 885 l 530 882 q 581 810 581 831 z "},\u00F3:{ha:710,x_min:26,x_max:684,o:"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 562 897 q 412 793 551 869 q 243 720 275 720 q 222 753 231 720 q 215 798 215 780 q 228 811 215 805 q 460 958 340 867 q 470 964 463 961 q 479 958 473 963 q 554 905 508 934 q 562 897 557 903 z "},\u00F2:{ha:710,x_min:26,x_max:684,o:"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 471 797 q 462 762 471 791 q 449 733 452 733 q 437 732 434 733 q 123 895 200 843 q 117 903 121 897 q 156 945 123 915 q 201 975 190 975 q 326 906 217 975 q 467 810 425 843 q 471 797 473 806 z "},\u00F4:{ha:710,x_min:26,x_max:684,o:"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 547 768 q 513 749 545 765 q 475 733 481 733 q 348 844 455 733 q 291 783 341 840 q 229 734 248 734 q 190 750 224 734 q 157 769 157 767 q 248 878 195 812 q 302 970 286 936 q 317 981 307 981 l 388 981 q 400 970 397 981 q 453 878 411 935 q 547 768 500 824 z "},\u00F6:{ha:710,x_min:26,x_max:684,o:"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 574 747 q 549 735 574 735 q 489 734 529 735 q 429 734 449 734 q 412 753 412 734 l 412 891 q 425 908 412 908 q 461 906 437 908 q 497 904 485 904 q 527 905 507 904 q 556 905 547 905 q 572 895 572 905 q 570 856 572 882 q 567 818 567 831 q 570 782 567 806 q 574 747 574 758 m 296 743 q 277 734 296 736 q 237 734 262 732 q 210 736 208 736 q 179 734 199 736 q 148 733 158 733 q 135 746 135 733 q 136 778 135 757 q 138 810 138 799 q 136 851 138 823 q 134 892 134 878 q 150 907 134 907 q 212 906 170 907 q 274 905 254 905 q 295 891 295 905 q 293 854 295 879 q 290 817 290 829 q 293 780 290 804 q 296 743 296 755 z "},\u00F5:{ha:710,x_min:26,x_max:684,o:"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 571 817 q 513 769 571 801 q 427 737 454 737 q 346 761 387 737 q 285 785 305 785 q 237 762 262 785 q 208 740 212 740 q 195 746 200 740 q 135 804 135 806 q 136 810 135 806 q 194 864 146 838 q 271 889 239 889 q 354 867 304 889 q 425 844 404 844 q 473 868 438 844 q 514 892 509 892 l 521 889 q 571 817 571 838 z "},\u00FA:{ha:766,x_min:65,x_max:697,o:"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 604 897 q 454 793 593 869 q 285 720 317 720 q 264 753 273 720 q 257 798 257 780 q 270 811 257 805 q 502 958 382 867 q 512 964 505 961 q 521 958 515 963 q 596 905 550 934 q 604 897 600 903 z "},\u00F9:{ha:766,x_min:65,x_max:697,o:"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 526 797 q 516 762 526 791 q 503 733 507 733 q 492 732 488 733 q 178 895 254 843 q 171 903 175 897 q 211 945 177 915 q 255 975 244 975 q 380 906 271 975 q 522 810 479 843 q 526 797 527 806 z "},\u00FB:{ha:766,x_min:65,x_max:697,o:"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 587 768 q 553 749 585 765 q 515 733 521 733 q 388 844 495 733 q 331 783 381 840 q 269 734 288 734 q 230 750 264 734 q 197 769 197 767 q 288 878 235 812 q 342 970 326 936 q 357 981 347 981 l 428 981 q 440 970 437 981 q 493 878 451 935 q 587 768 540 824 z "},\u00FC:{ha:766,x_min:65,x_max:697,o:"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 612 747 q 588 735 612 735 q 528 734 568 735 q 468 734 488 734 q 451 753 451 734 l 450 891 q 464 908 450 908 q 499 906 475 908 q 536 904 524 904 q 566 905 546 904 q 595 905 585 905 q 611 895 611 905 q 608 856 611 882 q 606 818 606 831 q 609 782 606 806 q 612 747 612 758 m 335 743 q 315 734 335 736 q 276 734 301 732 q 248 736 246 736 q 217 734 238 736 q 186 733 197 733 q 174 746 174 733 q 175 778 174 757 q 176 810 176 799 q 174 851 176 823 q 172 892 172 878 q 189 907 172 907 q 251 906 209 907 q 313 905 292 905 q 334 891 334 905 q 331 854 334 879 q 329 817 329 829 q 332 780 329 804 q 335 743 335 755 z "},"\u2020":{ha:581,x_min:25,x_max:557,o:"m 557 637 q 556 579 557 618 q 555 521 555 541 q 534 504 555 504 q 364 513 533 504 q 363 455 364 494 q 363 397 363 416 q 364 164 363 319 q 366 -68 366 9 q 351 -127 366 -127 l 227 -127 q 210 -118 212 -127 q 210 -96 210 -117 q 213 147 210 -15 q 216 389 216 309 l 216 511 q 132 507 203 511 q 46 504 79 504 q 26 519 26 504 q 26 578 26 539 q 25 636 25 616 q 39 652 25 652 q 125 650 71 652 q 211 647 190 648 l 208 946 q 224 971 208 971 l 359 971 q 372 949 372 971 q 368 647 372 810 q 454 650 389 648 q 539 652 507 652 q 557 637 557 652 z "},"\xB0":{ha:545,x_min:50,x_max:492,o:"m 492 713 q 431 542 492 614 q 271 465 367 465 q 111 543 175 465 q 50 713 50 615 q 111 883 50 810 q 271 960 175 960 q 431 883 368 960 q 492 713 492 811 m 396 713 q 366 817 396 775 q 271 864 332 864 q 177 817 212 864 q 146 713 146 774 q 179 611 146 654 q 271 562 215 562 q 365 609 330 562 q 396 713 396 651 z "},"\xA2":{ha:481,x_min:37,x_max:450,o:"m 450 661 q 428 570 450 646 q 422 562 425 562 q 415 566 419 562 q 339 597 375 594 q 289 271 322 488 q 318 267 302 267 q 389 285 355 267 q 419 303 404 294 q 436 255 427 299 q 444 199 444 216 q 382 167 444 179 q 287 157 335 157 q 271 158 276 157 q 252 11 260 60 q 245 -1 249 -1 q 225 2 239 -1 q 203 5 211 5 q 191 13 191 5 q 216 172 191 25 q 85 272 133 203 q 37 432 37 342 q 110 628 37 549 q 300 710 184 710 q 317 818 304 746 q 322 831 319 831 l 372 811 q 374 802 374 808 q 364 752 374 787 q 357 704 355 720 q 409 689 378 701 q 450 661 450 674 m 282 593 q 199 534 230 582 q 171 434 171 490 q 235 294 171 344 q 282 593 241 333 z "},"\xA3":{ha:648,x_min:35,x_max:671,o:"m 671 132 q 668 121 671 130 q 650 14 668 121 q 631 0 648 0 q 466 2 576 0 q 302 5 357 5 q 146 -3 178 5 q 75 -16 87 -16 q 61 -4 64 -16 q 35 117 35 85 q 60 132 35 132 q 172 168 115 132 q 235 261 235 209 q 222 315 235 286 q 114 312 195 312 q 62 313 65 312 q 52 360 52 319 q 79 454 52 454 q 110 454 90 454 q 140 453 130 453 q 80 618 80 558 q 176 783 80 724 q 369 833 257 833 q 501 810 420 833 q 600 749 600 783 q 591 701 600 745 q 579 643 581 654 q 571 618 578 631 q 566 617 569 617 q 494 656 572 617 q 354 694 416 694 q 274 676 307 694 q 233 610 233 654 q 264 526 233 579 q 313 447 288 486 q 513 444 372 444 q 526 432 523 444 q 527 406 528 423 q 525 385 525 383 q 527 352 525 374 q 530 319 530 330 q 517 313 530 313 q 382 315 391 313 q 391 262 391 288 q 335 138 391 193 q 493 139 387 138 q 653 140 600 140 q 671 132 671 140 z "},"\xA7":{ha:564,x_min:40,x_max:518,o:"m 518 123 q 439 -35 518 24 q 264 -89 367 -89 q 52 -7 125 -89 q 40 11 40 5 q 92 106 40 8 q 99 111 94 111 q 152 68 96 111 q 254 25 208 25 q 332 46 302 25 q 368 115 368 71 q 286 205 368 161 q 134 286 134 285 q 52 421 52 342 q 86 534 52 483 q 121 587 121 586 q 102 617 121 594 q 66 671 77 646 q 46 760 46 711 q 115 913 46 859 q 281 962 178 962 q 461 897 404 962 q 470 880 470 887 l 425 791 q 419 787 422 787 q 373 821 420 787 q 282 856 326 856 q 186 782 186 856 q 216 707 186 738 q 286 660 234 690 q 425 575 402 592 q 511 450 511 511 q 472 343 511 397 q 432 292 432 290 q 454 266 432 285 q 496 219 482 243 q 518 123 518 180 m 371 409 q 319 494 371 448 q 229 541 267 541 q 199 512 215 541 q 184 471 184 486 q 239 389 184 433 q 326 349 290 349 q 355 373 339 349 q 371 409 371 395 z "},"\u2022":{ha:627,x_min:52,x_max:572,o:"m 572 403 q 503 202 572 283 q 311 118 429 118 q 121 203 193 118 q 52 403 52 283 q 121 602 52 522 q 311 686 193 686 q 503 602 429 686 q 572 403 572 522 z "},"\xB6":{ha:754,x_min:52,x_max:677,o:"m 677 890 q 677 697 677 826 q 676 504 676 568 q 397 7 676 121 q 192 -34 298 -34 q 168 -21 174 -34 q 153 32 153 12 q 170 45 153 43 q 272 52 221 48 q 372 77 330 57 q 557 292 511 140 q 587 585 587 387 q 585 793 587 732 q 509 819 568 819 q 520 568 520 755 q 494 333 520 418 q 355 149 457 208 q 184 105 281 105 q 130 132 144 105 q 119 197 119 151 q 132 216 119 216 q 182 207 142 216 q 248 197 223 197 q 376 256 327 197 q 422 394 422 312 q 418 413 422 413 q 368 392 421 413 q 275 371 314 371 q 111 446 174 371 q 52 619 52 517 q 143 866 52 773 q 389 960 235 960 q 642 922 494 960 q 668 914 665 916 q 677 890 677 908 m 440 578 q 439 700 440 618 q 437 822 437 781 q 401 836 437 836 q 229 629 229 836 q 336 470 229 470 q 435 501 391 470 q 440 578 440 529 z "},\u00DF:{ha:694,x_min:77,x_max:659,o:"m 659 330 q 389 -4 659 111 q 371 -9 377 -9 q 334 36 362 -9 q 307 93 307 82 q 326 107 307 98 q 504 318 504 191 q 464 427 504 385 q 357 469 423 469 q 320 461 343 469 q 288 454 296 454 q 273 561 273 454 q 288 574 273 568 q 415 729 415 628 q 336 832 415 832 q 252 787 283 832 q 224 693 224 748 q 232 353 224 580 q 240 12 240 126 q 228 -3 240 -3 q 192 0 216 -3 q 155 3 168 3 q 125 1 145 3 q 94 0 104 0 q 77 21 77 0 q 80 202 77 81 q 83 383 83 323 q 80 528 83 431 q 77 672 77 624 q 146 869 77 787 q 334 954 220 954 q 486 903 426 954 q 549 757 549 848 q 526 669 549 713 q 486 607 511 639 q 463 580 463 581 q 489 562 463 572 q 659 330 659 503 z "},"\xAE":{ha:859,x_min:52,x_max:807,o:"m 807 528 q 703 237 807 361 q 429 107 593 107 q 156 238 267 107 q 52 528 52 362 q 155 819 52 695 q 429 949 265 949 q 703 819 593 949 q 807 528 807 695 m 742 528 q 657 773 742 669 q 429 885 568 885 q 331 867 393 885 q 255 817 256 844 l 258 812 q 435 821 330 821 q 654 643 654 821 q 633 536 654 581 q 593 482 619 508 q 571 454 571 461 q 652 278 571 448 q 742 528 742 377 m 526 621 q 393 733 526 733 q 335 725 366 733 q 332 631 332 694 l 332 555 q 433 550 389 550 q 526 621 526 550 m 623 249 q 581 247 608 249 q 539 245 553 245 q 525 254 529 245 q 497 343 515 275 q 465 429 481 404 q 406 439 459 439 q 367 439 357 439 q 340 422 340 437 q 350 337 340 394 q 359 253 359 281 q 273 250 359 250 q 236 249 245 250 q 429 174 317 174 q 623 249 538 174 m 227 492 q 218 635 227 537 q 197 771 208 747 q 117 528 117 655 q 199 288 117 385 q 211 282 203 282 q 220 289 218 282 q 227 492 227 333 z "},"\xA9":{ha:859,x_min:53,x_max:808,o:"m 808 528 q 704 237 808 361 q 431 107 594 107 q 157 237 267 107 q 53 528 53 361 q 156 819 53 696 q 431 949 264 949 q 705 819 595 949 q 808 528 808 695 m 736 529 q 652 768 736 665 q 431 878 563 878 q 207 769 295 878 q 125 529 125 668 q 208 290 125 391 q 431 180 296 180 q 653 290 564 180 q 736 529 736 393 m 603 753 q 582 713 603 749 q 557 670 559 675 q 553 659 555 665 q 550 661 552 659 q 456 694 504 694 q 328 533 328 694 q 464 372 328 372 q 520 385 492 372 q 549 399 534 392 l 554 392 q 577 350 559 385 q 596 310 596 314 q 534 273 596 288 q 454 260 486 260 q 266 337 338 260 q 193 532 193 414 q 264 726 193 648 q 453 806 338 806 q 538 793 486 806 q 603 753 603 776 z "},"\u2122":{ha:871,x_min:5,x_max:837,o:"m 836 542 q 833 533 837 533 l 730 533 q 722 545 722 533 q 724 638 722 576 q 725 730 725 700 q 722 739 725 739 q 692 645 711 734 q 664 536 672 549 q 651 534 663 534 l 578 534 q 564 536 570 534 q 537 635 551 567 q 510 734 523 704 q 506 739 509 737 q 503 730 503 737 q 505 637 503 699 q 507 545 507 576 q 497 533 507 533 q 474 535 490 533 q 452 536 459 536 q 424 535 442 536 q 395 533 405 533 q 392 542 392 533 q 395 640 392 574 q 397 739 397 706 q 395 842 397 773 q 393 945 393 910 q 401 954 393 954 q 455 957 419 954 q 507 960 490 960 q 555 889 517 960 q 597 804 590 825 q 615 761 604 783 q 666 871 640 816 q 726 959 709 959 q 776 957 742 959 q 827 956 810 956 q 835 952 835 956 q 833 846 835 917 q 832 739 832 774 q 834 640 832 706 q 836 542 836 574 m 359 914 q 347 824 359 824 q 299 823 334 823 q 252 822 269 822 q 250 750 250 798 l 250 699 q 253 620 250 672 q 256 542 256 568 q 245 533 256 533 l 112 533 q 109 536 110 534 q 112 620 109 564 q 115 703 115 675 l 115 818 q 9 812 45 812 q 5 816 5 812 q 9 879 5 827 q 17 939 15 934 q 32 944 19 944 q 187 949 83 944 q 342 954 290 954 q 359 914 359 954 z "},"\xB4":{ha:485,x_min:32,x_max:378,o:"m 378 918 q 229 814 368 890 q 60 741 92 741 q 39 774 47 741 q 32 819 32 801 q 45 832 32 826 q 277 979 157 888 q 287 985 279 982 q 296 979 290 984 q 371 926 325 955 q 378 918 374 924 z "},"\xA8":{ha:485,x_min:24,x_max:464,o:"m 464 825 q 439 813 464 813 q 379 812 419 813 q 319 812 339 812 q 302 831 302 812 l 302 969 q 315 986 302 986 q 351 984 327 986 q 387 982 375 982 q 417 983 397 982 q 446 983 437 983 q 463 972 463 983 q 460 934 463 960 q 457 896 457 909 q 460 860 457 884 q 464 825 464 836 m 186 821 q 167 812 186 814 q 127 812 153 810 q 100 814 98 814 q 69 812 90 814 q 38 811 48 811 q 25 824 25 811 q 26 856 25 835 q 28 888 28 877 q 26 929 28 901 q 24 970 24 956 q 40 985 24 985 q 102 984 60 985 q 164 983 144 983 q 185 969 185 983 q 183 932 185 957 q 180 895 180 907 q 183 858 180 882 q 186 821 186 833 z "},"\u2260":{ha:612,x_min:69,x_max:543,o:"m 543 265 l 308 265 l 254 47 l 174 66 l 223 265 l 69 265 l 69 346 l 243 346 l 285 513 l 69 513 l 69 595 l 305 595 l 359 812 l 438 792 l 389 595 l 543 595 l 543 513 l 369 513 l 328 346 l 543 346 l 543 265 z "},\u00C6:{ha:1149,x_min:43,x_max:1112,o:"m 1112 143 q 1100 77 1112 122 q 1089 9 1089 32 q 1072 -2 1089 -2 q 928 2 1024 -2 q 783 5 831 5 q 674 3 747 5 q 566 0 602 0 q 545 20 545 0 q 546 117 545 56 q 549 214 548 191 q 467 218 513 218 q 298 212 348 218 q 273 196 281 210 q 229 87 252 142 q 183 0 193 0 l 61 0 q 45 9 49 0 q 44 28 43 15 q 46 47 46 47 q 45 66 46 54 q 45 86 45 79 q 65 132 45 87 q 232 488 123 250 q 424 916 340 747 q 431 932 427 924 q 446 942 435 940 q 641 953 502 953 q 784 956 688 953 q 926 960 879 960 q 989 962 947 960 q 1053 965 1031 965 q 1082 946 1078 965 q 1097 831 1097 873 q 1061 821 1097 821 q 770 814 930 821 q 728 810 754 814 q 701 696 701 802 l 701 667 q 703 589 701 597 q 758 553 713 553 q 1060 566 855 553 l 1066 566 q 1079 554 1079 566 q 1074 492 1079 535 q 1068 428 1068 450 q 1055 417 1068 417 q 1028 421 1050 417 q 810 429 979 429 q 716 416 731 429 q 701 331 701 404 l 701 289 q 702 210 701 217 q 730 141 707 152 q 787 135 744 135 q 1088 153 929 135 q 1099 154 1095 154 q 1112 143 1112 154 m 549 395 q 548 530 549 440 q 546 666 546 621 q 545 751 546 733 q 536 783 542 783 q 513 749 529 783 q 340 352 340 387 q 364 338 340 338 q 549 350 487 338 q 549 395 549 367 z "},\u00D8:{ha:1007,x_min:41,x_max:966,o:"m 893 876 q 880 852 893 867 q 498 429 871 841 q 107 -4 370 282 q 94 -13 98 -13 q 70 14 87 -13 q 52 49 56 38 q 417 458 56 59 q 842 929 819 904 q 854 939 846 934 q 878 910 863 934 q 893 876 893 886 m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 z "},"\u221E":{ha:861,x_min:24,x_max:838,o:"m 838 171 q 762 94 838 94 l 591 94 q 498 171 548 94 l 431 273 l 364 170 q 321 113 336 125 q 273 94 302 95 l 101 94 q 24 171 24 94 l 24 515 q 101 592 24 592 l 273 592 q 366 515 317 591 l 432 413 l 498 515 q 591 592 548 592 l 762 592 q 838 515 838 592 l 838 171 m 747 174 l 747 513 l 586 513 l 477 344 l 587 174 l 747 174 m 386 342 l 274 513 l 115 513 l 115 174 l 277 174 l 386 342 z "},"\xB1":{ha:568,x_min:46,x_max:524,o:"m 521 441 l 325 441 l 325 269 l 244 269 l 244 441 l 47 441 l 47 518 l 244 518 l 244 697 l 325 697 l 325 518 l 521 518 l 521 441 m 524 129 l 46 129 l 46 212 l 524 212 l 524 129 z "},"\u2264":{ha:473,x_min:52,x_max:396,o:"m 396 205 l 392 205 l 52 439 l 52 488 l 396 725 l 396 631 l 144 465 l 396 299 l 396 205 m 396 98 l 52 98 l 52 179 l 396 179 l 396 98 z "},"\u2265":{ha:473,x_min:65,x_max:410,o:"m 410 439 l 65 205 l 65 299 l 316 465 l 65 631 l 65 725 l 69 725 l 410 488 l 410 439 m 409 98 l 65 98 l 65 179 l 409 179 l 409 98 z "},"\xA5":{ha:914,x_min:9,x_max:889,o:"m 889 646 q 888 593 889 628 q 886 541 886 558 q 834 530 886 530 q 771 533 802 532 q 643 361 732 472 q 742 370 665 362 q 840 375 804 375 q 852 366 852 375 l 852 306 q 855 286 852 299 q 858 264 858 272 q 840 243 858 246 q 764 241 839 243 q 545 237 645 239 q 536 12 536 222 q 528 0 536 0 q 487 1 514 0 q 447 3 460 3 q 410 1 435 3 q 372 0 385 0 q 358 20 359 0 q 359 117 357 56 q 361 214 361 189 q 357 239 361 224 q 60 243 57 243 q 40 294 40 243 q 42 366 40 357 q 56 375 43 375 q 258 361 44 375 q 131 532 214 416 q 29 530 94 530 q 11 568 11 530 q 9 621 11 679 q 25 656 9 656 q 90 652 32 656 q 87 739 90 669 q 86 825 86 791 q 102 840 86 840 q 174 837 125 840 q 248 833 223 833 q 258 827 258 833 q 257 736 258 797 q 256 644 256 675 q 447 642 374 642 q 644 644 523 642 q 641 731 644 665 q 639 818 639 785 q 653 833 639 831 q 803 840 700 840 q 819 821 819 840 q 818 736 819 789 q 815 652 816 671 q 876 656 871 656 q 889 646 889 656 m 603 538 q 490 539 555 539 l 437 539 q 371 538 416 539 q 306 538 327 538 q 463 361 399 426 q 603 538 524 425 z "},\u00B5:{ha:532,x_min:74,x_max:458,o:"m 458 0 l 370 0 l 370 19 q 245 -1 323 -1 q 163 26 181 -1 l 163 -250 l 74 -250 l 74 660 l 163 660 l 163 172 q 256 77 163 77 q 369 88 321 77 l 369 660 l 458 660 l 458 0 z "},"\u2202":{ha:589,x_min:84,x_max:505,o:"m 505 583 l 505 75 q 484 21 505 42 q 430 0 463 0 l 159 0 q 105 21 126 0 q 84 75 84 42 l 84 510 q 105 564 84 543 q 159 585 126 585 l 401 585 l 180 1061 l 282 1061 l 505 583 m 410 83 l 410 503 l 178 503 l 178 83 l 410 83 z "},"\u2211":{ha:496,x_min:58,x_max:440,o:"m 440 0 l 58 0 l 58 73 l 317 540 l 58 977 l 58 1061 l 436 1061 l 436 978 l 151 978 l 393 580 l 393 499 l 152 83 l 440 83 l 440 0 z "},"\u220F":{ha:545,x_min:26,x_max:518,o:"m 518 978 l 418 978 l 418 0 l 326 0 l 326 978 l 216 978 l 216 0 l 124 0 l 124 978 l 26 978 l 26 1061 l 518 1061 l 518 978 z "},\u03C0:{ha:545,x_min:26,x_max:518,o:"m 518 522 l 418 522 l 418 0 l 326 0 l 326 522 l 216 522 l 216 0 l 124 0 l 124 522 l 26 522 l 26 606 l 518 606 l 518 522 z "},"\u222B":{ha:330,x_min:-22,x_max:323,o:"m 323 982 l 196 982 l 196 -196 q 178 -247 196 -226 q 123 -271 158 -271 l -22 -272 l -22 -193 l 106 -193 l 107 985 q 183 1061 107 1061 l 323 1061 l 323 982 z "},\u00AA:{ha:639,x_min:35,x_max:594,o:"m 594 922 q 593 911 594 920 q 572 681 572 775 q 580 494 572 604 q 586 412 586 397 q 574 395 586 395 q 521 392 556 395 q 468 390 486 390 q 453 432 457 390 q 446 475 450 473 q 432 463 440 471 q 269 382 357 382 q 96 477 163 382 q 35 672 35 562 q 101 872 35 791 q 289 958 172 958 q 382 929 334 958 q 456 861 431 901 q 462 878 459 859 q 468 922 464 892 q 479 950 469 935 q 543 941 503 949 q 594 922 594 932 m 587 318 q 579 218 587 310 q 571 211 577 210 l 564 211 q 302 218 428 218 q 192 215 266 218 q 81 211 117 211 q 68 221 68 211 q 74 321 68 297 q 86 330 76 330 q 205 328 126 330 q 325 325 285 325 q 451 327 367 325 q 576 329 534 329 q 587 318 587 329 m 436 679 q 404 788 436 740 q 310 843 368 843 q 208 789 247 843 q 174 675 174 741 q 206 555 174 603 q 313 501 243 501 q 407 564 372 501 q 436 679 436 614 z "},\u00BA:{ha:639,x_min:57,x_max:575,o:"m 575 676 q 504 475 575 562 q 317 383 429 383 q 128 475 204 383 q 57 676 57 562 q 129 877 57 791 q 317 968 205 968 q 504 876 428 968 q 575 676 575 790 m 552 318 q 547 265 552 307 q 545 218 548 248 q 536 211 542 210 l 529 211 q 310 218 393 218 q 205 215 275 218 q 102 211 136 211 q 89 221 89 211 q 94 321 89 298 q 107 330 97 330 q 219 328 144 330 q 332 325 294 325 q 437 327 367 325 q 542 329 507 329 q 552 318 552 329 m 449 676 q 417 791 449 741 q 319 848 380 848 q 218 791 258 848 q 183 676 183 741 q 216 558 183 607 q 319 503 253 503 q 418 561 382 503 q 449 676 449 610 z "},\u03A9:{ha:716,x_min:40,x_max:678,o:"m 678 -1 l 415 -1 l 415 332 l 540 332 l 540 978 l 180 977 l 179 332 l 304 332 l 304 -1 l 40 -1 l 40 87 l 224 87 l 224 248 l 160 248 q 106 269 127 248 q 85 323 85 290 l 85 986 q 106 1040 85 1019 q 160 1061 127 1061 l 557 1061 q 612 1040 590 1061 q 634 986 634 1019 l 634 323 q 613 269 634 290 q 559 248 592 248 l 494 248 l 494 87 l 678 87 l 678 -1 z "},\u00E6:{ha:1192,x_min:29,x_max:1168,o:"m 1168 362 q 1157 322 1168 341 q 1125 297 1144 300 q 986 283 1078 292 l 711 256 q 785 152 720 193 q 911 115 844 115 q 1015 138 966 115 q 1080 180 1048 153 q 1107 203 1107 203 q 1112 201 1110 203 q 1137 146 1123 178 q 1162 104 1162 103 q 1152 89 1162 100 q 895 -9 1061 -9 q 705 69 753 -9 q 709 22 709 49 q 708 1 709 10 q 626 -5 671 -5 q 575 0 598 -5 q 572 89 572 33 q 571 113 572 105 q 470 18 517 46 q 335 -16 413 -16 q 111 87 197 -16 q 29 323 29 184 q 115 571 29 473 q 351 673 205 673 q 581 553 465 673 q 604 646 586 585 l 607 646 q 721 623 616 646 q 868 672 786 672 q 1083 583 998 672 q 1168 362 1168 494 m 1008 411 q 962 506 1008 463 q 863 549 915 549 q 753 504 799 549 q 708 395 708 458 q 726 372 708 372 q 970 390 768 372 q 1008 411 1008 394 m 558 330 q 509 475 558 415 q 374 539 456 539 q 234 475 286 539 q 186 326 186 416 q 236 183 186 241 q 372 121 289 121 q 509 185 455 121 q 558 330 558 245 z "},\u00F8:{ha:710,x_min:26,x_max:684,o:"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 650 650 q 640 631 650 642 q 302 238 527 500 q 96 -3 234 157 q 82 -14 92 -8 q 61 11 77 -12 q 46 39 46 34 q 302 345 46 44 q 602 692 548 632 q 613 701 605 696 q 633 676 617 699 q 650 650 650 653 z "},"\xBF":{ha:553,x_min:31,x_max:536,o:"m 399 860 q 374 794 399 821 q 311 766 349 766 q 249 794 273 766 q 224 860 224 822 q 249 926 224 897 q 311 954 274 954 q 374 926 349 954 q 399 860 399 898 m 536 111 q 534 86 536 92 q 426 18 528 52 q 290 -11 337 -11 q 103 60 176 -11 q 31 244 31 130 q 70 387 31 316 q 167 500 107 454 q 269 648 264 574 q 271 680 270 664 q 290 696 274 696 q 327 699 302 696 q 362 703 351 703 q 379 668 379 703 q 335 517 379 586 q 253 412 294 465 q 208 286 208 350 q 245 185 208 224 q 345 146 282 146 q 464 182 406 146 q 515 218 522 218 q 536 111 536 218 z "},"\xA1":{ha:322,x_min:79,x_max:256,o:"m 256 857 q 231 789 256 817 q 167 762 206 762 q 103 789 127 762 q 79 857 79 817 q 103 926 79 897 q 167 954 127 954 q 231 926 207 954 q 256 857 256 898 m 253 157 q 252 83 253 132 q 252 9 252 35 q 243 -17 252 -17 q 205 -13 231 -17 q 167 -9 180 -9 q 129 -13 154 -9 q 92 -17 104 -17 q 83 9 83 -17 l 83 415 q 125 675 83 467 q 129 688 127 684 q 139 696 132 696 l 191 696 q 201 672 198 696 q 228 511 207 631 q 253 157 253 369 z "},"\xAC":{ha:639,x_min:81,x_max:558,o:"m 558 225 l 474 225 l 474 423 l 81 423 l 81 507 l 558 507 l 558 225 z "},"\u221A":{ha:1320,x_min:107,x_max:1310,o:"m 1305 920 q 1310 896 1310 903 q 1297 883 1310 886 q 1253 875 1256 876 q 1137 802 1213 864 q 1013 682 1060 741 q 833 395 923 571 q 708 69 736 205 q 692 -52 707 60 q 668 -118 684 -111 q 583 -143 612 -143 q 568 -117 572 -143 q 553 -50 560 -70 q 343 243 495 110 q 235 326 271 306 q 132 366 216 336 q 107 399 107 375 q 116 420 107 412 q 188 507 138 448 q 246 566 218 542 q 272 578 261 578 q 302 568 279 578 q 458 456 375 532 q 570 316 541 380 q 602 277 588 277 q 642 335 618 277 q 755 527 664 390 q 908 734 847 664 q 1225 1047 1124 984 q 1244 1054 1236 1054 q 1278 1013 1261 1054 q 1305 920 1287 989 z "},\u0192:{ha:530,x_min:50,x_max:492,o:"m 492 781 q 469 689 492 785 q 458 670 465 670 q 411 686 455 670 q 342 701 367 701 q 290 678 302 701 q 283 616 283 663 q 286 547 283 589 q 452 534 398 547 q 465 524 465 532 q 457 461 465 511 q 446 404 450 408 q 370 401 418 399 q 293 404 290 404 q 323 73 323 197 q 192 -142 323 -88 q 182 -144 186 -144 q 172 -134 178 -144 q 111 -26 140 -67 q 104 -16 108 -22 q 142 21 123 3 q 171 103 171 51 q 144 403 171 282 q 77 399 115 399 q 62 407 65 399 q 50 536 50 530 q 61 546 50 546 q 98 545 73 546 q 135 545 123 545 q 127 653 127 673 q 177 791 127 736 q 309 846 227 846 q 412 829 347 846 q 492 781 492 807 z "},"\u2248":{ha:701,x_min:115,x_max:586,o:"m 586 545 q 530 487 586 487 q 460 500 496 487 l 204 598 l 204 491 l 115 491 l 115 633 q 171 691 115 691 q 241 677 205 691 l 497 580 l 497 687 l 586 687 l 586 545 m 586 277 q 530 219 586 219 q 460 233 496 219 l 204 330 l 204 223 l 115 223 l 115 365 q 171 423 115 423 q 241 409 205 423 l 497 312 l 497 419 l 586 419 l 586 277 z "},\u0394:{ha:555,x_min:31,x_max:526,o:"m 526 0 l 31 0 l 31 83 l 232 1064 l 325 1064 q 431 547 332 1025 q 526 80 526 81 l 526 0 m 432 90 l 277 895 l 122 90 l 432 90 z "},"\xAB":{ha:699,x_min:36,x_max:663,o:"m 663 528 q 585 456 663 509 q 485 396 517 410 q 473 388 479 394 q 570 327 473 388 q 661 248 661 270 q 659 241 661 246 q 618 149 645 216 q 610 139 615 139 q 473 243 553 184 q 349 317 408 286 q 336 338 336 323 q 336 387 336 354 q 335 436 335 420 q 347 457 335 450 q 484 536 418 494 q 552 589 490 541 q 612 634 611 634 q 619 625 617 634 q 663 528 621 619 m 364 527 q 270 447 364 508 q 175 387 222 417 q 273 327 176 387 q 362 249 362 271 q 359 241 362 247 q 319 149 345 212 q 312 139 316 139 q 174 244 253 185 q 50 317 118 281 q 37 338 37 323 q 37 387 37 354 q 36 436 36 420 q 49 457 36 450 q 186 536 134 503 q 254 589 193 541 q 314 634 312 634 q 322 626 319 634 q 364 527 324 618 z "},"\xBB":{ha:699,x_min:40,x_max:667,o:"m 667 436 q 666 387 667 420 q 665 339 665 354 q 653 317 665 323 q 406 149 498 235 q 391 139 401 144 q 383 149 387 142 q 343 241 372 180 q 340 249 340 246 q 418 319 340 267 q 517 379 486 366 q 528 387 522 381 q 431 447 479 417 q 338 528 338 506 q 382 625 358 568 q 389 634 385 634 q 449 589 391 634 q 518 536 511 541 q 654 457 583 494 q 667 436 667 450 m 368 338 q 355 317 368 323 q 107 149 186 227 q 94 140 103 144 q 86 149 89 142 q 45 241 73 180 q 43 248 43 245 q 57 269 43 256 q 220 379 138 347 q 231 387 224 380 q 134 447 182 417 q 40 528 40 506 q 45 538 40 530 q 83 625 73 593 q 91 634 86 634 q 220 536 149 590 q 355 457 281 496 q 368 436 368 450 l 368 338 z "},"\u2026":{ha:896,x_min:46,x_max:850,o:"m 850 100 q 820 21 850 55 q 746 -12 790 -12 q 671 22 702 -12 q 643 100 643 55 q 672 177 643 145 q 746 210 701 210 q 820 177 790 210 q 850 100 850 144 m 551 100 q 522 21 551 55 q 447 -12 492 -12 q 373 22 403 -12 q 345 100 345 55 q 374 177 345 145 q 447 210 403 210 q 522 177 492 210 q 551 100 551 144 m 253 100 q 223 21 253 55 q 149 -12 193 -12 q 75 22 104 -12 q 46 100 46 55 q 75 177 46 145 q 149 210 104 210 q 223 177 193 210 q 253 100 253 144 z "},"\xA0":{ha:174,x_min:0,x_max:0,o:""},\u00C0:{ha:916,x_min:6,x_max:909,o:"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 578 1058 q 568 1023 578 1052 q 555 994 559 994 q 544 993 541 994 q 230 1156 307 1104 q 223 1164 227 1158 q 263 1206 229 1176 q 307 1236 296 1236 q 432 1167 323 1236 q 574 1071 532 1104 q 578 1058 579 1067 z "},\u00C3:{ha:916,x_min:6,x_max:909,o:"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 661 1101 q 603 1053 661 1084 q 517 1021 545 1021 q 436 1044 477 1021 q 375 1068 395 1068 q 327 1046 352 1068 q 298 1023 302 1023 q 285 1029 290 1023 q 225 1088 225 1089 q 227 1093 225 1090 q 284 1147 237 1121 q 361 1173 330 1173 q 445 1150 395 1173 q 515 1128 494 1128 q 564 1152 528 1128 q 604 1175 599 1175 l 611 1173 q 661 1101 661 1122 z "},\u00D5:{ha:1007,x_min:41,x_max:966,o:"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 711 1094 q 653 1046 711 1078 q 567 1014 595 1014 q 486 1038 527 1014 q 425 1061 446 1061 q 377 1039 402 1061 q 349 1017 352 1017 q 335 1023 340 1017 q 275 1081 275 1082 q 277 1086 275 1083 q 334 1141 287 1114 q 412 1166 380 1166 q 495 1143 445 1166 q 566 1121 545 1121 q 614 1145 578 1121 q 654 1168 649 1168 l 661 1166 q 711 1094 711 1115 z "},\u0152:{ha:1303,x_min:40,x_max:1259,o:"m 1259 136 q 1249 75 1259 119 q 1238 7 1238 30 q 1224 -5 1238 -5 l 1211 -4 q 875 1 1196 -3 q 822 2 848 2 q 791 35 791 7 q 795 88 791 54 q 799 142 798 126 q 671 26 753 70 q 503 -17 589 -17 q 171 132 307 -17 q 40 475 40 277 q 170 819 40 675 q 503 966 304 966 q 673 924 591 966 q 807 809 754 881 q 811 803 811 803 q 813 830 813 803 l 813 885 q 818 951 812 949 q 831 951 819 952 q 906 949 856 951 q 981 947 956 947 q 1099 949 1020 947 q 1217 951 1177 951 q 1240 932 1236 951 q 1255 817 1255 857 q 1240 807 1255 807 q 1120 811 1200 807 q 1000 815 1040 815 q 949 762 958 815 q 947 673 947 753 q 946 648 947 665 q 945 622 945 630 q 1000 553 945 553 q 1115 556 1038 553 q 1231 559 1192 559 q 1249 543 1249 559 q 1247 510 1249 532 q 1246 477 1246 488 q 1247 456 1246 470 q 1249 435 1249 441 q 1240 421 1249 421 q 1155 424 1212 421 q 1070 427 1099 427 q 958 405 974 427 q 949 281 949 390 q 958 168 949 186 q 1053 135 975 135 q 1152 141 1086 135 q 1249 146 1217 146 q 1259 136 1259 146 m 804 475 q 719 709 804 609 q 497 815 629 815 q 282 707 371 815 q 199 475 199 604 q 283 245 199 347 q 497 136 372 136 q 720 240 631 136 q 804 475 804 340 z "},\u0153:{ha:1196,x_min:26,x_max:1173,o:"m 1173 357 q 1129 294 1173 304 q 1000 283 1126 294 l 714 257 q 779 156 722 198 q 893 117 831 117 q 1089 182 1015 117 q 1109 200 1109 200 q 1117 199 1116 200 q 1141 143 1127 175 q 1166 102 1166 100 q 1156 86 1166 98 q 900 -16 1061 -16 q 736 23 816 -16 q 614 135 650 66 q 505 27 583 69 q 355 -12 432 -12 q 117 88 211 -12 q 26 332 26 186 q 118 575 26 477 q 355 676 212 676 q 603 547 513 676 l 615 529 q 725 637 652 596 q 873 678 796 678 q 1091 584 1007 678 q 1173 357 1173 493 m 1013 411 q 966 505 1013 463 q 867 546 920 546 q 753 500 802 546 q 705 390 705 455 q 734 372 705 372 q 974 390 774 372 q 1013 411 1013 394 m 543 332 q 493 476 543 418 q 355 538 440 538 q 218 477 271 538 q 170 332 170 419 q 219 188 170 245 q 355 126 271 126 q 493 188 440 126 q 543 332 543 245 z "},"\u2013":{ha:785,x_min:32,x_max:753,o:"m 753 467 q 747 400 753 465 q 741 334 741 336 q 728 325 739 325 q 565 326 674 325 q 401 328 456 328 q 225 323 342 328 q 50 319 109 319 q 32 338 32 319 q 45 401 32 356 q 53 465 45 425 q 74 476 57 476 q 220 474 123 476 q 367 472 318 472 q 553 476 429 472 q 739 479 677 479 q 753 467 753 479 z "},"\u2014":{ha:1104,x_min:39,x_max:1069,o:"m 1069 466 q 1061 401 1069 464 q 1053 334 1054 338 q 1039 325 1051 325 q 806 326 961 325 q 572 328 650 328 q 315 323 486 328 q 58 319 144 319 q 39 338 39 319 q 61 465 39 339 q 83 476 66 476 q 310 474 159 476 q 536 472 460 472 q 794 476 622 472 q 1051 479 966 479 q 1069 466 1069 479 z "},"\u201C":{ha:526,x_min:47,x_max:486,o:"m 486 629 q 439 577 486 621 q 385 533 392 533 q 370 543 379 533 q 287 713 287 627 q 317 846 287 776 q 392 961 347 916 q 408 972 402 972 q 415 966 411 972 q 465 916 465 911 q 435 869 465 922 q 406 774 406 817 q 446 674 406 719 q 486 629 486 629 m 243 646 q 196 595 243 639 q 145 551 149 551 q 74 627 127 551 q 47 730 47 664 q 158 991 47 876 q 174 1002 168 1002 q 202 977 176 1002 q 229 949 229 953 q 197 901 229 957 q 165 793 165 844 q 185 716 165 751 q 223 671 198 695 q 243 646 243 652 z "},"\u201D":{ha:526,x_min:39,x_max:478,o:"m 478 817 q 367 555 478 672 q 352 546 357 546 q 323 570 350 546 q 297 598 297 595 q 328 647 297 591 q 359 754 359 703 q 340 831 359 797 q 302 876 328 852 q 282 901 282 895 q 329 952 282 909 q 380 996 376 996 q 452 921 398 996 q 478 817 478 883 m 238 779 q 208 646 238 715 q 134 530 178 576 q 117 520 123 520 q 110 525 114 520 q 60 576 60 581 q 90 623 60 570 q 119 718 119 675 q 79 818 119 773 q 39 863 39 863 q 86 915 39 871 q 140 958 133 958 q 155 949 146 958 q 238 779 238 865 z "},"\u2018":{ha:288,x_min:54,x_max:254,o:"m 254 633 q 205 582 254 627 q 153 538 157 538 q 138 546 146 538 q 54 718 54 618 q 87 859 54 782 q 165 979 119 936 q 181 987 174 987 q 210 963 184 987 q 237 936 237 939 q 233 929 237 933 q 180 779 180 861 q 217 677 180 722 q 254 633 254 633 z "},"\u2019":{ha:288,x_min:32,x_max:233,o:"m 233 803 q 121 542 233 661 q 106 532 111 532 q 97 538 103 532 q 50 583 50 583 q 54 591 50 586 q 103 741 103 659 q 84 820 103 785 q 50 865 73 842 q 32 887 32 883 q 72 926 32 889 q 121 974 115 964 q 133 983 127 983 q 150 974 139 983 q 233 803 233 900 z "},"\xF7":{ha:568,x_min:47,x_max:521,o:"m 355 640 q 334 589 355 610 q 283 568 313 568 q 234 589 254 568 q 213 640 213 610 q 234 691 213 670 q 283 712 254 712 q 334 691 313 712 q 355 640 355 670 m 521 424 l 47 424 l 47 509 l 521 509 l 521 424 m 355 292 q 334 241 355 262 q 283 220 313 220 q 234 241 254 220 q 213 292 213 262 q 234 343 213 321 q 283 364 254 364 q 334 343 313 364 q 355 292 355 321 z "},"\u25CA":{ha:560,x_min:20,x_max:541,o:"m 541 389 l 306 45 l 257 45 l 20 389 l 257 734 l 306 734 l 541 389 m 447 389 l 281 641 l 115 389 l 281 138 l 447 389 z "},\u00FF:{ha:661,x_min:24,x_max:640,o:"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 m 558 697 q 534 686 558 686 q 473 685 513 686 q 414 684 433 684 q 397 703 397 684 l 396 842 q 410 859 396 859 q 445 857 421 859 q 481 854 469 854 q 511 855 492 854 q 541 856 531 856 q 557 845 557 856 q 554 807 557 832 q 551 768 551 781 q 555 732 551 756 q 558 697 558 709 m 281 694 q 261 684 281 686 q 222 684 247 683 q 194 686 192 686 q 163 685 184 686 q 132 684 142 684 q 119 696 119 684 q 121 728 119 707 q 122 760 122 749 q 120 801 122 774 q 118 842 118 829 q 134 857 118 857 q 196 857 155 857 q 259 856 238 856 q 279 842 279 856 q 277 804 279 829 q 275 767 275 779 q 278 730 275 755 q 281 694 281 706 z "},\u0178:{ha:815,x_min:24,x_max:794,o:"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 m 638 1000 q 614 988 638 988 q 553 987 593 988 q 494 987 513 987 q 477 1006 477 987 l 476 1144 q 490 1161 476 1161 q 525 1159 501 1161 q 562 1157 549 1157 q 591 1158 572 1157 q 621 1158 611 1158 q 637 1147 637 1158 q 634 1109 637 1135 q 631 1071 631 1084 q 635 1035 631 1059 q 638 1000 638 1011 m 361 996 q 341 987 361 989 q 302 987 327 985 q 274 989 272 989 q 243 987 264 989 q 212 986 222 986 q 199 999 199 986 q 201 1031 199 1010 q 202 1063 202 1052 q 200 1104 202 1076 q 198 1145 198 1131 q 214 1160 198 1160 q 276 1159 235 1160 q 339 1158 318 1158 q 359 1144 359 1158 q 357 1107 359 1132 q 355 1069 355 1082 q 358 1033 355 1057 q 361 996 361 1008 z "},"\u2044":{ha:424,x_min:-61,x_max:495,o:"m 495 789 q 490 777 495 786 q 264 380 413 646 q 44 -41 193 238 q 32 -53 37 -53 q -16 -18 28 -53 q -61 22 -61 18 q -58 32 -61 26 q 395 851 231 525 q 404 860 399 860 q 455 829 414 860 q 495 789 495 798 z "},"\xA4":{ha:828,x_min:96,x_max:743,o:"m 743 745 l 623 625 l 623 357 l 743 237 l 663 157 l 531 288 l 307 288 l 176 157 l 96 237 l 216 357 l 216 625 l 96 745 l 176 825 l 308 694 l 532 694 l 663 825 l 743 745 m 511 389 l 511 594 l 328 594 l 328 389 l 511 389 z "},"\u2039":{ha:406,x_min:36,x_max:380,o:"m 380 524 q 207 388 380 500 q 296 330 208 386 q 374 256 374 281 q 355 205 374 252 q 332 149 334 155 q 325 139 331 144 q 191 239 268 182 q 50 317 155 262 q 37 338 37 323 q 37 387 37 354 q 36 436 36 420 q 49 457 36 450 q 315 628 182 528 q 328 634 319 631 q 335 625 332 632 q 376 534 347 595 q 380 524 380 528 z "},"\u203A":{ha:406,x_min:24,x_max:370,o:"m 370 338 q 357 317 370 323 q 96 149 194 231 q 81 139 91 144 q 74 149 77 142 q 29 245 60 181 q 26 252 26 250 q 104 324 26 274 q 203 379 170 367 q 213 387 208 380 q 117 446 165 416 q 24 524 24 503 q 47 569 24 525 q 72 625 69 613 q 79 634 75 634 q 92 628 83 634 q 214 538 132 597 q 357 457 264 505 q 370 436 370 450 l 370 338 z "},"\uF001":{ha:705,x_min:12,x_max:644,o:"m 644 630 q 637 471 644 577 q 631 311 631 364 q 634 164 631 262 q 637 17 637 66 q 625 1 637 1 l 496 1 q 479 24 479 1 q 482 143 479 64 q 485 261 485 222 q 484 372 485 298 q 484 484 484 446 q 463 505 484 504 q 250 510 391 505 q 255 265 250 429 q 260 18 260 100 q 245 0 260 0 l 123 0 q 106 21 106 0 l 106 489 q 92 504 106 500 q 65 505 83 507 q 43 503 41 503 q 17 510 18 503 q 12 619 12 525 q 50 635 12 630 q 98 637 75 636 q 96 715 96 689 q 369 983 96 983 q 555 940 463 983 q 566 929 566 936 q 555 863 566 910 q 533 807 544 807 q 472 831 528 807 q 385 854 416 854 q 269 809 301 854 q 243 684 243 772 q 244 640 243 664 q 365 638 281 640 q 485 636 444 636 q 557 637 533 636 q 595 642 567 638 q 633 645 620 645 q 644 630 644 645 z "},"\uF002":{ha:721,x_min:16,x_max:669,o:"m 669 934 q 665 922 669 930 q 649 683 650 892 q 650 436 650 852 q 652 232 650 368 q 654 28 654 96 q 643 0 654 0 l 513 0 q 500 16 500 0 q 502 226 500 85 q 504 436 504 366 l 504 521 q 252 514 420 521 q 257 266 252 433 q 262 18 262 101 q 249 0 262 0 l 126 0 q 109 21 109 0 l 109 492 q 95 507 109 503 q 68 508 86 509 q 45 505 43 505 q 20 513 22 505 q 16 621 16 524 q 54 636 16 632 q 102 639 77 637 q 96 705 96 671 q 173 916 96 840 q 387 992 251 992 q 652 949 517 992 q 669 934 669 943 m 509 852 q 376 867 422 867 q 273 810 311 867 q 240 692 240 760 q 244 643 240 668 l 503 643 q 509 852 503 805 z "},"\u2021":{ha:607,x_min:35,x_max:570,o:"m 570 637 q 569 582 570 619 q 568 527 568 545 q 549 509 568 509 q 372 517 541 509 q 370 446 372 494 q 368 374 368 397 q 371 235 368 393 q 550 240 532 240 q 567 226 563 240 q 569 196 570 216 q 567 171 567 167 q 569 144 567 174 q 568 113 570 123 q 549 98 563 98 q 375 104 536 98 q 378 -45 376 62 q 380 -195 380 -140 q 367 -227 380 -227 l 236 -227 q 220 -220 223 -227 q 219 -201 219 -217 q 222 -48 219 -142 q 227 104 226 76 q 142 101 203 104 q 57 98 88 98 q 38 113 43 98 q 37 144 35 123 q 39 171 39 173 q 37 196 39 168 q 38 226 36 216 q 52 240 41 240 q 142 237 83 240 q 232 233 205 234 q 233 298 232 245 q 235 361 235 337 l 235 515 q 147 511 221 515 q 60 509 94 509 q 39 524 39 509 q 38 580 39 543 q 37 636 37 617 q 52 652 37 652 q 139 650 84 652 q 227 647 205 648 q 223 797 226 684 q 221 946 221 890 q 236 971 221 971 l 372 971 q 385 956 385 971 q 379 647 385 865 q 466 650 400 648 q 553 652 520 652 q 570 637 570 652 z "},"\xB7":{ha:298,x_min:46,x_max:253,o:"m 253 501 q 223 423 253 456 q 149 390 193 390 q 75 423 104 390 q 46 501 46 456 q 75 579 46 547 q 149 611 104 611 q 223 578 193 611 q 253 501 253 546 z "},"\u201A":{ha:288,x_min:33,x_max:232,o:"m 232 48 q 198 -85 232 -11 q 121 -201 165 -160 q 105 -210 112 -210 q 77 -186 103 -210 q 51 -159 51 -161 q 82 -110 51 -167 q 114 -1 114 -52 q 73 98 114 52 q 33 143 33 144 q 83 196 33 151 q 135 240 131 240 q 150 232 140 240 q 232 48 232 158 z "},"\u201E":{ha:526,x_min:28,x_max:448,o:"m 448 113 q 336 -149 448 -33 q 321 -159 327 -159 q 293 -134 319 -159 q 267 -106 267 -110 q 298 -58 267 -114 q 329 50 329 -1 q 309 127 329 93 q 271 172 297 148 q 252 197 252 191 q 298 248 252 204 q 349 292 345 292 q 421 216 368 292 q 448 113 448 179 m 227 59 q 197 -75 227 -5 q 121 -189 168 -141 q 105 -199 111 -199 q 97 -195 102 -199 q 50 -143 50 -140 q 79 -97 50 -150 q 109 -1 109 -44 q 68 99 109 54 q 28 144 28 144 q 75 195 28 151 q 129 239 122 239 q 144 229 135 239 q 227 59 227 146 z "},"\u2030":{ha:1522,x_min:32,x_max:1491,o:"m 1491 253 q 1433 76 1491 153 q 1274 -8 1371 -8 q 1114 76 1177 -8 q 1055 253 1055 153 q 1114 431 1055 353 q 1274 515 1177 515 q 1433 431 1371 515 q 1491 253 1491 353 m 990 253 q 933 76 990 153 q 774 -8 871 -8 q 613 76 676 -8 q 555 253 555 153 q 613 431 555 353 q 774 515 677 515 q 933 431 871 515 q 990 253 990 353 m 718 812 q 713 796 718 806 q 533 412 652 669 q 370 -1 479 292 q 356 -20 362 -20 q 321 -4 347 -20 q 296 20 296 12 q 302 40 296 27 q 397 233 342 113 q 489 428 469 388 q 572 627 524 498 q 648 833 610 730 q 662 850 655 850 q 694 836 671 850 q 718 812 718 821 m 467 583 q 410 406 467 483 q 250 322 347 322 q 90 406 153 322 q 32 583 32 483 q 90 761 32 684 q 250 846 153 846 q 410 761 347 846 q 467 583 467 684 m 1378 253 q 1354 351 1378 308 q 1274 403 1324 403 q 1193 351 1223 403 q 1168 253 1168 308 q 1194 157 1168 201 q 1274 104 1225 104 q 1354 155 1324 104 q 1378 253 1378 198 m 878 253 q 854 351 878 308 q 774 403 825 403 q 693 351 722 403 q 668 253 668 308 q 694 157 668 201 q 774 104 725 104 q 853 155 824 104 q 878 253 878 198 m 354 583 q 330 682 354 638 q 250 733 301 733 q 170 681 199 733 q 144 583 144 637 q 171 487 144 532 q 250 435 202 435 q 330 486 300 435 q 354 583 354 529 z "},\u00C2:{ha:916,x_min:6,x_max:909,o:"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 644 1020 q 610 1001 642 1017 q 572 985 578 985 q 445 1096 552 985 q 388 1034 438 1092 q 326 985 345 985 q 287 1002 321 985 q 254 1021 254 1019 q 345 1129 292 1064 q 399 1221 383 1187 q 414 1232 404 1232 l 485 1232 q 497 1221 494 1232 q 550 1129 508 1187 q 644 1020 597 1076 z "},\u00CA:{ha:747,x_min:68,x_max:713,o:"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 576 1025 q 542 1006 574 1022 q 504 990 510 990 q 377 1101 484 990 q 320 1040 370 1097 q 258 991 277 991 q 219 1007 253 991 q 186 1026 186 1024 q 277 1135 224 1069 q 331 1227 315 1193 q 346 1238 336 1238 l 417 1238 q 429 1227 426 1238 q 482 1135 440 1192 q 576 1025 529 1081 z "},\u00C1:{ha:916,x_min:6,x_max:909,o:"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 642 1166 q 492 1063 632 1139 q 323 989 356 989 q 302 1023 311 989 q 296 1068 296 1050 q 309 1081 296 1075 q 541 1228 420 1137 q 551 1234 543 1231 q 559 1228 554 1233 q 635 1175 589 1204 q 642 1166 638 1173 z "},\u00CB:{ha:747,x_min:68,x_max:713,o:"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 595 1008 q 570 996 595 996 q 510 996 550 996 q 450 995 470 995 q 433 1014 433 995 l 433 1152 q 446 1169 433 1169 q 482 1167 458 1169 q 518 1165 506 1165 q 548 1166 528 1165 q 577 1166 568 1166 q 593 1156 593 1166 q 591 1117 593 1143 q 588 1079 588 1092 q 591 1043 588 1067 q 595 1008 595 1019 m 317 1004 q 298 995 317 997 q 258 995 283 994 q 231 997 229 997 q 200 996 220 997 q 169 994 179 994 q 156 1007 156 994 q 157 1039 156 1018 q 159 1071 159 1060 q 157 1112 159 1084 q 155 1153 155 1139 q 171 1168 155 1168 q 233 1167 191 1168 q 295 1166 275 1166 q 316 1152 316 1166 q 314 1115 316 1140 q 311 1078 311 1090 q 314 1041 311 1065 q 317 1004 317 1017 z "},\u00C8:{ha:747,x_min:68,x_max:713,o:"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 559 1046 q 549 1011 559 1040 q 536 983 540 983 q 525 981 522 983 q 211 1144 288 1093 q 204 1152 208 1146 q 244 1195 210 1164 q 288 1225 277 1225 q 413 1156 304 1225 q 555 1059 513 1093 q 559 1046 560 1055 z "},\u00CD:{ha:329,x_min:21,x_max:368,o:"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 368 1149 q 218 1046 357 1122 q 49 972 81 972 q 28 1006 37 972 q 21 1051 21 1033 q 34 1064 21 1058 q 266 1211 146 1120 q 276 1217 269 1214 q 285 1211 279 1216 q 360 1158 314 1187 q 368 1149 363 1156 z "},\u00CE:{ha:329,x_min:-30,x_max:361,o:"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 361 1027 q 327 1007 359 1023 q 288 991 294 991 q 161 1103 269 991 q 104 1041 155 1099 q 43 992 62 992 q 4 1009 37 992 q -30 1027 -30 1025 q 61 1136 8 1071 q 115 1228 100 1194 q 130 1239 120 1239 l 201 1239 q 214 1228 210 1239 q 267 1136 224 1194 q 361 1027 313 1082 z "},\u00CF:{ha:329,x_min:-62,x_max:378,o:"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 378 1005 q 353 994 378 994 q 293 993 333 994 q 233 992 253 992 q 216 1011 216 992 l 216 1149 q 229 1166 216 1166 q 265 1164 241 1166 q 301 1162 289 1162 q 331 1163 311 1162 q 360 1164 351 1164 q 376 1153 376 1164 q 374 1115 376 1140 q 371 1076 371 1089 q 374 1040 371 1064 q 378 1005 378 1017 m 100 1002 q 81 992 100 994 q 41 992 66 991 q 14 994 12 994 q -17 993 3 994 q -48 991 -38 991 q -61 1004 -61 991 q -60 1036 -61 1015 q -58 1068 -58 1057 q -60 1109 -58 1082 q -62 1150 -62 1137 q -46 1165 -62 1165 q 16 1164 -26 1165 q 78 1164 58 1164 q 99 1149 99 1164 q 97 1112 99 1137 q 94 1075 94 1087 q 97 1038 94 1063 q 100 1002 100 1014 z "},\u00CC:{ha:329,x_min:-16,x_max:340,o:"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 339 1037 q 330 1002 339 1031 q 317 973 320 973 q 305 972 302 973 q -9 1135 68 1083 q -16 1143 -12 1137 q 24 1185 -9 1155 q 68 1215 58 1215 q 193 1146 85 1215 q 335 1050 293 1083 q 339 1037 340 1046 z "},\u00D3:{ha:1007,x_min:41,x_max:966,o:"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 701 1159 q 551 1056 690 1131 q 382 982 414 982 q 361 1016 370 982 q 354 1061 354 1042 q 367 1074 354 1067 q 599 1221 479 1129 q 609 1227 602 1223 q 618 1221 612 1225 q 693 1168 647 1196 q 701 1159 696 1166 z "},\u00D4:{ha:1007,x_min:41,x_max:966,o:"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 693 1024 q 659 1005 691 1021 q 621 989 627 989 q 494 1100 601 989 q 437 1038 487 1096 q 375 989 394 989 q 336 1006 370 989 q 302 1025 302 1023 q 393 1133 340 1068 q 448 1225 432 1192 q 463 1236 452 1236 l 534 1236 q 546 1225 543 1236 q 599 1133 557 1191 q 693 1024 646 1080 z "},\u00D2:{ha:1007,x_min:41,x_max:966,o:"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 678 1048 q 669 1013 678 1042 q 656 984 659 984 q 644 983 641 984 q 330 1145 407 1094 q 323 1154 328 1147 q 363 1196 330 1166 q 408 1226 397 1226 q 532 1157 424 1226 q 674 1061 632 1094 q 678 1048 680 1057 z "},\u00DA:{ha:917,x_min:68,x_max:848,o:"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 703 1136 q 553 1033 693 1108 q 385 959 417 959 q 363 993 372 959 q 357 1038 357 1019 q 370 1050 357 1044 q 602 1198 481 1106 q 612 1204 604 1200 q 621 1198 615 1202 q 696 1145 650 1173 q 703 1136 699 1143 z "},\u00DB:{ha:917,x_min:68,x_max:848,o:"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 664 1019 q 630 999 662 1015 q 591 983 597 983 q 465 1095 572 983 q 408 1033 458 1090 q 346 984 365 984 q 307 1001 340 984 q 273 1019 273 1017 q 364 1128 311 1063 q 418 1220 403 1186 q 433 1231 423 1231 l 505 1231 q 517 1220 513 1231 q 570 1128 528 1185 q 664 1019 616 1074 z "},\u00D9:{ha:917,x_min:68,x_max:848,o:"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 613 1038 q 604 1003 613 1032 q 591 975 594 975 q 579 973 576 975 q 265 1136 342 1084 q 258 1144 262 1138 q 298 1186 264 1156 q 342 1217 332 1217 q 467 1147 359 1217 q 609 1051 567 1084 q 613 1038 614 1047 z "},\u0131:{ha:306,x_min:62,x_max:241,o:"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 z "},"\u02C6":{ha:485,x_min:48,x_max:439,o:"m 439 771 q 405 752 437 768 q 366 736 372 736 q 239 847 347 736 q 182 785 233 843 q 121 736 140 736 q 82 753 115 736 q 48 772 48 770 q 139 880 86 815 q 193 972 178 939 q 208 983 198 983 l 279 983 q 292 972 288 983 q 345 880 302 938 q 439 771 391 827 z "},"\u02DC":{ha:485,x_min:25,x_max:461,o:"m 461 842 q 403 794 461 826 q 317 762 345 762 q 236 786 277 762 q 175 810 195 810 q 127 787 152 810 q 98 765 102 765 q 85 771 90 765 q 25 829 25 831 q 26 835 25 831 q 84 889 37 863 q 161 914 130 914 q 244 892 195 914 q 315 869 294 869 q 363 893 328 869 q 404 917 399 917 l 411 914 q 461 842 461 863 z "},"\xAF":{ha:485,x_min:25,x_max:472,o:"m 472 893 q 460 840 472 890 q 450 785 456 814 q 410 777 447 778 q 341 777 385 776 q 292 779 290 779 q 168 774 250 779 q 45 768 85 768 q 25 787 25 768 q 45 851 25 803 q 75 899 64 899 q 144 895 98 899 q 214 892 191 892 q 337 897 255 892 q 460 901 419 901 q 472 893 472 901 z "},"\u02D8":{ha:485,x_min:32,x_max:444,o:"m 444 940 q 390 784 444 844 q 239 721 334 721 q 86 783 143 721 q 32 940 32 844 q 52 951 32 951 q 121 939 119 951 q 130 903 124 927 q 239 823 157 823 q 347 901 319 823 q 355 939 349 914 q 382 949 359 949 q 444 940 444 949 z "},"\u02D9":{ha:485,x_min:141,x_max:320,o:"m 320 783 q 294 764 320 764 l 168 764 q 142 802 142 764 q 142 862 142 822 q 141 922 141 903 q 153 947 141 943 q 168 949 158 949 q 222 948 186 949 q 275 947 258 947 q 309 943 302 947 q 317 912 317 937 q 317 882 317 902 q 317 852 317 863 q 318 818 317 841 q 320 783 320 794 z "},"\u02DA":{ha:485,x_min:78,x_max:401,o:"m 401 832 q 353 720 401 766 q 239 673 305 673 q 125 720 173 673 q 78 832 78 766 q 125 947 78 899 q 239 994 172 994 q 354 947 307 994 q 401 832 401 899 m 321 832 q 298 894 321 868 q 239 920 275 920 q 180 894 203 920 q 157 832 157 868 q 181 775 157 800 q 237 750 205 750 q 296 774 271 750 q 321 832 321 798 z "},"\xB8":{ha:485,x_min:39,x_max:340,o:"m 340 -77 q 292 -219 340 -165 q 153 -275 241 -275 q 85 -254 127 -275 q 39 -213 39 -233 q 74 -170 39 -211 q 112 -128 109 -128 q 114 -129 113 -128 q 175 -158 144 -158 q 218 -138 199 -158 q 237 -93 237 -117 q 205 -18 237 -52 l 297 -20 q 340 -77 312 -38 z "},"\u02DD":{ha:485,x_min:14,x_max:515,o:"m 515 941 q 504 926 515 936 q 347 829 446 876 q 174 766 255 786 q 162 765 166 765 q 140 799 146 765 q 25 748 63 748 q 14 758 14 748 q 16 773 14 763 q 18 789 18 784 q 17 806 18 795 q 15 822 15 817 q 26 835 15 830 q 279 986 109 869 q 294 995 284 990 q 324 968 302 991 q 354 945 347 945 q 393 973 362 945 q 430 1002 424 1002 q 475 973 435 1002 q 515 941 515 945 z "},"\u02DB":{ha:485,x_min:110,x_max:398,o:"m 398 -162 q 334 -224 378 -199 q 246 -248 290 -248 q 148 -211 186 -248 q 110 -115 110 -174 q 113 -82 110 -100 q 159 -36 124 -66 q 210 -3 197 -3 l 301 -3 q 214 -111 214 -60 q 260 -152 214 -152 q 319 -133 292 -152 q 348 -113 347 -113 q 376 -135 354 -113 q 398 -162 398 -157 z "},"\u02C7":{ha:485,x_min:45,x_max:435,o:"m 435 953 q 345 844 397 910 q 290 753 306 787 q 275 742 285 742 l 204 742 q 192 753 195 742 q 139 844 180 787 q 45 954 92 898 q 79 974 46 958 q 117 989 111 989 q 244 878 137 989 q 301 940 251 882 q 362 988 344 988 q 401 972 368 988 q 435 953 435 956 z "},\u0141:{ha:718,x_min:-1,x_max:710,o:"m 710 147 q 700 12 710 52 q 676 -7 695 -7 q 526 -2 626 -7 q 375 4 425 4 q 233 2 328 4 q 92 0 139 0 q 75 17 75 0 q 80 240 75 91 q 85 464 85 389 q 78 700 85 543 q 71 935 71 857 q 87 950 71 950 q 125 948 100 950 q 163 946 150 946 q 201 948 175 946 q 239 950 227 950 q 255 937 255 950 q 250 721 255 865 q 244 504 244 576 q 244 397 244 469 q 243 290 243 325 q 256 139 243 139 q 633 151 506 139 q 665 156 640 152 q 696 160 685 160 q 710 147 710 160 m 492 519 q 479 507 492 513 q 309 438 422 484 q 22 322 214 399 q 16 321 19 321 q 1 335 7 321 l -1 444 q 12 458 -1 452 q 465 640 463 640 q 475 628 473 640 q 492 519 492 536 z "},\u0142:{ha:306,x_min:-28,x_max:399,o:"m 274 941 l 273 932 q 258 498 258 680 q 261 257 258 418 q 264 16 264 96 q 253 0 264 0 l 123 0 q 111 16 111 0 q 113 257 111 96 q 114 498 114 418 q 107 719 114 572 q 100 938 100 865 q 114 951 100 951 q 151 949 126 951 q 187 947 175 947 q 225 949 200 947 q 262 951 250 951 q 274 941 275 951 m 399 495 q 386 488 399 493 q -9 332 251 432 q -25 346 -19 332 l -28 456 q -14 469 -28 464 q 372 621 360 621 q 382 608 380 621 q 399 495 399 518 z "},\u0160:{ha:648,x_min:75,x_max:614,o:"m 614 883 q 576 815 600 861 q 550 755 569 794 q 539 749 546 749 q 474 773 540 749 q 365 798 408 798 q 240 688 240 798 q 328 581 240 627 q 490 493 475 505 q 578 304 578 423 q 458 65 578 153 q 193 -14 350 -14 q 114 3 119 -14 q 102 78 111 28 q 85 139 96 98 q 83 151 83 145 q 93 160 83 160 q 143 157 109 160 q 193 153 176 153 q 404 289 404 153 q 319 404 404 355 q 161 496 164 492 q 75 682 75 565 q 158 884 75 808 q 367 957 239 957 q 492 939 421 957 q 607 892 568 920 q 614 883 610 889 m 560 1197 q 469 1088 522 1154 q 415 997 431 1031 q 400 986 410 986 l 329 986 q 317 997 320 986 q 264 1088 305 1031 q 170 1198 216 1142 q 203 1218 171 1202 q 241 1234 236 1234 q 369 1122 262 1234 q 426 1184 376 1126 q 487 1232 469 1232 q 526 1216 493 1232 q 560 1197 559 1200 z "},\u0161:{ha:415,x_min:14,x_max:405,o:"m 387 209 q 306 47 387 108 q 127 -9 233 -9 q 81 -7 87 -9 q 70 26 70 -1 q 66 71 70 41 q 62 115 62 101 q 75 127 62 124 q 100 127 83 129 q 120 125 121 125 q 248 203 248 125 q 192 272 248 241 q 87 334 100 322 q 31 460 31 382 q 107 618 31 562 q 282 669 176 669 q 296 661 292 669 q 313 606 300 652 q 326 550 326 559 q 313 541 326 543 q 225 529 269 534 q 173 472 173 515 q 228 410 173 441 q 331 345 309 365 q 387 209 387 292 m 405 911 q 314 803 367 869 q 260 711 275 745 q 245 701 254 701 l 174 701 q 161 711 165 701 q 109 803 150 745 q 14 912 61 857 q 48 932 16 916 q 86 948 81 948 q 214 836 106 948 q 271 899 220 841 q 332 947 313 947 q 371 930 338 947 q 405 911 404 914 z "},\u017D:{ha:701,x_min:26,x_max:662,o:"m 662 155 q 653 83 662 132 q 644 9 644 34 q 628 -5 644 -5 q 507 -3 587 -5 q 386 0 427 0 l 64 0 q 41 14 45 0 q 26 127 26 90 q 233 459 26 134 q 439 800 439 783 q 422 807 439 807 l 61 807 q 47 821 47 807 q 57 882 47 826 q 70 948 67 939 q 85 957 72 957 q 164 952 112 957 q 241 947 216 947 l 623 947 q 637 936 635 947 q 648 835 648 895 q 433 494 648 831 q 218 146 218 157 q 231 142 221 142 q 532 150 427 142 q 593 157 545 151 q 653 163 631 163 q 662 155 662 163 m 549 1189 q 458 1080 511 1146 q 404 989 420 1023 q 389 978 399 978 l 318 978 q 306 989 309 978 q 253 1080 294 1023 q 159 1190 205 1134 q 193 1210 160 1194 q 231 1225 225 1225 q 358 1114 251 1225 q 415 1176 365 1118 q 476 1224 458 1224 q 515 1208 482 1224 q 549 1189 549 1192 z "},\u017E:{ha:585,x_min:21,x_max:572,o:"m 572 129 q 562 81 572 125 q 550 21 551 33 q 538 -3 547 -3 q 474 0 514 -3 q 411 4 429 3 q 281 5 366 5 q 135 0 215 5 q 49 -7 35 -7 q 31 5 35 -7 q 21 81 21 38 q 22 99 21 87 q 22 115 22 110 q 37 138 22 125 q 182 292 52 151 q 368 503 248 360 l 69 503 q 58 517 58 503 q 67 575 58 536 q 75 633 75 614 q 94 642 75 642 q 208 638 132 642 q 321 635 283 635 q 530 632 507 635 q 547 618 547 630 q 539 503 547 515 q 422 369 532 493 q 207 129 351 288 q 557 135 433 135 q 572 129 572 135 m 503 895 q 412 786 465 852 q 358 694 374 728 q 343 684 353 684 l 272 684 q 260 694 263 684 q 207 786 248 728 q 113 895 159 840 q 146 915 114 899 q 184 931 179 931 q 312 819 205 931 q 369 882 319 824 q 430 930 412 930 q 469 913 436 930 q 503 895 503 897 z "},"\xA6":{ha:340,x_min:107,x_max:232,o:"m 232 481 q 224 473 232 474 q 119 464 163 464 q 114 471 114 464 l 114 761 q 111 896 114 806 q 107 1031 107 986 q 181 1052 107 1052 q 225 1042 224 1052 q 223 961 223 1057 l 224 770 q 228 625 224 723 q 232 481 232 530 m 232 -220 q 224 -229 232 -228 q 119 -238 163 -238 q 114 -231 114 -238 l 114 59 q 111 194 114 104 q 107 329 107 284 q 181 351 107 351 q 225 340 224 351 q 223 259 223 355 l 224 68 q 228 -77 224 22 q 232 -220 232 -172 z "},\u00D0:{ha:945,x_min:-18,x_max:905,o:"m 905 481 q 797 151 905 290 q 494 0 679 0 q 388 3 459 0 q 282 5 317 5 q 186 3 250 5 q 90 0 122 0 q 73 17 73 0 q 79 240 73 91 q 85 464 85 389 q 79 701 85 543 q 74 937 74 859 q 92 951 74 951 q 166 951 117 951 q 241 950 216 950 q 312 951 264 950 q 384 951 359 951 q 734 863 619 951 q 863 691 817 799 q 905 481 905 591 m 739 481 q 656 720 739 627 q 424 815 569 815 q 327 817 304 815 q 248 787 248 812 q 245 631 248 735 q 243 475 243 527 q 245 320 243 423 q 248 165 248 217 q 329 136 248 140 q 428 136 318 136 q 552 153 506 136 q 654 228 609 173 q 739 481 739 331 m 443 530 q 427 468 443 541 q 418 410 425 448 q 401 403 416 403 q 299 404 368 403 q 197 406 231 406 q 98 401 164 406 q 0 396 33 396 q -18 416 -18 396 q 21 532 -18 439 q 40 542 25 542 q 429 547 83 542 q 443 530 443 541 z "},\u00F0:{ha:772,x_min:28,x_max:806,o:"m 721 946 q 713 684 721 859 q 705 422 705 509 q 717 17 705 155 l 718 8 q 699 -1 718 1 q 663 -1 686 -2 q 636 1 634 1 q 606 -1 626 1 q 576 -3 587 -3 q 565 44 567 -3 q 560 92 564 92 q 550 83 556 90 q 336 -17 457 -17 q 111 87 199 -17 q 28 325 28 186 q 112 568 28 469 q 342 671 200 671 q 491 621 427 671 q 549 570 520 595 q 554 579 554 572 l 554 799 q 552 867 554 821 q 550 935 550 912 q 561 951 550 951 q 635 956 586 951 q 709 960 685 960 q 721 946 721 960 m 551 329 q 501 472 551 410 q 368 538 448 538 q 231 473 285 538 q 179 326 179 412 q 233 184 179 245 q 368 121 288 121 q 503 185 450 121 q 551 329 551 245 m 806 852 q 791 787 806 857 q 783 736 789 764 q 407 724 777 724 q 392 742 392 724 q 427 846 392 775 q 444 854 431 854 q 619 857 503 854 q 793 860 735 860 q 806 852 806 860 z "},\u00DD:{ha:815,x_min:24,x_max:794,o:"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 m 623 1151 q 473 1048 612 1123 q 304 974 336 974 q 283 1008 292 974 q 276 1053 276 1034 q 289 1065 276 1059 q 521 1213 401 1121 q 531 1219 524 1215 q 540 1213 534 1217 q 615 1160 569 1188 q 623 1151 618 1158 z "},\u00DE:{ha:867,x_min:68,x_max:839,o:"m 839 517 q 751 268 839 358 q 507 178 664 178 q 390 180 468 178 q 272 183 311 183 q 250 155 250 183 q 255 82 250 131 q 259 9 259 34 q 246 -2 259 -2 q 203 1 232 -2 q 160 4 174 4 q 124 2 148 4 q 89 0 100 0 q 72 21 72 0 q 78 244 72 95 q 85 468 85 393 q 69 922 85 645 l 69 930 q 92 951 68 951 q 129 949 104 951 q 165 947 153 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 250 847 256 923 q 296 846 273 846 q 398 850 330 846 q 498 854 465 854 q 744 761 648 854 q 839 517 839 667 m 668 507 q 612 663 668 606 q 456 720 555 720 q 345 714 425 720 q 250 703 253 708 q 245 484 245 695 q 247 405 245 457 q 249 326 249 353 q 264 317 249 320 q 471 310 301 310 q 668 507 668 310 z "},\u00FE:{ha:798,x_min:71,x_max:761,o:"m 761 326 q 675 88 761 189 q 449 -18 583 -18 q 300 37 369 -18 q 243 92 272 64 q 237 -191 237 85 q 222 -212 237 -212 q 98 -210 117 -212 q 83 -192 83 -208 q 85 68 83 -105 q 86 329 86 242 q 78 634 86 431 q 71 939 71 838 q 89 958 71 956 q 161 961 113 959 q 200 966 171 962 q 239 970 224 970 q 250 954 250 970 q 247 884 250 931 q 243 812 243 836 q 241 701 243 775 q 239 589 239 627 q 243 563 239 563 q 254 572 248 566 q 446 669 349 669 q 673 564 581 669 q 761 326 761 463 m 603 329 q 552 472 603 410 q 418 538 498 538 q 289 470 339 538 q 243 328 243 409 q 291 184 243 245 q 424 118 342 118 q 554 186 500 118 q 603 329 603 250 z "},"\xAD":{ha:561,x_min:23,x_max:532,o:"m 532 471 q 522 350 532 462 q 513 345 520 345 q 390 347 472 345 q 267 349 308 349 q 35 345 267 349 q 23 354 23 345 q 29 412 23 362 q 32 475 29 441 q 47 482 37 482 q 160 478 85 482 q 272 473 235 473 q 396 476 313 473 q 519 479 478 479 q 532 471 532 479 z "},"\xB9":{ha:335,x_min:27,x_max:277,o:"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 z "},"\xB2":{ha:532,x_min:18,x_max:503,o:"m 503 268 q 486 258 503 258 q 381 261 451 258 q 276 265 311 265 q 168 264 240 265 q 58 262 95 262 q 44 272 47 262 q 31 370 31 312 q 43 384 31 382 q 114 404 66 387 q 311 637 311 517 q 210 703 311 703 q 104 671 167 703 q 50 640 42 640 q 44 641 46 640 q 30 697 42 642 q 18 761 18 753 q 125 811 29 786 q 250 833 208 833 q 399 798 340 833 q 471 671 471 755 q 243 385 471 519 l 264 385 q 486 396 353 383 l 492 396 q 500 385 500 396 q 499 354 500 374 q 498 323 498 333 q 500 296 498 314 q 503 268 503 277 z "},"\xB3":{ha:525,x_min:27,x_max:478,o:"m 478 423 q 404 290 478 334 q 248 254 343 254 q 37 292 135 254 q 27 300 27 296 q 28 306 27 302 q 41 339 33 317 q 52 393 44 357 q 61 404 55 404 q 68 401 64 403 q 212 366 153 366 q 294 376 270 366 q 332 440 332 393 q 206 517 332 517 q 162 515 190 517 q 124 514 134 514 q 94 525 94 514 q 110 616 94 616 q 176 611 132 616 q 241 607 220 607 q 302 661 302 607 q 199 722 302 722 q 99 708 139 722 q 70 695 89 703 q 63 694 67 694 q 57 705 59 694 q 52 787 52 731 q 134 822 52 810 q 239 831 191 831 q 382 799 319 831 q 462 686 462 759 q 393 562 462 593 q 478 423 478 520 z "},"\xBD":{ha:1086,x_min:27,x_max:998,o:"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 m 703 789 q 699 777 703 786 q 472 380 621 646 q 252 -41 401 238 q 240 -53 245 -53 q 192 -18 237 -53 q 147 22 147 18 q 151 32 147 26 q 603 851 439 525 q 612 860 608 860 q 663 829 623 860 q 703 789 703 798 m 998 7 q 981 -3 998 -3 q 876 0 945 -3 q 770 4 806 4 q 662 3 734 4 q 553 1 589 1 q 538 11 541 1 q 526 109 526 51 q 537 123 526 121 q 608 142 561 126 q 805 376 805 256 q 705 441 805 441 q 599 410 661 441 q 544 379 536 379 q 538 380 541 379 q 525 436 536 381 q 513 500 513 492 q 619 550 524 525 q 744 572 703 572 q 894 537 835 572 q 966 410 966 494 q 738 124 966 258 l 758 124 q 980 135 848 122 l 987 135 q 995 123 995 135 q 994 93 995 113 q 992 62 992 72 q 995 35 992 53 q 998 7 998 16 z "},"\xBC":{ha:1086,x_min:27,x_max:987,o:"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 m 731 789 q 726 777 731 786 q 500 380 649 646 q 280 -41 429 238 q 268 -53 273 -53 q 220 -18 264 -53 q 175 22 175 18 q 178 32 175 26 q 631 851 467 525 q 640 860 635 860 q 691 829 650 860 q 731 789 731 798 m 987 107 q 928 100 987 100 q 911 85 911 100 q 913 44 911 72 q 916 2 916 16 q 837 -13 916 -13 q 751 -3 751 -13 q 757 43 751 12 q 762 90 762 74 q 754 100 762 100 q 636 97 715 100 q 517 95 557 95 q 489 121 494 95 q 487 165 487 129 q 496 221 487 211 q 632 387 557 288 q 758 559 695 473 q 774 570 766 570 q 902 545 828 570 q 918 528 918 541 q 915 457 918 505 q 911 387 911 410 q 910 317 911 366 q 909 248 909 273 l 909 212 q 944 214 921 212 q 978 216 967 216 q 987 208 987 216 q 987 157 987 191 q 987 107 987 124 m 779 429 l 779 432 q 685 307 764 406 q 610 212 648 260 q 653 208 613 208 q 767 210 724 208 q 774 302 768 238 q 780 395 780 362 q 779 429 780 413 z "},"\xBE":{ha:1086,x_min:-4,x_max:1059,o:"m 876 789 q 871 777 876 786 q 644 380 793 646 q 425 -41 574 238 q 412 -53 418 -53 q 364 -18 409 -53 q 319 22 319 18 q 323 32 319 26 q 775 851 612 525 q 785 860 780 860 q 835 829 795 860 q 876 789 876 798 m 1059 107 q 1000 100 1059 100 q 983 85 983 100 q 985 44 983 72 q 988 2 988 16 q 909 -13 988 -13 q 823 -3 823 -13 q 829 43 823 12 q 834 90 834 74 q 826 100 834 100 q 708 97 787 100 q 589 95 629 95 q 561 121 566 95 q 559 165 559 129 q 568 221 559 211 q 704 387 629 288 q 830 559 767 473 q 846 570 838 570 q 974 545 900 570 q 990 528 990 541 q 986 457 990 505 q 983 387 983 410 q 982 317 983 366 q 981 248 981 273 l 981 212 q 1016 214 993 212 q 1050 216 1039 216 q 1059 208 1059 216 q 1059 157 1059 191 q 1059 107 1059 124 m 850 429 l 850 432 q 757 307 836 406 q 682 212 720 260 q 725 208 685 208 q 839 210 795 208 q 846 302 840 238 q 852 395 852 362 q 850 429 852 413 m 447 423 q 373 290 447 334 q 217 254 312 254 q 6 292 104 254 q -4 300 -4 296 q -3 306 -4 302 q 10 339 2 317 q 20 393 13 357 q 30 404 24 404 q 37 401 33 403 q 181 366 122 366 q 263 376 239 366 q 301 440 301 393 q 175 517 301 517 q 131 515 159 517 q 93 514 102 514 q 63 525 63 514 q 79 616 63 616 q 144 611 100 616 q 210 607 189 607 q 271 661 271 607 q 168 722 271 722 q 68 708 108 722 q 39 695 58 703 q 32 694 36 694 q 26 705 28 694 q 20 787 20 731 q 103 822 20 810 q 208 831 159 831 q 351 799 288 831 q 431 686 431 759 q 362 562 431 593 q 447 423 447 520 z "},\u00FD:{ha:661,x_min:24,x_max:640,o:"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 m 534 892 q 384 789 524 865 q 215 715 248 715 q 194 749 203 715 q 187 794 187 776 q 200 807 187 801 q 432 954 312 863 q 442 960 435 957 q 451 954 446 959 q 526 901 480 930 q 534 892 530 899 z "},"\xD7":{ha:561,x_min:42,x_max:503,o:"m 503 553 q 491 530 503 541 l 363 401 l 490 274 q 502 250 502 262 q 472 201 502 232 q 423 171 441 171 q 401 182 412 171 l 272 311 l 144 183 q 122 172 134 172 q 73 202 103 172 q 42 250 42 231 q 53 273 42 261 l 182 401 l 54 529 q 43 551 43 540 q 73 601 43 571 q 121 631 102 631 q 144 621 132 631 l 272 492 l 400 619 q 423 631 412 631 q 472 601 441 631 q 503 553 503 571 z "},"\u2074":{ha:552,x_min:26,x_max:526,o:"m 526 379 q 467 372 526 372 q 450 357 450 372 q 452 316 450 344 q 455 274 455 288 q 376 259 455 259 q 290 269 290 259 q 296 315 290 284 q 301 361 301 346 q 293 372 301 372 q 175 369 254 372 q 56 367 96 367 q 28 393 33 367 q 26 437 26 401 q 35 493 26 483 q 171 659 96 559 q 297 831 234 745 q 313 842 304 842 q 441 817 367 842 q 457 800 457 812 q 453 729 457 777 q 450 659 450 682 q 449 589 450 638 q 448 520 448 545 l 448 484 q 483 486 460 484 q 517 488 506 488 q 526 480 526 488 q 526 429 526 463 q 526 379 526 396 m 317 701 l 317 704 q 224 578 302 678 q 149 484 186 532 q 192 479 152 479 q 306 481 262 479 q 313 574 307 510 q 319 667 319 634 q 317 701 319 685 z "},"\u20AC":{ha:642,x_min:43,x_max:595,o:"m 595 4 q 583 -15 595 -11 q 521 -22 561 -22 q 283 51 387 -22 q 135 251 178 124 q 57 249 89 249 q 44 259 44 249 q 50 359 44 334 q 62 368 52 368 q 111 368 85 368 q 110 409 110 388 q 112 452 110 431 q 57 452 81 452 q 43 466 43 452 q 50 566 43 538 q 64 576 52 576 q 140 575 96 576 q 292 766 186 695 q 523 836 396 836 q 576 831 549 836 q 588 820 588 828 q 587 797 588 820 q 585 758 585 773 q 586 725 585 748 q 587 700 587 703 q 574 688 587 686 q 523 694 528 694 q 302 570 375 694 q 426 572 343 570 q 550 574 509 574 q 562 562 562 574 q 554 458 562 509 q 547 450 553 450 q 414 453 503 450 q 279 457 325 457 l 264 457 q 261 409 261 433 q 264 363 261 385 q 301 363 284 363 q 427 365 343 363 q 553 367 511 367 q 563 356 563 367 q 555 256 563 347 q 547 248 553 248 l 541 249 q 296 256 411 256 q 529 118 369 118 q 587 124 562 118 q 595 115 595 126 q 594 89 595 111 q 593 60 593 68 q 594 32 593 54 q 595 4 595 10 z "}},familyName:"Berlin Sans FB",ascender:1244,descender:-282,underlinePosition:-176,underlineThickness:69,boundingBox:{yMin:-282,xMin:-71,yMax:1244,xMax:1492},resolution:1e3,original_font_information:{format:0,copyright:"Copyright (c) 1997 The Font Bureau, Inc. All rights reserved. Designed by David Berlow.",fontFamily:"Berlin Sans FB",fontSubfamily:"Regular",uniqueID:"FB Berlin Sans FB Regular",fullName:"Berlin Sans FB",version:"Version 1.00",postScriptName:"BerlinSansFB-Reg",trademark:"Copyright (c) 1985, 1987, 1988, 1989 The Font Bureau, Inc. All rights reserved. Berlin Sans is a trademark of The Font Bureau, Inc.",manufacturer:"The Font Bureau, Inc.",designer:"David Berlow",description:"Berlin Sans is based on a brilliant alphabet from the late twenties, the first sans that Lucian Bernhard ever designed, imaginative and little-known. Assisted by Matthew Butterick, David Berlow expanded the single font into a series of four weights, all four complete with Expert character sets, plus one dingbat font.",manufacturerURL:"http://www.fontbureau.com",designerURL:"http://www.fontbureau.com/designers/"},cssFontWeight:"normal",cssFontStyle:"normal"};String.prototype.codePointAt||function(){var e=function(){try{var r={},n=Object.defineProperty,i=n(r,r,r)&&n}catch{}return i}(),t=function(r){if(this==null)throw TypeError();var n=String(this),i=n.length,s=r?Number(r):0;if(s!=s&&(s=0),!(s<0||s>=i)){var o=n.charCodeAt(s),a;return o>=55296&&o<=56319&&i>s+1&&(a=n.charCodeAt(s+1),a>=56320&&a<=57343)?(o-55296)*1024+a-56320+65536:o}};e?e(String.prototype,"codePointAt",{value:t,configurable:!0,writable:!0}):String.prototype.codePointAt=t}();var to=0,v2=-3;function Kr(){this.table=new Uint16Array(16),this.trans=new Uint16Array(288)}function A5(e,t){this.source=e,this.sourceIndex=0,this.tag=0,this.bitcount=0,this.dest=t,this.destLen=0,this.ltree=new Kr,this.dtree=new Kr}var g2=new Kr,x2=new Kr,ro=new Uint8Array(30),no=new Uint16Array(30),y2=new Uint8Array(30),b2=new Uint16Array(30),C5=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ia=new Kr,We=new Uint8Array(320);function S2(e,t,r,n){var i,s;for(i=0;i>>=1,t}function Xe(e,t,r){if(!t)return r;for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<>>16-t;return e.tag>>>=t,e.bitcount-=t,n+r}function Xs(e,t){for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<>>=1,++i,r+=t.table[i],n-=t.table[i];while(n>=0);return e.tag=s,e.bitcount-=i,t.trans[r+n]}function k5(e,t,r){var n,i,s,o,a,l;for(n=Xe(e,5,257),i=Xe(e,5,1),s=Xe(e,4,4),o=0;o<19;++o)We[o]=0;for(o=0;o8;)e.sourceIndex--,e.bitcount-=8;if(t=e.source[e.sourceIndex+1],t=256*t+e.source[e.sourceIndex],r=e.source[e.sourceIndex+3],r=256*r+e.source[e.sourceIndex+2],t!==(~r&65535))return v2;for(e.sourceIndex+=4,n=t;n;--n)e.dest[e.destLen++]=e.source[e.sourceIndex++];return e.bitcount=0,to}function B5(e,t){var r=new A5(e,t),n,i,s;do{switch(n=M5(r),i=Xe(r,2,0),i){case 0:s=I5(r);break;case 1:s=Ra(r,g2,x2);break;case 2:k5(r,r.ltree,r.dtree),s=Ra(r,r.ltree,r.dtree);break;default:s=v2}if(s!==to)throw new Error("Data error")}while(!n);return r.destLenthis.x2&&(this.x2=e)),typeof t=="number"&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=t,this.y2=t),tthis.y2&&(this.y2=t))};st.prototype.addX=function(e){this.addPoint(e,null)};st.prototype.addY=function(e){this.addPoint(null,e)};st.prototype.addBezier=function(e,t,r,n,i,s,o,a){var l=[e,t],u=[r,n],c=[i,s],f=[o,a];this.addPoint(e,t),this.addPoint(o,a);for(var q=0;q<=1;q++){var p=6*l[q]-12*u[q]+6*c[q],d=-3*l[q]+9*u[q]-9*c[q]+3*f[q],v=3*u[q]-3*l[q];if(d===0){if(p===0)continue;var m=-v/p;0=0&&l>0&&(a+=" "),a+=t(u)}return a}for(var n="",i=0;i=0&&e<=255,"Byte value should be between 0 and 255."),[e]};z.BYTE=Ne(1);R.CHAR=function(e){return[e.charCodeAt(0)]};z.CHAR=Ne(1);R.CHARARRAY=function(e){typeof e>"u"&&(e="",console.warn("Undefined CHARARRAY encountered and treated as an empty string. This is probably caused by a missing glyph name."));for(var t=[],r=0;r"u"?0:e.length};R.USHORT=function(e){return[e>>8&255,e&255]};z.USHORT=Ne(2);R.SHORT=function(e){return e>=Oa&&(e=-(2*Oa-e)),[e>>8&255,e&255]};z.SHORT=Ne(2);R.UINT24=function(e){return[e>>16&255,e>>8&255,e&255]};z.UINT24=Ne(3);R.ULONG=function(e){return[e>>24&255,e>>16&255,e>>8&255,e&255]};z.ULONG=Ne(4);R.LONG=function(e){return e>=Da&&(e=-(2*Da-e)),[e>>24&255,e>>16&255,e>>8&255,e&255]};z.LONG=Ne(4);R.FIXED=R.ULONG;z.FIXED=z.ULONG;R.FWORD=R.SHORT;z.FWORD=z.SHORT;R.UFWORD=R.USHORT;z.UFWORD=z.USHORT;R.LONGDATETIME=function(e){return[0,0,0,0,e>>24&255,e>>16&255,e>>8&255,e&255]};z.LONGDATETIME=Ne(8);R.TAG=function(e){return N.argument(e.length===4,"Tag should be exactly 4 ASCII characters."),[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]};z.TAG=Ne(4);R.Card8=R.BYTE;z.Card8=z.BYTE;R.Card16=R.USHORT;z.Card16=z.USHORT;R.OffSize=R.BYTE;z.OffSize=z.BYTE;R.SID=R.USHORT;z.SID=z.USHORT;R.NUMBER=function(e){return e>=-107&&e<=107?[e+139]:e>=108&&e<=1131?(e=e-108,[(e>>8)+247,e&255]):e>=-1131&&e<=-108?(e=-e-108,[(e>>8)+251,e&255]):e>=-32768&&e<=32767?R.NUMBER16(e):R.NUMBER32(e)};z.NUMBER=function(e){return R.NUMBER(e).length};R.NUMBER16=function(e){return[28,e>>8&255,e&255]};z.NUMBER16=Ne(3);R.NUMBER32=function(e){return[29,e>>24&255,e>>16&255,e>>8&255,e&255]};z.NUMBER32=Ne(5);R.REAL=function(e){var t=e.toString(),r=/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(t);if(r){var n=parseFloat("1e"+((r[2]?+r[2]:0)+r[1].length));t=(Math.round(e*n)/n).toString()}for(var i="",s=0,o=t.length;s>8&255,t[t.length]=n&255}return t};z.UTF16=function(e){return e.length*2};var js={"x-mac-croatian":"\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC\u2020\xB0\xA2\xA3\xA7\u2022\xB6\xDF\xAE\u0160\u2122\xB4\xA8\u2260\u017D\xD8\u221E\xB1\u2264\u2265\u2206\xB5\u2202\u2211\u220F\u0161\u222B\xAA\xBA\u03A9\u017E\xF8\xBF\xA1\xAC\u221A\u0192\u2248\u0106\xAB\u010C\u2026\xA0\xC0\xC3\xD5\u0152\u0153\u0110\u2014\u201C\u201D\u2018\u2019\xF7\u25CA\uF8FF\xA9\u2044\u20AC\u2039\u203A\xC6\xBB\u2013\xB7\u201A\u201E\u2030\xC2\u0107\xC1\u010D\xC8\xCD\xCE\xCF\xCC\xD3\xD4\u0111\xD2\xDA\xDB\xD9\u0131\u02C6\u02DC\xAF\u03C0\xCB\u02DA\xB8\xCA\xE6\u02C7","x-mac-cyrillic":"\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u2020\xB0\u0490\xA3\xA7\u2022\xB6\u0406\xAE\xA9\u2122\u0402\u0452\u2260\u0403\u0453\u221E\xB1\u2264\u2265\u0456\xB5\u0491\u0408\u0404\u0454\u0407\u0457\u0409\u0459\u040A\u045A\u0458\u0405\xAC\u221A\u0192\u2248\u2206\xAB\xBB\u2026\xA0\u040B\u045B\u040C\u045C\u0455\u2013\u2014\u201C\u201D\u2018\u2019\xF7\u201E\u040E\u045E\u040F\u045F\u2116\u0401\u0451\u044F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E","x-mac-gaelic":"\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC\u2020\xB0\xA2\xA3\xA7\u2022\xB6\xDF\xAE\xA9\u2122\xB4\xA8\u2260\xC6\xD8\u1E02\xB1\u2264\u2265\u1E03\u010A\u010B\u1E0A\u1E0B\u1E1E\u1E1F\u0120\u0121\u1E40\xE6\xF8\u1E41\u1E56\u1E57\u027C\u0192\u017F\u1E60\xAB\xBB\u2026\xA0\xC0\xC3\xD5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u1E61\u1E9B\xFF\u0178\u1E6A\u20AC\u2039\u203A\u0176\u0177\u1E6B\xB7\u1EF2\u1EF3\u204A\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4\u2663\xD2\xDA\xDB\xD9\u0131\xDD\xFD\u0174\u0175\u1E84\u1E85\u1E80\u1E81\u1E82\u1E83","x-mac-greek":"\xC4\xB9\xB2\xC9\xB3\xD6\xDC\u0385\xE0\xE2\xE4\u0384\xA8\xE7\xE9\xE8\xEA\xEB\xA3\u2122\xEE\xEF\u2022\xBD\u2030\xF4\xF6\xA6\u20AC\xF9\xFB\xFC\u2020\u0393\u0394\u0398\u039B\u039E\u03A0\xDF\xAE\xA9\u03A3\u03AA\xA7\u2260\xB0\xB7\u0391\xB1\u2264\u2265\xA5\u0392\u0395\u0396\u0397\u0399\u039A\u039C\u03A6\u03AB\u03A8\u03A9\u03AC\u039D\xAC\u039F\u03A1\u2248\u03A4\xAB\xBB\u2026\xA0\u03A5\u03A7\u0386\u0388\u0153\u2013\u2015\u201C\u201D\u2018\u2019\xF7\u0389\u038A\u038C\u038E\u03AD\u03AE\u03AF\u03CC\u038F\u03CD\u03B1\u03B2\u03C8\u03B4\u03B5\u03C6\u03B3\u03B7\u03B9\u03BE\u03BA\u03BB\u03BC\u03BD\u03BF\u03C0\u03CE\u03C1\u03C3\u03C4\u03B8\u03C9\u03C2\u03C7\u03C5\u03B6\u03CA\u03CB\u0390\u03B0\xAD","x-mac-icelandic":"\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC\xDD\xB0\xA2\xA3\xA7\u2022\xB6\xDF\xAE\xA9\u2122\xB4\xA8\u2260\xC6\xD8\u221E\xB1\u2264\u2265\xA5\xB5\u2202\u2211\u220F\u03C0\u222B\xAA\xBA\u03A9\xE6\xF8\xBF\xA1\xAC\u221A\u0192\u2248\u2206\xAB\xBB\u2026\xA0\xC0\xC3\xD5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\xF7\u25CA\xFF\u0178\u2044\u20AC\xD0\xF0\xDE\xFE\xFD\xB7\u201A\u201E\u2030\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4\uF8FF\xD2\xDA\xDB\xD9\u0131\u02C6\u02DC\xAF\u02D8\u02D9\u02DA\xB8\u02DD\u02DB\u02C7","x-mac-inuit":"\u1403\u1404\u1405\u1406\u140A\u140B\u1431\u1432\u1433\u1434\u1438\u1439\u1449\u144E\u144F\u1450\u1451\u1455\u1456\u1466\u146D\u146E\u146F\u1470\u1472\u1473\u1483\u148B\u148C\u148D\u148E\u1490\u1491\xB0\u14A1\u14A5\u14A6\u2022\xB6\u14A7\xAE\xA9\u2122\u14A8\u14AA\u14AB\u14BB\u14C2\u14C3\u14C4\u14C5\u14C7\u14C8\u14D0\u14EF\u14F0\u14F1\u14F2\u14F4\u14F5\u1505\u14D5\u14D6\u14D7\u14D8\u14DA\u14DB\u14EA\u1528\u1529\u152A\u152B\u152D\u2026\xA0\u152E\u153E\u1555\u1556\u1557\u2013\u2014\u201C\u201D\u2018\u2019\u1558\u1559\u155A\u155D\u1546\u1547\u1548\u1549\u154B\u154C\u1550\u157F\u1580\u1581\u1582\u1583\u1584\u1585\u158F\u1590\u1591\u1592\u1593\u1594\u1595\u1671\u1672\u1673\u1674\u1675\u1676\u1596\u15A0\u15A1\u15A2\u15A3\u15A4\u15A5\u15A6\u157C\u0141\u0142","x-mac-ce":"\xC4\u0100\u0101\xC9\u0104\xD6\xDC\xE1\u0105\u010C\xE4\u010D\u0106\u0107\xE9\u0179\u017A\u010E\xED\u010F\u0112\u0113\u0116\xF3\u0117\xF4\xF6\xF5\xFA\u011A\u011B\xFC\u2020\xB0\u0118\xA3\xA7\u2022\xB6\xDF\xAE\xA9\u2122\u0119\xA8\u2260\u0123\u012E\u012F\u012A\u2264\u2265\u012B\u0136\u2202\u2211\u0142\u013B\u013C\u013D\u013E\u0139\u013A\u0145\u0146\u0143\xAC\u221A\u0144\u0147\u2206\xAB\xBB\u2026\xA0\u0148\u0150\xD5\u0151\u014C\u2013\u2014\u201C\u201D\u2018\u2019\xF7\u25CA\u014D\u0154\u0155\u0158\u2039\u203A\u0159\u0156\u0157\u0160\u201A\u201E\u0161\u015A\u015B\xC1\u0164\u0165\xCD\u017D\u017E\u016A\xD3\xD4\u016B\u016E\xDA\u016F\u0170\u0171\u0172\u0173\xDD\xFD\u0137\u017B\u0141\u017C\u0122\u02C7",macintosh:"\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC\u2020\xB0\xA2\xA3\xA7\u2022\xB6\xDF\xAE\xA9\u2122\xB4\xA8\u2260\xC6\xD8\u221E\xB1\u2264\u2265\xA5\xB5\u2202\u2211\u220F\u03C0\u222B\xAA\xBA\u03A9\xE6\xF8\xBF\xA1\xAC\u221A\u0192\u2248\u2206\xAB\xBB\u2026\xA0\xC0\xC3\xD5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\xF7\u25CA\xFF\u0178\u2044\u20AC\u2039\u203A\uFB01\uFB02\u2021\xB7\u201A\u201E\u2030\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4\uF8FF\xD2\xDA\xDB\xD9\u0131\u02C6\u02DC\xAF\u02D8\u02D9\u02DA\xB8\u02DD\u02DB\u02C7","x-mac-romanian":"\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC\u2020\xB0\xA2\xA3\xA7\u2022\xB6\xDF\xAE\xA9\u2122\xB4\xA8\u2260\u0102\u0218\u221E\xB1\u2264\u2265\xA5\xB5\u2202\u2211\u220F\u03C0\u222B\xAA\xBA\u03A9\u0103\u0219\xBF\xA1\xAC\u221A\u0192\u2248\u2206\xAB\xBB\u2026\xA0\xC0\xC3\xD5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\xF7\u25CA\xFF\u0178\u2044\u20AC\u2039\u203A\u021A\u021B\u2021\xB7\u201A\u201E\u2030\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4\uF8FF\xD2\xDA\xDB\xD9\u0131\u02C6\u02DC\xAF\u02D8\u02D9\u02DA\xB8\u02DD\u02DB\u02C7","x-mac-turkish":"\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC\u2020\xB0\xA2\xA3\xA7\u2022\xB6\xDF\xAE\xA9\u2122\xB4\xA8\u2260\xC6\xD8\u221E\xB1\u2264\u2265\xA5\xB5\u2202\u2211\u220F\u03C0\u222B\xAA\xBA\u03A9\xE6\xF8\xBF\xA1\xAC\u221A\u0192\u2248\u2206\xAB\xBB\u2026\xA0\xC0\xC3\xD5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\xF7\u25CA\xFF\u0178\u011E\u011F\u0130\u0131\u015E\u015F\u2021\xB7\u201A\u201E\u2030\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4\uF8FF\xD2\xDA\xDB\xD9\uF8A0\u02C6\u02DC\xAF\u02D8\u02D9\u02DA\xB8\u02DD\u02DB\u02C7"};pr.MACSTRING=function(e,t,r,n){var i=js[n];if(i!==void 0){for(var s="",o=0;o=128&&(s=r[s],s===void 0))return;n[i]=s}return n}};z.MACSTRING=function(e,t){var r=R.MACSTRING(e,t);return r!==void 0?r.length:0};function Ys(e){return e>=-128&&e<=127}function O5(e,t,r){for(var n=0,i=e.length;t>8&255,l+256&255)}return s}R.VARDELTAS=function(e){for(var t=0,r=[];t=-128&&n<=127?t=D5(e,t,r):t=L5(e,t,r)}return r};R.INDEX=function(e){for(var t=1,r=[t],n=[],i=0;i>8,t[f+1]=q&255,t=t.concat(n[c])}return t};z.TABLE=function(e){for(var t=0,r=e.fields.length,n=0;n0)return new A(this.data,this.offset+t).parseStruct(e)};A.prototype.parsePointer32=function(e){var t=this.parseOffset32();if(t>0)return new A(this.data,this.offset+t).parseStruct(e)};A.prototype.parseListOfLists=function(e){for(var t=this.parseOffset16List(),r=t.length,n=this.relativeOffset,i=new Array(r),s=0;s>1,t.skip("uShort",3),e.glyphIndexMap={};for(var o=new D.Parser(r,n+i+14),a=new D.Parser(r,n+i+16+s*2),l=new D.Parser(r,n+i+16+s*4),u=new D.Parser(r,n+i+16+s*6),c=n+i+16+s*8,f=0;f=0;i-=1){var s=D.getUShort(e,t+4+i*8),o=D.getUShort(e,t+4+i*8+2);if(s===3&&(o===0||o===1||o===10)||s===0&&(o===0||o===1||o===2||o===3||o===4)){n=D.getULong(e,t+4+i*8+4);break}}if(n===-1)throw new Error("No valid cmap sub-tables found.");var a=new D.Parser(e,t+n);if(r.format=a.parseUShort(),r.format===12)W5(r,a);else if(r.format===4)X5(r,a,e,t,n);else throw new Error("Only format 4 and 12 cmap tables are supported (found format "+r.format+").");return r}function Y5(e,t,r){e.segments.push({end:t,start:t,delta:-(t-r),offset:0,glyphIndex:r})}function K5(e){e.segments.push({end:65535,start:65535,delta:1,offset:0})}function Z5(e){var t=!0,r;for(r=e.length-1;r>0;r-=1){var n=e.get(r);if(n.unicode>65535){console.log("Adding CMAP format 12 (needed!)"),t=!1;break}}var i=[{name:"version",type:"USHORT",value:0},{name:"numTables",type:"USHORT",value:t?1:2},{name:"platformID",type:"USHORT",value:3},{name:"encodingID",type:"USHORT",value:1},{name:"offset",type:"ULONG",value:t?12:20}];t||(i=i.concat([{name:"cmap12PlatformID",type:"USHORT",value:3},{name:"cmap12EncodingID",type:"USHORT",value:10},{name:"cmap12Offset",type:"ULONG",value:0}])),i=i.concat([{name:"format",type:"USHORT",value:4},{name:"cmap4Length",type:"USHORT",value:0},{name:"language",type:"USHORT",value:0},{name:"segCountX2",type:"USHORT",value:0},{name:"searchRange",type:"USHORT",value:0},{name:"entrySelector",type:"USHORT",value:0},{name:"rangeShift",type:"USHORT",value:0}]);var s=new U.Table("cmap",i);for(s.segments=[],r=0;r>4,o=i&15;if(s===r||(t+=n[s],o===r))break;t+=n[o]}return parseFloat(t)}function u4(e,t){var r,n,i,s;if(t===28)return r=e.parseByte(),n=e.parseByte(),r<<8|n;if(t===29)return r=e.parseByte(),n=e.parseByte(),i=e.parseByte(),s=e.parseByte(),r<<24|n<<16|i<<8|s;if(t===30)return c4(e);if(t>=32&&t<=246)return t-139;if(t>=247&&t<=250)return r=e.parseByte(),(t-247)*256+r+108;if(t>=251&&t<=254)return r=e.parseByte(),-(t-251)*256-r-108;throw new Error("Invalid b0 "+t)}function q4(e){for(var t={},r=0;r>1,l.length=0,c=!0}function T(S){for(var E,w,F,C,M,k,I,L,V,G,H,j,Y=0;Y1&&!c&&(b=l.shift()+h,c=!0),p+=l.pop(),y(q,p);break;case 5:for(;l.length>0;)q+=l.shift(),p+=l.shift(),a.lineTo(q,p);break;case 6:for(;l.length>0&&(q+=l.shift(),a.lineTo(q,p),l.length!==0);)p+=l.shift(),a.lineTo(q,p);break;case 7:for(;l.length>0&&(p+=l.shift(),a.lineTo(q,p),l.length!==0);)q+=l.shift(),a.lineTo(q,p);break;case 8:for(;l.length>0;)n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+l.shift(),a.curveTo(n,i,s,o,q,p);break;case 10:M=l.pop()+v,k=d[M],k&&T(k);break;case 11:return;case 12:switch(ee=S[Y],Y+=1,ee){case 35:n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o+l.shift(),V=I+l.shift(),G=L+l.shift(),H=V+l.shift(),j=G+l.shift(),q=H+l.shift(),p=j+l.shift(),l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;case 34:n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o,V=I+l.shift(),G=o,H=V+l.shift(),j=p,q=H+l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;case 36:n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o,V=I+l.shift(),G=o,H=V+l.shift(),j=G+l.shift(),q=H+l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;case 37:n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o+l.shift(),V=I+l.shift(),G=L+l.shift(),H=V+l.shift(),j=G+l.shift(),Math.abs(H-q)>Math.abs(j-p)?q=H+l.shift():p=j+l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;default:console.log("Glyph "+t.index+": unknown operator 1200"+ee),l.length=0}break;case 14:l.length>0&&!c&&(b=l.shift()+h,c=!0),f&&(a.closePath(),f=!1);break;case 18:_();break;case 19:case 20:_(),Y+=u+7>>3;break;case 21:l.length>2&&!c&&(b=l.shift()+h,c=!0),p+=l.pop(),q+=l.pop(),y(q,p);break;case 22:l.length>1&&!c&&(b=l.shift()+h,c=!0),q+=l.pop(),y(q,p);break;case 23:_();break;case 24:for(;l.length>2;)n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+l.shift(),a.curveTo(n,i,s,o,q,p);q+=l.shift(),p+=l.shift(),a.lineTo(q,p);break;case 25:for(;l.length>6;)q+=l.shift(),p+=l.shift(),a.lineTo(q,p);n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+l.shift(),a.curveTo(n,i,s,o,q,p);break;case 26:for(l.length%2&&(q+=l.shift());l.length>0;)n=q,i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s,p=o+l.shift(),a.curveTo(n,i,s,o,q,p);break;case 27:for(l.length%2&&(p+=l.shift());l.length>0;)n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o,a.curveTo(n,i,s,o,q,p);break;case 28:E=S[Y],w=S[Y+1],l.push((E<<24|w<<16)>>16),Y+=2;break;case 29:M=l.pop()+e.gsubrsBias,k=e.gsubrs[M],k&&T(k);break;case 30:for(;l.length>0&&(n=q,i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p),l.length!==0);)n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),p=o+l.shift(),q=s+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p);break;case 31:for(;l.length>0&&(n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),p=o+l.shift(),q=s+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p),l.length!==0);)n=q,i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p);break;default:ee<32?console.log("Glyph "+t.index+": unknown operator "+ee):ee<247?l.push(ee-139):ee<251?(E=S[Y],Y+=1,l.push((ee-247)*256+E+108)):ee<255?(E=S[Y],Y+=1,l.push(-(ee-251)*256-E-108)):(E=S[Y],w=S[Y+1],F=S[Y+2],C=S[Y+3],Y+=4,l.push((E<<24|w<<16|F<<8|C)/65536))}}}return T(r),t.advanceWidth=b,a}function m4(e,t,r,n){var i=[],s,o=new D.Parser(e,t),a=o.parseCard8();if(a===0)for(var l=0;l=n)throw new Error("CFF table CID Font FDSelect has bad FD index value "+s+" (FD count "+n+")");i.push(s)}else if(a===3){var u=o.parseCard16(),c=o.parseCard16();if(c!==0)throw new Error("CFF Table CID Font FDSelect format 3 range has bad initial GID "+c);for(var f,q=0;q=n)throw new Error("CFF table CID Font FDSelect has bad FD index value "+s+" (FD count "+n+")");if(f>r)throw new Error("CFF Table CID Font FDSelect format 3 range has bad GID "+f);for(;c=0&&(r=n),n=t.indexOf(e),n>=0?r=n+mi.length:(r=mi.length+t.length,t.push(e)),r}function g4(){return new U.Record("Header",[{name:"major",type:"Card8",value:1},{name:"minor",type:"Card8",value:0},{name:"hdrSize",type:"Card8",value:4},{name:"major",type:"Card8",value:1}])}function x4(e){var t=new U.Record("Name INDEX",[{name:"names",type:"INDEX",value:[]}]);t.names=[];for(var r=0;r=r.begin&&e=1&&(r.ulCodePageRange1=n.parseULong(),r.ulCodePageRange2=n.parseULong()),r.version>=2&&(r.sxHeight=n.parseShort(),r.sCapHeight=n.parseShort(),r.usDefaultChar=n.parseUShort(),r.usBreakChar=n.parseUShort(),r.usMaxContent=n.parseUShort()),r}function Y4(e){return new U.Table("OS/2",[{name:"version",type:"USHORT",value:3},{name:"xAvgCharWidth",type:"SHORT",value:0},{name:"usWeightClass",type:"USHORT",value:0},{name:"usWidthClass",type:"USHORT",value:0},{name:"fsType",type:"USHORT",value:0},{name:"ySubscriptXSize",type:"SHORT",value:650},{name:"ySubscriptYSize",type:"SHORT",value:699},{name:"ySubscriptXOffset",type:"SHORT",value:0},{name:"ySubscriptYOffset",type:"SHORT",value:140},{name:"ySuperscriptXSize",type:"SHORT",value:650},{name:"ySuperscriptYSize",type:"SHORT",value:699},{name:"ySuperscriptXOffset",type:"SHORT",value:0},{name:"ySuperscriptYOffset",type:"SHORT",value:479},{name:"yStrikeoutSize",type:"SHORT",value:49},{name:"yStrikeoutPosition",type:"SHORT",value:258},{name:"sFamilyClass",type:"SHORT",value:0},{name:"bFamilyType",type:"BYTE",value:0},{name:"bSerifStyle",type:"BYTE",value:0},{name:"bWeight",type:"BYTE",value:0},{name:"bProportion",type:"BYTE",value:0},{name:"bContrast",type:"BYTE",value:0},{name:"bStrokeVariation",type:"BYTE",value:0},{name:"bArmStyle",type:"BYTE",value:0},{name:"bLetterform",type:"BYTE",value:0},{name:"bMidline",type:"BYTE",value:0},{name:"bXHeight",type:"BYTE",value:0},{name:"ulUnicodeRange1",type:"ULONG",value:0},{name:"ulUnicodeRange2",type:"ULONG",value:0},{name:"ulUnicodeRange3",type:"ULONG",value:0},{name:"ulUnicodeRange4",type:"ULONG",value:0},{name:"achVendID",type:"CHARARRAY",value:"XXXX"},{name:"fsSelection",type:"USHORT",value:0},{name:"usFirstCharIndex",type:"USHORT",value:0},{name:"usLastCharIndex",type:"USHORT",value:0},{name:"sTypoAscender",type:"SHORT",value:0},{name:"sTypoDescender",type:"SHORT",value:0},{name:"sTypoLineGap",type:"SHORT",value:0},{name:"usWinAscent",type:"USHORT",value:0},{name:"usWinDescent",type:"USHORT",value:0},{name:"ulCodePageRange1",type:"ULONG",value:0},{name:"ulCodePageRange2",type:"ULONG",value:0},{name:"sxHeight",type:"SHORT",value:0},{name:"sCapHeight",type:"SHORT",value:0},{name:"usDefaultChar",type:"USHORT",value:0},{name:"usBreakChar",type:"USHORT",value:0},{name:"usMaxContext",type:"USHORT",value:0}],e)}var $s={parse:j4,make:Y4,unicodeRanges:Js,getUnicodeRange:X4};function K4(e,t){var r={},n=new D.Parser(e,t);switch(r.version=n.parseVersion(),r.italicAngle=n.parseFixed(),r.underlinePosition=n.parseShort(),r.underlineThickness=n.parseShort(),r.isFixedPitch=n.parseULong(),r.minMemType42=n.parseULong(),r.maxMemType42=n.parseULong(),r.minMemType1=n.parseULong(),r.maxMemType1=n.parseULong(),r.version){case 1:r.names=Pt.slice();break;case 2:r.numberOfGlyphs=n.parseUShort(),r.glyphNameIndex=new Array(r.numberOfGlyphs);for(var i=0;i=Pt.length){var o=n.parseChar();r.names.push(n.parseString(o))}break;case 2.5:r.numberOfGlyphs=n.parseUShort(),r.offset=new Array(r.numberOfGlyphs);for(var a=0;af.value.tag?1:-1}),t.fields=t.fields.concat(n),t.fields=t.fields.concat(i),t}function Ya(e,t,r){for(var n=0;n0){var s=e.glyphs.get(i);return s.getMetrics()}}return r}function t6(e){for(var t=0,r=0;rm||l===void 0)&&m>0&&(l=m),u 123 are reserved for internal usage");if(v.name!==".notdef"){var g=v.getMetrics();t.push(g.xMin),r.push(g.yMin),n.push(g.xMax),i.push(g.yMax),o.push(g.leftSideBearing),a.push(g.rightSideBearing),s.push(v.advanceWidth)}}var x={xMin:Math.min.apply(null,t),yMin:Math.min.apply(null,r),xMax:Math.max.apply(null,n),yMax:Math.max.apply(null,i),advanceWidthMax:Math.max.apply(null,s),advanceWidthAvg:t6(s),minLeftSideBearing:Math.min.apply(null,o),maxLeftSideBearing:Math.max.apply(null,o),minRightSideBearing:Math.min.apply(null,a)};x.ascender=e.ascender,x.descender=e.descender;var b=D2.make({flags:3,unitsPerEm:e.unitsPerEm,xMin:x.xMin,yMin:x.yMin,xMax:x.xMax,yMax:x.yMax,lowestRecPPEM:3,createdTimestamp:e.createdTimestamp}),y=L2.make({ascender:x.ascender,descender:x.descender,advanceWidthMax:x.advanceWidthMax,minLeftSideBearing:x.minLeftSideBearing,minRightSideBearing:x.minRightSideBearing,xMaxExtent:x.maxLeftSideBearing+(x.xMax-x.xMin),numberOfHMetrics:e.glyphs.length}),_=z2.make(e.glyphs.length),T=$s.make(Object.assign({xAvgCharWidth:Math.round(x.advanceWidthAvg),usFirstCharIndex:l,usLastCharIndex:u,ulUnicodeRange1:c,ulUnicodeRange2:f,ulUnicodeRange3:q,ulUnicodeRange4:p,sTypoAscender:x.ascender,sTypoDescender:x.descender,sTypoLineGap:0,usWinAscent:x.yMax,usWinDescent:Math.abs(x.yMin),ulCodePageRange1:1,sxHeight:Ya(e,"xyvw",{yMax:Math.round(x.ascender/2)}).yMax,sCapHeight:Ya(e,"HIKLEFJMNTZBDPRAGOQSUVWXY",x).yMax,usDefaultChar:e.hasChar(" ")?32:0,usBreakChar:e.hasChar(" ")?32:0},e.tables.os2)),S=P2.make(e.glyphs),E=w2.make(e.glyphs),w=e.getEnglishName("fontFamily"),F=e.getEnglishName("fontSubfamily"),C=w+" "+F,M=e.getEnglishName("postScriptName");M||(M=w.replace(/\s/g,"")+"-"+F);var k={};for(var I in e.names)k[I]=e.names[I];k.uniqueID||(k.uniqueID={en:e.getEnglishName("manufacturer")+":"+C}),k.postScriptName||(k.postScriptName={en:M}),k.preferredFamily||(k.preferredFamily=e.names.fontFamily),k.preferredSubfamily||(k.preferredSubfamily=e.names.fontSubfamily);var L=[],V=X2.make(k,L),G=L.length>0?N2.make(L):void 0,H=j2.make(),j=O2.make(e.glyphs,{version:e.getEnglishName("version"),fullName:C,familyName:w,weightName:F,postScriptName:M,unitsPerEm:e.unitsPerEm,fontBBox:[0,x.yMin,x.ascender,x.advanceWidthMax]}),Y=e.metas&&Object.keys(e.metas).length>0?K2.make(e.metas):void 0,ee=[b,y,_,T,V,E,H,j,S];G&&ee.push(G),e.tables.gsub&&ee.push(Y2.make(e.tables.gsub)),Y&&ee.push(Y);for(var Tr=Z2(ee),E0=Tr.encode(),A0=ao(E0),Ii=Tr.fields,To=!1,an=0;an>>1,s=e[i].tag;if(s===t)return i;s>>1,s=e[i];if(s===t)return i;s>>1;r=e[s];var o=r.start;if(o===t)return r;o0)return r=e[n-1],t>r.end?0:r}function $r(e,t){this.font=e,this.tableName=t}$r.prototype={searchTag:Ps,binSearch:Ka,getTable:function(e){var t=this.font.tables[this.tableName];return!t&&e&&(t=this.font.tables[this.tableName]=this.createDefaultTable()),t},getScriptNames:function(){var e=this.getTable();return e?e.scripts.map(function(t){return t.tag}):[]},getDefaultScriptName:function(){var e=this.getTable();if(e){for(var t=!1,r=0;r=0)return n[i].script;if(t){var s={tag:e,script:{defaultLangSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]},langSysRecords:[]}};return n.splice(-1-i,0,s),s.script}}},getLangSysTable:function(e,t,r){var n=this.getScriptTable(e,r);if(n){if(!t||t==="dflt"||t==="DFLT")return n.defaultLangSys;var i=Ps(n.langSysRecords,t);if(i>=0)return n.langSysRecords[i].langSys;if(r){var s={tag:t,langSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]}};return n.langSysRecords.splice(-1-i,0,s),s.langSys}}},getFeatureTable:function(e,t,r,n){var i=this.getLangSysTable(e,t,n);if(i){for(var s,o=i.featureIndexes,a=this.font.tables[this.tableName].features,l=0;l=a[u-1].tag,"Features must be added in alphabetical order."),s={tag:r,feature:{params:0,lookupListIndexes:[]}},a.push(s),o.push(u),s.feature}}},getLookupTables:function(e,t,r,n,i){var s=this.getFeatureTable(e,t,r,i),o=[];if(s){for(var a,l=s.lookupListIndexes,u=this.font.tables[this.tableName].lookups,c=0;c=0?r:-1;case 2:var n=Za(e.ranges,t);return n?n.index+t-n.start:-1}},expandCoverage:function(e){if(e.format===1)return e.glyphs;for(var t=[],r=e.ranges,n=0;n1,'Multiple: "by" must be an array of two or more ids');var i=this.getLookupTables(r,n,e,2,!0)[0],s=lo(i,1,{substFormat:1,coverage:{format:1,glyphs:[]},sequences:[]});N.assert(s.coverage.format===1,"Multiple: unable to modify coverage table format "+s.coverage.format);var o=t.sub,a=this.binSearch(s.coverage.glyphs,o);a<0&&(a=-1-a,s.coverage.glyphs.splice(a,0,o),s.sequences.splice(a,0,0)),s.sequences[a]=t.by};we.prototype.addAlternate=function(e,t,r,n){var i=this.getLookupTables(r,n,e,3,!0)[0],s=lo(i,1,{substFormat:1,coverage:{format:1,glyphs:[]},alternateSets:[]});N.assert(s.coverage.format===1,"Alternate: unable to modify coverage table format "+s.coverage.format);var o=t.sub,a=this.binSearch(s.coverage.glyphs,o);a<0&&(a=-1-a,s.coverage.glyphs.splice(a,0,o),s.alternateSets.splice(a,0,0)),s.alternateSets[a]=t.by};we.prototype.addLigature=function(e,t,r,n){var i=this.getLookupTables(r,n,e,4,!0)[0],s=i.subtables[0];s||(s={substFormat:1,coverage:{format:1,glyphs:[]},ligatureSets:[]},i.subtables[0]=s),N.assert(s.coverage.format===1,"Ligature: unable to modify coverage table format "+s.coverage.format);var o=t.sub[0],a=t.sub.slice(1),l={ligGlyph:t.by,components:a},u=this.binSearch(s.coverage.glyphs,o);if(u>=0){for(var c=s.ligatureSets[u],f=0;f0?(s=e.parseByte(),(t&i)===0&&(s=-s),s=r+s):(t&i)>0?s=r:s=r+e.parseShort(),s}function J2(e,t,r){var n=new D.Parser(t,r);e.numberOfContours=n.parseShort(),e._xMin=n.parseShort(),e._yMin=n.parseShort(),e._xMax=n.parseShort(),e._yMax=n.parseShort();var i,s;if(e.numberOfContours>0){for(var o=e.endPointIndices=[],a=0;a0)for(var f=n.parseByte(),q=0;q0){var p=[],d;if(u>0){for(var v=0;v=0,p.push(d);for(var m=0,h=0;h0?(i&2)>0?(y.dx=n.parseShort(),y.dy=n.parseShort()):y.matchedPoints=[n.parseUShort(),n.parseUShort()]:(i&2)>0?(y.dx=n.parseChar(),y.dy=n.parseChar()):y.matchedPoints=[n.parseByte(),n.parseByte()],(i&8)>0?y.xScale=y.yScale=n.parseF2Dot14():(i&64)>0?(y.xScale=n.parseF2Dot14(),y.yScale=n.parseF2Dot14()):(i&128)>0&&(y.xScale=n.parseF2Dot14(),y.scale01=n.parseF2Dot14(),y.scale10=n.parseF2Dot14(),y.yScale=n.parseF2Dot14()),e.components.push(y),b=!!(i&32)}if(i&256){e.instructionLength=n.parseUShort(),e.instructions=[];for(var _=0;_t.points.length-1||n.matchedPoints[1]>i.points.length-1)throw Error("Matched points out of range in "+t.name);var o=t.points[n.matchedPoints[0]],a=i.points[n.matchedPoints[1]],l={xScale:n.xScale,scale01:n.scale01,scale10:n.scale10,yScale:n.yScale,dx:0,dy:0};a=Ns([a],l)[0],l.dx=o.x-a.x,l.dy=o.y-a.y,s=Ns(i.points,l)}t.points=t.points.concat(s)}}return $2(t.points)}function l6(e,t,r,n){for(var i=new Ye.GlyphSet(n),s=0;s2)){var r=this.font,n=this._prepState;if(!n||n.ppem!==t){var i=this._fpgmState;if(!i){St.prototype=m6,i=this._fpgmState=new St("fpgm",r.tables.fpgm),i.funcs=[],i.font=r,exports.DEBUG&&(console.log("---EXEC FPGM---"),i.step=-1);try{zt(i)}catch(u){console.log("Hinting error in FPGM:"+u),this._errorState=3;return}}St.prototype=i,n=this._prepState=new St("prep",r.tables.prep),n.ppem=t;var s=r.tables.cvt;if(s)for(var o=n.cvt=new Array(s.length),a=t/r.unitsPerEm,l=0;l1))try{return n0(e,n)}catch(u){this._errorState<1&&(console.log("Hinting error:"+u),console.log("Note: further hinting errors are silenced")),this._errorState=1;return}}};n0=function(e,t){var r=t.ppem/t.font.unitsPerEm,n=r,i=e.components,s,o,a;if(St.prototype=t,!i)a=new St("glyf",e.instructions),exports.DEBUG&&(console.log("---EXEC GLYPH---"),a.step=-1),eo(e,a,r,n),o=a.gZone;else{var l=t.font;o=[],s=[];for(var u=0;u=176&&s<=183)n+=s-176+1;else if(s>=184&&s<=191)n+=(s-184+1)*2;else if(t&&i===1&&s===27)break;while(i>0);e.ip=n}function Ja(e,t){exports.DEBUG&&console.log(t.step,"SVTCA["+e.axis+"]"),t.fv=t.pv=t.dpv=e}function $a(e,t){exports.DEBUG&&console.log(t.step,"SPVTCA["+e.axis+"]"),t.pv=t.dpv=e}function e2(e,t){exports.DEBUG&&console.log(t.step,"SFVTCA["+e.axis+"]"),t.fv=e}function t2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z2[n],o=t.z1[i];exports.DEBUG&&console.log("SPVTL["+e+"]",n,i);var a,l;e?(a=s.y-o.y,l=o.x-s.x):(a=o.x-s.x,l=o.y-s.y),t.pv=t.dpv=rn(a,l)}function r2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z2[n],o=t.z1[i];exports.DEBUG&&console.log("SFVTL["+e+"]",n,i);var a,l;e?(a=s.y-o.y,l=o.x-s.x):(a=o.x-s.x,l=o.y-s.y),t.fv=rn(a,l)}function v6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"SPVFS[]",r,n),e.pv=e.dpv=rn(n,r)}function g6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"SPVFS[]",r,n),e.fv=rn(n,r)}function x6(e){var t=e.stack,r=e.pv;exports.DEBUG&&console.log(e.step,"GPV[]"),t.push(r.x*16384),t.push(r.y*16384)}function y6(e){var t=e.stack,r=e.fv;exports.DEBUG&&console.log(e.step,"GFV[]"),t.push(r.x*16384),t.push(r.y*16384)}function b6(e){e.fv=e.pv,exports.DEBUG&&console.log(e.step,"SFVTPV[]")}function S6(e){var t=e.stack,r=t.pop(),n=t.pop(),i=t.pop(),s=t.pop(),o=t.pop(),a=e.z0,l=e.z1,u=a[r],c=a[n],f=l[i],q=l[s],p=e.z2[o];exports.DEBUG&&console.log("ISECT[], ",r,n,i,s,o);var d=u.x,v=u.y,m=c.x,h=c.y,g=f.x,x=f.y,b=q.x,y=q.y,_=(d-m)*(x-y)-(v-h)*(g-b),T=d*h-v*m,S=g*y-x*b;p.x=(T*(g-b)-S*(d-m))/_,p.y=(T*(x-y)-S*(v-h))/_}function T6(e){e.rp0=e.stack.pop(),exports.DEBUG&&console.log(e.step,"SRP0[]",e.rp0)}function _6(e){e.rp1=e.stack.pop(),exports.DEBUG&&console.log(e.step,"SRP1[]",e.rp1)}function w6(e){e.rp2=e.stack.pop(),exports.DEBUG&&console.log(e.step,"SRP2[]",e.rp2)}function E6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,"SZP0[]",t),e.zp0=t,t){case 0:e.tZone||_i(e),e.z0=e.tZone;break;case 1:e.z0=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function A6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,"SZP1[]",t),e.zp1=t,t){case 0:e.tZone||_i(e),e.z1=e.tZone;break;case 1:e.z1=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function C6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,"SZP2[]",t),e.zp2=t,t){case 0:e.tZone||_i(e),e.z2=e.tZone;break;case 1:e.z2=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function F6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,"SZPS[]",t),e.zp0=e.zp1=e.zp2=t,t){case 0:e.tZone||_i(e),e.z0=e.z1=e.z2=e.tZone;break;case 1:e.z0=e.z1=e.z2=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function M6(e){e.loop=e.stack.pop(),exports.DEBUG&&console.log(e.step,"SLOOP[]",e.loop)}function k6(e){exports.DEBUG&&console.log(e.step,"RTG[]"),e.round=s0}function I6(e){exports.DEBUG&&console.log(e.step,"RTHG[]"),e.round=p6}function B6(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"SMD[]",t),e.minDis=t/64}function R6(e){exports.DEBUG&&console.log(e.step,"ELSE[]"),a0(e,!1)}function U6(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"JMPR[]",t),e.ip+=t-1}function O6(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"SCVTCI[]",t),e.cvCutIn=t/64}function D6(e){var t=e.stack;exports.DEBUG&&console.log(e.step,"DUP[]"),t.push(t[t.length-1])}function zs(e){exports.DEBUG&&console.log(e.step,"POP[]"),e.stack.pop()}function L6(e){exports.DEBUG&&console.log(e.step,"CLEAR[]"),e.stack.length=0}function P6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"SWAP[]"),t.push(r),t.push(n)}function N6(e){var t=e.stack;exports.DEBUG&&console.log(e.step,"DEPTH[]"),t.push(t.length)}function z6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"LOOPCALL[]",r,n);var i=e.ip,s=e.prog;e.prog=e.funcs[r];for(var o=0;o1?"loop "+(t.loop-a)+": ":"")+"SHP["+(e?"rp1":"rp2")+"]",u)}t.loop=1}function o2(e,t){var r=t.stack,n=e?t.rp1:t.rp2,i=(e?t.z0:t.z1)[n],s=t.fv,o=t.pv,a=r.pop(),l=t.z2[t.contours[a]],u=l;exports.DEBUG&&console.log(t.step,"SHC["+e+"]",a);var c=o.distance(i,i,!1,!0);do u!==i&&s.setRelative(u,u,c,o),u=u.nextPointOnContour;while(u!==l)}function a2(e,t){var r=t.stack,n=e?t.rp1:t.rp2,i=(e?t.z0:t.z1)[n],s=t.fv,o=t.pv,a=r.pop();exports.DEBUG&&console.log(t.step,"SHZ["+e+"]",a);var l;switch(a){case 0:l=t.tZone;break;case 1:l=t.gZone;break;default:throw new Error("Invalid zone")}for(var u,c=o.distance(i,i,!1,!0),f=l.length-2,q=0;q1?"loop "+(e.loop-r)+": ":"")+"SHPIX[]",o,i),n.setRelative(a,a,i),n.touch(a)}e.loop=1}function j6(e){for(var t=e.stack,r=e.rp1,n=e.rp2,i=e.loop,s=e.z0[r],o=e.z1[n],a=e.fv,l=e.dpv,u=e.z2;i--;){var c=t.pop(),f=u[c];exports.DEBUG&&console.log(e.step,(e.loop>1?"loop "+(e.loop-i)+": ":"")+"IP[]",c,r,"<->",n),a.interpolate(f,s,o,l),a.touch(f)}e.loop=1}function l2(e,t){var r=t.stack,n=r.pop()/64,i=r.pop(),s=t.z1[i],o=t.z0[t.rp0],a=t.fv,l=t.pv;a.setRelative(s,o,n,l),a.touch(s),exports.DEBUG&&console.log(t.step,"MSIRP["+e+"]",n,i),t.rp1=t.rp0,t.rp2=i,e&&(t.rp0=i)}function Y6(e){for(var t=e.stack,r=e.rp0,n=e.z0[r],i=e.loop,s=e.fv,o=e.pv,a=e.z1;i--;){var l=t.pop(),u=a[l];exports.DEBUG&&console.log(e.step,(e.loop>1?"loop "+(e.loop-i)+": ":"")+"ALIGNRP[]",l),s.setRelative(u,n,0,o),s.touch(u)}e.loop=1}function K6(e){exports.DEBUG&&console.log(e.step,"RTDG[]"),e.round=f6}function c2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z0[i],o=t.fv,a=t.pv,l=t.cvt[n];exports.DEBUG&&console.log(t.step,"MIAP["+e+"]",n,"(",l,")",i);var u=a.distance(s,Jr);e&&(Math.abs(u-l)",a),t.stack.push(Math.round(a*64))}function nl(e){exports.DEBUG&&console.log(e.step,"MPPEM[]"),e.stack.push(e.ppem)}function il(e){exports.DEBUG&&console.log(e.step,"FLIPON[]"),e.autoFlip=!0}function sl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"LT[]",r,n),t.push(nr?1:0)}function ll(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"GTEQ[]",r,n),t.push(n>=r?1:0)}function cl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"EQ[]",r,n),t.push(r===n?1:0)}function ul(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"NEQ[]",r,n),t.push(r!==n?1:0)}function ql(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"ODD[]",r),t.push(Math.trunc(r)%2?1:0)}function fl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"EVEN[]",r),t.push(Math.trunc(r)%2?0:1)}function pl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"IF[]",t),t||(a0(e,!0),exports.DEBUG&&console.log(e.step,"EIF[]"))}function hl(e){exports.DEBUG&&console.log(e.step,"EIF[]")}function dl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"AND[]",r,n),t.push(r&&n?1:0)}function ml(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"OR[]",r,n),t.push(r||n?1:0)}function vl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"NOT[]",r),t.push(r?0:1)}function Gs(e,t){var r=t.stack,n=r.pop(),i=t.fv,s=t.pv,o=t.ppem,a=t.deltaBase+(e-1)*16,l=t.deltaShift,u=t.z0;exports.DEBUG&&console.log(t.step,"DELTAP["+e+"]",n,r);for(var c=0;c>4);if(p===o){var d=(q&15)-8;d>=0&&d++,exports.DEBUG&&console.log(t.step,"DELTAPFIX",f,"by",d*l);var v=u[f];i.setRelative(v,v,d*l,s)}}}function gl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"SDB[]",r),e.deltaBase=r}function xl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"SDS[]",r),e.deltaShift=Math.pow(.5,r)}function yl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"ADD[]",r,n),t.push(n+r)}function bl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"SUB[]",r,n),t.push(n-r)}function Sl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"DIV[]",r,n),t.push(n*64/r)}function Tl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"MUL[]",r,n),t.push(n*r/64)}function _l(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"ABS[]",r),t.push(Math.abs(r))}function wl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"NEG[]",r),t.push(-r)}function El(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"FLOOR[]",r),t.push(Math.floor(r/64)*64)}function Al(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,"CEILING[]",r),t.push(Math.ceil(r/64)*64)}function di(e,t){var r=t.stack,n=r.pop();exports.DEBUG&&console.log(t.step,"ROUND[]"),r.push(t.round(n/64)*64)}function Cl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"WCVTF[]",r,n),e.cvt[n]=r*e.ppem/e.font.unitsPerEm}function Vs(e,t){var r=t.stack,n=r.pop(),i=t.ppem,s=t.deltaBase+(e-1)*16,o=t.deltaShift;exports.DEBUG&&console.log(t.step,"DELTAC["+e+"]",n,r);for(var a=0;a>4);if(c===i){var f=(u&15)-8;f>=0&&f++;var q=f*o;exports.DEBUG&&console.log(t.step,"DELTACFIX",l,"by",q),t.cvt[l]+=q}}}function Fl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"SROUND[]",t),e.round=o0;var r;switch(t&192){case 0:r=.5;break;case 64:r=1;break;case 128:r=2;break;default:throw new Error("invalid SROUND value")}switch(e.srPeriod=r,t&48){case 0:e.srPhase=0;break;case 16:e.srPhase=.25*r;break;case 32:e.srPhase=.5*r;break;case 48:e.srPhase=.75*r;break;default:throw new Error("invalid SROUND value")}t&=15,t===0?e.srThreshold=0:e.srThreshold=(t/8-.5)*r}function Ml(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"S45ROUND[]",t),e.round=o0;var r;switch(t&192){case 0:r=Math.sqrt(2)/2;break;case 64:r=Math.sqrt(2);break;case 128:r=2*Math.sqrt(2);break;default:throw new Error("invalid S45ROUND value")}switch(e.srPeriod=r,t&48){case 0:e.srPhase=0;break;case 16:e.srPhase=.25*r;break;case 32:e.srPhase=.5*r;break;case 48:e.srPhase=.75*r;break;default:throw new Error("invalid S45ROUND value")}t&=15,t===0?e.srThreshold=0:e.srThreshold=(t/8-.5)*r}function kl(e){exports.DEBUG&&console.log(e.step,"ROFF[]"),e.round=q6}function Il(e){exports.DEBUG&&console.log(e.step,"RUTG[]"),e.round=h6}function Bl(e){exports.DEBUG&&console.log(e.step,"RDTG[]"),e.round=d6}function Rl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"SCANCTRL[]",t)}function f2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z2[n],o=t.z1[i];exports.DEBUG&&console.log(t.step,"SDPVTL["+e+"]",n,i);var a,l;e?(a=s.y-o.y,l=o.x-s.x):(a=o.x-s.x,l=o.y-s.y),t.dpv=rn(a,l)}function Ul(e){var t=e.stack,r=t.pop(),n=0;exports.DEBUG&&console.log(e.step,"GETINFO[]",r),r&1&&(n=35),r&32&&(n|=4096),t.push(n)}function Ol(e){var t=e.stack,r=t.pop(),n=t.pop(),i=t.pop();exports.DEBUG&&console.log(e.step,"ROLL[]"),t.push(n),t.push(r),t.push(i)}function Dl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"MAX[]",r,n),t.push(Math.max(n,r))}function Ll(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,"MIN[]",r,n),t.push(Math.min(n,r))}function Pl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,"SCANTYPE[]",t)}function Nl(e){var t=e.stack.pop(),r=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,"INSTCTRL[]",t,r),t){case 1:e.inhibitGridFit=!!r;return;case 2:e.ignoreCvt=!!r;return;default:throw new Error("invalid INSTCTRL[] selector")}}function xt(e,t){var r=t.stack,n=t.prog,i=t.ip;exports.DEBUG&&console.log(t.step,"PUSHB["+e+"]");for(var s=0;s=0?1:-1,m=Math.abs(m),e&&(g=s.cvt[a],n&&Math.abs(m-g)":"_")+(n?"R":"_")+(i===0?"Gr":i===1?"Bl":i===2?"Wh":"")+"]",e?a+"("+s.cvt[a]+","+g+")":"",l,"(d =",v,"->",h*m,")"),s.rp1=s.rp0,s.rp2=l,t&&(s.rp0=l)}r0=[Ja.bind(void 0,nt),Ja.bind(void 0,je),$a.bind(void 0,nt),$a.bind(void 0,je),e2.bind(void 0,nt),e2.bind(void 0,je),t2.bind(void 0,0),t2.bind(void 0,1),r2.bind(void 0,0),r2.bind(void 0,1),v6,g6,x6,y6,b6,S6,T6,_6,w6,E6,A6,C6,F6,M6,k6,I6,B6,R6,U6,O6,void 0,void 0,D6,zs,L6,P6,N6,V6,H6,void 0,void 0,void 0,z6,G6,W6,void 0,n2.bind(void 0,0),n2.bind(void 0,1),i2.bind(void 0,nt),i2.bind(void 0,je),s2.bind(void 0,0),s2.bind(void 0,1),o2.bind(void 0,0),o2.bind(void 0,1),a2.bind(void 0,0),a2.bind(void 0,1),X6,j6,l2.bind(void 0,0),l2.bind(void 0,1),Y6,K6,c2.bind(void 0,0),c2.bind(void 0,1),Z6,Q6,J6,$6,el,rl,u2.bind(void 0,0),u2.bind(void 0,1),void 0,q2.bind(void 0,0),q2.bind(void 0,1),nl,void 0,il,void 0,void 0,sl,ol,al,ll,cl,ul,ql,fl,pl,hl,dl,ml,vl,Gs.bind(void 0,1),gl,xl,yl,bl,Sl,Tl,_l,wl,El,Al,di.bind(void 0,0),di.bind(void 0,1),di.bind(void 0,2),di.bind(void 0,3),void 0,void 0,void 0,void 0,Cl,Gs.bind(void 0,2),Gs.bind(void 0,3),Vs.bind(void 0,1),Vs.bind(void 0,2),Vs.bind(void 0,3),Fl,Ml,void 0,void 0,kl,void 0,Il,Bl,zs,zs,void 0,void 0,void 0,void 0,void 0,Rl,f2.bind(void 0,0),f2.bind(void 0,1),Ul,void 0,Ol,Dl,Ll,Pl,Nl,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,xt.bind(void 0,1),xt.bind(void 0,2),xt.bind(void 0,3),xt.bind(void 0,4),xt.bind(void 0,5),xt.bind(void 0,6),xt.bind(void 0,7),xt.bind(void 0,8),yt.bind(void 0,1),yt.bind(void 0,2),yt.bind(void 0,3),yt.bind(void 0,4),yt.bind(void 0,5),yt.bind(void 0,6),yt.bind(void 0,7),yt.bind(void 0,8),O.bind(void 0,0,0,0,0,0),O.bind(void 0,0,0,0,0,1),O.bind(void 0,0,0,0,0,2),O.bind(void 0,0,0,0,0,3),O.bind(void 0,0,0,0,1,0),O.bind(void 0,0,0,0,1,1),O.bind(void 0,0,0,0,1,2),O.bind(void 0,0,0,0,1,3),O.bind(void 0,0,0,1,0,0),O.bind(void 0,0,0,1,0,1),O.bind(void 0,0,0,1,0,2),O.bind(void 0,0,0,1,0,3),O.bind(void 0,0,0,1,1,0),O.bind(void 0,0,0,1,1,1),O.bind(void 0,0,0,1,1,2),O.bind(void 0,0,0,1,1,3),O.bind(void 0,0,1,0,0,0),O.bind(void 0,0,1,0,0,1),O.bind(void 0,0,1,0,0,2),O.bind(void 0,0,1,0,0,3),O.bind(void 0,0,1,0,1,0),O.bind(void 0,0,1,0,1,1),O.bind(void 0,0,1,0,1,2),O.bind(void 0,0,1,0,1,3),O.bind(void 0,0,1,1,0,0),O.bind(void 0,0,1,1,0,1),O.bind(void 0,0,1,1,0,2),O.bind(void 0,0,1,1,0,3),O.bind(void 0,0,1,1,1,0),O.bind(void 0,0,1,1,1,1),O.bind(void 0,0,1,1,1,2),O.bind(void 0,0,1,1,1,3),O.bind(void 0,1,0,0,0,0),O.bind(void 0,1,0,0,0,1),O.bind(void 0,1,0,0,0,2),O.bind(void 0,1,0,0,0,3),O.bind(void 0,1,0,0,1,0),O.bind(void 0,1,0,0,1,1),O.bind(void 0,1,0,0,1,2),O.bind(void 0,1,0,0,1,3),O.bind(void 0,1,0,1,0,0),O.bind(void 0,1,0,1,0,1),O.bind(void 0,1,0,1,0,2),O.bind(void 0,1,0,1,0,3),O.bind(void 0,1,0,1,1,0),O.bind(void 0,1,0,1,1,1),O.bind(void 0,1,0,1,1,2),O.bind(void 0,1,0,1,1,3),O.bind(void 0,1,1,0,0,0),O.bind(void 0,1,1,0,0,1),O.bind(void 0,1,1,0,0,2),O.bind(void 0,1,1,0,0,3),O.bind(void 0,1,1,0,1,0),O.bind(void 0,1,1,0,1,1),O.bind(void 0,1,1,0,1,2),O.bind(void 0,1,1,0,1,3),O.bind(void 0,1,1,1,0,0),O.bind(void 0,1,1,1,0,1),O.bind(void 0,1,1,1,0,2),O.bind(void 0,1,1,1,0,3),O.bind(void 0,1,1,1,1,0),O.bind(void 0,1,1,1,1,1),O.bind(void 0,1,1,1,1,2),O.bind(void 0,1,1,1,1,3)];function dr(e){this.char=e,this.state={},this.activeState=null}function co(e,t,r){this.contextName=r,this.startIndex=e,this.endOffset=t}function zl(e,t,r){this.contextName=e,this.openRange=null,this.ranges=[],this.checkStart=t,this.checkEnd=r}function Le(e,t){this.context=e,this.index=t,this.length=e.length,this.current=e[t],this.backtrack=e.slice(0,t),this.lookahead=e.slice(t+1)}function wi(e){this.eventId=e,this.subscribers=[]}function Gl(e){var t=this,r=["start","end","next","newToken","contextStart","contextEnd","insertToken","removeToken","removeRange","replaceToken","replaceRange","composeRUD","updateContextsRanges"];r.forEach(function(i){Object.defineProperty(t.events,i,{value:new wi(i)})}),e&&r.forEach(function(i){var s=e[i];typeof s=="function"&&t.events[i].subscribe(s)});var n=["insertToken","removeToken","removeRange","replaceToken","replaceRange","composeRUD"];n.forEach(function(i){t.events[i].subscribe(t.updateContextsRanges)})}function ie(e){this.tokens=[],this.registeredContexts={},this.contextCheckers=[],this.events={},this.registeredModifiers=[],Gl.call(this,e)}dr.prototype.setState=function(e,t){return this.state[e]=t,this.activeState={key:e,value:this.state[e]},this.activeState};dr.prototype.getState=function(e){return this.state[e]||null};ie.prototype.inboundIndex=function(e){return e>=0&&e0&&e<=this.lookahead.length):return this.lookahead[e-1];default:return null}};ie.prototype.rangeToText=function(e){if(e instanceof co)return this.getRangeTokens(e).map(function(t){return t.char}).join("")};ie.prototype.getText=function(){return this.tokens.map(function(e){return e.char}).join("")};ie.prototype.getContext=function(e){var t=this.registeredContexts[e];return t||null};ie.prototype.on=function(e,t){var r=this.events[e];return r?r.subscribe(t):null};ie.prototype.dispatch=function(e,t){var r=this,n=this.events[e];n instanceof wi&&n.subscribers.forEach(function(i){i.apply(r,t||[])})};ie.prototype.registerContextChecker=function(e,t,r){if(this.getContext(e))return{FAIL:"context name '"+e+"' is already registered."};if(typeof t!="function")return{FAIL:"missing context start check."};if(typeof r!="function")return{FAIL:"missing context end check."};var n=new zl(e,t,r);return this.registeredContexts[e]=n,this.contextCheckers.push(n),n};ie.prototype.getRangeTokens=function(e){var t=e.startIndex+e.endOffset;return[].concat(this.tokens.slice(e.startIndex,t))};ie.prototype.getContextRanges=function(e){var t=this.getContext(e);return t?t.ranges:{FAIL:"context checker '"+e+"' is not registered."}};ie.prototype.resetContextsRanges=function(){var e=this.registeredContexts;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];r.ranges=[]}};ie.prototype.updateContextsRanges=function(){this.resetContextsRanges();for(var e=this.tokens.map(function(n){return n.char}),t=0;t=i.start&&e<=i.end){var s=e-i.start;return i.index+s}}break;default:return-1}return-1}function Hl(e,t){var r=nn(e,t.coverage);return r===-1?null:e+t.deltaGlyphId}function Wl(e,t){var r=nn(e,t.coverage);return r===-1?null:t.substitute[r]}function Hs(e,t){for(var r=[],n=0;n=0;r--){var n=t[r],i=l0(n),s=_t(n);if(!i&&!s)return!0;if(i)return!1}return!1}function oc(e){if(l0(e.current))return!1;for(var t=0;t0}r("fontFamily"),r("weightName"),r("manufacturer"),r("copyright"),r("version"),this.unitsPerEm>0};K.prototype.toTables=function(){return n6.fontToTable(this)};K.prototype.toBuffer=function(){return console.warn("Font.toBuffer is deprecated. Use Font.toArrayBuffer instead."),this.toArrayBuffer()};K.prototype.toArrayBuffer=function(){for(var e=this.toTables(),t=e.encode(),r=new ArrayBuffer(t.length),n=new Uint8Array(r),i=0;i=1.2&&(i.markGlyphSets=r.parsePointer(Fc)),i}var kc={parse:Mc},Pe=new Array(10);Pe[1]=function(){var t=this.offset+this.relativeOffset,r=this.parseUShort();if(r===1)return{posFormat:1,coverage:this.parsePointer(A.coverage),value:this.parseValueRecord()};if(r===2)return{posFormat:2,coverage:this.parsePointer(A.coverage),values:this.parseValueRecordList()};N.assert(!1,"0x"+t.toString(16)+": GPOS lookup type 1 format must be 1 or 2.")};Pe[2]=function(){var t=this.offset+this.relativeOffset,r=this.parseUShort();N.assert(r===1||r===2,"0x"+t.toString(16)+": GPOS lookup type 2 format must be 1 or 2.");var n=this.parsePointer(A.coverage),i=this.parseUShort(),s=this.parseUShort();if(r===1)return{posFormat:r,coverage:n,valueFormat1:i,valueFormat2:s,pairSets:this.parseList(A.pointer(A.list(function(){return{secondGlyph:this.parseUShort(),value1:this.parseValueRecord(i),value2:this.parseValueRecord(s)}})))};if(r===2){var o=this.parsePointer(A.classDef),a=this.parsePointer(A.classDef),l=this.parseUShort(),u=this.parseUShort();return{posFormat:r,coverage:n,valueFormat1:i,valueFormat2:s,classDef1:o,classDef2:a,class1Count:l,class2Count:u,classRecords:this.parseList(l,A.list(u,function(){return{value1:this.parseValueRecord(i),value2:this.parseValueRecord(s)}}))}}};Pe[3]=function(){return{error:"GPOS Lookup 3 not supported"}};Pe[4]=function(){return{error:"GPOS Lookup 4 not supported"}};Pe[5]=function(){return{error:"GPOS Lookup 5 not supported"}};Pe[6]=function(){return{error:"GPOS Lookup 6 not supported"}};Pe[7]=function(){return{error:"GPOS Lookup 7 not supported"}};Pe[8]=function(){return{error:"GPOS Lookup 8 not supported"}};Pe[9]=function(){return{error:"GPOS Lookup 9 not supported"}};function Ic(e,t){t=t||0;var r=new A(e,t),n=r.parseVersion(1);return N.argument(n===1||n===1.1,"Unsupported GPOS table version "+n),n===1?{version:n,scripts:r.parseScriptList(),features:r.parseFeatureList(),lookups:r.parseLookupList(Pe)}:{version:n,scripts:r.parseScriptList(),features:r.parseFeatureList(),lookups:r.parseLookupList(Pe),variations:r.parseFeatureVariationsList()}}var Bc=new Array(10);function Rc(e){return new U.Table("GPOS",[{name:"version",type:"ULONG",value:65536},{name:"scripts",type:"TABLE",value:new U.ScriptList(e.scripts)},{name:"features",type:"TABLE",value:new U.FeatureList(e.features)},{name:"lookups",type:"TABLE",value:new U.LookupList(e.lookups,Bc)}])}var Uc={parse:Ic,make:Rc};function Oc(e){var t={};e.skip("uShort");var r=e.parseUShort();N.argument(r===0,"Unsupported kern sub-table version."),e.skip("uShort",2);var n=e.parseUShort();e.skip("uShort",3);for(var i=0;i1&&console.warn("Only the first kern subtable is supported."),e.skip("uLong");var n=e.parseUShort(),i=n&255;if(e.skip("uShort"),i===0){var s=e.parseUShort();e.skip("uShort",3);for(var o=0;o"u",i=n&&!r.isUrl?Gc:Vc;return new Promise(function(s,o){i(e,function(a,l){if(a){if(t)return t(a);o(a)}var u;try{u=fo(l,r)}catch(c){if(t)return t(c,null);o(c)}if(t)return t(null,u);s(u)})})}function Xc(e,t){var r=ui(),n=r.readFileSync(e);return fo(Q2(n),t)}var jc=Object.freeze({__proto__:null,Font:K,Glyph:_e,Path:pe,BoundingBox:st,_parse:D,parse:fo,load:Wc,loadSync:Xc}),u0=jc;function q0(e){return Yc(u0.parse(e))}function Yc(e){let t=1e5/((e.unitsPerEm||2048)*72),r={};r.glyphs={};for(let i in e.glyphs.glyphs){let s=e.glyphs.glyphs[i],o=[];s.unicode!==void 0&&o.push(s.unicode);for(let a of s.unicodes)o.indexOf(a)==-1&&o.push(a);for(let a of o){var n={};n.ha=Math.round(s.advanceWidth*t);let{x1:l,y1:u}=s.getPath().getBoundingBox();n.x_min=Math.round(l*t),n.x_max=Math.round(u*t),n.o="",s.path.commands.forEach(function(c,f){c.type.toLowerCase()==="c"&&(c.type="b"),n.o+=c.type.toLowerCase(),n.o+=" ",c.x!==void 0&&c.y!==void 0&&(n.o+=Math.round(c.x*t),n.o+=" ",n.o+=Math.round(c.y*t),n.o+=" "),c.x1!==void 0&&c.y1!==void 0&&(n.o+=Math.round(c.x1*t),n.o+=" ",n.o+=Math.round(c.y1*t),n.o+=" "),c.x2!==void 0&&c.y2!==void 0&&(n.o+=Math.round(c.x2*t),n.o+=" ",n.o+=Math.round(c.y2*t),n.o+=" ")}),r.glyphs[String.fromCharCode(a)]=n}}return r.familyName=e.familyName,r.ascender=Math.round(e.ascender*t),r.descender=Math.round(e.descender*t),r.underlinePosition=Math.round(e.tables.post.underlinePosition*t),r.underlineThickness=Math.round(e.tables.post.underlineThickness*t),r.boundingBox={yMin:Math.round(e.tables.head.yMin*t),xMin:Math.round(e.tables.head.xMin*t),yMax:Math.round(e.tables.head.yMax*t),xMax:Math.round(e.tables.head.xMax*t)},r.resolution=1e3,r.original_font_information=e.tables.name,e.styleName?.toLowerCase().indexOf("bold")>-1?r.cssFontWeight="bold":r.cssFontWeight="normal",e.styleName?.toLowerCase().indexOf("italic")>-1?r.cssFontStyle="italic":r.cssFontStyle="normal",r}function f0(e,t,r,n=!1){let i=[];Undo.initEdit({elements:i,selection:!0},n);let s;try{s=new THREE.TextGeometry(e,{font:t,size:r.size,height:r.height,curveSegments:r.curveSegments,bevelEnabled:r.bevelThickness>0,bevelThickness:r.bevelThickness/16,bevelSize:r.bevelSize/16,bevelOffset:r.bevelOffset/16,bevelSegments:r.bevelSegments})}catch(a){throw Blockbench.showQuickMessage("Invalid OpenType font!"),a}let o=ur(s);o.init(),i.push(o),o.select(),Undo.finishEdit("MTools: Generate Mesh")}var Kc=new Dialog({title:"Generate Text",form:{text:{label:"Text",type:"textarea",value:"Hello, World!"},file:{label:"OpenType Font (Optional)",type:"file",extensions:["ttf","otf","woff","woff2"],placeholder:"Roboto Regular",filetype:"Font",readtype:"buffer"},size:{label:"Size",type:"number",value:8,min:0},height:{label:"Thickness",type:"number",value:2,min:0},curveSegments:{label:"Resolution",type:"number",value:1,min:1},_:"_",bevelThickness:{label:"Bevel Thickness",type:"number",value:0,min:0},bevelSize:{label:"Bevel Size",type:"number",value:8,min:0},bevelOffset:{label:"Bevel Offset",type:"number",value:0,min:0},bevelSegments:{label:"Bevel Segments",type:"number",value:1,min:0}},onConfirm(e){let t;if(!e.file)t=ka;else try{t=q0(this.form.file.content)}catch(n){throw Blockbench.showQuickMessage("Invalid OpenType font!"),n}for(let n of e.text)n!=` `&&!(n in t.glyphs)&&bn(`Character "${n}" doesn't exist on the provided font!`,2e3);let r=new THREE.Font(t);f0(e.text,r,e),Undo.amendEdit({text:{label:"Text",type:"textarea",value:e.text},size:{label:"Size",type:"number",value:e.size,min:0},height:{label:"Thickness",type:"number",value:e.height,min:0},curveSegments:{label:"Resolution",type:"number",value:e.curveSegments,min:1},bevelThickness:{label:"Bevel Thickness",type:"number",value:e.bevelThickness,min:0},bevelSize:{label:"Bevel Size",type:"number",value:e.bevelSize,min:0},bevelOffset:{label:"Bevel Offset",type:"number",value:e.bevelOffset,min:0},bevelSegments:{label:"Bevel Segments",type:"number",value:e.bevelSegments,min:0}},n=>{f0(n.text,r,n,!0)})}}),Fy=P("textmesh",()=>{Kc.show()});var Gt={TwistedTorus:{x:"-cos(u)*(6-(5/4 + sin(3*v))*sin(v-3*u))",y:"-(6-(5/4 + sin(3*v))*sin(v-3*u))*sin(u)",z:"cos(v-3*u)*(5/4+sin(3*v))",scale:1,uRange:[0,6.2831854820251465],uDivs:32,uWrap:!0,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!0,vClose:!0},Bonbon:{x:"(u-3.3379)",y:"cos(u)*sin(v)",z:"cos(u)*cos(v)",scale:2,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Boy:{x:"(sq2 * cos(2*u)*pow(cos(v),2) + cos(u)*sin(2*v)) / (2 - alpha *sq2*sin(3*u)*sin(2*v))",y:"(sq2 * sin(2*u)*pow(cos(v),2) - sin(u)*sin(2*v)) / (2 - alpha *sq2*sin(3*u)*sin(2*v))",z:"(3*pow(cos(v),2)) / (2 - alpha*sq2*sin(3*u)*sin(2*v))",scale:4,uRange:[-1.5707963705062866,1.5707963705062866],uDivs:16,uWrap:!1,vRange:[0,3.1415927410125732],vDivs:32,vWrap:!1,vClose:!1,variables:"alpha=1"},Hexahedron:{x:"pow(cos(v),3)*pow(cos(u),3)",y:"pow(sin(u),3)",z:"pow(sin(v),3)*pow(cos(u),3)",scale:8,uRange:[-1.2999999523162842,1.2999999523162842],uDivs:16,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Klein:{x:"(3*(1+sin(v)) + 2*(1-cos(v)/2)*cos(u))*cos(v)",y:"(4+2*(1-cos(v)/2)*cos(u))*sin(v)",z:"-2*(1-cos(v)/2)*sin(u)",scale:1,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!0,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Moebius:{x:"(cos(v)+u*cos(v/2)*cos(v))",y:"(u*sin(v/2))",z:"(sin(v)+u*cos(v/2)*sin(v))",scale:4,uRange:[-.4000000059604645,.4000000059604645],uDivs:4,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Breather:{x:"-u + (2*rr*cosh(alpha*u)*sinh(alpha*u))/denom",y:"(2*ww*cosh(alpha*u)*(-(ww*cos(v)*cos(ww*v)) - sin(v)*sin(ww*v)))/denom",z:"(2*ww*cosh(alpha*u)*(-(ww*sin(v)*cos(ww*v)) + cos(v)*sin(ww*v)))/denom",scale:2,uRange:[-13.2,13.2],uDivs:16,uWrap:!1,vRange:[-37.4,37.4],vDivs:32,vWrap:!1,vClose:!1,variables:`alpha = 0.4 rr= 1 - pow(alpha,2) ww = sqrt(rr) denom = alpha*( pow(ww*cosh(alpha*u),2) + pow(alpha*sin(ww*v),2) )`},RidgedTorus:{x:"outer_radius*cos(u)+(ridge_power*sin(numofridges*u)+inner_radius)*cos(u)*cos(v)",y:"outer_radius*sin(u)+(ridge_power*sin(numofridges*u)+inner_radius)*sin(u)*cos(v)",z:"(ridge_power*sin(numofridges*u)+inner_radius)*sin(v)",scale:1,uRange:[0,6.2831854820251465],uDivs:32,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1,variables:`outer_radius = 5 ridge_power = 0.6 inner_radius = 2 numofridges = 10`},CliffordTorus:{x:"cos(u+v)/(sq2+cos(v-u))",y:"sin(v-u)/(sq2+cos(v-u))",z:"sin(u+v)/(sq2+cos(v-u))",scale:4,uRange:[0,3.1415927410125732],uDivs:8,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:32,vWrap:!1,vClose:!1,variables:"sq2 = 1.4142135623730951"},Cyclide:{x:"(thickness*(center_offset - aspect_ratio*cos(u)*cos(v) ) + radius*radius*cos(u)) / denom",y:"(radius*sin(u)*(aspect_ratio-thickness*cos(v) ) )/denom",z:"(radius*sin(v)*(center_offset*cos(u)-thickness ) )/denom",scale:4,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1,variables:`aspect_ratio = 1 radius = 0.98 center_offset = 0.199 thickness = 0.3 denom = (aspect_ratio-center_offset*cos(u)*cos(v))`},Shell:{x:"(cos(v)*(1+cos(u))*sin(v/8))",y:"(sin(u)*sin(v/8)+cos(v/8)*1.5)",z:"(sin(v)*(1+cos(u))*sin(v/8))",scale:4,uRange:[0,6.2831854820251465],uDivs:8,uWrap:!0,vRange:[0,12.566370964050293],vDivs:32,vWrap:!1,vClose:!1},Catalan:{x:"u-sin(u)*cosh(v)",y:"4*sin(1/2*u)*sinh(v/2)",z:"1-cos(u)*cosh(v)",scale:1,uRange:[-3.1415927410125732,9.42477798461914],uDivs:24,uWrap:!1,vRange:[-2,2],vDivs:8,vWrap:!1,vClose:!1},Dini:{x:"radius*cos(u)*sin(v)",y:"2*(((cos(v)+ln(tan(v/2)+1E-2)) + twist_rotation*u)+3.4985)",z:"radius*sin(u)*sin(v)",scale:1,uRange:[0,12.566370614359172],uDivs:16,uWrap:!1,vRange:[0,2],vDivs:8,vWrap:!1,vClose:!1,variables:`radius = 4 twist_rotation=0.2`},Catenoid:{x:"2*cosh(v/2)*cos(u)",y:"v",z:"2*cosh(v/2)*sin(u)",scale:1,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:24,uWrap:!0,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:8,vWrap:!1,vClose:!1},Cochlea:{x:"v*cos(u)",y:"v*sin(u)",z:"(0.4*u-2.5383)",scale:4,uRange:[0,12.566370964050293],uDivs:16,uWrap:!1,vRange:[0,2],vDivs:16,vWrap:!1,vClose:!1},Cosinus:{x:"u",y:"sin(pi* ( pow(u,2) + pow(v,2) ) )/2",z:"v",scale:8,uRange:[-1,1],uDivs:16,uWrap:!1,vRange:[-1,1],vDivs:16,vWrap:!1,vClose:!1},Enneper:{x:"u -pow(u,3)/3 + u*pow(v,2)",y:"pow(u,2) - pow(v,2)",z:"v -pow(v,3)/3 + v*pow(u,2)",scale:1,uRange:[-2,2],uDivs:8,uWrap:!1,vRange:[-2,2],vDivs:8,vWrap:!1,vClose:!1},Helicoidal:{x:"sinh(v)*sin(u)",y:"3*u",z:"-sinh(v)*cos(u)",scale:1,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:16,uWrap:!1,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:8,vWrap:!1,vClose:!1},Helix:{x:"(1-0.1*cos(v))*cos(u)/0.1",y:"0.1*(sin(v) + u/1.7 -10)/0.1 + 5",z:"(1-0.1*cos(v))*sin(u)/0.1",scale:1,uRange:[0,12.566370964050293],uDivs:32,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1},Hyperhelicoidal:{x:"(sinh(v)*cos(3*u))/(1+cosh(u)*cosh(v))",y:"(cosh(v)*sinh(u))/(1+cosh(u)*cosh(v))",z:"(sinh(v)*sin(3*u))/(1+cosh(u)*cosh(v))",scale:8,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:32,uWrap:!1,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:8,vWrap:!1,vClose:!1},PseudoCatenoid:{x:"2.2*(2*cosh(v/2)*cos(u))",y:"1.51166 * (2*cosh(v/2)*sin(u) * sin((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513) + 1.8*(v) * cos((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513))",z:"1.51166 * (2*cosh(v/2)*sin(u) * cos((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513) - 1.8*(v) * sin((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513))",scale:1,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:32,uWrap:!1,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:14,vWrap:!1,vClose:!1},PseudoSphere:{x:"cos(u)*cos(v)+sin((sin(u)+1)*2*pi)",y:"4*sin(u)",z:"cos(u)*sin(v)+cos((sin(u)+1)*2*pi)",scale:2,uRange:[-1.5707963705062866,1.5707963705062866],uDivs:32,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1},Sine:{x:"sin(u)",y:"sin(v)",z:"sin(u+v)",scale:8,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!0,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!0,vClose:!0},Snake:{x:"1.2*(1 -v/(2*pi))*cos(3*v)*(1 + cos(u)) + 3*cos(3*v)",y:"9*v/(2*pi) + 1.2*(1 - v/(2*pi))*sin(u)",z:"1.2*(1 -v/(2*pi))*sin(3*v)*(1 + cos(u)) + 3*sin(3*v)",scale:1,uRange:[0,6.2831854820251465],uDivs:7,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:42,vWrap:!1,vClose:!1},SteroSphere:{x:"(2*u/(u*u+v*v+1))",y:"((u*u+v*v-1)/(u*u+v*v+1))",z:"(2*v/(u*u+v*v+1))",scale:8,uRange:[-2,2],uDivs:16,uWrap:!1,vRange:[-2,2],vDivs:16,vWrap:!1,vClose:!1},Torus:{x:"(1+0.5*cos(u))*cos(v)",y:"0.5*sin(u)",z:"(1+0.5*cos(u))*sin(v)",scale:6,uRange:[0,6.2831854820251465],uDivs:8,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:12,vWrap:!1,vClose:!1}};var Fe="INUMBER",yr="IOP1",br="IOP2",Sr="IOP3",at="IVAR",Ht="IVARNAME",vr="IFUNCALL",Ei="IFUNDEF",Te="IEXPR",mo="IEXPREVAL",Wt="IMEMBER",Ai="IENDSTATEMENT",gr="IARRAY";function X(e,t){this.type=e,this.value=t??0}X.prototype.toString=function(){switch(this.type){case Fe:case yr:case br:case Sr:case at:case Ht:case Ai:return this.value;case vr:return"CALL "+this.value;case Ei:return"DEF "+this.value;case gr:return"ARRAY "+this.value;case Wt:return"."+this.value;default:return"Invalid Instruction"}};function Ci(e){return new X(yr,e)}function ct(e){return new X(br,e)}function y0(e){return new X(Sr,e)}function ho(e,t,r,n,i){for(var s=[],o=[],a,l,u,c,f=0;f1)l=s.pop(),a=s.pop(),c=r[q.value],q=new X(Fe,c(a.value,l.value)),s.push(q);else if(p===Sr&&s.length>2)u=s.pop(),l=s.pop(),a=s.pop(),q.value==="?"?s.push(a.value?l.value:u.value):(c=n[q.value],q=new X(Fe,c(a.value,l.value,u.value)),s.push(q));else if(p===yr&&s.length>0)a=s.pop(),c=t[q.value],q=new X(Fe,c(a.value)),s.push(q);else if(p===Te){for(;s.length>0;)o.push(s.shift());o.push(new X(Te,ho(q.value,t,r,n,i)))}else if(p===Wt&&s.length>0)a=s.pop(),s.push(new X(Fe,a.value[q.value]));else{for(;s.length>0;)o.push(s.shift());o.push(q)}}for(;s.length>0;)o.push(s.shift());return o}function b0(e,t,r){for(var n=[],i=0;i0;)l.unshift(ot(n.pop(),r));if(a=n.pop(),a.apply&&a.call)n.push(a.apply(void 0,l));else throw new Error(a+" is not a function")}else if(p===Ei)n.push(function(){for(var v=n.pop(),m=[],h=q.value;h-- >0;)m.unshift(n.pop());var g=n.pop(),x=function(){for(var b=Object.assign({},r),y=0,_=m.length;y<_;y++)b[m[y]]=arguments[y];return Vt(v,t,b)};return Object.defineProperty(x,"name",{value:g,writable:!1}),r[g]=x,x}());else if(p===Te)n.push(Jc(q,t));else if(p===mo)n.push(q);else if(p===Wt)i=n.pop(),n.push(i[q.value]);else if(p===Ai)n.pop();else if(p===gr){for(u=q.value,l=[];u-- >0;)l.unshift(n.pop());n.push(l)}else throw new Error("invalid Expression")}if(n.length>1)throw new Error("invalid Expression (parity)");return n[0]===0?0:ot(n[0],r)}function Jc(e,t,r){return vo(e)?e:{type:mo,value:function(n){return Vt(e.value,t,n)}}}function vo(e){return e&&e.type===mo}function ot(e,t){return vo(e)?e.value(t):e}function go(e,t){for(var r=[],n,i,s,o,a,l,u=0;u0;)a.unshift(r.pop());o=r.pop(),r.push(o+"("+a.join(", ")+")")}else if(f===Ei){for(i=r.pop(),l=c.value,a=[];l-- >0;)a.unshift(r.pop());n=r.pop(),t?r.push("("+n+" = function("+a.join(", ")+") { return "+i+" })"):r.push("("+n+"("+a.join(", ")+") = "+i+")")}else if(f===Wt)n=r.pop(),r.push(n+"."+c.value);else if(f===gr){for(l=c.value,a=[];l-- >0;)a.unshift(r.pop());r.push("["+a.join(", ")+"]")}else if(f===Te)r.push("("+go(c.value,t)+")");else if(f!==Ai)throw new Error("invalid Expression")}return r.length>1&&(t?r=[r.join(",")]:r=[r.join(";")]),String(r[0])}function p0(e){return typeof e=="string"?JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029"):e}function mr(e,t){for(var r=0;r=this.expression.length)return this.newToken(sn,"EOF");if(this.isWhitespace()||this.isComment())return this.next();if(this.isRadixInteger()||this.isNumber()||this.isOperator()||this.isString()||this.isParen()||this.isBracket()||this.isComma()||this.isSemicolon()||this.isNamedOp()||this.isConst()||this.isName())return this.current;this.parseError('Unknown character "'+this.expression.charAt(this.pos)+'"')};se.prototype.isString=function(){var e=!1,t=this.pos,r=this.expression.charAt(t);if(r==="'"||r==='"')for(var n=this.expression.indexOf(r,t+1);n>=0&&this.pos"9")))break}if(t>e){var n=this.expression.substring(e,t);if(n in this.consts)return this.current=this.newToken(Fi,this.consts[n]),this.pos+=n.length,!0}return!1};se.prototype.isNamedOp=function(){for(var e=this.pos,t=e;t"9")))break}if(t>e){var n=this.expression.substring(e,t);if(this.isOperatorEnabled(n)&&(n in this.binaryOps||n in this.unaryOps||n in this.ternaryOps))return this.current=this.newToken(J,n),this.pos+=n.length,!0}return!1};se.prototype.isName=function(){for(var e=this.pos,t=e,r=!1;t"9"))break}else r=!0}if(r){var i=this.expression.substring(e,t);return this.current=this.newToken(yo,i),this.pos+=i.length,!0}return!1};se.prototype.isWhitespace=function(){for(var e=!1,t=this.expression.charAt(this.pos);(t===" "||t===" "||t===` `||t==="\r")&&(e=!0,this.pos++,!(this.pos>=this.expression.length));)t=this.expression.charAt(this.pos);return e};var $c=/^[0-9a-f]{4}$/i;se.prototype.unescape=function(e){var t=e.indexOf("\\");if(t<0)return e;for(var r=e.substring(0,t);t>=0;){var n=e.charAt(++t);switch(n){case"'":r+="'";break;case'"':r+='"';break;case"\\":r+="\\";break;case"/":r+="/";break;case"b":r+="\b";break;case"f":r+="\f";break;case"n":r+=` `;break;case"r":r+="\r";break;case"t":r+=" ";break;case"u":var i=e.substring(t+1,t+5);$c.test(i)||this.parseError("Illegal escape sequence: \\u"+i),r+=String.fromCharCode(parseInt(i,16)),t+=4;break;default:throw this.parseError('Illegal escape sequence: "\\'+n+'"')}++t;var s=e.indexOf("\\",t);r+=e.substring(t,s<0?e.length:s),t=s}return r};se.prototype.isComment=function(){var e=this.expression.charAt(this.pos);return e==="/"&&this.expression.charAt(this.pos+1)==="*"?(this.pos=this.expression.indexOf("*/",this.pos)+2,this.pos===1&&(this.pos=this.expression.length),!0):!1};se.prototype.isRadixInteger=function(){var e=this.pos;if(e>=this.expression.length-2||this.expression.charAt(e)!=="0")return!1;++e;var t,r;if(this.expression.charAt(e)==="x")t=16,r=/^[0-9a-f]$/i,++e;else if(this.expression.charAt(e)==="b")t=2,r=/^[01]$/i,++e;else return!1;for(var n=!1,i=e;e="0"&&o<="9"||!i&&o===".");)o==="."?i=!0:s=!0,t++,e=s;if(e&&(n=t),o==="e"||o==="E"){t++;for(var a=!0,l=!1;t="0"&&o<="9")l=!0,a=!1;else break;t++}l||(t=n)}return e?(this.current=this.newToken(Fi,parseFloat(this.expression.substring(r,t))),this.pos=t):this.pos=n,e};se.prototype.isOperator=function(){var e=this.pos,t=this.expression.charAt(this.pos);if(t==="+"||t==="-"||t==="*"||t==="/"||t==="%"||t==="^"||t==="?"||t===":"||t===".")this.current=this.newToken(J,t);else if(t==="\u2219"||t==="\u2022")this.current=this.newToken(J,"*");else if(t===">")this.expression.charAt(this.pos+1)==="="?(this.current=this.newToken(J,">="),this.pos++):this.current=this.newToken(J,">");else if(t==="<")this.expression.charAt(this.pos+1)==="="?(this.current=this.newToken(J,"<="),this.pos++):this.current=this.newToken(J,"<");else if(t==="|")if(this.expression.charAt(this.pos+1)==="|")this.current=this.newToken(J,"||"),this.pos++;else return!1;else if(t==="=")this.expression.charAt(this.pos+1)==="="?(this.current=this.newToken(J,"=="),this.pos++):this.current=this.newToken(J,t);else if(t==="!")this.expression.charAt(this.pos+1)==="="?(this.current=this.newToken(J,"!="),this.pos++):this.current=this.newToken(J,t);else return!1;return this.pos++,this.isOperatorEnabled(this.current.value)?!0:(this.pos=e,!1)};se.prototype.isOperatorEnabled=function(e){return this.parser.isOperatorEnabled(e)};se.prototype.getCoordinates=function(){var e=0,t,r=-1;do e++,t=this.pos-r,r=this.expression.indexOf(` `,r+1);while(r>=0&&r"u"?!0:Array.isArray(t)?mr(t,e.value):typeof t=="function"?t(e):e.value===t};te.prototype.save=function(){this.savedCurrent=this.current,this.savedNextToken=this.nextToken,this.tokens.save()};te.prototype.restore=function(){this.tokens.restore(),this.current=this.savedCurrent,this.nextToken=this.savedNextToken};te.prototype.accept=function(e,t){return this.nextToken.type===e&&this.tokenMatches(this.nextToken,t)?(this.next(),!0):!1};te.prototype.expect=function(e,t){if(!this.accept(e,t)){var r=this.tokens.getCoordinates();throw new Error("parse error ["+r.line+":"+r.column+"]: Expected "+(t||e))}};te.prototype.parseAtom=function(e){var t=this.tokens.unaryOps;function r(i){return i.value in t}if(this.accept(yo)||this.accept(J,r))e.push(new X(at,this.current.value));else if(this.accept(Fi))e.push(new X(Fe,this.current.value));else if(this.accept(S0))e.push(new X(Fe,this.current.value));else if(this.accept(lt,"("))this.parseExpression(e),this.expect(lt,")");else if(this.accept(xr,"["))if(this.accept(xr,"]"))e.push(new X(gr,0));else{var n=this.parseArrayList(e);e.push(new X(gr,n))}else throw new Error("unexpected "+this.nextToken)};te.prototype.parseExpression=function(e){var t=[];this.parseUntilEndStatement(e,t)||(this.parseVariableAssignmentExpression(t),!this.parseUntilEndStatement(e,t)&&this.pushExpression(e,t))};te.prototype.pushExpression=function(e,t){for(var r=0,n=t.length;r=",">","in"];te.prototype.parseComparison=function(e){for(this.parseAddSub(e);this.accept(J,e7);){var t=this.current;this.parseAddSub(e),e.push(ct(t.value))}};var t7=["+","-","||"];te.prototype.parseAddSub=function(e){for(this.parseTerm(e);this.accept(J,t7);){var t=this.current;this.parseTerm(e),e.push(ct(t.value))}};var r7=["*","/","%"];te.prototype.parseTerm=function(e){for(this.parseFactor(e);this.accept(J,r7);){var t=this.current;this.parseFactor(e),e.push(ct(t.value))}};te.prototype.parseFactor=function(e){var t=this.tokens.unaryOps;function r(i){return i.value in t}if(this.save(),this.accept(J,r)){if(this.current.value!=="-"&&this.current.value!=="+"){if(this.nextToken.type===lt&&this.nextToken.value==="("){this.restore(),this.parseExponential(e);return}else if(this.nextToken.type===bo||this.nextToken.type===Mi||this.nextToken.type===sn||this.nextToken.type===lt&&this.nextToken.value===")"){this.restore(),this.parseAtom(e);return}}var n=this.current;this.parseFactor(e),e.push(Ci(n.value))}else this.parseExponential(e)};te.prototype.parseExponential=function(e){for(this.parsePostfixExpression(e);this.accept(J,"^");)this.parseFactor(e),e.push(ct("^"))};te.prototype.parsePostfixExpression=function(e){for(this.parseFunctionCall(e);this.accept(J,"!");)e.push(Ci("!"))};te.prototype.parseFunctionCall=function(e){var t=this.tokens.unaryOps;function r(s){return s.value in t}if(this.accept(J,r)){var n=this.current;this.parseAtom(e),e.push(Ci(n.value))}else for(this.parseMemberExpression(e);this.accept(lt,"(");)if(this.accept(lt,")"))e.push(new X(vr,0));else{var i=this.parseArgumentList(e);e.push(new X(vr,i))}};te.prototype.parseArgumentList=function(e){for(var t=0;!this.accept(lt,")");)for(this.parseExpression(e),++t;this.accept(Mi);)this.parseExpression(e),++t;return t};te.prototype.parseMemberExpression=function(e){for(this.parseAtom(e);this.accept(J,".")||this.accept(xr,"[");){var t=this.current;if(t.value==="."){if(!this.allowMemberAccess)throw new Error('unexpected ".", member access is not permitted');this.expect(yo),e.push(new X(Wt,this.current.value))}else if(t.value==="["){if(!this.tokens.isOperatorEnabled("["))throw new Error('unexpected "[]", arrays are disabled');this.parseExpression(e),this.expect(xr,"]"),e.push(ct("["))}else throw new Error("unexpected symbol: "+t.value)}};function n7(e,t){return Number(e)+Number(t)}function i7(e,t){return e-t}function s7(e,t){return e*t}function o7(e,t){return e/t}function a7(e,t){return e%t}function l7(e,t){return Array.isArray(e)&&Array.isArray(t)?e.concat(t):""+e+t}function c7(e,t){return e===t}function u7(e,t){return e!==t}function q7(e,t){return e>t}function f7(e,t){return e=t}function h7(e,t){return e<=t}function d7(e,t){return!!(e&&t)}function m7(e,t){return!!(e||t)}function v7(e,t){return mr(t,e)}function g7(e){return(Math.exp(e)-Math.exp(-e))/2}function x7(e){return(Math.exp(e)+Math.exp(-e))/2}function y7(e){return e===1/0?1:e===-1/0?-1:(Math.exp(e)-Math.exp(-e))/(Math.exp(e)+Math.exp(-e))}function b7(e){return e===-1/0?e:Math.log(e+Math.sqrt(e*e+1))}function S7(e){return Math.log(e+Math.sqrt(e*e-1))}function T7(e){return Math.log((1+e)/(1-e))/2}function h0(e){return Math.log(e)*Math.LOG10E}function _7(e){return-e}function w7(e){return!e}function E7(e){return e<0?Math.ceil(e):Math.floor(e)}function A7(e){return Math.random()*(e||1)}function d0(e){return So(e+1)}function C7(e){return isFinite(e)&&e===Math.round(e)}var F7=4.7421875,po=[.9999999999999971,57.15623566586292,-59.59796035547549,14.136097974741746,-.4919138160976202,3399464998481189e-20,4652362892704858e-20,-9837447530487956e-20,.0001580887032249125,-.00021026444172410488,.00021743961811521265,-.0001643181065367639,8441822398385275e-20,-26190838401581408e-21,36899182659531625e-22];function So(e){var t,r;if(C7(e)){if(e<=0)return isFinite(e)?1/0:NaN;if(e>171)return 1/0;for(var n=e-2,i=e-1;n>1;)i*=n,n--;return i===0&&(i=1),i}if(e<.5)return Math.PI/(Math.sin(Math.PI*e)*So(1-e));if(e>=171.35)return 1/0;if(e>85){var s=e*e,o=s*e,a=o*e,l=a*e;return Math.sqrt(2*Math.PI/e)*Math.pow(e/Math.E,e)*(1+1/(12*e)+1/(288*s)-139/(51840*o)-571/(2488320*a)+163879/(209018880*l)+5246819/(75246796800*l*e))}--e,r=po[0];for(var u=1;u0?(i=n/t,e+=i*i):e+=n}return t===1/0?1/0:t*Math.sqrt(e)}function v0(e,t,r){return e?t:r}function k7(e,t){return typeof t>"u"||+t==0?Math.round(e):(e=+e,t=-+t,isNaN(e)||!(typeof t=="number"&&t%1===0)?NaN:(e=e.toString().split("e"),e=Math.round(+(e[0]+"e"+(e[1]?+e[1]-t:-t))),e=e.toString().split("e"),+(e[0]+"e"+(e[1]?+e[1]+t:t))))}function I7(e,t,r){return r&&(r[e]=t),t}function B7(e,t){return e[t|0]}function R7(e){return arguments.length===1&&Array.isArray(e)?Math.max.apply(Math,e):Math.max.apply(Math,arguments)}function U7(e){return arguments.length===1&&Array.isArray(e)?Math.min.apply(Math,e):Math.min.apply(Math,arguments)}function O7(e,t){if(typeof e!="function")throw new Error("First argument to map is not a function");if(!Array.isArray(t))throw new Error("Second argument to map is not an array");return t.map(function(r,n){return e(r,n)})}function D7(e,t,r){if(typeof e!="function")throw new Error("First argument to fold is not a function");if(!Array.isArray(r))throw new Error("Second argument to fold is not an array");return r.reduce(function(n,i,s){return e(n,i,s)},t)}function L7(e,t){if(typeof e!="function")throw new Error("First argument to filter is not a function");if(!Array.isArray(t))throw new Error("Second argument to filter is not an array");return t.filter(function(r,n){return e(r,n)})}function P7(e,t){if(!(Array.isArray(t)||typeof t=="string"))throw new Error("Second argument to indexOf is not a string or array");return t.indexOf(e)}function N7(e,t){if(!Array.isArray(t))throw new Error("Second argument to join is not an array");return t.join(e)}function z7(e){return(e>0)-(e<0)||+e}var g0=1/3;function G7(e){return e<0?-Math.pow(-e,g0):Math.pow(e,g0)}function V7(e){return Math.exp(e)-1}function H7(e){return Math.log(1+e)}function W7(e){return Math.log(e)/Math.LN2}function wt(e){this.options=e||{},this.unaryOps={sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,sinh:Math.sinh||g7,cosh:Math.cosh||x7,tanh:Math.tanh||y7,asinh:Math.asinh||b7,acosh:Math.acosh||S7,atanh:Math.atanh||T7,sqrt:Math.sqrt,cbrt:Math.cbrt||G7,log:Math.log,log2:Math.log2||W7,ln:Math.log,lg:Math.log10||h0,log10:Math.log10||h0,expm1:Math.expm1||V7,log1p:Math.log1p||H7,abs:Math.abs,ceil:Math.ceil,floor:Math.floor,round:Math.round,trunc:Math.trunc||E7,"-":_7,"+":Number,exp:Math.exp,not:w7,length:M7,"!":d0,sign:Math.sign||z7},this.binaryOps={"+":n7,"-":i7,"*":s7,"/":o7,"%":a7,"^":Math.pow,"||":l7,"==":c7,"!=":u7,">":q7,"<":f7,">=":p7,"<=":h7,and:d7,or:m7,in:v7,"=":I7,"[":B7},this.ternaryOps={"?":v0},this.functions={random:A7,fac:d0,min:U7,max:R7,hypot:Math.hypot||m0,pyt:Math.hypot||m0,pow:Math.pow,atan2:Math.atan2,if:v0,gamma:So,roundTo:k7,map:O7,fold:D7,filter:L7,indexOf:P7,join:N7},this.consts={E:Math.E,PI:Math.PI,true:!0,false:!1}}wt.prototype.parse=function(e){var t=[],r=new te(this,new se(this,e),{allowMemberAccess:this.options.allowMemberAccess});return r.parseExpression(t),r.expect(sn,"EOF"),new Ge(t,this)};wt.prototype.evaluate=function(e,t){return this.parse(e).evaluate(t)};var _0=new wt;wt.parse=function(e){return _0.parse(e)};wt.evaluate=function(e,t){return _0.parse(e).evaluate(t)};var x0={"+":"add","-":"subtract","*":"multiply","/":"divide","%":"remainder","^":"power","!":"factorial","<":"comparison",">":"comparison","<=":"comparison",">=":"comparison","==":"comparison","!=":"comparison","||":"concatenate",and:"logical",or:"logical",not:"logical","?":"conditional",":":"conditional","=":"assignment","[":"array","()=":"fndef"};function X7(e){return x0.hasOwnProperty(e)?x0[e]:e}wt.prototype.isOperatorEnabled=function(e){var t=X7(e),r=this.options.operators||{};return!(t in r)||!!r[t]};var on=new wt({allowMemberAccess:!0});on.consts={E:Math.E,e:Math.E,PI:Math.PI,pi:Math.PI,sq2:Math.SQRT2};var Dy=P("xyzmathsurfacefunction",()=>{let e={};for(let o in Gt)e[o]=o;let t=localStorage.getItem("mt_xyzSettings"),r;t!=null?(t=JSON.parse(t),r=t.preset):(t=Gt.TwistedTorus,r="TwistedTorus");let n=!0,i=new Dialog({title:"XYZ Math Surface Function",part_order:["form","lines"],buttons:["Save Settings To Memory","Confirm","Cancel"],cancelIndex:2,confirmIndex:1,width:650,onFormChange(o){if(n){n=!1;return}o.preset!=r&&(r=o.preset,this.setFormValues(Gt[o.preset]))},form:{preset:{label:"Preset",type:"select",options:()=>e},x:{label:"X",type:"text",value:Gt.TwistedTorus.x},y:{label:"Y",type:"text",value:Gt.TwistedTorus.y},z:{label:"Z",type:"text",value:Gt.TwistedTorus.z},scale:{label:"Scale",type:"number",value:1},_:"_",uRange:{label:"U Range",type:"vector",dimensions:2,value:[0,6.2831854820251465]},uDivs:{label:"U Divisions",type:"number",min:2,value:32},uWrap:{label:"U Wrap",type:"checkbox",value:!0},vRange:{label:"V Range",type:"vector",dimensions:2,value:[0,6.2831854820251465]},vDivs:{label:"V Divisions",type:"number",min:2,value:16},vWrap:{label:"V Wrap",type:"checkbox",value:!0},vClose:{label:"V Close",type:"checkbox",value:!0},__:"_",variables:{label:"Variables",type:"textarea",placeholder:"List the variables you want to use via name = value"}},onConfirm(o){let a=o.variables.split(` `),l={};for(let q of a){let[p,d]=q.split(/=(.+)/);p=p.replace(/[\s;]/g,""),d!==void 0&&(d=d.trim(),l[p]=on.parse(d))}let u=[];for(let q in l)l[q].variables().length==0&&u.push(q);function c(q,p={},d=!1){let v={},m=[];Undo.initEdit({elements:m,selection:!0},d);let h=new Mesh({vertices:{}}),[g,x]=o.uRange,b=q.uDivs,y=(x-g)/b,[_,T]=o.vRange,S=q.vDivs,E=(T-_)/S,w=b+1,F=S+1;o.uWrap&&(w-=1),o.vWrap&&(F-=1);let C=[],M=[];for(let k=0;k=F&&(L=0),o.uWrap&&V>=w&&(V=0);let G=[L*w+V,L*w+I,k*w+I,k*w+V],H=new MeshFace(h,{vertices:[C[G[0]],C[G[1]],C[G[2]],C[G[3]]]}),j=[M[G[0]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height),M[G[1]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height),M[G[2]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height),M[G[3]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height)];H.uv[H.vertices[0]]=[j[0][0],j[0][1]],H.uv[H.vertices[1]]=[j[1][0],j[1][1]],H.uv[H.vertices[2]]=[j[2][0],j[2][1]],H.uv[H.vertices[3]]=[j[3][0],j[3][1]],h.addFaces(H)}if(o.vClose&&o.uWrap&&!o.vWrap)for(let k=1;k["@value/"+q,{label:Uo(q),value:f[q],step:.1}]))},q=>{let p={};for(let d in q)d.startsWith("@value/")&&(p[d.substring(7)]=q[d]);c(q,p,!0)})}});i.show(),t!=null&&i.setFormValues(t);let s=$('button:contains("Save Settings To Memory")');s.off("click"),s.on("click",function(){let o=i.getFormResult();localStorage.setItem("mt_xyzSettings",JSON.stringify(o))})});var zy=P("generators");var w0=[],ki=[];BBPlugin.register(Xt,{new_repository_format:!0,title:"MTools",author:"Malik12tree",icon:"icon.png",description:"Adds powerful mesh modeling tools, operators and generators!",version:"2.1.0",min_version:"4.9.4",variant:"both",creation_date:"2022-04-09",has_changelog:!0,tags:["Format: Generic Model","Mesh","Tool"],onload(){function e(r){for(let n of ki)scene.remove(n);for(let n in r.faces){let i=r.faces[n],s=i.getCenter().V3_toThree();r.mesh.localToWorld(s);let o=i.getNormal(!0).V3_toThree(),a=zi(n,{fillStyle:"blue",fontSize:25});ki.push(a),a.position.copy(s),o&&a.position.add(o.multiplyScalar(.5)),scene.add(a)}for(let n in r.vertices){let i=r.vertices[n].V3_toThree();r.mesh.localToWorld(i);let s=Po(r,n)??new THREE.Vector3(0,1,0),o=zi(n,{fillStyle:"red",fontSize:25});ki.push(o),o.position.copy(i),s&&o.position.add(s.multiplyScalar(.25)),scene.add(o)}}if(!1){w0.push(Mesh.prototype.preview_controller.on("update_geometry",({element:r})=>e(r)));for(let r of Mesh.all)e(r)}Mesh.prototype.menu.structure.unshift(Et("tools")),Mesh.prototype.menu.structure.unshift(Et("operators")),MenuBar.addAction(Et("generators"),"filter")},onuninstall(){un.clear()},onunload(){for(let e of w0)e.delete();for(let e of ki)scene.remove(e);for(let e in qn){let t=Et(e);BarItems[t]?.delete()}}});})(); /*! Bundled license information: opentype.js/dist/opentype.module.js: (*! https://mths.be/codepointat v0.2.0 by @mathias *) expr-eval/dist/index.mjs: (*! Based on ndef.parser, by Raphael Graf(r@undefined.ch) http://www.undefined.ch/mparser/index.html Ported to JavaScript and modified by Matthew Crumley (email@matthewcrumley.com, http://silentmatt.com/) You are free to use and modify this code in anyway you find useful. Please leave this comment in the code to acknowledge its original source. If you feel like it, I enjoy hearing about projects that use my code, but don't feel like you have to let me know or ask permission. *) */ ================================================ FILE: plugins/meshy/LICENSE.MD ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: plugins/meshy/about.md ================================================ # Meshy Meshy is a plugin for Blockbench that allows you to create meshes from your bedrock models and import them into Minecraft. It's pretty simple just download the plugin and make a mesh like you normally would. Then add the geometry to your project. Alternatively you can also import an obj file then export it as a mesh. File -> Import -> Import OBJ File. It may also be slower for large meshes or if you don't have a the best computer. I've tested it quite large meshes and it works fine. But millage may vary. ## Settings ### Normalize UVs This will normalize the UVs of the mesh so that they are all between 0 and 1. This on by default it works either way but it is recommended to turn it on. So that if you change the texture size it will still be proprietary sized. ### Skip Normals This is a feature that skips the normal calculation for the mesh. This is off by default becuase most of the time you want to have the shading information. It will result in a smaller file size and will be faster to export. ( Not a major diffrence but it is a diffrence ) ### Force Multi-Textures This forces multiple textures to be used for bedrock models. This is off by default sense bedrock models can only have one texture. This force them to be enabled. But you will need to stitch the textures before you try puttinng them in minecraft. The plugin Texture Stitcher by mchorse can do this for you. ## CONTRIBUTING If you want to contribute to this plugin please make a pull request at my [GitHub repository](https://github.com/Shadowkitten47/Meshy). Also check that the change hasn't already been made onto that version sense I work on that quite a bit. If for some reason I don't respond or abonded the project or for any other reason that you want to make a change directly to BB make sure to comment Your username, What you changed, and why. ================================================ FILE: plugins/meshy/changelog.json ================================================ { "1.0.3": { "title": "1.0.3", "date": "2024-10-8", "author": "Shadowkitten47", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.0.4": { "title": "1.0.4", "date": "2024-18-8", "author": "Shadowkitten47", "categories": [ { "title": "Bug Fixes", "list": [ "Fix the invertion of the x-axis of the mesh", "Fix other smaller issues" ] } ] }, "1.0.5": { "title": "1.0.5", "date": "2025-7-6", "author": "Shadowkitten47", "categories": [ { "title": "Bug Fixes 2", "list": [ "Removed Meta Data, which caused issues on later versions of minecraft formating", "Fixed 1/2 length faces (lines and points) which would cause them not to render ingame" ] } ] } } ================================================ FILE: plugins/meshy/members.yml ================================================ maintainers: - Shadowkitten47 developers: - Shadowkitten47 ================================================ FILE: plugins/meshy/meshy.js ================================================ (function() { const pluginInfo = {"name":"Meshy","id":"meshy","version":"1.0.5","repository":"https://github.com/Shadowkitten47/Meshy"}; const pluginSettings = [ { id: 'meshy_normalized_mesh_uvs', name: 'Normalize Mesh UVs', description: 'Normalize UVs of polymeshes', category: 'export', value: true, plugin: pluginInfo.id, }, { id: 'meshy_skip_mesh_normals', name: 'Skip Mesh Normals', description: 'Skips normal claculation on polymeshes', category: 'export', value: false, plugin: pluginInfo.id, }, { //Force disable single texture on bedrock formats having more than one texture with meshes is pretty useful id: 'meshy_force_textures', name: 'Force Multi-Textures', description: 'Forces bedrock formats to use allow more than one texture ( You will need to stitch the textures )', category: 'edit', value: false, plugin: pluginInfo.id, onChange: (value) => { Formats['bedrock'].single_texture = !value; Formats['bedrock_old'].single_texture = !value; }, }, ]; //Function names for events to remove const listOfFunctions = [ meshyOnParseEvent.name, meshyOnCompileEvent.name, meshyOnBedrockCompileEvent.name]; Plugin.register(pluginInfo.id, { title: pluginInfo.name, //Meshy author: 'Shadowkitten47', creation_date: '2024-09-28', icon: 'diamond', description: 'Enables the use of a meshes in bedrock formats and to export them to Minecraft Bedrock', variant: 'both', version: pluginInfo.version, //1.0.4 tags: ['Minecraft: Bedrock Edition', 'Entity Models', 'Mesh'], has_changelog: true, min_version: '4.10.4', repository: pluginInfo.repository, //Link onload() { let bedrock_old = Formats['bedrock_old']; let bedrock = Formats['bedrock']; bedrock.meshes = true; bedrock_old.meshes = true; for (let s of pluginSettings) { if (!settings[s.id]) { new Setting(s.id, s); } } bedrock.single_texture = !settings['meshy_force_textures']?.value; bedrock_old.single_texture = !settings['meshy_force_textures']?.value; let codec = Codecs['bedrock']; purgeEvents(codec); //Removes all of events that match the function names used so that duplicates don't occur codec.on('parsed', meshyOnParseEvent); codec.on('compile', meshyOnBedrockCompileEvent); codec = Codecs['bedrock_old']; purgeEvents(codec); codec.on('parsed', meshyOnParseEvent); codec.on('compile', meshyOnCompileEvent); //pivot_tool = Toolbars["tools"].children.find((t) => t.id == 'pivot_tool').condition = () => { return false; }; }, onunload() { let bedrock_old = Formats['bedrock_old']; let bedrock = Formats['bedrock']; bedrock.meshes = false; bedrock_old.meshes = false; bedrock.single_texture = true; bedrock_old.single_texture = true; for (let s of pluginSettings) { if (settings[s.id]) { settings[s.id].delete(); } } let codec = Codecs['bedrock']; purgeEvents(codec); codec = Codecs['bedrock_old']; purgeEvents(codec); }, }); //Beaware: Function zone below function meshyOnCompileEvent({model, options}) { let groups = getAllGroups(); let loose_elements = []; Outliner.root.forEach((obj) => { if (obj instanceof OutlinerElement) { loose_elements.push(obj); } }); if (loose_elements.length) { let group = new Group({ name: 'bb_main', }); group.children.push(...loose_elements); group.is_catch_bone = true; group.createUniqueName(); groups.splice(0, 0, group); } for (let i = 0; i < groups.length; i++) { const g = groups[i]; if (g.type !== 'group' || g.export == false) return; if (!settings.export_empty_groups.value && !g.children.find((child) => child.export)) return; const bone = model.bones.find((b) => b.name === g.name); let poly_mesh = null; for (var obj of g.children) { if (obj instanceof Mesh) { poly_mesh = compileMesh(poly_mesh, obj); } } if (poly_mesh !== null) { bone.poly_mesh = poly_mesh; } } } function meshyOnParseEvent({model}) { for (let i = 0; i < model.bones.length; i++) { const bone = model.bones[i]; //The groups and bone should be parrel but to make sure it works in all cases below os freaky const group = Project.groups[i].name === bone.name ? Project.groups[i] : Project.groups.find((g) => g.name === bone.name) ?? new Group({name: bone.name}); if (bone.poly_mesh != null) { parseMesh(bone.poly_mesh, group); } } } function meshyOnBedrockCompileEvent({model, options}) { //Extra step for non-legacy bedrock model = model['minecraft:geometry'][0]; meshyOnCompileEvent({model, options}); } //Ensures every function is removed with the names used here. This is so that if duplicates are created it doesn't cause issues //The regular version does not do this function purgeEvents(codec) { for (let i = 0; i < codec.events['parsed']?.length; i++) { if (listOfFunctions.includes(codec.events['parsed'][i].name)) { codec.events['parsed'].splice(i, 1); } } for (let i = 0; i < codec.events['compile']?.length; i++) { if (listOfFunctions.includes(codec.events['compile'][i].name)) { codec.events['compile'].splice(i, 1); } } } /** * Converts a mesh to a polymesh. * @param {Object} polyMesh The polymesh to save to. If not defined, a new polymesh will be created. * @param {Mesh} mesh The mesh to save. * @returns {Object} The polymesh with the mesh saved to it. */ function compileMesh(polyMesh, mesh) { polyMesh ??= { normalized_uvs: settings["meshy_normalized_mesh_uvs"].value, positions: [], normals: [], uvs: [], polys: [] }; //vertex keys -> value const postionMap = new Map(); const normalMap = new Map(); const uvMap = new Map(); //normal arr -> value const normals = new Map(); //Make a map of faces a vertex is appart of const vertexFacesMap = new Map(); for (let faceKey in mesh.faces) { let face = mesh.faces[faceKey]; for (let vertexKey of face.vertices) { if (!vertexFacesMap.has(vertexKey)) { vertexFacesMap.set(vertexKey, []); } vertexFacesMap.get(vertexKey).push(faceKey); } } for (let [key, pos] of getVertices(mesh)) { postionMap.set(key, polyMesh.positions.length); polyMesh.positions.push(pos); const normal = getVertexNormal(mesh, key, vertexFacesMap); if (!normals.has(normal.toString())) { normalMap.set(key, polyMesh.normals.length); normals.set(normal.toString(), polyMesh.normals.length); polyMesh.normals.push(normal); } else normalMap.set(key, normals.get(normal.toString())) } normals.clear(); let polys = Object.values(mesh.faces).map((face) => { const poly = face.getSortedVertices().map((vertexKey) => { const uv = uvOnSave(...face.uv[vertexKey]); const uIndex = uvMap.get(uv.toString()) ?? (() => { const index = polyMesh.uvs.length; polyMesh.uvs.push(uv); uvMap.set(uv.toString(), index); return index; })(); return [postionMap.get(vertexKey), normalMap.get(vertexKey), uIndex]; }); if (poly.length < 4) //Fill the poly with the first vertex if less than a quad change: Support for less than 3 vertices return poly.concat(Array(4 - poly.length).fill(poly[0])); return poly; }); //Spread opertator fails here so we loop for each for (let poly of polys) polyMesh.polys.push(poly); return polyMesh; } function parseMesh(polyMesh, group) { const mesh = new Mesh({name: "mesh", autouv: 0, color: group.color, vertices: []}); const uniquePoints = new Set(); for ( let face of polyMesh.polys ) { const unique = new Set(); const vertices = [] const uvs = {} for (let point of face ) { if (unique.has(point.toString())) continue; unique.add(point.toString()); if ( !uniquePoints.has(point[0])) { uniquePoints.add(point[0]); let position = polyMesh.positions[point[0]] position[0] *= -1; mesh.vertices[`v${point[0]}`] = position; } vertices.push(`v${point[0]}`); const uv = [...polyMesh.uvs[point[2]]] if (polyMesh.normalized_uvs) { uv.V2_multiply(Project.texture_width, Project.texture_height) } uv[1] = Project.texture_height - uv[1] //Invert y axis uvs[`v${point[0]}`] = uv; } mesh.addFaces(new MeshFace(mesh, { uv: uvs, vertices })); } mesh.addTo(group).init(); } function uvOnSave(...uv) { uv[1] = Project.texture_height - uv[1] //Invert y axis if (!settings["meshy_normalized_mesh_uvs"].value) return uv uv[0] /= Project.texture_width uv[1] /= Project.texture_height return uv } //gets vertices of a Mesh and applys transformations to the points so that they can be exported function getVertices(mesh) { const verts = Object.entries(mesh.vertices).map( ( [key, point ]) => { //Generate a copy of the point so that it won't effect the original point let p = [...point] p.V3_add(mesh.origin) p = rotatePoint(p, mesh.origin, mesh.rotation) p[0] *= -1; return [ key, p ] }) return verts; } /** * Gets the vertex normal of a mesh * @param {Mesh} mesh The mesh to get the vertex normal from * @param {string} vertexKey The key of the vertex * @param {Map} vertexFacesMap The map of vertex faces * The vertexFacesMap is used to get the faces of the vertex * This so we don't have to loop through the faces for each vertex */ function getVertexNormal(mesh, vertexKey, vertexFacesMap) { if (settings["meshy_skip_mesh_normals"].value) return [ 0,1,0 ]; let normalSum = [0, 0, 0]; let faceCount = 0; const faces = vertexFacesMap.get(vertexKey) || [] for (let face of faces) { face = mesh.faces[face]; let faceNormal = face.getNormal(); normalSum[0] += faceNormal[0]; normalSum[1] += faceNormal[1]; normalSum[2] += faceNormal[2]; faceCount++; } let normalLength = Math.sqrt(normalSum[0] * normalSum[0] + normalSum[1] * normalSum[1] + normalSum[2] * normalSum[2]); if (normalLength === 0) { return [0, 1, 0]; // Default to up vector if normal is zero } return [ normalSum[0] / normalLength, normalSum[1] / normalLength, normalSum[2] / normalLength ]; } function rotatePoint(point, center, rotation) { // Convert rotation angles to radians const [rx, ry, rz] = rotation.map(Math.degToRad); // Translate point to origin let [x, y, z] = point.map((coord, i) => coord - center[i]); // Rotate around X-axis let temp = y; y = y * Math.cos(rx) - z * Math.sin(rx); z = temp * Math.sin(rx) + z * Math.cos(rx); // Rotate around Y-axis temp = x; x = x * Math.cos(ry) + z * Math.sin(ry); z = -temp * Math.sin(ry) + z * Math.cos(ry); // Rotate around Z-axis temp = x; x = x * Math.cos(rz) - y * Math.sin(rz); y = temp * Math.sin(rz) + y * Math.cos(rz); // Translate back return [ x + center[0], y + center[1], z + center[2] ]; } })(); ================================================ FILE: plugins/mimodel_format.js ================================================ /// (function() { var codec; Plugin.register('mimodel_format', { title: 'Mine-imator Model Exporter', icon: 'fas.fa-box-open', author: 'JannisX11', description: 'Export .mimodel files for Mine-imator and Modelbench', tags: ["Exporter"], version: '1.0.2', min_version: '3.7.0', variant: 'both', onload() { codec = new Codec('mimodel', { name: 'Export Mine-imator Mimodel', extension: 'mimodel', remember: false, compile(options = {}) { if (!Project.box_uv) { Blockbench.showMessageBox({ title: 'Mine-imator Model Exporter', message: 'Models need to use the UV mode "Box UV", otherwise the exporter won\'t work correctly.' }) } let entitymodel = { name: Project.geometry_name || Project.name || '', floor_box_uvs: true, } if (Texture.getDefault()) { entitymodel.texture = Texture.getDefault().name } entitymodel.texture_size = [Project.texture_width, Project.texture_height]; entitymodel.parts = []; function convertSpace(array) { array[0] *= -1; array[2] *= -1; return array; } let base_part; function exportArray(array, target) { array.forEach(item => { if (item instanceof Group) { let part = { name: item.name, position: item.origin.slice() } if (item.parent instanceof Group) { part.position.V3_subtract(item.parent.origin); } convertSpace(part.position); if (item.rotation.find(v => v)) { part.rotation = convertSpace(item.rotation.slice()); } if (!target.parts) target.parts = []; target.parts.push(part); exportArray(item.children, part); } else if (item instanceof Cube) { let shape = { type: 'block', from: convertSpace(item.from.slice().V3_subtract(item.origin)), to: convertSpace(item.to.slice().V3_subtract(item.origin)), inflate: item.inflate || undefined, uv: item.uv_offset.slice(), } let invert = false; for (let axis = 0; axis < 3; axis++) { if ((shape.from[axis] > shape.to[axis]) == (axis == 1)) { invert = !invert; } if (shape.from[axis] > shape.to[axis]) { let temp = shape.from[axis]; shape.from[axis] = shape.to[axis]; shape.to[axis] = temp; } } let size = item.size(); shape.uv[0] += size[2]; shape.uv[1] += size[2]; if (item.mirror_uv) shape.texture_mirror = true; if (invert) shape.invert = true; shape.position = item.origin.slice(); if (item.parent instanceof Group) { shape.position.V3_subtract(item.parent.origin); } convertSpace(shape.position); if (item.rotation.find(v => v)) { shape.rotation = convertSpace(item.rotation.slice()); } if (target == entitymodel) { if (!base_part) { base_part = { name: 'model_part', position: [0, 0, 0], shapes: [] } if (!entitymodel.parts) entitymodel.parts = []; entitymodel.parts.push(base_part); } base_part.shapes.push(shape); } else { if (!target.shapes) target.shapes = []; target.shapes.push(shape); } } }) } exportArray(Outliner.root, entitymodel); this.dispatchEvent('compile', {entitymodel, options}); if (options.raw) { return entitymodel } else { return autoStringify(entitymodel) } } }) codec.export_action = new Action('export_mimodel', { name: 'Export Mine-imator Mimodel', icon: 'fas.fa-box-open', category: 'file', click: function () { codec.export() } }) MenuBar.addAction(codec.export_action, 'file.export') }, onunload() { codec.export_action.delete(); codec.delete(); } }); })() ================================================ FILE: plugins/minecraft_block_wizard/about.md ================================================ This Block Wizard for Minecraft Bedrock Edition let's you add your own custom blocks to the game without any prior coding knowledge. Select from a list of presets, and customize basic properties of the block. Then you can use Blockbench's powerful editor to design your own model! The generated Add-On can be added to Minecraft, and you can use your block to build in your own world! > Developed by the creator of Blockbench, in collaboration with Mojang Studios! ================================================ FILE: plugins/minecraft_block_wizard/changelog.json ================================================ { "1.3.0": { "title": "1.3.0", "date": "2025-01-20", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added option to set suitable tool for mining block", "Added single-sided alpha test material" ] }, { "title": "Fixes", "list": [ "Fixed an issue where merging into a pack with comments in shared files would fail" ] } ] }, "1.4.0": { "title": "1.4.0", "date": "2025-02-15", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added Liquid Detection options", "Added option to merge into existing mcaddon file", "Added option to select game variant (normal, preview, education) inside the wizard" ] }, { "title": "Fixes", "list": [ "Added a format version to blocks.json, fixing a content log warning" ] } ] }, "1.5.0": { "title": "1.5.0", "date": "2025-10-09", "author": "JannisX11", "categories": [ { "title": "Changes", "list": [ "Added redstone conductivity option", "Added compatibility for Blockbench 5.0", "Added compatibility for new Minecraft install location" ] } ] }, "1.5.2": { "title": "1.5.2", "date": "2025-10-25", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed export issue in the web app", "Fixed issue with exporting to the new Minecraft install location" ] } ] }, "1.6.0": { "title": "1.6.0", "date": "2025-12-31", "author": "JannisX11", "categories": [ { "title": "Changes", "list": [ "Added new preset \"Leaves\"", "Added Fade to Opaque material option", "Added UV Lock option", "Added Random Offset option", "Add Destroy Tier option", "Update destroy tool export to improve integration", "Unlock several features to be available in Education Edition mode", "Updated Activate Add-On guide" ] }, { "title": "Fixes", "list": [ "Fixed missing namespace in inventory group ID, which is now required" ] } ] }, "1.6.1": { "title": "1.6.1", "date": "2026-01-02", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed an issue with loading the plugin in the web app", "Updated the documentation link" ] } ] }, "1.7.0": { "title": "1.7.0", "date": "2026-05-06", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added Stairs block preset", "Added Slab block preset", "Added Fence block preset", "Added warnings about functionality limitations in some presets" ] } ] } } ================================================ FILE: plugins/minecraft_block_wizard/minecraft_block_wizard.js ================================================ (()=>{var e={792:(e,t,o)=>{"use strict";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,'\n#block_wizard_wrapper {\n\t\tmin-height: 300px;\n\t\tposition: relative;\n\t\t--color-subtle_text: #91949C;\n}\n#block_wizard_wrapper > content {\n\t\tflex-grow: 1;\n}\n#block_wizard_navigation {\n\t\tflex: 40px 0 0;\n\t\tpadding: 8px;\n\t\tdisplay: flex;\n}\n#block_wizard_back_button {\n\t\tpadding: 5px;\n \theight: 32px;\n\t\tcursor: pointer;\n}\n#block_wizard_back_button:hover {\n\t\tcolor: var(--color-light);\n}\n#block_wizard_navigation .bar_spacer {\n\t\tflex-grow: 1;\n}\n#block_wizard_next_button {\n\t\tbackground-color: var(--color-accent);\n\t\tcolor: var(--color-light);\n\t\twidth: 112px;\n\t\tmargin-right: 4px;\n}\n#minecraft_block_wizard section {\n\t\tpadding-top: 8px;\n\t\tpadding-bottom: 8px;\n}\n#minecraft_block_wizard p.description {\n\t\tcolor: var(--color-subtle_text);\n\t\tline-height: normal;\n\t\tmargin: 0;\n\t\tmargin-bottom: 2px;\n}\n#minecraft_block_wizard input[type=text], #minecraft_block_wizard input[type=number] {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tbackground-color: var(--color-back);\n\t\tborder: 1px solid var(--color-border);\n\t\tpadding: 4px;\n\t\tpadding-right: 0;\n\t\tborder-radius: 5px;\n}\n#minecraft_block_wizard section.divided_section {\n\t\tdisplay: flex;\n\t\talign-items: center;\n}\n#minecraft_block_wizard section.divided_section > *:first-child {\n\t\twidth: 70px;\n\t\tflex-shrink: 0;\n\t\tflex-grow: 0;\n\t\tmargin-right: 10px;\n\t\ttext-align: center;\n}\n#minecraft_block_wizard section.subsection {\n\t\tmargin-left: 40px;\n\t\tpadding: 4px 0;\n}\n#minecraft_block_wizard .wizard_columns {\n\t\tdisplay: flex;\n\t\tgap: 24px;\n\t\tflex-wrap: wrap;\n}\n#minecraft_block_wizard .wizard_columns > div {\n\t\tmin-width: 300px;\n\t\tflex-shrink: 1;\n\t\tflex-grow: 1;\n\t\twidth: 0;\n}\n.block_wizard_target_selection {\n\t\tposition: absolute;\n\t\tbackground-color: var(--color-ui);\n\t\ttop: 0;\n\t\tright: 0;\n\t\tmin-width: 156px;\n}\n#block_wizard_id_error {\n\t\tposition: absolute;\n\t\tright: 28px;\n\t\tmargin-top: -28px;\n}\n#block_wizard_id_error:hover .block_wizard_tooltip {\n\t\tdisplay: block;\n \tvisibility: visible;\n\t\tmargin: 0;\n \tright: -5px;\n}\n#break_block_animation {\n\t\theight: 48px;\n\t\twidth: 48px;\n\t\tflex-shrink: 0;\n\t\tbackground-color: var(--color-button);\n\t\tbackground-position-y: -128px;\n\t\tbackground-size: 100%;\n\t\tbox-shadow: 1px 1px 2px #00000080;\n\t\ttransform: rotate(5deg);\n\t\tmargin-right: 5px;\n\t\tmargin-left: auto;\n}\n@keyframes break_block_animation {\n0%\t{background-position-y: 0;}\n9%\t{background-position-y: -48px;}\n18%\t{background-position-y: -96px;}\n27%\t{background-position-y: -144px;}\n36%\t{background-position-y: -192px;}\n45%\t{background-position-y: -240px;}\n54%\t{background-position-y: -288px;}\n63%\t{background-position-y: -336px;}\n70%\t{background-position-y: -384px;}\n80%\t{background-position-y: -432px;}\n90%\t{background-position-y: -480px;}\n99%\t{background-position-y: -528px;}\n}\n#block_friction_markers {\n\t\twidth: calc(100% - 50px);\n\t\tposition: relative;\n\t\theight: 20px;\n\t\tmargin-left: 50px;\n}\n#block_friction_markers > li {\n\t\tposition: absolute;\n\t\ttext-align: center;\n\t\tcolor: var(--color-subtle_text);\n\t\tmargin-left: -25px;\n}\n#block_friction_markers > li::before {\n\t\tcontent: "";\n\t\tdisplay: block;\n\t\tpointer-events: none;\n\t\theight: 12px;\n\t\twidth: 3px;\n\t\tposition: absolute;\n\t\ttop: -13px;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tmargin: auto;\n\t\tbackground-color: var(--color-grid);\n}\n#block_friction_markers > li:first-child {\n\t\tleft: 8px;\n\t\tmargin: 0;\n}\n#block_friction_markers > li:first-child::before {\n\t\tmargin-left: 0;\n}\n#block_friction_markers > li:nth-child(2) {\n\t\tleft: calc(44.5% + 1px);\n\t\twidth: 50px;\n}\n#block_friction_markers > li:last-child {\n\t\tright: 8px;\n}\n#block_friction_markers > li:last-child::before {\n \t\tmargin-right: 0;\n}\n#block_explosion_resistance_markers {\n\t\twidth: calc(100% - 60px);\n\t\tposition: relative;\n\t\theight: 20px;\n\t\tmargin-left: 60px;\n}\n#block_explosion_resistance_markers > li {\n\t\tposition: absolute;\n\t\ttext-align: center;\n\t\tcolor: var(--color-subtle_text);\n\t\tmargin-left: -25px;\n}\n#block_explosion_resistance_markers > li::before {\n\t\tcontent: "";\n\t\tdisplay: block;\n\t\tpointer-events: none;\n\t\theight: 12px;\n\t\twidth: 3px;\n\t\tposition: absolute;\n\t\ttop: -13px;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tmargin: auto;\n\t\tbackground-color: var(--color-grid);\n}\n#block_explosion_resistance_markers > li:first-child {\n\t\tleft: 8px;\n\t\tmargin: 0;\n}\n#block_explosion_resistance_markers > li:first-child::before {\n\t\tmargin-left: 0;\n}\n#block_explosion_resistance_markers > li[block=planks] {\n\t\tleft: calc(26% + 7px);\n\t\twidth: 44px;\n}\n#block_explosion_resistance_markers > li[block=stone] {\n\t\tleft: calc(33% + 16px);\n\t\twidth: 26px;\n}\n#block_explosion_resistance_markers > li:last-child {\n\t\tright: calc(7% + 5px);\n}\n#block_explosion_resistance_markers > li:last-child::before {\n \t\tmargin-right: 0;\n}\nul.block_wizard_preset_list {\n\t\tmax-height: 360px;\n\t\twidth: 100%;\n\t\toverflow-y: scroll;\n}\nul.block_wizard_preset_list > li {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tposition: relative;\n\t\tfloat: left;\n\t\twidth: 134px;\n\t\theight: 154px;\n\t\tmargin: 3px 2px;\n\t\tbackground-color: var(--color-back);\n\t\tborder-radius: 5px;\n\t\tcursor: pointer;\n\t\tbox-sizing: content-box;\n\t\tborder: 1px solid transparent;\n\t\tbackground-size: 90px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position-x: center;\n\t\tbackground-position-y: 18px;\n\t\timage-rendering: auto;\n}\nul.block_wizard_preset_list > li.grayed {\n\t\tpointer-events: none;\n\t\topacity: 0.6;\n}\nul.block_wizard_preset_list > li.grayed::before {\n\t\tcontent: "Not available yet for Education Edition";\n\t\tcolor: #ffc949;\n\t\tfont-size: 15px;\n\t\ttext-align: center;\n\t\tmargin-top: 49px;\n}\nul.block_wizard_preset_list > li:hover {\n\t\tbackground-color: var(--color-selected);\n\t\tcolor: var(--color-light);\n}\nul.block_wizard_preset_list > li.selected {\n\t\t border-color: var(--color-accent);\n}\nul.block_wizard_preset_list > li.selected::after {\n\t\tposition: absolute;\n\t\tcontent: "\\f00c";\n\t\tfont-family: \'Font Awesome 6 Free\';\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-accent);\n\t\tbackground-color: var(--color-ui);\n\t\theight: 19px;\n\t\ttop: -7px;\n\t\tright: -4px;\n\t\tborder-bottom-left-radius: 8px;\n\t\tpadding-left: 2px;\n}\nul.block_wizard_preset_list > li label {\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t\tmargin-top: auto;\n\t\tpointer-events: none;\n\t\tmargin-bottom: 4px;\n}\n.block_wizard_preset_note {\n\t\tmargin-top: 6px;\n\t\tmargin-left: 2px;\n\t\tcolor: #e2ca83;\n}\n#block_wizard_wrapper input[type="radio"] {\n\t\tvertical-align: middle;\n\t\tmargin-top: -4px;\n\t\tmargin-right: 6px;\n}\n#block_wizard_wrapper input[type="range"] {\n\t\tflex-grow: 1;\n\t\tz-index: 20;\n}\n#block_wizard_wrapper .bar.flex label {\n\t\tpadding: 3px 6px;\n\t\tmin-width: 50px;\n}\n#block_wizard_wrapper code.code {\n\t\tbackground-color: var(--color-back);\n\t\tborder: 1px solid var(--color-border);\n\t\tpadding: 1px;\n}\n#block_wizard_launch_vscode img {\n\t\tvertical-align: top;\n\t\tmargin-right: 4px;\n}\n\n',""]);const n=a},291:(e,t,o)=>{"use strict";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,"\n#block_wizard_export_options {\n\tdisplay: grid;\n\tgrid-template-columns: auto auto;\n\tgrid-gap: 10px;\n\tmin-height: 125px;\n}\n.block_wizard_export_option {\n\tdisplay: inline-block;\n\tborder: 1px solid;\n\tborder-bottom: 10px solid;\n\tpadding: 12px;\n\tbackground-color: var(--color-back);\n\tcursor: pointer;\n\tborder-radius: 5px;\n}\n.block_wizard_export_option:hover {\n\tbackground-color: var(--color-button);\n}\n.block_wizard_export_option:not(.selected) {\n\tborder-top-color: transparent !important;\n\tborder-left-color: transparent !important;\n\tborder-right-color: transparent !important;\n}\n.block_wizard_export_option > h3 {\n\tmargin: 0;\n}\n#block_wizard_pack_list li {\n\tdisplay: inline-block;\n\twidth: min(100%, 254px);\n\toverflow: hidden;\n\tpadding: 4px;\n\tcursor: pointer;\n\tborder-radius: 5px;\n}\n#block_wizard_pack_list li:hover {\n\tcolor: var(--color-light);\n}\n#block_wizard_pack_list li.selected {\n\tbackground-color: var(--color-accent);\n\tcolor: var(--color-accent_text);\n}\n#block_wizard_pack_list li img, #block_wizard_pack_list li div {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 32px;\n\tbackground-color: var(--color-back);\n\tvertical-align: middle;\n\tmargin-right: 2px;\n}\n#block_wizard_pack_list li > i {\n\tvertical-align: middle;\n\tpadding: 5px;\n\tmax-width: unset;\n}\n",""]);const n=a},686:(e,t,o)=>{"use strict";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,"\n.block_wizard_icon_picker {\n\t\tdisplay: flex;\n}\n.block_wizard_icon_picker label {\n\t\tpadding: 3px;\n}\n.block_wizard_icon_picker > .icon_picker_left {\n\t\tbackground-color: var(--color-back);\n\t\tmargin-right: 8px;\n\t\theight: 64px;\n\t\twidth: 64px;\n}\n.block_wizard_icon_picker > .icon_picker_right {\n\t\theight: 24px;\n \tcursor: pointer;\n}\n.block_wizard_icon_picker > .icon_picker_right label {\n \tcursor: inherit;\n}\n.block_wizard_icon_picker > .icon_picker_right:hover {\n\t\tcolor: var(--color-light);\n}\n.block_wizard_icon_picker > .icon_picker_right i.icon {\n\t\tvertical-align: text-bottom;\n}\n",""]);const n=a},558:(e,t,o)=>{"use strict";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,'\n#block_wizard_loot_list {\n\tmargin: 6px 0;\n\toverflow-y: auto;\n\tbackground: var(--color-back);\n\tmin-height: 20px;\n}\n#block_wizard_loot_list > li {\n\tmargin: 10px;\n\tpadding: 10px;\n\tbackground: var(--color-ui);\n\ttext-align: right;\n}\n#block_wizard_loot_list > li > p {\n\ttext-align: left;\n}\n#block_wizard_loot_item_list {\n\tmargin: 6px 0;\n}\n#block_wizard_loot_item_list > li {\n\tdisplay: flex;\n\tpadding: 3px 0;\n}\n#block_wizard_loot_item_list > li > bb-select {\n\twidth: 335px;\n}\n#block_wizard_loot_item_list > li > input[type="text"] {\n\twidth: 60%;\n}\n#block_wizard_loot_item_list > li > .tool {\n\tflex-shrink: 0;\n}\n#block_wizard_loot_item_list > li > label {\n\tpadding-left: 14px;\n\tpadding-right: 4px;\n\tmargin-left: auto;\n\tpadding-top: 2px;\n\twhite-space: nowrap;\n}\n#block_wizard_loot_item_list > li > input {\n\theight: 30px;\n}\n\n',""]);const n=a},314:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var o=e(t);return t[2]?"@media ".concat(t[2]," {").concat(o,"}"):o})).join("")},t.i=function(e,o,i){"string"==typeof e&&(e=[[null,e,""]]);var a={};if(i)for(var n=0;n{"use strict";var i,a=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),n=[];function r(e){for(var t=-1,o=0;o{"use strict";o.r(t);var i=o(72),a=o.n(i),n=o(792);a()(n.A,{insert:"head",singleton:!1}),n.A.locals},136:(e,t,o)=>{"use strict";o.r(t);var i=o(72),a=o.n(i),n=o(291);a()(n.A,{insert:"head",singleton:!1}),n.A.locals},361:(e,t,o)=>{"use strict";o.r(t);var i=o(72),a=o.n(i),n=o(686);a()(n.A,{insert:"head",singleton:!1}),n.A.locals},410:(e,t,o)=>{"use strict";o.r(t);var i=o(72),a=o.n(i),n=o(558);a()(n.A,{insert:"head",singleton:!1}),n.A.locals},359:(e,t,o)=>{"use strict";o.r(t),o.d(t,{exportPack:()=>k,getExistingPacks:()=>w,getFS:()=>v,openExportedFiles:()=>B});var i=o(908);function a(e,t){return e==t?void 0:e}const n={full:!0,none:!1,slab:{origin:[-8,0,-8],size:[16,8,16]},post:{origin:[-4,0,-4],size:[8,16,8]},small:{origin:[-4,0,-4],size:[8,8,8]},carpet:{origin:[-8,0,-8],size:[16,2,16]},fence:{origin:[-2,0,-2],size:[4,24,4]}},r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAC5SURBVDjLnVJBCoQwEJtvrtfehL2Kt54XX7DgXysRMsRQ7bKHUCfOxLFJbJ+t7d/9Z6CfmF5TC5C11pPg6QDvuAjocK9ZhddlTe6yAV/oV5XTGieQAijm95wvfBvl2ZsbcC2SOuCC2pcbgPgXp0AppQEoAK+V6yGe/MbwKCeBf7nzHQJus/eFDvjNU4A1L1L7wr1XqyigFnq4whOnzbyDXj7IBR8YJFqkAr1AsY6Rz6MsxJ2/moOnLBxZum3avyu6ywAAAABJRU5ErkJggg==",s=JSON.parse('{"w":[{"description":{"identifier":"geometry.log","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root","pivot":[0,0,0],"cubes":[{"origin":[-8,0,-8],"size":[16,16,16],"uv":{"north":{"uv":[0,32],"uv_size":[32,32]},"east":{"uv":[0,32],"uv_size":[32,32]},"south":{"uv":[0,32],"uv_size":[32,32]},"west":{"uv":[0,32],"uv_size":[32,32]},"up":{"uv":[0,0],"uv_size":[32,32]},"down":{"uv":[0,32],"uv_size":[32,-32]}}}]}]}]}'),c=JSON.parse('{"w":[{"description":{"identifier":"geometry.leaves","texture_width":16,"texture_height":16},"bones":[{"name":"root","pivot":[0,0,0],"cubes":[{"origin":[-8,0,-8],"size":[16,16,16],"uv":{"north":{"uv":[0,0],"uv_size":[16,16],"material_instance":"north"},"east":{"uv":[0,0],"uv_size":[16,16],"material_instance":"east"},"south":{"uv":[0,0],"uv_size":[16,16],"material_instance":"south"},"west":{"uv":[0,0],"uv_size":[16,16],"material_instance":"west"},"up":{"uv":[16,16],"uv_size":[-16,-16],"material_instance":"up"},"down":{"uv":[16,16],"uv_size":[-16,-16],"material_instance":"down"}}}]}]}]}'),l=JSON.parse('{"w":[{"description":{"identifier":"geometry.lectern","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"bone","pivot":[8,0,-8],"cubes":[{"origin":[-8,0,-8],"size":[16,2,16],"uv":{"north":{"uv":[0,32],"uv_size":[16,2]},"east":{"uv":[0,34],"uv_size":[16,2]},"south":{"uv":[0,36],"uv_size":[16,2]},"west":{"uv":[0,38],"uv_size":[16,2]},"up":{"uv":[0,0],"uv_size":[16,16]},"down":{"uv":[0,32],"uv_size":[16,-16]}}},{"origin":[-4,2,-4],"size":[8,13,8],"uv":{"north":{"uv":[16,26],"uv_size":[8,13]},"east":{"uv":[24,26],"uv_size":[8,13]},"south":{"uv":[16,39],"uv_size":[8,13]},"west":{"uv":[24,39],"uv_size":[8,13]}}},{"origin":[-7.9875,12,-5],"size":[15.975,4,13],"pivot":[0,8,0],"rotation":[22.5,0,0],"uv":{"north":{"uv":[32,0],"uv_size":[16,4]},"east":{"uv":[32,8],"uv_size":[13,4]},"south":{"uv":[32,4],"uv_size":[16,4]},"west":{"uv":[32,12],"uv_size":[13,4]},"up":{"uv":[16,0],"uv_size":[16,13]},"down":{"uv":[16,26],"uv_size":[16,-13]}}}]}]}]}'),d=JSON.parse('{"w":[{"description":{"identifier":"geometry.stairs","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"regular","pivot":[0,0,0],"cubes":[{"origin":[-8,0,-8],"size":[16,8,16],"uv":{"north":{"uv":[0,8],"uv_size":[16,8]},"east":{"uv":[0,8],"uv_size":[16,8]},"south":{"uv":[0,8],"uv_size":[16,8]},"west":{"uv":[0,8],"uv_size":[16,8]},"up":{"uv":[16,16],"uv_size":[-16,-16]},"down":{"uv":[16,16],"uv_size":[-16,-16]}}}]},{"name":"back_l","parent":"regular","pivot":[0,8,0],"cubes":[{"origin":[-8,8,0],"size":[8,8,8],"uv":{"north":{"uv":[0,0],"uv_size":[8,8]},"east":{"uv":[0,0],"uv_size":[8,8]},"south":{"uv":[8,0],"uv_size":[8,8]},"west":{"uv":[8,0],"uv_size":[8,8]},"up":{"uv":[16,16],"uv_size":[-8,-8]},"down":{"uv":[16,8],"uv_size":[-8,-8]}}}]},{"name":"back_r","parent":"regular","pivot":[8,8,0],"cubes":[{"origin":[0,8,0],"size":[8,8,8],"uv":{"north":{"uv":[8,0],"uv_size":[8,8]},"east":{"uv":[0,0],"uv_size":[8,8]},"south":{"uv":[0,0],"uv_size":[8,8]},"west":{"uv":[8,0],"uv_size":[8,8]},"up":{"uv":[8,16],"uv_size":[-8,-8]},"down":{"uv":[8,8],"uv_size":[-8,-8]}}}]},{"name":"front_r","parent":"regular","pivot":[8,8,-8],"cubes":[{"origin":[0,8,-8],"size":[8,8,8],"uv":{"north":{"uv":[8,0],"uv_size":[8,8]},"east":{"uv":[8,0],"uv_size":[8,8]},"south":{"uv":[0,0],"uv_size":[8,8]},"west":{"uv":[0,0],"uv_size":[8,8]},"up":{"uv":[8,8],"uv_size":[-8,-8]},"down":{"uv":[8,16],"uv_size":[-8,-8]}}}]},{"name":"front_l","parent":"regular","pivot":[0,8,-8],"cubes":[{"origin":[-8,8,-8],"size":[8,8,8],"uv":{"north":{"uv":[0,0],"uv_size":[8,8]},"east":{"uv":[8,0],"uv_size":[8,8]},"south":{"uv":[8,0],"uv_size":[8,8]},"west":{"uv":[0,0],"uv_size":[8,8]},"up":{"uv":[16,8],"uv_size":[-8,-8]},"down":{"uv":[16,16],"uv_size":[-8,-8]}}}]},{"name":"top_down","pivot":[0,0,0],"cubes":[{"origin":[-8,8,-8],"size":[16,8,16],"uv":{"north":{"uv":[0,0],"uv_size":[16,8]},"east":{"uv":[0,0],"uv_size":[16,8]},"south":{"uv":[0,0],"uv_size":[16,8]},"west":{"uv":[0,0],"uv_size":[16,8]},"up":{"uv":[16,16],"uv_size":[-16,-16]},"down":{"uv":[16,16],"uv_size":[-16,-16]}}}]},{"name":"top_back_l","parent":"top_down","pivot":[0,0,0],"cubes":[{"origin":[-8,0,0],"size":[8,8,8],"uv":{"north":{"uv":[0,8],"uv_size":[8,8]},"east":{"uv":[0,8],"uv_size":[8,8]},"south":{"uv":[8,8],"uv_size":[8,8]},"west":{"uv":[8,8],"uv_size":[8,8]},"up":{"uv":[16,16],"uv_size":[-8,-8]},"down":{"uv":[16,8],"uv_size":[-8,-8]}}}]},{"name":"top_back_r","parent":"top_down","pivot":[8,0,0],"cubes":[{"origin":[0,0,0],"size":[8,8,8],"uv":{"north":{"uv":[8,8],"uv_size":[8,8]},"east":{"uv":[0,8],"uv_size":[8,8]},"south":{"uv":[0,8],"uv_size":[8,8]},"west":{"uv":[8,8],"uv_size":[8,8]},"up":{"uv":[8,16],"uv_size":[-8,-8]},"down":{"uv":[8,8],"uv_size":[-8,-8]}}}]},{"name":"top_front_r","parent":"top_down","pivot":[8,0,-8],"cubes":[{"origin":[0,0,-8],"size":[8,8,8],"uv":{"north":{"uv":[8,8],"uv_size":[8,8]},"east":{"uv":[8,8],"uv_size":[8,8]},"south":{"uv":[0,8],"uv_size":[8,8]},"west":{"uv":[0,8],"uv_size":[8,8]},"up":{"uv":[8,8],"uv_size":[-8,-8]},"down":{"uv":[8,16],"uv_size":[-8,-8]}}}]},{"name":"top_front_l","parent":"top_down","pivot":[0,0,-8],"cubes":[{"origin":[-8,0,-8],"size":[8,8,8],"uv":{"north":{"uv":[0,8],"uv_size":[8,8]},"east":{"uv":[8,8],"uv_size":[8,8]},"south":{"uv":[8,8],"uv_size":[8,8]},"west":{"uv":[0,8],"uv_size":[8,8]},"up":{"uv":[16,8],"uv_size":[-8,-8]},"down":{"uv":[16,16],"uv_size":[-8,-8]}}}]}],"item_display_transforms":{"gui":{"rotation":[30,-135,0],"translation":[0,0,0],"scale":[0.625,0.625,0.625],"rotation_pivot":[0,0,0],"scale_pivot":[0,0,0],"fit_to_frame":false}}}]}'),A=JSON.parse('{"w":[{"description":{"identifier":"geometry.slab","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"bottom","pivot":[0,0,0],"cubes":[{"origin":[-8,0,-8],"size":[16,8,16],"uv":{"north":{"uv":[0,8],"uv_size":[16,8]},"east":{"uv":[0,8],"uv_size":[16,8]},"south":{"uv":[0,8],"uv_size":[16,8]},"west":{"uv":[0,8],"uv_size":[16,8]},"up":{"uv":[16,16],"uv_size":[-16,-16]},"down":{"uv":[16,16],"uv_size":[-16,-16]}}}]},{"name":"top","pivot":[0,8,0],"cubes":[{"origin":[-8,8,-8],"size":[16,8,16],"uv":{"north":{"uv":[0,0],"uv_size":[16,8]},"east":{"uv":[0,0],"uv_size":[16,8]},"south":{"uv":[0,0],"uv_size":[16,8]},"west":{"uv":[0,0],"uv_size":[16,8]},"up":{"uv":[16,16],"uv_size":[-16,-16]},"down":{"uv":[16,16],"uv_size":[-16,-16]}}}]}],"item_display_transforms":{"gui":{"rotation":[30,45,0],"translation":[0,0,0],"scale":[0.625,0.625,0.625],"rotation_pivot":[0,0,0],"scale_pivot":[0,0,0],"fit_to_frame":false}}}]}'),m=JSON.parse('{"w":[{"description":{"identifier":"geometry.fence","texture_width":16,"texture_height":16,"visible_bounds_width":3,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root","pivot":[8,0,-8]},{"name":"post","parent":"root","pivot":[8,0,-8],"cubes":[{"origin":[-2,0,-2],"size":[4,16,4],"uv":{"north":{"uv":[6,0],"uv_size":[4,16]},"east":{"uv":[6,0],"uv_size":[4,16]},"south":{"uv":[6,0],"uv_size":[4,16]},"west":{"uv":[6,0],"uv_size":[4,16]},"up":{"uv":[10,10],"uv_size":[-4,-4]},"down":{"uv":[10,10],"uv_size":[-4,-4]}}}]},{"name":"north","parent":"root","pivot":[0,0,0],"cubes":[{"origin":[-1,12,-8],"size":[2,3,9],"uv":{"north":{"uv":[7,1],"uv_size":[2,3]},"east":{"uv":[7,1],"uv_size":[9,3]},"south":{"uv":[7,7],"uv_size":[2,3]},"west":{"uv":[0,1],"uv_size":[9,3]},"up":{"uv":[9,9],"uv_size":[-2,-9]},"down":{"uv":[9,16],"uv_size":[-2,-9]}}},{"origin":[-1,6,-8],"size":[2,3,9],"uv":{"north":{"uv":[7,7],"uv_size":[2,3]},"east":{"uv":[7,7],"uv_size":[9,3]},"south":{"uv":[7,7],"uv_size":[2,3]},"west":{"uv":[0,7],"uv_size":[9,3]},"up":{"uv":[9,9],"uv_size":[-2,-9]},"down":{"uv":[9,16],"uv_size":[-2,-9]}}}]},{"name":"south","parent":"root","pivot":[0,0,0],"cubes":[{"origin":[-1,12,-1],"size":[2,3,9],"uv":{"north":{"uv":[7,1],"uv_size":[2,3]},"east":{"uv":[0,1],"uv_size":[9,3]},"south":{"uv":[7,1],"uv_size":[2,3]},"west":{"uv":[7,1],"uv_size":[9,3]},"up":{"uv":[9,16],"uv_size":[-2,-9]},"down":{"uv":[9,9],"uv_size":[-2,-9]}}},{"origin":[-1,6,-1],"size":[2,3,9],"uv":{"north":{"uv":[7,7],"uv_size":[2,3]},"east":{"uv":[0,7],"uv_size":[9,3]},"south":{"uv":[7,1],"uv_size":[2,3]},"west":{"uv":[7,7],"uv_size":[9,3]},"up":{"uv":[9,16],"uv_size":[-2,-9]},"down":{"uv":[9,9],"uv_size":[-2,-9]}}}]},{"name":"west","parent":"root","pivot":[0,0,0],"cubes":[{"origin":[0,12,-1],"size":[8,3,2],"uv":{"north":{"uv":[8,1],"uv_size":[8,3]},"east":{"uv":[7,1],"uv_size":[2,3]},"south":{"uv":[0,1],"uv_size":[8,3]},"west":{"uv":[7,1],"uv_size":[2,3]},"up":{"uv":[8,9],"uv_size":[-8,-2]},"down":{"uv":[8,9],"uv_size":[-8,-2]}}},{"origin":[0,6,-1],"size":[8,3,2],"uv":{"north":{"uv":[8,7],"uv_size":[8,3]},"east":{"uv":[7,7],"uv_size":[2,3]},"south":{"uv":[0,7],"uv_size":[8,3]},"west":{"uv":[7,7],"uv_size":[2,3]},"up":{"uv":[8,9],"uv_size":[-8,-2]},"down":{"uv":[8,9],"uv_size":[-8,-2]}}}]},{"name":"east","parent":"root","pivot":[0,0,0],"cubes":[{"origin":[-8,12,-1],"size":[9,3,2],"uv":{"north":{"uv":[0,1],"uv_size":[9,3]},"east":{"uv":[7,1],"uv_size":[2,3]},"south":{"uv":[7,1],"uv_size":[9,3]},"west":{"uv":[7,1],"uv_size":[2,3]},"up":{"uv":[16,9],"uv_size":[-9,-2]},"down":{"uv":[16,9],"uv_size":[-9,-2]}}},{"origin":[-8,6,-1],"size":[9,3,2],"uv":{"north":{"uv":[0,7],"uv_size":[9,3]},"east":{"uv":[7,7],"uv_size":[2,3]},"south":{"uv":[7,7],"uv_size":[9,3]},"west":{"uv":[7,7],"uv_size":[2,3]},"up":{"uv":[16,9],"uv_size":[-9,-2]},"down":{"uv":[16,9],"uv_size":[-9,-2]}}}]},{"name":"icon","pivot":[0,0,0],"rotation":[0,-90,0],"cubes":[{"origin":[4,0,-2],"size":[4,16,4],"uv":{"north":{"uv":[6,0],"uv_size":[4,16]},"east":{"uv":[6,0],"uv_size":[4,16]},"south":{"uv":[6,0],"uv_size":[4,16]},"west":{"uv":[6,0],"uv_size":[4,16]},"up":{"uv":[10,10],"uv_size":[-4,-4]},"down":{"uv":[10,10],"uv_size":[-4,-4]}}},{"origin":[-1,6,0],"size":[2,3,10],"pivot":[0,0,0],"rotation":[0,90,0],"uv":{"north":{"uv":[7,7],"uv_size":[2,3]},"east":{"uv":[0,7],"uv_size":[10,3]},"south":{"uv":[7,1],"uv_size":[2,3]},"west":{"uv":[0,7],"uv_size":[10,3]},"up":{"uv":[9,9],"uv_size":[-2,-9]},"down":{"uv":[9,9],"uv_size":[-2,-9]}}},{"origin":[-1,12,0],"size":[2,3,10],"pivot":[0,0,0],"rotation":[0,90,0],"uv":{"north":{"uv":[7,1],"uv_size":[2,3]},"east":{"uv":[0,1],"uv_size":[10,3]},"south":{"uv":[7,1],"uv_size":[2,3]},"west":{"uv":[0,1],"uv_size":[10,3]},"up":{"uv":[9,9],"uv_size":[-2,-9]},"down":{"uv":[9,9],"uv_size":[-2,-9]}}},{"origin":[-8,0,-2],"size":[4,16,4],"uv":{"north":{"uv":[6,0],"uv_size":[4,16]},"east":{"uv":[6,0],"uv_size":[4,16]},"south":{"uv":[6,0],"uv_size":[4,16]},"west":{"uv":[6,0],"uv_size":[4,16]},"up":{"uv":[10,10],"uv_size":[-4,-4]},"down":{"uv":[10,10],"uv_size":[-4,-4]}}},{"origin":[-17,12,-16],"size":[2,3,10],"pivot":[-16,0,0],"rotation":[0,-90,0],"uv":{"north":{"uv":[7,1],"uv_size":[2,3]},"east":{"uv":[0,1],"uv_size":[10,3]},"south":{"uv":[7,1],"uv_size":[2,3]},"west":{"uv":[0,1],"uv_size":[10,3]},"up":{"uv":[9,9],"uv_size":[-2,-9]},"down":{"uv":[9,9],"uv_size":[-2,-9]}}},{"origin":[-17,6,-16],"size":[2,3,10],"pivot":[-16,0,0],"rotation":[0,-90,0],"uv":{"north":{"uv":[7,7],"uv_size":[2,3]},"east":{"uv":[0,7],"uv_size":[10,3]},"south":{"uv":[7,7],"uv_size":[2,3]},"west":{"uv":[0,7],"uv_size":[10,3]},"up":{"uv":[9,9],"uv_size":[-2,-9]},"down":{"uv":[9,9],"uv_size":[-2,-9]}}}]}],"item_display_transforms":{"gui":{"rotation":[30,45,0],"translation":[0,0,0],"scale":[0.625,0.625,0.625],"rotation_pivot":[0,0,0],"scale_pivot":[0,0,0],"fit_to_frame":false}}}]}'),p={stone:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAnklEQVQ4y4VTQRIAMQTzXA9w7xM8uXti0jS6B8OYEiK1zNxoa60dETsiOnb3I4dmFWABPypz925Wbw1REImRp8Y9Aa5QnvM4bZlhZ0YrzzxhjTGiMl6pfGaeEzAKxuMVsDsjvNbrBqwBReC0Yp9R8aCKlejM3S8h8UossOOMarTX2LyuKYLUn2Apl7fpE03MY+6a4CWmiUj7U5/iBME+eeR3wyunqoUAAAAASUVORK5CYII=",bedrock:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAADASURBVDjLhZPbDcUgDEMzCyt0GAZgKMbtlZFcnVqp7kcUGsCPkNZa676u6xVzznvvfWvPa2XuO5cWOqjwJWbtK7s2xniBHAAXc+3LvuCwIgEW5VqyQHiQ8tNqmdFMecBrWyLZY4Hy+E1bXe0AENW+/tWsViD1xd6x0ZbBi+j51l/sjOqYqIZs+bznGTlE2W2CkpXTW+xwWkh7JFM8TaS0lEt17SDl7HMSeZj9oYriCHcT2Fl5Keh+pmyWQXIeVPsBQmH+agMUE5UAAAAASUVORK5CYII=",glass:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaSURBVDjLY7jw6uV/cvGKCzf/M4AYDQ0NDORgrAaQYmD1uu2oBpDqGhQDQM4h1QsYLiAVdx88S5kBA++C4WIAOfEPs5QsFyCrJ9sFKJkJRIAwyDQYTQyG6QMAiP/54kqEtt0AAAAASUVORK5CYII=",glowstone:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAD6SURBVDjLbZOxDUIxEENvFgokRmAAWkTBEHQUsAKI4ZjgT0FPEfCJF1kWkfJ//sW5s3359V6u43k/jtthM867VU99E9dUTPs9XsvEP07bUQoAFvCyX/cUgJiAWgub+EqgvmFDMsX1VswPNwM9vEpK0kENxUkCvhMAaoo/jeikosdghJTCIAdqrYk8Z8VhWJXTAuw6XQoegWsTtXCT3FRi2ocRSSg428gmSbwi3lBVey35Owpz0Oh9zv57+2BV3rI0LOPpR3vgfQVAdlUF6L4gV+siW15nb5VTd8+awaxml8hZIMeNcz/Kjfp3jVNi7hdasppT5acimRv5Achkgl/nEOAdAAAAAElFTkSuQmCC",log:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC7UlEQVRYhbWXz2saQRTHPzGK7o+EQbPYkK4VCUToLeRPaC/5D3rq39ZT/oMc2muhl1BoocVACanbYiSrDLpqREJ7WGcy65pD4/RdnHmzM+87732/b3Dr7enLPwCB8OhEktpOCYDBeEE7FNzKiZ6rNXP+7vzbFhtYEeDN6QkAr4DZYgpAbXeHwWgMgFNytd8puXrz2fnFJrEfAABcXXczC73fce5jR/j0ZIwjfPZFdePgAMXBeKFv12o2cJ1tprP73IezxTS9vajSk0MgLcPGAMy6Ajrt60yDWI5X9z4JgBo4wtdOOblLg8iEm+GUZ9U06P7BnvYLr7JxcFiWQB06Mw4VXgXhVdg/SOcmJxRYGyUomGnU6ZWJDqqysc5slKCggxslUGPT97+sAEudy0SrQWVAlQHgZrhcW0z1ug3LyNBsOL3fsc7ATCaaiE7JxRE+Tsm1K0Mz3YrtylYZrwhrTYZOyaUnYxDVjM7NtgvgOttAWo5W08WGFc2Dr6672X7AHTOZ4Ahf111xwZYVB+MF09k9rWZDOzMPkldJubH8bTUfNlvjgHrVzCf3sec4EB63cpJ7np9qhUB4DMYLjo/qtENBIDwufw54ffIcQM/boeD4qE4nkvpbG6YbUblc1rddNzct6tvrAwWAeDji09fuox/tVXcB+HDxy1pgDSCsp6wPhJcJ+KM70HNV63g40j61b2MAKqBpZqDDRk2Pj17UaIeCTiRzoDcCoA4NhEdY9zUgU2Zh3bciuxyAz5f9nLO2U+JWTmiHgvl8rm9qi/kZAGpgpl0FDOt+hvFKFTb0rwGo/wOQ1nudxEw52iKfBgBpaleJCHm9Kw4EwuPs/Xd7ABSI+XwOpDcOhMfHLw+9wWbzyQFQJVhnh42a5kQ8HFEul4G8dJ8MwNR51E90jc1amxxQDcoWETN9QFkgPKJ+wl51V5cFsre20YQACmYAU3Zh3Scejoj6SaYBdSJpVQmFVYeZidU6rzaix17Lf7G/81FcmwmVdRUAAAAASUVORK5CYII=",lectern:"data:image/png;base64,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",flower:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAADmSURBVDjLY2AYdOD169cMBx2UGWbv3fv/+/fv/6+9ePFffc1vsDhRIPD2XwaQJhAGGQAzhGgXwDR+3aX+/981SzAGiYFcRJQBMFtBGv+/8QcbBBMjygCQTSAbYS74OFeVNG+ELzFiQPc/CAcu1CY+FpzblOGGgFwEMpToWABpDp1vyODYLcMQNEvvv3gNC9gAyzox4gwAKQyYqcFgVMXHELpa9z+IHzjRkDQDQLaCbAcZALOdaAPAiQloI8gQkAFw9mQj4g0A2QYOC6ABIM1ExwDcBUANIENggUiyATAA0py/xRevGgAMdMhHZrrY8wAAAABJRU5ErkJggg==",leaves:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEALoAqQCd+yMi3AAAAAlwSFlzAAALEwAACxMBAJqcGAAAAZFJREFUOMt1k7GN6zAQRGeFnwtwBwupAEUu4CCAhSjwNmC4BsENUMHFDhUTMFzAj64AGezAgCrYC+4PwTPwlQgSdzhvZ0mxyRwA4meUdE8exiBxiQ4AdjK5nC8OAPtrx3AcYCcTAEj35I/0QDMcB8TPKAAQxiA2mX/9/ULeMuISfb7Oor2iPbTgk+7J8zPjI3xA+JNO83UuBHn7KSJV7U6dAEBcouctY3/tqNvJzwztFOttLZQ1RRiD/KFYe0XeMubrLABAcRhDEdpkPhwHsF0A+IVLMQMiEam4SXtoob3CTiZN3nIR22ReB8SA20NbMhqOQ6FN9+QNR2STOV20U3CMNpmXbP4FyfX8zGhqJ5vM19taFuMSnQR0jUv0MAbhd0Onus/1tuL9LACA9loy0U6hvaLhjBkmN3rvlSZ8hzGIdgp5T7yed30Wwhjkcr4402dN80gPaK8lh5qGLjzi+2svRDSQuERn0f9oOCHW0lQ7RVOL3+fPO8KLRHSKwxikyc/8K9m6kNj7ay8HqW4rLtG/AVfeVBt1j3SuAAAAAElFTkSuQmCC",stairs:r,slab:r,fence:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAADTSURBVDjLfVMxDgIxDPOD2JnvAUgszEi38AFmJnYWxIZ4wq3MfKzIlVwZExh8aZOoiZ0cntd9Wy67Rvu6z1/4578dpwYe9AhB5+O8GY9mXHfmEKgSZZUk5CO9A35O87qDZ90P21WHYjq7nxbiyArJM31OhTHePygoIOt6JFXlw/l5BQlaCem6ILmmBhnPHPicvUo1+9Sjd+Cjy3ZzhG6lESp1q9lnfHTgHKs98JjvhADNO7VQhWovPBe/djzbzTUX4In5H/geVPoMDZKb6+GaVPvxBn7ucsZoL/oUAAAAAElFTkSuQmCC"},g={leaves:[{geometry_part:{bone:"root",cube:0,face:"north"},condition:"same_culling_layer",direction:"north"},{geometry_part:{bone:"root",cube:0,face:"south"},direction:"south"},{geometry_part:{bone:"root",cube:0,face:"east"},condition:"same_culling_layer",direction:"east"},{geometry_part:{bone:"root",cube:0,face:"west"},direction:"west"},{geometry_part:{bone:"root",cube:0,face:"up"},condition:"same_culling_layer",direction:"up"},{geometry_part:{bone:"root",cube:0,face:"down"},direction:"down"}]},u={unit_cube:{description:{identifier:"geometry.unknown",texture_width:16,texture_height:16,visible_bounds_width:2,visible_bounds_height:2.5,visible_bounds_offset:[0,.75,0]},bones:[{name:"block",pivot:[0,0,0],cubes:[{origin:[-8,0,-8],size:[16,16,16],uv:{north:{uv:[0,0],uv_size:[16,16]},east:{uv:[0,0],uv_size:[16,16]},south:{uv:[0,0],uv_size:[16,16]},west:{uv:[0,0],uv_size:[16,16]},up:{uv:[16,16],uv_size:[-16,-16]},down:{uv:[16,16],uv_size:[-16,-16]}}}]}]},cross:{description:{identifier:"geometry.unknown",texture_width:16,texture_height:16,visible_bounds_width:3,visible_bounds_height:2.5,visible_bounds_offset:[0,.75,0]},bones:[{name:"block",pivot:[0,0,0],cubes:[{origin:[-8,0,0],size:[16,16,0],pivot:[0,0,0],rotation:[0,-135,0],uv:{north:{uv:[0,0],uv_size:[16,16]}}},{origin:[-8,0,0],size:[16,16,0],pivot:[0,0,0],rotation:[0,135,0],uv:{north:{uv:[0,0],uv_size:[16,16]}}}]}]},log:s.w[0],leaves:c.w[0],lectern:l.w[0],stairs:d.w[0],slab:A.w[0],fence:m.w[0]};var b=o(318);function h(e){let t="",i="";Blockbench.isNewerThan("4.99")?(t=SystemInfo.home_directory,i=SystemInfo.appdata_directory):(t=o(857).homedir(),i=electron.process.env.APPDATA);let a=null;switch(Blockbench.platform){case"win32":let o=v();"edu"==e?(a=PathModule.join(i,"Minecraft Education Edition"),o.existsSync(a)||(a=PathModule.join(i,"../local/","Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState"))):"preview"==e?(a=PathModule.join(i,"Minecraft Bedrock Preview/Users/Shared/"),o.existsSync(a)||(a=PathModule.join(i,"../local/","Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState"))):(a=PathModule.join(i,"Minecraft Bedrock/Users/Shared/"),o.existsSync(a)||(a=PathModule.join(i,"../local/","Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState")));break;case"linux":a=PathModule.join(t,".local/share/mcpelauncher");break;case"darwin":a=PathModule.join(t,"Library/Application Support/mcpelauncher");break;case"android":a=PathModule.join(t,"storage/shared/");break;default:return""}return PathModule.join(a,"games/com.mojang")}let f;function v(){if(isApp)return f||(Blockbench.isNewerThan("4.99")?(f=requireNativeModule("fs",{message:"Enable file system access so that the wizard can export a pack into your Minecraft folder"}),f):isApp?o(896):void 0)}function w(e){if(!isApp)return[];let t,o=[],i=[];try{t=h(e),o=v().readdirSync(PathModule.join(t,"development_resource_packs"),{withFileTypes:!0})}catch(e){return!1}let a={};o.forEach((e=>{if(e.isDirectory())try{let o=PathModule.join(t,"development_resource_packs",e.name),i=v().readFileSync(PathModule.join(o,"manifest.json"),{encoding:"utf-8"}),n=autoParseJSON(i,!1);n&&n.header&&(a[n.header.uuid]=o)}catch(e){console.error(e)}}));try{i=v().readdirSync(PathModule.join(t,"development_behavior_packs"),{withFileTypes:!0})}catch(e){return!1}let n=[];return i.forEach((e=>{if(e.isDirectory())try{let o=PathModule.join(t,"development_behavior_packs",e.name),i=v().readFileSync(PathModule.join(o,"manifest.json"),{encoding:"utf-8"}),r=autoParseJSON(i,!1);if(r&&r.dependencies&&r.dependencies[0]){let t=r.dependencies[0].uuid;a[t]&&n.push({name:e.name,bp_path:o,rp_path:a[t],has_icon:!0})}}catch(e){console.error(e)}})),n}async function k(e,t){let o=v(),r=isApp&&h(e.edition),s=e.identifier.replace(/^.+:/,""),c=guid(),l=guid(),d=b;if(e.pack_icon){let C=new CanvasFrame(16,16);await C.loadFromURL(e.pack_icon),d=C.canvas.toDataURL()}let A,m,f={authors:e.pack_authors?e.pack_authors.split(/,\s*/):void 0,generated_with:{blockbench_block_wizard:["1.7.0"]}},w=function(e,t){let o=[],r=i.A[e.preset],s="collision"==e.selection_box?n[e.collision]:n[e.selection_box],c="edu"==e.edition?"1.21.90":"1.21.100",l={identifier:e.identifier,menu_category:"hidden"==e.category?void 0:{category:e.category,group:"none"==e.item_group?void 0:`minecraft:${e.item_group}`}},d=[],A=e.material;e.fade_to_opaque&&"opaque"!=e.material&&(A+="_to_opaque");let m={"minecraft:collision_box":n[e.collision],"minecraft:selection_box":s,"minecraft:destructible_by_mining":!!e.mineable&&{seconds_to_destroy:Math.clamp(parseFloat(e.destroy_time),0,1e3)},"minecraft:destructible_by_explosion":!!e.explodable&&{explosion_resistance:Math.clamp(parseFloat(e.explosion_resistance),0,200)},"minecraft:friction":a(Math.clamp(parseFloat(e.friction),0,.9),.4),"minecraft:flammable":e.flammable?{destroy_chance_modifier:parseFloat(e.fire_destroy_chance),catch_chance_modifier:parseFloat(e.fire_catch_chance)}:void 0,"minecraft:geometry":`geometry.${t.block_filename}`,"minecraft:material_instances":{"*":{texture:t.block_filename,render_method:A,face_dimming:!!e.face_dimming&&void 0,ambient_occlusion:!!e.ambient_occlusion&&void 0,tint_method:"none"==e.tint_method?void 0:e.tint_method}},"minecraft:light_emission":a(parseInt(e.light_emission),0),"minecraft:light_dampening":a(parseInt(e.light_dampening),15),"minecraft:map_color":e.map_color.substring(0,7)};if("none"!=e.destroy_tool&&(m[`tag:minecraft:is_${e.destroy_tool}_item_destructible`]={}),"none"!=e.destroy_tier&&(m[`tag:minecraft:${e.destroy_tier}_tier_destructible`]={}),"shears"==e.destroy_tool&&m["minecraft:destructible_by_mining"]&&(m["minecraft:destructible_by_mining"].item_specific_speeds=[{item:"minecraft:shears",destroy_speed:0}]),"custom"==e.loot_type){m["minecraft:loot"]=`loot_tables/blocks/${t.block_filename}.json`;let i=function(e){return{pools:e.custom_loot.map((e=>{let t={rolls:e.rolls,entries:[]};return e.entries.forEach((e=>{let o;o="empty"==e.type?{type:"empty",weight:e.weight}:{type:"item",name:"custom"==e.type?e.custom_id:e.type,weight:e.weight,functions:[{function:"set_count",count:e.count_min==e.count_max?e.count_min:{min:e.count_min,max:e.count_max}}]},t.entries.push(o)})),t}))}}(e);o.push({name:`loot_tables/blocks/${t.block_filename}.json`,content:compileJSON(i)})}function p(){"string"==typeof m["minecraft:geometry"]&&(m["minecraft:geometry"]={identifier:m["minecraft:geometry"]})}if("facing"==e.rotation&&(l.traits={"minecraft:placement_direction":{enabled_states:["minecraft:facing_direction"]}},d=[{condition:"q.block_state('minecraft:facing_direction') == 'north'",components:{"minecraft:transformation":{rotation:[0,180,0]}}},{condition:"q.block_state('minecraft:facing_direction') == 'south'",components:{"minecraft:transformation":{rotation:[0,0,0]}}},{condition:"q.block_state('minecraft:facing_direction') == 'east'",components:{"minecraft:transformation":{rotation:[0,90,0]}}},{condition:"q.block_state('minecraft:facing_direction') == 'west'",components:{"minecraft:transformation":{rotation:[0,270,0]}}},{condition:"q.block_state('minecraft:facing_direction') == 'up'",components:{"minecraft:transformation":{rotation:[-90,0,0]}}},{condition:"q.block_state('minecraft:facing_direction') == 'down'",components:{"minecraft:transformation":{rotation:[90,0,0]}}}]),"cardinal"==e.rotation&&(l.traits={"minecraft:placement_direction":{enabled_states:["minecraft:cardinal_direction"]}},d=[{condition:"q.block_state('minecraft:cardinal_direction') == 'north'",components:{"minecraft:transformation":{rotation:[0,180,0]}}},{condition:"q.block_state('minecraft:cardinal_direction') == 'south'",components:{"minecraft:transformation":{rotation:[0,0,0]}}},{condition:"q.block_state('minecraft:cardinal_direction') == 'east'",components:{"minecraft:transformation":{rotation:[0,90,0]}}},{condition:"q.block_state('minecraft:cardinal_direction') == 'west'",components:{"minecraft:transformation":{rotation:[0,270,0]}}}]),"pillar"==e.rotation&&(l.traits={"minecraft:placement_direction":{enabled_states:["minecraft:facing_direction"]}},d=[{condition:"q.block_state('minecraft:facing_direction') == 'up' || q.block_state('minecraft:facing_direction') == 'down'",components:{"minecraft:transformation":{rotation:[0,0,0]}}},{condition:"q.block_state('minecraft:facing_direction') == 'east' || q.block_state('minecraft:facing_direction') == 'west'",components:{"minecraft:transformation":{rotation:[0,0,90]}}},{condition:"q.block_state('minecraft:facing_direction') == 'north' || q.block_state('minecraft:facing_direction') == 'south'",components:{"minecraft:transformation":{rotation:[90,0,0]}}}]),e.uv_lock&&(p(),m["minecraft:geometry"].uv_lock=!0),"leaves"==r.model_type){p();let t=e.identifier.split(":")[0];m["minecraft:geometry"].culling=t+":leaves",m["minecraft:geometry"].culling_layer="minecraft:culling_layer.leaves"}if(e.random_offset_range){let t=e.random_offset_range;m["minecraft:random_offset"]={x:{range:{min:-t,max:t},steps:2*t},z:{range:{min:-t,max:t},steps:2*t}}}if((e.can_contain_liquid||"blocking"!=e.on_liquid_touches)&&(m["minecraft:liquid_detection"]={detection_rules:[{liquid_type:"water",can_contain_liquid:!!e.can_contain_liquid||void 0,on_liquid_touches:e.on_liquid_touches}]}),e.redstone_conductor&&(m["minecraft:redstone_conductivity"]={redstone_conductor:!0}),"stairs"==e.preset){c="1.26.0",l.traits={"minecraft:placement_position":{enabled_states:["minecraft:vertical_half"]},"minecraft:placement_direction":{blocks_to_corner_with:[{tags:"q.any_tag('minecraft:cornerable_stairs')"}],enabled_states:["minecraft:corner_and_cardinal_direction"]},"minecraft:connection":{enabled_states:["minecraft:cardinal_connections"]}},m["tag:minecraft:cornerable_stairs"]={},m["minecraft:support"]={shape:"stair"},p();let e="q.block_state('minecraft:vertical_half')",t="q.block_state('minecraft:corner')";m["minecraft:geometry"].bone_visibility={regular:`${e} == 'bottom'`,back_l:`${e} == 'bottom' && (${t} != 'outer_right')`,back_r:`${e} == 'bottom' && (${t} != 'outer_left')`,front_r:`${e} == 'bottom' && ${t} == 'inner_right'`,front_l:`${e} == 'bottom' && ${t} == 'inner_left'`,top_down:`${e} == 'top'`,top_back_l:`${e} == 'top' && (${t} != 'outer_right')`,top_back_r:`${e} == 'top' && (${t} != 'outer_left')`,top_front_r:`${e} == 'top' && ${t} == 'inner_right'`,top_front_l:`${e} == 'top' && ${t} == 'inner_left'`};for(let e of d){if(!e.condition.includes("minecraft:cardinal_direction"))continue;let t=e.condition.match(/cardinal_direction'\) == '(\w+)'/)?.[1];t&&(e.components["minecraft:connection_rule"]={accepts_connections_from:"all",enabled_directions:[t]})}d.push({condition:`${t} == 'none' && ${e} == 'bottom'`,components:{"minecraft:collision_box":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[16,8,8]}]}},{condition:`${t} == 'inner_right' && ${e} == 'bottom'`,components:{"minecraft:collision_box":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[16,8,8]},{origin:[0,8,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_right' && ${e} == 'bottom'`,components:{"minecraft:collision_box":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[0,8,0],size:[8,8,8]}]}},{condition:`${t} == 'inner_left' && ${e} == 'bottom'`,components:{"minecraft:collision_box":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[16,8,8]},{origin:[-8,8,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_left' && ${e} == 'bottom'`,components:{"minecraft:collision_box":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[8,8,8]}]}},{condition:`${t} == 'none' && ${e} == 'top'`,components:{"minecraft:collision_box":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[16,8,8]}]}},{condition:`${t} == 'inner_right' && ${e} == 'top'`,components:{"minecraft:collision_box":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[16,8,8]},{origin:[0,0,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_right' && ${e} == 'top'`,components:{"minecraft:collision_box":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[0,0,0],size:[8,8,8]}]}},{condition:`${t} == 'inner_left' && ${e} == 'top'`,components:{"minecraft:collision_box":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[16,8,8]},{origin:[-8,0,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_left' && ${e} == 'top'`,components:{"minecraft:collision_box":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[8,8,8]}]}})}return"slab"==e.preset&&(l.traits={"minecraft:placement_position":{enabled_states:["minecraft:vertical_half"]}},p(),m["minecraft:geometry"].bone_visibility={top:"q.block_state('minecraft:vertical_half') == 'top'",bottom:"q.block_state('minecraft:vertical_half') == 'bottom'"},"slab"==e.collision&&(delete m["minecraft:collision_box"],delete m["minecraft:selection_box"],d.push({condition:"q.block_state('minecraft:vertical_half') == 'bottom'",components:{"minecraft:collision_box":{origin:[-8,0,-8],size:[16,8,16]},"minecraft:selection_box":{origin:[-8,0,-8],size:[16,8,16]}}},{condition:"q.block_state('minecraft:vertical_half') == 'top'",components:{"minecraft:collision_box":{origin:[-8,8,-8],size:[16,8,16]},"minecraft:selection_box":{origin:[-8,8,-8],size:[16,8,16]}}}))),"fence"==e.preset&&(l.traits={"minecraft:connection":{enabled_states:["minecraft:cardinal_connections"]}},m["minecraft:support"]={shape:"fence"},m["tag:minecraft:has_fence_connections"]={},m["minecraft:connection_rule"]={accepts_connections_from:"only_fences"},p(),m["minecraft:geometry"].bone_visibility={north:"q.block_state('minecraft:connection_north')",south:"q.block_state('minecraft:connection_south')",east:"q.block_state('minecraft:connection_east')",west:"q.block_state('minecraft:connection_west')",icon:"false"},m["minecraft:item_visual"]={geometry:{identifier:m["minecraft:geometry"].identifier,bone_visibility:{north:"false",south:"false",east:"false",west:"false",post:"false",icon:"true"}},material_instances:m["minecraft:material_instances"]},"fence"==e.collision&&(delete m["minecraft:collision_box"],delete m["minecraft:selection_box"],d.push({condition:"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":{origin:[-2,0,-2],size:[4,24,4]},"minecraft:selection_box":{origin:[-2,0,-2],size:[4,16,4]}}},{condition:"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":{origin:[-8,0,-2],size:[16,24,4]},"minecraft:selection_box":{origin:[-8,0,-2],size:[16,16,4]}}},{condition:"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":{origin:[-2,0,-8],size:[4,24,16]},"minecraft:selection_box":{origin:[-2,0,-8],size:[4,16,16]}}},{condition:"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-8],size:[4,24,16]},{origin:[-8,0,-2],size:[16,24,4]}],"minecraft:selection_box":!0}},{condition:"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":{origin:[-2,0,-8],size:[4,24,10]},"minecraft:selection_box":{origin:[-2,0,-8],size:[4,16,10]}}},{condition:"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":{origin:[-2,0,-2],size:[4,24,10]},"minecraft:selection_box":{origin:[-2,0,-2],size:[4,16,10]}}},{condition:"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":{origin:[-2,0,-2],size:[10,24,4]},"minecraft:selection_box":{origin:[-2,0,-2],size:[10,16,4]}}},{condition:"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":{origin:[-8,0,-2],size:[10,24,4]},"minecraft:selection_box":{origin:[-8,0,-2],size:[10,16,4]}}},{condition:"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-8],size:[4,24,10]},{origin:[-8,0,-2],size:[10,24,4]}],"minecraft:selection_box":{origin:[-8,0,-8],size:[10,16,10]}}},{condition:"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-2],size:[4,24,10]},{origin:[-2,0,-2],size:[10,24,4]}],"minecraft:selection_box":{origin:[-2,0,-2],size:[10,16,10]}}},{condition:"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-8],size:[4,24,10]},{origin:[-2,0,-2],size:[10,24,4]}],"minecraft:selection_box":{origin:[-2,0,-8],size:[10,16,10]}}},{condition:"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-2],size:[4,24,10]},{origin:[-8,0,-2],size:[10,24,4]}],"minecraft:selection_box":{origin:[-8,0,-2],size:[10,16,10]}}},{condition:"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-2],size:[4,24,10]},{origin:[-8,0,-2],size:[16,24,4]}],"minecraft:selection_box":{origin:[-8,0,-2],size:[16,16,10]}}},{condition:"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-8],size:[4,24,10]},{origin:[-8,0,-2],size:[16,24,4]}],"minecraft:selection_box":{origin:[-8,0,-8],size:[16,16,10]}}},{condition:"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-8,0,-2],size:[10,24,4]},{origin:[-2,0,-8],size:[4,24,16]}],"minecraft:selection_box":{origin:[-8,0,-8],size:[10,16,16]}}},{condition:"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')",components:{"minecraft:collision_box":[{origin:[-2,0,-2],size:[10,24,4]},{origin:[-2,0,-8],size:[4,24,16]}],"minecraft:selection_box":{origin:[-2,0,-8],size:[10,16,16]}}}))),o.push({name:`blocks/${t.block_filename}.block.json`,content:compileJSON({format_version:c,"minecraft:block":{description:l,components:m,permutations:d.length?d:void 0}})}),o.push({name:"manifest.json",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+" Behavior Pack",uuid:t.bp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:"Behavior",version:[1,0,0],uuid:guid(),type:"data"}],dependencies:[{uuid:t.rp_uuid,version:[1,0,0]}]})}),o.push({name:"pack_icon.png",setup_file:!0,type:"image",content:t.pack_icon}),o}(e,{block_filename:s,rp_uuid:c,bp_uuid:l,pack_icon:d,pack_metadata:f}),k=await async function(e,t){let o,a=[],n=i.A[e.preset],r=u[n.model_type],s=p[e.preset];e.use_current_model&&Project&&(r=Codecs.bedrock.compile({raw:!0})["minecraft:geometry"][0],Project.model_identifier=t.block_filename,Texture.all.length&&(s="data:image/png;base64,"+Texture.getDefault().getBase64())),window.BlockWizardProject.project&&(o=ModelProject.all.find((e=>e.uuid==window.BlockWizardProject.project))),o&&(r=Codecs.bedrock.compile({raw:!0})["minecraft:geometry"][0],Texture.all[0]&&(s="data:image/png;base64,"+Texture.getDefault().getBase64())),r.description.identifier=`geometry.${t.block_filename}`;let c={format_version:r.item_display_transforms?"1.21.110":"1.19.0","minecraft:geometry":[r]};if(window.BlockWizardProject.model=c,a.push({name:`models/blocks/${t.block_filename}.geo.json`,model_file:!0,content:compileJSON(c)}),"leaves"==i.A[e.preset].model_type){let t={format_version:"1.21.80","minecraft:block_culling_rules":{description:{identifier:e.identifier.split(":")[0]+":leaves"},rules:g.leaves}};a.push({name:"block_culling/leaves.block_culling_rules.json",content:compileJSON(t)})}window.BlockWizardProject.texture=s;let l=`textures/blocks/${t.block_filename}`;a.push({name:l+".png",type:"image",texture_file:!0,content:s}),a.push({name:"textures/terrain_texture.json",merge:!0,content:compileJSON({resource_pack_name:"vanilla",texture_name:"atlas.terrain",padding:8,num_mip_levels:4,texture_data:{[t.block_filename]:{textures:l}}})}),Texture.getDefault()?.frameCount>1&&a.push({name:"textures/flipbook_textures.json",merge:!0,content:compileJSON([{flipbook_texture:l,atlas_tile:t.block_filename,ticks_per_frame:2}])});let d={sound:e.sound};a.push({name:"blocks.json",merge:!0,content:compileJSON({format_version:"1.21.0",[e.identifier]:d})});let A=[`tile.${e.identifier}.name=${e.display_name}`];return a.push({name:"texts/en_US.lang",merge:!0,content:A.join("\n")}),a.push({name:"manifest.json",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+" Resource Pack",uuid:t.rp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:e.pack_name,type:"resources",uuid:guid(),version:[1,0,0]}],dependencies:[{uuid:t.bp_uuid,version:[1,0,0]}]})}),a.push({name:"pack_icon.png",setup_file:!0,type:"image",content:t.pack_icon}),a}(e,{block_filename:s,rp_uuid:c,bp_uuid:l,pack_icon:d,pack_metadata:f});if(console.log("Export",{bp_files:w,rp_files:k}),"folder"==e.export_mode){A=PathModule.join(r,"development_behavior_packs",e.pack_name);try{o.readdirSync(A)}catch(B){o.mkdirSync(A)}m=PathModule.join(r,"development_resource_packs",e.pack_name);try{o.readdirSync(m)}catch(I){o.mkdirSync(m)}}else if("integrate"==e.export_mode){function z(e){try{let t=o.readFileSync(e,{encoding:"utf-8"}),i=autoParseJSON(t,!1);i&&(i.metadata||(i.metadata={}),i.metadata.generated_with||(i.metadata.generated_with={}),i.metadata.generated_with.blockbench_block_wizard instanceof Array==0&&(i.metadata.generated_with.blockbench_block_wizard=[]),i.metadata.generated_with.blockbench_block_wizard.safePush("1.7.0"),o.writeFileSync(e,compileJSON(i),{encoding:"utf-8"}))}catch(e){console.error("Unable to add generator to existing pack manifests",e)}}A=e.integrate_pack.bp_path,m=e.integrate_pack.rp_path,z(PathModule.join(A,"manifest.json")),z(PathModule.join(m,"manifest.json"))}if("folder"==e.export_mode||"integrate"==e.export_mode){function E(t,i){if(t.setup_file&&"integrate"==e.export_mode)return;let a=PathModule.join(i,t.name);if(function(e,t){try{v().readdirSync(e)}catch(t){v().mkdirSync(e,{recursive:!0})}}(PathModule.dirname(a)),"integrate"==e.export_mode&&t.merge&&o.existsSync(a)){let e=o.readFileSync(a,"utf-8");if(a.endsWith("json"))try{e=autoParseJSON(e);let o=JSON.parse(t.content);$.extend(!0,o,e),t.content=compileJSON(o)}catch(e){}else a.endsWith("png")||(t.content=e+"\n"+t.content)}Blockbench.writeFile(a,{savetype:t.type,content:t.content}),e.use_current_model&&t.model_file&&Project&&(Project.export_path=a)}w.forEach((e=>{E(e,A)})),k.forEach((e=>{E(e,m)}))}if("mcaddon"==e.export_mode||"integrate_mcaddon"==e.export_mode){let y,x="integrate_mcaddon"==e.export_mode,S=e.pack_name;if(y=x&&window.BlockWizardProject.previous_mcaddon?window.BlockWizardProject.previous_mcaddon:new JSZip,x){let N=!1;y.forEach(((e,t)=>{if(N)return;let o=e.split("/");o.length>=2&&(S=o[0].replace(/\s*(BP|Behavior|RP|Resources?)$/i,""),N=!0)}))}async function M(e,t){if(e.setup_file&&x)return;let o=t+e.name;if(x&&e.merge&&y.file(o)){let t=await y.file(o).async("string");if(o.endsWith("json"))try{t=autoParseJSON(t);let o=JSON.parse(e.content);$.extend(!0,o,t),e.content=compileJSON(o)}catch(e){}else o.endsWith("png")||(e.content=t+"\n"+e.content)}e.setup_file&&x||("image"==e.type&&(e.content=e.content.split(",")[1]),y.file(o,e.content,{base64:"image"==e.type||void 0,binary:"buffer"==e.type||void 0}))}for(let Q of w)await M(Q,S+" Behavior/");for(let W of k)await M(W,S+" Resources/");let D=await y.generateAsync({type:"blob"});isApp?Blockbench.export({type:"Minecraft Add-on",extensions:["mcaddon"],name:S,content:D,savetype:"zip"}):Blockbench.showMessageBox({title:"Export Add-on",commands:{download:"Download File"},buttons:["dialog.cancel"]},(e=>{"download"==e&&Blockbench.export({type:"Minecraft Add-on",extensions:["mcaddon"],name:S,content:D,savetype:"zip"})}))}return{rp_path:m,bp_path:A}}function C(e){if("slab"==e.preset){for(let e of Group.all)"top"==e.name&&(e.visibility=!1,e.children.forEach((e=>{e.visibility=!1,e.preview_controller.updateVisibility(e)})));Cube.all.forEach((e=>{e.autouv=2}))}if("fence"==e.preset)for(let e of Group.all)"icon"==e.name&&(e.visibility=!1,e.children.forEach((e=>{e.visibility=!1,e.preview_controller.updateVisibility(e)})));if("stairs"==e.preset)for(let e of Group.all)(e.name.startsWith("front")||e.name.startsWith("top"))&&(e.visibility=!1,e.children.forEach((e=>{e.visibility=!1,e.preview_controller.updateVisibility?.(e)})))}function B(e,t){let o=e.identifier.replace(/^.+:/,"");if(!e.export_mode.includes("mcaddon")&&isApp)Blockbench.read([PathModule.join(t,"models","blocks",`${o}.geo.json`)],{},(t=>{loadModelFile(t[0]),"unit_cube"==i.A[e.preset].model_type&&Cube.all.forEach((e=>{e.autouv=2})),C(e),Dialog.open.close()}));else{let t={no_file:!0,content:JSON.stringify(window.BlockWizardProject.model),path:o+".geo.json"};try{loadModelFile(t),Dialog.open.close()}catch(e){}setTimeout((()=>{new Texture({name:o}).fromDataURL(window.BlockWizardProject.texture).add(!1),window.BlockWizardProject.project=Project.uuid,Cube.all.forEach((e=>{e.autouv=2})),C(e)}),100)}}},908:(e,t,o)=>{"use strict";o.d(t,{A:()=>i});const i={stone:{name:"Stone",sound:"stone",model_type:"unit_cube",thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAeMXpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjarZtnlhw5doX/YxVaArxZDuw52oGWr+8iomz3cKZ1RDa7qpKZEYhnrnkAzf6f/z7mv/hVYo0mplJzy9nyK7bYfOebap9fz1dn4/3/t5fuzz9eN59/4Xkp8DU8P+b9vr/zevr6QInv6+Pn66bM9zr1vZD7vPD9FXRnfb/eFb0XCv553b0/m/Z+oOdvj/P+8fO97Hvx3z/HQjBW4nrBG7+DC/b+3z93CvrjQ+dr5v8uON7o7isp1PtK/Wv8zGfo/iaAn9/9ip/9WFn4CsdzoY/Hyr/i9L7u0q/Xw+dt/I8VOf95Z/99RT66ab//+ha/c1Y9Zz9P12M2hCu/D/XxKPc73jgIZ7gfy/wu/El8X+7vxu9qu51kbfGow9jBD815In5cdMt1d9y+X6ebLDH67QtfvZ8+3NdqKL75GZSCqN/u+GJCC4tc+DDJXOBl/7kWd+/bdD9uVrnzcrzTOy7mbma//Ta/X/i//v5xoXMUW+ds/YwV6/KqL5ahzOn/vIuEuPPGNN34OvN8sb9/KbGBDKYb5soDdjueS4zkvmor3DwHmwxvjfbpF1fWewFCxL0Ti6Guo7PZheSys8X74hxxrOSns3Ifoh9kwCWT/GKVPoaQSU71ujefKe6+1yf/vAy8kIhE0xRS00InWTGmmKPAqMVuUkgxpZRTSTW11HPIMaecc8nCqV5CiSWVXEqppZVeQ4011VxLrbXV3nwLwFgyLbfSamutd27aY+danfd3Xhh+hBFHGnmUUUcbfVI+M8408yyzzjb78issIMCsvMqqq62+3aaUdtxp51123W33Q62dcOJJJ59y6mmnf2btzerPrP3O3J+z5t6s+Zsova98ZY2XS/m4hBOcJOWMjNG7ZLwoAxS0V85sdTF6ZU45s80HE0LyrDIpOcspY2QwbufTcZ+5+8rcv8ybIbr/NG/+7zJnlLr/j8wZpe5b5v6at7/J2uoXbsNNkLqQmIKQgfbjDbt2X7t46T/+umuI+diyWb4ZMdm0ePadUo1jjLPInh85EOZDXCz1lj1PxOvTrp5TL22xKh/OiKHkxaL3gbIHH5lnLZ4mTK4XrZtjV7ftWDzTPCPcP23YNko5nUdPw9VZD/flfRBU2qamHoq6+AB/Ecpyu6zD5QcxOeI5rv+szbllN2uzmftEmwnraLVkmj9OE8dJuVjXQq7cfnNHGJ3k90FNEVvuXXMPee3Mp8IIu2QyVlw7o8fSbScbK5qz3dH7xk5kzp291iDhhzoZucRZ0n3kw+PsQd1sVMQ6VFQOy/c+R+ZJqXcT16Y0eWLWUQgVMmewnMD1h4PXJyjkRjmByqE+Qhkiiaqg+rBsgpt6OzOYTU5Wmf0M6oDFqIKPHS7P3erui4flfb3aUE+/qUdw/M1X86/+4s9fifhyMFjodRO1GJcZhby6Vm5e81/zuhIR3+gqN+IJYa+9Tp5LjTBDLE/txLzNV+30XMcmxXQoOAEAhEmn/eEW634gD09VRFN9sWPndGK4VR18zG/heLIQaIQGXXMZrmBpt6Hq6iyUDt2OHMa6FpU91Te15TO5T6tnlveNdsH8o3oWvBuNHhaYEokCKDXs1rvSXrXXBVZU0p9jCiNRjECdrunjCpufC6R0vAUqFhevizsnynb5kXIYKAIqkyuezgPEOcwYsXaQLOfT0jnjADBlI1ZcWy6OWtaijHwY21MLoTR/5ho1a0Ug+KQtpqJvHNhq90aazLRAHuBOzRAr6g1IdHvbTMrBi9jmqIi+6hbBpn7bvK05pEiD8b7rhbkkUjvgWUbshAPgL+felx701OkMYzUlO5fu3K5+zBNSPjWPTsmb0ijoBtYcEJpG23Sw6noCSKe0QZUEHrr0FJFXRCmGqe6kuFY6mzAMwnCCmQkw2a6P3YhuX5a+pP9LQ0zNPU9brdxlkLvPdQTxzkldYc0WUFxUtlpd6Pir11WiLCAmSfv/4Kt5v0nEhWS1lcHNuSlOaCMcRHwLVMeYK7IuKmQTY0olQRSsxBLmvsj+MTACzYM8rKsWOnETHYrPKTiOpQMugfoCRE8KqwSeVn98nj6vdTZaJGUCanzY/AJUQCTgbte1bR1csegjvgvlwY/7GUdpAyvPR+h8RxVRrTcH5k1CbDvqbbTTjgGgmuV9Zgp6kURlxp64W/LcMfdNpQkQ8j6NhhjGRfAyRSqSDsltNklpR0YqvQNj8Tc0VpQuBBp5RhTJit01L/VBd69N++fMo3XlkyXNnezxVDGUvKAE3w7aHiShLzL3OjT76pIClr+wCjyEk6EIGnzRtBkxXAcCdZWrByrAk4QFvAspkm3gwyzJp1QKcJbnmQI7wmojuMgqd4hm5zqRH8DRLVGoWM9ZoNM+J1/pO5pz2iMXx5UnDR/9uvmMDQFihYUpGjLPUwz+InYFl5b0jUUGX1ixzXMk8l/WAGInVIjYISzzR9PV/A95rcHA1FVVMrlub7u2XihcPmueW+0jGfRFolCyOHRb9RWYBA6+jVUOSEDts4Ds6fYA+al4TXiq1x11TZJr/vqaaGXaOYyyKLcIzqO2EvXegPmz5kA7It7AdjQkWkoZX/+UQiaPJQqhByjIdkxG7BQQhDsQhwaB3A+0pwNKjCOAfGqJHsXYPJaKAZyldCulGxGd0VtD1fu2Z6wbgUiBdHugoAN5iF7iFMaSGooEcKfIUZe8l07DigJbGy0xXEJE9JpQcOorVgmFdBKSKKSADnsoB/hcVXKcgg/DX7pKs/WIpO6Y1G0XLWgK6imc7W/p+Nj4BhtbI9CgiFmVIDKsHQRn7UTBWyAZ0V2IkyXDPGJKPppvjHf5DnIE/TtRqnZuifRcMeUkeqP/sL+TXsAkVOJA7XFRWgKlZGaftXnKBJmDxKFIe4BgpYkouZVKkzSsLlOnLZbCxbkOoecOKPpJq5aYGvK4Y6FroK2pQaACyViqUEwxhA22OjFCggPCogz64j6uiK6A0Erp02G5V+MwIyxqVjQJy/T4jATlfYYOU4SCQTuWAhxQPkE4VtJIpHhXpAYgg10wKpwrA5qrOwJ8Z0modOcveixWvWR+A75/KSP0XE5A6e5QJmFu8dIodHR8pZgGrsmX3nc4mCdKGhPVJCxTtvA4HxxUS+wz7uCGQu1bp6opBEp9ZUNkVmvoS624qW2G+B180mokqmlpGCc4KpqaR0BQlcgd7psHinUu52AHo2WReFXRkeMucfMEkfV2ocIFIFIl/cDdIOKDDZxcC8l6MJPEyo897b2QOB97gX/CT9A6fRA5pDtkxLJqnTGS19x7QocUmzpsQPuhCDRewZOkWUy/UJUXDY0U2ZvVnZyGz5ANhhZaG6tICArcWEtZGkyNhMf0qUz4CAuZTnseDWMBJ/XVDoBwKAbAmb8IWDPrpLFXcjmnhx7wd6Jxgo71zFXfQlxmwEZKTu6eoFIvAy0dsSnYXxJK/SQeyS1pajhUHES69p4ATb4do8Fj6gYts8gY7UFID2IJpQ/DA5vQdM/bA+M8UBShkiSprkMpVNoJhppUD8y0lzf+g3Qwd5hl6A0A5F3nJ00BFweNjMwaDYPcNFcJGixmdCSkQNMCj3Zmq5LoqLtYR+/B40hAuADyZwlLSgymQOZu0RoKkcIYmJ5BMBdUuSaCXfBphXMRU4kZQKQ+H82h8ZnZ0URUDFAluI8z4tt8GVtqkMqWPsUlGfQkHNOPMLI3cTAYweVAABy5agnI6dy1hoKtBs5RjoHWpew6GmPOBqfCtCiU1jLCGvgoKC9UpKUpQ5hjwXFSTk4KeeCQA94LnEcTUU61drQ8XULA6w7GUsEV5tncVjnCn6DI3aP4LeYEGDvUAs0YETG7bc15EUmFG2riGwdsPLc5DisTBrcEaYFOHMSSWKLHG7ER0MtYLJ4ughOwLdq1JfQXCmJ2tT6ezQ+s6LliPGy+9p4Jgmw9FyhDoBgILf47gxZVOodKa3L6fKV/hdNYVVy0IRJuID2ELPTMVXxu+GEJIXgtLTCK09CA5i2E9nundpRK4V1KPw2tVp41qZLGtjzTPphfOqNPOS/kpljZEgAQxu98uN79iDufH6nm+ZBLDehT9DQOT0g+ck0ENMEPuDiXA6Q+9Mn72LiOrMkN6hhliyDIeJGLSJdVM0hDBcn3/T0ODP4D5uBPe5yAnda8F97VWDUfEtojt0hZQxQtIBy8GFkDSyC1o+o08RiwzBoXkyFSJB7OLsL9dN4kRtSAlZXGnGBjiCmgypVyT3D7hgcgl4vnFH458C9NzPv90KCk0yHQN/kDIelfnkRmByEBxnewauYFLfWdEE0yoTxrwqqnduFlRhYHyXqknPBt4gsNucZ+OCGDHBn2pXhwBm6dNCb6EPsQ4dIcdkauFIhyqiKhxQjwSGgIrb1xlEfGUVK1iGzYUpxNXSpOyI/Cd3Lj8rnJBnLHOpy0Bl4RyQZEUGr7OLPhPrDUxwgk+Ur24dmIvUIBFKoTZry9t2E46pBv93uT24cO58K96f5DK7AWfAA9rcZGxqeSPF23RaRp4JCrRB4XLSNHgJNGAMDUzrxVhgnsNpOCxbuGIj8Oo1k4DQTFmKNRQH6Zh9iBKZLH1St5o7KXEAvrMgBHAJjWMliZCBsgltAOGXDcFhkwG707oVeaE/e9x8VMbrwRuTcmL2aAzqQX3Y2DvF5h5wno0zkTEiQGtDbd2lqDJWGfSDcAEvE2rFQ5yNGlAJ7A8y4DTMJUxwFFmoJA3urE/nTi24i0N6IHg5axXlf7NPkKDYWra3r4ZM2s8Spkej0hFqHDht4kALAj3yaEKZKhgejg4nRyw7NNKAiXiBobfHU+nmRYGIVz+VoYdp7pw7n92yGo47g+5KdXx21tygONIZ+aEeMYhYDqBiHvaE1veNp73/ZGTHtpQoyn/VQH+lIruJla1XwhCDQH8sj7AYzwgSiBpTbb1ypqc2xqY07CzluEOQ1O5TsNf5bHN8vaA+ljUh1xJhKD7y9DvZ21U4O+15CGiPgh5EUyoxgruqlpG5O+hdJ4JVX4Coc0tQPpJOV6NKI3yj33MlghZWvVMuDW0I3lFAEmn66H1qfAxoY+RXkNJK0kPqoBP2EkHIAs8BCmRL5SsajdRoXDCY8WXqDG2BV802QJpUfLYCwFntQaeXRodkM7oQxx7FgAR8IpXt6G7l1QNdINbb0FRfzCg0ofsz4Yi4fS+JlGHiCxSxi/ZRtZ0Nx9IYHlfbWToLtLC6GehNO0yMgHmwBNCl6lXh20CZbBcMEeg41KSKI7UxlqqREPpYIySkkzMOIkOQFxSv6r0cqUN5R499yysGBgJxs8oC1AvGb9fL8LtQx1AbJVKga1M7K2ASzSKGl3wl55IFzWqiGSqEEldUQrLjU5AjjQZwmEwwGkIDON8sBOAjJPS6lL0Fb7gwPBv4lIyo44GWDVB5z3fO4CiZxedokSFOh8hUYuFkJNPE5L1BglhBUTPALPgCYpsahaoCn2dxxyrl6M6kmoAF0LzVqsGXaTUuCy2EQURL2iSYRI/KAvZz3S7+QwvnjWjz5wNfQYoEYTxtuF4mchm5e5erwuj5G0sWXvT9EalLqs6rG3ccFmqFzfiaWfRpZe18gf+9T21oA+49RDhQll4runyug1vNQiXSjEqHA6zYIiEc/+GrZEmWPSHT4C4o9FJpBc1BvQXvEL2rpFLRvkMhHCHr/UfLWnl6dN0fZnqzpz5Y7wrneih286GLsMyKLCE6zTiB2eFo//xBjXVqq6NeOn6DKU6KxkayMX0ceYLzk5uhw0ddp6jw9ikzliBFq/RYyMINaDVBIGcpKkYEUHGjmR5wJ9gj+oZL8GNgr8zoA8YBIQBMYiZNEAMxc+XdbDeyr6BKiAFFTtWiM79SJSpEi3sWBEAR2q2SRGOmh/TRbTAesPoAPE2lkK2vNFkCTJwgKpAN9YEIsTx1U2YHzEiqtQRLRth242yGQUXdFzRjyshVGwz953aBORHi7ZaCKn+RFoomHj0PRgr675GB0yeWMylmRtRFBdV1Hj1MA/TSbeCU+yEtQC6gTASJsWxLwb5bYMYRDHaVojA79lgrorgCjk0T0YlYhf0zAFS4H2eFhwA7lzgaNAeY8aqEQHavHejoXgVb802oWe7t4CwTsHyjhY6zTnUgP//d9cd4twooqPwUkO6tc1W8qjTwELnMJf7e8Pfjukzep9GsosgmVweegYKANNVzWBrug9nvu1wqS2R+mkLHDX3sRAcVBbQ34MPqMYnMbOhrYmmKJH3DhioeA/wUAYAOTsH1OtDp0BPk68d3UfPYAwous0H+7zVJNAKYqRWLsi2UNha30oESgLR5qaB5jhQ5GNtiqAxFCSEweQcalnOcZloM4P59M15xhe5rgTMallcJfmFHT4UlG+1COr7pGWRC85TVlBZ5AcGEGRjXMH4heVvZWFpmZnKUvWkO6FgMEs5N6daqAG6B5ufecF9kUgw3tEqQOO0L6R4yPFtoi1V3qTHU3WAS5dmqFe4gfKiTUALJpxmtDC8Tpbc2UUDYR9zw3jk6iDTjsCGZ4ah/qfXccQUa0gQlhUMSXbdkYCsTZ0Ay0CHUh9WKiHy6DrcKvkI3D5CVihppvmRVcFaEDl3B0KxkT8EbvRkU7ckpGQu+hUr/2sy8vh9+2z14sS2He7jMvRXLAzpjJUD+NcnCII4jisaK64LwpAtMSF0AV+oAk1kPnwYuoHJEREic+ECr4yELl5zlWB6apAeK0iHXupFSZvXL2uW4Qd/gCgLr/AtW2jnmTJQtBY5Whqx31VVKEgyofZuF/EBfZWO2yHVmbhkBbhDWh/ngxpLPo46vZw+4YCc2Ir9FvckY61NZnbrndqrEuTyiB5tDCS81o7EGcgSPqh7JUeQJcHIHasyU5Z062t8WbmFW4Qp0QUtTnK4xAG4ExWgkwfCBeQHUscnGnotoTxWxukiwYAtIo1N8bgFG84u0OW9Kv1+zINJYIvzFfIjnE7Ai0LzIoWnMdKUWVV01f0EX3BD0c01+/AO1tVH99rnyeLYhyST8PL8m57UO7AwMRQpgklCwemNdgisbvDwg+8IHIFHa5ugGMOgQUeA0KHTHRYw9k7n9ABMJVY8jSR6PXQIlJRdH7SOSiwuV3pjCq90++FFmP9dUP4hKzjvJxkoe3a629FBodEBf8MNN3dP4I3pwN4ZA8l0yCCWMVjHQV13MRdaw9BZwCR1E37PxXsXNp/SclQZZY8p+gwIDBa1IkQNTLLhufbBr/QXN+UGK2qYxea5KSsIXqQtTdteNUErcezVzwe2BjyubOtGB/v9XDwvTNpwt4X6Ld8uagNFSMiMiLQpkadYByJrCaOWw/7OSK5AuwZknwTYHdQMiZKhDZrBsVtsazhg4rupKTFxcWnb4N+oVwVj/5pSGCjJG6BhCqaQE0UIUiZj0afBLR3EQnrEKAm09oEp6hAMi4NtkDFUImk9MX3o2SEux24KuY4PJPauZA3DrJB+2sKAKnIAU5g2EnJXA+BifW9Coa1pTfVteIabZlFQ51BWyDZiN0tq4LVAAjVQrpEPx6MJsxZZrgPSIXCqeMhlEbWEClqU+PmF/oDil4xBOfA4+60z6V9Y0cBH3hUU4EIM2VIFfmfyO5QegDCqf01EPVD7+tkn2a1OKxA7zZkZ1VnRXe02cDN+DQ2QcpWpaTdwXCQ7d5csU94KRFs944Le2sJD3Wc9cDfJFdirXvnax5uIRTekfkN0zlDk4fAw4TitH2jnnVCgSG88BSJgient5b2d1gsVKJelf/9eESWbEQosWmsJcFb4u3sqbOMNJ06Fdy9eyOIzJ5U+dFrphuKakKTUPmxEowQGKzWZAeLIqtsCWl56jtR/Pyd2rtQQIi+/KqoyyzpKq22MTXOFAVfk3Rxw7UnuJPw5+a4uwlTZ9XCNfHUqWyWrQXgoRJdrL/HA6yKh6oXUjU2IjIESIIY4HM+WQwksIRueM8ee+0YwTLgqc5ASf7IAsEP4AfKkYfXanD0XlOqiLf1gSRoPxNhmCUiqE8N1I52oADqRJnoJMniNe3ORDhnUJshV+0pO60KR2EDZUlk7dy3FZ2ZIDNKzuNGB/dydwNrfKkq/yGYeJY5+x3qH+wSHuoR87np4IQ3UmMYn1SLpqHIUGqDd/rbHf6rBW4H5H4XhaNpBe2omSumYWr/TqcPHcbC6fjMPTAGf0YYgGp2z4ER/JaH3GhNrGNAPoGk9sO6FBhUImhAkIBzAUJrwN/ctkP4kzDUfMBJUEIXnrtm+4CpgGVpZtqDjr0N7fZaytZ0F/kkLsGriHt9dvzrPcUZ+Lt77qHdffJoAVKo4kDZfu+5Z3psJ/iFOQ50kcYlwiMnDXl3SGagjJMMS4esuHjszYI2glmJF6Aa7iOvBFf6d3MhHXA4yMRr2dFklxnST99ODcm5f/Ptvwdo3/bX8sWxpW0e+WNsuHN3p2tDNEF7CIMuBNkRR5swacDU0LhZBwujSe+Zw4SiaBgkUrASwrLiTbAWeAIdEQA7NH46NLDI5laQBFjV3g2rx/iteMHbZzHx0alNfYMMtmEQs+2x4rPdY093r5WP8zPJ00RTCwZ1tm3daMOrfa//Z87PtRQ3L6YBtcnh1JH2QD/reOr1EOHTQxAnoy1xbVnirygedL0OpmCWrgALTrNosEuje3g4AljPvwRIgIJzVF99fEs29m4DCB8iriAi2HqgBdwzUhdR9AxZpFHTDuTH87iS7rjpHW+xDbDHTqNNlHYHwTzo3Tt12v+DvKc2uW6f3y05d0XzpJDnIxJ1zp2sNB0EwmZFiR1tAHpQJd9g8OxRc4qGAMTIhcdISALY58wDQPC9HDHWMZuXCIQxklSai4GOTZ3c71wZhbAwIKlPbFZDH1JR6Barfpa3qUmH1p4N3yV8wSGglXRIE7DGYpwuXkAZLNV9+YbaKu8mbehVdjrExg1ER8ReEw0naOD5kMV/OUuJVEE+O7+2jnhFeWPNH8DxsjfPPhDs2jocNp6L9NT6fX+j8N7365xFeN4/xZH37RCgg8+h1qetOnYdjQxGyx9gl/59T321FDpzaCSuje7uTT1Br0prAJj2HhXGat3NV1E4vvxt4vClZtAAqdyNTXlvSR9ratP4SGpvzDgfQNSx5qZ51D3RFHBfOpcDKnlNqMbaVFKQfg6aCuWZXKhGx85VcICjuxtmd8a+etTYPT+to71cqKXTFbvIzR9I9lHTqeSlrYssfcTKKZh7igVlv/BHaWgm49ZaWCLq78V66GBKbHMHUqPtEXhbRy5AB8OCNkBL6Sw1PVolazuCZwsgB5R8u6TqrBAGQmWDGrfuObMisMzaLPYEG9Op/deosdDSfsLW8BRZi4KVI+gfTqZulIeQbE6sO7K9tqL9RUo87kBBLgoVn4ZmIF24siHBeE9BHu1W+uaOjig6ZCB9lfriYmfEiepDLWISunbJjCwgbEkQN+1QtOHA0wTJzokoqWVtneXnmk4dCmmyUCKKClmEP2s5xHaDR7KcOkcJ0oapjbBAASBHGxfAgwE49y3lz2crza8XeAA0Wq3yCtCdzi9u6GmWp16t9mAQOdqbUkths+PTUgCbzmRQANQamnYd7Y2En/U95rwH6XVE/9v8qWoYAKPo4M0xajXMmw4e02KEb1G2H8edWckIip8/16Bys0YxA/eUCS4XHNOstR+fzDyffa2Dil89BkSjBKO8uwp+Z9AKUk1a6+fIDACcXd5zGyQ39Z5q5e3hmb83HDu0j2Ofp4DRPfXnGCENMry2j2jYcHd4ZOBFxj6YKPqyQLhm+tSpx/QM23TMWIJwY0P1jyLaHahS1qfL6CFltHfr7tFLr2Gp+TYthWI01tXE6XXhCw+CeL6t4OUI6Gun8zEY/pSHfQqFcFKQVIrgPgjHpw40bnAb0gTNboEH/euKqPItS6QN8pPaNfC6qu/4Ud/mKfAj2oeF1vYN/waSygNCQbRr2MfK+WPmwI22i0QTrc0fHdHP2v61xeSL95qHJE089Kby6025CFL0b0n+8M81zD/6dx336z07PSPQTg+QOoqZOBkfnmrWoD7car6+PY+h0xQIXBpEk52gfTZhu/61BXH9TSgmfAi1jeTU8edCwujROYK/fqS0e/g1xKHRPwoWDTiSzq+jUim8jZatY5pNscBdPT/r1f3Ls94/NJ8O8aJS71xF/1BlOx3Px2vjd7ByOrNXLs0P1iO8ySFdvBHPa53Fn0v0yNLfLG++aH6BeQjoBUvCjnTOalxd5eo15abuy1gFte5kVDNuQdWGYsoqEvOzSv59BeiA0w/18IoH81M9/JN/pIE0QXib/wWOJa2fJr+s5gAAAYVpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU7VSKw52EHHIUHWxICriKFUsgoXSVmjVweTSD6FJQ5Li4ii4Fhz8WKw6uDjr6uAqCIIfII5OToouUuL/kkKLGA+O+/Hu3uPuHSDUy0w1O8YBVbOMVDwmZnMrYuAVXehBEKMQJGbqifRCBp7j6x4+vt5FeZb3uT9Hr5I3GeATiWeZbljE68TTm5bOeZ84zEqSQnxOPGbQBYkfuS67/Ma56LDAM8NGJjVHHCYWi20stzErGSrxFHFEUTXKF7IuK5y3OKvlKmvek78wlNeW01ynOYQ4FpFAEiJkVLGBMixEadVIMZGi/ZiHf9DxJ8klk2sDjBzzqECF5PjB/+B3t2ZhcsJNCsWAzhfb/hgGArtAo2bb38e23TgB/M/AldbyV+rAzCfptZYWOQL6toGL65Ym7wGXO8DAky4ZkiP5aQqFAvB+Rt+UA/pvgeCq21tzH6cPQIa6WroBDg6BkSJlr3m8u7u9t3/PNPv7ATlacpAZ5WSGAAAABmJLR0QAmACvAL+Rz2PuAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5gYLCjoSjw8KeQAAD21JREFUeNrtXT1vU0sQXT+hKLGTKFIUJZILBE1Ey/+hpSeiR/QIelo6GhokpEiIMhVNmgSKRJFwILKiWMG+Rm541aBlsztzZnfutWMzzePF98v3nJ2Ps7Prlltge/bs2W/69/Pnz1uL+A5aiw58aItGhIX6sq9evfoL+MFg4BadCK1FBD60RSZCa9HBT5FgNBr99f8vXrxo/SPAHAIfWq/XS37W6XTmziPM1Zd5+vTpDdC73W4SXP8zjgydTmduQ0NrnkZ7avQOh0O3urqaPF8iwjznCK15AD41cofD4Y3P/hFhDgjgu/oYaATUxcWFigAcGTjwNzY2/vz7yZMnrX8EaDDG+wlayi4uLmDgNdf1gQ/tthDhVjxkqNyFJRoHmA9SmCP4ISIkCAf8PBGhddvAR0ggxfNerxfND4gIGvAREswyEWaWAL6714xqDRG+fPmS/Gx7ezvruUMihLnDrCWLrVkb7dzIlkY1Fxa4EVoHESSbFSK0ZgV4zsVzHoAjQ8yV++eGo9OvGjjgQ5KiISNG7mlLzK1ZA94y7nKlW65pElDNudMiQus2Aj/rRJDIMEtEaPRmvnJXByhaInBhppQAOUTwj20qR2g1DXwTo1Mig5QwWgCvve60ksXaCUDuPgYIl6yhI1Cr1BHhYkCWJHN1gN8EEVp1Ax8DJTUCS0afRISUpxmNRtkAleQBs0IEcwJwAg738kJlTlOG1fHSNaVeblk4C0RoWY32XFBiM3ZkkixbBxG4aw6Hw9qEoWkRoVUKfC4onAeIzdxx56JumJNpuRwlNm/gE0FzXf8zS8+RS4Ssk8jN547OlJHUG8sRCIScaV1JCpaMk4p3d3fV1xsMBln5A5L4aonQygHeSvQIgY+NQG7WLjf7ziVDKRFiiShChNQxFkSADvJdvaUOTudKgIQvHvUC0rNZEcF/Hq5DqSSPyc13JCK0NOBrXFFO/Y7M2OWGgLpIkHqebrcrilxaUEuS3hQRWALs7e39Xltby86ic5OaXBVPCi+cC+ZGrlZQsgiP3ACJvQPuPp8/f3bv37/PIwD9WyJCHSVZCRG43gEuCeNGriQo1UWE1Hvo9Xoi8GTFBMghgkbcsSKCpnegZE6gDlEotxkmJKUPvDkBUCJwAk+KCJIsy4EpxdumiVBiuUT4+PFj8rMUAe5wD8KtqPn58ydLBAI5RgT6Gx3jf+FYklgCPBfPOeDJe9F/UeEntxKK/S2WT8W+Bwe8ZHekAyQBRiICnZeq56WXpXF9SKXBJW90r1i9T2sLYs/D5QY+WJaziIPBIOrqQ5tMJvk6wOPHj3/nCDBra2vJL8vp6aUxMEcwGY1GyWuXlnq5yZtkCPAh+Pv7+1Gs/9PeHBnJ379/T37GEajT6SRfTK/XS7rsEpmXA2J3d5dV+DhlkHsmaXIslT8dHBzA4JuFgBQJxuOx29raSh5zfX3tnHNufX1d5aJTMTCM2zRq/REYnoeOMq7e9+8Vk6bDfCY3XwlB9697cHAAjfalpaVmCEDW7/edc04kwng8jrr98OVpiECjL3YuUnNz+UEKSClHKPVGoZ2cnLiTk5OiGO+cY4mhzgHIxuPxX/+/srLyx8WHo8Q/dnt7OxlGJJ0gp7SU8ouS+YLcySHJE3CgE5jkYZeXlyGgs8rAFIgENhceUscQiOGLX11dFWXkVGnpn5sSglKtaFK4SIWHwWAQfR7KccJQFXumkAifPn26AWoqtE41BxiPx66qKtdut0XCpIhALz5HFIrpB0j5yPUboETQPg9ChHfv3onv/NevX7WITkU5QFVVzjknEmFlZeVGyOCSRTR50ySLPojceSWTWdrn+fDhgwnwUvLH5Ql3LFhUVZWrqsptbm4mjyFPIBFhPB67+/fvq0Yo8uJT53FdykhuEPMMXBNHr9dzx8fHYvJGoHIEiFVY2gQR1gFWVlbY2O+cc5eXl9B1kOw3NSqlmbPUqB2NRjfOJRC73e4NF43OSYS5Qew+ZMfHx+74+Jj97uvr6+KIXl9fNwE/ywMQgOT+YyTgQgLiDYgEVVW5e/fuqeO1VA0Mh8Nolh7TFpCqgKTgFPCHh4cQqJIhx6DAF4eAu3fvOuecOzs7yw4diDc4PT11zjmICFJLd6yEixGBc+9hVRATouhZDg8PofhtQQ4t8BABpEweJQJXFqJ2enrq2u22uqeAQOl0OlEdgSMCZ1xugSh3iGo3mUxMXD13L8gDIABKREB1BCk8+Oph+PKlkMBNUXPKIico+V4IAR6x3NGcQzKTKiAkAolBJZ6Fks5UYkkghhUDshAjNkVNf0PmKUISSIldk8Br5wOyCSBtv4okeiQoceUjfZYiAlUMDx8+ZJO2WKlHS884PYArO5GZOdTVNzXiVQTgBBx/BElEWF1d/TNxxJWPCBFSz3N0dPTn3w8ePBBVQB9YrgNHuledwOcAGjOuKhN1AKT+R3oEuBlDax2BA6jb7bLundMSjo6ORPCRrP76+toEfKncRo6BQ4DU2uWP8BRIRAIuR0DzAym8EFAxb8CVebkjHpmPRyZyNjY2khoLCiqRC5maVucASI+fBsTUl0WugcxFlBABBR45RtL0EbBQ4BtJAtHyUcoRpCQPJYKUTGqIgABfVZX4whFALIAncnHTyLUJQYghnUNSkofoCD6JUmTgiIACb+EVLIAfDAaiZ5Ge947VSEbiMhGBIxSRhKsauHug5PWJgAg4g8GgaNrVOUzSRYFHqhCErKoQgJZ9KEhI1cARQQof9Bwc4aRRb7GNHVIZIPbjxw/RzTciBCFlH0oECSArImgNGT0WWoDUWUXAS4Z6F7UOUGqIjoB4C0RH4JJADfAS+NfX12JJh8R4hGR1gm9aBcS6gTUewf97KsT4REpdR0omU/kBAgZax1skiWicLw0t6q5gbjQjGgFSUWhyjZIQRJ9J4KN9eaV1Ogq6pak9gBURmrKSEhYRcFBAOPAR4HNq/FpDADKBo/EIpVWDpSEuemdnxyRRnBbwEAGQDJyIwLlrq9Bg5Vk40nHg7+zsqGJ3yjtYuXFk/kEiM+QB/Aw8RQa/E4i6g+oC0Ho+4urqShztCBhNTe+imr9pW7hPBqkk6/f7opKHuHzuGkQEab8C9F4pwCTwEeCnAX7tOkBqlGsAHI/HIoASmaTwo9EatIBZgzENy94jyCcB1xHc7/ddVVUsYRCXLk0o+c+Zug4yoYQAb1WuUdlYN5GKuoKRmpwaQTkplkhSNxHoOogErS0TJeCtunisPJRpV7C0nbtfEnIv/+zsTHwJdH1pZlHyLBpdgzOp3LMCnq7DeQTNvcxnA9HQgJSPVoZ4lhKtgXuJmjyBI4DVaM7xLv8hYk+uWVQMqCHXQSamUPcrAdJut8XYjkw8offKDS2iB0AUP8mQ6Vq/WSRnR3C08kh5BAKLe9lWoxBpLrG6l4kQZGU+iZD1BiWGNIwSEbi9h1BDgS+9jtV9inUANGGUXn7JMYjrq6qq9nkGC1CQ72INfpEHkMoxq1VDSALXbrfFVUzasg/JpC1KOovFHTnAQwTQxu5cb4BUDRLAKFlog8vYcyFz+ggY1MXDzeSh5LFoEOWaVCAPYNFqhVYNFjmAtLI4FJ1Qnd6id89qI0mkxq9lZRAqrpQ0jFjNGiLCVEnFYTUKNaBaiFImBLCIudLLb2L+vwQMqzkBC+CRNYXmHkDTd1ciwCDSMDLRgzyDplOXi/Elnbpa4EuIahICkBdrQQSkKxgJQbEKBRGC6m7Rjgk4qeexqgxgHaCksSK8TsnOYhrSIXrFcDgU1TJ0HYA1+CUVBLqncC1dwUhoQCZxLLahKQWiiWXdlrqBdjPpOyUjuQkiNLkeER2B5OqtlDuLdjFkpbCaAFbNl4jQgxLBOtvXgm/l5q0qiJKfy4M9ADVfIku2ESJILWT+sdPKD0KzWgeAVBAS8H4ymrrO8vKyvRCErt0v3VSS7iFdp4kVSEhLuNUiTySxk2K8diFJVg5AWnppzEV6CTU6gSURmlrdi7h5NLEz3yJGSsCski90fX+pxIxcx0qrn0wmLHBo4mf9EzFZOoD0Qq1i7ubmJrSXgES4nHUCGxsbJuAjC0WsEkmLdYNwCLBIzrT1PQJg6jqaCsYKeKR0bAJ0zfdR5wDIRk9IRWAVr6UwVZIfINu3NLWSmMjD3S+HyLUKQcjuYlZb0aFEQHIWFCwJfHRRKZcPIF6jxIMVTwYhCSCi5lkpiyXKoUWdj4JhsRzMolKBCSC9fGSmDnHDGiKU5izo8nDnZMnWYosYxCNYlqhZHgAZhRblocXPzFgkrxbrAa22lUXA13qxoo4glAhNmLRLmWUVg4JvlUugRM2ZVGJ1gNevX7dQIsyCIRtG9Pv9mdqPyAJ4yUulfjjaOeHXw33jfkm8riRSQ64Y8OgysfPz8+hP2IajE1mjl/IAmlHO3Sdcr8A9Hwe8mgB1kaGEAJeXl39kZG7kS0TwJ6ViBMhtG9cSIMeFxwiAAF9EAEsiIO4Y2R5e6izi7sURQGO5BChpCPGvu7+/r8azZTGKp0WE2ORRjAhhchjeK4cAMc/gEyBMAGMEsOgEmkwmWcCbEsA6NCBaQ4oAMSKEBKBwQaHh7Ows6+dZYwRIZf6aXCIW67XJ3VQIgBIBrfFDImgIQC8wtg4wzBe+fv2aVab5QEq5AppLcGHECvTaCSARAf0Z2fB4JBdIuWN/fSNKAGTjR+3IRoEPCWANPKQDlBqiI5QkgWSbm5uiDHt5eanqPEJlWwuTnr0u8Gv3AClvgMb43LwhnMYN3Wi73f5LEfQ9QAmouR4gRYC3b9/Wjk9jBPDt0aNHvy3EH9STxAhAtrW1BREgdPe5BIgt+QoJ0ATwUyUAR4SmCeDc37OBXKaPJIM5FQQ9T5PAzwQBYkTwCaDp5tFs+IgQgGbdODGnZD9h/9w6Y/ytIIBPhBgBUvV8qrTT7jvoEwBR8yx+JWRpaWmqwM8kAcKEkdP3pdqeI0K4wOXq6kosw3IsRoAS1W5hCEC2t7fHCkrI/sUxIoQ9Ad++fWPDhnbkxwgwa8A3ogOU2suXL01eWkkTiEWtP6vgz7wHkLwBEgZi3gDxALEmC60HmIUYPzcEiJFB2mUMNSKA1LuHEuA2AH+rCRAmi6myEHX9qBA0T8DPBQE4Ivi6gEQEjgDzCvxcESBGhNiMYyo0xAgw78DPJQF8IkhTzj4ZpH6AeQN97glARhKztKcAQoB5A/5W6ACl9ubNGxE0ZJ5hXsGfew+AVgzn5+cLB/zCEYAjQ0iARQB+oQkQEoEIsEjAk/0P6STKD7mwLo4AAAAASUVORK5CYII=",collision:"full",selection_box:"collision",mineable:!0,explodable:!0,destroy_tool:"pickaxe",destroy_time:.4,explosion_resistance:30,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:"#7d7d7d"},bedrock:{name:"Bedrock",sound:"stone",model_type:"unit_cube",thumbnail:"data:image/png;base64,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",collision:"full",selection_box:"collision",destroy_tool:"none",mineable:!1,explodable:!1,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:"#3a3c3d"},glass:{name:"Glass",sound:"glass",model_type:"unit_cube",thumbnail:"data:image/png;base64,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",collision:"full",selection_box:"collision",mineable:!0,explodable:!0,destroy_tool:"none",destroy_time:.4,explosion_resistance:0,friction:.4,flammable:!1,light_emission:0,light_dampening:0,face_dimming:!0,ambient_occlusion:!0,map_color:"#edf9ff"},stairs:{name:"Stairs",hidden_on_edu:!0,sound:"stone",model_type:"stairs",thumbnail:"data:image/png;base64,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",uv_lock:!0,rotation:"cardinal",collision:"stairs",selection_box:"full",mineable:!0,explodable:!0,destroy_tool:"pickaxe",destroy_time:.4,explosion_resistance:30,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:"#7d7d7d"},slab:{name:"Slab",note:"Cannot be combined into double slabs in-game at the moment",sound:"stone",model_type:"slab",thumbnail:"data:image/png;base64,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",rotation:"none",collision:"slab",selection_box:"slab",mineable:!0,explodable:!0,destroy_tool:"pickaxe",destroy_time:.4,explosion_resistance:30,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:"#7d7d7d"},glowstone:{name:"Glowstone",sound:"glass",model_type:"unit_cube",thumbnail:"data:image/png;base64,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",collision:"full",selection_box:"collision",mineable:!0,explodable:!0,destroy_tool:"none",destroy_time:.4,explosion_resistance:0,friction:.4,flammable:!1,light_emission:15,light_dampening:15,face_dimming:!1,ambient_occlusion:!1,map_color:"#ffcd17"},flower:{name:"Flower",sound:"grass",model_type:"cross",thumbnail:"data:image/png;base64,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",collision:"none",selection_box:"small",mineable:!0,explodable:!0,destroy_tool:"none",destroy_time:0,explosion_resistance:0,friction:.4,flammable:!1,light_emission:0,light_dampening:0,face_dimming:!1,on_liquid_touches:"popped",ambient_occlusion:!1,map_color:"#32a852",random_offset_range:5},leaves:{name:"Leaves",note:"No automatic decay",sound:"grass",model_type:"leaves",thumbnail:"data:image/png;base64,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",collision:"full",selection_box:"collision",mineable:!0,explodable:!0,destroy_tool:"shears",destroy_time:.18,explosion_resistance:1,friction:.4,flammable:!0,fire_destroy_chance:30,fire_catch_chance:30,light_emission:0,light_dampening:12,material:"alpha_test",fade_to_opaque:!0,tint_method:"default_foliage",face_dimming:!0,ambient_occlusion:!0,map_color:"#1e9847ff"},log:{name:"Log",sound:"wood",model_type:"log",thumbnail:"data:image/png;base64,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",rotation:"pillar",collision:"full",selection_box:"collision",mineable:!0,explodable:!0,destroy_tool:"axe",destroy_time:.5,explosion_resistance:15,friction:.4,flammable:!0,fire_destroy_chance:20,fire_catch_chance:5,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:"#5f4a2b"},lectern:{name:"Lectern",note:"Visuals only, no book functionality",sound:"wood",model_type:"lectern",thumbnail:"data:image/png;base64,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",rotation:"cardinal",collision:"full",selection_box:"collision",mineable:!0,explodable:!0,destroy_tool:"axe",destroy_time:.65,explosion_resistance:15,friction:.4,flammable:!0,fire_destroy_chance:20,fire_catch_chance:5,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:"#5f4a2b"},fence:{name:"Fence",hidden_on_edu:!0,sound:"wood",model_type:"fence",thumbnail:"data:image/png;base64,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",collision:"fence",selection_box:"collision",mineable:!0,explodable:!0,destroy_tool:"axe",destroy_time:.65,explosion_resistance:15,friction:.4,flammable:!0,fire_destroy_chance:20,fire_catch_chance:5,light_emission:0,face_dimming:!0,ambient_occlusion:!0,map_color:"#5f4a2b"}}},924:(e,t,o)=>{const{getFS:i}=o(359);isApp&&"BedrockBlockManager"in window&&(BedrockBlockManager.prototype.checkBlockFile=function(e){try{var t=i().readFileSync(e,"utf-8");if("string"==typeof t){let e=(t=autoParseJSON(t,!1))&&t["minecraft:block"];if(!e||!e.components)return;let o=e=>"object"==typeof e?o(e.identifier):"string"==typeof e&&e.replace(/^geometry\./,"")==this.project.geometry_name;if(o(e.components["minecraft:geometry"]))return e.type="block",e;if(e.permutations instanceof Array)for(let t of e.permutations)if(t.components&&o(t.components["minecraft:geometry"]))return e.type="block",e}}catch(e){return console.error(e),!1}})},318:e=>{"use strict";e.exports="data:image/png;base64,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"},317:e=>{"use strict";e.exports=require("child_process")},896:e=>{"use strict";e.exports=require("fs")},857:e=>{"use strict";e.exports=require("os")}},t={};function o(i){var a=t[i];if(void 0!==a)return a.exports;var n=t[i]={id:i,exports:{}};return e[i](n,n.exports,o),n.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var i in t)o.o(t,i)&&!o.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nc=void 0,(()=>{"use strict";var e=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{attrs:{id:"block_wizard_wrapper"}},[o("h2",[e._v(e._s(e.pages[e.open_page].label))]),e._v(" "),"metadata"==e.open_page?o("div",{staticClass:"block_wizard_target_selection"},[o("p",{staticClass:"description"},[e._v("Game Variant")]),e._v(" "),o("select-input",{attrs:{options:e.edition_options},model:{value:e.form.edition,callback:function(t){e.$set(e.form,"edition",t)},expression:"form.edition"}})],1):e._e(),e._v(" "),"metadata"==e.open_page?o("content",[o("section",[o("label",{staticClass:"required"},[e._v("Display Name")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The display name will be visible to players in-game.")]),e._v(" "),o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.display_name,expression:"form.display_name"}],attrs:{type:"text",placeholder:"Test Block"},domProps:{value:e.form.display_name},on:{input:[function(t){t.target.composing||e.$set(e.form,"display_name",t.target.value)},function(t){return e.inputDisplayName()}]}})]),e._v(" "),o("section",[o("label",{staticClass:"required"},[e._v("Identifier")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The identifier is used internally in the addon to identify this block type.\n\t\t\t\tAn identifier consists of the namespace and the block name, separated by a colon.\n\t\t\t\tThe namespace should be a short and unique version of your name or the name of your addon.\n\t\t\t")]),e._v(" "),o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.identifier,expression:"form.identifier"}],attrs:{type:"text",placeholder:"myname:custom_block"},domProps:{value:e.form.identifier},on:{input:[function(t){t.target.composing||e.$set(e.form,"identifier",t.target.value)},function(t){e.has_customized_id=!0}]}}),e._v(" "),e.identifier_error?o("div",{attrs:{id:"block_wizard_id_error"}},[o("i",{staticClass:"material-icons",staticStyle:{color:"#ff415b"}},[e._v("error")]),e._v(" "),o("div",{staticClass:"block_wizard_tooltip tooltip"},[e._v(e._s(e.identifier_error))])]):e._e()]),e._v(" "),o("section",[o("label",[e._v("Creative Category")]),e._v(" "),o("div",{staticClass:"wizard_columns"},[o("div",[o("p",{staticClass:"description"},[e._v("Select the category of the block in the creative inventory")]),e._v(" "),o("select-input",{attrs:{options:e.inventory_categories},on:{input:function(t){e.form.item_group="none"}},model:{value:e.form.category,callback:function(t){e.$set(e.form,"category",t)},expression:"form.category"}})],1),e._v(" "),o("div",[o("p",{staticClass:"description"},[e._v("Optionally select the item group within the category.")]),e._v(" "),o("select-input",{attrs:{options:e.inventory_groups[e.form.category]},model:{value:e.form.item_group,callback:function(t){e.$set(e.form,"item_group",t)},expression:"form.item_group"}})],1)])])]):e._e(),e._v(" "),"preset"==e.open_page?o("content",[e._m(0),e._v(" "),o("section",[o("label",[e._v("Preset")]),e._v(" "),o("ul",{staticClass:"block_wizard_preset_list"},e._l(e.presets,(function(t,i){return o("li",{key:i,class:{selected:i==e.form.preset,grayed:"edu"==e.form.edition&&t.hidden_on_edu},style:{backgroundImage:e.getThumbnail(t.thumbnail)},on:{click:function(t){return e.selectPreset(i)}}},[o("label",[e._v(e._s(t.name))])])})),0),e._v(" "),e.presets[e.form.preset].note?o("p",{staticClass:"block_wizard_preset_note"},[e._v("ℹ️ "+e._s(e.presets[e.form.preset].name)+": "+e._s(e.presets[e.form.preset].note))]):e._e()])]):e._e(),e._v(" "),"shape"==e.open_page?o("content",[o("section",[o("label",[e._v("Collision Box")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select the size of the block collision box.")]),e._v(" "),o("select-input",{attrs:{options:e.collision_options},model:{value:e.form.collision,callback:function(t){e.$set(e.form,"collision",t)},expression:"form.collision"}})],1),e._v(" "),o("section",[o("label",[e._v("Selection Box")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select the size of the block selection box, the area where you can click to select or mine the block.")]),e._v(" "),o("select-input",{attrs:{options:e.selection_box_options},model:{value:e.form.selection_box,callback:function(t){e.$set(e.form,"selection_box",t)},expression:"form.selection_box"}})],1),e._v(" "),o("section",[o("label",[e._v("Rotation")]),e._v(" "),"leaves"==e.form.preset?o("p",{staticClass:"description"},[e._v("\n\t\t\t\tRotations are not available for this preset.\n\t\t\t")]):[o("p",{staticClass:"description"},[e._v("Select if and how the block can be placed in a rotated orientation.")]),e._v(" "),o("select-input",{attrs:{options:e.rotation_options},model:{value:e.form.rotation,callback:function(t){e.$set(e.form,"rotation",t)},expression:"form.rotation"}})]],2),e._v(" "),o("section",{staticClass:"divided_section"},[o("numeric-input",{attrs:{min:0,max:16},model:{value:e.form.random_offset_range,callback:function(t){e.$set(e.form,"random_offset_range",t)},expression:"form.random_offset_range"}}),e._v(" "),e._m(1)],1)]):e._e(),e._v(" "),"behavior"==e.open_page?o("content",[o("section",[e._m(2),e._v(" "),o("div",{staticClass:"bar flex"},[o("label",[e._v(e._s(e.form.friction))]),e._v(" "),o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.friction,expression:"form.friction"}],attrs:{type:"range",min:"0",max:"0.9",step:"0.01"},domProps:{value:e.form.friction},on:{__r:function(t){return e.$set(e.form,"friction",t.target.value)}}})]),e._v(" "),e._m(3)]),e._v(" "),o("section",[o("label",[e._v("Liquid Interaction")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select how the block reacts to flowing water.")]),e._v(" "),o("select-input",{attrs:{options:e.liquid_touches_options},model:{value:e.form.on_liquid_touches,callback:function(t){e.$set(e.form,"on_liquid_touches",t)},expression:"form.on_liquid_touches"}})],1),e._v(" "),o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.can_contain_liquid,expression:"form.can_contain_liquid"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.can_contain_liquid)?e._i(e.form.can_contain_liquid,null)>-1:e.form.can_contain_liquid},on:{change:function(t){var o=e.form.can_contain_liquid,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"can_contain_liquid",o.concat([null])):n>-1&&e.$set(e.form,"can_contain_liquid",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"can_contain_liquid",a)}}}),e._v(" "),e._m(4)]),e._v(" "),o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.redstone_conductor,expression:"form.redstone_conductor"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.redstone_conductor)?e._i(e.form.redstone_conductor,null)>-1:e.form.redstone_conductor},on:{change:function(t){var o=e.form.redstone_conductor,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"redstone_conductor",o.concat([null])):n>-1&&e.$set(e.form,"redstone_conductor",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"redstone_conductor",a)}}}),e._v(" "),e._m(5)]),e._v(" "),o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.flammable,expression:"form.flammable"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.flammable)?e._i(e.form.flammable,null)>-1:e.form.flammable},on:{change:function(t){var o=e.form.flammable,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"flammable",o.concat([null])):n>-1&&e.$set(e.form,"flammable",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"flammable",a)}}}),e._v(" "),e._m(6)]),e._v(" "),e.form.flammable?o("div",{staticStyle:{"margin-left":"40px"}},[o("section",{staticClass:"divided_section subsection"},[o("numeric-input",{attrs:{min:0},model:{value:e.form.fire_catch_chance,callback:function(t){e.$set(e.form,"fire_catch_chance",t)},expression:"form.fire_catch_chance"}}),e._v(" "),e._m(7)],1),e._v(" "),o("section",{staticClass:"divided_section subsection"},[o("numeric-input",{attrs:{min:0},model:{value:e.form.fire_destroy_chance,callback:function(t){e.$set(e.form,"fire_destroy_chance",t)},expression:"form.fire_destroy_chance"}}),e._v(" "),e._m(8)],1)]):e._e()]):e._e(),e._v(" "),"destruct"==e.open_page?o("content",[o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.mineable,expression:"form.mineable"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.mineable)?e._i(e.form.mineable,null)>-1:e.form.mineable},on:{change:function(t){var o=e.form.mineable,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"mineable",o.concat([null])):n>-1&&e.$set(e.form,"mineable",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"mineable",a)}}}),e._v(" "),e._m(9)]),e._v(" "),e.form.mineable?o("section",[o("label",[e._v("Suitable Tool")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select which tool can break the block faster.")]),e._v(" "),o("select-input",{attrs:{options:e.tool_options},model:{value:e.form.destroy_tool,callback:function(t){e.$set(e.form,"destroy_tool",t)},expression:"form.destroy_tool"}})],1):e._e(),e._v(" "),e.form.mineable?o("section",[o("label",[e._v("Tool Tier")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select which tier of tool can be used to break the block.")]),e._v(" "),o("select-input",{attrs:{options:e.tier_options},model:{value:e.form.destroy_tier,callback:function(t){e.$set(e.form,"destroy_tier",t)},expression:"form.destroy_tier"}})],1):e._e(),e._v(" "),e.form.mineable?o("section",{staticClass:"divided_section"},[o("numeric-input",{attrs:{min:0,step:.1},model:{value:e.form.destroy_time,callback:function(t){e.$set(e.form,"destroy_time",t)},expression:"form.destroy_time"}}),e._v(" "),e._m(10),e._v(" "),o("div",{style:{backgroundImage:e.getThumbnail(e.block_break_texture),animation:"break_block_animation "+Math.max(e.form.destroy_time,.25)+"s steps(1) infinite"},attrs:{id:"break_block_animation"}})],1):e._e(),e._v(" "),o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.explodable,expression:"form.explodable"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.explodable)?e._i(e.form.explodable,null)>-1:e.form.explodable},on:{change:function(t){var o=e.form.explodable,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"explodable",o.concat([null])):n>-1&&e.$set(e.form,"explodable",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"explodable",a)}}}),e._v(" "),e._m(11)]),e._v(" "),e.form.explodable?o("section",[e._m(12),e._v(" "),o("div",{staticClass:"bar flex"},[o("numeric-input",{staticStyle:{"max-width":"50px","margin-right":"10px"},attrs:{min:0,max:1e4},model:{value:e.form.explosion_resistance,callback:function(t){e.$set(e.form,"explosion_resistance",t)},expression:"form.explosion_resistance"}}),e._v(" "),o("input",{attrs:{type:"range",min:"1",max:"1.468",step:"0.001"},domProps:{value:Math.pow(e.form.explosion_resistance+1,1/24)},on:{input:function(t){return e.inputExplosionResistance(t)}}})],1),e._v(" "),e._m(13)]):e._e()]):e._e(),e._v(" "),"appearance"==e.open_page?o("content",[e.current_tab_model?o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.use_current_model,expression:"form.use_current_model"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.use_current_model)?e._i(e.form.use_current_model,null)>-1:e.form.use_current_model},on:{change:function(t){var o=e.form.use_current_model,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"use_current_model",o.concat([null])):n>-1&&e.$set(e.form,"use_current_model",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"use_current_model",a)}}}),e._v(" "),o("div",[o("label",[e._v('Use current model "'+e._s(e.current_tab_model)+'"')])])]):e._e(),e._v(" "),o("section",[e._m(14),e._v(" "),o("div",{staticClass:"bar flex"},[o("label",[e._v(e._s(e.form.light_emission))]),e._v(" "),o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.light_emission,expression:"form.light_emission"}],style:{"--color-thumb":"hsl("+(38+1.2*e.form.light_emission)+", "+(20+5*e.form.light_emission)+"%, "+(20+5*e.form.light_emission)+"%)"},attrs:{type:"range",min:"0",max:"15",step:"1"},domProps:{value:e.form.light_emission},on:{__r:function(t){return e.$set(e.form,"light_emission",t.target.value)}}})])]),e._v(" "),o("section",[e._m(15),e._v(" "),o("div",{staticClass:"bar flex"},[o("label",[e._v(e._s(e.form.light_dampening))]),e._v(" "),o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.light_dampening,expression:"form.light_dampening"}],style:{"--color-thumb":"hsl("+(60-1.2*e.form.light_dampening)+", "+(95-5*e.form.light_dampening)+"%, "+(95-5*e.form.light_dampening)+"%)"},attrs:{type:"range",min:"0",max:"15",step:"1"},domProps:{value:e.form.light_dampening},on:{__r:function(t){return e.$set(e.form,"light_dampening",t.target.value)}}})])]),e._v(" "),o("section",[o("label",[e._v("Transparency")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select how transparent pixels will display in game.")]),e._v(" "),o("select-input",{attrs:{options:e.block_materials},model:{value:e.form.material,callback:function(t){e.$set(e.form,"material",t)},expression:"form.material"}})],1),e._v(" "),o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.fade_to_opaque,expression:"form.fade_to_opaque"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.fade_to_opaque)?e._i(e.form.fade_to_opaque,null)>-1:e.form.fade_to_opaque},on:{change:function(t){var o=e.form.fade_to_opaque,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"fade_to_opaque",o.concat([null])):n>-1&&e.$set(e.form,"fade_to_opaque",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"fade_to_opaque",a)}}}),e._v(" "),e._m(16)]),e._v(" "),o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.face_dimming,expression:"form.face_dimming"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.face_dimming)?e._i(e.form.face_dimming,null)>-1:e.form.face_dimming},on:{change:function(t){var o=e.form.face_dimming,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"face_dimming",o.concat([null])):n>-1&&e.$set(e.form,"face_dimming",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"face_dimming",a)}}}),e._v(" "),e._m(17)]),e._v(" "),o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.ambient_occlusion,expression:"form.ambient_occlusion"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.ambient_occlusion)?e._i(e.form.ambient_occlusion,null)>-1:e.form.ambient_occlusion},on:{change:function(t){var o=e.form.ambient_occlusion,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"ambient_occlusion",o.concat([null])):n>-1&&e.$set(e.form,"ambient_occlusion",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"ambient_occlusion",a)}}}),e._v(" "),e._m(18)]),e._v(" "),o("section",[o("label",[e._v("Tint Method")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Use a grayscale and tint it in-game to match a biome")]),e._v(" "),o("select-input",{staticStyle:{"max-width":"220px"},attrs:{options:e.tint_methods},model:{value:e.form.tint_method,callback:function(t){e.$set(e.form,"tint_method",t)},expression:"form.tint_method"}})],1),e._v(" "),o("section",{staticClass:"divided_section"},[o("color-picker",{model:{value:e.form.map_color,callback:function(t){e.$set(e.form,"map_color",t)},expression:"form.map_color"}}),e._v(" "),e._m(19)],1),e._v(" "),"none"!=e.form.rotation?o("section",{staticClass:"divided_section"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.uv_lock,expression:"form.uv_lock"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.uv_lock)?e._i(e.form.uv_lock,null)>-1:e.form.uv_lock},on:{change:function(t){var o=e.form.uv_lock,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,"uv_lock",o.concat([null])):n>-1&&e.$set(e.form,"uv_lock",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,"uv_lock",a)}}}),e._v(" "),e._m(20)]):e._e(),e._v(" "),o("section",[o("label",[e._v("Sound")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select the sound preset for the block")]),e._v(" "),o("select-input",{staticStyle:{"max-width":"220px"},attrs:{options:e.block_sounds},model:{value:e.form.sound,callback:function(t){e.$set(e.form,"sound",t)},expression:"form.sound"}})],1)]):e._e(),e._v(" "),"loot"==e.open_page?o("content",[o("loot-editor",{attrs:{form:e.form}})],1):e._e(),e._v(" "),"export"==e.open_page?o("content",{attrs:{id:"block_wizard_export_page"}},[o("export",{attrs:{form:e.form}})],1):e._e(),e._v(" "),"next_steps"==e.open_page?o("content",[o("section",[o("label",[e._v("The add-on has now been exported to your selected destination. Enable the packs to test them.")]),e._v(" "),o("button",{staticStyle:{"margin-top":"8px","margin-bottom":"24px"},on:{click:function(t){return e.openInstallInstructions(e.form.export_mode)}}},[o("i",{staticClass:"material-icons icon"},[e._v("help")]),e._v("How do I install packs?")]),e._v(" "),"none"==e.form.spawn_egg_mode?o("p",[e._v("Now you can place your block in the world using the command "),o("code",{staticClass:"code",on:{click:function(t){return e.copySummonCommand()}}},[e._v("/setblock ~ ~ ~ "+e._s(e.form.identifier))])]):o("p",[e._v("Now you can find the block in the creative inventory!")])]),e._v(" "),"mcaddon"!=e.form.export_mode&&"integrate_mcaddon"!=e.form.export_mode?o("section",[o("label",[e._v("Let's edit the block model!")]),e._v(" "),o("p",{staticClass:"description"},[e._v("After you close this dialog, you will be able to edit the model and texture in Blockbench")]),e._v(" "),"mcaddon"!=e.form.export_mode&&"integrate_mcaddon"!=e.form.export_mode?o("button",{attrs:{id:"block_wizard_launch_vscode"},on:{click:function(t){return e.VSCode.open(e.behavior_pack_path,e.resource_pack_path)}}},[o("img",{attrs:{src:e.VSCode.icon,width:"22px"}}),e._v("\n\t\t\t\tOpen in VS Code\n\t\t\t")]):e._e()]):o("section",[o("label",[e._v("Now let's edit the block model!")]),e._v(" "),o("p",{staticClass:"description"},[e._v("After you close this dialog, you will be able to edit the model and texture in Blockbench")]),e._v(" "),e._m(21)]),e._v(" "),e._m(22)]):e._e()])};e._withStripped=!0;var t=o(359);const i={metadata:{label:"Naming",icon:"description"},preset:{label:"Preset",icon:"view_list"},shape:{label:"Shape",icon:"deployed_code"},behavior:{label:"Behavior",icon:"mode_heat"},destruct:{label:"Destruct",icon:"sound_detection_glass_break"},appearance:{label:"Appearance",icon:"visibility"},loot:{label:"Loot",icon:"diamond"},export:{label:"Export",icon:"file_download"},next_steps:{label:"Next Steps",icon:"queue_play_next"}};var a=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("p",{staticClass:"description"},[e._v("Export your block as a behavior and resource pack.")]),e._v(" "),o("section",{attrs:{id:"block_wizard_export_options"}},[e.isApp?o("div",{staticClass:"block_wizard_export_option",class:{selected:"folder"==e.form.export_mode},staticStyle:{"border-color":"#dccb92"},on:{click:function(t){return e.setExportMode("folder")}}},[o("h3",[e._v("Export to Folder")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Export the packs directly into the development pack folders of your Minecraft installation, and get started right away.")])]):e._e(),e._v(" "),e.isApp?o("div",{staticClass:"block_wizard_export_option",class:{selected:"integrate"==e.form.export_mode},staticStyle:{"border-color":"#83c4ea"},on:{click:function(t){return e.setExportMode("integrate")}}},[o("h3",[e._v("Integrate into Pack")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Integrate the block into an existing behavior and resource pack on your computer.")])]):e._e(),e._v(" "),o("div",{staticClass:"block_wizard_export_option",class:{selected:"mcaddon"==e.form.export_mode},staticStyle:{"border-color":"#89ca51"},on:{click:function(t){return e.setExportMode("mcaddon")}}},[o("h3",[e._v("Export as MCAddon")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Generate an MCAddon file that you can install in one click or send to your friends.")])]),e._v(" "),o("div",{staticClass:"block_wizard_export_option",class:{selected:"integrate_mcaddon"==e.form.export_mode},staticStyle:{"border-color":"#d2fc92"},on:{click:function(t){return e.setExportMode("integrate_mcaddon")}}},[o("h3",[e._v("Integrate into MCAddon")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Integrate the block into an existing MCAddon file.")])])]),e._v(" "),"integrate"==e.form.export_mode?[o("section",[o("label",[e._v("Behavior Pack")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select the behavior pack that you want to save the new block into")]),e._v(" "),o("ul",{attrs:{id:"block_wizard_pack_list"}},[e._l(e.existing_packs,(function(t){return o("li",{key:t.name,class:{selected:t==e.form.integrate_pack},on:{click:function(o){e.form.integrate_pack=t}}},[t.has_icon?o("img",{attrs:{src:e.getPackIcon(t),width:"32px"},on:{error:function(e){t.has_icon=!1}}}):o("div"),e._v("\n\t\t\t\t\t"+e._s(t.name)+"\n\t\t\t\t")])})),e._v(" "),o("li",{on:{click:function(t){return e.addPacks()}}},[o("i",{staticClass:"material-icons"},[e._v("add")]),e._v("\n\t\t\t\t\tSelect packs manually...\n\t\t\t\t")])],2)])]:"integrate_mcaddon"==e.form.export_mode?[o("section",[o("label",[e._v("MCAddon File")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select the .mcaddon file to merge the new block into.")]),e._v(" "),o("div",[o("button",{staticStyle:{display:"inline-block"},on:{click:function(t){return e.selectMCAddon()}}},[o("i",{staticClass:"material-icons"},[e._v("add")]),e._v("\n\t\t\t\t\tUpload MCAddon\n\t\t\t\t")]),e._v("\n\t\t\t\t"+e._s(e.mcaddon_file_name)+"\n\t\t\t")])])]:[o("section",[o("label",{staticClass:"required"},[e._v("Pack Name")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The name of the packs you are exporting")]),e._v(" "),o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.pack_name,expression:"form.pack_name"}],attrs:{type:"text",placeholder:"Block Pack"},domProps:{value:e.form.pack_name},on:{input:function(t){t.target.composing||e.$set(e.form,"pack_name",t.target.value)}}})]),e._v(" "),o("section",[o("label",[e._v("Pack Author(s)")]),e._v(" "),o("p",{staticClass:"description"},[e._v("You can enter your name as the author of the pack. To enter multiple names, separate them with a comma.")]),e._v(" "),o("input",{directives:[{name:"model",rawName:"v-model",value:e.form.pack_authors,expression:"form.pack_authors"}],attrs:{type:"text",placeholder:"Benchbot, Performance Panda"},domProps:{value:e.form.pack_authors},on:{input:function(t){t.target.composing||e.$set(e.form,"pack_authors",t.target.value)}}})]),e._v(" "),o("section",[o("label",[e._v("Pack Icon")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The pack icon will be visible in the resource and behavior pack menu")]),e._v(" "),o("icon-picker",{model:{value:e.form.pack_icon,callback:function(t){e.$set(e.form,"pack_icon",t)},expression:"form.pack_icon"}})],1)]],2)};a._withStripped=!0;var n=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"block_wizard_icon_picker"},[o("div",{staticClass:"icon_picker_left"},[e.value?o("img",{attrs:{src:e.value,width:"64px",height:"64px"}}):e._e()]),e._v(" "),o("div",{staticClass:"icon_picker_right",on:{click:e.pickImage}},[o("i",{staticClass:"material-icons icon"},[e._v("folder")]),e._v(" "),o("label",[e._v(e._s(e.imageName))])])])};function r(e,t,o,i,a,n,r,s){var c,l="function"==typeof e?e.options:e;if(t&&(l.render=t,l.staticRenderFns=o,l._compiled=!0),i&&(l.functional=!0),n&&(l._scopeId="data-v-"+n),r?(c=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),a&&a.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},l._ssrRegister=c):a&&(c=s?function(){a.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:a),c)if(l.functional){l._injectStyles=c;var d=l.render;l.render=function(e,t){return c.call(t),d(e,t)}}else{var A=l.beforeCreate;l.beforeCreate=A?[].concat(A,c):[c]}return{exports:e,options:l}}n._withStripped=!0;var s=r({name:"icon-picker",props:{value:String},methods:{pickImage(){Blockbench.import({readtype:"image",type:"Image",extensions:["png"]},(e=>{this.value=e[0].content||e[0].path,this.$emit("input",this.value)}))}},computed:{imageName(){if(!this.value)return"Select Image...";let e=this.value.split(osfs);return e.length>2?e.last():""}}},n,[],!1,(function(e){var t=o(361);t.__inject__&&t.__inject__(e)}),null,"6c5a6967");s.options.__file="src/dialog/IconPicker.vue";var c=r({components:{IconPicker:s.exports},name:"export",props:{form:Object,bedrock_installed:Boolean},data:()=>({isApp,existing_packs:[],mcaddon_file_name:""}),methods:{setExportMode(e){if(this.form.export_mode=e,"integrate"==e){let e=(0,t.getExistingPacks)(this.form.edition);if(e instanceof Array)this.bedrock_installed=!0,this.existing_packs.replace(e);else{let e={bedrock:"Bedrock",preview:"Bedrock Preview",edu:"Education Edition"};Blockbench.showQuickMessage(`No installation of Minecraft ${e[this.form.edition]} was found on your device`)}}},getPackIcon:e=>e.bp_path+osfs+"pack_icon.png",addPacks(){let e={name:"",bp_path:"",rp_path:"",has_icon:!0};e.bp_path=Blockbench.pickDirectory({resource_id:"bedrock_behavior_pack"}),e.bp_path&&(e.name=PathModule.basename(e.bp_path),e.rp_path=Blockbench.pickDirectory({resource_id:"bedrock_resource_pack"}),e.rp_path&&(this.existing_packs.push(e),this.form.integrate_pack=e))},selectMCAddon(){Blockbench.import({extensions:["mcaddon"],type:"MCAddon",readtype:"binary"},(async e=>{this.mcaddon_file_name=e[0].name;let t=await JSZip.loadAsync(e[0].content);window.BlockWizardProject.previous_mcaddon=t}))}}},a,[],!1,(function(e){var t=o(136);t.__inject__&&t.__inject__(e)}),null,"2947df98");c.options.__file="src/dialog/Export.vue";const l=c.exports;var d=function(){var e=this.$createElement,t=this._self._c||e;return t("div",[t("input",{ref:"color_picker"})])};d._withStripped=!0;var A=r({name:"color-picker",props:{value:String},mounted(){$(this.$refs.color_picker).spectrum({preferredFormat:"hex",color:this.value,showAlpha:!1,showInput:!0,move:e=>{this.$emit("input",e.toHexString())},change:e=>{this.$emit("input",e.toHexString())}})}},d,[],!1,(function(e){}),null,"26f51d01");A.options.__file="src/dialog/ColorPicker.vue";const m=A.exports;var p=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[e._m(0),e._v(" "),o("section",[o("input",{attrs:{type:"radio",id:"block_wizard_loot_same",value:"default"},domProps:{checked:"default"==e.form.loot_type},on:{change:function(t){e.form.loot_type="default"}}}),e._v(" "),o("label",{attrs:{for:"block_wizard_loot_same"}},[e._v("Default Loot")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The block will drop itself")])]),e._v(" "),o("section",[o("input",{attrs:{type:"radio",id:"block_wizard_loot_custom",value:"texture"},domProps:{checked:"custom"==e.form.loot_type},on:{change:function(t){e.form.loot_type="custom"}}}),e._v(" "),o("label",{attrs:{for:"block_wizard_loot_custom"}},[e._v("Custom Loot")]),e._v(" "),"custom"==e.form.loot_type?[o("p",{staticClass:"description"},[e._v("From each pool, one entry will be selected randomly.")]),e._v(" "),o("ul",{attrs:{id:"block_wizard_loot_list"}},e._l(e.form.custom_loot,(function(t){return o("li",{key:t.uuid},[o("p",{staticClass:"description"},[e._v("Randomly pick one of these entries:")]),e._v(" "),o("ul",{attrs:{id:"block_wizard_loot_item_list"}},e._l(t.entries,(function(i){return o("li",{key:i.uuid},[o("select-input",{attrs:{options:e.item_ids},model:{value:i.type,callback:function(t){e.$set(i,"type",t)},expression:"item.type"}}),e._v(" "),"custom"==i.type?o("input",{directives:[{name:"model",rawName:"v-model",value:i.custom_id,expression:"item.custom_id"}],attrs:{type:"text",title:"Enter a custom item identifier"},domProps:{value:i.custom_id},on:{input:function(t){t.target.composing||e.$set(i,"custom_id",t.target.value)}}}):e._e(),e._v(" "),"empty"!=i.type?[o("label",[e._v("Count Min:")]),e._v(" "),o("numeric-input",{attrs:{min:0,max:i.count_max,title:"Set the minimum possible count for this item"},model:{value:i.count_min,callback:function(t){e.$set(i,"count_min",t)},expression:"item.count_min"}}),e._v(" "),o("label",[e._v("Max:")]),e._v(" "),o("numeric-input",{attrs:{min:i.count_min,max:64,title:"Set the maximum possible count for this item"},model:{value:i.count_max,callback:function(t){e.$set(i,"count_max",t)},expression:"item.count_max"}})]:e._e(),e._v(" "),t.entries.length>1?[o("label",[e._v("Probability:")]),e._v(" "),o("numeric-input",{attrs:{min:0,title:"Increase the probability to make an item more likely to drop"},model:{value:i.weight,callback:function(t){e.$set(i,"weight",t)},expression:"item.weight"}}),e._v(" "),o("div",{staticClass:"tool",on:{click:function(e){return t.entries.remove(i)}}},[o("i",{staticClass:"material-icons"},[e._v("clear")])])]:e._e()],2)})),0),e._v(" "),o("button",{on:{click:function(o){return e.addItem(t)}}},[e._v("Add Item")]),e._v(" "),o("button",{on:{click:function(o){return e.form.custom_loot.remove(t)}}},[e._v("Remove Pool")])])})),0),e._v(" "),o("button",{on:{click:function(t){return e.addPool()}}},[e._v("Add Pool")])]:e._e()],2)])};p._withStripped=!0;let g={empty:"Empty",custom:"Custom ID",acacia_boat:"Acacia Boat",acacia_button:"Acacia Button",acacia_chest_boat:"Acacia Chest Boat",acacia_door:"Acacia Door",acacia_fence:"Acacia Fence",acacia_fence_gate:"Acacia Fence Gate",acacia_hanging_sign:"Acacia Hanging Sign",acacia_log:"Acacia Log",acacia_pressure_plate:"Acacia Pressure Plate",acacia_sign:"Acacia Sign",acacia_stairs:"Acacia Stairs",acacia_trapdoor:"Acacia Trapdoor",activator_rail:"Activator Rail",allay_spawn_egg:"Allay Spawn Egg",amethyst_block:"Block of Amethyst",amethyst_cluster:"Amethyst Cluster",amethyst_shard:"Amethyst Shard",ancient_debris:"Ancient Debris",andesite_stairs:"Andesite Stairs",angler_pottery_sherd:"Angler Pottery Sherd",anvil:"Anvil",apple:"Apple",archer_pottery_sherd:"Archer Pottery Sherd",armor_stand:"Armor Stand",arms_up_pottery_sherd:"Arms Up Pottery Sherd",arrow:"Arrow",axolotl_bucket:"Axolotl Bucket",axolotl_spawn_egg:"Axolotl Spawn Egg",azalea:"Azalea",azalea_leaves:"Azalea Leaves",azalea_leaves_flowered:"Flowering Azalea Leaves",baked_potato:"Baked Potato",bamboo:"Bamboo",bamboo_block:"Block of Bamboo",bamboo_button:"Bamboo Button",bamboo_chest_raft:"Bamboo Chest Raft",bamboo_door:"Bamboo Door",bamboo_double_slab:"Bamboo Double Slab",bamboo_fence:"Bamboo Fence",bamboo_fence_gate:"Bamboo Fence Gate",bamboo_hanging_sign:"Bamboo Hanging Sign",bamboo_mosaic:"Bamboo Mosaic",bamboo_mosaic_double_slab:"Bamboo Mosaic Double Slab",bamboo_mosaic_slab:"Bamboo Mosaic Slab",bamboo_mosaic_stairs:"Bamboo Mosaic Stairs",bamboo_planks:"Bamboo Planks",bamboo_pressure_plate:"Bamboo Pressure Plate",bamboo_raft:"Bamboo Raft",bamboo_sapling:"Bamboo Sapling",bamboo_sign:"Bamboo Sign",bamboo_slab:"Bamboo Slab",bamboo_stairs:"Bamboo Stairs",bamboo_trapdoor:"Bamboo Trapdoor",banner:"Banner",banner_pattern:"Banner Pattern",barrel:"Barrel",barrier:"Barrier",basalt:"Basalt",bat_spawn_egg:"Bat Spawn Egg",beacon:"Beacon",bed:"Bed",bedrock:"Bedrock",bee_nest:"Bee Nest",bee_spawn_egg:"Bee Spawn Egg",beef:"Raw Beef",beehive:"Beehive",beetroot:"Beetroot",beetroot_seeds:"Beetroot Seeds",beetroot_soup:"Beetroot Soup",bell:"Bell",big_dripleaf:"Big Dripleaf",birch_boat:"Birch Boat",birch_button:"Birch Button",birch_chest_boat:"Birch Chest Boat",birch_door:"Birch Door",birch_fence:"Birch Fence",birch_fence_gate:"Birch Fence Gate",birch_hanging_sign:"Birch Hanging Sign",birch_log:"Birch Log",birch_pressure_plate:"Birch Pressure Plate",birch_sign:"Birch Sign",birch_stairs:"Birch Stairs",birch_trapdoor:"Birch Trapdoor",black_candle:"Black Candle",black_candle_cake:"Cake with Black Candle",black_carpet:"Black Carpet",black_concrete:"Black Concrete",black_dye:"Black Dye",black_glazed_terracotta:"Black Glazed Terracotta",black_shulker_box:"Black Shulker Box",black_wool:"Black Wool",blackstone:"Blackstone",blackstone_double_slab:"Blackstone Double Slab",blackstone_slab:"Blackstone Slab",blackstone_stairs:"Blackstone Stairs",blackstone_wall:"Blackstone Wall",blade_pottery_sherd:"Blade Pottery Sherd",blast_furnace:"Blast Furnace",blaze_powder:"Blaze Powder",blaze_rod:"Blaze Rod",blaze_spawn_egg:"Blaze Spawn Egg",bleach:"Bleach",blue_candle:"Blue Candle",blue_candle_cake:"Cake with Blue Candle",blue_carpet:"Blue Carpet",blue_concrete:"Blue Concrete",blue_dye:"Blue Dye",blue_glazed_terracotta:"Blue Glazed Terracotta",blue_ice:"Blue Ice",blue_shulker_box:"Blue Shulker Box",blue_wool:"Blue Wool",boat:"Boat",bone:"Bone",bone_block:"Bone Block",bone_meal:"Bone Meal",book:"Book",bookshelf:"Bookshelf",border_block:"Border",bordure_indented_banner_pattern:"Bordure Indented Banner Pattern",bow:"Bow",bowl:"Bowl",brain_coral:"Brain Coral",bread:"Bread",brewer_pottery_sherd:"Brewer Pottery Sherd",brewing_stand:"Brewing Stand",brick:"Brick",brick_block:"Brick Block",brick_stairs:"Brick Stairs",brown_candle:"Brown Candle",brown_candle_cake:"Cake with Brown Candle",brown_carpet:"Brown Carpet",brown_concrete:"Brown Concrete",brown_dye:"Brown Dye",brown_glazed_terracotta:"Brown Glazed Terracotta",brown_mushroom:"Brown Mushroom",brown_mushroom_block:"Brown Mushroom Block",brown_shulker_box:"Brown Shulker Box",brown_wool:"Brown Wool",brush:"Brush",bubble_coral:"Bubble Coral",bucket:"Bucket",budding_amethyst:"Budding Amethyst",burn_pottery_sherd:"Burn Pottery Sherd",cactus:"Cactus",cake:"Cake",calcite:"Calcite",calibrated_sculk_sensor:"Calibrated Sculk Sensor",camel_spawn_egg:"Camel Spawn Egg",camera:"Camera",campfire:"Campfire",candle:"Candle",candle_cake:"Cake with Candle",carpet:"Carpet",carrot:"Carrot",carrot_on_a_stick:"Carrot On A Stick",carrots:"Carrots",cartography_table:"Cartography Table",carved_pumpkin:"Carved Pumpkin",cat_spawn_egg:"Cat Spawn Egg",cauldron:"Cauldron",cave_spider_spawn_egg:"Cave Spider Spawn Egg",cave_vines:"Cave Vines",cave_vines_body_with_berries:"Cave Vines",cave_vines_head_with_berries:"Cave Vines",chain:"Chain",chain_command_block:"Chain Command Block",chainmail_boots:"Chain Boots",chainmail_chestplate:"Chain Chestplate",chainmail_helmet:"Chain Helmet",chainmail_leggings:"Chain Leggings",charcoal:"Charcoal",chemical_heat:"Chemical Heat",chemistry_table:"Chemistry Table",cherry_boat:"Cherry Boat",cherry_button:"Cherry Button",cherry_chest_boat:"Cherry Chest Boat",cherry_door:"Cherry Door",cherry_double_slab:"Cherry Double Slab",cherry_fence:"Cherry Fence",cherry_fence_gate:"Cherry Fence Gate",cherry_hanging_sign:"Cherry Hanging Sign",cherry_leaves:"Cherry Leaves",cherry_log:"Cherry Log",cherry_planks:"Cherry Planks",cherry_pressure_plate:"Cherry Pressure Plate",cherry_sapling:"Cherry Sapling",cherry_sign:"Cherry Sign",cherry_slab:"Cherry Slab",cherry_stairs:"Cherry Stairs",cherry_trapdoor:"Cherry Trapdoor",cherry_wood:"Cherry Wood",chest:"Chest",chest_boat:"Chest Boat",chest_minecart:"Minecart with Chest",chicken:"Raw Chicken",chicken_spawn_egg:"Chicken Spawn Egg",chiseled_bookshelf:"Chiseled Bookshelf",chiseled_deepslate:"Chiseled Deepslate",chiseled_nether_bricks:"Chiseled Nether Bricks",chiseled_polished_blackstone:"Chiseled Polished Blackstone",chorus_flower:"Chorus Flower",chorus_fruit:"Chorus Fruit",chorus_plant:"Chorus Plant",clay:"Clay Block",clay_ball:"Clay",client_request_placeholder_block:"Client Request Placeholder Block",clock:"Clock",coal:"Coal",coal_block:"Block of Coal",coal_ore:"Coal Ore",coast_armor_trim_smithing_template:"Coast Armor Trim Smithing Template",cobbled_deepslate:"Cobbled Deepslate",cobbled_deepslate_double_slab:"Cobbled Deepslate Double Slab",cobbled_deepslate_slab:"Cobbled Deepslate Slab",cobbled_deepslate_stairs:"Cobbled Deepslate Stairs",cobbled_deepslate_wall:"Cobbled Deepslate Wall",cobblestone:"Cobblestone",cobblestone_wall:"Cobblestone Wall",cocoa:"Cocoa",cocoa_beans:"Cocoa Beans",cod:"Cod",cod_bucket:"Cod Bucket",cod_spawn_egg:"Cod Spawn Egg",colored_torch_bp:"Colored Torch Bp",colored_torch_rg:"Colored Torch Rg",command_block:"Command Block",command_block_minecart:"Minecart with Command Block",comparator:"Redstone Comparator",compass:"Compass",composter:"Composter",compound:"Compound",concrete:"Concrete",concrete_powder:"Concrete Powder",conduit:"Conduit",cooked_beef:"Cooked Beef",cooked_chicken:"Cooked Chicken",cooked_cod:"Cooked Cod",cooked_mutton:"Cooked Mutton",cooked_porkchop:"Cooked Porkchop",cooked_rabbit:"Cooked Rabbit",cooked_salmon:"Cooked Salmon",cookie:"Cookie",copper_block:"Block of Copper",copper_ingot:"Copper Ingot",copper_ore:"Copper Ore",coral:"Coral",coral_block:"Coral Block",coral_fan:"Coral Fan",coral_fan_dead:"Coral Fan Dead",coral_fan_hang:"Coral Fan Hang",cow_spawn_egg:"Cow Spawn Egg",cracked_deepslate_bricks:"Cracked Deepslate Bricks",cracked_deepslate_tiles:"Cracked Deepslate Tiles",cracked_nether_bricks:"Cracked Nether Bricks",cracked_polished_blackstone_bricks:"Cracked Polished Blackstone Bricks",crafting_table:"Crafting Table",creeper_banner_pattern:"Creeper Banner Pattern",creeper_spawn_egg:"Creeper Spawn Egg",crimson_button:"Crimson Button",crimson_door:"Crimson Door",crimson_double_slab:"Crimson Slab",crimson_fence:"Crimson Fence",crimson_fence_gate:"Crimson Fence Gate",crimson_fungus:"Crimson Fungus",crimson_hanging_sign:"Crimson Hanging Sign",crimson_hyphae:"Crimson Hyphae",crimson_nylium:"Crimson Nylium",crimson_planks:"Crimson Planks",crimson_pressure_plate:"Crimson Pressure Plate",crimson_roots:"Crimson Roots",crimson_sign:"Crimson Sign",crimson_slab:"Crimson Slab",crimson_stairs:"Crimson Stairs",crimson_stem:"Crimson Stem",crimson_trapdoor:"Crimson Trapdoor",crossbow:"Crossbow",crying_obsidian:"Crying Obsidian",cut_copper:"Cut Copper",cut_copper_slab:"Cut Copper Slab",cut_copper_stairs:"Cut Copper Stairs",cyan_candle:"Cyan Candle",cyan_candle_cake:"Cake with Cyan Candle",cyan_carpet:"Cyan Carpet",cyan_concrete:"Cyan Concrete",cyan_dye:"Cyan Dye",cyan_glazed_terracotta:"Cyan Glazed Terracotta",cyan_shulker_box:"Cyan Shulker Box",cyan_wool:"Cyan Wool",danger_pottery_sherd:"Danger Pottery Sherd",dark_oak_boat:"Dark Oak Boat",dark_oak_button:"Dark Oak Button",dark_oak_chest_boat:"Dark Oak Chest Boat",dark_oak_door:"Dark Oak Door",dark_oak_fence:"Dark Oak Fence",dark_oak_fence_gate:"Dark Oak Fence Gate",dark_oak_hanging_sign:"Dark Oak Hanging Sign",dark_oak_log:"Dark Oak Log",dark_oak_pressure_plate:"Dark Oak Pressure Plate",dark_oak_sign:"Dark Oak Sign",dark_oak_stairs:"Dark Oak Stairs",dark_oak_trapdoor:"Dark Oak Trapdoor",dark_prismarine_stairs:"Dark Prismarine Stairs",daylight_detector:"Daylight Sensor",daylight_detector_inverted:"Daylight Detector Inverted",dead_brain_coral:"Dead Brain Coral",dead_bubble_coral:"Dead Bubble Coral",dead_fire_coral:"Dead Fire Coral",dead_horn_coral:"Dead Horn Coral",dead_tube_coral:"Dead Tube Coral",deadbush:"Dead Bush",debug_stick:"Debug Stick",decorated_pot:"Decorated Pot",deepslate:"Deepslate",deepslate_brick_double_slab:"Deepslate Brick Double Slab",deepslate_brick_slab:"Deepslate Brick Slab",deepslate_brick_stairs:"Deepslate Brick Stairs",deepslate_brick_wall:"Deepslate Brick Wall",deepslate_bricks:"Deepslate Bricks",deepslate_coal_ore:"Deepslate Coal Ore",deepslate_copper_ore:"Deepslate Copper Ore",deepslate_diamond_ore:"Deepslate Diamond Ore",deepslate_emerald_ore:"Deepslate Emerald Ore",deepslate_gold_ore:"Deepslate Gold Ore",deepslate_iron_ore:"Deepslate Iron Ore",deepslate_lapis_ore:"Deepslate Lapis Lazuli Ore",deepslate_redstone_ore:"Deepslate Redstone Ore",deepslate_tile_double_slab:"Deepslate Tile Double Slab",deepslate_tile_slab:"Deepslate Tile Slab",deepslate_tile_stairs:"Deepslate Tile Stairs",deepslate_tile_wall:"Deepslate Tile Wall",deepslate_tiles:"Deepslate Tiles",deny:"Deny",detector_rail:"Detector Rail",diamond:"Diamond",diamond_axe:"Diamond Axe",diamond_block:"Block of Diamond",diamond_boots:"Diamond Boots",diamond_chestplate:"Diamond Chestplate",diamond_helmet:"Diamond Helmet",diamond_hoe:"Diamond Hoe",diamond_horse_armor:"Diamond Horse Armor",diamond_leggings:"Diamond Leggings",diamond_ore:"Diamond Ore",diamond_pickaxe:"Diamond Pickaxe",diamond_shovel:"Diamond Shovel",diamond_sword:"Diamond Sword",diorite_stairs:"Diorite Stairs",dirt:"Dirt",dirt_with_roots:"Rooted Dirt",disc_fragment_5:"Disc Fragment 5",dispenser:"Dispenser",dolphin_spawn_egg:"Dolphin Spawn Egg",donkey_spawn_egg:"Donkey Spawn Egg",double_cut_copper_slab:"Double Cut Copper Slab",double_plant:"Plant",double_stone_block_slab:"Double Stone Block Slab",double_wooden_slab:"Double Wooden Slab",dragon_breath:"Dragon's Breath",dragon_egg:"Dragon Egg",dried_kelp:"Dried Kelp",dried_kelp_block:"Dried Kelp Block",dripstone_block:"Dripstone Block",dropper:"Dropper",drowned_spawn_egg:"Drowned Spawn Egg",dune_armor_trim_smithing_template:"Dune Armor Trim Smithing Template",dye:"Dye",echo_shard:"Echo Shard",egg:"Egg",elder_guardian_spawn_egg:"Elder Guardian Spawn Egg",elytra:"Elytra",emerald:"Emerald",emerald_block:"Block of Emerald",emerald_ore:"Emerald Ore",empty_map:"Empty Map",enchanted_book:"Enchanted Book",enchanted_golden_apple:"Enchanted Golden Apple",enchanting_table:"Enchantment Table",end_brick_stairs:"End Stone Brick Stairs",end_bricks:"End Stone Bricks",end_crystal:"End Crystal",end_gateway:"End Gateway",end_portal:"End Portal",end_portal_frame:"End Portal Frame",end_rod:"End Rod",end_stone:"End Stone",ender_chest:"Ender Chest",ender_dragon_spawn_egg:"Ender Dragon Spawn Egg",ender_eye:"Eye of Ender",ender_pearl:"Ender Pearl",enderman_spawn_egg:"Enderman Spawn Egg",endermite_spawn_egg:"Endermite Spawn Egg",evoker_spawn_egg:"Evoker Spawn Egg",experience_bottle:"Bottle o' Enchanting",explorer_pottery_sherd:"Explorer Pottery Sherd",exposed_copper:"Exposed Copper",exposed_cut_copper:"Exposed Cut Copper",exposed_cut_copper_slab:"Exposed Cut Copper Slab",exposed_cut_copper_stairs:"Exposed Cut Copper Stairs",exposed_double_cut_copper_slab:"Exposed Double Cut Copper Slab",eye_armor_trim_smithing_template:"Eye Armor Trim Smithing Template",farmland:"Farmland",feather:"Feather",fence:"Oak Fence",fence_gate:"Oak Fence Gate",fermented_spider_eye:"Fermented Spider Eye",field_masoned_banner_pattern:"Field Masoned Banner Pattern",filled_map:"Filled Map",fire:"Fire",fire_charge:"Fire Charge",fire_coral:"Fire Coral",firework_rocket:"Firework Rocket",firework_star:"Firework Star",fishing_rod:"Fishing Rod",fletching_table:"Fletching Table",flint:"Flint",flint_and_steel:"Flint and Steel",flower_banner_pattern:"Flower Banner Pattern",flower_pot:"Flower Pot",flowering_azalea:"Flowering Azalea",flowing_lava:"Lava",flowing_water:"Water",fox_spawn_egg:"Fox Spawn Egg",frame:"Item Frame",friend_pottery_sherd:"Friend Pottery Sherd",frog_spawn:"Frogspawn",frog_spawn_egg:"Frog Spawn Egg",frosted_ice:"Frosted Ice",furnace:"Furnace",ghast_spawn_egg:"Ghast Spawn Egg",ghast_tear:"Ghast Tear",gilded_blackstone:"Gilded Blackstone",glass:"Glass",glass_bottle:"Glass Bottle",glass_pane:"Glass Pane",glistering_melon_slice:"Glistering Melon Slice",globe_banner_pattern:"Globe Banner Pattern",glow_frame:"Glow Item Frame",glow_ink_sac:"Glow Ink Sac",glow_lichen:"Glow Lichen",glow_squid_spawn_egg:"Glow Squid Spawn Egg",glow_stick:"Glow Stick",glowingobsidian:"Glowingobsidian",glowstone:"Glowstone",glowstone_dust:"Glowstone Dust",goat_horn:"Goat Horn",goat_spawn_egg:"Goat Spawn Egg",gold_block:"Block of Gold",gold_ingot:"Gold Ingot",gold_nugget:"Gold Nugget",gold_ore:"Gold Ore",golden_apple:"Golden Apple",golden_axe:"Golden Axe",golden_boots:"Golden Boots",golden_carrot:"Golden Carrot",golden_chestplate:"Golden Chestplate",golden_helmet:"Golden Helmet",golden_hoe:"Golden Hoe",golden_horse_armor:"Golden Horse Armor",golden_leggings:"Golden Leggings",golden_pickaxe:"Golden Pickaxe",golden_rail:"Powered Rail",golden_shovel:"Golden Shovel",golden_sword:"Golden Sword",granite_stairs:"Granite Stairs",grass:"Grass Block",grass_path:"Dirt Path",gravel:"Gravel",gray_candle:"Gray Candle",gray_candle_cake:"Cake with Gray Candle",gray_carpet:"Gray Carpet",gray_concrete:"Gray Concrete",gray_dye:"Gray Dye",gray_glazed_terracotta:"Gray Glazed Terracotta",gray_shulker_box:"Gray Shulker Box",gray_wool:"Gray Wool",green_candle:"Green Candle",green_candle_cake:"Cake with Green Candle",green_carpet:"Green Carpet",green_concrete:"Green Concrete",green_dye:"Green Dye",green_glazed_terracotta:"Green Glazed Terracotta",green_shulker_box:"Green Shulker Box",green_wool:"Green Wool",grindstone:"Grindstone",guardian_spawn_egg:"Guardian Spawn Egg",gunpowder:"Gunpowder",hanging_roots:"Hanging Roots",hard_glass:"Hard Glass",hard_glass_pane:"Hard Glass Pane",hard_stained_glass:"Hard Stained Glass",hard_stained_glass_pane:"Hard Stained Glass Pane",hardened_clay:"Terracotta",hay_block:"Hay Bale",heart_of_the_sea:"Heart of the Sea",heart_pottery_sherd:"Heart Pottery Sherd",heartbreak_pottery_sherd:"Heartbreak Pottery Sherd",heavy_weighted_pressure_plate:"Weighted Pressure Plate (Heavy)",hoglin_spawn_egg:"Hoglin Spawn Egg",honey_block:"Honey Block",honey_bottle:"Honey Bottle",honeycomb:"Honeycomb",honeycomb_block:"Honeycomb Block",hopper:"Hopper",hopper_minecart:"Minecart with Hopper",horn_coral:"Horn Coral",horse_spawn_egg:"Horse Spawn Egg",host_armor_trim_smithing_template:"Host Armor Trim Smithing Template",howl_pottery_sherd:"Howl Pottery Sherd",husk_spawn_egg:"Husk Spawn Egg",ice:"Ice",ice_bomb:"Ice Bomb",infested_deepslate:"Infested Deepslate",ink_sac:"Ink Sac",iron_axe:"Iron Axe",iron_bars:"Iron Bars",iron_block:"Block of Iron",iron_boots:"Iron Boots",iron_chestplate:"Iron Chestplate",iron_door:"Iron Door",iron_golem_spawn_egg:"Iron Golem Spawn Egg",iron_helmet:"Iron Helmet",iron_hoe:"Iron Hoe",iron_horse_armor:"Iron Horse Armor",iron_ingot:"Iron Ingot",iron_leggings:"Iron Leggings",iron_nugget:"Iron Nugget",iron_ore:"Iron Ore",iron_pickaxe:"Iron Pickaxe",iron_shovel:"Iron Shovel",iron_sword:"Iron Sword",iron_trapdoor:"Iron Trapdoor",jigsaw:"Jigsaw Block",jukebox:"Jukebox",jungle_boat:"Jungle Boat",jungle_button:"Jungle Button",jungle_chest_boat:"Jungle Chest Boat",jungle_door:"Jungle Door",jungle_fence:"Jungle Fence",jungle_fence_gate:"Jungle Fence Gate",jungle_hanging_sign:"Jungle Hanging Sign",jungle_log:"Jungle Log",jungle_pressure_plate:"Jungle Pressure Plate",jungle_sign:"Jungle Sign",jungle_stairs:"Jungle Stairs",jungle_trapdoor:"Jungle Trapdoor",kelp:"Kelp",ladder:"Ladder",lantern:"Lantern",lapis_block:"Block of Lapis Lazuli",lapis_lazuli:"Lapis Lazuli",lapis_ore:"Lapis Lazuli Ore",large_amethyst_bud:"Large Amethyst Bud",lava:"Lava",lava_bucket:"Lava Bucket",lead:"Lead",leather:"Leather",leather_boots:"Leather Boots",leather_chestplate:"Leather Tunic",leather_helmet:"Leather Cap",leather_horse_armor:"Leather Horse Armor",leather_leggings:"Leather Pants",leaves:"Leaves",lectern:"Lectern",lever:"Lever",light_block:"Light Block",light_blue_candle:"Light Blue Candle",light_blue_candle_cake:"Cake with Light Blue Candle",light_blue_carpet:"Light Blue Carpet",light_blue_concrete:"Light Blue Concrete",light_blue_dye:"Light Blue Dye",light_blue_glazed_terracotta:"Light Blue Glazed Terracotta",light_blue_shulker_box:"Light Blue Shulker Box",light_blue_wool:"Light Blue Wool",light_gray_candle:"Light Gray Candle",light_gray_candle_cake:"Cake with Light Gray Candle",light_gray_carpet:"Light Gray Carpet",light_gray_concrete:"Light Gray Concrete",light_gray_dye:"Light Gray Dye",light_gray_shulker_box:"Light Gray Shulker Box",light_gray_wool:"Light Gray Wool",light_weighted_pressure_plate:"Weighted Pressure Plate (Light)",lightning_rod:"Lightning Rod",lime_candle:"Lime Candle",lime_candle_cake:"Cake with Lime Candle",lime_carpet:"Lime Carpet",lime_concrete:"Lime Concrete",lime_dye:"Lime Dye",lime_glazed_terracotta:"Lime Glazed Terracotta",lime_shulker_box:"Lime Shulker Box",lime_wool:"Lime Wool",lingering_potion:"Lingering Potion",lit_blast_furnace:"Lit Blast Furnace",lit_deepslate_redstone_ore:"Lit Deepslate Redstone Ore",lit_furnace:"Lit Furnace",lit_pumpkin:"Jack o'Lantern",lit_redstone_lamp:"Lit Redstone Lamp",lit_redstone_ore:"Lit Redstone Ore",lit_smoker:"Lit Smoker",llama_spawn_egg:"Llama Spawn Egg",lodestone:"Lodestone",lodestone_compass:"Lodestone Compass",log:"Log",loom:"Loom",magenta_candle:"Magenta Candle",magenta_candle_cake:"Cake with Magenta Candle",magenta_carpet:"Magenta Carpet",magenta_concrete:"Magenta Concrete",magenta_dye:"Magenta Dye",magenta_glazed_terracotta:"Magenta Glazed Terracotta",magenta_shulker_box:"Magenta Shulker Box",magenta_wool:"Magenta Wool",magma:"Magma Block",magma_cream:"Magma Cream",magma_cube_spawn_egg:"Magma Cube Spawn Egg",mangrove_boat:"Mangrove Boat",mangrove_button:"Mangrove Button",mangrove_chest_boat:"Mangrove Chest Boat",mangrove_door:"Mangrove Door",mangrove_double_slab:"Mangrove Double Slab",mangrove_fence:"Mangrove Fence",mangrove_fence_gate:"Mangrove Fence Gate",mangrove_hanging_sign:"Mangrove Hanging Sign",mangrove_leaves:"Mangrove Leaves",mangrove_log:"Mangrove Log",mangrove_planks:"Mangrove Planks",mangrove_pressure_plate:"Mangrove Pressure Plate",mangrove_propagule:"Mangrove Propagule",mangrove_roots:"Mangrove Roots",mangrove_sign:"Mangrove Sign",mangrove_slab:"Mangrove Slab",mangrove_stairs:"Mangrove Stairs",mangrove_trapdoor:"Mangrove Trapdoor",mangrove_wood:"Mangrove Wood",medicine:"Medicine",medium_amethyst_bud:"Medium Amethyst Bud",melon_block:"Melon",melon_seeds:"Melon Seeds",melon_slice:"Melon Slice",melon_stem:"Melon Stem",milk_bucket:"Milk Bucket",minecart:"Minecart",miner_pottery_sherd:"Miner Pottery Sherd",mob_spawner:"Monster Spawner",mojang_banner_pattern:"Mojang Banner Pattern",monster_egg:"Infested Stone",mooshroom_spawn_egg:"Mooshroom Spawn Egg",moss_block:"Moss Block",moss_carpet:"Moss Carpet",mossy_cobblestone:"Mossy Cobblestone",mossy_cobblestone_stairs:"Mossy Cobblestone Stairs",mossy_stone_brick_stairs:"Mossy Stone Brick Stairs",mourner_pottery_sherd:"Mourner Pottery Sherd",moving_block:"Moving Block",mud:"Mud",mud_brick_double_slab:"Mud Brick Double Slab",mud_brick_slab:"Mud Brick Slab",mud_brick_stairs:"Mud Brick Stairs",mud_brick_wall:"Mud Brick Wall",mud_bricks:"Mud Bricks",muddy_mangrove_roots:"Muddy Mangrove Roots",mule_spawn_egg:"Mule Spawn Egg",mushroom_stew:"Mushroom Stew",music_disc_11:"Music Disc 11",music_disc_13:"Music Disc 13",music_disc_5:"Music Disc 5",music_disc_blocks:"Music Disc Blocks",music_disc_cat:"Music Disc Cat",music_disc_chirp:"Music Disc Chirp",music_disc_far:"Music Disc Far",music_disc_mall:"Music Disc Mall",music_disc_mellohi:"Music Disc Mellohi",music_disc_otherside:"Music Disc Otherside",music_disc_pigstep:"Music Disc Pigstep",music_disc_relic:"Music Disc Relic",music_disc_stal:"Music Disc Stal",music_disc_strad:"Music Disc Strad",music_disc_wait:"Music Disc Wait",music_disc_ward:"Music Disc Ward",mutton:"Mutton",mycelium:"Mycelium",name_tag:"Name Tag",nautilus_shell:"Nautilus Shell",nether_brick:"Nether Brick Block",nether_brick_fence:"Nether Brick Fence",nether_brick_stairs:"Nether Brick Stairs",nether_gold_ore:"Nether Gold Ore",nether_sprouts:"Nether Sprouts",nether_star:"Nether Star",nether_wart:"Nether Wart",nether_wart_block:"Nether Wart Block",netherbrick:"Nether Brick",netherite_axe:"Netherite Axe",netherite_block:"Block of Netherite",netherite_boots:"Netherite Boots",netherite_chestplate:"Netherite Chestplate",netherite_helmet:"Netherite Helmet",netherite_hoe:"Netherite Hoe",netherite_ingot:"Netherite Ingot",netherite_leggings:"Netherite Leggings",netherite_pickaxe:"Netherite Pickaxe",netherite_scrap:"Netherite Scrap",netherite_shovel:"Netherite Shovel",netherite_sword:"Netherite Sword",netherite_upgrade_smithing_template:"Netherite Upgrade Smithing Template",netherrack:"Netherrack",netherreactor:"Nether Reactor Core",normal_stone_stairs:"Stone Stairs",noteblock:"Note Block",npc_spawn_egg:"Npc Spawn Egg",oak_boat:"Oak Boat",oak_chest_boat:"Oak Chest Boat",oak_fence:"Oak Fence",oak_hanging_sign:"Oak Hanging Sign",oak_log:"Oak Log",oak_sign:"Oak Sign",oak_stairs:"Oak Stairs",observer:"Observer",obsidian:"Obsidian",ocelot_spawn_egg:"Ocelot Spawn Egg",ochre_froglight:"Ochre Froglight",orange_candle:"Orange Candle",orange_candle_cake:"Cake with Orange Candle",orange_carpet:"Orange Carpet",orange_concrete:"Orange Concrete",orange_dye:"Orange Dye",orange_glazed_terracotta:"Orange Glazed Terracotta",orange_shulker_box:"Orange Shulker Box",orange_wool:"Orange Wool",oxidized_copper:"Oxidized Copper",oxidized_cut_copper:"Oxidized Cut Copper",oxidized_cut_copper_slab:"Oxidized Cut Copper Slab",oxidized_cut_copper_stairs:"Oxidized Cut Copper Stairs",oxidized_double_cut_copper_slab:"Oxidized Double Cut Copper Slab",packed_ice:"Packed Ice",packed_mud:"Packed Mud",painting:"Painting",panda_spawn_egg:"Panda Spawn Egg",paper:"Paper",parrot_spawn_egg:"Parrot Spawn Egg",pearlescent_froglight:"Pearlescent Froglight",phantom_membrane:"Phantom Membrane",phantom_spawn_egg:"Phantom Spawn Egg",pig_spawn_egg:"Pig Spawn Egg",piglin_banner_pattern:"Piglin Banner Pattern",piglin_brute_spawn_egg:"Piglin Brute Spawn Egg",piglin_spawn_egg:"Piglin Spawn Egg",pillager_spawn_egg:"Pillager Spawn Egg",pink_candle:"Pink Candle",pink_candle_cake:"Cake with Pink Candle",pink_carpet:"Pink Carpet",pink_concrete:"Pink Concrete",pink_dye:"Pink Dye",pink_glazed_terracotta:"Pink Glazed Terracotta",pink_petals:"Pink Petals",pink_shulker_box:"Pink Shulker Box",pink_wool:"Pink Wool",piston:"Piston",pitcher_crop:"Pitcher Crop",pitcher_plant:"Pitcher Plant",pitcher_pod:"Pitcher Pod",planks:"Wooden Planks",plenty_pottery_sherd:"Plenty Pottery Sherd",podzol:"Podzol",pointed_dripstone:"Pointed Dripstone",poisonous_potato:"Poisonous Potato",polar_bear_spawn_egg:"Polar Bear Spawn Egg",polished_andesite_stairs:"Polished Andesite Stairs",polished_basalt:"Polished Basalt",polished_blackstone:"Polished Blackstone",polished_blackstone_brick_double_slab:"Polished Blackstone Brick Double Slab",polished_blackstone_brick_slab:"Polished Blackstone Brick Slab",polished_blackstone_brick_stairs:"Polished Blackstone Brick Stairs",polished_blackstone_brick_wall:"Polished Blackstone Brick Wall",polished_blackstone_bricks:"Polished Blackstone Bricks",polished_blackstone_button:"Polished Blackstone Button",polished_blackstone_double_slab:"Polished Blackstone Double Slab",polished_blackstone_pressure_plate:"Polished Blackstone Pressure Plate",polished_blackstone_slab:"Polished Blackstone Slab",polished_blackstone_stairs:"Polished Blackstone Stairs",polished_blackstone_wall:"Polished Blackstone Wall",polished_deepslate:"Polished Deepslate",polished_deepslate_double_slab:"Polished Deepslate Double Slab",polished_deepslate_slab:"Polished Deepslate Slab",polished_deepslate_stairs:"Polished Deepslate Stairs",polished_deepslate_wall:"Polished Deepslate Wall",polished_diorite_stairs:"Polished Diorite Stairs",polished_granite_stairs:"Polished Granite Stairs",popped_chorus_fruit:"Popped Chorus Fruit",porkchop:"Raw Porkchop",portal:"Portal",potato:"Potato",potion:"Potion",powder_snow:"Powder Snow",powder_snow_bucket:"Powder Snow Bucket",powered_comparator:"Powered Comparator",powered_repeater:"Powered Repeater",prismarine:"Prismarine",prismarine_bricks_stairs:"Prismarine Brick Stairs",prismarine_crystals:"Prismarine Crystals",prismarine_shard:"Prismarine Shard",prismarine_stairs:"Prismarine Stairs",prize_pottery_sherd:"Prize Pottery Sherd",pufferfish:"Pufferfish",pufferfish_bucket:"Pufferfish Bucket",pufferfish_spawn_egg:"Pufferfish Spawn Egg",pumpkin:"Pumpkin",pumpkin_pie:"Pumpkin Pie",pumpkin_seeds:"Pumpkin Seeds",pumpkin_stem:"Pumpkin Stem",purple_candle:"Purple Candle",purple_candle_cake:"Cake with Purple Candle",purple_carpet:"Purple Carpet",purple_concrete:"Purple Concrete",purple_dye:"Purple Dye",purple_glazed_terracotta:"Purple Glazed Terracotta",purple_shulker_box:"Purple Shulker Box",purple_wool:"Purple Wool",purpur_block:"Purpur Block",purpur_stairs:"Purpur Stairs",quartz:"Nether Quartz",quartz_block:"Block of Quartz",quartz_bricks:"Quartz Bricks",quartz_ore:"Nether Quartz Ore",quartz_stairs:"Quartz Stairs",rabbit:"Raw Rabbit",rabbit_foot:"Rabbit's Foot",rabbit_hide:"Rabbit Hide",rabbit_spawn_egg:"Rabbit Spawn Egg",rabbit_stew:"Rabbit Stew",rail:"Rail",raiser_armor_trim_smithing_template:"Raiser Armor Trim Smithing Template",rapid_fertilizer:"Rapid Fertilizer",ravager_spawn_egg:"Ravager Spawn Egg",raw_copper:"Raw Copper",raw_copper_block:"Block of Raw Copper",raw_gold:"Raw Gold",raw_gold_block:"Block of Raw Gold",raw_iron:"Raw Iron",raw_iron_block:"Block of Raw Iron",recovery_compass:"Recovery Compass",red_candle:"Red Candle",red_candle_cake:"Cake with Red Candle",red_carpet:"Red Carpet",red_concrete:"Red Concrete",red_dye:"Red Dye",red_flower:"Flower",red_glazed_terracotta:"Red Glazed Terracotta",red_mushroom:"Red Mushroom",red_mushroom_block:"Red Mushroom Block",red_nether_brick:"Red Nether Brick",red_nether_brick_stairs:"Red Nether Brick Stairs",red_sandstone:"Red Sandstone",red_sandstone_stairs:"Red Sandstone Stairs",red_shulker_box:"Red Shulker Box",red_wool:"Red Wool",redstone:"Redstone Dust",redstone_block:"Block of Redstone",redstone_lamp:"Redstone Lamp",redstone_ore:"Redstone Ore",redstone_torch:"Redstone Torch",redstone_wire:"Redstone Dust",reinforced_deepslate:"Reinforced Deepslate",repeater:"Redstone Repeater",repeating_command_block:"Repeating Command Block",reserved6:"Reserved6",respawn_anchor:"Respawn Anchor",rib_armor_trim_smithing_template:"Rib Armor Trim Smithing Template",rotten_flesh:"Rotten Flesh",saddle:"Saddle",salmon:"Raw Salmon",salmon_bucket:"Salmon Bucket",salmon_spawn_egg:"Salmon Spawn Egg",sand:"Sand",sandstone:"Sandstone",sandstone_stairs:"Sandstone Stairs",sapling:"Sapling",scaffolding:"Scaffolding",sculk:"Sculk",sculk_catalyst:"Sculk Catalyst",sculk_sensor:"Sculk Sensor",sculk_shrieker:"Sculk Shrieker",sculk_vein:"Sculk Vein",scute:"Scute",sea_lantern:"Sea Lantern",sea_pickle:"Sea Pickle",seagrass:"Seagrass",sentry_armor_trim_smithing_template:"Sentry Armor Trim Smithing Template",shaper_armor_trim_smithing_template:"Shaper Armor Trim Smithing Template",sheaf_pottery_sherd:"Sheaf Pottery Sherd",shears:"Shears",sheep_spawn_egg:"Sheep Spawn Egg",shelter_pottery_sherd:"Shelter Pottery Sherd",shield:"Shield",shroomlight:"Shroomlight",shulker_box:"Shulker Box",shulker_shell:"Shulker Shell",shulker_spawn_egg:"Shulker Spawn Egg",silence_armor_trim_smithing_template:"Silence Armor Trim Smithing Template",silver_glazed_terracotta:"Silver Glazed Terracotta",silverfish_spawn_egg:"Silverfish Spawn Egg",skeleton_horse_spawn_egg:"Skeleton Horse Spawn Egg",skeleton_spawn_egg:"Skeleton Spawn Egg",skull:"Skull",skull_banner_pattern:"Skull Banner Pattern",skull_pottery_sherd:"Skull Pottery Sherd",slime:"Slime Block",slime_ball:"Slimeball",slime_spawn_egg:"Slime Spawn Egg",small_amethyst_bud:"Small Amethyst Bud",small_dripleaf_block:"Small Dripleaf",smithing_table:"Smithing Table",smoker:"Smoker",smooth_basalt:"Smooth Basalt",smooth_quartz_stairs:"Smooth Quartz Stairs",smooth_red_sandstone_stairs:"Smooth Red Sandstone Stairs",smooth_sandstone_stairs:"Smooth Sandstone Stairs",smooth_stone:"Smooth Stone",sniffer_egg:"Sniffer Egg",sniffer_spawn_egg:"Sniffer Spawn Egg",snort_pottery_sherd:"Snort Pottery Sherd",snout_armor_trim_smithing_template:"Snout Armor Trim Smithing Template",snow:"Snow",snow_golem_spawn_egg:"Snow Golem Spawn Egg",snow_layer:"Top Snow",snowball:"Snowball",soul_campfire:"Soul Campfire",soul_fire:"Soul Fire",soul_lantern:"Soul Lantern",soul_sand:"Soul Sand",soul_soil:"Soul Soil",soul_torch:"Soul Torch",sparkler:"Sparkler",spawn_egg:"Spawn Egg",spider_eye:"Spider Eye",spider_spawn_egg:"Spider Spawn Egg",spire_armor_trim_smithing_template:"Spire Armor Trim Smithing Template",splash_potion:"Splash Potion",sponge:"Sponge",spore_blossom:"Spore Blossom",spruce_boat:"Spruce Boat",spruce_button:"Spruce Button",spruce_chest_boat:"Spruce Chest Boat",spruce_door:"Spruce Door",spruce_fence:"Spruce Fence",spruce_fence_gate:"Spruce Fence Gate",spruce_hanging_sign:"Spruce Hanging Sign",spruce_log:"Spruce Log",spruce_pressure_plate:"Spruce Pressure Plate",spruce_sign:"Spruce Sign",spruce_stairs:"Spruce Stairs",spruce_trapdoor:"Spruce Trapdoor",spyglass:"Spyglass",squid_spawn_egg:"Squid Spawn Egg",stained_glass:"Stained Glass",stained_glass_pane:"Stained Glass Pane",stained_hardened_clay:"Terracotta",standing_banner:"Banner",standing_sign:"Sign",stick:"Stick",sticky_piston:"Sticky Piston",stone:"Stone",stone_axe:"Stone Axe",stone_block_slab:"Stone Block Slab",stone_brick_stairs:"Stone Brick Stairs",stone_button:"Stone Button",stone_hoe:"Stone Hoe",stone_pickaxe:"Stone Pickaxe",stone_pressure_plate:"Stone Pressure Plate",stone_shovel:"Stone Shovel",stone_stairs:"Cobblestone Stairs",stone_sword:"Stone Sword",stonebrick:"Stone Bricks",stonecutter:"Stonecutter",stonecutter_block:"Stonecutter",stray_spawn_egg:"Stray Spawn Egg",strider_spawn_egg:"Strider Spawn Egg",stripped_acacia_log:"Stripped Acacia Log",stripped_bamboo_block:"Block of Stripped Bamboo",stripped_birch_log:"Stripped Birch Log",stripped_cherry_log:"Stripped Cherry Log",stripped_cherry_wood:"Stripped Cherry Wood",stripped_crimson_hyphae:"Stripped Crimson Hyphae",stripped_crimson_stem:"Stripped Crimson Stem",stripped_dark_oak_log:"Stripped Dark Oak Log",stripped_jungle_log:"Stripped Jungle Log",stripped_mangrove_log:"Stripped Mangrove Log",stripped_mangrove_wood:"Stripped Mangrove Wood",stripped_oak_log:"Stripped Oak Log",stripped_spruce_log:"Stripped Spruce Log",stripped_warped_hyphae:"Stripped Warped Hyphae",stripped_warped_stem:"Stripped Warped Stem",structure_block:"Structure Block",structure_void:"Structure Void",sugar:"Sugar",sugar_cane:"Sugar Cane",suspicious_gravel:"Suspicious Gravel",suspicious_sand:"Suspicious Sand",suspicious_stew:"Suspicious Stew",sweet_berries:"Sweet Berries",sweet_berry_bush:"Sweet Berry Bush",tadpole_bucket:"Tadpole Bucket",tadpole_spawn_egg:"Tadpole Spawn Egg",tallgrass:"Grass",target:"Target",tide_armor_trim_smithing_template:"Tide Armor Trim Smithing Template",tinted_glass:"Tinted Glass",tnt:"TNT",tnt_minecart:"Minecart with TNT",torch:"Torch",torchflower:"Torchflower",torchflower_crop:"Torchflower Crop",torchflower_seeds:"Torchflower Seeds",totem_of_undying:"Totem Of Undying",trader_llama_spawn_egg:"Trader Llama Spawn Egg",trapdoor:"Oak Trapdoor",trapped_chest:"Trapped Chest",trident:"Trident",trip_wire:"Trip Wire",tripwire_hook:"Tripwire Hook",tropical_fish:"Tropical Fish",tropical_fish_bucket:"Tropical Fish Bucket",tropical_fish_spawn_egg:"Tropical Fish Spawn Egg",tube_coral:"Tube Coral",tuff:"Tuff",turtle_egg:"Sea Turtle Egg",turtle_helmet:"Turtle Shell",turtle_spawn_egg:"Turtle Spawn Egg",twisting_vines:"Twisting Vines",underwater_torch:"Underwater Torch",undyed_shulker_box:"Undyed Shulker Box",unknown:"Unknown",unlit_redstone_torch:"Redstone Torch",unpowered_comparator:"Unpowered Comparator",unpowered_repeater:"Unpowered Repeater",verdant_froglight:"Verdant Froglight",vex_armor_trim_smithing_template:"Vex Armor Trim Smithing Template",vex_spawn_egg:"Vex Spawn Egg",villager_spawn_egg:"Villager Spawn Egg",vindicator_spawn_egg:"Vindicator Spawn Egg",vine:"Vines",wall_banner:"Wall Banner",wandering_trader_spawn_egg:"Wandering Trader Spawn Egg",ward_armor_trim_smithing_template:"Ward Armor Trim Smithing Template",warden_spawn_egg:"Warden Spawn Egg",warped_button:"Warped Button",warped_door:"Warped Door",warped_double_slab:"Warped Slab",warped_fence:"Warped Fence",warped_fence_gate:"Warped Fence Gate",warped_fungus:"Warped Fungus",warped_fungus_on_a_stick:"Warped Fungus on a Stick",warped_hanging_sign:"Warped Hanging Sign",warped_hyphae:"Warped Hyphae",warped_nylium:"Warped Nylium",warped_planks:"Warped Planks",warped_pressure_plate:"Warped Pressure Plate",warped_roots:"Warped Roots",warped_sign:"Warped Sign",warped_slab:"Warped Slab",warped_stairs:"Warped Stairs",warped_stem:"Warped Stem",warped_trapdoor:"Warped Trapdoor",warped_wart_block:"Warped Wart Block",water:"Water",water_bucket:"Water Bucket",waterlily:"Lily Pad",waxed_copper:"Waxed Block of Copper",waxed_cut_copper:"Waxed Cut Copper",waxed_cut_copper_slab:"Waxed Cut Copper Slab",waxed_cut_copper_stairs:"Waxed Cut Copper Stairs",waxed_double_cut_copper_slab:"Waxed Double Cut Copper Slab",waxed_exposed_copper:"Waxed Exposed Copper",waxed_exposed_cut_copper:"Waxed Exposed Cut Copper",waxed_exposed_cut_copper_slab:"Waxed Exposed Cut Copper Slab",waxed_exposed_cut_copper_stairs:"Waxed Exposed Cut Copper Stairs",waxed_exposed_double_cut_copper_slab:"Waxed Exposed Double Cut Copper Slab",waxed_oxidized_copper:"Waxed Oxidized Copper",waxed_oxidized_cut_copper:"Waxed Oxidized Cut Copper",waxed_oxidized_cut_copper_slab:"Waxed Oxidized Cut Copper Slab",waxed_oxidized_cut_copper_stairs:"Waxed Oxidized Cut Copper Stairs",waxed_oxidized_double_cut_copper_slab:"Waxed Oxidized Double Cut Copper Slab",waxed_weathered_copper:"Waxed Weathered Copper",waxed_weathered_cut_copper:"Waxed Weathered Cut Copper",waxed_weathered_cut_copper_slab:"Waxed Weathered Cut Copper Slab",waxed_weathered_cut_copper_stairs:"Waxed Weathered Cut Copper Stairs",waxed_weathered_double_cut_copper_slab:"Waxed Weathered Double Cut Copper Slab",wayfinder_armor_trim_smithing_template:"Wayfinder Armor Trim Smithing Template",weathered_copper:"Weathered Copper",weathered_cut_copper:"Weathered Cut Copper",weathered_cut_copper_slab:"Weathered Cut Copper Slab",weathered_cut_copper_stairs:"Weathered Cut Copper Stairs",weathered_double_cut_copper_slab:"Weathered Double Cut Copper Slab",web:"Cobweb",weeping_vines:"Weeping Vines",wheat:"Wheat",wheat_seeds:"Seeds",white_candle:"White Candle",white_candle_cake:"Cake with White Candle",white_carpet:"White Carpet",white_concrete:"White Concrete",white_dye:"White Dye",white_glazed_terracotta:"White Glazed Terracotta",white_shulker_box:"White Shulker Box",white_wool:"White Wool",wild_armor_trim_smithing_template:"Wild Armor Trim Smithing Template",witch_spawn_egg:"Witch Spawn Egg",wither_rose:"Wither Rose",wither_skeleton_spawn_egg:"Wither Skeleton Spawn Egg",wither_spawn_egg:"Wither Spawn Egg",wolf_spawn_egg:"Wolf Spawn Egg",wood:"Wood",wooden_axe:"Wooden Axe",wooden_button:"Oak Button",wooden_door:"Oak Door",wooden_hoe:"Wooden Hoe",wooden_pickaxe:"Wooden Pickaxe",wooden_pressure_plate:"Oak Pressure Plate",wooden_shovel:"Wooden Shovel",wooden_slab:"Wood Slab",wooden_sword:"Wooden Sword",wool:"Wool",writable_book:"Book & Quill",written_book:"Written Book",yellow_candle:"Yellow Candle",yellow_candle_cake:"Cake with Yellow Candle",yellow_carpet:"Yellow Carpet",yellow_concrete:"Yellow Concrete",yellow_dye:"Yellow Dye",yellow_flower:"Flower",yellow_glazed_terracotta:"Yellow Glazed Terracotta",yellow_shulker_box:"Yellow Shulker Box",yellow_wool:"Yellow Wool",zoglin_spawn_egg:"Zoglin Spawn Egg",zombie_horse_spawn_egg:"Zombie Horse Spawn Egg",zombie_pigman_spawn_egg:"Zombie Pigman Spawn Egg",zombie_spawn_egg:"Zombie Spawn Egg",zombie_villager_spawn_egg:"Zombie Villager Spawn Egg"};var u=r({name:"loot-editor",props:{form:Object},data:()=>({item_ids:g}),methods:{addPool(){this.form.custom_loot.forEachReverse((e=>{0!=e.max&&""!=e.id||this.form.custom_loot.remove(e)}));let e={uuid:guid(),rolls:1,entries:[]};this.form.custom_loot.push(e),this.addItem(e)},addItem(e){e.entries.forEachReverse((t=>{0!=t.max&&""!=t.id||e.entries.remove(t)}));let t={type:"empty",custom_id:"",uuid:guid(),count_min:1,count_max:1,weight:1};e.entries.push(t)},getItemIcon(e){if(!(e=e.replace(/^minecraft:/,"")).includes(":")&&g[e])return`https://raw.githubusercontent.com/Mojang/bedrock-samples/main/resource_pack/textures/items/${e}.png`}}},p,[function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("section",[o("p",{staticClass:"description"},[e._v("Select which items the block will drop when broken in survival mode")])])}],!1,(function(e){var t=o(410);t.__inject__&&t.__inject__(e)}),null,"95345396");u.options.__file="src/dialog/LootEditor.vue";const b=u.exports;var h=o(908);const f={installed:!1,initialized:!1,icon:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJub25lIj4NCjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xODEuNTM0IDI1NC4yNTJDMTg1LjU2NiAyNTUuODIzIDE5MC4xNjQgMjU1LjcyMiAxOTQuMjM0IDI1My43NjRMMjQ2Ljk0IDIyOC40MDNDMjUyLjQ3OCAyMjUuNzM4IDI1NiAyMjAuMTMyIDI1NiAyMTMuOTgzVjQyLjAxODFDMjU2IDM1Ljg2ODkgMjUyLjQ3OCAzMC4yNjM4IDI0Ni45NCAyNy41OTg4TDE5NC4yMzQgMi4yMzY4MUMxODguODkzIC0wLjMzMzEzMiAxODIuNjQyIDAuMjk2MzQ0IDE3Ny45NTUgMy43MDQxOEMxNzcuMjg1IDQuMTkxIDE3Ni42NDcgNC43MzQ1NCAxNzYuMDQ5IDUuMzMzNTRMNzUuMTQ5IDk3LjM4NjJMMzEuMTk5MiA2NC4wMjQ3QzI3LjEwNzkgNjAuOTE5MSAyMS4zODUzIDYxLjE3MzUgMTcuNTg1NSA2NC42M0wzLjQ4OTM2IDc3LjQ1MjVDLTEuMTU4NTMgODEuNjgwNSAtMS4xNjM4NiA4OC45OTI2IDMuNDc3ODUgOTMuMjI3NEw0MS41OTI2IDEyOEwzLjQ3Nzg1IDE2Mi43NzNDLTEuMTYzODYgMTY3LjAwOCAtMS4xNTg1MyAxNzQuMzIgMy40ODkzNiAxNzguNTQ4TDE3LjU4NTUgMTkxLjM3QzIxLjM4NTMgMTk0LjgyNyAyNy4xMDc5IDE5NS4wODEgMzEuMTk5MiAxOTEuOTc2TDc1LjE0OSAxNTguNjE0TDE3Ni4wNDkgMjUwLjY2N0MxNzcuNjQ1IDI1Mi4yNjQgMTc5LjUxOSAyNTMuNDY3IDE4MS41MzQgMjU0LjI1MlpNMTkyLjAzOSA2OS44ODUzTDExNS40NzkgMTI4TDE5Mi4wMzkgMTg2LjExNVY2OS44ODUzWiIgZmlsbD0id2hpdGUiLz4NCjwvbWFzaz4NCjxnIG1hc2s9InVybCgjbWFzazApIj4NCjxwYXRoIGQ9Ik0yNDYuOTQgMjcuNjM4M0wxOTQuMTkzIDIuMjQxMzhDMTg4LjA4OCAtMC42OTgzMDIgMTgwLjc5MSAwLjU0MTcyMSAxNzUuOTk5IDUuMzMzMzJMMy4zMjM3MSAxNjIuNzczQy0xLjMyMDgyIDE2Ny4wMDggLTEuMzE1NDggMTc0LjMyIDMuMzM1MjMgMTc4LjU0OEwxNy40Mzk5IDE5MS4zN0MyMS4yNDIxIDE5NC44MjcgMjYuOTY4MiAxOTUuMDgxIDMxLjA2MTkgMTkxLjk3NkwyMzkuMDAzIDM0LjIyNjlDMjQ1Ljk3OSAyOC45MzQ3IDI1NS45OTkgMzMuOTEwMyAyNTUuOTk5IDQyLjY2NjdWNDIuMDU0M0MyNTUuOTk5IDM1LjkwNzggMjUyLjQ3OCAzMC4zMDQ3IDI0Ni45NCAyNy42MzgzWiIgZmlsbD0iIzAwNjVBOSIvPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPg0KPHBhdGggZD0iTTI0Ni45NCAyMjguMzYyTDE5NC4xOTMgMjUzLjc1OUMxODguMDg4IDI1Ni42OTggMTgwLjc5MSAyNTUuNDU4IDE3NS45OTkgMjUwLjY2N0wzLjMyMzcxIDkzLjIyNzJDLTEuMzIwODIgODguOTkyNSAtMS4zMTU0OCA4MS42ODAyIDMuMzM1MjMgNzcuNDUyM0wxNy40Mzk5IDY0LjYyOThDMjEuMjQyMSA2MS4xNzMzIDI2Ljk2ODIgNjAuOTE4OCAzMS4wNjE5IDY0LjAyNDVMMjM5LjAwMyAyMjEuNzczQzI0NS45NzkgMjI3LjA2NSAyNTUuOTk5IDIyMi4wOSAyNTUuOTk5IDIxMy4zMzNWMjEzLjk0NkMyNTUuOTk5IDIyMC4wOTIgMjUyLjQ3OCAyMjUuNjk1IDI0Ni45NCAyMjguMzYyWiIgZmlsbD0iIzAwN0FDQyIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZCkiPg0KPHBhdGggZD0iTTE5NC4xOTYgMjUzLjc2M0MxODguMDg5IDI1Ni43IDE4MC43OTIgMjU1LjQ1OSAxNzYgMjUwLjY2N0MxODEuOTA0IDI1Ni41NzEgMTkyIDI1Mi4zODkgMTkyIDI0NC4wMzlWMTEuOTYwNkMxOTIgMy42MTA1NyAxODEuOTA0IC0wLjU3MTE3NSAxNzYgNS4zMzMyMUMxODAuNzkyIDAuNTQxMTY2IDE4OC4wODkgLTAuNzAwNjA3IDE5NC4xOTYgMi4yMzY0OEwyNDYuOTM0IDI3LjU5ODVDMjUyLjQ3NiAzMC4yNjM1IDI1NiAzNS44Njg2IDI1NiA0Mi4wMTc4VjIxMy45ODNDMjU2IDIyMC4xMzIgMjUyLjQ3NiAyMjUuNzM3IDI0Ni45MzQgMjI4LjQwMkwxOTQuMTk2IDI1My43NjNaIiBmaWxsPSIjMUY5Q0YwIi8+DQo8L2c+DQo8ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6b3ZlcmxheSIgb3BhY2l0eT0iMC4yNSI+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS4zNzggMjU0LjI1MkMxODUuNDEgMjU1LjgyMiAxOTAuMDA4IDI1NS43MjIgMTk0LjA3NyAyNTMuNzY0TDI0Ni43ODMgMjI4LjQwMkMyNTIuMzIyIDIyNS43MzcgMjU1Ljg0NCAyMjAuMTMyIDI1NS44NDQgMjEzLjk4M1Y0Mi4wMTc5QzI1NS44NDQgMzUuODY4NyAyNTIuMzIyIDMwLjI2MzYgMjQ2Ljc4NCAyNy41OTg2TDE5NC4wNzcgMi4yMzY2NUMxODguNzM3IC0wLjMzMzI5OSAxODIuNDg2IDAuMjk2MTc3IDE3Ny43OTggMy43MDQwMUMxNzcuMTI5IDQuMTkwODMgMTc2LjQ5MSA0LjczNDM3IDE3NS44OTIgNS4zMzMzN0w3NC45OTI3IDk3LjM4NkwzMS4wNDI5IDY0LjAyNDVDMjYuOTUxNyA2MC45MTg5IDIxLjIyOSA2MS4xNzM0IDE3LjQyOTIgNjQuNjI5OEwzLjMzMzExIDc3LjQ1MjNDLTEuMzE0NzggODEuNjgwMyAtMS4zMjAxMSA4OC45OTI1IDMuMzIxNiA5My4yMjczTDQxLjQzNjQgMTI4TDMuMzIxNiAxNjIuNzczQy0xLjMyMDExIDE2Ny4wMDggLTEuMzE0NzggMTc0LjMyIDMuMzMzMTEgMTc4LjU0OEwxNy40MjkyIDE5MS4zN0MyMS4yMjkgMTk0LjgyNyAyNi45NTE3IDE5NS4wODEgMzEuMDQyOSAxOTEuOTc2TDc0Ljk5MjcgMTU4LjYxNEwxNzUuODkyIDI1MC42NjdDMTc3LjQ4OCAyNTIuMjY0IDE3OS4zNjMgMjUzLjQ2NyAxODEuMzc4IDI1NC4yNTJaTTE5MS44ODMgNjkuODg1MUwxMTUuMzIzIDEyOEwxOTEuODgzIDE4Ni4xMTVWNjkuODg1MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4NCjwvZz4NCjwvZz4NCjxkZWZzPg0KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSItMjEuNDg5NiIgeT0iNDAuNTIyNSIgd2lkdGg9IjI5OC44MjIiIGhlaWdodD0iMjM2LjE0OSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQvPg0KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPg0KPGZlQmxlbmQgbW9kZT0ib3ZlcmxheSIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2QiIHg9IjE1NC42NjciIHk9Ii0yMC42NzM1IiB3aWR0aD0iMTIyLjY2NyIgaGVpZ2h0PSIyOTcuMzQ3IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4NCjxmZU9mZnNldC8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMC42NjY3Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+DQo8L2ZpbHRlcj4NCjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjEyNy44NDQiIHkxPSIwLjY1OTk4OCIgeDI9IjEyNy44NDQiIHkyPSIyNTUuMzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8L2RlZnM+DQo8L3N2Zz4=",async open(e,t){if(!f.initialized){let e=o(317);await new Promise((t=>{e.exec("code --version").on("close",(o=>{o||(f.installed=!0,f.launch=(t,o)=>{let i=`code -n "${t}" "${o}"`;e.exec(i)},t())}))})),f.initialized=!0}f.launch(e,t)},launch(){Blockbench.openLink("https://code.visualstudio.com")}},v={name:"block-wizard-dialog",components:{Export:l,ColorPicker:m,LootEditor:b,"select-input":Vue.options.components["select-input"]},data:()=>({open_page:"metadata",block_break_texture:"data:image/png;base64,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",VSCode:f,pages:i,presets:h.A,edition_options:{bedrock:"Bedrock",preview:"Bedrock Preview",edu:"Education Edition"},inventory_categories:{hidden:"Hidden",construction:"Construction",equipment:"Equipment",items:"Items",nature:"Nature"},inventory_groups:{hidden:{none:"None"},construction:{none:"None","itemGroup.name.planks":"Planks","itemGroup.name.walls":"Walls","itemGroup.name.fence":"Fences","itemGroup.name.fenceGate":"Fence Gates","itemGroup.name.stairs":"Stairs","itemGroup.name.door":"Doors","itemGroup.name.glass":"Glass","itemGroup.name.glassPane":"Glass Panes","itemGroup.name.slab":"Slabs","itemGroup.name.stoneBrick":"Decorative Stone","itemGroup.name.sandstone":"Sandstone","itemGroup.name.wool":"Wool","itemGroup.name.woolCarpet":"Wool Carpet","itemGroup.name.concretePowder":"Concrete Powder","itemGroup.name.concrete":"Concrete","itemGroup.name.stainedClay":"Terracotta","itemGroup.name.glazedTerracotta":"Glazed Terracottas","itemGroup.name.permission":"Permission Blocks"},equipment:{none:"None","itemGroup.name.helmet":"Helmets","itemGroup.name.chestplate":"Chestplates","itemGroup.name.leggings":"Leggings","itemGroup.name.boots":"Boots","itemGroup.name.sword":"Swords","itemGroup.name.axe":"Axes","itemGroup.name.pickaxe":"Pickaxes","itemGroup.name.shovel":"Shovels","itemGroup.name.hoe":"Hoes","itemGroup.name.arrow":"Arrows","itemGroup.name.cookedFood":"Cooked Food","itemGroup.name.miscFood":"Miscellaneous Foods","itemGroup.name.goatHorn":"Goat Horns","itemGroup.name.horseArmor":"Horse Armor","itemGroup.name.potion":"Potions","itemGroup.name.splashPotion":"Splash Potions","itemGroup.name.lingeringPotion":"Lingering Potions"},items:{none:"None","itemGroup.name.bed":"Beds","itemGroup.name.candles":"Candles","itemGroup.name.anvil":"Anvils","itemGroup.name.chest":"Chests","itemGroup.name.shulkerBox":"Shulker Boxes","itemGroup.name.record":"Records","itemGroup.name.sign":"Signs","itemGroup.name.skull":"Mob Skulls","itemGroup.name.buttons":"Buttons","itemGroup.name.boat":"Boats","itemGroup.name.rail":"Rails","itemGroup.name.minecart":"Minecarts","itemGroup.name.pressurePlate":"Pressure Plates","itemGroup.name.trapdoor":"Trapdoors","itemGroup.name.enchantedBook":"Enchanted Books","itemGroup.name.banner_pattern":"Banner Patterns","itemGroup.name.banner":"Banners","itemGroup.name.firework":"Fireworks","itemGroup.name.fireworkStars":"Firework Charges","itemGroup.name.chalkboard":"Chalkboards"},nature:{none:"None","itemGroup.name.dye":"Dyes","itemGroup.name.ore":"Ores","itemGroup.name.stone":"Stone","itemGroup.name.log":"Logs","itemGroup.name.wood":"Woods","itemGroup.name.leaves":"Leaves","itemGroup.name.sapling":"Saplings","itemGroup.name.seed":"Seeds","itemGroup.name.crop":"Crops","itemGroup.name.grass":"Ground Cover","itemGroup.name.flower":"Flowers","itemGroup.name.rawFood":"Raw Food","itemGroup.name.mushroom":"Mushrooms","itemGroup.name.monsterStoneEgg":"Infested Stone","itemGroup.name.mobEgg":"Mob Eggs","itemGroup.name.coral":"Coral Blocks","itemGroup.name.coral_decorations":"Coral Decorations","itemGroup.name.sculk":"Sculk","itemGroup.name.netherWartBlock":"Nether Warts"}},block_materials:{alpha_test:"Allow Transparency (Alpha Test)",alpha_test_single_sided:"Allow Transparency, One-Sided",blend:"Allow Translucency (Blend)",opaque:"No Transparency (Opaque)"},tint_methods:{none:"None",water:"Water",grass:"Grass",default_foliage:"Default Foliage",dry_foliage:"Dry Foliage",birch_foliage:"Birch Foliage",evergreen_foliage:"Evergreen Foliage"},block_sounds:{stone:"Stone",metal:"Metal",cloth:"Cloth",grass:"Grass",glass:"Glass",wood:"Wood",gravel:"Gravel",sand:"Sand",snow:"Snow",azalea_leaves:"Leaves",amethyst_block:"Amethyst Block",amethyst_cluster:"Amethyst Cluster",ancient_debris:"Ancient Debris",anvil:"Anvil",azalea:"Azalea",bamboo_sapling:"Bamboo Sapling",bamboo:"Bamboo",basalt:"Basalt",big_dripleaf:"Big Dripleaf",bone_block:"Bone Block",calcite:"Calcite",candle:"Candle",cave_vines:"Cave Vines",chain:"Chain",comparator:"Comparator",copper:"Copper",coral:"Coral",deepslate_bricks:"Deepslate Bricks",deepslate:"Deepslate",dirt_with_roots:"Dirt With Roots",dripstone_block:"Dripstone Block",fungus:"Fungus",hanging_roots:"Hanging Roots",honey_block:"Honey Block",itemframe:"Itemframe",ladder:"Ladder",lantern:"Lantern",large_amethyst_bud:"Large Amethyst Bud",medium_amethyst_bud:"Medium Amethyst Bud",moss_block:"Moss Block",moss_carpet:"Moss Carpet",nether_brick:"Nether Brick",nether_gold_ore:"Nether Gold Ore",nether_sprouts:"Nether Sprouts",nether_wart:"Nether Wart",netherite:"Netherite",netherrack:"Netherrack",nylium:"Nylium",pointed_dripstone:"Pointed Dripstone",powder_snow:"Powder Snow",roots:"Roots",scaffolding:"Scaffolding",shroomlight:"Shroomlight",slime:"Slime",small_amethyst_bud:"Small Amethyst Bud",soul_sand:"Soul Sand",soul_soil:"Soul Soil",spore_blossom:"Spore Blossom",stem:"Stem",sweet_berry_bush:"Sweet Berry Bush",tuff:"Tuff",vines:"Vines"},rotation_options:{none:"None",cardinal:"Cardinal (Like a Furnace)",facing:"Facing (Like a Piston)",pillar:"Pillar (Like a Log)"},collision_options:{full:"Full Block",none:"No Collision",slab:"Slab",stairs:"Stairs",post:"Post",fence:"Fence",small:"Small",carpet:"Carpet"},selection_box_options:{collision:"Same as Collision",full:"Full Block",none:"Not Selectable",slab:"Slab",post:"Post",small:"Small",carpet:"Carpet"},tool_options:{none:"None",axe:"Axe",pickaxe:"Pickaxe",shovel:"Shovel",sword:"Sword",hoe:"Hoe",shears:"Shears"},tier_options:{none:"Any",wood:"Wood",stone:"Stone",copper:"Copper",gold:"Gold",iron:"Iron",diamond:"Diamond",netherite:"Netherite"},liquid_touches_options:{blocking:"Block Liquid",broken:"Break",popped:"Break and Drop",no_reaction:"Flow Through"},preset_search_term:"",has_customized_id:!1,resource_pack_path:null,behavior_pack_path:null,bedrock_installed:!1,current_tab_model:"",past_preset:!1,form:{edition:localStorage.getItem("minecraft_wizard.selected_edition")||"bedrock",identifier:"",display_name:"",category:"construction",item_group:"none",preset:"stone",rotation:"none",collision:"full",selection_box:"collision",mineable:!0,destroy_time:1,destroy_tool:"none",destroy_tier:"none",explodable:!0,explosion_resistance:30,breathable:!1,friction:.4,on_liquid_touches:"blocking",can_contain_liquid:!1,redstone_conductor:!1,flammable:!1,fire_destroy_chance:20,fire_catch_chance:5,use_current_model:!1,random_offset_range:0,material:"alpha_test",fade_to_opaque:!1,tint_method:"none",face_dimming:!0,ambient_occlusion:!0,light_emission:0,light_dampening:15,map_color:"#ffffff",uv_lock:!1,sound:"stone",loot_type:"default",custom_loot:[],export_mode:isApp?"folder":"mcaddon",pack_name:"",pack_authors:"",pack_icon:"",integrate_pack:null}}),computed:{identifier_error(){let e=this.form.identifier;return e?e.match(/^minecraft:/)?"Use a different namespace than 'minecraft:'":e.match(/[A-Z]/)?"Identifiers cannot contain capital letters":e.match(/^\d/)?"Identifiers cannot start with a number":e.match(/[^a-z0-9-_.:]/)?"Identifiers cannot contain spaces or special characters":e.match(/\w:\w/)?"":"Identifiers must start with a namespace, separated by a colon":""}},methods:{selectPreset(e){if(this.past_preset&&!confirm("Are you sure you want to go back and apply this preset? It may override some of the values that you have set."))return;this.past_preset=!1,this.form.preset=e;let t=this.presets[e];void 0!==t.rotation&&(this.form.rotation=t.rotation),void 0!==t.collision&&(this.form.collision=t.collision),void 0!==t.selection_box&&(this.form.selection_box=t.selection_box),void 0!==t.uv_lock&&(this.form.uv_lock=t.uv_lock),void 0!==t.mineable&&(this.form.mineable=t.mineable),void 0!==t.destroy_time&&(this.form.destroy_time=t.destroy_time),void 0!==t.destroy_tool&&(this.form.destroy_tool=t.destroy_tool),void 0!==t.destroy_tier&&(this.form.destroy_tier=t.destroy_tier),void 0!==t.explodable&&(this.form.explodable=t.explodable),void 0!==t.explosion_resistance&&(this.form.explosion_resistance=t.explosion_resistance),void 0!==t.breathable&&(this.form.breathable=t.breathable),void 0!==t.friction&&(this.form.friction=t.friction),void 0!==t.flammable&&(this.form.flammable=t.flammable),void 0!==t.fire_destroy_chance&&(this.form.fire_destroy_chance=t.fire_destroy_chance),void 0!==t.fire_catch_chance&&(this.form.fire_catch_chance=t.fire_catch_chance),void 0!==t.light_emission&&(this.form.light_emission=t.light_emission),void 0!==t.light_dampening&&(this.form.light_dampening=t.light_dampening),void 0!==t.material&&(this.form.material=t.material),void 0!==t.fade_to_opaque&&(this.form.fade_to_opaque=t.fade_to_opaque),void 0!==t.tint_method&&(this.form.tint_method=t.tint_method),void 0!==t.random_offset_range&&(this.form.random_offset_range=t.random_offset_range),void 0!==t.face_dimming&&(this.form.face_dimming=t.face_dimming),void 0!==t.ambient_occlusion&&(this.form.ambient_occlusion=t.ambient_occlusion),void 0!==t.map_color&&(this.form.map_color=t.map_color),void 0!==t.sound&&(this.form.sound=t.sound)},checkPageComplete(){let{form:e}=this;if("metadata"==this.open_page){if(!e.display_name)return Blockbench.showQuickMessage("Please enter a name"),!1;if(!e.identifier||this.identifier_error)return Blockbench.showQuickMessage("Please enter a correct identifier"),!1}else if("preset"==this.open_page){if(!e.preset)return Blockbench.showQuickMessage("Please select a block preset"),!1}else if("spawn_egg"==this.open_page);else if("export"==this.open_page){if("integrate"==e.export_mode&&!e.integrate_pack)return Blockbench.showQuickMessage("Please select a behavior pack"),!1;if("integrate_mcaddon"==e.export_mode&&!window.BlockWizardProject.previous_mcaddon)return Blockbench.showQuickMessage("Please select an mcaddon file"),!1;if(!e.export_mode.includes("integrate")&&!e.pack_name)return Blockbench.showQuickMessage("Please enter a pack name"),!1;if(!e.export_mode.includes("integrate")&&e.pack_name.match(/[<>:"/\\|?*]/))return Blockbench.showQuickMessage("You cannot use invalid characters in the pack name: "+e.pack_name.match(/[<>:"/\\|?*]/)[0]),!1}return!0},exportPacks(){(0,t.exportPack)(this.form,{}).then((e=>{this.resource_pack_path=e.rp_path,this.behavior_pack_path=e.bp_path,"integrate"===this.form.export_mode?Blockbench.showQuickMessage("Integrated into Resource and Behavior Pack"):(Blockbench.notification("Export Successful","Exported resource and behavior pack"),Blockbench.showQuickMessage("Exported Resource and Behavior Pack"))})),localStorage.setItem("minecraft_wizard.selected_edition",this.form.edition)},openInstallInstructions(e){!function(e){new Dialog({title:"Add-on Installation Instructions",singleButton:!0,width:660,lines:[e.includes("mcaddon")?$('

    To import the packs into Minecraft, open the downloaded .mcaddon file.

    ')[0]:"",$('

    To enable the addon, you need to add it to your Minecraft world.\n\t\t\t\tOpen your world settings and locate the Behavior Packs section.\n\t\t\t\tFind your new pack and activate it.\n\t\t\t\tEnabling the behavior pack will also automatically activate the resource pack.

    \n\t\t\t')[0],Interface.createElement("img",{src:"data:image/png;base64,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",style:"image-rendering: auto; max-width: 100%;",width:"660px"})]}).show()}(e)},switchPage(e){let t=Object.keys(this.pages);if(t.indexOf(e)-t.indexOf(this.open_page)>0){"preset"==this.open_page&&(this.past_preset=!0);let o=t.indexOf(this.open_page);for(;this.open_page!=e;){if(o++,!this.checkPageComplete())return!1;"export"==t[o-1]&&this.exportPacks(),this.open_page=t[o]}}this.open_page=e},nextPage(){let e=Object.keys(this.pages),o=e[e.indexOf(this.open_page)+1];o?Dialog.open.sidebar.setPage(o):(0,t.openExportedFiles)(this.form,this.resource_pack_path)},previousPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)-1];t&&Dialog.open.sidebar.setPage(t)},inputDisplayName(){if(this.has_customized_id)return;let e=(settings.username.value||"myname")+":"+this.form.display_name;e=e.toLowerCase().replace(/[- _.]+/g,"_").replace(/[^a-z0-9_:]/g,""),this.form.identifier=e},inputExplosionResistance(e){this.form.explosion_resistance=Math.pow(parseFloat(e.target.value),24)-1;let t=this.form.explosion_resistance<10?10:1;this.form.explosion_resistance>20&&(t=.5),this.form.explosion_resistance>200&&(t=.1),this.form.explosion_resistance>2e3&&(t=.01),this.form.explosion_resistance=Math.clamp(Math.round(this.form.explosion_resistance*t)/t,0,1e4)},getThumbnail:e=>`url('${e}')`,copySummonCommand(){let e=`/setblock ~ ~ ~ ${this.form.identifier}`;Clipbench.setText(e),Blockbench.showQuickMessage("Command copied to clipboard")}},mounted(){$(this.$refs.map_color).spectrum({preferredFormat:"hex",color:this.form.map_color,showAlpha:!1,showInput:!0,move:e=>{this.form.map_color=e.toHexString()},change:e=>{this.form.map_color=e.toHexString()}})}};var w=r(v,e,[function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("section",[o("p",{staticClass:"description"},[e._v("Select a block preset to get started!")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Random Offset")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Randomly offset the model to the side to break up patterns. Minecraft uses this for flowers. The specified value is the offset range in pixels.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Friction")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select the friction of the block. Friction affects an entity's movement speed when walking on the block. Low friction blocks are slippery like ice.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ul",{attrs:{id:"block_friction_markers"}},[o("li",[e._v("Like Ice")]),e._v(" "),o("li",[e._v("Normal")]),e._v(" "),o("li",[e._v("Like Soul Sand")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Can Contain Liquid")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Whether the block can contain water")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Conduct Redstone")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Select if redstone can pass through the block")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Flammable")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Whether the block can burn")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Fire Catch Chance")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Chance that this block will catch fire when it's next to fire. Wood has a chance of 5. Higher values increase the chance of catching on fire.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Fire Destroy Chance")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Chance that this block will be destroyed when on fire. Wood has a chance of 20. Higher values increase the chance of getting destroyed. If the value is 0, the block will burn forever.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Mineable")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Destroy Time")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The time it takes to mine the block, without a tool, in seconds.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Destructible by Explosion")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Explosion Resistance")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The resistance of the block against explosions, where a value of 0 is like glass, and a value of 30 is like stone.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ul",{attrs:{id:"block_explosion_resistance_markers"}},[o("li",{attrs:{block:"glass"}},[e._v("Glass")]),e._v(" "),o("li",{attrs:{block:"planks"}},[e._v("Planks")]),e._v(" "),o("li",{attrs:{block:"stone"}},[e._v("Stone")]),e._v(" "),o("li",{attrs:{block:"obsidian"}},[e._v("Obsidian")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Light Emission")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Set a value to let the block emit light. 15 is the maximum value and is equivalent to glowstone.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Light Dampening")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The amount that light will be dampened when it passes through the block, in a range (0-15). Higher value means the light will be dampened more.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Fade to Opaque")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Fade material to opaque when viewed from a distance. This allows transparent blocks to be viewed from a greater distance.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Face Shading")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Shade faces depending on which direction they are facing")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Ambient Occlusion")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Enable smooth shadows in the corner between multiple blocks")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("Map Color")]),e._v(" "),o("p",{staticClass:"description"},[e._v("The color that this block will be display with on a map item.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",[o("label",[e._v("UV Lock")]),e._v(" "),o("p",{staticClass:"description"},[e._v("Align the rotation of the texture to the world, rather than to the rotation of the block.")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("label",[o("i",{staticClass:"material-icons",staticStyle:{"vertical-align":"bottom",margin:"1px 5px","padding-top":"9px"}},[e._v("info")]),e._v("\n\t\t\t\tYou can always re-export the MCAddon via "),o("b",[e._v("File")]),e._v(" > "),o("b",[e._v("Export")]),e._v(" > "),o("b",[e._v("Export MCAddon")]),e._v(".\n\t\t\t")])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("section",[o("label",[e._v("To learn more about creating Minecraft addons, visit the "),o("a",{staticClass:"open-in-browser",attrs:{href:"https://learn.microsoft.com/en-us/minecraft/creator/",target:"blank",rel:"noopener"}},[e._v("Minecraft Bedrock Creator Portal")]),e._v("!")]),e._v(" "),o("p",{staticClass:"description"},[e._v("(You can re-open this dialog to return to this page)")])])}],!1,(function(e){var t=o(719);t.__inject__&&t.__inject__(e)}),null,"18d1aca8");w.options.__file="src/dialog.vue";const k=w.exports;var C=o(318);const B="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTgwIgogICBoZWlnaHQ9IjQ2MCIKICAgdmlld0JveD0iMCAwIDI1OS4yOTE2NiAxMjEuNzA4MzQiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzQ0OTEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9InN0YXJ0X3NjcmVlbi5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDg1IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ5NDk3NDc1IgogICAgIGlua3NjYXBlOmN4PSI1NTUuMDY1ODUiCiAgICAgaW5rc2NhcGU6Y3k9IjIzLjA4OTk4NiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSI0NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDg4Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzUuMjkxNjUpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDIwMjAyO2ZpbGwtb3BhY2l0eTowLjE4O3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjU5LjI1MTQ0LDIwOS42MDI4NSBjIC01MS4wNDg0OCwwIC0xMjIuMjcxODgsMTcuMzM0NTMgLTE2Ni4xMDQwNzYsMTguMTM2MzQgQyA0OS4zMTUxNjEsMjI4LjU0MSA1LjkxMTYwNDJlLTgsMjIyLjU3MjYgNS45MTE2MDQyZS04LDIyMi41NzI2IEwgLTAuMDU2MzM2OCwyNTAuODIwMDcgLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMjU5LjI5NjIzLDI5Ny4wMDI0MiBaIgogICAgICAgaWQ9InBhdGg1MDU5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojNzU0OTE0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMC42OTk2NTIzNywyNTQuOTc3ODEgYyAwLDAgMzYuOTA3NDg2NjMsMTkuNjE3OTggODQuNzIzMDA3NjMsMjQuODI0MjYgNjUuOTU2ODQsNy4xODE1NCA5Ni4xMDM3NCwtNS42ODE2OCAxNDEuMzEwMDQsLTMuNjc4NTYgMjAuMTI5MTksMC44OTE5NCAyOS40ODQ1MSwzLjEwODU2IDMyLjYyNDkzLDMuNDQyNjQgbCAtMC4wNjE0LDE3LjQzNjI3IHoiCiAgICAgICBpZD0icGF0aDUwMzgtOSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2EzNzMxZjtmaWxsLW9wYWNpdHk6MC45NDExNzY0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0xLjIwNzE2NjJlLTgsMjk3LjAwMjkzIC0wLjA1NjMzNjgsMjUwLjgyMDA3IGMgMCwwIDUzLjkxNzk0MTgsMzguOTk4MzcgMTEzLjQ0OTE5NjgsMzcuNDg2NDYgNDguMDgyNjEsLTEuMjIxMTUgNzMuOTg1ODksLTIuMDczMDggOTcuNTQwNzcsMC40NDI4MiAxOC4zMTU3MiwxLjk1NjMgNDguMzYyNiw4LjI1MzA3IDQ4LjM2MjYsOC4yNTMwNyB2IDAgeiIKICAgICAgIGlkPSJwYXRoNTAzOCIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K",I="data:image/png;base64,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";o(924);const z=[];let E,y;BBPlugin.register("minecraft_block_wizard",{title:"Minecraft Block Wizard",author:"JannisX11 & Mojang Studios",icon:"icon.png",description:"Create custom blocks for Minecraft: Bedrock Edition!",tags:["Minecraft: Bedrock Edition"],version:"1.7.0",min_version:"4.8.0",variant:"both",creation_date:"2022-10-25",has_changelog:!0,bug_tracker:"https://github.com/JannisX11/minecraft-wizards/issues/new/choose",onload(){function e(){Vue.nextTick((()=>{E.content_vue&&(E.content_vue.current_tab_model="",Project&&"bedrock_block"==Project.format.id&&(E.content_vue.current_tab_model=Project.name||"Block Model"))}))}async function t(t){0!=await MinecraftEULA.promptUser("block_wizard")&&(E.content_vue&&E.content_vue.form.display_name?Blockbench.showMessageBox({title:"Block Wizard",message:`Do you want to keep editing your current block "${E.content_vue.form.display_name}", or do you want to start over?`,icon:"delete",buttons:["Continue","Start New Block"]},(t=>{1==t&&(E.sidebar.setPage("metadata"),E.delete(),delete E.object,window.BlockWizardProject={}),E.show(),e()})):t?y.show():(E.show(),e()))}window.BlockWizardProject={},y=new Dialog({id:"minecraft_block_wizard_start",title:"Create a Block!",width:740,padding:!1,buttons:["Create a Block!"],lines:["

    Minecraft Block Wizard

    ","

    Create custom blocks and export them as an addon!

    ","

    Custom blocks allow you to expand your Minecraft world and add new materials and objects

    ","

    With the block wizard, you can add a new block to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench

    ",``],onConfirm(){setTimeout((()=>{E.show(),e()}),10)}}),E=new Dialog({id:"minecraft_block_wizard",title:"Minecraft Block Wizard",width:980,padding:!1,buttons:["Next","dialog.cancel"],sidebar:{pages:i,actions:[{id:"documentation",name:"Documentation",icon:"description",click(){Blockbench.openLink("https://learn.microsoft.com/en-us/minecraft/creator/documents/minecraftblockwizard?view=minecraft-bedrock-stable")}}],onPageSwitch(e){return this.dialog.content_vue.switchPage(e)}},component:k,onBuild(e){let t=Interface.createElement("div",{id:"block_wizard_back_button",title:"Go Back"},Blockbench.getIconNode("arrow_back"));t.onclick=()=>{E.content_vue.previousPage()};let o=Interface.createElement("div",{class:"bar_spacer"},[Interface.createElement("div",{class:"required_message"}," = Required")]),i=e.querySelector(".button_bar");i.prepend(o),i.prepend(t)},onConfirm(){return this.content_vue.nextPage(),!1},onCancel(e){if(e&&"blackout"==e.target.id)return!1}});let o=new Action("open_minecraft_block_wizard",{name:"Minecraft Block Wizard",icon:C,click(){t(!0)}});MenuBar.menus.filter.addAction(o),z.push(o);let a=new Action("block_wizard_export_mcaddon",{name:"Export MCAddon (Block Wizard)",icon:C,condition:()=>E.content_vue&&E.content_vue.form.display_name&&E.content_vue.form.export_mode.includes("mcaddon"),click(){E.content_vue.exportPacks()}});MenuBar.menus.file.addAction(a,"export.0"),z.push(a);let n=new ModelLoader("minecraft_block_wizard",{name:"Minecraft Block Wizard",description:"Create custom blocks and export them as an addon!",icon:C,target:"Minecraft: Bedrock Edition",onStart(){t(!1)},format_page:{content:[{type:"label",text:"Custom blocks allow you to expand your Minecraft world and add new materials and objects."},{type:"label",text:"With the block wizard, you can add a new block to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench."},{type:"image",source:I}],button_text:"Create a Block!"}});z.push(n);let r=Blockbench.addCSS(`\n\t\t\t.format_entry[format=minecraft_block_wizard] {\n\t\t\t\tcolor: #ffa41b;\n\t\t\t}\n\t\t\t#start_files .format_entry[format=minecraft_block_wizard]:hover {\n\t\t\t\tcolor: #ffc151;\n\t\t\t}\n\n\n\t\t\t#format_page_minecraft_block_wizard {\n\t\t\t\tbackground-image: url('${B}');\n\t\t\t\tbackground-position: bottom;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t}\n\t\t\t#format_page_minecraft_block_wizard content {\n\t\t\t\tmargin-top: 18px;\n\t\t\t}\n\t\t\t#format_page_minecraft_block_wizard content > label {\n\t\t\t\tmax-width: 454px;\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\t#format_page_minecraft_block_wizard img {\n\t\t\t\tmargin-top: -265px;\n\t\t\t\tmargin-bottom: -58px;\n\t\t\t\tmargin-left: calc(20% - 130px);\n\t\t\t}\n\t\t\t#format_page_minecraft_block_wizard .button_bar {\n\t\t\t\tjustify-content: right;\n\t\t\t}\n\n\n\t\t\t#minecraft_block_wizard_start > .dialog_wrapper {\n\t\t\t\tbackground-image: url('${B}');\n\t\t\t\tbackground-position: bottom;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t}\n\t\t\t#minecraft_block_wizard_start content {\n\t\t\t\toverflow: initial;\n\t\t\t}\n\t\t\t#minecraft_block_wizard_start content > p {\n\t\t\t\tmax-width: 454px;\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\t#minecraft_block_wizard_start img {\n\t\t\t\tmargin-top: -244px;\n\t\t\t\tmargin-bottom: -58px;\n\t\t\t\tmargin-left: calc(20% - 130px);\n\t\t\t}\n\t\t\t#minecraft_block_wizard_start .button_bar {\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t\t#minecraft_block_wizard_start .button_bar button {\n\t\t\t\twidth: 180px;\n\t\t\t\theight: 40px;\n\t\t\t\tmargin-top: 20px;\n\t\t\t}\n\n\n\t\t\tdialog#minecraft_block_wizard .dialog_sidebar_pages li {\n\t\t\t\tpadding: 8px 20px;\n\t\t\t}\n\t\t\tdialog#minecraft_block_wizard .button_bar {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\t\t\tdialog#minecraft_block_wizard .button_bar .bar_spacer {\n\t\t\t\tflex-grow: 1;\n\t\t\t\ttext-align: left;\n\t\t\t}\n\t\t\tdialog#minecraft_block_wizard .required_message {\n\t\t\t\tpadding-top: 5px;\n\t\t\t\tpadding-left: 16px;\n\t\t\t}\n\t\t\tdialog#minecraft_block_wizard .required_message::before, #block_wizard_wrapper label.required::after {\n\t\t\t\tcontent: "*";\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tline-height: 0;\n\t\t\t\tvertical-align: inherit;\n\t\t\t\tcolor: var(--color-accent);\n\t\t\t}\n\t\t`);z.push(r)},onunload(){z.forEach((e=>e.delete()))}})})()})(); ================================================ FILE: plugins/minecraft_entity_wizard/about.md ================================================ This Entity Wizard for Minecraft Bedrock Edition let's you add your own custom entity to the game without any prior coding knowledge. Select from a list of presets, and customize basic properties of the entity. Then you can use Blockbench's powerful editor to design your own model for the entity! The generated Add-On can be added to Minecraft, and you can summon your custom entity into your own world! > Developed by the creator of Blockbench, in collaboration with Mojang Studios! ================================================ FILE: plugins/minecraft_entity_wizard/changelog.json ================================================ { "1.4.0": { "title": "1.4.0", "date": "2024-04-11", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added Sniffer preset", "Added Camel preset" ] } ] }, "1.5.0": { "title": "1.5.0", "date": "2024-05-23", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added Armadillo preset", "Added link to Dialogue Designer for NPC entities" ] } ] }, "1.5.1": { "title": "1.5.1", "date": "2024-06-16", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed Wolf preset no longer working correctly in newer Minecraft version", "Fixed Magma Slime preset not working correctly" ] } ] }, "1.6.0": { "title": "1.6.0", "date": "2024-09-26", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added Breeze preset" ] } ] }, "1.7.0": { "title": "1.7.0", "date": "2025-02-15", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added option to merge into existing mcaddon file", "Added option to select game variant (normal, preview, edu) inside the wizard", "Added runtime identifier to NPC preset (enabling punch to remove)" ] }, { "title": "Fixes", "list": [ "Fixed JSON comments causing file merging with existing packs to fail" ] } ] }, "1.8.0": { "title": "1.8.0", "date": "2025-10-05", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added happy ghast preset", "Added compatibility for Blockbench 5.0", "Added compatibility for new Minecraft install location" ] }, { "title": "Fixes", "list": [ "Fixed held item position in pillager preset" ] } ] }, "1.8.2": { "title": "1.8.2", "date": "2025-10-25", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed export issue in the web app", "Fixed issue with exporting to the new Minecraft install location" ] } ] }, "1.8.3": { "title": "1.8.3", "date": "2026-04-20", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed missing entity sounds in some presets" ] } ] } } ================================================ FILE: plugins/minecraft_entity_wizard/minecraft_entity_wizard.js ================================================ (()=>{var e={1568:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.drive":{"loop":true,"bones":{"wheel_front_left":{"rotation":["query.modified_distance_moved * 20","variable.steering / 3",0]},"wheel_front_right":{"rotation":["query.modified_distance_moved * 20","variable.steering / 3",0]},"wheel_back_right":{"rotation":["query.modified_distance_moved * 20",0,0]},"wheel_back_left":{"rotation":["query.modified_distance_moved * 20",0,0]},"steering_wheel":{"rotation":[0,0,"variable.steering * -0.6"]}}}}}'},1864:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.idle":{"loop":true,"animation_length":2,"bones":{"head":{"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[0,-0.5,0],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[5,0,0],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[0,-0.5,0],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,15,31.21],"lerp_mode":"catmullrom"},"0.75":{"post":[0,15,40],"lerp_mode":"catmullrom"},"1.5":{"post":[0,15,22.5],"lerp_mode":"catmullrom"},"2.0":{"post":[0,15,31.21],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,-15,-31.21],"lerp_mode":"catmullrom"},"0.75":{"post":[0,-15,-40],"lerp_mode":"catmullrom"},"1.5":{"post":[0,-15,-22.5],"lerp_mode":"catmullrom"},"2.0":{"post":[0,-15,-31.21],"lerp_mode":"catmullrom"}}},"left_wing":{"rotation":{"0.0":{"post":[37.98064,6.50284,22.02407],"lerp_mode":"catmullrom"},"0.5":{"post":[22.5,67.5,0],"lerp_mode":"catmullrom"},"1.0":{"post":[37.98064,6.50284,22.02407],"lerp_mode":"catmullrom"},"1.5":{"post":[22.5,67.5,0],"lerp_mode":"catmullrom"},"2.0":{"post":[37.98064,6.50284,22.02407],"lerp_mode":"catmullrom"}}},"right_wing":{"rotation":{"0.0":{"post":[37.98064,-6.50284,-22.02407],"lerp_mode":"catmullrom"},"0.5":{"post":[22.5,-67.5,0],"lerp_mode":"catmullrom"},"1.0":{"post":[37.98064,-6.50284,-22.02407],"lerp_mode":"catmullrom"},"1.5":{"post":[22.5,-67.5,0],"lerp_mode":"catmullrom"},"2.0":{"post":[37.98064,-6.50284,-22.02407],"lerp_mode":"catmullrom"}}}}},"animation.{name}.fly":{"loop":true,"animation_length":2,"bones":{"head":{"rotation":{"0.0":{"post":[2.5,0,0],"lerp_mode":"catmullrom"},"0.5833":{"post":[-2.5,0,0],"lerp_mode":"catmullrom"},"1.0833":{"post":[2.5,0,0],"lerp_mode":"catmullrom"},"1.5833":{"post":[-2.5,0,0],"lerp_mode":"catmullrom"},"2.0":{"post":[2.5,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"body":{"rotation":{"0.0":{"post":[45,0,0],"lerp_mode":"catmullrom"},"0.4167":{"post":[55,0,0],"lerp_mode":"catmullrom"},"0.9167":{"post":[45,0,0],"lerp_mode":"catmullrom"},"1.4167":{"post":[55,0,0],"lerp_mode":"catmullrom"},"2.0":{"post":[45,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":[0,0,1],"2.0":[0,0,1]}},"right_arm":{"rotation":{"0.0":{"post":[0,22.5,15],"lerp_mode":"catmullrom"},"0.5833":{"post":[0,22.5,10],"lerp_mode":"catmullrom"},"1.0833":{"post":[0,22.5,15],"lerp_mode":"catmullrom"},"1.5833":{"post":[0,22.5,10],"lerp_mode":"catmullrom"},"2.0":{"post":[0,22.5,15],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,-22.5,-15],"lerp_mode":"catmullrom"},"0.5833":{"post":[0,-22.5,-10],"lerp_mode":"catmullrom"},"1.0833":{"post":[0,-22.5,-15],"lerp_mode":"catmullrom"},"1.5833":{"post":[0,-22.5,-10],"lerp_mode":"catmullrom"},"2.0":{"post":[0,-22.5,-15],"lerp_mode":"catmullrom"}}},"left_wing":{"rotation":{"0.0":{"post":[15.48064,6.50284,22.02407],"lerp_mode":"catmullrom"},"0.25":{"post":[0,67.5,0],"lerp_mode":"catmullrom"},"0.5":{"post":[15.48064,6.50284,22.02407],"lerp_mode":"catmullrom"},"0.75":{"post":[0,67.5,0],"lerp_mode":"catmullrom"},"1.0":{"post":[15.48064,6.50284,22.02407],"lerp_mode":"catmullrom"},"1.25":{"post":[0,67.5,0],"lerp_mode":"catmullrom"},"1.5":{"post":[15.48064,6.50284,22.02407],"lerp_mode":"catmullrom"},"1.75":{"post":[0,67.5,0],"lerp_mode":"catmullrom"},"2.0":{"post":[15.48064,6.50284,22.02407],"lerp_mode":"catmullrom"}}},"right_wing":{"rotation":{"0.0":{"post":[15.48064,-6.50284,-22.02407],"lerp_mode":"catmullrom"},"0.25":{"post":[0,-67.5,0],"lerp_mode":"catmullrom"},"0.5":{"post":[15.48064,-6.50284,-22.02407],"lerp_mode":"catmullrom"},"0.75":{"post":[0,-67.5,0],"lerp_mode":"catmullrom"},"1.0":{"post":[15.48064,-6.50284,-22.02407],"lerp_mode":"catmullrom"},"1.25":{"post":[0,-67.5,0],"lerp_mode":"catmullrom"},"1.5":{"post":[15.48064,-6.50284,-22.02407],"lerp_mode":"catmullrom"},"1.75":{"post":[0,-67.5,0],"lerp_mode":"catmullrom"},"2.0":{"post":[15.48064,-6.50284,-22.02407],"lerp_mode":"catmullrom"}}}}},"animation.{name}.hold_item":{"loop":"hold_on_last_frame","animation_length":2,"bones":{"right_arm":{"rotation":{"0.0":{"post":[-67.5,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[-67.5,0,0],"lerp_mode":"catmullrom"}}},"rightItem":{"scale":0.7,"rotation":["-15.0 * (variable.holding_trident)",0,"90.0 * (variable.holding_trident)"],"position":[0.0,"3.50 * (variable.holding_trident)",0.0]}}}}}'},5622:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.look_at_target":{"loop":true,"bones":{"head":{"relative_to":{"rotation":"entity"},"rotation":["variable.x_head_rotation - this","variable.y_head_rotation - this",0.0]}}},"animation.{name}.walk":{"loop":true,"animation_length":1.45833,"anim_time_update":"variable.walk_anim_time_update","bones":{"body":{"rotation":{"0.0":[0,0,0],"0.125":[0,0,0],"0.25":[0,0,2.1],"0.5":[0,0,0],"0.8333":[0,0,0],"0.9583":[0,0,-2.1],"1.25":[0,0,0],"1.4583":[0,0,0]},"position":{"0.0":[0,0,0],"0.125":[0,0,0],"0.25":[0,-0.2,0],"0.5":[0,0,0],"0.8333":[0,0,0],"0.9583":[0,-0.2,0],"1.25":[0,0,0],"1.4583":[0,0,0]}},"tail":{"rotation":{"0.0":[0,0,0],"0.25":[5,0,0],"0.5":[-2.5,0,0],"0.7083":[0,0,0],"0.9583":[5,0,0],"1.2083":[-2.5,0,0],"1.4583":[0,0,0]}},"right_hind_leg":{"rotation":{"0.0":[-50,0,0],"0.25":[0,0,0],"0.5":[0,0,0],"0.75":[50,0,0],"1.0":[50,0,0],"1.2917":[-20,0,0],"1.4583":[-50,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,0,-0.5],"0.5":[0,0,0],"1.0":[0,0,-0.5],"1.2917":[0,1,-0.18],"1.4583":[0,0,0]}},"left_hind_leg":{"rotation":{"0.0":[50,0,0],"0.25":[50,0,0],"0.5417":[-20,0,0],"0.7083":[-50,0,0],"0.9583":[0,0,0],"1.2083":[0,0,0],"1.4583":[50,0,0]},"position":{"0.0":[0,0,-0.25],"0.25":[0,0,-0.5],"0.5417":[0,1,-0.18],"0.7083":[0,0,0],"0.9583":[0,0,-0.5],"1.2083":[0,0,0],"1.4583":[0,0,-0.25]}},"right_front_leg":{"rotation":{"0.0":[50,0,0],"0.25":[50,0,0],"0.5417":[-20,0,0],"0.7083":[-50,0,0],"0.9583":[0,0,0],"1.2083":[0,0,0],"1.4583":[50,0,0]},"position":{"0.0":[0,0,-0.25],"0.25":[0,0,-0.5],"0.5417":[0,1,-0.18],"0.7083":[0,0,0],"0.9583":[0,0,-0.5],"1.2083":[0,0,0],"1.4583":[0,0,-0.25]}},"left_front_leg":{"rotation":{"0.0":[-50,0,0],"0.25":[0,0,0],"0.5":[0,0,0],"0.75":[50,0,0],"1.0":[50,0,0],"1.2917":[-20,0,0],"1.4583":[-50,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,0,-0.5],"0.5":[0,0,0],"1.0":[0,0,-0.5],"1.2917":[0,1,-0.18],"1.4583":[0,0,0]}}}},"animation.{name}.roll_up":{"loop":"hold_on_last_frame","animation_length":0.5,"bones":{"body":{"rotation":{"0.0":[0,0,0],"0.15":[0,0,0]},"position":{"0.0":[0,0,0],"0.15":[0,5,0],"0.2":[0,6,-1],"0.25":[0,6,-1],"0.4":[0,-1,-1]}},"tail":{"rotation":{"0.0":[0,0,0],"0.15":[0,0,0]},"position":{"0.0":[0,0,0],"0.15":[0,0,0],"0.2":[0,0,-2],"0.25":[0,0,-2]}},"head":{"rotation":{"0.0":[0,0,0],"0.15":[17.5,0,0],"0.25":[-72.5,0,0]},"position":{"0.0":[0,0,0],"0.15":[0,-1,0],"0.2":[0,2,1],"0.25":[0,2,1],"0.3":[0,2,6],"0.4":[0,2,7]}},"right_hind_leg":{"rotation":{"0.0":[0,0,0],"0.15":[-35,0,0]},"position":{"0.0":[0,0,0],"0.15":[0,5,-2],"0.2":[0,8,-2],"0.25":[0,8,-2],"0.4":[1,3,-6]}},"left_hind_leg":{"rotation":{"0.0":[0,0,0],"0.15":[-45,0,0]},"position":{"0.0":[0,0,0],"0.15":[0,5,-2],"0.2":[0,8,-2],"0.25":[0,8,-2],"0.4":[-1,3,-6]}},"right_front_leg":{"rotation":{"0.0":[0,0,0],"0.15":[-27.5,0,0],"0.2":[-32.5,0,0],"0.25":[-85,0,0]},"position":{"0.0":[0,0,0],"0.15":[0,5,0],"0.2":[-1,9,-1],"0.25":[-1,9,-1],"0.4":[-1,2,3]}},"left_front_leg":{"rotation":{"0.0":[0,0,0],"0.15":[-12.5,0,0],"0.2":[-35,0,0],"0.25":[-85,0,0]},"position":{"0.0":[0,0,0],"0.15":[0,5,0],"0.2":[1,9,-1],"0.25":[1,9,-1],"0.4":[1,2,3]}},"body_rolled_up":{"rotation":{"0.0":[0,0,0],"0.15":[0,0,0],"0.4":[-2.5,0,0],"0.45":[5,0,0],"0.5":[0,0,0]},"position":{"0.0":[0,3,0],"0.15":[0,8,0],"0.2":[0,7,0],"0.25":[0,7,0],"0.4":[0,1,0],"0.45":[0,0.6,0],"0.5":[0,0,0]}}},"sound_effects":{"0.0":{"effect":"roll"},"0.475":{"effect":"land"}}},"animation.{name}.rolled_up":{"loop":"hold_on_last_frame","bones":{"body":{"rotation":[0,0,0],"position":[0,-1,-1]},"tail":{"rotation":[0,0,0],"position":[0,0,-2]},"head":{"rotation":[-72.5,0,0],"position":[0,2,7]},"right_hind_leg":{"rotation":[-35,0,0],"position":[1,3,-6]},"left_hind_leg":{"rotation":[-45,0,0],"position":[-1,3,-6]},"right_front_leg":{"rotation":[-85,0,0],"position":[-1,2,3]},"left_front_leg":{"rotation":[-85,0,0],"position":[1,2,3]},"body_rolled_up":{"rotation":[0,0,0],"position":[0,0,0]}}},"animation.{name}.peek":{"loop":"hold_on_last_frame","animation_length":2.5,"bones":{"head":{"rotation":{"0.0":[-70,0,0],"0.15":[-65,0,0],"0.4":[-50,0,0],"0.5":[0,0,0],"0.7":[0,0,0],"0.9":{"pre":[-7.5,0,45],"post":[-7.5,0,45],"lerp_mode":"catmullrom"},"1.15":[-7.5,0,45],"1.3":{"pre":[-0.8639,-1.49592,-39.12866],"post":[-0.8639,-1.49592,-39.12866],"lerp_mode":"catmullrom"},"1.6":[-0.8639,-1.49592,-39.12866],"1.75":[0,0,0],"1.8":[-25,0,0],"1.85":[-70,0,0]},"position":{"0.0":[0,1,7],"0.1":[0,1,4],"0.15":[0,1,4],"0.25":[0,1,5],"0.35":[0,1,0.2],"0.4":[0,1,0.2],"0.5":[0,2.1,1.2],"0.6":[0,1.1,0.2],"0.7":[0,1.1,0.2],"1.75":[0,1.1,0.2],"1.8":[0,0.1,0.2],"1.95":[0,0.1,5.2],"2.0":[0,0.1,7.2],"2.15":[0,0.1,8.2],"2.3":[0,0.1,5.2]}},"right_hind_leg":{"position":[0,3,-2]},"left_hind_leg":{"position":[0,3,-2]},"right_front_leg":{"rotation":{"0.0":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.6":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.85":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"1.75":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"1.8":[-90,0,0],"1.95":[-90,0,0]},"position":{"0.0":{"post":[-1,2,2],"lerp_mode":"catmullrom"},"0.6":{"post":[-1,2,2],"lerp_mode":"catmullrom"},"0.65":{"post":[-1,2,-2],"lerp_mode":"catmullrom"},"0.85":{"post":[-1,2,-1],"lerp_mode":"catmullrom"},"1.0":{"post":[-1,2,-1],"lerp_mode":"catmullrom"},"1.75":{"post":[-1,2,-1],"lerp_mode":"catmullrom"},"1.95":[-1,2,-1],"2.0":[-1,2,3],"2.15":[-1,3,4]}},"left_front_leg":{"rotation":{"0.0":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.65":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.85":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"1.75":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"1.8":[-90,0,0],"1.95":[-90,0,0]},"position":{"0.0":{"post":[1,2,2],"lerp_mode":"catmullrom"},"0.65":{"post":[1,2,2],"lerp_mode":"catmullrom"},"0.75":{"post":[1,2,-2],"lerp_mode":"catmullrom"},"0.85":{"post":[1,2,-1],"lerp_mode":"catmullrom"},"1.0":{"post":[1,2,-1],"lerp_mode":"catmullrom"},"1.75":{"post":[1,2,-1],"lerp_mode":"catmullrom"},"1.95":[1,2,-1],"2.0":[1,2,3],"2.15":[1,3,4]}},"body_rolled_up":{"rotation":{"0.0":[0,0,0],"0.25":[0,0,0],"0.35":[15,0,0],"0.5":[-7.5,0,0],"0.6":[0,0,0],"2.0":[0,0,0],"2.05":[-17.5,0,0],"2.15":[-25,0,0],"2.25":[0,0,0],"2.3":[12.5,0,0],"2.5":[0,0,0]},"position":{"0.25":[0,0,0],"0.35":[0,1.6,0],"0.5":[0,0.5,0],"0.6":[0,0,0],"2.0":[0,0,0],"2.05":[0,1.2,0],"2.15":[0,1.7,0],"2.25":[0,0,0],"2.3":[0,1.3,0],"2.5":[0,0,0]}}},"sound_effects":{"0.0":{"effect":"peek"}}},"animation.{name}.unroll":{"loop":"hold_on_last_frame","animation_length":1.5,"bones":{"head":{"rotation":{"0.1":[-50,0,0],"0.15":[0,0,0],"0.25":[0,0,0],"0.4":[0,0,0],"0.65":[0,0,0],"0.7":[0,0,0],"0.85":[-2.5,0,0],"0.9":[0,0,0],"0.95":[-7.5,0,0],"1.05":[0,0,0],"1.1":[7.5,0,0]},"position":{"0.0":[0,1,5],"0.05":[0,1,0.2],"0.1":[0,1,0.2],"0.15":[0,2.1,1.2],"0.25":[0,1.03,0.13],"0.4":[0,1.03,0.13],"0.65":[0,1.03,0.13],"0.7":[0,1.1,0.2],"0.75":[0,4.1,2.2],"0.85":[0,5.1,3.2],"0.9":[0,0.1,0.2],"0.95":[0,0.9,-0.8],"1.05":[0,0.9,0],"1.1":[0,2.6,0.2],"1.15":[0,2.4,0.2],"1.2":[0,0,0.2],"1.25":[0,0,0.2],"1.3":[0,0,0.2]}},"right_hind_leg":{"rotation":{"1.1":[0,0,0],"1.3":[0,0,30],"1.4":[0,0,0],"1.45":[0,0,0],"1.5":[0,0,0]},"position":{"1.1":[0,3,-2],"1.2":[0,8,-2],"1.3":[-1,3,0],"1.4":[0,0,0],"1.45":[0,0,0],"1.5":[0,0,0]}},"left_hind_leg":{"rotation":{"1.1":[0,0,0],"1.3":[0,0,-30],"1.4":[0,0,0],"1.45":[0,0,0],"1.5":[0,0,0]},"position":{"1.1":[0,3,-2],"1.2":[0,8,-2],"1.3":[1,3,0],"1.35":[1,3,0],"1.4":[0,0,0],"1.45":[0,0,0],"1.5":[0,0,0]}},"right_front_leg":{"rotation":{"0.0":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.05":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.25":[-45,0,0],"0.55":[-45,0,0],"0.6":{"pre":[-92.5,0,0],"post":[-92.5,0,0],"lerp_mode":"catmullrom"},"1.1":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"1.3":{"post":[0,0,30],"lerp_mode":"catmullrom"},"1.4":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.45":[0,0,0],"1.5":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":[-1,2,2],"0.05":{"pre":[-1,2,2],"post":[-1,2,2],"lerp_mode":"catmullrom"},"0.25":[-1,2,-1],"0.55":[-1,2,-1],"0.7":{"pre":[-1,2,2.63],"post":[-1,2,2.63],"lerp_mode":"catmullrom"},"1.1":[-1,2,2],"1.2":[-1,7,2],"1.3":[-1,3,0],"1.4":[0,0,0],"1.45":[0,0,0],"1.5":[0,0,0]}},"left_front_leg":{"rotation":{"0.0":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.05":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.25":[-45,0,0],"0.55":[-45,0,0],"0.6":{"pre":[-87.5,0,0],"post":[-87.5,0,0],"lerp_mode":"catmullrom"},"1.1":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"1.3":{"post":[0,0,-30],"lerp_mode":"catmullrom"},"1.4":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.45":[0,0,0],"1.5":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[1,2,2],"lerp_mode":"catmullrom"},"0.05":{"post":[1,2,2],"lerp_mode":"catmullrom"},"0.15":{"post":[1,2,0],"lerp_mode":"catmullrom"},"0.25":[1,2,-1],"0.55":[1,2,-1],"0.7":{"pre":[1,2,1.88],"post":[1,2,1.88],"lerp_mode":"catmullrom"},"0.75":{"post":[1,2,2.67],"lerp_mode":"catmullrom"},"1.1":{"post":[1,2,2],"lerp_mode":"catmullrom"},"1.2":{"post":[1,8,2],"lerp_mode":"catmullrom"},"1.25":{"post":[1.06,5.06,1],"lerp_mode":"catmullrom"},"1.3":{"post":[1,3,0],"lerp_mode":"catmullrom"},"1.4":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.45":[0,0,0],"1.5":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"}}},"body_rolled_up":{"rotation":{"0.0":[0,0,0],"0.05":[15,0,0],"0.15":[-7.5,0,0],"0.25":[0,0,0],"0.7":[0,0,0],"0.75":[-17.5,0,0],"0.85":[-25,0,0],"0.9":[0,0,0],"0.95":[12.5,0,0],"1.05":[0,0,0],"1.1":[0,0,0]},"position":{"0.0":[0,0,0],"0.05":[0,1.6,0],"0.15":[0,0.5,0],"0.25":[0,0,0],"0.7":[0,0,0],"0.75":[0,1.2,0],"0.85":[0,1.7,0],"0.9":[0,0,0],"0.95":[0,1.3,0],"1.05":[0,0,0],"1.2":[0,5,0],"1.25":[0,8,0],"1.5":[0,1,0]}},"body":{"position":{"1.1":[0,0,0],"1.2":[0,4,0],"1.25":[0,5,0],"1.3":[0,4,0],"1.4":[0,-1,0],"1.5":[0,0,0]}}},"sound_effects":{"0.0":{"effect":"unroll_start"},"1.5":{"effect":"unroll_finish"}}},"animation.{name}.unroll_fast":{"animation_length":0.05,"loop":"hold_on_last_frame","bones":{"body":{"rotation":[0,0,0],"position":[0,-1,-1]},"tail":{"rotation":[0,0,0],"position":[0,0,-2]},"head":{"rotation":[-72.5,0,0],"position":[0,2,7]},"right_hind_leg":{"rotation":[-35,0,0],"position":[1,3,-6]},"left_hind_leg":{"rotation":[-45,0,0],"position":[-1,3,-6]},"right_front_leg":{"rotation":[-85,0,0],"position":[-1,2,3]},"left_front_leg":{"rotation":[-85,0,0],"position":[1,2,3]},"body_rolled_up":{"rotation":[0,0,0],"position":[0,0,0]}},"sound_effects":{"0.0":{"effect":"unroll_finish"}}}}}'},1333:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.athena_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this + 2"]},"head":{"rotation":["-this - 5","-this","-this"]},"leftarm":{"rotation":["-this + 10","-this","-this - 5"]},"leftleg":{"rotation":["-this - 3","-this - 3","-this - 3"]},"rightarm":{"rotation":["-this - 60","-this + 20","-this - 10"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this + 3","-this + 3","-this + 3"]}}},"animation.{name}.brandish_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this - 2"]},"head":{"rotation":["-this - 15","-this","-this"]},"leftarm":{"rotation":["-this + 20","-this","-this - 10"]},"leftleg":{"rotation":["-this + 5","-this - 3","-this - 3"]},"rightarm":{"rotation":["-this - 110","-this + 50","-this"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this - 5","-this + 3","-this + 3"]}}},"animation.{name}.cancan_a_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this + 22","-this"]},"head":{"rotation":["-this - 5","-this + 18","-this"]},"leftarm":{"rotation":["-this + 8","-this","-this - 114"]},"leftleg":{"rotation":["-this - 111","-this + 55","-this"]},"rightarm":{"rotation":["-this","-this + 84","-this + 111"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this","-this + 23","-this - 13"]}}},"animation.{name}.cancan_b_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this - 18","-this"]},"head":{"rotation":["-this - 10","-this - 20","-this"]},"leftarm":{"rotation":["-this","-this","-this - 112"]},"leftleg":{"rotation":["-this","-this","-this + 13"]},"rightarm":{"rotation":["-this + 8","-this + 90","-this + 111"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this - 119","-this - 42","-this"]}}},"animation.{name}.default_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this"]},"head":{"rotation":["-this","-this","-this"]},"leftarm":{"rotation":["-this - 10","-this","-this - 10"]},"leftleg":{"rotation":["-this - 1","-this","-this - 1"]},"rightarm":{"rotation":["-this - 15","-this","-this + 10"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this + 1","-this","-this + 1"]}}},"animation.{name}.entertain_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this"]},"head":{"rotation":["-this - 15","-this","-this"]},"leftarm":{"rotation":["-this - 110","-this - 35","-this"]},"leftleg":{"rotation":["-this + 5","-this - 3","-this - 3"]},"rightarm":{"rotation":["-this - 110","-this + 35","-this"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this - 5","-this + 3","-this + 3"]}}},"animation.{name}.hero_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this + 8","-this"]},"head":{"rotation":["-this - 4","-this + 67","-this"]},"leftarm":{"rotation":["-this + 16","-this + 32","-this - 8"]},"leftleg":{"rotation":["-this","-this - 75","-this - 8"]},"rightarm":{"rotation":["-this - 99","-this + 63","-this"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this + 4","-this + 63","-this + 8"]}}},"animation.{name}.honor_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this"]},"head":{"rotation":["-this - 15","-this","-this"]},"leftarm":{"rotation":["-this - 110","-this + 35","-this"]},"leftleg":{"rotation":["-this + 5","-this - 3","-this - 3"]},"rightarm":{"rotation":["-this - 110","-this - 35","-this"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this - 5","-this + 3","-this + 3"]}}},"animation.{name}.no_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this"]},"head":{"rotation":["-this","-this","-this"]},"leftarm":{"rotation":["-this","-this","-this"]},"leftleg":{"rotation":["-this","-this","-this"]},"rightarm":{"rotation":["-this","-this","-this"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this","-this","-this"]}}},"animation.{name}.riposte_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this"]},"head":{"rotation":["-this + 16","-this + 20","-this"]},"leftarm":{"rotation":["-this + 4","-this + 8","-this + 237"]},"leftleg":{"rotation":["-this - 14","-this - 18","-this - 16"]},"rightarm":{"rotation":["-this + 246","-this","-this + 89"]},"rightitem":{"rotation":["-this","-this + 180","-this"]},"rightleg":{"rotation":["-this + 8","-this + 20","-this + 4"]}}},"animation.{name}.salute_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this"]},"head":{"rotation":["-this","-this","-this"]},"leftarm":{"rotation":["-this + 10","-this","-this - 5"]},"leftleg":{"rotation":["-this - 1","-this","-this - 1"]},"rightarm":{"rotation":["-this - 70","-this - 40","-this"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this + 1","-this","-this + 1"]}}},"animation.{name}.solemn_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this + 2"]},"head":{"rotation":["-this + 15","-this","-this"]},"leftarm":{"rotation":["-this - 30","-this + 15","-this + 15"]},"leftleg":{"rotation":["-this - 1","-this","-this - 1"]},"rightarm":{"rotation":["-this - 60","-this - 20","-this - 10"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this + 1","-this","-this + 1"]}}},"animation.{name}.wiggle":{"loop":true,"bones":{"baseplate":{"rotation":[0.0,"math.sin((variable.skeleton.hurt_time - query.frame_alpha) * 120) * 3",0.0]}}},"animation.{name}.zombie_pose":{"loop":true,"bones":{"body":{"rotation":["-this","-this","-this"]},"head":{"rotation":["-this - 10","-this","-this - 5"]},"leftarm":{"rotation":["-this - 105","-this","-this"]},"leftleg":{"rotation":["-this + 7","-this","-this"]},"rightarm":{"rotation":["-this - 100","-this","-this"]},"rightitem":{"rotation":["-this","-this","-this"]},"rightleg":{"rotation":["-this - 46","-this","-this"]}}}}}'},6498:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.idle_underwater":{"loop":true,"animation_length":5.2,"bones":{"body":{"rotation":{"0.0":{"pre":[-8.9,0,0],"post":[-8.9,0,0],"lerp_mode":"catmullrom"},"2.6":{"pre":[-2.6,0,0],"post":[-2.6,0,0],"lerp_mode":"catmullrom"},"5.2":{"pre":[-8.9,0,0],"post":[-8.9,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"2.6":{"pre":[0,-0.5,0],"post":[0,-0.5,0],"lerp_mode":"catmullrom"},"5.2":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"pre":[49.1,-25.8,0],"post":[49.1,-25.8,0],"lerp_mode":"catmullrom"},"2.6":{"pre":[29.1,-40.8,12.5],"post":[29.1,-40.8,12.5],"lerp_mode":"catmullrom"},"5.2":{"pre":[49.1,-25.8,0],"post":[49.1,-25.8,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0.25,0,1],"post":[0.25,0,1],"lerp_mode":"catmullrom"},"5.2":{"pre":[0.25,0,1],"post":[0.25,0,1],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"pre":[-72.5,117.5,85],"post":[-72.5,117.5,85],"lerp_mode":"catmullrom"},"2.6":{"pre":[-80,117.5,85],"post":[-80,117.5,85],"lerp_mode":"catmullrom"},"5.2":{"pre":[-72.5,117.5,85],"post":[-72.5,117.5,85],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0.25,0,-1],"post":[0.25,0,-1],"lerp_mode":"catmullrom"},"5.2":{"pre":[0.25,0,-1],"post":[0.25,0,-1],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"pre":[49.1,25.8,0],"post":[49.1,25.8,0],"lerp_mode":"catmullrom"},"2.6":{"pre":[29.1,40.8,-12.5],"post":[29.1,40.8,-12.5],"lerp_mode":"catmullrom"},"5.2":{"pre":[49.1,25.8,0],"post":[49.1,25.8,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[-0.25,0,1],"post":[-0.25,0,1],"lerp_mode":"catmullrom"},"5.2":{"pre":[-0.25,0,1],"post":[-0.25,0,1],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"pre":[-72.5,-117.5,-85],"post":[-72.5,-117.5,-85],"lerp_mode":"catmullrom"},"2.6":{"pre":[-80,-117.5,-85],"post":[-80,-117.5,-85],"lerp_mode":"catmullrom"},"5.2":{"pre":[-72.5,-117.5,-85],"post":[-72.5,-117.5,-85],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[-0.25,0,-1],"post":[-0.25,0,-1],"lerp_mode":"catmullrom"},"5.2":{"pre":[-0.25,0,-1],"post":[-0.25,0,-1],"lerp_mode":"catmullrom"}}},"tail":{"rotation":{"0.0":{"pre":[0,15,0],"post":[0,15,0],"lerp_mode":"catmullrom"},"2.6":{"pre":[0,-32,0],"post":[0,-32,0],"lerp_mode":"catmullrom"},"5.2":{"pre":[0,15,0],"post":[0,15,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"pre":[11.7,0,0],"post":[11.7,0,0],"lerp_mode":"catmullrom"},"2.6":{"pre":[2.4,0,0],"post":[2.4,0,0],"lerp_mode":"catmullrom"},"5.2":{"pre":[11.7,0,0],"post":[11.7,0,0],"lerp_mode":"catmullrom"}}},"left_gills":{"rotation":{"0.0":{"pre":[0,-25.6,0],"post":[0,-25.6,0],"lerp_mode":"catmullrom"},"3.12":{"pre":[0,16,0],"post":[0,16,0],"lerp_mode":"catmullrom"},"5.2":{"pre":[0,-25.6,0],"post":[0,-25.6,0],"lerp_mode":"catmullrom"}}},"right_gills":{"rotation":{"0.0":{"pre":[0,23,0],"post":[0,23,0],"lerp_mode":"catmullrom"},"2.08":{"pre":[0,-26,0],"post":[0,-26,0],"lerp_mode":"catmullrom"},"5.2":{"pre":[0,23,0],"post":[0,23,0],"lerp_mode":"catmullrom"}}},"top_gills":{"rotation":{"0.0":{"pre":[-19.2,0,0],"post":[-19.2,0,0],"lerp_mode":"catmullrom"},"2.6":{"pre":[12.3,0,0],"post":[12.3,0,0],"lerp_mode":"catmullrom"},"5.2":{"pre":[-19.2,0,0],"post":[-19.2,0,0],"lerp_mode":"catmullrom"}}}}},"animation.{name}.idle_floor":{"loop":true,"animation_length":2.8,"bones":{"body":{"rotation":{"0.0":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"pre":[77.5,-22.5,0],"post":[77.5,-22.5,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[77.5,-22.5,0],"post":[77.5,-22.5,0],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"pre":[-77.5,0,0],"post":[-77.5,0,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[-77.5,0,0],"post":[-77.5,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"pre":[77.5,25,0],"post":[77.5,25,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[77.5,25,0],"post":[77.5,25,0],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"pre":[-77.5,0,0],"post":[-77.5,0,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[-77.5,0,0],"post":[-77.5,0,0],"lerp_mode":"catmullrom"}}},"tail":{"rotation":{"0.0":[0,10,0],"0.32":[0,10,0],"1.04":[0,-10,0],"1.76":[0,-10,0],"2.48":[0,10,0],"2.8":[0,10,0]}},"head":{"rotation":{"0.0":{"pre":[0,0,-11],"post":[0,0,-11],"lerp_mode":"catmullrom"},"1.28":{"pre":[-13.2,-2.7,-11.5],"post":[-13.2,-2.7,-11.5],"lerp_mode":"catmullrom"},"1.44":{"pre":[-13.2,-2.7,-11.5],"post":[-13.2,-2.7,-11.5],"lerp_mode":"catmullrom"},"2.8":{"pre":[0,0,-11],"post":[0,0,-11],"lerp_mode":"catmullrom"}}},"left_gills":{"rotation":{"0.0":{"pre":[0,38,0],"post":[0,38,0],"lerp_mode":"catmullrom"},"1.28":{"pre":[0,45.5,0],"post":[0,45.5,0],"lerp_mode":"catmullrom"},"1.64":{"pre":[0,45.5,0],"post":[0,45.5,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[0,38,0],"post":[0,38,0],"lerp_mode":"catmullrom"}}},"right_gills":{"rotation":{"0.0":{"pre":[0,-50,0],"post":[0,-50,0],"lerp_mode":"catmullrom"},"1.28":{"pre":[0,-59,0],"post":[0,-59,0],"lerp_mode":"catmullrom"},"1.56":{"pre":[0,-59,0],"post":[0,-59,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[0,-50,0],"post":[0,-50,0],"lerp_mode":"catmullrom"}}},"top_gills":{"rotation":{"0.0":{"pre":[33,0,0],"post":[33,0,0],"lerp_mode":"catmullrom"},"1.28":{"pre":[47.4,0,0],"post":[47.4,0,0],"lerp_mode":"catmullrom"},"1.64":{"pre":[47.4,0,0],"post":[47.4,0,0],"lerp_mode":"catmullrom"},"2.8":{"pre":[33,0,0],"post":[33,0,0],"lerp_mode":"catmullrom"}}}}},"animation.{name}.idle_floor_underwater":{"loop":true,"animation_length":5.12,"bones":{"body":{"rotation":{"0.0":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0,1.5,0],"post":[0,1.5,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[0,1.5,0],"post":[0,1.5,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"pre":[-60,145,0],"post":[-60,145,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[-60,145,0],"post":[-60,145,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0.5,0,0.5],"post":[0.5,0,0.5],"lerp_mode":"catmullrom"},"5.12":{"pre":[0.5,0,0.5],"post":[0.5,0,0.5],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"pre":[-60,0,0],"post":[-60,0,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[-57.5,0,2.5],"post":[-57.5,0,2.5],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"pre":[-60,215,0],"post":[-60,215,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[-60,215,0],"post":[-60,215,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[-0.5,0,0.5],"post":[-0.5,0,0.5],"lerp_mode":"catmullrom"},"5.12":{"pre":[-0.5,0,0.5],"post":[-0.5,0,0.5],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"pre":[-60,0,0],"post":[-60,0,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[-57.5,0,-2.5],"post":[-57.5,0,-2.5],"lerp_mode":"catmullrom"}}},"tail":{"rotation":{"0.0":{"pre":[0,15,0],"post":[0,15,0],"lerp_mode":"catmullrom"},"2.56":{"pre":[0,-18.8,0],"post":[0,-18.8,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[0,15,0],"post":[0,15,0],"lerp_mode":"catmullrom"}}},"left_gills":{"rotation":{"0.0":{"pre":[0,-25.6,0],"post":[0,-25.6,0],"lerp_mode":"catmullrom"},"3.12":{"pre":[0,15.8,0],"post":[0,15.8,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[0,-25.6,0],"post":[0,-25.6,0],"lerp_mode":"catmullrom"}}},"right_gills":{"rotation":{"0.0":{"pre":[0,22.5,0],"post":[0,22.5,0],"lerp_mode":"catmullrom"},"2.08":{"pre":[0,-25.9,0],"post":[0,-25.9,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[0,22.5,0],"post":[0,22.5,0],"lerp_mode":"catmullrom"}}},"top_gills":{"rotation":{"0.0":{"pre":[-19,0,0],"post":[-19,0,0],"lerp_mode":"catmullrom"},"2.56":{"pre":[12.3,0,0],"post":[12.3,0,0],"lerp_mode":"catmullrom"},"5.12":{"pre":[-19,0,0],"post":[-19,0,0],"lerp_mode":"catmullrom"}}}}},"animation.{name}.swim":{"loop":true,"animation_length":1,"bones":{"body":{"rotation":{"0.0":{"pre":[8.3,0,0],"post":[8.3,0,0]},"0.24":{"pre":[11.83,0,0],"post":[11.83,0,0]},"0.68":{"pre":[-7.5,0,0],"post":[-7.5,0,0]},"0.96":{"pre":[6.84,0,0],"post":[6.84,0,0]}},"position":{"0.0":{"pre":[0,0,0],"post":[0,0,0]},"0.52":{"pre":[0,-1,0],"post":[0,-1,0]},"0.96":{"pre":[0,-0.05,0],"post":[0,-0.05,0]}}},"right_arm":{"rotation":{"0.0":{"pre":[72.5,80,95],"post":[72.5,80,95]},"0.52":{"pre":[72.5,110,95],"post":[72.5,110,95]},"0.96":{"pre":[72.5,81.64,95],"post":[72.5,81.64,95]}}},"right_leg":{"rotation":{"0.0":{"pre":[-97.5,87.5,-90],"post":[-97.5,87.5,-90]},"0.28":{"pre":[-97.5,107.5,-90],"post":[-97.5,107.5,-90]},"0.76":{"pre":[-97.5,68.71,-90],"post":[-97.5,68.71,-90]},"0.96":{"pre":[-97.5,84.79,-90],"post":[-97.5,84.79,-90]}}},"left_arm":{"rotation":{"0.0":{"pre":[72.5,-80,-95],"post":[72.5,-80,-95]},"0.52":{"pre":[72.5,-110,-95],"post":[72.5,-110,-95]},"0.96":{"pre":[72.5,-81.64,-95],"post":[72.5,-81.64,-95]}}},"left_leg":{"rotation":{"0.0":{"pre":[-97.5,-87.5,90],"post":[-97.5,-87.5,90]},"0.28":{"pre":[-97.5,-108.75,90],"post":[-97.5,-108.75,90]},"0.76":{"pre":[-97.5,-69.96,90],"post":[-97.5,-69.96,90]},"0.96":{"pre":[-97.5,-84.94,90],"post":[-97.5,-84.94,90]}}},"tail":{"rotation":{"0.0":{"pre":[0,15,0],"post":[0,15,0]},"0.52":{"pre":[0,-15,0],"post":[0,-15,0]},"0.96":{"pre":[0,13.36,0],"post":[0,13.36,0]}}},"head":{"rotation":{"0.0":{"pre":[-7.5,0,0],"post":[-7.5,0,0]},"0.28":{"pre":[-13.9,0,0],"post":[-13.9,0,0]},"0.72":{"pre":[14.23,0,0],"post":[14.23,0,0]},"0.96":{"pre":[-5.1,0,0],"post":[-5.1,0,0]}}},"left_gills":{"rotation":{"0.0":{"pre":[0,-72,0],"post":[0,-72,0]},"0.2":{"pre":[0,-79.9,0],"post":[0,-79.9,0]},"0.64":{"pre":[0,-38.1,0],"post":[0,-38.1,0]},"0.96":{"pre":[0,-69.31,0],"post":[0,-69.31,0]}}},"right_gills":{"rotation":{"0.0":{"pre":[0,72,0],"post":[0,72,0]},"0.2":{"pre":[0,86.5,0],"post":[0,86.5,0]},"0.64":{"pre":[0,26.7,0],"post":[0,26.7,0]},"0.96":{"pre":[0,68.38,0],"post":[0,68.38,0]}}},"top_gills":{"rotation":{"0.0":{"pre":[-57,0,0],"post":[-57,0,0]},"0.2":{"pre":[-68.7,0,0],"post":[-68.7,0,0]},"0.64":{"pre":[-24.2,0,0],"post":[-24.2,0,0]},"0.96":{"pre":[-54.37,0,0],"post":[-54.37,0,0]}}}}},"animation.{name}.walk_floor":{"loop":true,"animation_length":2.72,"bones":{"body":{"rotation":{"0.0":[0,0,0],"2.72":[0,0,0]}},"right_arm":{"rotation":{"0.0":{"pre":[77.5,35,0],"post":[77.5,35,0],"lerp_mode":"catmullrom"},"1.32":{"pre":[77.5,-22.5,0],"post":[77.5,-22.5,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[77.5,35,0],"post":[77.5,35,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0.5,0,0],"post":[0.5,0,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[0.5,0,0],"post":[0.5,0,0],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"pre":[-77.5,-25,0],"post":[-77.5,-25,0],"lerp_mode":"catmullrom"},"1.32":{"pre":[-77.5,22.5,0],"post":[-77.5,22.5,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[-77.5,-25,0],"post":[-77.5,-25,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0.5,0,0],"post":[0.5,0,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[0.5,0,0],"post":[0.5,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"pre":[77.5,32.5,0],"post":[77.5,32.5,0],"lerp_mode":"catmullrom"},"1.32":{"pre":[77.5,-30,0],"post":[77.5,-30,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[77.5,32.5,0],"post":[77.5,32.5,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"pre":[-77.5,-30,0],"post":[-77.5,-30,0],"lerp_mode":"catmullrom"},"1.32":{"pre":[-77.5,15,0],"post":[-77.5,15,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[-77.5,-30,0],"post":[-77.5,-30,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"}}},"tail":{"rotation":{"0.0":{"pre":[0,-10,0],"post":[0,-10,0],"lerp_mode":"catmullrom"},"1.32":{"pre":[0,10,0],"post":[0,10,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[0,-10,0],"post":[0,-10,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"pre":[0,-7.5,0],"post":[0,-7.5,0],"lerp_mode":"catmullrom"},"1.32":{"pre":[0,6.7,0],"post":[0,6.7,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[0,-7.5,0],"post":[0,-7.5,0],"lerp_mode":"catmullrom"}}},"left_gills":{"rotation":{"0.0":{"pre":[0,38.1,0],"post":[0,38.1,0],"lerp_mode":"catmullrom"},"1.08":{"pre":[0,45.6,0],"post":[0,45.6,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[0,45.6,0],"post":[0,45.6,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[0,38.1,0],"post":[0,38.1,0],"lerp_mode":"catmullrom"}}},"right_gills":{"rotation":{"0.0":{"pre":[0,-50,0],"post":[0,-50,0],"lerp_mode":"catmullrom"},"1.08":{"pre":[0,-59,0],"post":[0,-59,0],"lerp_mode":"catmullrom"},"1.36":{"pre":[0,-59,0],"post":[0,-59,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[0,-50,0],"post":[0,-50,0],"lerp_mode":"catmullrom"}}},"top_gills":{"rotation":{"0.0":{"pre":[33,0,0],"post":[33,0,0],"lerp_mode":"catmullrom"},"1.08":{"pre":[47.4,0,0],"post":[47.4,0,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[47.4,0,0],"post":[47.4,0,0],"lerp_mode":"catmullrom"},"2.72":{"pre":[33,0,0],"post":[33,0,0],"lerp_mode":"catmullrom"}}}}},"animation.{name}.walk_floor_underwater":{"loop":true,"animation_length":2.04,"bones":{"body":{"rotation":{"0.0":{"pre":[0,-5,6],"post":[0,-5,6],"lerp_mode":"catmullrom"},"1.04":{"pre":[0,5,-4],"post":[0,5,-4],"lerp_mode":"catmullrom"},"2.04":{"pre":[0,-5,6],"post":[0,-5,6],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0,1.5,0],"post":[0,1.5,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[0,1.5,0],"post":[0,1.5,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"pre":[45,-52.5,0],"post":[45,-52.5,0],"lerp_mode":"catmullrom"},"0.72":{"pre":[56.72,2.34,0],"post":[56.72,2.34,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[52.5,45,0],"post":[52.5,45,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[45,-52.5,0],"post":[45,-52.5,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[1,0,0],"post":[1,0,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"pre":[-40,55,0],"post":[-40,55,0],"lerp_mode":"catmullrom"},"0.72":{"pre":[-55,-35,0],"post":[-55,-35,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[-54.99,10.03,0],"post":[-54.99,10.03,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[-40,55,0],"post":[-40,55,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[1,0,0],"post":[1,0,0],"lerp_mode":"catmullrom"},"0.72":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[1,0,0],"post":[1,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"pre":[65,-55,0],"post":[65,-55,0],"lerp_mode":"catmullrom"},"0.72":{"pre":[50,52.5,0],"post":[50,52.5,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[50.01,-1.29,0],"post":[50.01,-1.29,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[65,-55,0],"post":[65,-55,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"},"0.72":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"pre":[-62.5,35,0],"post":[-62.5,35,0],"lerp_mode":"catmullrom"},"0.72":{"pre":[-46.87,-15.62,0],"post":[-46.87,-15.62,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[-52.5,-55,0],"post":[-52.5,-55,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[-62.5,35,0],"post":[-62.5,35,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"},"1.44":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[-0.5,0,0],"post":[-0.5,0,0],"lerp_mode":"catmullrom"}}},"tail":{"rotation":{"0.0":{"pre":[0,15,0],"post":[0,15,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[0,15,0],"post":[0,15,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"pre":[0,4,-5.8],"post":[0,4,-5.8],"lerp_mode":"catmullrom"},"1.04":{"pre":[0,-4,5],"post":[0,-4,5],"lerp_mode":"catmullrom"},"2.04":{"pre":[0,4,-5.8],"post":[0,4,-5.8],"lerp_mode":"catmullrom"}}},"left_gills":{"rotation":{"0.0":{"pre":[0,-60,0],"post":[0,-60,0],"lerp_mode":"catmullrom"},"1.24":{"pre":[0,-45,0],"post":[0,-45,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[0,-60,0],"post":[0,-60,0],"lerp_mode":"catmullrom"}}},"right_gills":{"rotation":{"0.0":{"pre":[0,38,0],"post":[0,38,0],"lerp_mode":"catmullrom"},"0.64":{"pre":[0,53,0],"post":[0,53,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[0,38,0],"post":[0,38,0],"lerp_mode":"catmullrom"}}},"top_gills":{"rotation":{"0.0":{"pre":[-34,0,0],"post":[-34,0,0],"lerp_mode":"catmullrom"},"1.04":{"pre":[-41.5,0,0],"post":[-41.5,0,0],"lerp_mode":"catmullrom"},"2.04":{"pre":[-34,0,0],"post":[-34,0,0],"lerp_mode":"catmullrom"}}}}},"animation.{name}.play_dead":{"loop":true,"bones":{"body":{"rotation":[0.0,0.0,45.0]},"head":{"rotation":[0.0,0.0,45.0]}}},"animation.{name}.swim_angle":{"loop":true,"bones":{"body":{"rotation":["variable.pitch",0.0,0.0]}}}}}'},2902:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.flying":{"loop":true,"bones":{"body":{"rotation":["45.0 - math.cos(query.life_time * 1489.6) * 8.59",0,0],"position":[0,"math.cos(query.life_time * 343.774) * 1.6",0]},"head":{"rotation":["query.target_x_rotation","query.target_y_rotation",0],"position":["-this","math.cos(query.life_time * 343.774) * 1.6 - this","-this"]},"leftWing":{"rotation":[0,"math.cos(query.life_time * 1489.6) * -45.0",0],"position":["-this","-this","-this"]},"leftWingTip":{"rotation":[0,"math.cos(query.life_time * 1489.6) * -22.0",0]},"rightWing":{"rotation":[0,"math.cos(query.life_time * 1489.6) * 45.0",0],"position":["-this","-this","-this"]},"rightWingTip":{"rotation":[0,"math.cos(query.life_time * 1489.6) * 22.0",0]}}},"animation.{name}.resting":{"loop":true,"bones":{"body":{"rotation":[180,0,0],"position":[0,-0.035,0]},"head":{"rotation":["query.target_x_rotation","180.0f - query.target_y_rotation",180],"position":[0,-0.035,0]},"leftWing":{"rotation":[-9,72,0],"position":[3,0,3]},"leftWingTip":{"rotation":[0,99,0]},"rightWing":{"rotation":[-9,-72,0],"position":[-3,0,3]},"rightWingTip":{"rotation":[0,-99,0]}}}}}'},4017:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.flying":{"loop":true,"animation_length":2.55,"bones":{"body":{"rotation":{"0.0":[0,0,0],"1.3":[5,0,0],"2.55":[0,0,0]}},"leftwing_bone":{"rotation":{"0.0":[0,0,35],"0.05":[0,0,0],"0.1":[0,0,-35],"0.15":[0,0,0],"0.2":[0,0,35],"0.25":[0,0,0],"0.3":[0,0,-35],"0.35":[0,0,0],"0.4":[0,0,35],"0.45":[0,0,0],"0.5":[0,0,-35],"0.55":[0,0,0],"0.6":[0,0,35],"0.65":[0,0,0],"0.7":[0,0,-35],"0.75":[0,0,0],"0.8":[0,0,35],"0.85":[0,0,0],"0.9":[0,0,-35],"0.95":[0,0,0],"1.0":[0,0,35],"1.05":[0,0,0],"1.1":[0,0,-35],"1.15":[0,0,0],"1.2":[0,0,35],"1.25":[0,0,0],"1.3":[0,0,-35],"1.35":[0,0,0],"1.4":[0,0,35],"1.45":[0,0,0],"1.5":[0,0,-35],"1.55":[0,0,0],"1.6":[0,0,35],"1.65":[0,0,0],"1.7":[0,0,-35],"1.75":[0,0,0],"1.8":[0,0,35],"1.85":[0,0,0],"1.9":[0,0,-35],"1.95":[0,0,0],"2.0":[0,0,35],"2.05":[0,0,0],"2.1":[0,0,-35],"2.15":[0,0,0],"2.2":[0,0,35],"2.25":[0,0,0],"2.3":[0,0,-35],"2.35":[0,0,0],"2.4":[0,0,35],"2.45":[0,0,0],"2.5":[0,0,-35],"2.55":[0,0,0]}},"leg_front":{"rotation":{"0.0":[15,0,0],"1.2":[25,0,0],"2.55":[15,0,0]}},"leg_mid":{"rotation":{"0.0":[15,0,0],"1.3":[35,0,0],"2.55":[15,0,0]}},"leg_back":{"rotation":{"0.0":[30,0,0],"1.6":[45,0,0],"2.55":[30,0,0]}},"rightwing_bone":{"rotation":{"0.0":[0,0,-35],"0.05":[0,0,0],"0.1":[0,0,35],"0.15":[0,0,0],"0.2":[0,0,-35],"0.25":[0,0,0],"0.3":[0,0,35],"0.35":[0,0,0],"0.4":[0,0,-35],"0.45":[0,0,0],"0.5":[0,0,35],"0.55":[0,0,0],"0.6":[0,0,-35],"0.65":[0,0,0],"0.7":[0,0,35],"0.75":[0,0,0],"0.8":[0,0,-35],"0.85":[0,0,0],"0.9":[0,0,35],"0.95":[0,0,0],"1.0":[0,0,-35],"1.05":[0,0,0],"1.1":[0,0,35],"1.15":[0,0,0],"1.2":[0,0,-35],"1.25":[0,0,0],"1.3":[0,0,35],"1.35":[0,0,0],"1.4":[0,0,-35],"1.45":[0,0,0],"1.5":[0,0,35],"1.55":[0,0,0],"1.6":[0,0,-35],"1.65":[0,0,0],"1.7":[0,0,35],"1.75":[0,0,0],"1.8":[0,0,-35],"1.85":[0,0,0],"1.9":[0,0,35],"1.95":[0,0,0],"2.0":[0,0,-35],"2.05":[0,0,0],"2.1":[0,0,35],"2.15":[0,0,0],"2.2":[0,0,-35],"2.25":[0,0,0],"2.3":[0,0,35],"2.35":[0,0,0],"2.4":[0,0,-35],"2.45":[0,0,0],"2.5":[0,0,35],"2.55":[0,0,0]}}}},"animation.{name}.sting":{"loop":true,"bones":{"body":{"rotation":["-175 * math.sin(variable.attack_time * 180)",0,0]}}},"animation.{name}.no_stinger":{"loop":true,"bones":{"stinger":{"scale":0}}},"animation.{name}.fly.bobbing":{"loop":true,"bones":{"body":{"rotation":[0,"20 * math.cos(query.life_time * 343.774 / 2)",0],"position":[0,"math.cos(query.life_time * 343.774) * 1.6",0]}}}}}'},5129:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"loop":true,"bones":{"upperBodyParts0":{"position":["math.cos(query.life_time * -360.0 ) * 9.0","2.0 + math.cos((0 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -360.0 ) * 9.0"]},"upperBodyParts1":{"position":["math.cos(query.life_time * -360.0 + 90.0) * 9.0","2.0 + math.cos((1 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -360.0 + 90.0) * 9.0"]},"upperBodyParts10":{"position":["math.cos(query.life_time * -180.0 + 207.0) * 5.0","-11.0 + math.cos((10 * 1.5 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -180.0 + 207.0) * 5.0"]},"upperBodyParts11":{"position":["math.cos(query.life_time * -180.0 + 297.0) * 5.0","-11.0 + math.cos((11 * 1.5 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -180.0 + 297.0) * 5.0"]},"upperBodyParts2":{"position":["math.cos(query.life_time * -360.0 + 180.0) * 9.0","2.0 + math.cos((2 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -360.0 + 180.0) * 9.0"]},"upperBodyParts3":{"position":["math.cos(query.life_time * -360.0 + 270.0) * 9.0","2.0 + math.cos((3 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -360.0 + 270.0) * 9.0"]},"upperBodyParts4":{"position":["math.cos(query.life_time * 108.0 + 45.0) * 7.0","-2.0 + math.cos((4 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * 108.0 + 45.0) * 7.0"]},"upperBodyParts5":{"position":["math.cos(query.life_time * 108.0 + 135.0) * 7.0","-2.0 + math.cos((5 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * 108.0 + 135.0) * 7.0"]},"upperBodyParts6":{"position":["math.cos(query.life_time * 108.0 + 225.0) * 7.0","-2.0 + math.cos((6 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * 108.0 + 225.0) * 7.0"]},"upperBodyParts7":{"position":["math.cos(query.life_time * 108.0 + 315.0) * 7.0","-2.0 + math.cos((7 * 2 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * 108.0 + 315.0) * 7.0"]},"upperBodyParts8":{"position":["math.cos(query.life_time * -180.0 + 27.0) * 5.0","-11.0 + math.cos((8 * 1.5 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -180.0 + 27.0) * 5.0"]},"upperBodyParts9":{"position":["math.cos(query.life_time * -180.0 + 117.0) * 5.0","-11.0 + math.cos((9 * 1.5 + query.life_time * 20.0) * 14.32)","math.sin(query.life_time * -180.0 + 117.0) * 5.0"]}}}}}'},5076:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.idle":{"loop":true,"animation_length":2,"bones":{"tornado_top":{"position":{"0.0":[0.5,0,0],"0.25":[0.5,0,-0.5],"0.75":[-0.5,0,-0.5],"1.25":[-0.5,0,0.5],"1.75":[0.5,0,0.5],"2.0":[0.5,0,0]}},"tornado_mid":{"position":{"0.0":[0.5,0,-0.5],"0.5":[-0.5,0,-0.5],"1.0":[-0.5,0,0.5],"1.5":[0.5,0,0.5],"2.0":[0.5,0,-0.5]}},"head":{"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[0,1,0],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"rods":{"rotation":{"0.0":[0,0,0],"2.0":[0,1080,0]},"position":{"0.0":[0,0,0],"1.0":[0,-1,0],"2.0":[0,0,0]}}}},"animation.{name}.shoot":{"animation_length":1.125,"bones":{"head":{"rotation":{"0.0":[0,0,0],"0.25":[-12.5,0,0],"0.75":[-12.5,0,0],"0.9167":[5,0,0],"1.125":[0,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,-2,0],"0.7917":[0,-1,2],"0.9583":[0,-1,0],"1.125":[0,0,0]}},"tornado_bottom":{"rotation":[0,0,0]},"tornado_mid":{"rotation":{"0.0":[0,0,0],"0.25":[12.5,0,0],"0.75":[12.5,0,0],"0.9167":[-10,0,0],"1.125":[0,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,0,5],"0.75":[0,0,6],"0.9167":[0,0,-2],"1.125":[0,0,0]}},"tornado_top":{"rotation":{"0.0":[0,0,0],"0.25":[15,0,0],"0.75":[15,0,0],"0.9167":[-10,0,0],"1.125":[0,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,0,3],"0.8333":[0,0,4],"0.9583":[0,0,-2],"1.125":[0,0,0]}},"body":{"rotation":{"0.0":[0,0,0],"0.25":[12.5,0,0],"0.75":[12.5,0,0],"0.9167":[-2.5,0,0],"1.125":[0,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,3,5],"0.8333":[0,3,6],"0.9583":[0,3,-1],"1.125":[0,0,0]}},"rods":{"rotation":{"0.0":[0,0,0],"1.0":[0,360,0]}}}},"animation.{name}.jump":{"animation_length":1.125,"bones":{"body":{"position":{"0.0":[0,0,0],"0.5":[0,-10,0],"0.625":[0,-10,0],"0.75":[0,11,0],"1.125":[0,0,0]}},"head":{"rotation":{"0.0":[0,0,0],"0.5":[22.5,0,0],"0.625":[22.5,0,0],"0.8333":[-19.25,0,0],"1.125":[0,0,0]}},"tornado_body":{"scale":{"0.0":[1,1,1],"0.5":[1,1,1],"0.625":[1,1,1],"0.75":[1,1.3,1],"1.125":[1,1,1]}},"tornado_bottom":{"rotation":{"0.0":[0,0,0],"0.625":[0,90,0],"1.125":[0,360,0]},"scale":{"0.0":[1,1,1],"0.5":[1,1,1],"0.625":[1,1,1],"0.75":[1,1.1,1],"1.125":[1,1,1]}},"tornado_mid":{"rotation":{"0.0":[0,0,0],"0.625":[0,0,0],"1.125":[0,180,0]},"position":{"0.0":[0,0,0],"0.5":[0,-6,0],"0.625":[0,-6,0],"0.75":[0,2,0],"1.125":[0,0,0]}},"tornado_top":{"rotation":{"0.0":[0,0,0],"0.625":[0,0,0],"1.125":[0,90,0]},"position":{"0.0":[0,0,0],"0.5":[0,-5,0],"0.625":[0,-5,0],"0.75":[0,2,0],"1.125":[0,0,0]}},"rods":{"rotation":{"0.0":[0,0,0],"0.8333":[0,360,0]}}},"particle_effects":{"0.75":{"effect":"ground_particles","pre_effect_script":"variable.ground_particle_amount = math.round(math.random( 3, 4)); variable.ground_particle_initial_speed = math.random( 5, 6 ); variable.ground_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.ground_particle_texture_size = query.surface_particle_texture_size; variable.ground_particle_color = query.surface_particle_color;"}}},"animation.{name}.slide":{"loop":"hold_on_last_frame","animation_length":0.2,"bones":{"body":{"position":{"0.0":[0,0,0],"0.2":[0,0,-6]}},"tornado_mid":{"position":{"0.0":[0,0,0],"0.2":[0,0,-3]}},"tornado_top":{"position":{"0.0":[0,0,0],"0.2":[0,0,-2]}}}},"animation.{name}.idle_ground_particles":{"loop":true,"animation_length":0.1,"particle_effects":{"0.0":{"effect":"ground_particles","pre_effect_script":"variable.ground_particle_amount = 1; variable.ground_particle_initial_speed = math.random( 2, 3 ); variable.ground_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.ground_particle_texture_size = query.surface_particle_texture_size; variable.ground_particle_color = query.surface_particle_color;"}}},"animation.{name}.slide_ground_particles":{"loop":true,"animation_length":0.1,"particle_effects":{"0.0":{"effect":"ground_particles","pre_effect_script":"variable.ground_particle_amount = 5; variable.ground_particle_initial_speed = math.random( 3, 4 ); variable.ground_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.ground_particle_texture_size = query.surface_particle_texture_size; variable.ground_particle_color = query.surface_particle_color;"}}},"animation.{name}.whirl_sound":{"loop":true,"animation_length":1.5,"sound_effects":{"0.0":{"effect":"whirl"}}},"animation.{name}.idle_ground_sound":{"loop":true,"animation_length":6.0,"sound_effects":{"0.0":{"effect":"idle_ground_sound"}}}}}'},4043:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.walk":{"loop":true,"animation_length":1.5,"anim_time_update":"query.anim_time + math.max(1.215, math.pow(10, query.modified_move_speed) / 2.9) * query.delta_time","bones":{"root":{"rotation":{"0.0":{"post":[0,0,1.75],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,-1.75],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,1.75],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[2.5,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[-2.5,0,0],"lerp_mode":"catmullrom"},"0.75":{"post":[2.5,0,0],"lerp_mode":"catmullrom"},"1.125":{"post":[-2.5,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[2.5,0,0],"lerp_mode":"catmullrom"}}},"right_front_leg":{"rotation":{"0.0":{"post":[22.5,0,0],"lerp_mode":"catmullrom"},"0.75":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[22.5,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.4583":{"post":[0,4,0],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_front_leg":{"rotation":{"0.0":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"},"0.75":{"post":[22.5,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.2083":{"post":[0,4,0],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_hind_leg":{"rotation":{"0.0":{"post":[-20.4,0,0],"lerp_mode":"catmullrom"},"0.75":{"post":[22.5,0,0],"lerp_mode":"catmullrom"},"1.375":[-22.5,0,0],"1.5":[-20.4,0,0]},"position":{"0.0":{"post":[0,-0.21,0],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0833":{"post":[0,4,0],"lerp_mode":"catmullrom"},"1.375":[0,0,0],"1.5":[0,-0.21,0]}},"right_hind_leg":{"rotation":{"0.0":{"post":[22.5,0,0],"lerp_mode":"catmullrom"},"0.625":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[22.5,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[0,4,0],"lerp_mode":"catmullrom"},"0.625":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_ear":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[0,0,22.5],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.125":{"post":[0,0,22.5],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_ear":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[0,0,-22.5],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.125":{"post":[0,0,-22.5],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"tail":{"rotation":{"0.0":{"post":[15.94102,-8.42106,20.94102],"lerp_mode":"catmullrom"},"0.75":{"post":[15.94102,8.42106,-20.94102],"lerp_mode":"catmullrom"},"1.5":{"post":[15.94102,-8.42106,20.94102],"lerp_mode":"catmullrom"}}}}},"animation.{name}.stand_up":{"loop":"hold_on_last_frame","animation_length":2.6,"bones":{"body":{"rotation":{"0.0":[0,0,0],"0.7":{"pre":[-17.5,0,0],"post":[-17.5,0,0],"lerp_mode":"catmullrom"},"1.8":{"post":[-17.83,0,0],"lerp_mode":"catmullrom"},"2.3":[-5.83,0,0],"2.6":[0,0,0]},"position":{"0.0":[0,-19.9,0],"0.7":[0,-19.9,-3],"1.4":{"pre":[0,-12.76,-4],"post":[0,-12.76,-4],"lerp_mode":"catmullrom"},"1.8":{"post":[0,-10.1,-4],"lerp_mode":"catmullrom"},"2.3":[0,-2.9,-2],"2.6":[0,0,0]}},"right_front_leg":{"rotation":{"0.0":[-90,10,0],"0.5":[-90,10,0],"1.1":[-49.06,10,0],"1.8":[-22.5,10,0],"2.3":[-25,10,0],"2.6":[0,0,0]},"position":{"0.0":[0,-20.6,12],"0.5":[0,-20.6,8],"1.1":[0,-7.14,4.42],"1.8":[0,-1.27,-1.33],"2.3":[0,-1.27,-0.33],"2.6":[0,0,0]}},"left_front_leg":{"rotation":{"0.0":[-90,-10,0],"0.5":[-90,-10,0],"1.1":[-49.06,-10,0],"1.8":[-22.5,-10,0],"2.3":[-25,-10,0],"2.6":[0,0,0]},"position":{"0.0":[0,-20.6,12],"0.5":[0,-20.6,8],"1.1":[0,-7.14,4.42],"1.8":[0,-1.27,-1.33],"2.3":[0,-1.27,-0.33],"2.6":[0,0,0]}},"left_hind_leg":{"rotation":{"0.0":[-90,-15,0],"0.3":[-90,0,0],"0.6":[-90,0,0],"1.1":[-60,0,0],"1.9":[35,0,0],"2.2":[30,0,0],"2.6":[0,0,0]},"position":{"0.0":[1,-20.5,5],"0.3":[-2,-20.5,3],"0.6":[-2,-20.5,3],"1.1":[-2,-10.5,2],"1.5":[-2,-0.4,-3.9],"1.9":[-2,-4.3,-9.8],"2.2":[-1,-2.5,-5],"2.6":[0,0,0]}},"right_hind_leg":{"rotation":{"0.0":[-90,15,0],"0.3":[-90,0,0],"0.6":[-90,0,0],"1.1":[-60,0,0],"1.9":[35,0,0],"2.2":[30,0,0],"2.6":[0,0,0]},"position":{"0.0":[-1,-20.5,5],"0.3":[2,-20.5,3],"0.6":[2,-20.5,3],"1.1":[2,-10.5,2],"1.5":[2,-0.4,-3.9],"1.9":[2,-4.3,-9.8],"2.2":[1,-2.5,-5],"2.6":[0,0,0]}},"head":{"rotation":{"0.0":[0,0,0],"0.3":[0,0,0],"0.8":[55,0,0],"2.0":[65,0,0],"2.4":[0,0,0]}},"tail":{"rotation":{"0.0":[50,0,0],"0.4":[55,0,0],"0.9":[55,0,0],"1.5":[17.5,0,0],"2.6":[5,0,0]}},"left_ear":{"rotation":{"0.0":[0,0,-45],"2.6":[0,0,-45]}},"right_ear":{"rotation":{"0.0":[0,0,45],"2.6":[0,0,45]}}},"sound_effects":{"0.0":{"effect":"stand_up"}}},"animation.{name}.dash":{"animation_length":0.5,"loop":true,"bones":{"body":{"rotation":{"0.0":[5,0,0],"0.5":[5,0,0]}},"tail":{"rotation":{"0.0":{"post":[67.5,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[112.5,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[67.5,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[112.5,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[67.5,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[10,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[10,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[10,0,0],"lerp_mode":"catmullrom"}}},"right_front_leg":{"rotation":{"0.0":{"post":[44.97272,1.76749,-1.76833],"lerp_mode":"catmullrom"},"0.125":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[44.97272,1.76749,-1.76833],"lerp_mode":"catmullrom"},"0.375":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[44.97272,1.76749,-1.76833],"lerp_mode":"catmullrom"}}},"left_front_leg":{"rotation":{"0.0":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[44.97272,-1.76749,1.76833],"lerp_mode":"catmullrom"},"0.25":{"post":[-90,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[44.97272,-1.76749,1.76833],"lerp_mode":"catmullrom"},"0.5":{"post":[-90,0,0],"lerp_mode":"catmullrom"}}},"left_hind_leg":{"rotation":{"0.0":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[90,0,0],"lerp_mode":"catmullrom"}}},"right_hind_leg":{"rotation":{"0.0":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[-45,0,0],"lerp_mode":"catmullrom"}}},"left_ear":{"rotation":{"0.0":[0,-67.5,0],"0.5":[0,-67.5,0]}},"right_ear":{"rotation":{"0.0":[0,67.5,0],"0.5":[0,67.5,0]}}}},"animation.{name}.dash_sound":{"animation_length":0.5,"loop":false,"sound_effects":{"0.0":{"effect":"dash"}}},"animation.{name}.idle":{"loop":true,"animation_length":4,"bones":{"head":{"rotation":["variable.xHeadRot","variable.yHeadRot",0]},"tail":{"rotation":{"0.0":{"post":[5,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[4.98107,0.43523,-4.98107],"lerp_mode":"catmullrom"},"3.0":{"post":[4.9872,-0.29424,3.36745],"lerp_mode":"catmullrom"},"4.0":{"post":[5,0,0],"lerp_mode":"catmullrom"}}},"left_ear":{"rotation":{"0.0":{"post":[0,0,-45],"lerp_mode":"catmullrom"},"2.5":{"post":[0,0,-45],"lerp_mode":"catmullrom"},"2.625":{"post":[0,0,22.5],"lerp_mode":"catmullrom"},"2.75":{"post":[0,0,-45],"lerp_mode":"catmullrom"},"2.875":{"post":[0,0,22.5],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,-45],"lerp_mode":"catmullrom"},"4.0":{"post":[0,0,-45],"lerp_mode":"catmullrom"}}},"right_ear":{"rotation":{"0.0":{"post":[0,0,45],"lerp_mode":"catmullrom"},"2.5":{"post":[0,0,45],"lerp_mode":"catmullrom"},"2.625":{"post":[0,0,-22.5],"lerp_mode":"catmullrom"},"2.75":{"post":[0,0,45],"lerp_mode":"catmullrom"},"2.875":{"post":[0,0,-22.5],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,45],"lerp_mode":"catmullrom"},"4.0":{"post":[0,0,45],"lerp_mode":"catmullrom"}}}}},"animation.{name}.sit_down":{"loop":"hold_on_last_frame","animation_length":2,"bones":{"body":{"rotation":{"0.0":[0,0,0],"1.3":[30,0,0],"1.8":[24,0,0],"2.0":[0,0,0]},"position":{"0.0":[0,0,0],"1.3":[0,0,1],"1.8":[0,-6,1],"2.0":[0,-19.9,0]}},"right_front_leg":{"rotation":{"0.0":[0,0,0],"1.0":[-30,0,0],"1.5":[-30,0,0],"2.0":[-90,10,0]},"position":{"0.0":[0,0,0],"1.0":[0,-2,11],"1.5":[0,-2,11],"1.7":[0,-8.4,11.4],"2.0":[0,-20.6,12]}},"left_front_leg":{"rotation":{"0.0":[0,0,0],"1.0":[-30,0,0],"1.5":[-30,0,0],"2.0":[-90,-10,0]},"position":{"0.0":[0,0,0],"1.0":[0,-2,11],"1.5":[0,-2,11],"1.7":[0,-8.4,11.4],"2.0":[0,-20.6,12]}},"left_hind_leg":{"rotation":{"0.0":[0,0,0],"0.5":[0,0,0],"1.5":[-10,0,0],"1.7":[-15,-3,0],"1.9":[-65,-9,0],"2.0":[-90,-15,0]},"position":{"0.0":[0,0,0],"0.5":[0,0,0],"1.5":[0,0,1],"1.7":[1,-0.62,0.25],"1.9":[0.5,-11.25,2.5],"2.0":[1,-20.5,5]}},"right_hind_leg":{"rotation":{"0.0":[0,0,0],"0.5":[0,0,0],"1.5":[-10,0,0],"1.7":[-15,3,0],"1.9":[-65,9,0],"2.0":[-90,15,0]},"position":{"0.0":[0,0,0],"0.5":[0,0,0],"1.5":[0,0,1],"1.7":[-1,-0.62,0.25],"1.9":[-0.5,-11.25,2.5],"2.0":[-1,-20.5,5]}},"head":{"rotation":{"0.0":[0,0,0],"0.7":[-27.5,0,0],"1.5":[-21.25,0,0],"2.0":[0,0,0]}},"tail":{"rotation":{"0.0":[5,0,0],"1.7":[5,0,0],"1.9":[80,0,0],"2.0":[50,0,0]}}},"sound_effects":{"0.0":{"effect":"sit_down"}}},"animation.{name}.sit":{"loop":true,"bones":{"body":{"rotation":[0,0,0],"position":[0,-19.9,0]},"right_front_leg":{"rotation":[-90,10,0],"position":[0,-20.6,12]},"left_front_leg":{"rotation":[-90,-10,0],"position":[0,-20.6,12]},"left_hind_leg":{"rotation":[-90,-15,0],"position":[1,-20.5,5]},"right_hind_leg":{"rotation":[-90,15,0],"position":[-1,-20.5,5]},"tail":{"rotation":[50,0,0]}}}}}'},6609:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"scale":1.5}}},"animation.{name}.lie_down":{"loop":true,"bones":{"backLegL":{"rotation":[-22.92,0,0],"position":[0,-0.7,0]},"backLegR":{"rotation":[28.65,0,-28.65],"position":[0.1,-1.2,0]},"body":{"rotation":[0,0,"math.lerprotate(0.0, 90.0, variable.liedownamount)"],"position":[0,"variable.liedownamount * -4.5 + variable.lieonplayer * (4.5 + query.is_baby * 6)",0]},"frontLegL":{"rotation":[-72.81,0,0],"position":[0,-1,-1.5]},"frontLegR":{"rotation":[-30,0,-14.46],"position":[0.2,-0.9,0]},"head":{"rotation":[-10,"math.lerprotate(this, 75.81, variable.liedownamount)",0],"position":[-0.1,0,-0.5]},"tail1":{"rotation":["math.lerprotate(this, -33.84, variable.liedownamounttail)",0,0],"position":[0,0,0]},"tail2":{"rotation":["math.lerprotate(this, -68.92, variable.liedownamounttail)",0,0],"position":[0,0,0]}}},"animation.{name}.sit":{"loop":true,"bones":{"backLegL":{"rotation":[-45,0,0],"position":[0,0,1]},"backLegR":{"rotation":[-45,0,0],"position":[0,0,1]},"body":{"rotation":[-45,0,0],"position":[0,-1,0]},"frontLegL":{"rotation":[42.15,0,0],"position":[0,-4.5,-1]},"frontLegR":{"rotation":[42.15,0,0],"position":[0,-4.5,-1]},"tail1":{"rotation":[87.5,0,0],"position":[0,-3,1]},"tail2":{"rotation":[-7.5,0,0],"position":[0,0,0]}}},"animation.{name}.sneak":{"loop":true,"bones":{"backLegL":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed",0,0],"position":[0,1,0]},"backLegR":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed",0,0],"position":[0,1,0]},"body":{"position":[0,-1,0]},"frontLegL":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed",0,0],"position":[0,1,0]},"frontLegR":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed",0,0],"position":[0,1,0]},"head":{"position":[0,-1,0]},"tail1":{"position":[0,1,0]},"tail2":{"rotation":["-3 + math.cos(query.modified_distance_moved * 57.3) * 27.0 * query.modified_move_speed",0,0]}}},"animation.{name}.sprint":{"loop":true,"bones":{"backLegL":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed",0,0]},"backLegR":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 17.19) * 57.3 * query.modified_move_speed",0,0]},"frontLegL":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 197.19) * 57.3 * query.modified_move_speed",0,0]},"frontLegR":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed",0,0]},"tail1":{"rotation":[0,0,0]},"tail2":{"rotation":["-8 + math.cos(query.modified_distance_moved * 57.3) * 18.0 * query.modified_move_speed",0,0]}}},"animation.{name}.walk":{"loop":true,"bones":{"backLegL":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed",0,0]},"backLegR":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed",0,0]},"frontLegL":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed",0,0]},"frontLegR":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed",0,0]},"tail1":{"rotation":[28.43,0,0]},"tail2":{"rotation":["-43 + math.cos(query.modified_distance_moved * 57.3) * 45.0 * query.modified_move_speed",0,0]}}}}}'},9830:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"scale":2}}},"animation.{name}.general":{"loop":true,"bones":{"wing0":{"rotation":[0,0,"variable.wing_flap - this"]},"wing1":{"rotation":[0,0,"-variable.wing_flap - this"]}}},"animation.{name}.move":{"loop":true,"anim_time_update":"query.modified_distance_moved","bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0,0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0,0]}}}}}'},6451:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.flop":{"loop":true,"bones":{"body":{"rotation":[0,"math.cos(variable.animationamountblend * 45.0) * 2.0","variable.zrot"]},"head":{"rotation":[0,"math.cos(variable.animationamountblend * 45.0) * 4.0",0]},"tailfin":{"rotation":[0,"math.cos(variable.animationamountblend * 45.0) * -25.75",0]}}},"animation.{name}.swim":{"loop":true,"bones":{"body":{"rotation":[0,"math.cos(variable.animationamountblend * 30.0) * 2.0",0]},"head":{"rotation":[0,"math.cos(variable.animationamountblend * 30.0) * 4.0",0]},"tailfin":{"rotation":[0,"math.cos(variable.animationamountblend * 30.0) * -25.75",0]}}}}}'},7230:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0,4,4],"scale":2}}},"animation.{name}.walk":{"loop":true,"anim_time_update":"query.modified_distance_moved","bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0,0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0,0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0,0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0,0]}}}}}'},1955:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.legs":{"loop":true,"bones":{"leg0":{"rotation":["variable.leg_rot - this",0.0,0.0]},"leg1":{"rotation":["-variable.leg_rot - this",0.0,0.0]},"leg2":{"rotation":["-variable.leg_rot - this",0.0,0.0]},"leg3":{"rotation":["variable.leg_rot - this",0.0,0.0]}}},"animation.{name}.swelling":{"loop":true,"bones":{"body":{"scale":["variable.swelling_scale1","variable.swelling_scale2","variable.swelling_scale1"]},"head":{"scale":["variable.swelling_scale1","variable.swelling_scale2","variable.swelling_scale1"]},"leg0":{"scale":["variable.swelling_scale1","variable.swelling_scale2","variable.swelling_scale1"]},"leg1":{"scale":["variable.swelling_scale1","variable.swelling_scale2","variable.swelling_scale1"]},"leg2":{"scale":["variable.swelling_scale1","variable.swelling_scale2","variable.swelling_scale1"]},"leg3":{"scale":["variable.swelling_scale1","variable.swelling_scale2","variable.swelling_scale1"]}}}}}'},8741:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"loop":true,"bones":{"body":{"rotation":["query.target_x_rotation - 2.865 + (-2.865 * math.cos(query.life_time * 343.8))","query.target_y_rotation",0.0]},"left_fin":{"rotation":[0.0,0.0,"17.19 * math.cos(query.life_time * 229.2) + 22.92"]},"right_fin":{"rotation":[0.0,0.0,"-17.19 * math.cos(query.life_time * 229.2) - 22.92"]},"tail":{"rotation":["-5.73 * math.cos(query.life_time * 343.8)",0.0,0.0]},"tail_fin":{"rotation":["-11.46 * math.cos(query.life_time * 343.8)",0.0,0.0]}}}}}'},6494:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.attack.rotations":{"loop":true,"bones":{"body":{"rotation":[0.0,"math.sin(math.sqrt(variable.attack_time) * 360.0) * 11.46",0.0]},"leftarm":{"rotation":["-(math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) + math.sin(variable.attack_time * 180.0)) * 5.73",0.0,0.0]},"rightarm":{"rotation":["-(math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 34.38 + math.sin(variable.attack_time * 180.0) * 28.65) * (variable.is_brandishing_spear ? -2.5 : 1.0 )","variable.is_brandishing_spear ? 0.0 : math.sin(math.sqrt(variable.attack_time) * 360.0) * 22.92",0.0]}}}}}'},9693:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.arms_legs":{"loop":true,"bones":{"leftArm":{"rotation":["math.clamp(this, -22.92, 22.92) - this",0,0]},"leftLeg":{"rotation":["math.clamp(this, -22.92, 22.92) - this",0,0]},"rightArm":{"rotation":["math.clamp(this, -22.92, 22.92) - this",0,0]},"rightLeg":{"rotation":["math.clamp(this, -22.92, 22.92) - this",0,0]}}},"animation.{name}.carrying":{"loop":true,"bones":{"leftArm":{"rotation":["-28.65 - this",0,"-2.87 - this"]},"rightArm":{"rotation":["-28.65 - this",0,"2.87 - this"]}}},"animation.{name}.scary_face":{"loop":true,"bones":{"hat":{"position":[0,"-5.0 - this",0]},"head":{"position":[0,"5.0 - this",0]}}},"animation.{name}.attack.rotations":{"loop":true,"bones":{"body":{"rotation":[0,"math.sin(math.sqrt(variable.attack_time) * 360) * 11.46 - this",0]},"leftArm":{"rotation":["math.sin(math.sqrt(variable.attack_time) * 360) * 11.46",0,0]},"rightArm":{"rotation":["math.sin(1.0 - math.pow(1.0 - variable.attack_time, 3.0) * 180.0) * (variable.is_brandishing_spear ? -1.0 : 1.0 )","variable.is_brandishing_spear ? 0.0 : (math.sin(math.sqrt(variable.attack_time) * 360) * 11.46) * 2.0",0]}}},"animation.{name}.bob":{"loop":true,"bones":{"leftArm":{"rotation":[0,0,"((math.cos(query.life_time * 103.2) * 2.865) + 2.865) *-1.0"]},"rightArm":{"rotation":[0,0,"(math.cos(query.life_time * 103.2) * 2.865) + 2.865"]}}},"animation.{name}.move":{"loop":true,"bones":{"leftArm":{"rotation":["variable.tcos0",0,0]},"leftLeg":{"rotation":["variable.tcos0 * -1.4",0,0]},"rightArm":{"rotation":["-variable.tcos0",0,0]},"rightLeg":{"rotation":["variable.tcos0 * 1.4",0,0]}}}}}'},4730:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"loop":true,"bones":{"section_0":{"position":["(math.cos(-query.life_time * 928.26) * 1.26) - this",0.0,0.0],"rotation":[0.0,"(math.cos(query.life_time * 928.26) * 26.9) - this",0.0]},"section_1":{"position":["(math.sin(query.life_time * 928.26) * 0.63) - this",0.0,0.0],"rotation":[0.0,"(math.cos(query.life_time * 928.26) * 16) - this",0.0]},"section_2":{"position":[0.0,0.0,0.0],"rotation":[0.0,"(math.cos(query.life_time * 928.26) * 9.17) - this",0.0]},"section_3":{"position":["(math.cos(query.life_time * 928.26) * 0.8) - this",0.0,0.0]}}}}}'},4597:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.casting":{"loop":true,"bones":{"arms":{"scale":0.0},"leftarm":{"rotation":["math.cos(query.life_time * 763.4) * 14.3239 - this","-this","-135.0 - this"],"scale":1.0},"rightarm":{"rotation":["math.cos(query.life_time * 763.4) * 14.3239 - this","-this","135.0 - this"],"scale":1.0}}},"animation.{name}.casting.v1.0":{"loop":true,"bones":{"leftarm":{"position":["5.0 - this",0.0,"-this"],"rotation":["math.cos(query.life_time * 763.4) * 14.3239 - this","-this","-135.0 - this"]},"rightarm":{"position":["-5.0 - this",0.0,"-this"],"rotation":["math.cos(query.life_time * 763.4) * 14.3239 - this","-this","135.0 - this"]}}},"animation.{name}.general":{"loop":true,"bones":{"arms":{"position":[0.0,"-3.0 - this","-1.0 - this"],"rotation":["-42.97 - this","- this","- this"],"scale":1.0},"leftarm":{"scale":0.0},"rightarm":{"scale":0.0}}},"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["(math.cos(query.anim_time * 38.17) * 40.0) - this","-this",0.0]},"leg1":{"rotation":["(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this","-this",0.0]}}}}}'},3684:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0.0,"query.is_baby ? 4.0 : 0.0","query.is_baby ? 4.0 : 0.0"],"scale":"query.is_baby ? 1.3 : 1.0"}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]}}},"animation.{name}.setup":{"loop":true},"animation.{name}.crouch":{"loop":true,"bones":{"body":{"position":[0.0,-1.8,0.0],"rotation":[0.0,0.0,0.0]},"head":{"position":[0.0,-0.8,0.0],"rotation":[0.0,0.0,0.0]},"leg0":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]},"leg1":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]},"leg2":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]},"leg3":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]}}},"animation.{name}.pounce":{"loop":true,"bones":{"body":{"position":[0.0,0.0,0.0],"rotation":["query.vertical_speed * -7.0",0.0,0.0]},"head":{"position":[0.0,0.0,0.0],"rotation":["query.vertical_speed * -7.0",0.0,0.0]}}},"animation.{name}.sit":{"loop":true,"bones":{"body":{"position":[0.0,1.0,0.0],"rotation":[-60.0,0.0,0.0]},"head":{"position":[0.0,3.0,-3.0],"rotation":[60.0,0.0,0.0]},"leg0":{"position":[0.0,4.0,2.5],"rotation":[-15.0,0.0,0.0]},"leg1":{"position":[0.0,4.0,2.5],"rotation":[-15.0,0.0,0.0]},"leg2":{"position":[0.0,0.75,3.5],"rotation":[40.0,0.0,0.0]},"leg3":{"position":[0.0,0.75,3.5],"rotation":[40.0,0.0,0.0]},"tail":{"position":[0.0,-0.075,-0.15],"rotation":[60.0,0.0,0.0]}}},"animation.{name}.sleep":{"loop":true,"bones":{"body":{"position":[0.0,-4.8,0.0],"rotation":[0.0,0.0,-90.0]},"head":{"position":[1.8,-0.4,-2.0],"rotation":[0.0,-115.0,"math.cos(query.anim_time * 160.0) + 90 -this"]},"tail":{"position":[0.0,0.0,1.5],"rotation":[-125.0,0.0,0.0]}}},"animation.{name}.stuck":{"loop":true,"bones":{"body":{"position":[0.0,-0.3,0.0],"rotation":[60.0,0.0,0.0]}}},"animation.{name}.wiggle":{"loop":true,"bones":{"body":{"position":[0.0,-1.8,0.0],"rotation":[0.0,"math.cos(query.life_time * 20.0 * 53.7) * 5.0 -this",0.0]},"head":{"position":[0.0,-0.8,0.0],"rotation":["math.clamp(-5.0 * (query.anim_time / 2.0), -5.0, 0)",0.0,"math.clamp(25.0 * (query.anim_time / 2.0), 0, 25.0)"]},"leg0":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]},"leg1":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]},"leg2":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]},"leg3":{"position":[0.0,1.6,0.0],"rotation":[0.0,0.0,0.0]},"tail":{"rotation":[0.0,"math.cos(query.life_time * 20.0 * 53.7) * 10.0 -this",0.0]}}}}}'},7257:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.croak":{"animation_length":3,"bones":{"croaking_body":{"position":{"0.0":[0,0,0],"0.375":[0,0,0],"0.4167":[0,0,0],"0.4583":[0,1,0],"2.9583":[0,1,0],"3.0":[0,0,0]},"scale":{"0.0":[0,0,0],"0.375":[0,0,0],"0.4167":[1,1,1],"0.4583":[1,1,1],"0.5417":[1.3,2.1,1.6],"0.625":[1.3,2.1,1.6],"0.7083":[1,1,1],"2.25":[1,1,1],"2.3333":[1.3,2.1,1.6],"2.4167":[1.3,2.1,1.6],"2.5":[1,1,1],"2.5833":[1,1,1],"2.6667":[1.3,2.1,1.6],"2.875":[1.3,2.1,1.8],"2.9583":[1,1,1],"3.0":[0,0,0]}}}},"animation.{name}.walk":{"loop":true,"animation_length":1.25,"bones":{"left_arm":{"rotation":{"0.0":[0,-5,0],"0.2917":[7.5,-2.67,-7.5],"0.625":[0,0,0],"0.7917":[22.5,0,0],"1.125":[-45,0,0],"1.25":[0,-5,0]},"position":{"0.0":[0,0.1,-2],"0.2917":[-0.5,-0.25,-0.13],"0.625":[-0.5,0.1,2],"0.9583":[0.5,1,-0.11],"1.25":[0,0.1,-2]}},"right_arm":{"rotation":{"0.0":[0,0,0],"0.125":[22.5,0,0],"0.4583":[-45,0,0],"0.625":[0,5,0],"0.9583":[7.5,2.33,7.5],"1.25":[0,0,0]},"position":{"0.0":[0.5,0.1,2],"0.2917":[-0.5,1,0.12],"0.625":[0,0.1,-2],"0.9583":[0.5,-0.25,-0.13],"1.25":[0.5,0.1,2]}},"left_leg":{"rotation":{"0.0":[0,0,0],"0.1667":[0,0,0],"0.2917":[45,0,0],"0.625":[-45,0,0],"0.7917":[0,0,0],"1.25":[0,0,0]},"position":{"0.0":[0,0.1,1.2],"0.1667":[0,0.1,2],"0.4583":[0,2,1.06],"0.7917":[0,0.1,-1],"1.25":[0,0.1,1.2]}},"right_leg":{"rotation":{"0.0":[-33.75,0,0],"0.0417":[-45,0,0],"0.1667":[0,0,0],"0.7917":[0,0,0],"0.9583":[45,0,0],"1.25":[-33.75,0,0]},"position":{"0.0":[0,1.14,0.11],"0.1667":[0,0.1,-1],"0.7917":[0,0.1,2],"1.125":[0,2,0.95],"1.25":[0,1.14,0.11]}},"body":{"rotation":{"0.0":[0,5,0],"0.2917":[-7.5,0.33,7.5],"0.625":[0,-5,0],"0.9583":[-7.5,0.33,-7.5],"1.25":[0,5,0]}}}},"animation.{name}.jump":{"loop":"hold_on_last_frame","animation_length":0.375,"bones":{"body":{"rotation":{"0.0":[0,0,0],"0.25":[-20,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,0,0]}},"left_arm":{"rotation":{"0.0":[0,0,0],"0.25":[-56.14,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,1,0]}},"right_arm":{"rotation":{"0.0":[0,0,0],"0.25":[-56.14,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,1,0]}},"left_leg":{"rotation":{"0.0":[0,0,0],"0.25":[45,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,0,0]}},"right_leg":{"rotation":{"0.0":[0,0,0],"0.25":[45,0,0]},"position":{"0.0":[0,0,0],"0.25":[0,0,0]}}}},"animation.{name}.tongue":{"animation_length":0.5,"bones":{"head":{"rotation":{"0.0":[0,0,0],"0.0833":[-60,0,0],"0.4167":[-60,0,0],"0.5":[0,0,0]},"scale":{"0.0":[1,1,1],"0.0833":[0.998,1,1],"0.4167":[0.998,1,1],"0.5":[1,1,1]}},"tongue":{"rotation":{"0.0":[0,0,0],"0.0833":[0,0,0],"0.4167":[-18,0,0],"0.5":[0,0,0]},"scale":{"0.0833":[1,1,1],"0.1667":[0.5,1,5],"0.4167":[1,1,1]}}}},"animation.{name}.swim":{"loop":true,"animation_length":1.04167,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[10,0,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[-10,0,0],"lerp_mode":"catmullrom"},"1.0417":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[90,22.5,0],"lerp_mode":"catmullrom"},"0.4583":{"post":[45,22.5,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[-22.5,-22.5,-22.5],"lerp_mode":"catmullrom"},"0.875":{"post":[-45,-22.5,0],"lerp_mode":"catmullrom"},"0.9583":{"post":[22.5,0,22.5],"lerp_mode":"catmullrom"},"1.0417":{"post":[90,22.5,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,-0.64,2],"lerp_mode":"catmullrom"},"0.4583":{"post":[0,-0.64,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.875":{"post":[0,-0.27,-1.14],"lerp_mode":"catmullrom"},"0.9583":{"post":[0,-1.45,0.43],"lerp_mode":"catmullrom"},"1.0417":{"post":[0,-0.64,2],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[90,-22.5,0],"lerp_mode":"catmullrom"},"0.4583":{"post":[45,-22.5,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[-22.5,22.5,22.5],"lerp_mode":"catmullrom"},"0.875":{"post":[-45,22.5,0],"lerp_mode":"catmullrom"},"0.9583":{"post":[22.5,0,-22.5],"lerp_mode":"catmullrom"},"1.0417":{"post":[90,-22.5,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,-0.64,2],"lerp_mode":"catmullrom"},"0.4583":{"post":[0,-0.64,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.875":{"post":[0,-0.27,-1.14],"lerp_mode":"catmullrom"},"0.9583":{"post":[0,-1.45,0.43],"lerp_mode":"catmullrom"},"1.0417":{"post":[0,-0.64,2],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.4583":{"post":[67.5,-45,0],"lerp_mode":"catmullrom"},"0.7917":{"post":[90,45,0],"lerp_mode":"catmullrom"},"0.9583":{"post":[90,0,0],"lerp_mode":"catmullrom"},"1.0417":{"post":[90,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[-2.5,0,1],"lerp_mode":"catmullrom"},"0.25":{"post":[-2,0,1],"lerp_mode":"catmullrom"},"0.4583":{"post":[1,-2,-1],"lerp_mode":"catmullrom"},"0.7917":{"post":[0.58,0,-2.83],"lerp_mode":"catmullrom"},"0.9583":{"post":[-2.5,0,1],"lerp_mode":"catmullrom"},"1.0417":{"post":[-2.5,0,1],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[90,0,0],"lerp_mode":"catmullrom"},"0.4583":{"post":[67.5,45,0],"lerp_mode":"catmullrom"},"0.7917":{"post":[90,-45,0],"lerp_mode":"catmullrom"},"0.9583":{"post":[90,0,0],"lerp_mode":"catmullrom"},"1.0417":{"post":[90,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[2.5,0,1],"lerp_mode":"catmullrom"},"0.25":{"post":[2,0,1],"lerp_mode":"catmullrom"},"0.4583":{"post":[-1,-2,-1],"lerp_mode":"catmullrom"},"0.7917":{"post":[-0.58,0,-2.83],"lerp_mode":"catmullrom"},"0.9583":{"post":[2.5,0,1],"lerp_mode":"catmullrom"},"1.0417":{"post":[2.5,0,1],"lerp_mode":"catmullrom"}}}}},"animation.{name}.idle.water":{"loop":true,"animation_length":3,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.625":{"post":[-10,0,0],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,-22.5],"lerp_mode":"catmullrom"},"2.2083":{"post":[0,0,-45],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,-22.5],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[-1,0,0],"lerp_mode":"catmullrom"},"2.2083":{"post":[-1,-0.5,0],"lerp_mode":"catmullrom"},"3.0":{"post":[-1,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,0,22.5],"lerp_mode":"catmullrom"},"2.2083":{"post":[0,0,45],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,22.5],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[1,0,0],"lerp_mode":"catmullrom"},"2.2083":{"post":[1,-0.5,0],"lerp_mode":"catmullrom"},"3.0":{"post":[1,0,0],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"post":[22.5,-22.5,0],"lerp_mode":"catmullrom"},"1.0":{"post":[22.5,-22.5,-45],"lerp_mode":"catmullrom"},"3.0":{"post":[22.5,-22.5,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,1],"lerp_mode":"catmullrom"},"1.0":{"post":[0,-1,1],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,1],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"post":[22.5,22.5,0],"lerp_mode":"catmullrom"},"1.0":{"post":[22.5,22.5,45],"lerp_mode":"catmullrom"},"3.0":{"post":[22.5,22.5,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,1],"lerp_mode":"catmullrom"},"1.0":{"post":[0,-1,1],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,1],"lerp_mode":"catmullrom"}}}}}}}'},4532:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"loop":true,"bones":{"tentacles_0":{"rotation":["math.sin(query.life_time * 360.0 + 0) * 11.5 + 23",0.0,0.0]},"tentacles_1":{"rotation":["math.sin(query.life_time * 360.0 + 57) * 11.5 + 23",0.0,0.0]},"tentacles_2":{"rotation":["math.sin(query.life_time * 360.0 + 115) * 11.5 + 23",0.0,0.0]},"tentacles_3":{"rotation":["math.sin(query.life_time * 360.0 + 172) * 11.5 + 23",0.0,0.0]},"tentacles_4":{"rotation":["math.sin(query.life_time * 360.0 + 229) * 11.5 + 23",0.0,0.0]},"tentacles_5":{"rotation":["math.sin(query.life_time * 360.0 + 286) * 11.5 + 23",0.0,0.0]},"tentacles_6":{"rotation":["math.sin(query.life_time * 360.0 + 344) * 11.5 + 23",0.0,0.0]},"tentacles_7":{"rotation":["math.sin(query.life_time * 360.0 + 402) * 11.5 + 23",0.0,0.0]},"tentacles_8":{"rotation":["math.sin(query.life_time * 360.0 + 458) * 11.5 + 23",0.0,0.0]}}},"animation.{name}.scale":{"loop":true,"bones":{"body":{"scale":4.5}}}}}'},216:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_scaling":{"loop":true,"bones":{"head":{"position":[0.0,10.0,4.0],"scale":1.4}}},"animation.{name}.look_at_target":{"loop":true,"bones":{"head":{"relative_to":{"rotation":"entity"},"rotation":["math.clamp(query.target_x_rotation, -40, 40)","math.clamp(query.target_y_rotation, -45, 25)",0]}}},"animation.{name}.walk":{"loop":true,"bones":{"right_back_leg":{"rotation":["variable.tcos_right_side * 0.5",0.0,0.0]},"left_back_leg":{"rotation":["variable.tcos_left_side * 0.5",0.0,0.0]},"right_front_leg":{"rotation":["-variable.tcos_right_side * 0.5",0.0,0.0]},"left_front_leg":{"rotation":["-variable.tcos_left_side * 0.5",0.0,0.0]}}},"animation.{name}.attack":{"loop":true,"bones":{"head":{"rotation":["variable.attack_head_rot",0,0]}}},"animation.{name}.ram_attack":{"loop":true,"bones":{"head":{"rotation":["variable.ram_head_rot",0,0]}}},"animation.{name}.horns":{"loop":true,"bones":{"right_horn":{"scale":"variable.goat_has_right_horn"},"left_horn":{"scale":"variable.goat_has_left_horn"}}}}}'},7308:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move_eye":{"loop":true,"bones":{"eye":{"position":["query.eye_target_x_rotation - this"," query.eye_target_y_rotation - this","-8.25 - this"]}}},"animation.{name}.setup":{"loop":true,"bones":{"spikepart0":{"rotation":["-45.0 - this","0.0 - this","0.0 - this"],"position":[0,-24,0]},"spikepart1":{"rotation":["45.0 - this","0.0 - this","0.0 - this"],"position":[0,-24,0]},"spikepart10":{"rotation":["0.0 - this","0.0 - this"," 135.0 - this"],"position":[0,-24,0]},"spikepart11":{"rotation":["0.0 - this","0.0 - this"," -135.0 - this"],"position":[0,-24,0]},"spikepart2":{"rotation":["0.0 - this","0.0 - this","45.0 - this"],"position":[0,-24,0]},"spikepart3":{"rotation":["0.0 - this","0.0 - this","-45.0 - this"],"position":[0,-24,0]},"spikepart4":{"rotation":["90.0 - this","45.0 - this"," 0.0 - this"],"position":[0,-24,0]},"spikepart5":{"rotation":["90.0 - this","-45.0 - this"," 0.0 - this"],"position":[0,-24,0]},"spikepart6":{"rotation":["90.0 - this","-135.0 - this","0.0 - this"],"position":[0,-24,0]},"spikepart7":{"rotation":["90.0 - this","135.0 - this"," 0.0 - this"],"position":[0,-24,0]},"spikepart8":{"rotation":["-135.0 - this","0.0 - this"," 0.0 - this"],"position":[0,-24,0]},"spikepart9":{"rotation":["135.0 - this","0.0 - this"," 0.0 - this"],"position":[0,-24,0]}}},"animation.{name}.spikes":{"loop":true,"bones":{"spikepart0":{"position":["-this","24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this","8 * (1 + math.cos(query.life_time * 20 * 1.5) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this"]},"spikepart1":{"position":["-this","24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5 + 1) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this","-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 1) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this"]},"spikepart10":{"position":["8 * (1 + math.cos(query.life_time * 20 * 1.5 + 10) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this","-8 + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 10) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this","-this"]},"spikepart11":{"position":["-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 11) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this","-8 + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 11) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this","-this"]},"spikepart2":{"position":["8 * (1 + math.cos(query.life_time * 20 * 1.5 + 2) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this","24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5 + 2) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this","-this"]},"spikepart3":{"position":["-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 3) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this","24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5 + 3) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this",0]},"spikepart4":{"position":["-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 4) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this","8 - this","-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 4) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this"]},"spikepart5":{"position":["8 * (1 + math.cos(query.life_time * 20 * 1.5 + 5) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this","8 - this","-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 5) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this"]},"spikepart6":{"position":["8 * (1 + math.cos(query.life_time * 20 * 1.5 + 6) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this","8 - this","8 * (1 + math.cos(query.life_time * 20 * 1.5 + 6) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this"]},"spikepart7":{"position":["-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 7) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this","8 - this","8 * (1 + math.cos(query.life_time * 20 * 1.5 + 7) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this"]},"spikepart8":{"position":["-this","-8 + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 8) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this","8 * (1 + math.cos(query.life_time * 20 * 1.5 + 8) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this"]},"spikepart9":{"position":["-this","-8 + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 9) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this","-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 9) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this"]}}},"animation.{name}.swim":{"loop":true,"bones":{"tailpart0":{"rotation":[0,"variable.tail_base_angle * 11.6 - this",0]},"tailpart1":{"position":["-1.5 - this","-0.5 - this","14.0 - this"],"rotation":[0,"variable.tail_base_angle * 22.8 - this",0]},"tailpart2":{"position":["0.5 - this","-0.5 - this","6.0 - this"],"rotation":[0,"variable.tail_base_angle * 34.4 - this",0]}}}}}'},2797:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"loop":true,"bones":{"tentacles_0":{"rotation":["math.sin(query.life_time * 360.0 + 0) * 11.5 + 23",0.0,0.0]},"tentacles_1":{"rotation":["math.sin(query.life_time * 360.0 + 57) * 11.5 + 23",0.0,0.0]},"tentacles_2":{"rotation":["math.sin(query.life_time * 360.0 + 115) * 11.5 + 23",0.0,0.0]},"tentacles_3":{"rotation":["math.sin(query.life_time * 360.0 + 172) * 11.5 + 23",0.0,0.0]},"tentacles_4":{"rotation":["math.sin(query.life_time * 360.0 + 229) * 11.5 + 23",0.0,0.0]},"tentacles_5":{"rotation":["math.sin(query.life_time * 360.0 + 286) * 11.5 + 23",0.0,0.0]},"tentacles_6":{"rotation":["math.sin(query.life_time * 360.0 + 344) * 11.5 + 23",0.0,0.0]},"tentacles_7":{"rotation":["math.sin(query.life_time * 360.0 + 402) * 11.5 + 23",0.0,0.0]},"tentacles_8":{"rotation":["math.sin(query.life_time * 360.0 + 458) * 11.5 + 23",0.0,0.0]}}},"animation.{name}.scale":{"loop":true,"bones":{"body":{"scale":"variable.scale"}}}}}'},7514:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_scaling":{"loop":true,"bones":{"head":{"position":[0.0,10.0,4.0],"scale":1.4}}},"animation.{name}.look_at_target":{"loop":true,"bones":{"head":{"relative_to":{"rotation":"entity"},"rotation":[0,"query.target_y_rotation - this",0]}}},"animation.{name}.walk":{"loop":true,"bones":{"left_ear":{"rotation":[0.0,0.0,"variable.tcos_left_side * 0.5"]},"right_ear":{"rotation":[0.0,0.0,"variable.tcos_right_side * 0.5"]},"leg_back_right":{"rotation":["variable.tcos_right_side",0.0,0.0]},"leg_back_left":{"rotation":["variable.tcos_left_side",0.0,0.0]},"leg_front_right":{"rotation":["-variable.tcos_right_side",0.0,0.0]},"leg_front_left":{"rotation":["-variable.tcos_left_side",0.0,0.0]}}},"animation.{name}.attack":{"loop":true,"bones":{"head":{"rotation":["variable.attack_head_rot",0,0]}}}}}'},7504:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"body":{"position":[0.0,"11 * ((0.0625 - query.model_scale) * 16.0)",0.0]},"head":{"scale":"1.0 + 0.5 * (1.0 - (query.model_scale * 16.0))"},"legbl":{"scale":[1.0,"1.0 + ((0.0625 - query.model_scale) * 16.0)",1.0]},"legbr":{"scale":[1.0,"1.0 + ((0.0625 - query.model_scale) * 16.0)",1.0]},"legfl":{"scale":[1.0,"1.0 + ((0.0625 - query.model_scale) * 16.0)",1.0]},"legfr":{"scale":[1.0,"1.0 + ((0.0625 - query.model_scale) * 16.0)",1.0]}}},"animation.{name}.eat":{"loop":true,"bones":{"neck":{"rotation":["variable.eat_anim * (110.0 + math.sin((query.life_time * 20.0) * 57.3) * 2.86)",0.0,0.0]}}},"animation.{name}.look_at_player":{"loop":true,"bones":{"neck":{"rotation":["variable.head_x_rot","(variable.stand_anim + variable.inverse_max_stand_eat) * query.head_y_rotation(0) - q.body_y_rotation",0.0]}}},"animation.{name}.rear":{"loop":true,"bones":{"body":{"rotation":["-45.0 * variable.stand_anim",0.0,0.0]},"legbl":{"rotation":["45.0 * variable.stand_anim",0.0,0.0]},"legbr":{"rotation":["45.0 * variable.stand_anim",0.0,0.0]},"legfl":{"rotation":["(-60.0 + math.cos((query.life_time * 20.0) * 34.38) * 57.3) * variable.stand_anim",0.0,0.0]},"legfr":{"rotation":["(-60.0 - math.cos((query.life_time * 20.0) * 34.38) * 57.3) * variable.stand_anim",0.0,0.0]},"neck":{"rotation":["(15.0 + variable.head_x_rot) * variable.stand_anim",0.0,0.0]},"tail":{"rotation":["55.0 * variable.stand_anim",0.0,0.0]}}},"animation.{name}.tail":{"loop":true,"bones":{"tail":{"rotation":[0.0,"math.cos(query.life_time * 802.0) * 57.3",0.0]}}},"animation.{name}.walk":{"loop":true,"bones":{"bagl":{"rotation":["variable.leg_x_rot_anim / 5.0",0.0,0.0]},"bagr":{"rotation":["-variable.leg_x_rot_anim / 5.0",0.0,0.0]},"legbl":{"rotation":["(-variable.leg_stand_factor * 28.6 * query.modified_move_speed) * (1.0 - variable.stand_anim)",0.0,0.0]},"legbr":{"rotation":["(variable.leg_stand_factor * 28.6 * query.modified_move_speed) * (1.0 - variable.stand_anim)",0.0,0.0]},"legfl":{"rotation":["variable.leg_x_rot_anim * (1.0 - variable.stand_anim)",0.0,0.0]},"legfr":{"rotation":["-variable.leg_x_rot_anim * (1.0 - variable.stand_anim)",0.0,0.0]}}}}}'},6046:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.attack":{"loop":true,"bones":{"arm0":{"rotation":["-114 + ((1.5 * math.abs(math.mod(variable.attack_animation_tick - query.frame_alpha, 10) - 5) - 2.5) / 5) * 57.3",0.0,0.0]},"arm1":{"rotation":["-114 + ((1.5 * math.abs(math.mod(variable.attack_animation_tick - query.frame_alpha, 10) - 5) - 2.5) / 5) * 57.3",0.0,0.0]}}},"animation.{name}.flower":{"loop":true,"bones":{"arm0":{"rotation":["-45.8 + ((0.25 * math.abs(math.mod(variable.offer_flower_tick, 70) - 35) - 17.5) / 35)",0.0,0.0]}}},"animation.{name}.move":{"loop":true,"bones":{"arm0":{"rotation":["-variable.modified_tcos0 * 2.0",0.0,0.0]},"arm1":{"rotation":["variable.modified_tcos0 * 2.0",0.0,0.0]}}},"animation.{name}.move_to_target":{"loop":true,"bones":{"arm0":{"rotation":["((math.abs(math.mod(query.modified_distance_moved, 13) - 6.5) - 3.25) / 2.25) * 30.0",0.0,0.0]},"arm1":{"rotation":["((math.abs(math.mod(query.modified_distance_moved, 13) - 6.5) - 3.25) / 2.25) * -30.0",0.0,0.0]}}},"animation.{name}.walk":{"loop":true,"bones":{"body":{"rotation":[0.0,0.0,"variable.modified_tcos0 / 1.5"]},"head":{"rotation":[0.0,0.0,"variable.modified_tcos0 / 1.5"]},"leg0":{"rotation":["variable.modified_tcos0 * 6.0",0.0,0.0]},"leg1":{"rotation":["-variable.modified_tcos0 * 6.0",0.0,0.0]}}},"animation.{name}.walk_to_target":{"loop":true,"bones":{"body":{"rotation":[0.0,0.0,"2.0 * (math.abs(math.mod(query.modified_distance_moved + 6, 13.0) - 6.5) - 3.25)"]},"head":{"rotation":[0.0,0.0,"2.0 * (math.abs(math.mod(query.modified_distance_moved + 6, 13.0) - 6.5) - 3.25)"]},"leg0":{"rotation":["(math.cos(query.modified_distance_moved * 38.17) * 40.0)",0.0,0.0]},"leg1":{"rotation":["(math.cos(query.modified_distance_moved * 38.17 + 180) * 40.0)",0.0,0.0]}}}}}'},5100:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"body":{"position":[0.0,-5.5,-5.0],"scale":[1.2,1.0,1.0]},"head":{"position":[0.0,2.0,0.0],"scale":[1.3,1.2,1.2]},"leg0":{"position":[0.0,-1.0,0.0],"scale":[0.91,0.56,0.91]},"leg1":{"position":[0.0,-1.0,0.0],"scale":[0.91,0.56,0.91]},"leg2":{"position":[0.0,-1.0,0.0],"scale":[0.91,0.56,0.91]},"leg3":{"position":[0.0,-1.0,0.0],"scale":[0.91,0.56,0.91]}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]}}}}}'},9296:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"loop":true,"bones":{"bodycube_0":{"position":[0.0,"3.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7",0.0]},"bodycube_1":{"position":[0.0,"2.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7",0.0]},"bodycube_2":{"position":[0.0,"1.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7",0.0]},"bodycube_4":{"position":[0.0,"-1.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7",0.0]},"bodycube_5":{"position":[0.0,"-2.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7",0.0]},"bodycube_6":{"position":[0.0,"-3.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7",0.0]},"bodycube_7":{"position":[0.0,"-4.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7",0.0]}}}}}'},7720:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0,"query.is_baby ? 4.0 : 0.0","query.is_baby ? 4.0 : 0.0"],"scale":"query.is_baby ? 2.0 : 1.0"}}},"animation.{name}.walk":{"loop":true,"anim_time_update":"query.modified_distance_moved","bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0,0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0,0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0,0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0,0]}}}}}'},5802:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"scale":1.5}}},"animation.{name}.get_in_bed":{"loop":true,"bones":{"body":{"position":[0,1,-15],"rotation":[-90,0,0]}}},"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["(math.cos(query.anim_time * 38.17) * 40.0) - this","-this",0]},"leg1":{"rotation":["(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this","-this",0]}}},"animation.{name}.raise_arms":{"loop":true,"bones":{"arms":{"rotation":["variable.raise_arms * -15.0",0,0]}}}}}'},8207:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"scale":1.5}}},"animation.{name}.sit":{"loop":true,"bones":{"backlegl":{"position":[0.0,"-2.0 - this","6.0 - this"],"rotation":[-45.0,0.0,0.0]},"backlegr":{"position":[0.0,"-2.0 - this","6.0 - this"],"rotation":["-45 - this",0.0,0.0]},"body":{"rotation":["-45 - this",0.0,0.0]},"frontlegl":{"position":[0.0,"-1.5 - this","-7.0 - this"],"rotation":["42.15 - this",0.0,0.0]},"frontlegr":{"position":[0.0,"-1.5 - this","-7.0 - this"],"rotation":["42.15 - this",0.0,0.0]},"head":{"position":[0.0,-2.0,0.0]},"tail1":{"position":[0.0,0.0,0.0],"rotation":["45 - this",0.0,0.0]},"tail2":{"position":[0.0,0.0,0.0],"rotation":["45 - this",0.0,0.0]}}},"animation.{name}.sneak":{"loop":true,"bones":{"backlegl":{"position":[0.0,"1.0 - this",0.0],"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"backlegr":{"position":[0.0,"1.0 - this",0.0],"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"body":{"position":[0.0,-1.0,0.0]},"frontlegl":{"position":[0.0,"1.0 - this",0.0],"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"frontlegr":{"position":[0.0,"1.0 - this",0.0],"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"head":{"position":[0.0,-1.0,0.0]},"tail1":{"position":[0.0,"1.0 - this",0.0]},"tail2":{"rotation":["62.0 + math.cos(query.modified_distance_moved * 57.3) * 27.0 * query.modified_move_speed - this",0.0,0.0]}}},"animation.{name}.sprint":{"loop":true,"bones":{"backlegl":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"backlegr":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 17.19) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"frontlegl":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 197.19) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"frontlegr":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"tail1":{"rotation":["-this",0.0,0.0]},"tail2":{"rotation":["62.0 + math.cos(query.modified_distance_moved * 57.3) * 18.0 * query.modified_move_speed - this",0.0,0.0]}}},"animation.{name}.walk":{"loop":true,"bones":{"backlegl":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"backlegr":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"frontlegl":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"frontlegr":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this",0.0,0.0]},"tail1":{"rotation":["-51.57 - this",0.0,0.0]},"tail2":{"rotation":["62.0 + math.cos(query.modified_distance_moved * 57.3) * 45.0 * query.modified_move_speed - this",0.0,0.0]}}}}}'},621:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"body":{"position":[0.0,1.77,0.0],"scale":[1.15,1.15,1.0]},"head":{"position":[0.0,-0.18,0.15],"scale":1.8}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]}}},"animation.{name}.lying":{"loop":true,"bones":{"body":{"position":[0.0,"(query.is_baby ? -8.8 : -7.67) * query.lie_amount -10 - this",0.0],"rotation":["query.lie_amount * -180 - this",0.0,0.0]},"head":{"rotation":["(query.lie_amount * 90) - this",0.0,0.0]},"leg0":{"rotation":["math.sin(query.life_time * 206.28) * -17.2 - this",0.0,0.0]},"leg1":{"rotation":["math.sin(query.life_time * 263.58) * 17.2 - this",0.0,0.0]},"leg2":{"rotation":["math.sin(query.life_time * 172) * 17.2 - this",0.0,0.0]},"leg3":{"rotation":["math.sin(query.life_time * 229.2) * -17.2 - this",0.0,0.0]}}},"animation.{name}.rolling":{"loop":true,"bones":{"body":{"rotation":["(query.roll_counter / 32) * 360",0.0,0.0]},"head":{"rotation":["(this * -118) + query.roll_counter - this",0.0,0.0]},"leg0":{"rotation":["math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * 8.6 - this",0.0,0.0]},"leg1":{"rotation":["math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * -8.6 - this",0.0,0.0]},"leg2":{"rotation":["math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * -8.6 - this",0.0,0.0]},"leg3":{"rotation":["math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * 8.6 - this",0.0,0.0]}}},"animation.{name}.sitting":{"loop":true,"bones":{"body":{"position":[0.0,"-2.15 -10 -this",0.0],"rotation":["(query.is_scared * math.cos(query.life_time * 71.62) * 16.2) + (query.sit_amount * -90) - this",0.0,0.0]},"head":{"rotation":["query.is_eating ? (90.0 + 11.5 * math.sin(query.life_time * 750)) : (query.sit_amount * (100 - this)) - this",0.0,0.0]},"leg0":{"rotation":[0.0,0.0,"32.7 - this"]},"leg1":{"rotation":[0.0,0.0,"-32.7 - this"]},"leg2":{"rotation":["(query.is_eating ? (-23 - (16.5 * math.sin(query.life_time * 750))) : 0) - this",0.0,-15.0]},"leg3":{"rotation":["(query.is_eating ? (-23 - (16.5 * math.sin(query.life_time * 750))) : 0) - this",0.0,15.0]}}},"animation.{name}.sneezing":{"loop":true,"bones":{"head":{"rotation":["(query.sneeze_counter < 15) ? (-45 * (query.sneeze_counter / 14)) : (-45 + (9 * (query.sneeze_counter - 15)) - this)",0.0,0.0]}}},"animation.{name}.unhappy":{"loop":true,"bones":{"head":{"rotation":[0.0,"(math.sin(query.life_time * 327.6) * 20) - this","(math.sin(query.life_time * 327.6) * 20) - this"]},"leg2":{"rotation":["(math.sin(query.life_time * 343.8) * -43) - this",0.0,0.0]},"leg3":{"rotation":["(math.sin(query.life_time * 343.8) * 43) - this",0.0,0.0]}}}}}'},4223:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.dance":{"loop":true,"bones":{"body":{"position":["variable.dance.x-this","variable.dance.y",0.0]},"head":{"rotation":["-this","-this","variable.dance.y*23.0 - this"]},"leg0":{"position":["-variable.dance.x","-variable.dance.y",0.0],"rotation":[0.0,0.0,"-20.0 - this"]},"leg1":{"position":["-variable.dance.x","-variable.dance.y",0.0],"rotation":[0.0,0.0,"20.0 - this"]},"tail":{"rotation":["60.0 - this",0.0,0.0]},"wing0":{"rotation":[0.0,0.0,"-5.0 - variable.wing_flap"]},"wing1":{"rotation":[0.0,0.0,"5.0 + variable.wing_flap"]}}},"animation.{name}.flying":{"loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0 * query.modified_move_speed",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0 * query.modified_move_speed",0.0,0.0]}}},"animation.{name}.moving":{"loop":true,"bones":{"body":{"position":[0.0,"variable.wing_flap * 0.3",0.0]},"tail":{"rotation":["60.0 + math.cos(query.anim_time * 38.17) * 17.0 - this",0.0,0.0]},"wing0":{"rotation":[0.0,0.0,"-5.0 - variable.wing_flap * 57.3"]},"wing1":{"rotation":[0.0,0.0,"5.0 + variable.wing_flap * 57.3"]}}},"animation.{name}.sitting":{"loop":true,"bones":{"body":{"position":[0.0,-1.9,0.0]},"leg0":{"rotation":[90.0,0.0,0.0]},"leg1":{"rotation":[90.0,0.0,0.0]},"tail":{"rotation":["90.0 - this",0.0,0.0]},"wing0":{"rotation":[0.0,0.0,"-5.0-this"]},"wing1":{"rotation":[0.0,0.0,"5.0-this"]}}},"animation.{name}.standing":{"loop":true,"bones":{"leg0":{"rotation":[20.0,0.0,0.0]},"leg1":{"rotation":[20.0,0.0,0.0]}}}}}'},3832:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.base_pose":{"loop":true,"bones":{"body":{"rotation":["-query.target_x_rotation",0,0],"position":[0,-20,0]}}},"animation.{name}.move":{"loop":true,"animation_length":2.417,"bones":{"tail":{"rotation":["-5.0 * Math.cos(297.9380535 * query.anim_time) - 5.0",0,0]},"tailtip":{"rotation":["-5.0 * Math.cos(297.9380535 * query.anim_time) - 5.0",0,0]},"wing0":{"rotation":[0,0,"16.0 * Math.cos(148.9690267 * query.anim_time)"]},"wing1":{"rotation":[0,0,"-16.0 * Math.cos(148.9690267 * query.anim_time)"]},"wingtip0":{"rotation":[0,0,"16.0 * Math.cos(148.9690267 * query.anim_time)"]},"wingtip1":{"rotation":[0,0,"-16.0 * Math.cos(148.9690267 * query.anim_time)"]}},"sound_effects":{"1.4":{"effect":"flap"}}}}}'},8097:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0.0,4.0,4.0],"scale":2.0}}},"animation.{name}.setup":{"loop":true,"bones":{"body":{"rotation":["-this",0.0,0.0]}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]}}}}}'},4452:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.crossbow.charge":{"bones":{"leftarm":{"rotation":["math.lerp(-90.0 + 34.38, -90.0, variable.crossbow_charge) -this","math.lerp(22.92, 48.70, variable.crossbow_charge) -this",0.0]},"rightarm":{"rotation":["-90.0 + 34.38 -this","-45.84 -this",0.0]}},"loop":true},"animation.{name}.crossbow.hold":{"bones":{"leftarm":{"rotation":["-85.94 + query.target_x_rotation -this","34.38 + math.clamp(query.target_y_rotation, -45, 25) -this",0.0]},"rightarm":{"rotation":["-90.0 + 5.73 + query.target_x_rotation -this","-17.19 + math.clamp(query.target_y_rotation, -25, 45) -this",0.0]}},"loop":true},"animation.{name}.sword.attack":{"bones":{"leftarm":{"rotation":["(math.cos(query.life_time * 20.0 * 10.89) * 28.65) + (math.sin(variable.attack_time * 180.0) * 68.76 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)",0.0,0.0]},"rightarm":{"rotation":["-100 + (variable.attack2 * 2.2 - variable.attack * 0.4) + variable.x_bob - this","variable.attack2 * 0.6 - 5.73 - this","variable.z_bob - this"]}},"loop":true},"animation.{name}.hand.attack":{"bones":{"leftarm":{"rotation":["-(math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180) * 1.2 + math.sin(variable.attack_time * 180)) * 10.0",0.0,0.0]},"rightarm":{"rotation":["-(math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180) * 1.2 + math.sin(variable.attack_time * 180)) * 30.0","-(math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180) ? (-90.0 * math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180)) + 30.0 : 0.0)",0.0]}},"loop":true},"animation.{name}.move":{"loop":true,"bones":{"leftear":{"rotation":[0.0,0.0,"variable.tcos0 * 0.5"]},"rightear":{"rotation":[0.0,0.0,"-variable.tcos0 * 0.5"]},"leftarm":{"rotation":["variable.tcos0",0.0,0.0]},"leftleg":{"rotation":["-variable.tcos0 * 1.4",0.0,0.0]},"rightarm":{"rotation":["-variable.tcos0",0.0,0.0]},"rightleg":{"rotation":["variable.tcos0 * 1.4",0.0,0.0]}}},"animation.{name}.admire":{"loop":true,"bones":{"leftarm":{"rotation":[320.0,25.0,0.0]},"head":{"rotation":[30.0,0.0,0.0]}}},"animation.{name}.celebrate_hunt":{"loop":true,"bones":{"leftear":{"rotation":[0.0,0.0,"Math.sin(query.time_stamp * 30) * 10"]},"rightear":{"rotation":[0.0,0.0,"Math.cos(query.time_stamp * 30) * 10"]}}},"animation.{name}.celebrate_hunt_special":{"loop":true,"bones":{"leftear":{"rotation":[0.0,0.0,"Math.sin(query.time_stamp * 30) * 10"]},"rightear":{"rotation":[0.0,0.0,"Math.cos(query.time_stamp * 30) * 10"]},"head":{"position":["Math.sin(query.time_stamp * 10)","Math.sin(query.time_stamp * 40)",0.0]},"rightarm":{"rotation":[0.0,0.0,"70 + Math.cos(query.time_stamp * 40) * 10"]},"leftarm":{"rotation":[0.0,0.0,"-70 - Math.cos(query.time_stamp * 40) * 10"]},"body":{"position":[0.0,"Math.sin(query.time_stamp * 40) * 0.35",0.0]}}}}}'},8539:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.crossbow.charge":{"loop":true,"bones":{"leftarm":{"rotation":["math.lerp(-90.0 + 34.38, -90.0, variable.crossbow_charge) -this","math.lerp(22.92, 48.70, variable.crossbow_charge) -this",0.0]},"rightarm":{"rotation":["-90.0 + 34.38 -this","-45.84 -this",0.0]}}},"animation.{name}.crossbow.hold":{"loop":true,"bones":{"leftarm":{"rotation":["-85.94 + query.target_x_rotation -this","34.38 + math.clamp(query.target_y_rotation, -45, 25) -this",0.0]},"rightarm":{"rotation":["-90.0 + 5.73 + query.target_x_rotation -this","-17.19 + math.clamp(query.target_y_rotation, -25, 45) -this",0.0]}}}}}'},9412:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0.0,-1.0,3.0],"scale":1.25}}},"animation.{name}.move":{"loop":true,"bones":{"body":{"position":[0.0,"-9 - 2 * query.standing_scale - this",0.0],"rotation":["(-(query.standing_scale) * 63) - this",0.0,0.0]},"leg0":{"position":[0.0,"-1 * query.standing_scale","6 * query.standing_scale"],"rotation":["query.standing_scale * 63",0.0,0.0]},"leg1":{"position":[0.0,"-1 * query.standing_scale","6 * query.standing_scale"],"rotation":["query.standing_scale * 63",0.0,0.0]},"leg2":{"rotation":["(query.standing_scale > 1) ? (query.standing_scale * 81) - this : 0",0.0,0.0]},"leg3":{"rotation":["(query.standing_scale > 1) ? (query.standing_scale * 81) - this : 0",0.0,0.0]}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]}}}}}'},1687:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0,-1,1],"scale":1.5}}},"animation.{name}.move":{"loop":true,"bones":{"earLeft":{"rotation":["query.target_x_rotation - this","query.target_y_rotation - this + 15.0",0]},"earRight":{"rotation":["query.target_x_rotation - this","query.target_y_rotation - this - 15.0",0]},"frontLegLeft":{"rotation":["variable.jump_rotation * -40.0 - 11.0 - this",0,0]},"frontLegRight":{"rotation":["variable.jump_rotation * -40.0 - 11.0 - this",0,0]},"haunchLeft":{"rotation":["variable.jump_rotation * 50.0 - 21.0 - this",0,0]},"haunchRight":{"rotation":["variable.jump_rotation * 50.0 - 21.0 - this",0,0]},"nose":{"rotation":["query.target_x_rotation - this","query.target_y_rotation - this",0]},"rearFootLeft":{"rotation":["variable.jump_rotation * 50.0 - this",0,0]},"rearFootRight":{"rotation":["variable.jump_rotation * 50.0 - this",0,0]}}}}}'},1987:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.biting":{"loop":true,"bones":{"mouth":{"rotation":["math.sin(math.min(query.anim_time / (variable.bite_anim_duration / 2.0f), 1.0f) * 180.0f) * 40.0f",0.0,0.0]},"neck":{"position":[0.0,0.0,"-math.sin(math.min(query.anim_time / variable.bite_anim_duration, 1.0f) * 180.0f) * variable.bite_neck_length"]}}},"animation.{name}.idle_mouth":{"loop":true,"bones":{"mouth":{"rotation":[1.8,0.0,0.0]},"neck":{"position":[0.0,0.0,0.0]}}},"animation.{name}.roaring":{"loop":true,"bones":{"mouth":{"rotation":["math.sin(math.min(query.anim_time / variable.roar_length, 1.0) * 180) * 40.0",0.0,0.0]}}},"animation.{name}.stunned":{"loop":true,"bones":{"neck":{"position":["math.sin(query.life_time * 180.0) * 2.8",-5.0,0.0],"rotation":[15.0,0.0,0.0]}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 22.92",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -22.92",0.0,0.0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -22.92",0.0,0.0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 22.92",0.0,0.0]}}}}}'},7597:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.flop":{"loop":true,"bones":{"body_back":{"rotation":[0.0,"math.cos(variable.animationamountblend * 45.0) * -21.75",0.0]},"body_front":{"rotation":[0.0,"math.cos(variable.animationamountblend * 45.0) * 4.0","variable.zrot"]},"tailfin":{"rotation":[0.0,"math.cos(variable.animationamountblend * 45.0) * -40.0",0.0]}}},"animation.{name}.swim":{"loop":true,"bones":{"body_back":{"rotation":[0.0,"math.cos(variable.animationamountblend * 30.0) * -21.75",0.0]},"body_front":{"rotation":[0.0,"math.cos(variable.animationamountblend * 30.0) * 4.0",0.0]},"tailfin":{"rotation":[0.0,"math.cos(variable.animationamountblend * 30.0) * -40.0",0.0]}}}}}'},2202:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0.0,4.0,4.0],"scale":2.0}}},"animation.{name}.grazing":{"animation_length":2.0,"loop":true,"bones":{"head":{"position":{"0":[0.0,0.0,0.0],"0.2":[0.0,-9.0,0.0],"1.8":[0.0,-9.0,0.0],"2":[0.0,0.0,0.0]},"rotation":{"0.2":{"post":["180.0 * (0.2 + 0.07 * math.sin(query.key_frame_lerp_time * 1644.39))",0.0,0.0],"pre":[36.0,0.0,0.0]},"1.8":{"post":[36.0,0.0,0.0],"pre":["180.0 * (0.2 + 0.07 * math.sin(query.key_frame_lerp_time * 1644.39))",0.0,0.0]}}}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]},"leg1":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg2":{"rotation":["math.cos(query.anim_time * 38.17) * -80.0",0.0,0.0]},"leg3":{"rotation":["math.cos(query.anim_time * 38.17) * 80.0",0.0,0.0]}}},"animation.{name}.setup":{"loop":true,"bones":{"body":{"rotation":["-this",0.0,0.0]},"head":{"position":[0.0,"-6.0 - this",0.0]}}}}}'},4541:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.facing":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"base":{"position":["variable.shulker.xoffset","variable.shulker.yoffset","variable.shulker.zoffset"],"rotation":["variable.shulker.xprerotation",0.0,"variable.shulker.zprerotation"],"scale":0.98}}},"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"head":{"position":[0.0,"-variable.shulker.upfacing * 6 - (3 * (variable.shulker.northfacing + variable.shulker.southfacing + variable.shulker.westfacing + variable.shulker.eastfacing))",0.0]},"lid":{"position":[0.0,"7.2 - math.sin(variable.shulker.lidpositionfactor * 1.16) * 7.5 + (variable.shulker.lidpositionfactor > 180 ? math.sin(query.life_time * 114.6) * 0.7 + 1.5: 0.0)",0.0],"rotation":[0.0,"variable.shulker.peekamount > 0.3 ? math.pow(variable.shulker.lidrotationfactor, 4) * 22.5 : 0.0",0.0]}}}}}'},600:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"bodypart_0":{"position":["math.sin(query.life_time * 1031.4) * 1.26",0.0,0.0],"rotation":[0.0,"math.cos(query.life_time * 1031.4) * 27",0.0]},"bodypart_1":{"position":["math.sin(query.life_time * 1031.4 + 27) * 0.63",0.0,0.0],"rotation":[0.0,"math.cos(query.life_time * 1031.4 + 27) * 18",0.0]},"bodypart_2":{"rotation":[0.0,"math.cos(query.life_time * 1031.4 + 54) * 9",0.0]},"bodypart_3":{"position":["math.sin(query.life_time * 1031.4 + 81) * 0.63",0.0,0.0],"rotation":[0.0,"math.cos(query.life_time * 1031.4 + 81) * 18",0.0]},"bodypart_4":{"position":["math.sin(query.life_time * 1031.4 + 108) * 1.26",0.0,0.0],"rotation":[0.0,"math.cos(query.life_time * 1031.4 + 108) * 27",0.0]},"bodypart_5":{"position":["math.sin(query.life_time * 1031.4 + 135) * 1.89",0.0,0.0],"rotation":[0.0,"math.cos(query.life_time * 1031.4 + 135) * 36",0.0]},"bodypart_6":{"position":["math.sin(query.life_time * 1031.4 + 162) * 2.52",0.0,0.0],"rotation":[0.0,"math.cos(query.life_time * 1031.4 + 162) * 45",0.0]}}}}}'},6400:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.attack":{"loop":true,"bones":{"leftarm":{"rotation":["-68.75 * math.sin(variable.attack_time * 180.0) + 22.92 * (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0))","5.73 - math.sin(variable.attack_time * 180.0) * 34.38 - this","-this"]},"rightarm":{"rotation":["-68.75 * math.sin(variable.attack_time * 180.0) + 22.92 * (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0))","-5.73 + math.sin(variable.attack_time * 180.0) * 34.38 - this","-this"]}}}}}'},4354:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.walk":{"loop":true,"animation_length":2,"bones":{"right_front_leg":{"rotation":{"0.0":[0,0,0],"0.5833":[35,0,0],"1.0":[-35,0,0],"1.1667":[0,0,0],"2.0":[0,0,0]},"position":{"0.0":[0,0,3],"0.75":[0,4,-1],"1.0":[0,0,0],"1.1667":[0,0,-1],"2.0":[0,0,3]}},"right_mid_leg":{"rotation":{"0.0":[-7,0,0],"0.1667":[-35,0,0],"0.3333":[0,0,0],"1.0":[0,0,0],"1.1667":[0,0,0],"1.75":[35,0,0],"2.0":[-7,0,0]},"position":{"0.0":[0,2.67,-0.67],"0.1667":[0,0,0],"0.3333":[0,0,-2],"1.0":[0,0,2],"1.1667":[0,0,3],"1.9167":[0,4,-1],"2.0":[0,2.67,-0.67]}},"right_hind_leg":{"rotation":{"0.0":[0,0,0],"0.5833":[0,0,0],"1.0":[25,0,0],"1.1667":[35,0,0],"1.5833":[-35,0,0],"1.75":[0,0,0],"2.0":[0,0,0]},"position":{"0.0":[0,0,-0.5],"0.5833":[0,0,2],"1.0":[0,2.22,0.78],"1.3333":[0,4,-1],"1.5833":[0,0,0],"1.75":[0,0,-2],"2.0":[0,0,-0.5]}},"left_front_leg":{"rotation":{"0.0":[-35,0,0],"0.1667":[0,0,0],"1.0":[0,0,0],"1.5833":[35,0,0],"2.0":[-35,0,0]},"position":{"0.0":[0,0,0],"0.1667":[0,0,-1],"1.0":[0,0,3],"1.75":[0,4,-1],"2.0":[0,0,0]}},"left_mid_leg":{"rotation":{"0.0":[0,0,0],"0.1667":[0,0,0],"0.75":[35,0,0],"1.1667":[-35,0,0],"1.3333":[0,0,0],"2.0":[0,0,0]},"position":{"0.0":[0,0,2],"0.1667":[0,0,3],"0.9167":[0,4,-1],"1.1667":[0,0,0],"1.3333":[0,0,-2],"2.0":[0,0,2]}},"left_hind_leg":{"rotation":{"0.0":[25,0,0],"0.1667":[35,0,0],"0.5833":[-35,0,0],"0.75":[0,0,0],"1.0":[0,0,0],"1.5833":[0,0,0],"2.0":[25,0,0]},"position":{"0.0":[0,2.22,0.78],"0.3333":[0,4,-1],"0.5833":[0,0,0],"0.75":[0,0,-2],"1.0":[0,0,-0.5],"1.5833":[0,0,2],"2.0":[0,2.22,0.78]}},"body":{"rotation":{"0.0":{"post":[1,0,-2.5],"lerp_mode":"catmullrom"},"0.5":{"post":[-1,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[1,0,2.5],"lerp_mode":"catmullrom"},"1.5":{"post":[-1,0,0],"lerp_mode":"catmullrom"},"2.0":{"post":[1,0,-2.5],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.2083":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.375":{"post":[0,-1,0],"lerp_mode":"catmullrom"},"1.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.2083":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.375":{"post":[0,-1,0],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[7.5,0,0],"lerp_mode":"catmullrom"},"0.1667":{"post":[9,0,0],"lerp_mode":"catmullrom"},"0.875":{"post":[-1,0,0],"lerp_mode":"catmullrom"},"1.25":{"post":[7,0,0],"lerp_mode":"catmullrom"},"1.75":{"post":[5,0,0],"lerp_mode":"catmullrom"},"2.0":{"post":[7.5,0,0],"lerp_mode":"catmullrom"}}},"left_ear":{"rotation":{"0.0":{"post":[0,0,-2.5],"lerp_mode":"catmullrom"},"0.5":{"post":[0,0,-7.5],"lerp_mode":"catmullrom"},"1.0":{"post":[0,0,-2.5],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,-7.5],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,-2.5],"lerp_mode":"catmullrom"}}},"right_ear":{"rotation":{"0.0":{"post":[0,0,2.5],"lerp_mode":"catmullrom"},"0.5":{"post":[0,0,7.5],"lerp_mode":"catmullrom"},"1.0":{"post":[0,0,2.5],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,7.5],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,2.5],"lerp_mode":"catmullrom"}}}}},"animation.{name}.sniffsniff":{"loop":true,"animation_length":8,"bones":{"nose":{"scale":{"0.0":[1,1,1],"0.5417":[1,1,1],"0.5833":{"pre":[1,0.5,1],"post":[1,0.5,1],"lerp_mode":"catmullrom"},"0.6667":{"post":[1,2.5,1],"lerp_mode":"catmullrom"},"0.7917":{"post":[1,1,1],"lerp_mode":"catmullrom"},"0.9167":{"post":[1,1,1],"lerp_mode":"catmullrom"},"1.0":{"post":[1,3,1],"lerp_mode":"catmullrom"},"1.125":[1,1,1],"2.0":[1,1,1]}}},"sound_effects":{"0.0":{"effect":"sniffsniff"}}},"animation.{name}.longsniff":{"animation_length":1,"bones":{"nose":{"scale":{"0.0":{"post":[1,1,1],"lerp_mode":"catmullrom"},"0.0833":{"post":[1,0.7,1],"lerp_mode":"catmullrom"},"0.125":{"post":[1,3,1],"lerp_mode":"catmullrom"},"0.25":{"post":[1,3,1],"lerp_mode":"catmullrom"},"0.7083":{"post":[1,4,1],"lerp_mode":"catmullrom"},"0.8333":{"post":[1,1,1],"lerp_mode":"catmullrom"},"1.0":{"post":[1,1,1],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":[0,0,0],"0.125":[-5,0,0],"0.875":[-20,0,0],"1.0":[0,0,0]}}},"sound_effects":{"0.0":{"effect":"long_sniff"}}},"animation.{name}.search":{"loop":true,"animation_length":2,"bones":{"right_front_leg":{"rotation":{"0.0":[0,0,0],"0.5833":[35,0,0],"1.0":[-35,0,0],"1.1667":[0,0,0],"2.0":[0,0,0]},"position":{"0.0":[0,0,3],"0.75":[0,4,-1],"1.0":[0,0,0],"1.1667":[0,0,-1],"2.0":[0,0,3]}},"right_mid_leg":{"rotation":{"0.0":[-7,0,0],"0.1667":[-35,0,0],"0.3333":[0,0,0],"1.0":[0,0,0],"1.1667":[0,0,0],"1.75":[35,0,0],"2.0":[-7,0,0]},"position":{"0.0":[0,2.67,-0.67],"0.1667":[0,0,0],"0.3333":[0,0,-2],"1.0":[0,0,2],"1.1667":[0,0,3],"1.9167":[0,4,-1],"2.0":[0,2.67,-0.67]}},"right_hind_leg":{"rotation":{"0.0":[0,0,0],"0.5833":[0,0,0],"1.0":[25,0,0],"1.1667":[35,0,0],"1.5833":[-35,0,0],"1.75":[0,0,0],"2.0":[0,0,0]},"position":{"0.0":[0,0,-0.5],"0.5833":[0,0,2],"1.0":[0,2.22,0.78],"1.3333":[0,4,-1],"1.5833":[0,0,0],"1.75":[0,0,-2],"2.0":[0,0,-0.5]}},"left_front_leg":{"rotation":{"0.0":[-35,0,0],"0.1667":[0,0,0],"1.0":[0,0,0],"1.5833":[35,0,0],"2.0":[-35,0,0]},"position":{"0.0":[0,0,0],"0.1667":[0,0,-1],"1.0":[0,0,3],"1.75":[0,4,-1],"2.0":[0,0,0]}},"left_mid_leg":{"rotation":{"0.0":[0,0,0],"0.1667":[0,0,0],"0.75":[35,0,0],"1.1667":[-35,0,0],"1.3333":[0,0,0],"2.0":[0,0,0]},"position":{"0.0":[0,0,2],"0.1667":[0,0,3],"0.9167":[0,4,-1],"1.1667":[0,0,0],"1.3333":[0,0,-2],"2.0":[0,0,2]}},"left_hind_leg":{"rotation":{"0.0":[25,0,0],"0.1667":[35,0,0],"0.5833":[-35,0,0],"0.75":[0,0,0],"1.0":[0,0,0],"1.5833":[0,0,0],"2.0":[25,0,0]},"position":{"0.0":[0,2.22,0.78],"0.3333":[0,4,-1],"0.5833":[0,0,0],"0.75":[0,0,-2],"1.0":[0,0,-0.5],"1.5833":[0,0,2],"2.0":[0,2.22,0.78]}},"body":{"rotation":{"0.0":[2.5,0,0],"0.5":[1.25,0,0],"1.5":[0,0,0],"2.0":[2.5,0,0]}},"head":{"rotation":{"0.0":[35,0,0],"0.125":[33.61503,11.46526,9.803],"0.875":[34.71128,17.67415,14.15251],"1.125":[37.21128,-17.67415,-14.15251],"1.875":[38.30529,-21.62827,-17.40292],"2.0":[35,0,0]},"position":[0,-2,0]},"left_ear":{"rotation":{"0.0":[0,0,-2.5],"0.25":[0,0,-15],"0.5":[0,0,-2.5],"0.75":[0,0,-15],"1.0":[0,0,-2.5],"1.25":[0,0,-15],"1.5":[0,0,-2.5],"1.75":[0,0,-15],"2.0":[0,0,-2.5]}},"right_ear":{"rotation":{"0.0":[0,0,2.5],"0.25":[0,0,15],"0.5":[0,0,2.5],"0.75":[0,0,15],"1.0":[0,0,2.5],"1.25":[0,0,15],"1.5":[0,0,2.5],"1.75":[0,0,15],"2.0":[0,0,2.5]}},"nose":{"scale":{"0.0":{"post":[1,1,1],"lerp_mode":"catmullrom"},"0.0833":{"post":[1,1.5,1],"lerp_mode":"catmullrom"},"0.2083":{"post":[1,1,1],"lerp_mode":"catmullrom"},"0.375":{"post":[1,1,1],"lerp_mode":"catmullrom"},"0.4583":{"post":[1,2.5,1],"lerp_mode":"catmullrom"},"0.625":{"post":[1,1,1],"lerp_mode":"catmullrom"},"0.8333":{"post":[1,1,1],"lerp_mode":"catmullrom"},"0.9167":{"post":[1,2.5,1],"lerp_mode":"catmullrom"},"1.0833":{"post":[1,1,1],"lerp_mode":"catmullrom"},"1.2917":{"post":[1,1,1],"lerp_mode":"catmullrom"},"1.3333":{"post":[1,2.5,1],"lerp_mode":"catmullrom"},"1.5":{"post":[1,1,1],"lerp_mode":"catmullrom"},"1.625":{"post":[1,1,1],"lerp_mode":"catmullrom"},"1.6667":{"post":[1,3.5,1],"lerp_mode":"catmullrom"},"1.8333":{"post":[1,1,1],"lerp_mode":"catmullrom"},"2.0":{"post":[1,1,1],"lerp_mode":"catmullrom"}}}},"sound_effects":{"0.0":{"effect":"searching"},"1.0":{"effect":"searching"}}},"animation.{name}.dig":{"loop":"hold_on_last_frame","animation_length":8,"bones":{"body":{"rotation":{"0.0":[0,0,0],"0.5":[1.5,0,0],"1.3333":[-5,0,0],"1.5":[0,0,0],"2.0":[0,0,0],"2.5":[2.5,0,0],"3.0":[0,0,0],"3.5":[2.5,0,0],"4.0":[0,0,0],"4.5":[2.5,0,0],"5.6667":[5,0,0],"5.8333":[-2.5,0,0],"6.0":[0,0,0]},"position":{"0.0":[0,0,0],"1.3333":[0,1,0],"1.5":[0,-7,0]},"scale":{"0.0":[1,1,1],"1.5":[1,1,1],"1.5417":[1.04,0.98,1.02],"1.5833":[1,1,1]}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.1667":{"post":[10,0,0],"lerp_mode":"catmullrom"},"1.4167":{"post":[-10,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.5833":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.875":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.0833":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.5":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"2.6667":{"post":[38.44,0,0],"lerp_mode":"catmullrom"},"2.875":{"post":[10.95951,13.57454,-14.93501],"lerp_mode":"catmullrom"},"3.2083":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"3.5833":{"post":[55,0,0],"lerp_mode":"catmullrom"},"3.7917":{"post":[4.2932,-16.187,10.90042],"lerp_mode":"catmullrom"},"4.125":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"4.4167":{"post":[54.71135,7.98009,-5.56662],"lerp_mode":"catmullrom"},"4.5":{"post":[55.72895,-6.77684,4.46197],"lerp_mode":"catmullrom"},"4.5833":{"post":[54.71135,7.98009,-5.56662],"lerp_mode":"catmullrom"},"4.6667":{"post":[55.72895,-6.77684,4.46197],"lerp_mode":"catmullrom"},"4.75":{"post":[54.71135,7.98009,-5.56662],"lerp_mode":"catmullrom"},"4.8333":{"post":[55.72895,-6.77684,4.46197],"lerp_mode":"catmullrom"},"5.0":{"post":[65,0,0],"lerp_mode":"catmullrom"},"5.75":{"post":[65,0,0],"lerp_mode":"catmullrom"},"5.9167":{"post":[-32.5,0,0],"lerp_mode":"catmullrom"},"6.25":[0,0,0]},"position":{"0.0":[0,0,0],"0.625":[0,0,0],"1.375":[0,1,0],"1.5":[0,1,0],"1.5833":[0,1,0],"1.875":[0,1,0],"2.0833":[0,3,0],"2.2917":[0,6,0],"2.6667":[0,0,0],"3.2083":[0,4,0],"3.5833":[0,0,0],"4.125":[0,4,0],"5.0":[0,0,0],"5.75":[0,1,0],"6.0":[0,1.5,0],"6.25":[0,1,0]}},"left_ear":{"rotation":{"0.0":[0,0,-2.5],"1.25":[0,0,-2.5],"1.4167":[0,0,-50],"1.5833":[0,0,-30],"5.9167":[0,0,-30],"6.0833":[0,0,-65],"6.3333":[0,0,-30]}},"right_ear":{"rotation":{"0.0":[0,0,2.5],"1.25":[0,0,2.5],"1.4167":[0,0,50],"1.5833":[0,0,30],"5.9167":[0,0,30],"6.0833":[0,0,65],"6.3333":[0,0,30]}},"right_front_leg":{"rotation":{"0.0":[0,0,0],"1.2083":[0,0,0],"1.375":[0,0,90]},"position":{"0.0":[0,0,0],"1.2083":[0,0,0],"1.2917":[-2,-0.75,0],"1.375":[-4,-5.5,0]}},"right_mid_leg":{"rotation":{"0.0":[0,0,0],"1.25":[0,0,0],"1.4167":[0,0,90]},"position":{"0.0":[0,0,0],"1.25":[0,0,0],"1.3333":[-2,-0.75,0],"1.4167":[-4,-5.5,0]}},"right_hind_leg":{"rotation":{"0.0":[0,0,0],"1.3333":[0,0,0],"1.5":[0,0,90]},"position":{"0.0":[0,0,0],"1.3333":[0,0,0],"1.4167":[-2,-0.75,0],"1.5":[-4,-5.5,0]}},"left_front_leg":{"rotation":{"0.0":[0,0,0],"1.2083":[0,0,0],"1.375":[0,0,-90]},"position":{"0.0":[0,0,0],"1.2083":[0,0,0],"1.2917":[2,-0.75,0],"1.375":[4,-5.5,0]}},"left_mid_leg":{"rotation":{"0.0":[0,0,0],"1.25":[0,0,0],"1.4167":[0,0,-90]},"position":{"0.0":[0,0,0],"1.25":[0,0,0],"1.3333":[2,-0.75,0],"1.4167":[4,-5.5,0]}},"left_hind_leg":{"rotation":{"0.0":[0,0,0],"1.3333":[0,0,0],"1.5":[0,0,-90]},"position":{"0.0":[0,0,0],"1.3333":[0,0,0],"1.4167":[2,-0.75,0],"1.5":[4,-5.5,0]}}},"sound_effects":{"0.0":{"effect":"digging"},"6.0":{"effect":"drop_seed"}}},"animation.{name}.stand_up":{"loop":"hold_on_last_frame","animation_length":3,"bones":{"body":{"rotation":{"0.25":[0,0,0],"0.75":[2.5,0,0],"1.5":[-2.5,0,0],"1.7083":[0,0,0]},"position":{"0.25":[0,-7,0],"0.75":[0,-7,0],"1.5":[0,0,0],"1.7083":[0,0,0]}},"head":{"rotation":{"0.0":[0,0,0],"0.3333":[-5,0,0],"0.7083":[0,0,0],"1.0":[10,0,0],"1.375":[0,0,0]},"position":{"0.0":[0,1,0],"1.375":[0,1,0]}},"left_ear":{"rotation":{"0.0":[0,0,-30],"0.9167":[0,0,-30],"1.2083":[0,0,-5]}},"right_ear":{"rotation":{"0.0":[0,0,30],"0.9167":[0,0,30],"1.2083":[0,0,5]}},"right_front_leg":{"rotation":{"0.0":{"post":[0,0,90],"lerp_mode":"catmullrom"},"0.4583":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[-4,-5.5,0],"lerp_mode":"catmullrom"},"0.2083":{"post":[6,-5.5,0],"lerp_mode":"catmullrom"},"0.4583":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_mid_leg":{"rotation":{"0.0833":{"pre":[0,0,90],"post":[0,0,90],"lerp_mode":"catmullrom"},"0.5833":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0833":{"pre":[-4,-5.5,0],"post":[-4,-5.5,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[6,-5.5,0],"lerp_mode":"catmullrom"},"0.5833":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_hind_leg":{"rotation":{"0.1667":{"pre":[0,0,90],"post":[0,0,90],"lerp_mode":"catmullrom"},"0.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.1667":{"pre":[-4,-5.5,0],"post":[-4,-5.5,0],"lerp_mode":"catmullrom"},"0.4167":{"post":[6,-5.5,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_front_leg":{"rotation":{"0.0":{"post":[0,0,-90],"lerp_mode":"catmullrom"},"0.4583":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[4,-5.5,0],"lerp_mode":"catmullrom"},"0.2083":{"post":[-6,-5.5,0],"lerp_mode":"catmullrom"},"0.4583":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_mid_leg":{"rotation":{"0.0833":{"pre":[0,0,-90],"post":[0,0,-90],"lerp_mode":"catmullrom"},"0.5833":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0833":{"pre":[4,-5.5,0],"post":[4,-5.5,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[-6,-5.5,0],"lerp_mode":"catmullrom"},"0.5833":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_hind_leg":{"rotation":{"0.1667":{"pre":[0,0,-90],"post":[0,0,-90],"lerp_mode":"catmullrom"},"0.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.1667":{"pre":[4,-5.5,0],"post":[4,-5.5,0],"lerp_mode":"catmullrom"},"0.4167":{"post":[-6,-5.5,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"}}}},"sound_effects":{"0.0":{"effect":"stand_up"}}},"animation.{name}.feeling_happy":{"loop":true,"animation_length":2,"bones":{"head":{"rotation":{"0.0":[0,0,0],"0.5":{"pre":[-32.00206,19.3546,-11.70092],"post":[-32.00206,19.3546,-11.70092],"lerp_mode":"catmullrom"},"1.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.5":{"post":[-32.00206,-19.3546,11.70092],"lerp_mode":"catmullrom"},"2.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_ear":{"rotation":{"0.5":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,-67.5],"lerp_mode":"catmullrom"},"0.9583":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.125":{"post":[0,0,-67.5],"lerp_mode":"catmullrom"},"1.2917":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_ear":{"rotation":{"0.5":{"pre":[0,0,0],"post":[0,0,0],"lerp_mode":"catmullrom"},"0.75":{"post":[0,0,67.5],"lerp_mode":"catmullrom"},"0.9583":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.125":{"post":[0,0,67.5],"lerp_mode":"catmullrom"},"1.2917":{"post":[0,0,0],"lerp_mode":"catmullrom"}}}},"sound_effects":{"0.0":{"effect":"happy"}}},"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"position":[0.0,1.0,1.0],"scale":1.2}}}}}'},759:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"loop":true,"bones":{"piece1":{"rotation":[0.0,"query.target_y_rotation * 0.25",0.0]}}},"animation.{name}.sheared":{"loop":true,"bones":{"pumpkin":{"scale":0}}}}}'},9694:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.default_leg_pose":{"loop":true,"bones":{"leg0":{"rotation":[0.0,"45.0 - this","-45.0 - this"]},"leg1":{"rotation":[0.0,"-45.0 - this","45.0 - this"]},"leg2":{"rotation":[0.0,"22.5 - this","-33.3 - this"]},"leg3":{"rotation":[0.0,"-22.5 - this","33.3 - this"]},"leg4":{"rotation":[0.0,"-22.5 - this","-33.3 - this"]},"leg5":{"rotation":[0.0,"22.5 - this","33.3 - this"]},"leg6":{"rotation":[0.0,"-45.0 - this","-45.0 - this"]},"leg7":{"rotation":[0.0,"45.0 - this","45.0 - this"]}}},"animation.{name}.look_at_target":{"loop":true,"bones":{"head":{"rotation":["query.target_x_rotation","query.target_y_rotation",0.0]}}},"animation.{name}.walk":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":[0.0,"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 0) * 22.92)","math.abs(math.sin(query.anim_time * 38.17 + 90 * 0) * 22.92)"]},"leg1":{"rotation":[0.0,"math.abs(math.cos(query.anim_time * 76.34 + 90 * 0) * 22.92)","-math.abs(math.sin(query.anim_time * 38.17 + 90 * 0) * 22.92)"]},"leg2":{"rotation":[0.0,"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 1) * 22.92)","math.abs(math.sin(query.anim_time * 38.17 + 90 * 1) * 22.92)"]},"leg3":{"rotation":[0.0,"math.abs(math.cos(query.anim_time * 76.34 + 90 * 1) * 22.92)","-math.abs(math.sin(query.anim_time * 38.17 + 90 * 1) * 22.92)"]},"leg4":{"rotation":[0.0,"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 2) * 22.92)","math.abs(math.sin(query.anim_time * 38.17 + 90 * 2) * 22.92)"]},"leg5":{"rotation":[0.0,"math.abs(math.cos(query.anim_time * 76.34 + 90 * 2) * 22.92)","-math.abs(math.sin(query.anim_time * 38.17 + 90 * 2) * 22.92)"]},"leg6":{"rotation":[0.0,"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 3) * 22.92)","math.abs(math.sin(query.anim_time * 38.17 + 90 * 3) * 22.92)"]},"leg7":{"rotation":[0.0,"math.abs(math.cos(query.anim_time * 76.34 + 90 * 3) * 22.92)","-math.abs(math.sin(query.anim_time * 38.17 + 90 * 3) * 22.92)"]}}}}}'},3823:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"body":{"position":[0.0,"query.is_baby ? 3.2 : 6.4",0.0]},"tentacle1":{"rotation":["variable.squid.tentacle_angle - this","90.0 - this",0.0]},"tentacle2":{"rotation":["variable.squid.tentacle_angle - this","45.0 - this",0.0]},"tentacle3":{"rotation":["variable.squid.tentacle_angle - this","0.0 - this",0.0]},"tentacle4":{"rotation":["variable.squid.tentacle_angle - this","-45.0 - this",0.0]},"tentacle5":{"rotation":["variable.squid.tentacle_angle - this","-90.0 - this",0.0]},"tentacle6":{"rotation":["variable.squid.tentacle_angle - this","-135.0 - this",0.0]},"tentacle7":{"rotation":["variable.squid.tentacle_angle - this","-180.0 - this",0.0]},"tentacle8":{"rotation":["variable.squid.tentacle_angle - this","-225.0 - this",0.0]}}},"animation.{name}.rotate":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"body":{"rotation":[{"y":"180.0 - this"},{"x":"query.body_x_rotation"},{"y":"variable.squid.swim_rotation"}]}}}}}'},7808:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.look_at_target.default":{"loop":true,"bones":{"body":{"relative_to":{"rotation":"entity"},"rotation":["query.target_x_rotation","query.target_y_rotation",0.0]}}},"animation.{name}.walk":{"loop":true,"bones":{"right_leg":{"rotation":["Math.sin(query.modified_distance_moved * variable.speed * 0.5 + 180) * 114.592 * variable.animation_speed",0,"10 * Math.cos(query.modified_distance_moved * variable.speed * 0.5f + 180) * variable.animation_speed"],"position":[0,"-2 * Math.sin(query.modified_distance_moved * variable.speed * 0.5) * 2 * variable.animation_speed",0]},"left_leg":{"rotation":["Math.sin(query.modified_distance_moved * variable.speed * 0.5) * 114.592 * variable.animation_speed",0,"10 * Math.cos(query.modified_distance_moved * variable.speed * 0.5f) * variable.animation_speed"],"position":[0,"-2 * Math.sin(query.modified_distance_moved * variable.speed * 0.5 + 180) * 2 * variable.animation_speed",0]},"body":{"rotation":[0,0,"5.72958 * Math.sin(query.modified_distance_moved * variable.speed) * 4 * variable.animation_speed"],"position":[0,"-2 * Math.cos(query.modified_distance_moved * variable.speed) * 2 * variable.animation_speed",0]},"bristle1":{"rotation":[0,0,"variable.bristle_flow * 74.4845"]},"bristle2":{"rotation":[0,0,"variable.bristle_flow * 68.7549"]},"bristle3":{"rotation":[0,0,"variable.bristle_flow * 34.3775"]},"bristle4":{"rotation":[0,0,"variable.bristle_flow * 68.7549"]},"bristle5":{"rotation":[0,0,"variable.bristle_flow * 74.4845"]}}},"animation.{name}.bristle_flow":{"loop":true,"bones":{"bristle0":{"rotation":[0,0,"2.864789 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * -22.9183)"]},"bristle1":{"rotation":[0,0,"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 11.4592)"]},"bristle2":{"rotation":[0,0,"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 22.9183)"]},"bristle3":{"rotation":[0,0,"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 22.9183)"]},"bristle4":{"rotation":[0,0,"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 11.4592)"]},"bristle5":{"rotation":[0,0,"2.864789 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * -22.9183)"]}}}}}'},7250:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.swim":{"loop":true,"animation_length":2,"bones":{"tail":{"rotation":{"0.0":[0,-22.5,0],"1.0":[0,22.5,0],"2.0":[0,-22.5,0]}}}}}}'},2869:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.general":{"loop":true,"bones":{"body":{"position":[0.0,"query.is_pregnant ? 1.0 : 0.0",0.0],"rotation":["-this",0.0,0.0]},"eggbelly":{"position":[0.0,-0.08,0.0],"rotation":["-this",0.0,0.0],"scale":"query.is_pregnant ? 1.0 : 0.0"}}},"animation.{name}.ground_move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["-this","math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3 + 180) * variable.backlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this","-this"]},"leg1":{"rotation":["-this","math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3) * variable.backlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this","-this"]},"leg2":{"rotation":["-this","query.is_laying_egg ? math.cos(query.life_time * 1146.0 + 180) * 90.0 : math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3 + 180) * variable.frontlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this","-this"]},"leg3":{"rotation":["-this","query.is_laying_egg ? math.cos(query.life_time * 1146.0) * 90.0 : math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3) * variable.frontlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this","-this"]}}},"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["math.clamp(math.cos(query.anim_time * 22.92) * query.modified_move_speed * 28.65, -90.0, 90.0) - this","-this","-this"]},"leg1":{"rotation":["math.clamp(math.cos(query.anim_time * 22.92 + 180) * query.modified_move_speed * 28.65, -90.0, 90.0) - this","-this","-this"]},"leg2":{"rotation":["-this","-this","math.clamp(math.cos(query.anim_time * 22.92 + 180) * query.modified_move_speed * 28.65, -90.0, 90.0) - this"]},"leg3":{"rotation":["-this","-this","math.clamp(math.cos(query.anim_time * 22.92) * query.modified_move_speed * 28.65, -90.0, 90.0) - this"]}}}}}'},410:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.attack.rotations":{"loop":true,"bones":{"body":{"rotation":[0.0,"variable.attackbodyroty - this",0.0]},"leftarm":{"rotation":["variable.attackbodyroty","variable.attackbodyroty",0.0]},"rightarm":{"rotation":["math.sin(1.0 - math.pow(1.0 - variable.attack_time, 3.0) * 180.0) * (variable.is_brandishing_spear ? -1.0 : 1.0 )","(variable.is_brandishing_spear ? 0.0 : variable.attackbodyroty * 2.0) + variable.attackbodyroty",0.0]}}},"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leftwing":{"position":[0.0,"-1.0 - this","2.0 - this"],"rotation":["27.0 - this","-(27.0 + math.cos(query.life_time * 916.8) * 9.0) - this","-27.0 - this"]},"leg0":{"rotation":["variable.tcos0 * 1.4 + 36.0",0.0,0.0]},"rightarm":{"rotation":["query.is_charging ? (216.0 - this) : 0.0",0.0,0.0]},"rightwing":{"position":[0.0,"-1.0 - this","2.0 - this"],"rotation":["27.0 - this","27.0 + math.cos(query.life_time * 916.8) * 9.0 - this","27.0 - this"]}}}}}'},4361:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.baby_transform":{"loop":true,"bones":{"head":{"scale":1.5}}},"animation.{name}.general":{"loop":true,"bones":{"arms":{"position":[0.0,-1.0,-1.0],"rotation":["-42.97 - this",0.0,0.0]}}},"animation.{name}.general.v1.0":{"loop":true,"bones":{"arms":{"position":[0.0,"-3.0 - this","-1.0 - this"],"rotation":["-42.97 - this",0.0,0.0]}}},"animation.{name}.get_in_bed":{"loop":true,"bones":{"body":{"position":[0.0,1.0,-15.0],"rotation":[-90.0,0.0,0.0]}}},"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["(math.cos(query.anim_time * 38.17) * 40.0) - this","-this",0.0]},"leg1":{"rotation":["(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this","-this",0.0]}}}}}'},1424:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.attack":{"loop":true,"bones":{"leftarm":{"rotation":["query.is_riding ? 0.0 : ((math.cos(query.life_time * 20.0 * 10.89) * 28.65) + (math.sin(variable.attack_time * 180.0) * 68.76 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92))",0.0,0.0]},"rightarm":{"rotation":["(-108 + math.cos(query.life_time * 20.0 * 3.84) * 2.87) + (math.sin(variable.attack_time * 180.0) * 126.05 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)",0.0,0.0]}}},"animation.{name}.hand_attack":{"loop":true,"bones":{"leftarm":{"rotation":["(-108 + math.cos(query.life_time * 20.0 * 3.84) * 2.87) + (math.sin(variable.attack_time * 180.0) * 126.05 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)",0.0,0.0]},"rightarm":{"rotation":["(-108 + math.cos(query.life_time * 20.0 * 3.84) * 2.87) + (math.sin(variable.attack_time * 180.0) * 126.05 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)",0.0,0.0]}}},"animation.{name}.base":{"loop":true,"bones":{"arms":{"position":[0.0,"-3.0 - this","-1.0 - this"],"rotation":["-42.97 - this",0.0,0.0]},"leftarm":{"rotation":["math.cos(query.life_time * 20.0 * 3.84) * 2.87",-9.0,"-1 * (math.cos(query.life_time * 20.0 * 5.16) * 2.87 + 2.87)"]},"rightarm":{"rotation":["math.cos(query.life_time * 20.0 * 3.84) * 2.87",9.0,"math.cos(query.life_time * 20.0 * 5.16) * 2.87 + 2.87"]},"rightItem":{"scale":"query.is_angry ? 1.0 : 0.0"},"leftItem":{"scale":"query.is_angry ? 1.0 : 0.0"}}},"animation.{name}.riding.arms":{"loop":true,"bones":{"leftarm":{"rotation":[-36.0,0.0,0.0]}}},"animation.{name}.riding.legs":{"loop":true,"bones":{"leg0":{"rotation":["-72.0 - this","18.0 - this","-this"]},"leg1":{"rotation":["-72.0 - this","-18.0 - this","-this"]}}},"animation.{name}.walk":{"loop":true,"bones":{"leg0":{"rotation":["(math.cos(query.modified_distance_moved * 38.17) * 80.21) * query.modified_move_speed * 0.5",0.0,0.0]},"leg1":{"rotation":["(math.cos(query.modified_distance_moved * 38.17 + 180) * 80.21) * query.modified_move_speed * 0.5",0.0,0.0]}}}}}'},1654:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.look_at_target.default":{"loop":true,"bones":{"head":{"relative_to":{"rotation":"entity"},"rotation":["query.target_x_rotation","query.target_y_rotation",0]}}},"animation.{name}.shiver":{"loop":true,"bones":{"left_tendril":{"rotation":["variable.left_tendril_x_rot",0,0]},"right_tendril":{"rotation":["variable.right_tendril_x_rot",0,0]}},"sound_effects":{"0.0":{"effect":"clicking"}}},"animation.{name}.move":{"loop":true,"bones":{"head":{"rotation":["variable.head_x_rot",0,"variable.head_z_rot"]},"body":{"rotation":["variable.body_x_rot",0,"variable.body_z_rot"]},"left_leg":{"rotation":["variable.left_leg_x_rot",0,0]},"right_leg":{"rotation":["variable.right_leg_x_rot",0,0]},"left_arm":{"rotation":["variable.left_arm_x_rot",0,0]},"right_arm":{"rotation":["variable.right_arm_x_rot",0,0]}}},"animation.{name}.emerge":{"animation_length":6.64,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,0,-22.5],"lerp_mode":"catmullrom"},"1.2":{"post":[0,0,-7.5],"lerp_mode":"catmullrom"},"1.68":{"post":[0,0,10],"lerp_mode":"catmullrom"},"1.8":{"post":[0,0,10],"lerp_mode":"catmullrom"},"2.28":{"post":[0,0,10],"lerp_mode":"catmullrom"},"2.88":{"post":[0,0,10],"lerp_mode":"catmullrom"},"3.76":{"post":[25,0,-7.5],"lerp_mode":"catmullrom"},"3.92":{"post":[35,0,-7.5],"lerp_mode":"catmullrom"},"4.08":{"post":[25,0,-7.5],"lerp_mode":"catmullrom"},"4.44":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"4.56":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"4.68":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"5.0":{"post":[70,0,2.5],"lerp_mode":"catmullrom"},"5.8":{"post":[70,0,2.5],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,-63,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,-56,0],"lerp_mode":"catmullrom"},"1.2":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"1.68":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"1.8":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"2.28":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"2.88":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"3.16":{"post":[0,-27,0],"lerp_mode":"catmullrom"},"3.76":{"post":[0,-14,0],"lerp_mode":"catmullrom"},"3.92":{"post":[0,-11,0],"lerp_mode":"catmullrom"},"4.08":{"post":[0,-14,0],"lerp_mode":"catmullrom"},"4.44":{"post":[0,-6,-3],"lerp_mode":"catmullrom"},"4.56":{"post":[0,-4,-3],"lerp_mode":"catmullrom"},"4.68":{"post":[0,-6,-3],"lerp_mode":"catmullrom"},"5.0":{"post":[0,-3,-4],"lerp_mode":"catmullrom"},"5.8":{"post":[0,-3,-4],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.92":{"post":[0.74,0,-40.38],"lerp_mode":"catmullrom"},"1.16":{"post":[-67.5,0,-2.5],"lerp_mode":"catmullrom"},"1.24":{"post":[-67.5,0,-2.5],"lerp_mode":"catmullrom"},"1.32":{"post":[-47.5,0,-2.5],"lerp_mode":"catmullrom"},"1.4":{"post":[-67.5,0,-2.5],"lerp_mode":"catmullrom"},"1.68":{"post":[-67.5,0,15],"lerp_mode":"catmullrom"},"1.76":{"post":[-67.5,0,-5],"lerp_mode":"catmullrom"},"1.84":{"post":[-52.5,0,-5],"lerp_mode":"catmullrom"},"1.92":{"post":[-67.5,0,-5],"lerp_mode":"catmullrom"},"2.64":{"post":[-17.5,0,-10],"lerp_mode":"catmullrom"},"3.76":{"post":[70,0,12.5],"lerp_mode":"catmullrom"},"4.04":{"post":[70,0,12.5],"lerp_mode":"catmullrom"},"4.12":{"post":[80,0,12.5],"lerp_mode":"catmullrom"},"4.24":{"post":[70,0,12.5],"lerp_mode":"catmullrom"},"5.0":{"post":[77.5,0,-2.5],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.52":{"post":[-8,-11,0],"lerp_mode":"catmullrom"},"0.92":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.24":{"post":[0,0.47,-0.95],"lerp_mode":"catmullrom"},"1.32":{"post":[0,0.47,-0.95],"lerp_mode":"catmullrom"},"1.4":{"post":[0,0.47,-0.95],"lerp_mode":"catmullrom"},"1.68":{"post":[0,1,-2],"lerp_mode":"catmullrom"},"1.76":{"post":[0,1,-2],"lerp_mode":"catmullrom"},"1.84":{"post":[0,1,-2],"lerp_mode":"catmullrom"},"1.92":{"post":[0,1,-2],"lerp_mode":"catmullrom"},"2.64":{"post":[0,-2,-2],"lerp_mode":"catmullrom"},"3.76":{"post":[0,-4,1],"lerp_mode":"catmullrom"},"4.04":{"post":[0,-1,1],"lerp_mode":"catmullrom"},"4.12":{"post":[0,-1,1],"lerp_mode":"catmullrom"},"4.24":{"post":[0,-1,1],"lerp_mode":"catmullrom"},"5.0":{"post":[0,-1,1],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.2":{"post":[-152.5,2.5,7.5],"lerp_mode":"catmullrom"},"1.68":{"post":[-180,12.5,-10],"lerp_mode":"catmullrom"},"1.8":{"post":[-90,12.5,-10],"lerp_mode":"catmullrom"},"2.28":{"post":[-90,12.5,-10],"lerp_mode":"catmullrom"},"2.88":{"post":[-90,12.5,-10],"lerp_mode":"catmullrom"},"3.08":{"post":[-95,12.5,-10],"lerp_mode":"catmullrom"},"3.24":{"post":[-83.93,3.93,5.71],"lerp_mode":"catmullrom"},"3.36":{"post":[-80,7.5,17.5],"lerp_mode":"catmullrom"},"3.76":{"post":[-67.5,2.5,0],"lerp_mode":"catmullrom"},"4.08":{"post":[-67.5,2.5,0],"lerp_mode":"catmullrom"},"4.44":{"post":[-55,2.5,0],"lerp_mode":"catmullrom"},"4.56":{"post":[-60,2.5,0],"lerp_mode":"catmullrom"},"4.68":{"post":[-55,2.5,0],"lerp_mode":"catmullrom"},"5.0":{"post":[-67.5,0,0],"lerp_mode":"catmullrom"},"5.56":{"post":[-50.45,0,2.69],"lerp_mode":"catmullrom"},"6.08":{"post":[-62.72,0,4.3],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.2":{"post":[0,-21,9],"lerp_mode":"catmullrom"},"1.68":{"post":[2,-2,0],"lerp_mode":"catmullrom"},"1.8":{"post":[2,0,0],"lerp_mode":"catmullrom"},"2.28":{"post":[2,0,0],"lerp_mode":"catmullrom"},"2.88":{"post":[2,0,0],"lerp_mode":"catmullrom"},"3.08":{"post":[2,-2,0],"lerp_mode":"catmullrom"},"3.24":{"post":[2,2.71,3.86],"lerp_mode":"catmullrom"},"3.36":{"post":[2,1,5],"lerp_mode":"catmullrom"},"3.76":{"post":[2,3,3],"lerp_mode":"catmullrom"},"4.08":{"post":[2,3,3],"lerp_mode":"catmullrom"},"4.44":{"post":[2.67,4,0],"lerp_mode":"catmullrom"},"4.56":{"post":[2.67,0,0],"lerp_mode":"catmullrom"},"4.68":{"post":[2.67,4,0],"lerp_mode":"catmullrom"},"5.0":{"post":[0.67,3,4],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.12":{"post":[-167.5,-17.5,-7.5],"lerp_mode":"catmullrom"},"0.6":{"post":[-167.5,-17.5,-7.5],"lerp_mode":"catmullrom"},"0.88":{"post":[-175,-17.5,15],"lerp_mode":"catmullrom"},"1.16":{"post":[-190,-17.5,5],"lerp_mode":"catmullrom"},"1.28":{"post":[-90,-5,5],"lerp_mode":"catmullrom"},"1.68":{"post":[-90,-17.5,-12.5],"lerp_mode":"catmullrom"},"1.8":{"post":[-90,-17.5,-12.5],"lerp_mode":"catmullrom"},"2.28":{"post":[-90,-17.5,-12.5],"lerp_mode":"catmullrom"},"2.88":{"post":[-90,-17.5,-12.5],"lerp_mode":"catmullrom"},"3.04":{"post":[-81.29,-10.64,-14.21],"lerp_mode":"catmullrom"},"3.16":{"post":[-83.5,-5.5,-15.5],"lerp_mode":"catmullrom"},"3.76":{"post":[-62.5,-7.5,5],"lerp_mode":"catmullrom"},"3.92":{"post":[-58.75,-3.75,5],"lerp_mode":"catmullrom"},"4.08":{"post":[-55,0,0],"lerp_mode":"catmullrom"},"4.44":{"post":[-52.5,0,5],"lerp_mode":"catmullrom"},"4.56":{"post":[-50,0,5],"lerp_mode":"catmullrom"},"4.68":{"post":[-52.5,0,5],"lerp_mode":"catmullrom"},"5.0":{"post":[-72.5,-2.5,5],"lerp_mode":"catmullrom"},"5.56":{"post":[-57.5,-4.54,2.99],"lerp_mode":"catmullrom"},"6.08":{"post":[-70.99,-5.77,1.78],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.12":{"post":[0,-8,0],"lerp_mode":"catmullrom"},"0.6":{"post":[0,-8,0],"lerp_mode":"catmullrom"},"0.88":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.2":{"post":[-2,0,0],"lerp_mode":"catmullrom"},"1.68":{"post":[-4,3,0],"lerp_mode":"catmullrom"},"1.8":{"post":[-4,3,0],"lerp_mode":"catmullrom"},"2.28":{"post":[-4,3,0],"lerp_mode":"catmullrom"},"2.88":{"post":[-4,3,0],"lerp_mode":"catmullrom"},"3.04":{"post":[-3.23,5.7,4.97],"lerp_mode":"catmullrom"},"3.16":{"post":[-1.49,2.22,5.25],"lerp_mode":"catmullrom"},"3.76":{"post":[-1.14,1.71,1.86],"lerp_mode":"catmullrom"},"3.92":{"post":[-1.14,1.21,3.86],"lerp_mode":"catmullrom"},"4.08":{"post":[-1.14,2.71,4.86],"lerp_mode":"catmullrom"},"4.44":{"post":[-1,1,3],"lerp_mode":"catmullrom"},"4.56":{"post":[0,1,1],"lerp_mode":"catmullrom"},"4.68":{"post":[0,1,3],"lerp_mode":"catmullrom"},"5.0":{"post":[-2,0,4],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.28":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.88":{"post":[0,0,0],"lerp_mode":"catmullrom"},"3.36":{"post":[0,0,0],"lerp_mode":"catmullrom"},"4.32":{"post":[0,0,0],"lerp_mode":"catmullrom"},"4.48":{"post":[55,0,0],"lerp_mode":"catmullrom"},"4.6":{"post":[0,0,0],"lerp_mode":"catmullrom"},"5.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"5.8":{"post":[0,0,0],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,-63,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,-56,0],"lerp_mode":"catmullrom"},"1.2":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"1.68":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"1.8":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"2.28":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"2.88":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"3.36":{"post":[0,-22,0],"lerp_mode":"catmullrom"},"3.76":{"post":[0,-12.28,2.48],"lerp_mode":"catmullrom"},"3.92":{"post":[0,-9.28,2.48],"lerp_mode":"catmullrom"},"4.08":{"post":[0,-12.28,2.48],"lerp_mode":"catmullrom"},"4.32":{"post":[0,-4.14,4.14],"lerp_mode":"catmullrom"},"4.48":{"post":[0,-0.57,-8.43],"lerp_mode":"catmullrom"},"4.6":{"post":[0,0,0],"lerp_mode":"catmullrom"},"5.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"5.8":{"post":[0,0,0],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_leg":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.28":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.88":{"post":[0,0,0],"lerp_mode":"catmullrom"},"3.36":{"post":[0,0,0],"lerp_mode":"catmullrom"},"3.84":{"post":[20,0,-17.5],"lerp_mode":"catmullrom"},"4.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"4.68":{"post":[20,0,0],"lerp_mode":"catmullrom"},"4.84":{"post":[10,0,0],"lerp_mode":"catmullrom"},"5.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"5.8":{"post":[0,0,0],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,-63,0],"lerp_mode":"catmullrom"},"0.52":{"post":[0,-56,0],"lerp_mode":"catmullrom"},"1.2":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"1.68":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"1.8":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"2.28":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"2.88":{"post":[0,-32,0],"lerp_mode":"catmullrom"},"3.36":{"post":[0,-22,0],"lerp_mode":"catmullrom"},"3.84":{"post":[-4,2,-7],"lerp_mode":"catmullrom"},"4.0":{"post":[-4,0,-5],"lerp_mode":"catmullrom"},"4.68":{"post":[-4,0,-9],"lerp_mode":"catmullrom"},"4.84":{"post":[-2,2,-3.5],"lerp_mode":"catmullrom"},"5.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"5.8":{"post":[0,0,0],"lerp_mode":"catmullrom"},"6.64":{"post":[0,0,0],"lerp_mode":"catmullrom"}}}},"particle_effects":{"0.0":{"effect":"digging","pre_effect_script":"variable.dig_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.dig_particle_texture_size = query.surface_particle_texture_size; variable.dig_particle_color = query.surface_particle_color;"}},"sound_effects":{"0.0":{"effect":"emerge"}}},"animation.{name}.dig":{"loop":"hold_on_last_frame","animation_length":5,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[4.13441,0.94736,1.2694],"lerp_mode":"catmullrom"},"0.5":{"post":[50,0,0],"lerp_mode":"catmullrom"},"0.7083":{"post":[54.45407,-13.53935,-18.14183],"lerp_mode":"catmullrom"},"1.0417":{"post":[59.46442,-10.8885,35.7954],"lerp_mode":"catmullrom"},"1.3333":{"post":[82.28261,0,0],"lerp_mode":"catmullrom"},"1.625":{"post":[53.23606,10.04715,-29.72932],"lerp_mode":"catmullrom"},"2.2083":{"post":[-17.71739,0,0],"lerp_mode":"catmullrom"},"2.5417":{"post":[112.28261,0,0],"lerp_mode":"catmullrom"},"2.6667":{"post":[116.06889,5.11581,-24.50117],"lerp_mode":"catmullrom"},"2.8333":{"post":[121.56244,-4.17248,19.57737],"lerp_mode":"catmullrom"},"3.0417":{"post":[138.56889,5.11581,-24.50117],"lerp_mode":"catmullrom"},"3.25":{"post":[144.06244,-4.17248,19.57737],"lerp_mode":"catmullrom"},"3.375":{"post":[147.28261,0,0],"lerp_mode":"catmullrom"},"3.625":{"post":[147.28261,0,0],"lerp_mode":"catmullrom"},"3.875":{"post":[134.36221,8.81113,-8.90172],"lerp_mode":"catmullrom"},"4.0417":{"post":[132.05966,-8.35927,9.70506],"lerp_mode":"catmullrom"},"4.25":{"post":[134.36221,8.81113,-8.90172],"lerp_mode":"catmullrom"},"4.5":[147.5,0,0]},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[0,-16.48454,-6.5784],"lerp_mode":"catmullrom"},"0.7083":{"post":[0,-16.48454,-6.5784],"lerp_mode":"catmullrom"},"1.0417":{"post":[0,-16.97,-7.11],"lerp_mode":"catmullrom"},"1.625":{"post":[0,-13.97,-7.11],"lerp_mode":"catmullrom"},"2.2083":{"post":[0,-11.48454,-0.5784],"lerp_mode":"catmullrom"},"2.5417":{"post":[0,-16.48454,-6.5784],"lerp_mode":"catmullrom"},"2.6667":{"post":[0,-20.27,-5.42],"lerp_mode":"catmullrom"},"3.375":{"post":[0,-21.48454,-5.5784],"lerp_mode":"catmullrom"},"4.0417":{"post":[0,-22.48454,-5.5784],"lerp_mode":"catmullrom"},"4.5":[0,-40,-8]}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.6667":{"post":[12.5,0,0],"lerp_mode":"catmullrom"},"1.2083":{"post":[12.5,0,0],"lerp_mode":"catmullrom"},"1.75":{"post":[45,0,0],"lerp_mode":"catmullrom"},"2.375":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"},"2.5417":{"post":[67.5,0,0],"lerp_mode":"catmullrom"},"4.375":{"post":[67.5,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"4.375":[0,0,0]}},"right_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[-101.8036,-21.29587,30.61478],"lerp_mode":"catmullrom"},"0.7083":{"post":[-101.8036,-21.29587,30.61478],"lerp_mode":"catmullrom"},"1.0":{"post":[48.7585,-17.61941,9.9865],"lerp_mode":"catmullrom"},"1.1667":{"post":[48.7585,-17.61941,9.9865],"lerp_mode":"catmullrom"},"1.4583":{"post":[-101.8036,-21.29587,30.61478],"lerp_mode":"catmullrom"},"1.75":{"post":[-89.04994,-4.19657,-1.47845],"lerp_mode":"catmullrom"},"2.2083":{"post":[-158.30728,3.7152,-1.52352],"lerp_mode":"catmullrom"},"2.5417":{"post":[-89.04994,-4.19657,-1.47845],"lerp_mode":"catmullrom"},"4.375":{"post":[-120,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.7083":{"post":[2.22,0,0.86],"lerp_mode":"catmullrom"},"1.0":{"post":[3.12,0,4.29],"lerp_mode":"catmullrom"},"2.2083":{"post":[1,0,4],"lerp_mode":"catmullrom"},"4.375":{"post":[0,0,4],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.2917":{"post":[-63.89288,-0.52011,2.09491],"lerp_mode":"catmullrom"},"0.5":{"post":[-63.89288,-0.52011,2.09491],"lerp_mode":"catmullrom"},"0.7083":{"post":[-62.87857,15.15061,9.97445],"lerp_mode":"catmullrom"},"0.9167":{"post":[-86.93642,17.45026,4.05284],"lerp_mode":"catmullrom"},"1.1667":{"post":[-86.93642,17.45026,4.05284],"lerp_mode":"catmullrom"},"1.4583":{"post":[-86.93642,17.45026,4.05284],"lerp_mode":"catmullrom"},"1.6667":{"post":[63.0984,8.83573,-8.71284],"lerp_mode":"catmullrom"},"1.8333":{"post":[35.5984,8.83573,-8.71284],"lerp_mode":"catmullrom"},"2.2083":{"post":[-153.27474,-0.02953,3.5235],"lerp_mode":"catmullrom"},"2.5417":{"post":[-87.07754,-0.02625,3.132],"lerp_mode":"catmullrom"},"4.375":[-120,0,0]},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[-0.28,5,10],"lerp_mode":"catmullrom"},"0.7083":{"post":[-1.51,4.35,4.33],"lerp_mode":"catmullrom"},"0.9167":{"post":[-0.6,3.61,4.63],"lerp_mode":"catmullrom"},"1.1667":{"post":[-0.6,3.61,0.63],"lerp_mode":"catmullrom"},"1.6667":{"post":[-2.85,-0.1,3.33],"lerp_mode":"catmullrom"},"2.2083":{"post":[-1,0,4],"lerp_mode":"catmullrom"},"4.375":[0,0,4]}},"right_leg":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[113.27,0,0],"lerp_mode":"catmullrom"},"0.7083":{"post":[113.27,0,0],"lerp_mode":"catmullrom"},"3.3333":{"post":[113.27,0,0],"lerp_mode":"catmullrom"},"3.5833":{"post":[182.5,0,0],"lerp_mode":"catmullrom"},"3.8333":{"post":[120,0,0],"lerp_mode":"catmullrom"},"4.0833":{"post":[182.5,0,0],"lerp_mode":"catmullrom"},"4.2917":{"post":[120,0,0],"lerp_mode":"catmullrom"},"4.5":[90,0,0]},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[0,-13.98,-2.37],"lerp_mode":"catmullrom"},"0.7083":{"post":[0,-13.98,-2.37],"lerp_mode":"catmullrom"},"3.3333":{"post":[0,-13.98,-2.37],"lerp_mode":"catmullrom"},"3.5833":{"post":[0,-7,-3],"lerp_mode":"catmullrom"},"3.8333":{"post":[0,-9,-3],"lerp_mode":"catmullrom"},"4.0833":{"post":[0,-16.71,-3.69],"lerp_mode":"catmullrom"},"4.2917":[0,-28,-5]}},"left_leg":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[114.98,0,0],"lerp_mode":"catmullrom"},"0.7083":{"post":[114.98,0,0],"lerp_mode":"catmullrom"},"3.3333":{"post":[114.98,0,0],"lerp_mode":"catmullrom"},"3.5833":{"post":[90,0,0],"lerp_mode":"catmullrom"},"3.8333":{"post":[172.5,0,0],"lerp_mode":"catmullrom"},"4.0833":{"post":[90,0,0],"lerp_mode":"catmullrom"},"4.2917":{"post":[197.5,0,0],"lerp_mode":"catmullrom"},"4.5":[90,0,0]},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.5":{"post":[0,-14.01,-2.35],"lerp_mode":"catmullrom"},"0.7083":{"post":[0,-14.01,-2.35],"lerp_mode":"catmullrom"},"3.3333":{"post":[0,-14.01,-2.35],"lerp_mode":"catmullrom"},"3.5833":{"post":[0,-5,-4],"lerp_mode":"catmullrom"},"3.8333":{"post":[0,-7,-4],"lerp_mode":"catmullrom"},"4.0833":{"post":[0,-15.5,-3.76],"lerp_mode":"catmullrom"},"4.2917":[0,-28,-5]}}},"sound_effects":{"0.0":{"effect":"dig"}},"particle_effects":{"0.0":{"effect":"digging","pre_effect_script":"variable.dig_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.dig_particle_texture_size = query.surface_particle_texture_size; variable.dig_particle_color = query.surface_particle_color;"}}},"animation.{name}.roar":{"animation_length":4.2,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.24":{"post":[-25,0,0],"lerp_mode":"catmullrom"},"1.6":{"post":[32.5,0,-7.5],"lerp_mode":"catmullrom"},"1.84":{"post":[38.33,0,2.99],"lerp_mode":"catmullrom"},"2.08":{"post":[40.97,0,-4.3],"lerp_mode":"catmullrom"},"2.36":{"post":[44.41,0,6.29],"lerp_mode":"catmullrom"},"3.0":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.24":{"post":[0,-1,3],"lerp_mode":"catmullrom"},"1.6":{"post":[0,-3,-6],"lerp_mode":"catmullrom"},"3.0":{"post":[0,-3,-6],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.24":{"post":[-32.5,0,0],"lerp_mode":"catmullrom"},"1.6":{"post":[-32.5,0,-27.5],"lerp_mode":"catmullrom"},"1.8":{"post":[-32.5,0,26],"lerp_mode":"catmullrom"},"2.04":{"post":[-32.5,0,-27.5],"lerp_mode":"catmullrom"},"2.44":{"post":[-32.5,0,26],"lerp_mode":"catmullrom"},"2.84":{"post":[-5,0,-12.5],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.24":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.6":{"post":[0,-2,-6],"lerp_mode":"catmullrom"},"2.2":{"post":[0,-2,-6],"lerp_mode":"catmullrom"},"2.48":{"post":[0,-2,-6],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_tendril":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.24":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.76":{"post":[0,0,-10.85],"lerp_mode":"catmullrom"},"2.08":{"post":[0,0,12.5],"lerp_mode":"catmullrom"},"2.4":{"post":[0,0,-10.85],"lerp_mode":"catmullrom"},"2.72":{"post":[0,0,12.5],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,-10.85],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_tendril":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.24":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.76":{"post":[0,0,-15.85],"lerp_mode":"catmullrom"},"2.08":{"post":[0,0,12.5],"lerp_mode":"catmullrom"},"2.4":{"post":[0,0,-15.85],"lerp_mode":"catmullrom"},"2.72":{"post":[0,0,12.5],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,-15.85],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.72":{"post":[-120,0,-20],"lerp_mode":"catmullrom"},"1.24":{"post":[-77.5,3.75,15],"lerp_mode":"catmullrom"},"1.48":{"post":[67.5,-32.5,20],"lerp_mode":"catmullrom"},"2.48":{"post":[37.5,-32.5,25],"lerp_mode":"catmullrom"},"2.88":{"post":[27.6,-17.1,32.5],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.72":{"post":[3,-2,0],"lerp_mode":"catmullrom"},"1.48":{"post":[4,-2,0],"lerp_mode":"catmullrom"},"2.48":{"post":[4,-2,0],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.72":{"post":[-125,0,20],"lerp_mode":"catmullrom"},"1.24":{"post":[-76.25,-17.5,-7.5],"lerp_mode":"catmullrom"},"1.48":{"post":[62.5,42.5,-12.5],"lerp_mode":"catmullrom"},"2.48":{"post":[37.5,27.5,-27.5],"lerp_mode":"catmullrom"},"2.88":{"post":[25,18.4,-30],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.72":{"post":[-3,-2,0],"lerp_mode":"catmullrom"},"1.48":{"post":[-4,-2,0],"lerp_mode":"catmullrom"},"2.48":{"post":[-4,-2,0],"lerp_mode":"catmullrom"},"4.2":{"post":[0,0,0],"lerp_mode":"catmullrom"}}}},"sound_effects":{"1.25":{"effect":"roar"}}},"animation.{name}.sniff":{"animation_length":3.32,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.56":{"post":[17.5,32.5,0],"lerp_mode":"catmullrom"},"0.96":{"post":[0,32.5,0],"lerp_mode":"catmullrom"},"2.2":{"post":[10,0,0],"lerp_mode":"catmullrom"},"2.8":{"post":[10,-30,0],"lerp_mode":"catmullrom"},"3.32":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.68":{"post":[0,40,0],"lerp_mode":"catmullrom"},"0.96":{"post":[-22.5,40,0],"lerp_mode":"catmullrom"},"1.24":{"post":[0,20,0],"lerp_mode":"catmullrom"},"1.52":{"post":[-35,20,0],"lerp_mode":"catmullrom"},"1.76":{"post":[0,20,0],"lerp_mode":"catmullrom"},"2.28":{"post":[0,-20,0],"lerp_mode":"catmullrom"},"2.6":{"post":[-25,-23.65037,0],"lerp_mode":"catmullrom"},"2.88":{"post":[0,-20,0],"lerp_mode":"catmullrom"},"3.32":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.96":{"post":[17.5,0,0],"lerp_mode":"catmullrom"},"2.2":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.76":{"post":[-15,0,0],"lerp_mode":"catmullrom"},"3.32":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.96":{"post":[-15,0,0],"lerp_mode":"catmullrom"},"2.2":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.76":{"post":[17.5,0,0],"lerp_mode":"catmullrom"},"3.32":{"post":[0,0,0],"lerp_mode":"catmullrom"}}}},"sound_effects":{"0.0":{"effect":"sniff"}}},"animation.{name}.bob":{"loop":true,"bones":{"body":{"rotation":["variable.modified_bob_cos * 1.43",0,"variable.modified_bob_sin * 1.43"]},"head":{"rotation":["variable.modified_bob_sin * 3.43",0,"variable.modified_bob_cos * 3.43"]}}},"animation.{name}.attack":{"animation_length":0.33333,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"},"0.2083":{"post":[22.5,0,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.2083":{"post":[0,-1,-2],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[22.5,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[-30.17493,0,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[0,-2,-2],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[-120.36119,40.78947,-20.94102],"lerp_mode":"catmullrom"},"0.1667":{"post":[-90,-45,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[4,0,5],"lerp_mode":"catmullrom"},"0.1667":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[-120.36119,-40.78947,20.94102],"lerp_mode":"catmullrom"},"0.1667":{"post":[-61.1632,42.85882,11.52421],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.0417":{"post":[-4,0,5],"lerp_mode":"catmullrom"},"0.1667":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.3333":{"post":[0,0,0],"lerp_mode":"catmullrom"}}}}},"animation.{name}.hurt":{"animation_length":0.25,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[22.5,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[-22.5,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.125":{"post":[45,0,0],"lerp_mode":"catmullrom"},"0.25":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_leg":{"rotation":{"0.0":[0,0,0],"0.125":[22.5,0,0],"0.25":[0,0,0]}},"left_leg":{"rotation":{"0.0":[0,0,0],"0.125":[-22.5,0,0],"0.25":[0,0,0]}}}},"animation.{name}.sonic_boom":{"animation_length":3,"bones":{"body":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0833":{"post":[47.5,0,0],"lerp_mode":"catmullrom"},"1.625":{"post":[55,0,0],"lerp_mode":"catmullrom"},"1.9167":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.0":{"post":[-32.5,0,0],"lerp_mode":"catmullrom"},"2.4583":{"post":[-32.5,0,0],"lerp_mode":"catmullrom"},"2.7083":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.875":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0833":{"post":[0,-3,0],"lerp_mode":"catmullrom"},"1.625":{"post":[0,-4,-1],"lerp_mode":"catmullrom"},"1.9167":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.7083":{"post":[0,0,0],"lerp_mode":"catmullrom"},"2.875":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_ribcage":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.5417":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.7917":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.875":{"post":[0,125,0],"lerp_mode":"catmullrom"},"2.5":{"post":[0,125,0],"lerp_mode":"catmullrom"},"2.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_ribcage":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.5417":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.7917":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.875":{"post":[0,-125,0],"lerp_mode":"catmullrom"},"2.5":{"post":[0,-125,0],"lerp_mode":"catmullrom"},"2.6667":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"head":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.0":{"post":[67.5,0,0],"lerp_mode":"catmullrom"},"1.75":{"post":[80,0,0],"lerp_mode":"catmullrom"},"1.9167":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"2.5":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"2.7083":{"post":[-45,0,0],"lerp_mode":"catmullrom"},"2.875":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.9167":{"post":[0,0,-3],"lerp_mode":"catmullrom"},"2.5":{"post":[0,0,-3],"lerp_mode":"catmullrom"},"2.7083":{"post":[0,0,-3],"lerp_mode":"catmullrom"},"2.875":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"right_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.875":{"post":[-42.28659,-32.69813,-5.00825],"lerp_mode":"catmullrom"},"1.1667":{"post":[-29.83757,-35.39626,-45.28089],"lerp_mode":"catmullrom"},"1.3333":{"post":[-29.83757,-35.39626,-45.28089],"lerp_mode":"catmullrom"},"1.6667":{"post":[-72.28659,-32.69813,-5.00825],"lerp_mode":"catmullrom"},"1.8333":{"post":[35.26439,-30,35.26439],"lerp_mode":"catmullrom"},"1.9167":{"post":[73.75484,-13.0931,19.20518],"lerp_mode":"catmullrom"},"2.5":{"post":[73.75484,-13.0931,19.20518],"lerp_mode":"catmullrom"},"2.75":{"post":[58.20713,-21.1064,28.7261],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.8333":{"post":[3,0,0],"lerp_mode":"catmullrom"},"2.75":{"post":[3,0,0],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}},"left_arm":{"rotation":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"0.875":{"post":[-33.80694,32.31058,6.87997],"lerp_mode":"catmullrom"},"1.1667":{"post":[-17.87827,34.62115,49.02433],"lerp_mode":"catmullrom"},"1.3333":{"post":[-17.87827,34.62115,49.02433],"lerp_mode":"catmullrom"},"1.6667":{"post":[-51.30694,32.31058,6.87997],"lerp_mode":"catmullrom"},"1.8333":{"post":[35.26439,30,-35.26439],"lerp_mode":"catmullrom"},"1.9167":{"post":[73.75484,13.0931,-19.20518],"lerp_mode":"catmullrom"},"2.5":{"post":[73.75484,13.0931,-19.20518],"lerp_mode":"catmullrom"},"2.75":{"post":[58.20713,21.1064,-28.7261],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}},"position":{"0.0":{"post":[0,0,0],"lerp_mode":"catmullrom"},"1.8333":{"post":[-3,0,0],"lerp_mode":"catmullrom"},"2.75":{"post":[-3,0,0],"lerp_mode":"catmullrom"},"3.0":{"post":[0,0,0],"lerp_mode":"catmullrom"}}}}}}}'},1154:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.general":{"loop":true,"bones":{"nose":{"rotation":["(variable.isholdingitem ? -25.7831 : (math.sin(query.life_time * 57.296) * 4.5)) - this",0.0,"(math.cos(query.life_time * 57.296) * 2.5) - this"]}}},"animation.{name}.villager_general":{"loop":true,"bones":{"arms":{"position":[0.0,-1.0,-1.0],"rotation":["-42.97 - this",0.0,0.0]}}},"animation.{name}.move":{"anim_time_update":"query.modified_distance_moved","loop":true,"bones":{"leg0":{"rotation":["(math.cos(query.anim_time * 38.17) * 40.0) - this","-this",0.0]},"leg1":{"rotation":["(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this","-this",0.0]}}}}}'},46:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.attack":{"loop":true,"bones":{"leftarm":{"rotation":["-90 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) - (math.sin(query.life_time * 76.776372) * 2.865) - this","5.73 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 0.6) - this","math.cos(query.life_time * 103.13244) * -2.865 - 2.865 - this"]},"rightarm":{"rotation":["-90 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) + (math.sin(query.life_time * 76.776372) * 2.865) - this","(math.sin(variable.attack_time * 180.0) * 57.3) * 0.6 - 5.73 - this","math.cos(query.life_time * 103.13244) * 2.865 + 2.865 - this"]}}}}}'},4179:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.angry":{"loop":true,"bones":{"tail":{"rotation":[0,"query.is_angry ? -this : (math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed * 80.22 - this)",0]}}},"animation.{name}.baby_scaling":{"loop":true,"bones":{"head":{"position":[0,1,-2],"scale":1.6}}},"animation.{name}.head_rot_z":{"loop":true,"bones":{"head":{"rotation":[0,0,"(query.is_interested ? (query.head_roll_angle * 57.3) : 0) + (query.is_shaking_wetness ? variable.head_rot_z : 0) - this"]}}},"animation.{name}.leg_default":{"loop":true,"bones":{"leg0":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 80.22 * query.modified_move_speed - this",0,0]},"leg1":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180) * 80.22 * query.modified_move_speed - this",0,0]},"leg2":{"rotation":["math.cos(query.modified_distance_moved * 38.17 + 180) * 80.22 * query.modified_move_speed - this",0,0]},"leg3":{"rotation":["math.cos(query.modified_distance_moved * 38.17) * 80.22 * query.modified_move_speed - this",0,0]}}},"animation.{name}.shaking":{"loop":true,"bones":{"body":{"rotation":[0,0,"variable.body_rot_z - this"]},"upperbody":{"rotation":[0,0,"variable.upper_body_rot_z - this"]}}},"animation.{name}.sitting":{"loop":true,"bones":{"body":{"rotation":[-45,0,0],"position":[0,-4,-2]},"leg0":{"rotation":[270,0,0],"position":[0,-7,-5]},"leg1":{"rotation":[270,0,0],"position":[0,-7,-5]},"leg2":{"rotation":[333,0,0],"position":[0.01,-1,0]},"leg3":{"rotation":[333,0,0],"position":[0.01,-1,0]},"tail":{"position":[0,-9,-2]},"upperBody":{"rotation":[-18,0,0],"position":[0,-2,0]}}},"animation.{name}.tail_default":{"loop":true,"bones":{"tail":{"rotation":["query.tail_angle * 57.3 - this",0,"variable.tail_rot_z - this"]}}}}}'},2533:e=>{e.exports='{"format_version":"1.8.0","animations":{"animation.{name}.attack_bare_hand":{"loop":true,"bones":{"leftarm":{"rotation":["-90.0 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) - (math.sin(query.life_time * 76.776372) * 2.865) - this","5.73 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 0.6) - this","math.cos(query.life_time * 103.13244) * -2.865 - 2.865 - this"]},"rightarm":{"rotation":["90.0 * (variable.is_brandishing_spear - 1.0) - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) + (math.sin(query.life_time * 76.776372) * 2.865) - this","(math.sin(variable.attack_time * 180.0) * 57.3) * 0.6 - 5.73 - this","math.cos(query.life_time * 103.13244) * 2.865 + 2.865 - this"]}}},"animation.{name}.swimming":{"loop":true,"bones":{"body":{"position":[0.0,"variable.swim_amount * -10.0 - this","variable.swim_amount * 9.0 - this"],"rotation":["variable.swim_amount * (90.0 + query.target_x_rotation)",0.0,0.0]},"leftarm":{"rotation":["math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) - (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this","math.lerp(this, 14.325, variable.swim_amount) - this","math.lerp(this, 14.325, variable.swim_amount) - (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this"]},"leftleg":{"rotation":["math.lerp(this, math.cos(query.life_time * 390.0 + 180.0) * 0.3, variable.swim_amount)",0.0,0.0]},"rightarm":{"rotation":["math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) + (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this","math.lerp(this, 14.325, variable.swim_amount) - this","math.lerp(this, -14.325, variable.swim_amount) + (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this"]},"rightleg":{"rotation":["math.lerp(this, math.cos(query.life_time * 390.0) * 0.3, variable.swim_amount)",0.0,0.0]}}}}}'},5825:e=>{e.exports='{"format_version":"1.16.100","minecraft:entity":{"description":{"identifier":"blockbench:basic","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:physics":{"has_gravity":true,"has_collision":true},"minecraft:pushable":{"is_pushable":false},"minecraft:push_through":{"value":1}}}}'},2813:e=>{e.exports='{"format_version":"1.16.100","minecraft:entity":{"description":{"identifier":"blockbench:basic_walking","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:physics":{"has_gravity":true,"has_collision":true},"minecraft:pushable":{"is_pushable":false},"minecraft:push_through":{"value":1},"minecraft:movement":{"value":0.25},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:navigation.walk":{"avoid_water":true},"minecraft:behavior.random_stroll":{"priority":3,"speed_multiplier":0.8}}}}'},4815:e=>{e.exports='{"format_version":"1.20.0","minecraft:entity":{"description":{"identifier":"blockbench:basic","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:physics":{"has_gravity":true,"has_collision":true},"minecraft:pushable":{"is_pushable":false},"minecraft:push_through":{"value":1},"minecraft:movement":{"value":0.2},"minecraft:collision_box":{"height":1.0,"width":1.2},"minecraft:movement.basic":{},"minecraft:navigation.generic":{},"minecraft:input_ground_controlled":{},"minecraft:rideable":{"seat_count":1,"seats":[{"position":[0,0.25,0]}]},"minecraft:variable_max_auto_step":{"base_value":1.2,"controlled_value":1.2}}}}'},1833:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:allay","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"pickup_item_delay":{"minecraft:timer":{"looping":false,"time":3,"time_down_event":{"event":"pickup_item_delay_complete"}}},"pickup_item":{"minecraft:behavior.pickup_items":{"priority":2,"max_dist":32,"search_height":32,"goal_radius":2.2,"speed_multiplier":6,"pickup_based_on_chance":false,"can_pickup_any_item":false,"can_pickup_to_hand_or_equipment":false,"pickup_same_items_as_in_hand":true}}},"components":{"minecraft:is_hidden_when_invisible":{},"minecraft:type_family":{"family":["allay","mob"]},"minecraft:collision_box":{"width":0.35,"height":0.6},"minecraft:balloonable":{"mass":0.5},"minecraft:breathable":{"totalSupply":15,"suffocateTime":0},"minecraft:nameable":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:health":{"value":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:damage_sensor":{"triggers":[{"on_damage":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_owner","subject":"other","value":true}]}},"deals_damage":false}]},"minecraft:movement":{"value":0.1},"minecraft:flying_speed":{"value":0.1},"minecraft:navigation.hover":{"can_path_over_water":true,"can_sink":false,"can_pass_doors":false,"can_path_from_air":true,"avoid_water":true,"avoid_damage_blocks":true,"avoid_sun":false},"minecraft:movement.hover":{},"minecraft:follow_range":{"value":1024},"minecraft:ambient_sound_interval":{"value":5.0,"range":5.0,"event_name":"ambient","event_names":[{"event_name":"ambient.tame","condition":"query.is_using_item"},{"event_name":"ambient","condition":"!query.is_using_item"}]},"minecraft:jump.static":{},"minecraft:can_fly":{},"minecraft:physics":{"has_gravity":false},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:vibration_listener":{},"minecraft:conditional_bandwidth_optimization":{},"minecraft:inventory":{"inventory_size":1},"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"}]}},"give_item":true,"take_item":true,"interact_text":"action.interact.allay"}]},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":2.0},"minecraft:behavior.go_and_give_items_to_noteblock":{"priority":3,"run_speed":8,"throw_sound":"item_thrown","on_item_throw":[{"event":"pickup_item_delay","target":"self"}]},"minecraft:behavior.go_and_give_items_to_owner":{"priority":4,"run_speed":8,"throw_sound":"item_thrown","on_item_throw":[{"event":"pickup_item_delay","target":"self"}]},"minecraft:behavior.stay_near_noteblock":{"priority":5,"speed":8,"start_distance":16,"stop_distance":4},"minecraft:behavior.follow_owner":{"priority":6,"speed_multiplier":8,"start_distance":16,"stop_distance":4,"can_teleport":false,"ignore_vibration":false},"minecraft:behavior.float":{"priority":7},"minecraft:behavior.look_at_player":{"priority":8,"target_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:behavior.random_hover":{"priority":9,"xz_dist":8,"y_dist":8,"y_offset":-1,"interval":1,"hover_height":[1,4]}},"events":{"pickup_item_delay":{"remove":{"component_groups":["pickup_item"]},"add":{"component_groups":["pickup_item_delay"]}},"pickup_item_delay_complete":{"remove":{"component_groups":["pickup_item_delay"]},"add":{"component_groups":["pickup_item"]}},"minecraft:entity_spawned":{"add":{"component_groups":["pickup_item"]}}}}}'},487:e=>{e.exports='{"format_version":"1.20.80","minecraft:entity":{"description":{"identifier":"{identifier}","spawn_category":"creature","is_spawnable":true,"is_summonable":true,"properties":{"minecraft:armadillo_state":{"type":"enum","values":["unrolled","rolled_up","rolled_up_peeking","rolled_up_relaxing","rolled_up_unrolling"],"default":"unrolled","client_sync":true}}},"components":{"minecraft:type_family":{"family":["armadillo","mob"]},"minecraft:physics":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:movement.basic":{},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_damage_blocks":true,"avoid_water":true},"minecraft:conditional_bandwidth_optimization":{},"minecraft:is_hidden_when_invisible":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:nameable":{},"minecraft:balloonable":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.7,"height":0.65},"minecraft:health":{"value":12},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self"},"cause":"lava","damage_per_tick":4}]},"minecraft:entity_sensor":{"subsensors":[{"event":"minecraft:no_threat_detected","cooldown":0.2,"range":[7.0,2.0],"minimum_count":0,"maximum_count":0,"event_filters":{"any_of":[{"test":"is_family","subject":"other","value":"undead"},{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"any_of":[{"test":"was_last_hurt_by","subject":"other"},{"test":"is_sprinting","subject":"other"},{"test":"is_riding","subject":"other"}]}]}]}},{"event":"minecraft:threat_detected","cooldown":0.2,"range":[7.0,2.0],"minimum_count":1,"event_filters":{"any_of":[{"test":"is_family","subject":"other","value":"undead"},{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"any_of":[{"test":"was_last_hurt_by","subject":"other"},{"test":"is_sprinting","subject":"other"},{"test":"is_riding","subject":"other"}]}]}]}}]},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"ignore_mob_damage":true,"speed_multiplier":2.0}},"component_groups":{"minecraft:baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.6},"minecraft:ageable":{"duration":1200,"interact_filters":{"test":"enum_property","domain":"minecraft:armadillo_state","value":"unrolled"},"feed_items":"spider_eye","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}}},"minecraft:baby_unrolled":{"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":1.25}},"minecraft:adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:spawn_entity":{"entities":{"min_wait_time":300,"max_wait_time":600,"spawn_sound":"mob.armadillo.scute_drop","spawn_item":"armadillo_scute"}},"minecraft:breedable":{"love_filters":{"test":"enum_property","domain":"minecraft:armadillo_state","value":"unrolled"},"require_tame":false,"breeds_with":[{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}}],"breed_items":["spider_eye"]},"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","subject":"other","domain":"hand","value":"brush"}]}},"play_sounds":"mob.armadillo.brush","interact_text":"action.interact.brush","hurt_item":16,"swing":true,"spawn_items":{"table":"loot_tables/entities/armadillo_brush.json"}}]}},"minecraft:adult_unrolled":{"minecraft:behavior.breed":{"priority":2,"speed_multiplier":1.0}},"minecraft:unrolled":{"minecraft:movement":{"value":0.14},"minecraft:ambient_sound_interval":{},"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"mob"},{"test":"is_family","subject":"other","value":"player"}]},"event":"minecraft:threat_detected"}}},"minecraft:behavior.tempt":{"priority":3,"speed_multiplier":1.25,"can_tempt_vertically":true,"items":["spider_eye"]},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":7,"target_distance":6.0,"probability":0.02,"min_look_time":40,"max_look_time":80},"minecraft:behavior.random_look_around":{"priority":8}},"minecraft:rolled_up":{"minecraft:movement":{"value":0.0},"minecraft:body_rotation_blocked":{},"minecraft:damage_sensor":{"triggers":[{"on_damage":{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"mob"},{"test":"is_family","subject":"other","value":"player"}]},"event":"minecraft:threat_detected"},"damage_multiplier":0.5,"damage_modifier":-1.0},{"damage_multiplier":0.5,"damage_modifier":-1.0}]},"minecraft:environment_sensor":{"triggers":[{"filters":{"any_of":[{"test":"on_fire"},{"test":"in_water"},{"test":"is_panicking"},{"test":"is_leashed"},{"test":"is_riding"}]},"event":"minecraft:unroll"}]}},"minecraft:rolled_up_with_threats":{"minecraft:behavior.timer_flag_1":{"priority":0,"cooldown_range":2.5,"duration_range":[5.0,20.0],"on_start":{"event":"minecraft:stop_peeking"},"on_end":{"event":"minecraft:start_peeking"}}},"minecraft:rolled_up_without_threats":{"minecraft:timer":{"looping":true,"time":4,"randomInterval":false,"time_down_event":{"event":"minecraft:unroll"}},"minecraft:behavior.timer_flag_1":{"priority":0,"cooldown_range":2.5,"duration_range":1.5,"on_start":{"event":"minecraft:start_unrolling"}}}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"minecraft:spawn_adult"},{"weight":5,"trigger":"minecraft:spawn_baby"}]},"minecraft:entity_born":{"trigger":"minecraft:spawn_baby"},"minecraft:spawn_adult":{"add":{"component_groups":["minecraft:adult","minecraft:adult_unrolled","minecraft:unrolled","minecraft:scanning"]}},"minecraft:spawn_baby":{"add":{"component_groups":["minecraft:baby","minecraft:baby_unrolled","minecraft:unrolled","minecraft:scanning"]}},"minecraft:ageable_grow_up":{"sequence":[{"remove":{"component_groups":["minecraft:baby","minecraft:baby_unrolled"]},"add":{"component_groups":["minecraft:adult"]}},{"filters":{"test":"enum_property","domain":"minecraft:armadillo_state","value":"unrolled"},"add":{"component_groups":["minecraft:adult_unrolled"]}}]},"minecraft:no_threat_detected":{"sequence":[{"filters":{"all_of":[{"any_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","value":"rolled_up"},{"test":"enum_property","domain":"minecraft:armadillo_state","value":"rolled_up_peeking"}]},{"test":"on_fire","value":false},{"test":"in_water","value":false},{"test":"is_panicking","value":false},{"test":"is_leashed","value":false},{"test":"is_riding","value":false}]},"remove":{"component_groups":["minecraft:rolled_up_with_threats"]},"add":{"component_groups":["minecraft:rolled_up_without_threats"]},"set_property":{"minecraft:armadillo_state":"rolled_up_relaxing"}}]},"minecraft:threat_detected":{"sequence":[{"filters":{"all_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","value":"unrolled"},{"test":"on_ground","value":true},{"test":"on_fire","value":false},{"test":"in_water","value":false},{"test":"is_panicking","value":false},{"test":"is_leashed","value":false},{"test":"is_riding","value":false}]},"trigger":"minecraft:roll_up"},{"filters":{"any_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","value":"rolled_up_relaxing"},{"test":"enum_property","domain":"minecraft:armadillo_state","value":"rolled_up_unrolling"}]},"remove":{"component_groups":["minecraft:rolled_up_without_threats"]},"add":{"component_groups":["minecraft:rolled_up_with_threats"]},"set_property":{"minecraft:armadillo_state":"rolled_up"}}]},"minecraft:unroll":{"sequence":[{"filters":{"all_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","operator":"not","value":"unrolled"},{"test":"actor_health","subject":"self","operator":">","value":0}]},"remove":{"component_groups":["minecraft:rolled_up","minecraft:rolled_up_with_threats","minecraft:rolled_up_without_threats"]},"add":{"component_groups":["minecraft:unrolled"]},"set_property":{"minecraft:armadillo_state":"unrolled"},"emit_vibration":{"vibration":"entity_act"}},{"filters":{"all_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","operator":"not","value":"unrolled"},{"test":"actor_health","subject":"self","operator":">","value":0},{"test":"has_component","value":"minecraft:is_baby"}]},"add":{"component_groups":["minecraft:baby_unrolled"]}},{"filters":{"all_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","operator":"not","value":"unrolled"},{"test":"actor_health","subject":"self","operator":">","value":0},{"test":"has_component","operator":"not","value":"minecraft:is_baby"}]},"add":{"component_groups":["minecraft:adult_unrolled"]}}]},"minecraft:roll_up":{"sequence":[{"filters":{"all_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","operator":"not","value":"rolled_up"},{"test":"enum_property","domain":"minecraft:armadillo_state","operator":"not","value":"rolled_up_peeking"},{"test":"actor_health","subject":"self","operator":">","value":0}]},"remove":{"component_groups":["minecraft:unrolled","minecraft:baby_unrolled","minecraft:adult_unrolled","minecraft:rolled_up_without_threats"]},"add":{"component_groups":["minecraft:rolled_up","minecraft:rolled_up_with_threats"]},"set_property":{"minecraft:armadillo_state":"rolled_up"}},{"filters":{"all_of":[{"test":"enum_property","domain":"minecraft:armadillo_state","value":"unrolled"},{"test":"actor_health","subject":"self","operator":">","value":0}]},"emit_vibration":{"vibration":"entity_act"}}]},"minecraft:start_peeking":{"sequence":[{"filters":{"test":"enum_property","domain":"minecraft:armadillo_state","value":"rolled_up"},"set_property":{"minecraft:armadillo_state":"rolled_up_peeking"}}]},"minecraft:stop_peeking":{"sequence":[{"filters":{"test":"enum_property","domain":"minecraft:armadillo_state","value":"rolled_up_peeking"},"set_property":{"minecraft:armadillo_state":"rolled_up"}}]},"minecraft:start_unrolling":{"sequence":[{"filters":{"test":"enum_property","domain":"minecraft:armadillo_state","value":"rolled_up_relaxing"},"set_property":{"minecraft:armadillo_state":"rolled_up_unrolling"}}]}}}}'},6040:e=>{e.exports='{"format_version":"1.16.210","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:armor_stand","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:type_family":{"family":["armor_stand","inanimate","mob"]},"minecraft:collision_box":{"width":0.5,"height":1.975},"minecraft:health":{"value":6,"max":6},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:knockback_resistance":{"value":1.0},"minecraft:loot":{"table":"loot_tables/entities/armor_stand.json"},"minecraft:nameable":{},"minecraft:persistent":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":false,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{}}}'},5727:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"attack_cooldown":{"minecraft:attack_cooldown":{"attack_cooldown_time":120.0,"attack_cooldown_complete_event":{"event":"attack_cooldown_complete_event","target":"self"}}},"axolotl_lucy":{"minecraft:variant":{"value":0}},"axolotl_cyan":{"minecraft:variant":{"value":1}},"axolotl_gold":{"minecraft:variant":{"value":2}},"axolotl_wild":{"minecraft:variant":{"value":3}},"axolotl_blue":{"minecraft:variant":{"value":4}},"axolotl_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":"tropical_fish_bucket","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":1.1}},"axolotl_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:behavior.breed":{"priority":1,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"breed_items":"tropical_fish_bucket","transform_to_item":"bucket","breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"mutation_factor":{"variant":0.00083}}},"axolotl_in_water":{"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"in_water","operator":"!=","value":true},"event":"start_drying_out"}]}},"axolotl_dried":{"minecraft:damage_over_time":{"damage_per_hurt":1,"time_between_hurt":0}},"axolotl_on_land":{"minecraft:drying_out_timer":{"total_time":300,"water_bottle_refill_time":90,"dried_out_event":{"event":"dried_out"},"stopped_drying_out_event":{"event":"stop_drying_out"},"recover_after_dried_out_event":{"event":"recover_after_dried_out"}}},"axolotl_on_land_in_rain":{"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"in_water_or_rain","operator":"!=","value":true},"event":"start_drying_out"},{"filters":{"test":"in_water","operator":"==","value":true},"event":"enter_water"}]}}},"components":{"minecraft:is_hidden_when_invisible":{},"minecraft:type_family":{"family":["axolotl","mob"]},"minecraft:collision_box":{"width":0.75,"height":0.42},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true,"breathes_air":true,"generates_bubbles":false},"minecraft:nameable":{},"minecraft:health":{"value":14},"minecraft:damage_sensor":{"triggers":{"cause":"lightning","deals_damage":true,"damage_multiplier":2000.0}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":true,"can_swim":true,"can_walk":true,"can_sink":false,"avoid_damage_blocks":true},"minecraft:movement.amphibious":{},"minecraft:movement":{"value":0.1},"minecraft:underwater_movement":{"value":0.2},"minecraft:jump.static":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:attack":{"damage":2},"minecraft:combat_regeneration":{},"minecraft:behavior.play_dead":{"priority":0,"duration":10,"force_below_health":8,"random_start_chance":0.33,"random_damage_range":[0,2],"damage_sources":["contact","entity_attack","entity_explosion","magic","projectile","thorns","wither"],"apply_regeneration":true,"filters":{"test":"in_water","operator":"==","value":true}},"minecraft:behavior.tempt":{"priority":2,"speed_multiplier":1.1,"can_tempt_vertically":true,"items":["tropical_fish_bucket"]},"minecraft:behavior.nearest_attackable_target":{"priority":3,"must_see":true,"reselect_targets":true,"within_radius":20.0,"must_see_forget_duration":17.0,"entity_types":[{"filters":{"all_of":[{"test":"in_water","subject":"other","value":true},{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:attack_cooldown"},{"any_of":[{"test":"is_family","subject":"other","value":"squid"},{"test":"is_family","subject":"other","value":"fish"}]}]},"max_dist":8},{"filters":{"all_of":[{"test":"in_water","subject":"other","value":true},{"any_of":[{"test":"is_family","subject":"other","value":"drowned"},{"test":"is_family","subject":"other","value":"guardian"},{"test":"is_family","subject":"other","value":"guardian_elder"}]}]},"max_dist":8}]},"minecraft:behavior.melee_attack":{"priority":4,"on_kill":{"event":"killed_enemy_event","target":"self"}},"minecraft:behavior.move_to_water":{"priority":6,"search_range":16,"search_height":5,"search_count":1,"goal_radius":0.1},"minecraft:behavior.swim_idle":{"priority":7,"idle_time":5.0,"success_rate":0.05},"minecraft:behavior.random_swim":{"priority":8,"interval":0,"xz_dist":30,"y_dist":15},"minecraft:behavior.random_stroll":{"priority":9,"interval":100},"minecraft:behavior.look_at_player":{"priority":10,"target_distance":6.0,"probability":0.02}},"events":{"minecraft:entity_spawned":{"sequence":[{"add":{"component_groups":["axolotl_adult","axolotl_in_water"]}},{"randomize":[{"weight":25,"add":{"component_groups":["axolotl_cyan"]}},{"weight":25,"add":{"component_groups":["axolotl_gold"]}},{"weight":25,"add":{"component_groups":["axolotl_lucy"]}},{"weight":25,"add":{"component_groups":["axolotl_wild"]}}]}]},"attack_cooldown_complete_event":{"remove":{"component_groups":["attack_cooldown"]}},"killed_enemy_event":{"add":{"component_groups":["attack_cooldown"]}},"minecraft:entity_born":{"sequence":[{"remove":{"component_groups":["axolotl_adult"]},"add":{"component_groups":["axolotl_baby","axolotl_in_water"]}},{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"add":{"component_groups":["axolotl_blue"]}}]},"minecraft:ageable_grow_up":{"remove":{"component_groups":["axolotl_baby"]},"add":{"component_groups":["axolotl_adult"]}},"stop_drying_out":{"remove":{"component_groups":["axolotl_on_land","axolotl_dried"]},"add":{"component_groups":["axolotl_on_land_in_rain"]}},"start_drying_out":{"remove":{"component_groups":["axolotl_on_land_in_rain","axolotl_in_water"]},"add":{"component_groups":["axolotl_on_land"]}},"dried_out":{"add":{"component_groups":["axolotl_dried"]}},"recover_after_dried_out":{"remove":{"component_groups":["axolotl_dried"]}},"enter_water":{"remove":{"component_groups":["axolotl_on_land","axolotl_on_land_in_rain","axolotl_dried"]},"add":{"component_groups":["axolotl_in_water"]}}}}}'},203:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{},"components":{"minecraft:type_family":{"family":["bat","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.5,"height":0.9},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.1},"minecraft:navigation.float":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.float_wander":{"xz_dist":10,"y_dist":7,"y_offset":-2.0,"random_reselect":true,"float_duration":[0.1,0.35]},"minecraft:can_fly":{},"minecraft:health":{"value":6,"max":6},"minecraft:nameable":{},"minecraft:physics":{},"minecraft:conditional_bandwidth_optimization":{}},"events":{}}}'},9868:e=>{e.exports='{"format_version":"1.20.60","minecraft:entity":{"description":{"identifier":"{identifier","is_spawnable":true,"is_summonable":true,"properties":{"minecraft:has_nectar":{"type":"bool","client_sync":true,"default":"query.had_component_group(\'has_nectar\')"}}},"component_groups":{"{name}_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":["minecraft:red_flower","minecraft:yellow_flower","minecraft:wither_rose","minecraft:double_plant:0","minecraft:double_plant:1","minecraft:double_plant:4","minecraft:double_plant:5","minecraft:flowering_azalea","minecraft:azalea_leaves_flowered","minecraft:mangrove_propagule","minecraft:pitcher_plant","minecraft:torchflower","minecraft:cherry_leaves","minecraft:pink_petals"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":11,"speed_multiplier":1.1}},"{name}_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:behavior.breed":{"priority":4,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["minecraft:red_flower","minecraft:yellow_flower","minecraft:wither_rose","minecraft:double_plant:0","minecraft:double_plant:1","minecraft:double_plant:4","minecraft:double_plant:5","minecraft:flowering_azalea","minecraft:azalea_leaves_flowered","minecraft:mangrove_propagule","minecraft:pitcher_plant","minecraft:torchflower","minecraft:cherry_leaves","minecraft:pink_petals"]}},"track_attacker":{"minecraft:behavior.hurt_by_target":{"priority":1}},"angry_{name}":{"minecraft:angry":{"duration":25,"broadcastAnger":true,"broadcastRange":20,"broadcast_filters":{"test":"is_family","operator":"!=","value":"pacified"},"calm_event":{"event":"calmed_down","target":"self"}},"minecraft:behavior.melee_box_attack":{"priority":2,"attack_once":true,"speed_multiplier":1.4,"on_attack":{"event":"countdown_to_perish_event","target":"self"}}},"escape_fire":{"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25,"force":true},"minecraft:timer":{"looping":false,"time":[20,50],"randomInterval":true,"time_down_event":{"event":"stop_panicking_after_fire","target":"self"}}},"countdown_to_perish":{"minecraft:mark_variant":{"value":1},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25,"force":true},"minecraft:timer":{"looping":false,"time":[10,60],"randomInterval":true,"time_down_event":{"event":"perish_event","target":"self"}},"minecraft:type_family":{"family":["bee","mob","arthropod","pacified"]}},"perish":{"minecraft:hurt_on_condition":{"damage_conditions":[{"cause":"none","damage_per_tick":999}]}},"take_nearest_target":{"minecraft:behavior.nearest_attackable_target":{"priority":2,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":10}]},"minecraft:timer":{"looping":true,"time":5,"time_down_event":{"event":"calmed_down","target":"self"}}},"look_for_food":{"minecraft:behavior.move_to_block":{"priority":10,"tick_interval":1,"start_chance":0.5,"search_range":6,"search_height":4,"goal_radius":1.0,"stay_duration":20.0,"target_selection_method":"random","target_offset":[0,0.25,0],"target_block_filters":{"test":"is_waterlogged","subject":"block","operator":"==","value":false},"target_blocks":["minecraft:red_flower","minecraft:yellow_flower","minecraft:wither_rose","minecraft:double_plant:0","minecraft:double_plant:1","minecraft:double_plant:4","minecraft:double_plant:5","minecraft:flowering_azalea","minecraft:azalea_leaves_flowered","minecraft:mangrove_propagule","minecraft:pitcher_plant","minecraft:torchflower","minecraft:cherry_leaves","minecraft:pink_petals"],"on_stay_completed":[{"event":"collected_nectar","target":"self"}]},"minecraft:timer":{"looping":true,"time":180,"time_down_event":{"event":"find_flower_timeout"}},"minecraft:ambient_sound_interval":{"event_name":"ambient.pollinate","range":3.0,"value":2.0}},"has_nectar":{"minecraft:grows_crop":{"charges":10,"chance":0.03}},"return_to_home":{"minecraft:behavior.go_home":{"priority":4,"speed_multiplier":1.0,"interval":1,"goal_radius":1.2,"on_home":[{"filters":{"any_of":[{"test":"is_block","subject":"block","value":"minecraft:bee_nest"},{"test":"is_block","subject":"block","value":"minecraft:beehive"}]},"event":"minecraft:bee_returned_to_hive","target":"block"},{"filters":{"all_of":[{"test":"is_block","subject":"block","operator":"!=","value":"minecraft:bee_nest"},{"test":"is_block","subject":"block","operator":"!=","value":"minecraft:beehive"}]},"event":"find_hive_event","target":"self"}],"on_failed":[{"event":"find_hive_event","target":"self"}]}},"find_hive":{"minecraft:behavior.move_to_block":{"priority":10,"search_range":16,"search_height":10,"tick_interval":1,"goal_radius":0.633,"target_blocks":["bee_nest","beehive"],"on_reach":[{"event":"minecraft:bee_returned_to_hive","target":"block"}]},"minecraft:timer":{"looping":false,"time":180,"time_down_event":{"event":"find_hive_timeout","target":"self"}}},"hive_full":{"minecraft:timer":{"looping":false,"time":[5,20],"randomInterval":true,"time_down_event":{"event":"find_hive_event","target":"self"}}},"shelter_detection":{"minecraft:environment_sensor":{"triggers":[{"event":"seek_shelter","filters":{"all_of":[{"any_of":[{"test":"is_daytime","value":false},{"test":"weather","operator":"==","value":"precipitation"}]},{"test":"bool_property","domain":"minecraft:has_nectar","operator":"!="},{"test":"has_biome_tag","value":"overworld"}]}}]}},"abort_shelter_detection":{"minecraft:environment_sensor":{"triggers":[{"event":"abort_sheltering","filters":{"all_of":[{"test":"weather","operator":"==","value":"clear"},{"test":"is_daytime","value":true}]}}]}},"easy_attack":{"minecraft:attack":{"damage":2}},"normal_attack":{"minecraft:attack":{"damage":2,"effect_name":"poison","effect_duration":10}},"hard_attack":{"minecraft:attack":{"damage":2,"effect_name":"poison","effect_duration":18}},"default_sound":{"minecraft:ambient_sound_interval":{"event_name":"ambient","range":0.0,"value":0.0}}},"components":{"minecraft:is_hidden_when_invisible":{},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.25,"within_radius":8,"can_tempt_vertically":true,"items":["minecraft:red_flower","minecraft:yellow_flower","minecraft:wither_rose","minecraft:double_plant:0","minecraft:double_plant:1","minecraft:double_plant:4","minecraft:double_plant:5","minecraft:flowering_azalea","minecraft:azalea_leaves_flowered","minecraft:mangrove_propagule","minecraft:pitcher_plant","minecraft:torchflower","minecraft:cherry_leaves","minecraft:pink_petals"]},"minecraft:behavior.move_towards_home_restriction":{"priority":9},"minecraft:behavior.random_hover":{"priority":12,"xz_dist":8,"y_dist":8,"y_offset":-1,"interval":1,"hover_height":[1,4]},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{"mass":0.5},"minecraft:behavior.float":{"priority":19},"minecraft:type_family":{"family":["bee","mob","arthropod"]},"minecraft:on_target_acquired":{"event":"attacked","target":"self"},"minecraft:breathable":{"totalSupply":15,"suffocateTime":0},"minecraft:collision_box":{"width":0.55,"height":0.5},"minecraft:conditional_bandwidth_optimization":{},"minecraft:game_event_movement_tracking":{"emit_flap":true},"minecraft:home":{"restriction_radius":22,"home_block_list":["minecraft:bee_nest","minecraft:beehive"]},"minecraft:follow_range":{"value":1024},"minecraft:damage_sensor":{"triggers":[{"cause":"fall","deals_damage":false},{"on_damage":{"filters":{"test":"is_block","subject":"block","value":"minecraft:sweet_berry_bush"}},"deals_damage":false}]},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.3},"minecraft:flying_speed":{"value":0.15},"minecraft:navigation.hover":{"can_path_over_water":true,"can_sink":false,"can_pass_doors":false,"can_path_from_air":true,"avoid_water":true,"avoid_damage_blocks":true,"avoid_sun":false},"minecraft:movement.hover":{},"minecraft:jump.static":{},"minecraft:can_fly":{},"minecraft:health":{"value":10,"max":10},"minecraft:nameable":{},"minecraft:block_sensor":{"sensor_radius":16,"sources":[{"test":"has_silk_touch","subject":"other","value":false}],"on_break":[{"block_list":["minecraft:beehive","minecraft:bee_nest"],"on_block_broken":"hive_destroyed"}]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":95,"add":{"component_groups":["{name}_adult"]}},{"weight":5,"add":{"component_groups":["{name}_baby"]}}]},{"add":{"component_groups":["track_attacker","shelter_detection","look_for_food"]}}]},"minecraft:entity_born":{"add":{"component_groups":["{name}_baby","shelter_detection","track_attacker","look_for_food"]}},"minecraft:spawn_adult":{"add":{"component_groups":["{name}_adult","shelter_detection","track_attacker","look_for_food"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["{name}_baby"]},"add":{"component_groups":["{name}_adult"]}},"minecraft:exited_disturbed_hive":{"add":{"component_groups":["take_nearest_target"]},"remove":{"component_groups":["find_hive","return_to_home","has_nectar","abort_shelter_detection","shelter_detection","escape_fire"]},"set_property":{"minecraft:has_nectar":false}},"hive_destroyed":{"sequence":[{"filters":{"test":"is_family","subject":"self","operator":"!=","value":"pacified"},"add":{"component_groups":["take_nearest_target"]},"remove":{"component_groups":["escape_fire"]}}]},"stop_panicking_after_fire":{"remove":{"component_groups":["escape_fire"]}},"minecraft:exited_hive_on_fire":{"add":{"component_groups":["escape_fire"]}},"minecraft:exited_hive":{"add":{"component_groups":["look_for_food","shelter_detection"]},"remove":{"component_groups":["find_hive","return_to_home","has_nectar","abort_shelter_detection"]},"set_property":{"minecraft:has_nectar":false}},"minecraft:hive_full":{"add":{"component_groups":["hive_full"]},"remove":{"component_groups":["find_hive","return_to_home"]}},"attacked":{"sequence":[{"add":{"component_groups":["angry_{name}"]},"remove":{"component_groups":["take_nearest_target"]}},{"filters":{"test":"is_difficulty","value":"easy"},"remove":{"component_groups":["normal_attack","hard_attack"]},"add":{"component_groups":["easy_attack"]}},{"filters":{"test":"is_difficulty","value":"normal"},"remove":{"component_groups":["easy_attack","hard_attack"]},"add":{"component_groups":["normal_attack"]}},{"filters":{"test":"is_difficulty","value":"hard"},"remove":{"component_groups":["easy_attack","normal_attack"]},"add":{"component_groups":["hard_attack"]}}]},"calmed_down":{"add":{"component_groups":["shelter_detection","return_to_home"]},"remove":{"component_groups":["angry_{name}","take_nearest_target"]}},"collected_nectar":{"remove":{"component_groups":["look_for_food"]},"add":{"component_groups":["return_to_home","has_nectar","default_sound"]},"set_property":{"minecraft:has_nectar":true}},"find_hive_event":{"remove":{"component_groups":["return_to_home","hive_full"]},"add":{"component_groups":["find_hive"]}},"find_hive_timeout":{"sequence":[{"filters":{"test":"bool_property","operator":"!=","domain":"minecraft:has_nectar"},"remove":{"component_groups":["find_hive","escape_fire"]},"add":{"component_groups":["look_for_food"]}},{"filters":{"test":"bool_property","domain":"minecraft:has_nectar"},"remove":{"component_groups":["find_hive"]},"add":{"component_groups":["return_to_home"]}}]},"find_flower_timeout":{"remove":{"component_groups":["look_for_food"]},"add":{"component_groups":["return_to_home"]}},"seek_shelter":{"remove":{"component_groups":["look_for_food","collect_nectar","shelter_detection"]},"add":{"component_groups":["default_sound","return_to_home","abort_shelter_detection"]}},"abort_sheltering":{"remove":{"component_groups":["abort_shelter_detection","return_to_home","escape_fire"]},"add":{"component_groups":["shelter_detection","look_for_food"]}},"countdown_to_perish_event":{"remove":{"component_groups":["collect_nectar","track_attacker","take_nearest_target","look_for_food","angry_{name}","hive_full","find_hive","escape_fire"]},"add":{"component_groups":["countdown_to_perish"]}},"perish_event":{"add":{"component_groups":["perish"]}}}}}'},6880:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"mode_switcher":{"minecraft:target_nearby_sensor":{"inside_range":2.0,"outside_range":3.0,"must_see":true,"on_inside_range":{"event":"switch_to_melee","target":"self"},"on_outside_range":{"event":"switch_to_ranged","target":"self"}}},"ranged_mode":{"minecraft:shooter":{"def":"minecraft:small_fireball"},"minecraft:behavior.ranged_attack":{"priority":3,"burst_shots":3,"burst_interval":0.3,"charge_charged_trigger":0.0,"charge_shoot_trigger":4.0,"attack_interval_min":3.0,"attack_interval_max":5.0,"attack_radius":16.0}},"melee_mode":{"minecraft:attack":{"damage":6},"minecraft:behavior.melee_attack":{"priority":3}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 10 : 0"},"minecraft:loot":{"table":"loot_tables/entities/blaze.json"},"minecraft:collision_box":{"width":0.5,"height":1.8},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:movement":{"value":0.23},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_water_or_rain","operator":"==","value":true},"cause":"drowning","damage_per_tick":1}]},"minecraft:follow_range":{"value":48,"max":48},"minecraft:fire_immune":{},"minecraft:nameable":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":48.0}]},"minecraft:behavior.random_stroll":{"priority":4,"speed_multiplier":1.0},"minecraft:behavior.random_look_around":{"priority":5},"minecraft:type_family":{"family":["blaze","monster","mob"]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:on_hurt":{"event":"minecraft:on_hurt_event","target":"self"},"minecraft:on_hurt_by_player":{"event":"minecraft:on_hurt_event","target":"self"},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["mode_switcher"]}},"switch_to_melee":{"remove":{"component_groups":["ranged_mode"]},"add":{"component_groups":["melee_mode"]}},"switch_to_ranged":{"remove":{"component_groups":["melee_mode"]},"add":{"component_groups":["ranged_mode"]}},"minecraft:on_hurt_event":{"add":{"component_groups":["mode_switcher"]}}}}}'},2903:e=>{e.exports='{"format_version":"1.21.30","minecraft:entity":{"description":{"identifier":"{identifier}","spawn_category":"monster","is_spawnable":true,"is_summonable":true,"properties":{"minecraft:is_playing_idle_ground_sound":{"type":"bool","client_sync":false,"default":false}}},"components":{"minecraft:type_family":{"family":["breeze","monster","mob"]},"minecraft:nameable":{},"minecraft:health":{"value":30,"max":30},"minecraft:loot":{"table":"loot_tables/entities/breeze.json"},"minecraft:collision_box":{"width":0.6,"height":1.77},"minecraft:knockback_resistance":{"value":0.0},"minecraft:jump.static":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:persistent":{},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? 10 : 0"},"minecraft:is_hidden_when_invisible":{},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:movement":{"value":0.4},"minecraft:follow_range":{"value":32.0},"minecraft:navigation.walk":{"blocks_to_avoid":[{"tags":"query.any_tag(\'trapdoors\')"}]},"minecraft:movement.basic":{},"minecraft:can_climb":{},"minecraft:conditional_bandwidth_optimization":{},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:damage_sensor":{"triggers":[{"cause":"fall","deals_damage":false},{"on_damage":{"filters":{"test":"is_family","subject":"damager","operator":"!=","value":"wind_charge"}},"cause":"projectile","deals_damage":false}]},"minecraft:environment_sensor":{"triggers":[{"filters":{"all_of":[{"test":"on_ground","subject":"self","value":true},{"test":"has_target","subject":"self","value":true},{"test":"bool_property","operator":"==","domain":"minecraft:is_playing_idle_ground_sound"}]},"event":"minecraft:stop_playing_idle_ground_sound"},{"filters":{"all_of":[{"test":"bool_property","operator":"!=","domain":"minecraft:is_playing_idle_ground_sound"},{"any_of":[{"test":"on_ground","subject":"self","value":false},{"test":"has_target","subject":"self","value":false}]}]},"event":"minecraft:start_playing_idle_ground_sound"}]},"minecraft:reflect_projectiles":{"reflected_projectiles":["xp_bottle","thrown_trident","shulker_bullet","dragon_fireball","arrow","snowball","egg","fireball","splash_potion","ender_pearl","wither_skull","wither_skull_dangerous","small_fireball","lingering_potion","llama_spit","fireworks_rocket","fishing_hook"],"azimuth_angle":"180.0 + Math.random(-20.0, 20.0)","reflection_scale":"0.5"},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.nearest_attackable_target":{"priority":1,"within_radius":24,"scan_interval":10,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":24},{"filters":{"test":"is_family","subject":"other","value":"irongolem"},"max_dist":24}],"must_see":true},"minecraft:behavior.fire_at_target":{"projectile_def":"minecraft:breeze_wind_charge_projectile","priority":2,"filters":{"all_of":[{"test":"is_navigating","value":false}]},"attack_range":[0,16],"attack_cooldown":0.5,"pre_shoot_delay":0.75,"post_shoot_delay":0.2,"ranged_fov":90.0,"owner_anchor":2,"owner_offset":[0.0,0.3,0.0],"target_anchor":0,"target_offset":[0.0,0.5,0.0]},"minecraft:behavior.move_around_target":{"priority":3,"destination_position_range":[4.0,8.0],"movement_speed":1.2,"destination_pos_spread_degrees":360,"filters":{"all_of":[{"test":"on_ground","value":true},{"test":"target_distance","subject":"self","value":24.0,"operator":"<="}]}},"minecraft:behavior.hurt_by_target":{"priority":4,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","operator":"!=","value":"skeleton"},{"test":"is_family","subject":"other","operator":"!=","value":"stray"},{"test":"is_family","subject":"other","operator":"!=","value":"zombie"},{"test":"is_family","subject":"other","operator":"!=","value":"husk"},{"test":"is_family","subject":"other","operator":"!=","value":"spider"},{"test":"is_family","subject":"other","operator":"!=","value":"cavespider"},{"test":"is_family","subject":"other","operator":"!=","value":"slime"}]}}]},"minecraft:behavior.jump_around_target":{"priority":5,"filters":{"all_of":[{"any_of":[{"test":"in_water","value":true},{"test":"on_ground","value":true}]},{"test":"is_riding","value":false},{"test":"in_lava","value":false}]},"jump_cooldown_duration":0.5,"jump_cooldown_when_hurt_duration":0.1,"last_hurt_duration":2.0,"prepare_jump_duration":0.5,"max_jump_velocity":1.4,"check_collision":false,"entity_bounding_box_scale":0.7,"line_of_sight_obstruction_height_ignore":4,"valid_distance_to_target":[4.0,20.0],"landing_position_spread_degrees":90,"landing_distance_from_target":[4.0,8.0],"required_vertical_space":4,"snap_to_surface_block_range":10,"jump_angles":[40.0,55.0,60.0,75.0,80.0]},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":16},"minecraft:behavior.random_look_around":{"priority":8}},"events":{"minecraft:start_playing_idle_ground_sound":{"add":{"component_groups":["minecraft:playing_idle_ground_sound"]},"set_property":{"minecraft:is_playing_idle_ground_sound":true}},"minecraft:stop_playing_idle_ground_sound":{"remove":{"component_groups":["minecraft:playing_idle_ground_sound"]},"set_property":{"minecraft:is_playing_idle_ground_sound":false}}}}}'},6010:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:camel_saddled":{"minecraft:is_saddled":{},"minecraft:input_ground_controlled":{},"minecraft:dash":{"cooldown_time":2.75,"horizontal_momentum":20.0,"vertical_momentum":0.6},"minecraft:behavior.player_ride_tamed":{}},"minecraft:camel_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.45},"minecraft:ageable":{"duration":1200,"feed_items":"cactus","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":2.5}},"minecraft:camel_adult":{"minecraft:inventory":{"container_type":"horse"},"minecraft:equippable":{"slots":[{"slot":0,"item":"saddle","accepted_items":["saddle"],"on_equip":{"event":"minecraft:camel_saddled"},"on_unequip":{"event":"minecraft:camel_unsaddled"}}]},"minecraft:interact":{"interactions":[{"play_sounds":"saddle","on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"self","domain":"inventory","operator":"not","value":"saddle"},{"test":"has_equipment","subject":"other","domain":"hand","value":"saddle"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_sneak_held","subject":"other","value":false}]},"target":"self"},"equip_item_slot":0,"interact_text":"action.interact.saddle"}]},"minecraft:behavior.breed":{"priority":2,"speed_multiplier":1.0},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:breedable":{"require_tame":false,"breeds_with":[{"mate_type":"minecraft:camel","baby_type":"minecraft:camel","breed_event":{"event":"minecraft:entity_born","target":"baby"}}],"breed_items":["cactus"]},"minecraft:rideable":{"seat_count":2,"crouching_skip_interact":true,"pull_in_entities":true,"family_types":["player"],"interact_text":"action.interact.ride.horse","seats":[{"min_rider_count":0,"max_rider_count":2,"position":[0.0,1.905,0.5]},{"min_rider_count":1,"max_rider_count":2,"position":[0.0,1.905,-0.5]}]}},"minecraft:camel_standing":{"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:collision_box":{"width":1.7,"height":2.375}},"minecraft:camel_sitting":{"minecraft:pushable":{"is_pushable":false,"is_pushable_by_piston":true},"minecraft:collision_box":{"width":1.7,"height":0.945}}},"components":{"minecraft:is_tamed":{},"minecraft:healable":{"items":[{"item":"cactus","heal_amount":2}]},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:type_family":{"family":["camel","mob"]},"minecraft:is_hidden_when_invisible":{},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:health":{"value":32},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:movement":{"value":0.09},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:physics":{},"minecraft:conditional_bandwidth_optimization":{},"minecraft:behavior.float":{"priority":0,"sink_with_passengers":true},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":4},"minecraft:behavior.tempt":{"priority":3,"speed_multiplier":2.5,"can_tempt_vertically":true,"items":["cactus"]},"minecraft:behavior.random_look_around_and_sit":{"priority":4,"continue_if_leashed":true,"continue_sitting_on_reload":true,"min_look_count":2,"max_look_count":5,"min_look_time":80,"max_look_time":100,"min_angle_of_view_horizontal":-30,"max_angle_of_view_horizontal":30,"random_look_around_cooldown":5,"probability":0.001},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":2},"minecraft:behavior.look_at_player":{"priority":7,"target_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:variable_max_auto_step":{"base_value":1.5625,"controlled_value":1.5625,"jump_prevented_value":0.5625}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"minecraft:spawn_adult"},{"weight":5,"trigger":"minecraft:entity_born"}]},"minecraft:spawn_adult":{"add":{"component_groups":["minecraft:camel_adult","minecraft:camel_standing"]}},"minecraft:entity_born":{"add":{"component_groups":["minecraft:camel_baby","minecraft:camel_standing"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:camel_baby"]},"add":{"component_groups":["minecraft:camel_adult"]}},"minecraft:camel_saddled":{"add":{"component_groups":["minecraft:camel_saddled"]}},"minecraft:camel_unsaddled":{"remove":{"component_groups":["minecraft:camel_saddled"]}},"minecraft:start_sitting":{"add":{"component_groups":["minecraft:camel_sitting"]},"remove":{"component_groups":["minecraft:camel_standing"]}},"minecraft:stop_sitting":{"add":{"component_groups":["minecraft:camel_standing"]},"remove":{"component_groups":["minecraft:camel_sitting"]}}}}}'},7508:e=>{e.exports='{"format_version":"1.16.100","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:cat","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:{name}_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.4},"minecraft:ageable":{"duration":1200,"feed_items":["fish","salmon"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}}},"minecraft:{name}_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/cat.json"},"minecraft:scale":{"value":0.8},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":true,"require_full_health":true,"allow_sitting":true,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["fish","salmon"]}},"minecraft:cat_wild":{"minecraft:health":{"value":10,"max":10},"minecraft:tameable":{"probability":0.33,"tame_items":["fish","salmon"],"tame_event":{"event":"minecraft:on_tame","target":"self"}},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.35,0.0]}},"minecraft:behavior.nearest_attackable_target":{"priority":1,"reselect_targets":true,"within_radius":16.0,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"rabbit"},"max_dist":8},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":8}]},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":0.5,"within_radius":16,"can_get_scared":true,"items":["fish","salmon"]},"minecraft:behavior.avoid_mob_type":{"priority":6,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":10,"walk_speed_multiplier":0.8,"sprint_speed_multiplier":1.33}]},"minecraft:behavior.move_towards_dwelling_restriction":{"priority":7}},"minecraft:cat_tame":{"minecraft:is_tamed":{},"minecraft:health":{"value":20,"max":20},"minecraft:color":{"value":14},"minecraft:sittable":{},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":0.5,"within_radius":16,"items":["fish","salmon"]},"minecraft:is_dyeable":{"interact_text":"action.interact.dye"},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:behavior.follow_owner":{"priority":4,"speed_multiplier":1.0,"start_distance":10,"stop_distance":2},"minecraft:behavior.stay_while_sitting":{"priority":3},"minecraft:behavior.ocelot_sit_on_block":{"priority":7,"speed_multiplier":1.0},"minecraft:behavior.pet_sleep_with_owner":{"priority":2,"speed_multiplier":1.2,"search_radius":10,"search_height":10,"goal_radius":1.0},"minecraft:on_wake_with_owner":{"event":"minecraft:pet_slept_with_owner","target":"self"}},"minecraft:cat_gift_for_owner":{"minecraft:behavior.drop_item_for":{"priority":1,"seconds_before_pickup":0.0,"cooldown":0.25,"drop_item_chance":0.7,"offering_distance":5.0,"minimum_teleport_distance":2.0,"max_head_look_at_height":10.0,"target_range":[5.0,5.0,5.0],"teleport_offset":[0.0,1.0,0.0],"time_of_day_range":[0.74999,0.80],"speed_multiplier":1.0,"search_range":5,"search_height":2,"search_count":0,"goal_radius":1.0,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":6}],"loot_table":"loot_tables/entities/cat_gift.json","on_drop_attempt":{"event":"minecraft:cat_gifted_owner","target":"self"}}},"minecraft:{name}_white":{"minecraft:variant":{"value":0}},"minecraft:{name}_tuxedo":{"minecraft:variant":{"value":1}},"minecraft:{name}_red":{"minecraft:variant":{"value":2}},"minecraft:{name}_siamese":{"minecraft:variant":{"value":3}},"minecraft:{name}_british":{"minecraft:variant":{"value":4}},"minecraft:{name}_calico":{"minecraft:variant":{"value":5}},"minecraft:{name}_persian":{"minecraft:variant":{"value":6}},"minecraft:{name}_ragdoll":{"minecraft:variant":{"value":7}},"minecraft:{name}_tabby":{"minecraft:variant":{"value":8}},"minecraft:{name}_black":{"minecraft:variant":{"value":9}},"minecraft:{name}_jellie":{"minecraft:variant":{"value":10}}},"components":{"minecraft:attack_damage":{"value":4},"minecraft:nameable":{},"minecraft:type_family":{"family":["cat","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.6,"height":0.7},"minecraft:healable":{"items":[{"item":"fish","heal_amount":2},{"item":"salmon","heal_amount":2}]},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.3},"minecraft:navigation.walk":{"can_float":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"passive","update_interval_base":60,"update_interval_variant":40,"can_find_poi":false,"can_migrate":true,"first_founding_reward":0},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25},"minecraft:behavior.mount_pathing":{"priority":1,"speed_multiplier":1.25,"target_dist":0,"track_target":true},"minecraft:behavior.leap_at_target":{"priority":3,"target_dist":0.3},"minecraft:behavior.ocelotattack":{"priority":4,"cooldown_time":1.0,"x_max_rotation":30.0,"y_max_head_rotation":30.0,"max_distance":15.0,"max_sneak_range":15.0,"max_sprint_range":4.0,"reach_multiplier":2.0,"sneak_speed_multiplier":0.6,"sprint_speed_multiplier":1.33,"walk_speed_multiplier":0.8},"minecraft:behavior.random_stroll":{"priority":8,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":9},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":3,"remove":{},"add":{"component_groups":["minecraft:{name}_adult","minecraft:{name}_wild"]}},{"weight":1,"remove":{},"add":{"component_groups":["minecraft:{name}_baby","minecraft:{name}_wild"]}}]},{"randomize":[{"weight":15,"add":{"component_groups":["minecraft:{name}_white"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_tuxedo"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_red"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_siamese"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_british"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_calico"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_persian"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_ragdoll"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_tabby"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_black"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_jellie"]}}]}]},"minecraft:spawn_from_village":{"sequence":[{"randomize":[{"weight":3,"remove":{},"add":{"component_groups":["minecraft:{name}_adult","minecraft:{name}_wild"]}},{"weight":1,"remove":{},"add":{"component_groups":["minecraft:{name}_baby","minecraft:{name}_wild"]}}]},{"randomize":[{"weight":15,"add":{"component_groups":["minecraft:{name}_tuxedo"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_red"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_siamese"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_white"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_british"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_calico"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_persian"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_ragdoll"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_tabby"]}},{"weight":15,"add":{"component_groups":["minecraft:{name}_jellie"]}}]}]},"minecraft:spawn_midnight_{name}":{"sequence":[{"add":{"component_groups":["minecraft:{name}_adult","minecraft:{name}_wild","minecraft:{name}_black"]}}]},"minecraft:entity_born":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:is_baby"},"remove":{},"add":{"component_groups":["minecraft:{name}_baby","minecraft:{name}_tame"]}}]},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:{name}_baby"]},"add":{"component_groups":["minecraft:{name}_adult"]}},"minecraft:on_tame":{"sequence":[{"remove":{"component_groups":["minecraft:{name}_wild"]}},{"add":{"component_groups":["minecraft:{name}_tame"]}}]},"minecraft:pet_slept_with_owner":{"add":{"component_groups":["minecraft:cat_gift_for_owner"]}},"minecraft:cat_gifted_owner":{"remove":{"component_groups":["minecraft:cat_gift_for_owner"]}}}}}'},9407:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:spider_jockey":{"minecraft:addrider":{"entity_type":"minecraft:skeleton"},"minecraft:rideable":{"seat_count":1,"family_types":["skeleton"],"seats":{"position":[0.0,0.3,-0.1]}}},"minecraft:spider_stray_jockey":{"minecraft:addrider":{"entity_type":"minecraft:skeleton.stray"},"minecraft:rideable":{"seat_count":1,"family_types":["skeleton"],"seats":{"position":[0.0,0.3,-0.1]}}},"minecraft:spider_wither_jockey":{"minecraft:addrider":{"entity_type":"minecraft:skeleton.wither"},"minecraft:rideable":{"seat_count":1,"family_types":["skeleton"],"seats":{"position":[0.0,0.25,-0.1]}}},"minecraft:spider_neutral":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_brightness","operator":"<","value":0.49},"event":"minecraft:become_hostile"}},"minecraft:on_target_acquired":{"event":"minecraft:become_angry"}},"minecraft:spider_hostile":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_brightness","operator":">","value":0.49},"event":"minecraft:become_neutral"}},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"attack_interval":5,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":16}]},"minecraft:behavior.leap_at_target":{"priority":4,"yd":0.4,"must_be_on_ground":false},"minecraft:behavior.melee_attack":{"priority":3,"track_target":true,"random_stop_interval":100,"reach_multiplier":0.8}},"minecraft:spider_angry":{"minecraft:angry":{"duration":10,"duration_delta":3,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"attack_interval":10,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":16}]},"minecraft:behavior.leap_at_target":{"priority":4,"yd":0.4,"must_be_on_ground":false},"minecraft:behavior.melee_attack":{"priority":3,"track_target":true,"reach_multiplier":1.4}},"minecraft:spider_poison_easy":{"minecraft:attack":{"damage":2,"effect_name":"poison","effect_duration":0}},"minecraft:spider_poison_normal":{"minecraft:attack":{"damage":2,"effect_name":"poison","effect_duration":7}},"minecraft:spider_poison_hard":{"minecraft:attack":{"damage":2,"effect_name":"poison","effect_duration":15}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:type_family":{"family":["cavespider","monster","arthropod","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:loot":{"table":"loot_tables/entities/spider.json"},"minecraft:collision_box":{"width":0.7,"height":0.5},"minecraft:health":{"value":12,"max":12},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.3},"minecraft:navigation.climb":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":1},"minecraft:behavior.mount_pathing":{"priority":5,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":7},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.3,0.0]}},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":1,"randomize":[{"weight":80,"filters":{"all_of":[{"test":"is_daytime","value":false},{"test":"is_snow_covered","value":true},{"test":"is_underground","value":false}]},"remove":{},"add":{"component_groups":["minecraft:spider_stray_jockey","minecraft:spider_neutral"]}},{"weight":80,"filters":{"test":"is_biome","value":"the_nether"},"remove":{},"add":{"component_groups":["minecraft:spider_wither_jockey","minecraft:spider_neutral"]}},{"weight":20,"filters":{"all_of":[{"test":"is_daytime","value":false},{"test":"is_underground","value":true}]},"remove":{},"add":{"component_groups":["minecraft:spider_jockey","minecraft:spider_neutral"]}}]},{"weight":99,"remove":{},"add":{"component_groups":["minecraft:spider_neutral"]}}]},"minecraft:become_hostile":{"sequence":[{"remove":{"component_groups":["minecraft:spider_neutral"]},"add":{"component_groups":["minecraft:spider_hostile"]}},{"filters":{"test":"is_difficulty","value":"easy"},"remove":{"component_groups":["minecraft:spider_poison_hard","minecraft:spider_poison_normal"]},"add":{"component_groups":["minecraft:spider_poison_easy"]}},{"filters":{"test":"is_difficulty","value":"normal"},"remove":{"component_groups":["minecraft:spider_poison_easy","minecraft:spider_poison_hard"]},"add":{"component_groups":["minecraft:spider_poison_normal"]}},{"filters":{"test":"is_difficulty","value":"hard"},"remove":{"component_groups":["minecraft:spider_poison_easy","minecraft:spider_poison_normal"]},"add":{"component_groups":["minecraft:spider_poison_hard"]}}]},"minecraft:become_neutral":{"remove":{"component_groups":["minecraft:spider_hostile"]},"add":{"component_groups":["minecraft:spider_neutral"]}},"minecraft:become_angry":{"sequence":[{"remove":{"component_groups":["minecraft:spider_neutral"]},"add":{"component_groups":["minecraft:spider_angry"]}},{"filters":{"test":"is_difficulty","value":"easy"},"remove":{"component_groups":["minecraft:spider_poison_hard","minecraft:spider_poison_normal"]},"add":{"component_groups":["minecraft:spider_poison_easy"]}},{"filters":{"test":"is_difficulty","value":"normal"},"remove":{"component_groups":["minecraft:spider_poison_easy","minecraft:spider_poison_hard"]},"add":{"component_groups":["minecraft:spider_poison_normal"]}},{"filters":{"test":"is_difficulty","value":"hard"},"remove":{"component_groups":["minecraft:spider_poison_easy","minecraft:spider_poison_normal"]},"add":{"component_groups":["minecraft:spider_poison_hard"]}}]},"minecraft:on_calm":{"remove":{"component_groups":["minecraft:spider_angry"]},"add":{"component_groups":["minecraft:spider_neutral"]}}}}}'},6207:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:chicken","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:{name}_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":["wheat_seeds","beetroot_seeds","melon_seeds","pumpkin_seeds"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":1.1}},"minecraft:{name}_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/chicken.json"},"minecraft:breedable":{"require_tame":false,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["wheat_seeds","beetroot_seeds","melon_seeds","pumpkin_seeds"]},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.4,0.0]}},"minecraft:spawn_entity":{"entities":{"min_wait_time":300,"max_wait_time":600,"spawn_sound":"plop","spawn_item":"egg","filters":{"test":"rider_count","subject":"self","operator":"==","value":0}}}}},"components":{"minecraft:type_family":{"family":["chicken","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.6,"height":0.8},"minecraft:nameable":{},"minecraft:health":{"value":4,"max":4},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{"mass":0.5},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.5},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":1.0,"items":["wheat_seeds","beetroot_seeds","melon_seeds","pumpkin_seeds"]},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"from_egg":{"add":{"component_groups":["minecraft:{name}_baby"]}},"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"minecraft:spawn_adult"},{"weight":5,"add":{"component_groups":["minecraft:{name}_baby"]}}]},"minecraft:entity_born":{"remove":{},"add":{"component_groups":["minecraft:{name}_baby"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:{name}_baby"]},"add":{"component_groups":["minecraft:{name}_adult"]}},"minecraft:spawn_adult":{"add":{"component_groups":["minecraft:{name}_adult"]}}}}}'},662:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:cod","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:type_family":{"family":["cod","fish"]},"minecraft:collision_box":{"width":0.6,"height":0.3},"minecraft:health":{"value":6,"max":6},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:loot":{"table":"loot_tables/entities/fish.json"},"minecraft:scale":{"value":1.0},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_air":false,"breathes_water":true},"minecraft:movement":{"value":0.1},"minecraft:underwater_movement":{"value":0.1},"minecraft:navigation.generic":{"is_amphibious":false,"can_path_over_water":false,"can_swim":true,"can_walk":false,"can_breach":false,"can_sink":false},"minecraft:physics":{"has_gravity":false},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:movement.sway":{"sway_amplitude":0.0},"minecraft:despawn":{"despawn_from_distance":{"min_distance":32,"max_distance":40}},"minecraft:behavior.swim_idle":{"priority":5,"idle_time":5.0,"success_rate":0.1},"minecraft:behavior.random_swim":{"priority":3,"speed_multiplier":1.0,"xz_dist":16,"y_dist":4,"interval":0},"minecraft:behavior.swim_wander":{"priority":4,"interval":0.1,"look_ahead":2.0,"speed_multiplier":1.0,"wander_time":5.0},"minecraft:behavior.avoid_mob_type":{"priority":1,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":6,"walk_speed_multiplier":1.5,"sprint_speed_multiplier":2.0}]},"minecraft:flocking":{"in_water":true,"match_variants":false,"use_center_of_mass":true,"low_flock_limit":4,"high_flock_limit":8,"goal_weight":2.0,"loner_chance":0.1,"influence_radius":3.0,"breach_influence":7.0,"separation_weight":1.75,"separation_threshold":0.95,"cohesion_weight":2.0,"cohesion_threshold":1.95,"innner_cohesion_threshold":1.25,"min_height":1.5,"max_height":6.0,"block_distance":2.0,"block_weight":0.85},"minecraft:nameable":{},"minecraft:conditional_bandwidth_optimization":{}}}}'},247:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:{name}_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":"wheat","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1.1}},"minecraft:{name}_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/cow.json"},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"breed_items":"wheat","breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}}},"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","domain":"hand","subject":"other","value":"bucket:0"}]}},"use_item":true,"transform_to_item":"bucket:1","play_sounds":"milk","interact_text":"action.interact.milk"}]}}},"components":{"minecraft:type_family":{"family":["cow","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:collision_box":{"width":0.9,"height":1.3},"minecraft:nameable":{},"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":1.25,"items":["wheat"]},"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":1.1},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,1.105,0.0]}},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"minecraft:spawn_adult"},{"weight":5,"add":{"component_groups":["minecraft:{name}_baby"]}}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:{name}_baby"]}},"minecraft:entity_transformed":{"remove":{},"add":{"component_groups":["minecraft:{name}_adult"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:{name}_baby"]},"add":{"component_groups":["minecraft:{name}_adult"]}},"minecraft:spawn_adult":{"add":{"component_groups":["minecraft:{name}_adult"]}}}}}'},2710:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:creeper","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:exploding":{"minecraft:explode":{"fuse_length":1.5,"fuse_lit":true,"power":3,"causes_fire":false,"destroy_affected_by_griefing":true}},"minecraft:charged_{name}":{"minecraft:is_charged":{}},"minecraft:charged_exploding":{"minecraft:explode":{"fuse_length":1.5,"fuse_lit":true,"power":6,"causes_fire":false,"destroy_affected_by_griefing":true}},"minecraft:forced_exploding":{"minecraft:target_nearby_sensor":{},"minecraft:explode":{"fuse_length":1.5,"fuse_lit":true,"power":3,"causes_fire":false,"destroy_affected_by_griefing":true},"minecraft:on_target_escape":{}},"minecraft:forced_charged_exploding":{"minecraft:target_nearby_sensor":{},"minecraft:explode":{"fuse_length":1.5,"fuse_lit":true,"power":6,"causes_fire":false,"destroy_affected_by_griefing":true},"minecraft:on_target_escape":{}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:type_family":{"family":["creeper","monster","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:collision_box":{"width":0.6,"height":1.8},"minecraft:movement":{"value":0.2},"minecraft:navigation.walk":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:loot":{"table":"loot_tables/entities/creeper.json"},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:attack":{"damage":3},"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":{"test":"is_family","subject":"other","value":"lightning"},"event":"minecraft:become_charged"},"deals_damage":false}},"minecraft:target_nearby_sensor":{"inside_range":2.5,"outside_range":6.0,"must_see":true,"on_inside_range":{"event":"minecraft:start_exploding","target":"self"},"on_outside_range":{"event":"minecraft:stop_exploding","target":"self"},"on_vision_lost_inside_range":{"event":"minecraft:stop_exploding","target":"self"}},"minecraft:interact":{"interactions":{"on_interact":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","domain":"hand","subject":"other","value":"flint_and_steel"},{"test":"has_component","operator":"!=","value":"minecraft:explode"}]},"event":"minecraft:start_exploding_forced","target":"self"},"hurt_item":1,"swing":true,"play_sounds":"ignite","interact_text":"action.interact.creeper"}},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.swell":{"start_distance":2.5,"stop_distance":6.0,"priority":2},"minecraft:behavior.melee_attack":{"priority":4,"speed_multiplier":1.25,"track_target":false,"reach_multiplier":0.0},"minecraft:behavior.avoid_mob_type":{"priority":3,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"ocelot"},{"test":"is_family","subject":"other","value":"cat"}]},"max_dist":6,"sprint_speed_multiplier":1.2}]},"minecraft:behavior.random_stroll":{"priority":5,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":6,"look_distance":8},"minecraft:behavior.random_look_around":{"priority":6},"minecraft:behavior.nearest_attackable_target":{"priority":1,"must_see":true,"must_see_forget_duration":3.0,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":16}]},"minecraft:behavior.hurt_by_target":{"priority":2},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:on_target_escape":{"event":"minecraft:stop_exploding","target":"self"},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:start_exploding_forced":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:is_charged"},"add":{"component_groups":["minecraft:forced_exploding"]}},{"filters":{"test":"has_component","value":"minecraft:is_charged"},"add":{"component_groups":["minecraft:forced_charged_exploding"]}}]},"minecraft:start_exploding":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:is_charged"},"add":{"component_groups":["minecraft:exploding"]}},{"filters":{"test":"has_component","value":"minecraft:is_charged"},"add":{"component_groups":["minecraft:charged_exploding"]}}]},"minecraft:stop_exploding":{"remove":{"component_groups":["minecraft:exploding"]}},"minecraft:become_charged":{"remove":{"component_groups":["minecraft:exploding"]},"add":{"component_groups":["minecraft:charged_{name}"]}}}}}'},3084:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:dolphin","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"{name}_adult":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/dolphin.json"},"minecraft:bribeable":{"bribe_items":["fish","salmon"]},"minecraft:behavior.melee_attack":{"priority":2,"track_target":true}},"dolphin_{name}":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.65},"minecraft:ageable":{"duration":1200,"feed_items":["fish","salmon"],"grow_up":{"event":"ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":4,"speed_multiplier":1.1},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25}},"dolphin_angry":{"minecraft:angry":{"duration":25,"broadcast_anger":true,"broadcast_range":16,"calm_event":{"event":"on_calm","target":"self"}},"minecraft:on_target_acquired":{}},"dolphin_dried":{"minecraft:damage_over_time":{"damage_per_hurt":1,"time_between_hurt":0}},"dolphin_swimming_navigation":{"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6},"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":false,"can_swim":true,"can_walk":false,"can_breach":true,"can_sink":false},"minecraft:environment_sensor":{"triggers":[{"filters":{"all_of":[{"test":"on_ground","operator":"==","value":true},{"test":"in_water","operator":"!=","value":true}]},"event":"navigation_on_land"}]}},"dolphin_on_land":{"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":true,"can_swim":true,"can_walk":true,"can_breach":false,"can_jump":false},"minecraft:timer":{"looping":false,"time":120,"time_down_event":{"event":"dried_out"}},"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"in_water_or_rain","operator":"==","value":true},"event":"stop_dryingout"}]}},"dolphin_on_land_in_rain":{"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":true,"can_swim":true,"can_walk":true,"can_breach":false,"can_jump":false},"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"in_water","operator":"==","value":true},"event":"navigation_off_land"},{"filters":{"test":"in_water_or_rain","operator":"!=","value":true},"event":"start_dryingout"}]}}},"components":{"minecraft:nameable":{},"minecraft:type_family":{"family":["dolphin","mob"]},"minecraft:collision_box":{"width":0.9,"height":0.6},"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:follow_range":{"value":48,"max":48},"minecraft:breathable":{"total_supply":240,"suffocate_time":0,"breathes_air":true,"breathes_water":false,"generates_bubbles":false},"minecraft:attack":{"damage":3},"minecraft:movement":{"value":0.1},"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":true,"can_swim":true,"can_walk":false,"can_breach":true,"can_sink":false},"minecraft:underwater_movement":{"value":0.15},"minecraft:jump.static":{"jump_power":0.6},"minecraft:can_climb":{},"minecraft:behavior.swim_with_entity":{"priority":4,"success_rate":0.1,"chance_to_stop":0.0333,"state_check_interval":0.5,"catch_up_threshold":12.0,"match_direction_threshold":2.0,"catch_up_multiplier":2.5,"speed_multiplier":1.5,"search_range":20.0,"stop_distance":5.0,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"}}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.random_swim":{"priority":5,"interval":0,"xz_dist":20},"minecraft:behavior.random_breach":{"priority":6,"interval":50,"xz_dist":6,"cooldown_time":2.0},"minecraft:behavior.random_look_around":{"priority":7},"minecraft:behavior.avoid_mob_type":{"priority":2,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"guardian_elder"},{"test":"is_family","subject":"other","value":"guardian"}]},"max_dist":8,"walk_speed_multiplier":1.0,"sprint_speed_multiplier":1.0}],"probability_per_strength":0.14},"minecraft:behavior.find_underwater_treasure":{"priority":2,"speed_multiplier":2.0,"search_range":30,"stop_distance":50},"minecraft:behavior.move_to_water":{"priority":1,"search_range":15,"search_height":5},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:flocking":{"in_water":false,"match_variants":false,"use_center_of_mass":false,"low_flock_limit":4,"high_flock_limit":8,"goal_weight":2.0,"loner_chance":0.1,"influence_radius":6.0,"breach_influence":0.0,"separation_weight":1.75,"separation_threshold":3.0,"cohesion_weight":1.85,"cohesion_threshold":6.5,"innner_cohesion_threshold":3.5,"min_height":4.0,"max_height":4.0,"block_distance":1.0,"block_weight":0.0},"minecraft:on_target_acquired":{"event":"become_angry","target":"self"},"minecraft:on_target_escape":{"target":"self"},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":90,"add":{"component_groups":["{name}_adult","dolphin_swimming_navigation"]}},{"weight":10,"add":{"component_groups":["dolphin_{name}","dolphin_swimming_navigation"]}}]},"ageable_grow_up":{"remove":{"component_groups":["dolphin_{name}"]},"add":{"component_groups":["{name}_adult"]}},"become_angry":{"add":{"component_groups":["dolphin_angry"]}},"on_calm":{"remove":{"component_groups":["dolphin_angry"]}},"stop_dryingout":{"remove":{"component_groups":["dolphin_on_land","dolphin_dried"]},"add":{"component_groups":["dolphin_on_land_in_rain"]}},"start_dryingout":{"remove":{"component_groups":["dolphin_on_land_in_rain"]},"add":{"component_groups":["dolphin_on_land"]}},"dried_out":{"add":{"component_groups":["dolphin_dried"]}},"navigation_on_land":{"add":{"component_groups":["dolphin_on_land"]},"remove":{"component_groups":["dolphin_swimming_navigation"]}},"navigation_off_land":{"add":{"component_groups":["dolphin_swimming_navigation"]},"remove":{"component_groups":["dolphin_on_land_in_rain","dolphin_on_land","dolphin_dried"]}}}}}'},6428:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:{name}_baby":{"minecraft:is_baby":{},"minecraft:scale_by_age":{"start_scale":0.5,"end_scale":1.0},"minecraft:ageable":{"duration":1200,"feed_items":[{"item":"wheat","growth":0.016667},{"item":"sugar","growth":0.025},{"item":"hay_block","growth":0.15},{"item":"apple","growth":0.05},{"item":"golden_carrot","growth":0.05},{"item":"golden_apple","growth":0.2},{"item":"appleEnchanted","growth":0.2}],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":4,"speed_multiplier":1.0}},"minecraft:{name}_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/horse.json"},"minecraft:behavior.run_around_like_crazy":{"priority":1,"speed_multiplier":1.2},"minecraft:behavior.breed":{"priority":2,"speed_multiplier":1.0}},"minecraft:{name}_wild":{"minecraft:rideable":{"seat_count":1,"family_types":["player","zombie"],"interact_text":"action.interact.mount","seats":{"position":[0.0,0.925,-0.2]}},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:tamemount":{"min_temper":0,"max_temper":100,"feed_text":"action.interact.feed","ride_text":"action.interact.mount","feed_items":[{"item":"wheat","temper_mod":3},{"item":"sugar","temper_mod":3},{"item":"apple","temper_mod":3},{"item":"golden_carrot","temper_mod":5},{"item":"golden_apple","temper_mod":10},{"item":"appleEnchanted","temper_mod":10}],"auto_reject_items":[{"item":"horsearmorleather"},{"item":"horsearmoriron"},{"item":"horsearmorgold"},{"item":"horsearmordiamond"},{"item":"saddle"}],"tame_event":{"event":"minecraft:on_tame","target":"self"}}},"minecraft:{name}_tamed":{"minecraft:is_tamed":{},"minecraft:equippable":{"slots":[{"slot":0,"item":"saddle","accepted_items":["saddle"],"on_equip":{"event":"minecraft:{name}_saddled"},"on_unequip":{"event":"minecraft:{name}_unsaddled"}}]},"minecraft:rideable":{"seat_count":1,"crouching_skip_interact":true,"family_types":["player"],"interact_text":"action.interact.ride.horse","seats":{"position":[0.0,0.925,-0.2]}},"minecraft:behavior.player_ride_tamed":{},"minecraft:inventory":{"inventory_size":16,"container_type":"horse"},"minecraft:breedable":{"require_tame":true,"inherit_tamed":false,"breeds_with":[{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}}],"breed_items":["golden_carrot","golden_apple","appleEnchanted"]},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.2,"items":["apple","carrot","golden_apple","appleEnchanted","golden_carrot","carrotOnAStick","hay_block","sugar","bread","wheat"]}},"minecraft:{name}_unchested":{"minecraft:interact":{"interactions":[{"play_sounds":"armor.equip_generic","on_interact":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","domain":"hand","subject":"other","value":"chest"}]},"event":"minecraft:on_chest","target":"self"},"use_item":true,"interact_text":"action.interact.attachchest"}]}},"minecraft:{name}_chested":{"minecraft:is_chested":{}},"minecraft:{name}_saddled":{"minecraft:is_saddled":{},"minecraft:input_ground_controlled":{},"minecraft:can_power_jump":{}}},"components":{"minecraft:type_family":{"family":["donkey","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":1.4,"height":1.6},"minecraft:health":{"value":{"range_min":15,"range_max":30}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.175},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:nameable":{},"minecraft:horse.jump_strength":{"value":0.5},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:healable":{"items":[{"item":"wheat","heal_amount":2},{"item":"sugar","heal_amount":1},{"item":"hay_block","heal_amount":20},{"item":"apple","heal_amount":3},{"item":"golden_carrot","heal_amount":4},{"item":"golden_apple","heal_amount":10},{"item":"appleEnchanted","heal_amount":10}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.2},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.7},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":80,"add":{"component_groups":["minecraft:{name}_adult","minecraft:{name}_wild"]}},{"weight":20,"add":{"component_groups":["minecraft:{name}_baby"]}}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:{name}_baby"]}},"minecraft:on_tame":{"remove":{"component_groups":["minecraft:{name}_wild"]},"add":{"component_groups":["minecraft:{name}_tamed","minecraft:{name}_unchested"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:{name}_baby"]},"add":{"component_groups":["minecraft:{name}_adult","minecraft:{name}_wild"]}},"minecraft:on_chest":{"remove":{"component_groups":["minecraft:{name}_unchested"]},"add":{"component_groups":["minecraft:{name}_chested"]}},"minecraft:{name}_saddled":{"add":{"component_groups":["minecraft:{name}_saddled"]}},"minecraft:{name}_unsaddled":{"remove":{"component_groups":["minecraft:{name}_saddled"]}}}}}'},5491:e=>{e.exports='{"format_version":"1.16.210","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:baby_{name}":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:movement":{"value":0.25},"minecraft:underwater_movement":{"value":0.08}},"minecraft:adult_{name}":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:loot":{"table":"loot_tables/entities/drowned.json"}},"minecraft:mode_switcher":{"minecraft:target_nearby_sensor":{"inside_range":3.0,"outside_range":5.0,"on_inside_range":{"event":"minecraft:switch_to_melee","target":"self"},"on_outside_range":{"event":"minecraft:switch_to_ranged","target":"self"}},"minecraft:equipment":{"table":"loot_tables/entities/drowned_ranged_equipment.json","slot_drop_chance":[{"slot":"slot.weapon.offhand","drop_chance":1.0}]}},"minecraft:ranged_mode":{"minecraft:shooter":{"def":"minecraft:thrown_trident"},"minecraft:behavior.ranged_attack":{"priority":3,"attack_interval_min":1.0,"attack_interval_max":3.0,"attack_radius":10.0}},"minecraft:melee_mode":{"minecraft:attack":{"damage":3},"minecraft:behavior.melee_attack":{"priority":3,"speed_multiplier":1,"track_target":false,"require_complete_path":true},"minecraft:equipment":{"table":"loot_tables/entities/drowned_equipment.json","slot_drop_chance":[{"slot":"slot.weapon.offhand","drop_chance":1.0}]}},"minecraft:hunter_mode":{"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":false,"can_break_doors":true,"can_swim":true,"can_walk":true,"avoid_sun":true}},"minecraft:wander_mode":{"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":false,"can_break_doors":true,"can_swim":false,"can_walk":true,"avoid_sun":true}}},"components":{"minecraft:nameable":{},"minecraft:type_family":{"family":["drowned","zombie","undead","monster","mob"]},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:annotation.break_door":{},"minecraft:underwater_movement":{"value":0.06},"minecraft:movement.generic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.23},"minecraft:burns_in_daylight":{},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_air":true,"breathes_water":true},"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":false,"can_break_doors":true,"can_swim":false,"can_walk":true,"avoid_sun":true},"minecraft:shareables":{"items":[{"item":"minecraft:nautilus_shell","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:trident","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:netherite_sword","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:diamond_sword","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:iron_sword","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:stone_sword","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:golden_sword","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:wooden_sword","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_helmet","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_helmet","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_helmet","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_helmet","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_helmet","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_helmet","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_chestplate","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_chestplate","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_chestplate","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_chestplate","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_chestplate","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_chestplate","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_leggings","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_leggings","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_leggings","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_leggings","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_leggings","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_leggings","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_boots","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_boots","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_boots","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_boots","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_boots","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_boots","want_amount":1,"surplus_amount":1,"priority":5}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.flee_sun":{"priority":2,"speed_multiplier":1},"minecraft:behavior.equip_item":{"priority":3},"minecraft:behavior.stomp_turtle_egg":{"priority":4,"speed_multiplier":1,"search_range":10,"search_height":2,"goal_radius":1.14,"interval":20},"minecraft:behavior.pickup_items":{"priority":6,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0,"pickup_based_on_chance":true,"can_pickup_any_item":true},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"reselect_targets":true,"must_see":true,"within_radius":12.0,"must_see_forget_duration":17.0,"persist_time":0.5,"entity_types":[{"filters":{"all_of":[{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},{"any_of":[{"test":"in_water","subject":"other","value":true},{"test":"is_daytime","value":false}]}]},"max_dist":20},{"filters":{"all_of":[{"any_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},{"any_of":[{"test":"in_water","subject":"other","value":true},{"test":"is_daytime","value":false}]}]},"max_dist":20,"must_see":false},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":20}]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:on_target_acquired":{"event":"minecraft:has_target","target":"self"},"minecraft:on_target_escape":{"event":"minecraft:lost_target","target":"self"},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":15,"remove":{},"add":{"component_groups":["minecraft:mode_switcher","minecraft:ranged_mode","minecraft:adult_{name}"]}},{"weight":85,"randomize":[{"weight":95,"remove":{},"add":{"component_groups":["minecraft:melee_mode","minecraft:adult_{name}"]}},{"weight":5,"remove":{},"add":{"component_groups":["minecraft:melee_mode","minecraft:baby_{name}"]}}]}]},"minecraft:as_baby":{"add":{"component_groups":["minecraft:melee_mode","minecraft:baby_{name}"]}},"minecraft:as_adult":{"add":{"component_groups":["minecraft:melee_mode","minecraft:adult_{name}"]}},"minecraft:switch_to_melee":{"remove":{"component_groups":["minecraft:ranged_mode"]},"add":{"component_groups":["minecraft:melee_mode"]}},"minecraft:switch_to_ranged":{"remove":{"component_groups":["minecraft:melee_mode"]},"add":{"component_groups":["minecraft:ranged_mode"]}},"minecraft:has_target":{"remove":{"component_groups":["minecraft:wander_mode"]},"add":{"component_groups":["minecraft:hunter_mode"]}},"minecraft:lost_target":{"remove":{"component_groups":["minecraft:hunter_mode"]},"add":{"component_groups":["minecraft:wander_mode"]}}}}}'},8486:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:{name}_calm":{"minecraft:on_target_acquired":{"event":"minecraft:become_angry","target":"self"},"minecraft:movement":{"value":0.3}},"minecraft:{name}_angry":{"minecraft:angry":{"duration":25,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:movement":{"value":0.45},"minecraft:behavior.melee_attack":{"priority":2}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:type_family":{"family":["enderman","monster","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:loot":{"table":"loot_tables/entities/enderman.json"},"minecraft:health":{"value":40,"max":40},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4},{"filters":{"test":"in_water_or_rain","operator":"==","value":true},"cause":"drowning","damage_per_tick":1}]},"minecraft:attack":{"damage":7},"minecraft:follow_range":{"value":32,"max":32},"minecraft:collision_box":{"width":0.6,"height":2.9},"minecraft:teleport":{"random_teleports":true,"max_random_teleport_time":30,"random_teleport_cube":[32,32,32],"target_distance":16,"target_teleport_chance":0.05,"light_teleport_chance":0.05},"minecraft:lookat":{"search_radius":64.0,"set_target":true,"look_cooldown":5.0,"filters":{"all_of":[{"subject":"other","test":"is_family","value":"player"},{"test":"has_equipment","domain":"head","subject":"other","operator":"not","value":"carved_pumpkin"}]}},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.nearest_attackable_target":{"priority":5,"must_see":true,"attack_interval":10,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"endermite"},"max_dist":64}]},"minecraft:navigation.walk":{"can_path_over_water":false,"avoid_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":8.0,"probability":8.0},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:behavior.hurt_by_target":{"priority":3},"minecraft:behavior.enderman_leave_block":{"priority":10},"minecraft:behavior.enderman_take_block":{"priority":11},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{"default_values":{"max_optimized_distance":80.0,"max_dropped_ticks":10,"use_motion_prediction_hints":true}}},"events":{"minecraft:entity_spawned":{"remove":{},"add":{"component_groups":["minecraft:{name}_calm"]}},"minecraft:become_angry":{"remove":{"component_groups":["minecraft:{name}_calm"]},"add":{"component_groups":["minecraft:{name}_angry"]}},"minecraft:on_calm":{"remove":{"component_groups":["minecraft:{name}_angry"]},"add":{"component_groups":["minecraft:{name}_calm"]}}}}}'},331:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 3 : 0"},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:type_family":{"family":["endermite","arthropod","monster","mob"]},"minecraft:collision_box":{"width":0.4,"height":0.3},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:health":{"value":8,"max":8},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:attack":{"damage":2},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.melee_attack":{"priority":3,"track_target":true},"minecraft:behavior.nearest_attackable_target":{"priority":5,"must_see":true,"within_radius":16.0,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"enderman"}]},"max_dist":16}]},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":1},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}}}}'},6285:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:celebrate":{"minecraft:behavior.celebrate":{"priority":5,"celebration_sound":"celebrate","sound_interval":{"range_min":2.0,"range_max":7.0},"jump_interval":{"range_min":1.0,"range_max":3.5},"duration":30.0,"on_celebration_end_event":{"event":"minecraft:stop_celebrating","target":"self"}}},"minecraft:raid_configuration":{"minecraft:dweller":{"dwelling_type":"village","dweller_role":"hostile","update_interval_base":60,"update_interval_variant":40,"can_find_poi":false,"can_migrate":false,"first_founding_reward":0},"minecraft:behavior.move_to_village":{"priority":6,"speed_multiplier":0.7},"minecraft:ambient_sound_interval":{"value":2.0,"range":4.0,"event_name":"ambient.in.raid"}}},"components":{"minecraft:experience_reward":{"on_death":"10"},"minecraft:type_family":{"family":["evocation_illager","monster","illager","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:loot":{"table":"loot_tables/entities/evocation_illager.json"},"minecraft:health":{"value":24,"max":24},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:movement":{"value":0.5},"minecraft:navigation.walk":{"can_path_over_water":true,"can_pass_doors":true,"can_open_doors":true,"avoid_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.summon_entity":{"priority":2,"summon_choices":[{"min_activation_range":0.0,"max_activation_range":3.0,"cooldown_time":5.0,"weight":3,"cast_duration":2.0,"particle_color":"#FF664D59","start_sound_event":"cast.spell","sequence":[{"shape":"circle","target":"self","base_delay":1.0,"delay_per_summon":0.0,"num_entities_spawned":5,"entity_type":"minecraft:evocation_fang","size":1.5,"entity_lifespan":1.1,"sound_event":"prepare.attack"},{"shape":"circle","target":"self","base_delay":0.15,"delay_per_summon":0.0,"num_entities_spawned":8,"entity_type":"minecraft:evocation_fang","size":2.5,"entity_lifespan":1.1}]},{"min_activation_range":3.0,"weight":3,"cooldown_time":5.0,"cast_duration":2.0,"particle_color":"#FF664D59","start_sound_event":"cast.spell","sequence":[{"shape":"line","target":"self","base_delay":1.0,"delay_per_summon":0.05,"num_entities_spawned":16,"entity_type":"minecraft:evocation_fang","size":20,"entity_lifespan":1.1}]},{"weight":1,"cooldown_time":17.0,"cast_duration":5.0,"particle_color":"#FFB3B3CC","sequence":[{"shape":"circle","target":"self","base_delay":5.0,"num_entities_spawned":3,"entity_type":"minecraft:vex","summon_cap":8,"summon_cap_radius":16.0,"size":1.0,"sound_event":"prepare.summon"}]}]},"minecraft:behavior.send_event":{"priority":3,"event_choices":[{"min_activation_range":0.0,"max_activation_range":16.0,"cooldown_time":5.0,"cast_duration":3.0,"particle_color":"#FFB38033","weight":3,"filters":{"all_of":[{"test":"is_family","subject":"other","value":"sheep"},{"test":"is_color","subject":"other","value":"blue"}]},"start_sound_event":"cast.spell","sequence":[{"base_delay":2.0,"event":"wololo","sound_event":"prepare.wololo"}]}]},"minecraft:behavior.avoid_mob_type":{"priority":5,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":8,"walk_speed_multiplier":0.6,"sprint_speed_multiplier":1.0}]},"minecraft:behavior.random_stroll":{"priority":8,"speed_multiplier":0.6},"minecraft:behavior.nearest_attackable_target":{"priority":2,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},"max_dist":20},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"}]},"max_dist":20}],"must_see":true},"minecraft:behavior.look_at_player":{"priority":9,"look_distance":3.0,"probability":1.0},"minecraft:behavior.look_at_entity":{"priority":10,"look_distance":8.0,"filters":{"test":"is_family","subject":"other","value":"mob"}},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:persistent":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:follow_range":{"value":64},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:spawn_for_raid":{"add":{"component_groups":["minecraft:raid_configuration"]}},"minecraft:start_celebrating":{"add":{"component_groups":["minecraft:celebrate"]}},"minecraft:stop_celebrating":{"remove":{"component_groups":["minecraft:celebrate"]}}}}}'},5225:e=>{e.exports='{"format_version":"1.17.10","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:{name}_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":"sweet_berries","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":9,"speed_multiplier":1.1}},"minecraft:{name}_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/fox.json"},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"breed_items":"sweet_berries","breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}}}},"minecraft:{name}_with_item":{"minecraft:equipment":{"table":"loot_tables/entities/fox_equipment.json","slot_drop_chance":[{"slot":"slot.weapon.mainhand","drop_chance":1.0}]}},"minecraft:trusting_{name}":{"minecraft:trust":{},"minecraft:behavior.defend_trusted_target":{"priority":0,"within_radius":25,"must_see":false,"aggro_sound":"mad","sound_chance":0.05,"on_defend_start":{"event":"minecraft:{name}_configure_defending","target":"self"}}},"minecraft:docile_fox":{"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25},"minecraft:behavior.melee_box_attack":{"priority":10,"track_target":true,"require_complete_path":true}},"minecraft:defending_fox":{"minecraft:behavior.melee_box_attack":{"priority":1,"track_target":true,"require_complete_path":true},"minecraft:behavior.panic":{"priority":2,"speed_multiplier":1.25},"minecraft:environment_sensor":{"triggers":[{"filters":{"all_of":[{"test":"is_daytime","value":true},{"test":"has_target","operator":"==","value":false}]},"event":"minecraft:{name}_configure_docile_day"},{"filters":{"all_of":[{"test":"is_daytime","value":false},{"test":"has_target","operator":"==","value":false}]},"event":"minecraft:{name}_configure_docile_night"}]}},"minecraft:{name}_red":{"minecraft:variant":{"value":0},"minecraft:behavior.nearest_prioritized_attackable_target":{"priority":6,"attack_interval":2,"reselect_targets":true,"target_search_height":5,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"rabbit"},"max_dist":12,"priority":0},{"filters":{"test":"is_family","subject":"other","value":"chicken"},"max_dist":12,"priority":0},{"filters":{"test":"is_family","subject":"other","value":"cod"},"max_dist":12,"priority":1},{"filters":{"test":"is_family","subject":"other","value":"salmon"},"max_dist":12,"priority":1},{"filters":{"test":"is_family","subject":"other","value":"tropicalfish"},"max_dist":12,"priority":1},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":12,"priority":0}]}},"minecraft:{name}_arctic":{"minecraft:variant":{"value":1},"minecraft:behavior.nearest_prioritized_attackable_target":{"priority":6,"attack_interval":2,"reselect_targets":true,"target_search_height":5,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"rabbit"},"max_dist":12,"priority":1},{"filters":{"test":"is_family","subject":"other","value":"chicken"},"max_dist":12,"priority":1},{"filters":{"test":"is_family","subject":"other","value":"cod"},"max_dist":12,"priority":0},{"filters":{"test":"is_family","subject":"other","value":"salmon"},"max_dist":12,"priority":0},{"filters":{"test":"is_family","subject":"other","value":"tropicalfish"},"max_dist":12,"priority":0},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":12,"priority":1}]}},"minecraft:{name}_thunderstorm":{"minecraft:environment_sensor":{"triggers":[{"filters":{"all_of":[{"test":"weather_at_position","operator":"!=","value":"thunderstorm"},{"test":"is_daytime","value":true}]},"event":"minecraft:{name}_configure_day"},{"filters":{"all_of":[{"test":"weather_at_position","operator":"!=","value":"thunderstorm"},{"test":"is_daytime","value":false}]},"event":"minecraft:{name}_configure_night"}]},"minecraft:behavior.find_cover":{"priority":0,"speed_multiplier":1,"cooldown_time":0.0}},"minecraft:{name}_day":{"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"weather_at_position","value":"thunderstorm"},"event":"minecraft:{name}_configure_thunderstorm"},{"filters":{"test":"is_daytime","value":false},"event":"minecraft:{name}_configure_night"}]},"minecraft:behavior.nap":{"priority":8,"cooldown_min":2.0,"cooldown_max":7.0,"mob_detect_dist":12.0,"mob_detect_height":6.0,"can_nap_filters":{"all_of":[{"test":"in_water","subject":"self","operator":"==","value":false},{"test":"on_ground","subject":"self","operator":"==","value":true},{"test":"is_underground","subject":"self","operator":"==","value":true},{"test":"weather_at_position","subject":"self","operator":"!=","value":"thunderstorm"}]},"wake_mob_exceptions":{"any_of":[{"test":"trusts","subject":"other","operator":"==","value":true},{"test":"is_family","subject":"other","operator":"==","value":"fox"},{"test":"is_sneaking","subject":"other","operator":"==","value":true}]}},"minecraft:behavior.find_cover":{"priority":9,"speed_multiplier":1,"cooldown_time":5.0}},"minecraft:{name}_night":{"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"weather_at_position","value":"thunderstorm"},"event":"minecraft:{name}_configure_thunderstorm"},{"filters":{"test":"is_daytime","value":true},"event":"minecraft:{name}_configure_day"}]},"minecraft:behavior.stroll_towards_village":{"priority":11,"speed_multiplier":1.0,"goal_radius":3.0,"cooldown_time":10.0,"search_range":32,"start_chance":0.005}},"minecraft:{name}_ambient_normal":{"minecraft:ambient_sound_interval":{"event_name":"ambient"}},"minecraft:{name}_ambient_sleep":{"minecraft:ambient_sound_interval":{"event_name":"sleep"}},"minecraft:{name}_ambient_night":{"minecraft:ambient_sound_interval":{"event_name":"screech","value":80,"range":160}}},"components":{"minecraft:type_family":{"family":["fox","mob"]},"minecraft:breathable":{"totalSupply":15,"suffocateTime":0},"minecraft:equip_item":{},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:collision_box":{"width":0.6,"height":0.7},"minecraft:nameable":{},"minecraft:health":{"value":20,"max":20},"minecraft:movement":{"value":0.3},"minecraft:attack":{"damage":2},"minecraft:shareables":{"singular_pickup":true,"all_items":true,"all_items_max_amount":1,"items":[{"item":"minecraft:apple","priority":0,"max_amount":1},{"item":"minecraft:appleEnchanted","priority":0,"max_amount":1},{"item":"minecraft:baked_potato","priority":0,"max_amount":1},{"item":"minecraft:beef","priority":0,"max_amount":1},{"item":"minecraft:beetroot","priority":0,"max_amount":1},{"item":"minecraft:beetroot_soup","priority":0,"max_amount":1},{"item":"minecraft:bread","priority":0,"max_amount":1},{"item":"minecraft:carrot","priority":0,"max_amount":1},{"item":"minecraft:chicken","priority":0,"max_amount":1},{"item":"minecraft:chorus_fruit","priority":0,"max_amount":1},{"item":"minecraft:clownfish","priority":0,"max_amount":1},{"item":"minecraft:cooked_beef","priority":0,"max_amount":1},{"item":"minecraft:cooked_chicken","priority":0,"max_amount":1},{"item":"minecraft:cooked_fish","priority":0,"max_amount":1},{"item":"minecraft:cooked_porkchop","priority":0,"max_amount":1},{"item":"minecraft:cooked_rabbit","priority":0,"max_amount":1},{"item":"minecraft:cooked_salmon","priority":0,"max_amount":1},{"item":"minecraft:cookie","priority":0,"max_amount":1},{"item":"minecraft:dried_kelp","priority":0,"max_amount":1},{"item":"minecraft:fish","priority":0,"max_amount":1},{"item":"minecraft:golden_apple","priority":0,"max_amount":1},{"item":"minecraft:golden_carrot","priority":0,"max_amount":1},{"item":"minecraft:melon","priority":0,"max_amount":1},{"item":"minecraft:mushroom_stew","priority":0,"max_amount":1},{"item":"minecraft:muttonCooked","priority":0,"max_amount":1},{"item":"minecraft:muttonRaw","priority":0,"max_amount":1},{"item":"minecraft:poisonous_potato","priority":0,"max_amount":1},{"item":"minecraft:porkchop","priority":0,"max_amount":1},{"item":"minecraft:potato","priority":0,"max_amount":1},{"item":"minecraft:pufferfish","priority":0,"max_amount":1},{"item":"minecraft:pumpkin_pie","priority":0,"max_amount":1},{"item":"minecraft:rabbit","priority":0,"max_amount":1},{"item":"minecraft:rabbit_stew","priority":0,"max_amount":1},{"item":"minecraft:rotten_flesh","priority":0,"max_amount":1},{"item":"minecraft:salmon","priority":0,"max_amount":1},{"item":"minecraft:spider_eye","priority":0,"max_amount":1},{"item":"minecraft:sweet_berries","priority":0,"max_amount":1},{"item":"minecraft:suspicious_stew","priority":0,"max_amount":1}]},"minecraft:damage_sensor":{"triggers":[{"on_damage":{"filters":{"test":"is_block","subject":"block","value":"minecraft:sweet_berry_bush"}},"deals_damage":false}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.equip_item":{"priority":2},"minecraft:behavior.avoid_mob_type":{"priority":5,"entity_types":[{"filters":{"any_of":[{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"trusts","subject":"other","operator":"!=","value":true},{"test":"is_sneaking","subject":"other","operator":"!=","value":true}]},{"test":"is_family","subject":"other","value":"polarbear"},{"test":"is_family","subject":"other","value":"wolf"}]},"max_dist":10,"walk_speed_multiplier":1.0,"sprint_speed_multiplier":1.5}]},"minecraft:behavior.tempt":{"priority":3,"speed_multiplier":0.5,"within_radius":16,"can_get_scared":true,"items":["sweet_berries"]},"minecraft:behavior.stalk_and_pounce_on_target":{"priority":7,"stalk_speed":1.2,"max_stalk_dist":12.0,"leap_height":0.9,"leap_dist":0.8,"pounce_max_dist":5.0,"interest_time":2.0,"stuck_time":2.0,"strike_dist":2.0,"stuck_blocks":{"test":"is_block","subject":"block","operator":"==","value":"snow_layer"}},"minecraft:behavior.pickup_items":{"priority":11,"max_dist":3,"goal_radius":2,"speed_multiplier":0.5},"minecraft:behavior.eat_carried_item":{"priority":12,"delay_before_eating":28},"minecraft:behavior.random_look_around_and_sit":{"priority":12,"min_look_count":2,"max_look_count":5,"min_look_time":80,"max_look_time":100,"probability":0.001},"minecraft:behavior.raid_garden":{"priority":12,"blocks":["minecraft:sweet_berry_bush"],"speed_multiplier":1.2,"search_range":12,"search_height":2,"goal_radius":0.8,"max_to_eat":0,"initial_eat_delay":2},"minecraft:behavior.random_stroll":{"priority":13,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":14,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":15},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{"mass":0.6},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{},"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":0,"scheduled_events":[{"filters":[{"test":"is_sleeping","value":true}],"event":"minecraft:ambient_sleep"},{"filters":{"all_of":[{"test":"is_daytime","value":false},{"test":"distance_to_nearest_player","operator":">","value":16}]},"event":"minecraft:ambient_night"},{"filters":{"all_of":[{"test":"is_sleeping","value":false},{"any_of":[{"test":"is_daytime","value":true},{"test":"distance_to_nearest_player","operator":"<=","value":16}]}]},"event":"minecraft:ambient_normal"}]},"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"is_daytime","value":false},"event":"minecraft:{name}_configure_night"},{"filters":{"test":"is_daytime","value":true},"event":"minecraft:{name}_configure_day"}]}},"events":{"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":95,"add":{"component_groups":["minecraft:{name}_adult","minecraft:{name}_with_item","minecraft:docile_fox"]}},{"weight":5,"add":{"component_groups":["minecraft:{name}_baby","minecraft:docile_fox"]}}]},{"filters":{"test":"is_snow_covered","value":true},"add":{"component_groups":["minecraft:{name}_arctic"]}},{"filters":{"test":"is_snow_covered","value":false},"add":{"component_groups":["minecraft:{name}_red"]}}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:{name}_baby","minecraft:trusting_{name}","minecraft:docile_fox"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:{name}_baby"]},"add":{"component_groups":["minecraft:{name}_adult"]}},"minecraft:{name}_configure_thunderstorm":{"remove":{"component_groups":["minecraft:{name}_night","minecraft:{name}_day"]},"add":{"component_groups":["minecraft:{name}_thunderstorm"]}},"minecraft:{name}_configure_day":{"remove":{"component_groups":["minecraft:{name}_night","minecraft:{name}_thunderstorm"]},"add":{"component_groups":["minecraft:{name}_day"]}},"minecraft:{name}_configure_night":{"remove":{"component_groups":["minecraft:{name}_day","minecraft:{name}_thunderstorm"]},"add":{"component_groups":["minecraft:{name}_night"]}},"minecraft:ambient_normal":{"add":{"component_groups":["minecraft:{name}_ambient_normal"]}},"minecraft:ambient_sleep":{"add":{"component_groups":["minecraft:{name}_ambient_sleep"]}},"minecraft:ambient_night":{"add":{"component_groups":["minecraft:{name}_ambient_night"]}},"minecraft:{name}_configure_defending":{"remove":{"component_groups":["minecraft:docile_fox","minecraft:{name}_day","minecraft:{name}_night"]},"add":{"component_groups":["minecraft:defending_fox"]}},"minecraft:{name}_configure_docile_day":{"remove":{"component_groups":["minecraft:defending_fox","minecraft:{name}_night"]},"add":{"component_groups":["minecraft:docile_fox","minecraft:{name}_day"]}},"minecraft:{name}_configure_docile_night":{"remove":{"component_groups":["minecraft:defending_fox","minecraft:{name}_day"]},"add":{"component_groups":["minecraft:docile_fox","minecraft:{name}_night"]}}}}}'},9930:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"temperate_frog":{"minecraft:variant":{"value":0}},"cold_frog":{"minecraft:variant":{"value":1}},"warm_frog":{"minecraft:variant":{"value":2}},"pregnant":{"minecraft:behavior.lay_egg":{"priority":2,"speed_multiplier":1.0,"search_range":10,"search_height":3,"goal_radius":1.7,"target_blocks":["minecraft:water"],"target_materials_above_block":["Air"],"allow_laying_from_below":true,"use_default_animation":false,"lay_seconds":2,"egg_type":"minecraft:frog_spawn","lay_egg_sound":"lay_spawn","on_lay":{"event":"laid_egg","target":"self"}},"minecraft:behavior.move_to_water":{"priority":3,"search_range":20,"search_height":5,"goal_radius":1.5}}},"components":{"minecraft:is_hidden_when_invisible":{},"minecraft:type_family":{"family":["frog","mob"]},"minecraft:collision_box":{"width":0.5,"height":0.55},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true,"breathes_air":true,"generates_bubbles":false},"minecraft:nameable":{},"minecraft:health":{"value":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":true,"damage_modifier":-5}},"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":true,"can_swim":true,"can_walk":true,"can_sink":false,"avoid_damage_blocks":true},"minecraft:movement.amphibious":{},"minecraft:movement":{"value":0.1},"minecraft:underwater_movement":{"value":0.15},"minecraft:jump.static":{},"minecraft:physics":{},"minecraft:pushable":{},"minecraft:leashable":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:breedable":{"require_tame":false,"causes_pregnancy":true,"breeds_with":{"mate_type":"minecraft:frog","baby_type":"minecraft:tadpole","breed_event":{"event":"become_pregnant"}},"breed_items":["slime_ball"]},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":2.0},"minecraft:behavior.breed":{"priority":4},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.25,"can_tempt_vertically":true,"items":["slime_ball"]},"minecraft:behavior.move_to_land":{"priority":6,"search_range":30,"search_height":8,"search_count":80,"goal_radius":2},"minecraft:behavior.eat_mob":{"priority":7,"run_speed":2.0,"eat_animation_time":0.30,"pull_in_force":0.75,"reach_mob_distance":1.75,"eat_mob_sound":"tongue","loot_table":"loot_tables/entities/frog.json"},"minecraft:behavior.nearest_attackable_target":{"priority":8,"within_radius":16,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"slime"},{"test":"is_variant","subject":"other","operator":"==","value":1}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"magmacube"},{"test":"is_variant","subject":"other","operator":"==","value":1}]},"max_dist":16}],"must_see":true},"minecraft:behavior.croak":{"priority":9,"interval":[10,20],"duration":4.5,"filters":{"all_of":[{"test":"in_water","value":false},{"test":"in_lava","value":false}]}},"minecraft:behavior.jump_to_block":{"priority":10,"search_width":8,"search_height":4,"minimum_path_length":2,"minimum_distance":1,"scale_factor":0.6,"max_velocity":1,"cooldown_range":[5,7],"preferred_blocks":["minecraft:waterlily","minecraft:big_dripleaf"],"preferred_blocks_chance":0.5,"forbidden_blocks":["minecraft:water"]},"minecraft:behavior.random_stroll":{"priority":11},"minecraft:behavior.look_at_player":{"priority":12,"target_distance":6.0,"probability":0.02}},"events":{"minecraft:entity_spawned":{"sequence":[{"add":{"component_groups":["temperate_frog"]}},{"filters":{"any_of":[{"test":"has_biome_tag","value":"desert"},{"test":"has_biome_tag","value":"jungle"},{"test":"has_biome_tag","value":"savanna"},{"test":"has_biome_tag","value":"mesa"},{"test":"has_biome_tag","value":"nether"},{"all_of":[{"test":"has_biome_tag","value":"warm"},{"test":"has_biome_tag","value":"ocean"}]},{"all_of":[{"test":"has_biome_tag","value":"lukewarm"},{"test":"has_biome_tag","value":"ocean"}]},{"test":"has_biome_tag","value":"mangrove_swamp"}]},"add":{"component_groups":["warm_frog"]}},{"filters":{"any_of":[{"test":"has_biome_tag","value":"mountain"},{"all_of":[{"test":"has_biome_tag","value":"mountains"},{"test":"has_biome_tag","operator":"!=","value":"meadow"},{"test":"has_biome_tag","operator":"!=","value":"stony_peaks"}]},{"test":"has_biome_tag","value":"ice"},{"test":"has_biome_tag","value":"cold"},{"test":"has_biome_tag","value":"frozen"},{"test":"has_biome_tag","value":"the_end"},{"test":"has_biome_tag","value":"deep_dark"}]},"add":{"component_groups":["cold_frog"]}}]},"spawn_temperate":{"add":{"component_groups":["temperate_frog"]}},"spawn_cold":{"add":{"component_groups":["cold_frog"]}},"spawn_warm":{"add":{"component_groups":["warm_frog"]}},"minecraft:entity_transformed":{"sequence":[{"add":{"component_groups":["temperate_frog"]}},{"filters":{"any_of":[{"test":"has_biome_tag","value":"desert"},{"test":"has_biome_tag","value":"jungle"},{"test":"has_biome_tag","value":"savanna"},{"test":"has_biome_tag","value":"mesa"},{"test":"has_biome_tag","value":"nether"},{"all_of":[{"test":"has_biome_tag","value":"warm"},{"test":"has_biome_tag","value":"ocean"}]},{"all_of":[{"test":"has_biome_tag","value":"lukewarm"},{"test":"has_biome_tag","value":"ocean"}]},{"test":"has_biome_tag","value":"mangrove_swamp"}]},"add":{"component_groups":["warm_frog"]}},{"filters":{"any_of":[{"test":"has_biome_tag","value":"mountain"},{"all_of":[{"test":"has_biome_tag","value":"mountains"},{"test":"has_biome_tag","operator":"!=","value":"meadow"},{"test":"has_biome_tag","operator":"!=","value":"stony_peaks"}]},{"test":"has_biome_tag","value":"ice"},{"test":"has_biome_tag","value":"cold"},{"test":"has_biome_tag","value":"frozen"},{"test":"has_biome_tag","value":"the_end"},{"test":"has_biome_tag","value":"deep_dark"}]},"add":{"component_groups":["cold_frog"]}}]},"become_pregnant":{"add":{"component_groups":["pregnant"]}},"laid_egg":{"remove":{"component_groups":["pregnant"]}}}}}'},9009:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:ghast","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:fire_immune":{},"minecraft:nameable":{},"minecraft:health":{"value":10,"max":10},"minecraft:collision_box":{"width":4,"height":4},"minecraft:movement":{"value":0.03},"minecraft:navigation.float":{"can_path_over_water":true},"minecraft:behavior.float_wander":{"priority":2,"must_reach":true},"minecraft:can_fly":{},"minecraft:loot":{"table":"loot_tables/entities/ghast.json"},"minecraft:shooter":{"def":"minecraft:fireball"},"minecraft:type_family":{"family":["ghast","monster","mob"]},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:jump.static":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.ranged_attack":{"priority":1,"attack_radius":64,"charge_shoot_trigger":2,"charge_charged_trigger":1},"minecraft:follow_range":{"value":64,"max":64},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":28}],"must_see":true},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}}}}'},4188:e=>{e.exports='{"format_version":"1.13.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:glow_squid","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:squid_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5}}},"components":{"minecraft:is_hidden_when_invisible":{},"minecraft:experience_reward":{"on_death":"!query.is_baby && query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:nameable":{},"minecraft:type_family":{"family":["squid","mob"]},"minecraft:collision_box":{"width":0.95,"height":0.95},"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:loot":{"table":"loot_tables/entities/glow_squid.json"},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_air":false,"breathes_water":true},"minecraft:movement":{"value":0.2},"minecraft:navigation.walk":{"can_path_over_water":true,"can_sink":false},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:behavior.squid_move_away_from_ground":{"priority":1},"minecraft:behavior.squid_flee":{"priority":2},"minecraft:behavior.squid_idle":{"priority":2},"minecraft:behavior.squid_dive":{"priority":2},"minecraft:behavior.squid_out_of_water":{"priority":2},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"remove":{},"add":{}},{"weight":5,"remove":{},"add":{"component_groups":["minecraft:squid_baby"]}}]}}}}'},1195:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:goat","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"goat_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1},"minecraft:ageable":{"duration":1200,"feed_items":"wheat","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:attack":{"damage":1}},"goat_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/goat.json"},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":0.6},"minecraft:breedable":{"require_tame":false,"breed_items":"wheat","breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"mutation_factor":{"variant":0}},"minecraft:attack":{"damage":2}},"goat_default":{"minecraft:variant":{"value":0}},"goat_screamer":{"minecraft:variant":{"value":1}},"interact_default":{"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:is_baby"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","domain":"hand","subject":"other","value":"bucket:0"}]}},"use_item":true,"transform_to_item":"bucket:1","play_sounds":"milk_suspiciously","interact_text":"action.interact.milk"}]}},"interact_screamer":{"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:is_baby"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","domain":"hand","subject":"other","value":"bucket:0"}]}},"use_item":true,"transform_to_item":"bucket:1","play_sounds":"milk.screamer","interact_text":"action.interact.milk"}]}},"ram_default":{"minecraft:behavior.ram_attack":{"priority":5,"run_speed":0.7,"ram_speed":1.8,"min_ram_distance":4,"ram_distance":7,"knockback_force":2.5,"knockback_height":0.04,"pre_ram_sound":"pre_ram","ram_impact_sound":"ram_impact","cooldown_range":[30,300],"on_start":[{"event":"start_event","target":"self"}]}},"ram_screamer":{"minecraft:behavior.ram_attack":{"priority":5,"run_speed":0.7,"ram_speed":1.8,"min_ram_distance":4,"ram_distance":7,"knockback_force":2.5,"knockback_height":0.04,"pre_ram_sound":"pre_ram.screamer","ram_impact_sound":"ram_impact.screamer","cooldown_range":[30,300],"on_start":[{"event":"start_event","target":"self"}]}},"attack_cooldown":{"minecraft:attack_cooldown":{"attack_cooldown_time":[30,40],"attack_cooldown_complete_event":{"event":"attack_cooldown_complete_event","target":"self"}}}},"components":{"minecraft:is_hidden_when_invisible":{},"minecraft:behavior.jump_to_block":{"priority":8,"search_width":10,"search_height":10,"minimum_path_length":8,"minimum_distance":1,"scale_factor":0.6,"cooldown_range":[30,60]},"minecraft:genetics":{"mutation_rate":0.02,"genes":[{"name":"goat_variant","use_simplified_breeding":true,"allele_range":{"range_min":1,"range_max":100},"genetic_variants":[{"main_allele":{"range_min":1,"range_max":2},"birth_event":{"event":"minecraft:born_screamer","target":"self"}},{"main_allele":{"range_min":3,"range_max":100},"birth_event":{"event":"minecraft:born_default","target":"self"}}]}]},"minecraft:type_family":{"family":["goat","animal"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true,"blocks_to_avoid":[{"name":"minecraft:powder_snow"}]},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:collision_box":{"width":0.9,"height":1.3},"minecraft:nameable":{},"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.4},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":1,"items":["wheat"]},"minecraft:behavior.nearest_attackable_target":{"priority":6,"within_radius":16,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","operator":"!=","value":"goat"},{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:attack_cooldown"}]},"max_dist":16}],"must_see":true},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":true,"damage_modifier":-20}},"minecraft:behavior.random_stroll":{"priority":9,"speed_multiplier":0.6},"minecraft:behavior.look_at_player":{"priority":10,"look_distance":6,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":11},"minecraft:leashable":{"soft_distance":4,"hard_distance":6,"max_distance":10},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"add":{"component_groups":["goat_adult"]}},{"weight":5,"add":{"component_groups":["goat_baby"]}}]},"minecraft:entity_born":{"add":{"component_groups":["goat_baby"]}},"minecraft:born_default":{"add":{"component_groups":["goat_default","ram_default","interact_default"]}},"minecraft:born_screamer":{"add":{"component_groups":["goat_screamer","ram_screamer","interact_screamer"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["goat_baby"]},"add":{"component_groups":["goat_adult"]}},"start_event":{"add":{"component_groups":["attack_cooldown"]}},"attack_cooldown_complete_event":{"remove":{"component_groups":["attack_cooldown"]}}}}}'},6187:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:guardian","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:{name}_aggressive":{"minecraft:behavior.nearest_attackable_target":{"priority":1,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"squid"}]},"max_dist":16}],"attack_interval_min":1.0,"must_see":true},"minecraft:target_nearby_sensor":{"inside_range":3.0,"outside_range":4.0,"on_inside_range":{"event":"minecraft:target_too_close","target":"self"}},"minecraft:behavior.guardian_attack":{"priority":4}},"minecraft:{name}_passive":{"minecraft:timer":{"time":[1,3],"looping":false,"time_down_event":{"event":"minecraft:target_far_enough","target":"self"}},"minecraft:behavior.avoid_mob_type":{"priority":1,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":8,"walk_speed_multiplier":1,"sprint_speed_multiplier":1}]}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 10 : 0"},"minecraft:nameable":{},"minecraft:collision_box":{"width":0.85,"height":0.85},"minecraft:health":{"value":30,"max":30},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.12},"minecraft:underwater_movement":{"value":0.12},"minecraft:attack":{"damage":5},"minecraft:follow_range":{"value":16,"max":16},"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":false,"can_swim":true,"can_walk":false,"can_breach":true},"minecraft:movement.sway":{},"minecraft:jump.static":{},"minecraft:breathable":{"breathes_water":true},"minecraft:loot":{"table":"loot_tables/entities/guardian.json"},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:home":{"restriction_radius":16},"minecraft:behavior.nearest_attackable_target":{"priority":1,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"squid"}]},"max_dist":16}],"attack_interval_min":1.0,"must_see":true},"minecraft:target_nearby_sensor":{"inside_range":3.0,"outside_range":4.0,"on_inside_range":{"event":"minecraft:target_too_close","target":"self"}},"minecraft:behavior.guardian_attack":{"priority":4},"minecraft:behavior.move_towards_home_restriction":{"priority":5,"speed_multiplier":1.0},"minecraft:behavior.random_swim":{"priority":7,"speed_multiplier":1.0,"interval":80,"avoid_surface":false},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":12.0,"probability":0.01},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:type_family":{"family":["guardian","monster","mob"]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:target_too_close":{"remove":{"component_groups":["minecraft:{name}_aggressive"]},"add":{"component_groups":["minecraft:{name}_passive"]}},"minecraft:target_far_enough":{"remove":{"component_groups":["minecraft:{name}_passive"]},"add":{"component_groups":["minecraft:{name}_aggressive"]}}}}}'},784:e=>{e.exports='{"format_version":"1.21.110","minecraft:entity":{"description":{"identifier":"{identifier}","spawn_category":"creature","is_spawnable":true,"is_summonable":true,"properties":{"minecraft:can_move":{"type":"bool","default":true,"client_sync":true}}},"components":{"minecraft:type_family":{"family":["happy_ghast","mob"]},"minecraft:collision_box":{"width":4.0,"height":4.0},"minecraft:physics":{"has_gravity":false},"minecraft:can_fly":{},"minecraft:jump.static":{},"minecraft:follow_range":{"value":16,"max":16},"minecraft:is_tamed":{},"minecraft:leashable":{"on_unleash":{"event":"minecraft:on_unleashed","target":"self"},"presets":[{"hard_distance":10,"max_distance":14}]},"minecraft:nameable":{},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava"},"cause":"lava","damage_per_tick":4}]},"minecraft:damage_sensor":{"triggers":[{"cause":"fall","deals_damage":"no"}]},"minecraft:conditional_bandwidth_optimization":{},"minecraft:is_hidden_when_invisible":{},"minecraft:renders_when_invisible":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:body_rotation_always_follows_head":{}},"component_groups":{"minecraft:baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.2375},"minecraft:health":{"value":20,"max":20},"minecraft:breathable":{"total_supply":5,"suffocate_time":0,"breathes_air":true,"breathes_water":true},"minecraft:ageable":{"duration":1200,"feed_items":["minecraft:snowball"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:movement":{"value":0.3},"minecraft:flying_speed":{"value":0.0833333},"minecraft:movement.hover":{},"minecraft:navigation.hover":{"can_path_over_water":true,"avoid_damage_blocks":true,"can_path_from_air":true,"avoid_water":true},"minecraft:behavior.follow_mob":{"priority":6,"search_range":16,"stop_distance":5,"speed_multiplier":1.1,"use_home_position_restriction":true,"preferred_actor_type":"player","filters":{"all_of":[{"test":"is_underwater","subject":"other","value":false},{"test":"is_baby","subject":"other","value":false},{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"armadillo"},{"test":"is_family","subject":"other","value":"bee"},{"test":"is_family","subject":"other","value":"camel"},{"test":"is_family","subject":"other","value":"cat"},{"test":"is_family","subject":"other","value":"chicken"},{"test":"is_family","subject":"other","value":"cow"},{"test":"is_family","subject":"other","value":"donkey"},{"test":"is_family","subject":"other","value":"fox"},{"test":"is_family","subject":"other","value":"goat"},{"test":"is_family","subject":"other","value":"happy_ghast"},{"test":"is_family","subject":"other","value":"horse"},{"test":"is_family","subject":"other","value":"skeleton_horse"},{"test":"is_family","subject":"other","value":"llama"},{"test":"is_family","subject":"other","value":"mule"},{"test":"is_family","subject":"other","value":"ocelot"},{"test":"is_family","subject":"other","value":"panda"},{"test":"is_family","subject":"other","value":"parrot"},{"test":"is_family","subject":"other","value":"pig"},{"test":"is_family","subject":"other","value":"polar_bear"},{"test":"is_family","subject":"other","value":"rabbit"},{"test":"is_family","subject":"other","value":"sheep"},{"test":"is_family","subject":"other","value":"sniffer"},{"test":"is_family","subject":"other","value":"strider"},{"test":"is_family","subject":"other","value":"villager"},{"test":"is_family","subject":"other","value":"villager_v2"},{"test":"is_family","subject":"other","value":"wolf"}]}]}},"minecraft:behavior.panic":{"priority":2,"speed_multiplier":2.0},"minecraft:behavior.tempt":{"priority":3,"can_tempt_vertically":true,"items":["minecraft:snowball"],"speed_multiplier":1.25,"within_radius":16,"on_tempt_end":{"event":"minecraft:on_stop_tempting"}},"minecraft:behavior.random_hover":{"priority":8,"xz_dist":8,"y_dist":8,"y_offset":-1,"interval":1,"hover_height":[1,4]},"minecraft:home":{"restriction_radius":32,"restriction_type":"random_movement"}},"minecraft:adult":{"minecraft:health":{"value":20,"max":20},"minecraft:leashable_to":{},"minecraft:breathable":{"total_supply":5,"suffocate_time":0,"breathes_air":true,"breathes_water":false},"minecraft:navigation.float":{"can_path_over_water":true,"avoid_damage_blocks":true,"avoid_water":true},"minecraft:entity_sensor":{"find_players_only":true,"relative_range":false,"subsensors":[{"event":"minecraft:become_mobile","cooldown":0.0,"y_offset":4.5,"range":[3.5,2.0],"minimum_count":0,"maximum_count":0,"event_filters":{"all_of":[{"test":"is_vehicle_family","subject":"other","operator":"not","value":"happy_ghast"},{"test":"actor_health","operator":">","value":0}]}},{"event":"minecraft:become_immobile","cooldown":0.0,"y_offset":4.5,"range":[3.0,1.5],"minimum_count":1,"event_filters":{"all_of":[{"test":"is_vehicle_family","subject":"other","operator":"not","value":"happy_ghast"},{"test":"actor_health","operator":">","value":0}]}}]},"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"}},"minecraft:adult_mobile":{"minecraft:movement":{"value":0.016},"minecraft:flying_speed":{"value":0.016},"minecraft:knockback_resistance":{"value":0.0},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:behavior.float_wander":{"priority":7,"must_reach":true,"random_reselect":true,"navigate_around_surface":true,"additional_collision_buffer":true,"allow_navigating_through_liquids":false,"use_home_position_restriction":true,"surface_xz_dist":16,"surface_y_dist":16,"float_duration":[2.0,7.0]}},"minecraft:adult_immobile":{"minecraft:movement":{"value":0.0},"minecraft:flying_speed":{"value":0.0},"minecraft:knockback_resistance":{"value":1.0},"minecraft:pushable":{"is_pushable":false,"is_pushable_by_piston":true},"minecraft:body_rotation_blocked":{},"minecraft:rotation_axis_aligned":{},"minecraft:is_collidable":{}},"minecraft:adult_unharnessed":{"minecraft:behavior.float_tempt":{"priority":4,"can_tempt_vertically":true,"items":["minecraft:snowball","minecraft:black_harness","minecraft:blue_harness","minecraft:brown_harness","minecraft:cyan_harness","minecraft:gray_harness","minecraft:green_harness","minecraft:light_blue_harness","minecraft:light_gray_harness","minecraft:lime_harness","minecraft:magenta_harness","minecraft:orange_harness","minecraft:pink_harness","minecraft:purple_harness","minecraft:red_harness","minecraft:white_harness","minecraft:yellow_harness"],"within_radius":16,"stop_distance":7,"on_tempt_end":{"event":"minecraft:on_stop_tempting"}},"minecraft:home":{"restriction_radius":64,"restriction_type":"random_movement"},"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"any_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"black_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"blue_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"brown_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"cyan_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"gray_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"green_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"light_blue_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"light_gray_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"lime_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"magenta_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"orange_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"pink_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"purple_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"red_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"white_harness"},{"test":"has_equipment","subject":"other","domain":"hand","value":"yellow_harness"}]},"event":"minecraft:on_harnessed","target":"self"},"use_item":true,"equip_item_slot":"slot.armor.body","play_sounds":"armor.equip_generic","interact_text":"action.interact.equipharness"}]}},"minecraft:adult_harnessed":{"minecraft:home":{"restriction_radius":32,"restriction_type":"random_movement"},"minecraft:rideable":{"seat_count":4,"family_types":["player"],"dismount_mode":"on_top_center","on_rider_enter_event":"minecraft:on_passenger_mount","on_rider_exit_event":"minecraft:on_passenger_dismount","interact_text":"action.interact.ride.horse","seats":[{"min_rider_count":0,"max_rider_count":4,"position":[0.0,3.8,1.7],"third_person_camera_radius":8.0,"camera_relax_distance_smoothing":6.0},{"min_rider_count":1,"max_rider_count":4,"position":[-1.7,3.8,0.0],"third_person_camera_radius":8.0,"camera_relax_distance_smoothing":6.0},{"min_rider_count":2,"max_rider_count":4,"position":[0.0,3.8,-1.7],"third_person_camera_radius":8.0,"camera_relax_distance_smoothing":6.0},{"min_rider_count":3,"max_rider_count":4,"position":[1.7,3.8,0.0],"third_person_camera_radius":8.0,"camera_relax_distance_smoothing":6.0}]},"minecraft:free_camera_controlled":{"strafe_speed_modifier":1.0,"backwards_movement_modifier":0.5},"minecraft:vertical_movement_action":{"vertical_velocity":0.5},"minecraft:behavior.player_ride_tamed":{"priority":1},"minecraft:behavior.float_tempt":{"priority":5,"can_tempt_vertically":true,"items":["minecraft:snowball"],"within_radius":16,"stop_distance":7,"on_tempt_end":{"event":"minecraft:on_stop_tempting"}},"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"is_sneak_held","subject":"other","value":false},{"test":"has_equipment","subject":"other","domain":"hand","value":"shears"},{"test":"rider_count","subject":"self","operator":"equals","value":0}]},"event":"minecraft:on_unharnessed","target":"self"},"hurt_item":1,"drop_item_slot":"slot.armor.body","drop_item_y_offset":5,"play_sounds":"armor.unequip_generic","interact_text":"action.interact.removeharness","vibration":"shear"}]}},"minecraft:adult_with_passengers":{"minecraft:ambient_sound_interval":{"value":30.0}},"minecraft:adult_without_passengers":{"minecraft:ambient_sound_interval":{"value":5.0}}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"minecraft:spawn_adult"},{"weight":5,"trigger":"minecraft:spawn_baby"}]},"minecraft:spawn_adult":{"add":{"component_groups":["minecraft:adult","minecraft:adult_mobile","minecraft:adult_unharnessed","minecraft:adult_without_passengers"]},"set_property":{"minecraft:can_move":true}},"minecraft:spawn_baby":{"add":{"component_groups":["minecraft:baby"]}},"minecraft:ageable_grow_up":{"add":{"component_groups":["minecraft:adult","minecraft:adult_mobile","minecraft:adult_unharnessed","minecraft:adult_without_passengers"]},"remove":{"component_groups":["minecraft:baby"]},"set_property":{"minecraft:can_move":true}},"minecraft:become_immobile":{"filters":{"test":"bool_property","domain":"minecraft:can_move","value":true},"add":{"component_groups":["minecraft:adult_immobile"]},"remove":{"component_groups":["minecraft:adult_mobile"]},"set_property":{"minecraft:can_move":false},"stop_movement":{}},"minecraft:become_mobile":{"filters":{"test":"bool_property","domain":"minecraft:can_move","value":false},"add":{"component_groups":["minecraft:adult_mobile"]},"remove":{"component_groups":["minecraft:adult_immobile"]},"set_property":{"minecraft:can_move":true}},"minecraft:on_harnessed":{"remove":{"component_groups":["minecraft:adult_unharnessed"]},"add":{"component_groups":["minecraft:adult_harnessed"]},"set_home_position":{}},"minecraft:on_unharnessed":{"remove":{"component_groups":["minecraft:adult_harnessed"]},"add":{"component_groups":["minecraft:adult_unharnessed"]},"set_home_position":{}},"minecraft:on_unleashed":{"set_home_position":{}},"minecraft:on_passenger_mount":{"sequence":[{"filters":{"test":"rider_count","subject":"self","operator":"equals","value":1},"add":{"component_groups":["minecraft:adult_with_passengers"]},"remove":{"component_groups":["minecraft:adult_without_passengers"]},"play_sound":{"sound":"attach"}}]},"minecraft:on_passenger_dismount":{"sequence":[{"filters":{"test":"rider_count","subject":"self","operator":"equals","value":0},"add":{"component_groups":["minecraft:adult_without_passengers"]},"remove":{"component_groups":["minecraft:adult_with_passengers"]},"play_sound":{"sound":"detach"}},{"set_home_position":{},"trigger":"minecraft:on_player_detected_above"}]},"minecraft:on_stop_tempting":{"set_home_position":{}}}}}'},5309:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"zombification_sensor":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"in_nether","subject":"self","operator":"==","value":false},"event":"start_zombification_event"}}},"start_zombification":{"minecraft:is_shaking":{},"minecraft:environment_sensor":{"triggers":{"filters":{"test":"in_nether","subject":"self","operator":"==","value":true},"event":"stop_zombification_event"}},"minecraft:timer":{"looping":false,"time":15,"time_down_event":{"event":"become_zombie_event"}}},"become_zombie":{"minecraft:transformation":{"into":"minecraft:zoglin","transformation_sound":"converted_to_zombified","keep_level":true}},"angry_hoglin":{"minecraft:angry":{"duration":10,"broadcast_anger":true,"broadcast_range":16,"calm_event":{"event":"become_calm_event","target":"self"},"angry_sound":"angry","sound_interval":{"range_min":2.0,"range_max":5.0}}},"attack_cooldown":{"minecraft:attack_cooldown":{"attack_cooldown_time":[10.0,15.0],"attack_cooldown_complete_event":{"event":"attack_cooldown_complete_event","target":"self"}}},"minecraft:hoglin_baby":{"minecraft:type_family":{"family":["hoglin","hoglin_baby","mob"]},"minecraft:is_baby":{},"minecraft:movement":{"value":0.36},"minecraft:behavior.melee_attack":{"priority":4,"speed_multiplier":1,"track_target":true,"reach_multiplier":1.0,"cooldown_time":0.75},"minecraft:attack":{"damage":1.0},"minecraft:scale":{"value":0.5},"minecraft:collision_box":{"width":0.85,"height":0.85},"minecraft:custom_hit_test":{"hitboxes":[{"width":1.0,"height":0.85,"pivot":[0,0.5,0]}]},"minecraft:ageable":{"duration":1200,"feed_items":["crimson_fungus"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1},"minecraft:rideable":{"seat_count":3,"family_types":["piglin"],"seats":[{"position":[0.0,0.9,-0.3],"lock_rider_rotation":0},{"position":[0.0,2.4,-0.3],"lock_rider_rotation":0},{"position":[0.0,3.9,-0.3],"lock_rider_rotation":0}]},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1}},"minecraft:hoglin_adult":{"minecraft:collision_box":{"width":0.9,"height":0.9},"minecraft:movement":{"value":0.3},"minecraft:custom_hit_test":{"hitboxes":[{"width":2.0,"height":1.75,"pivot":[0,1,0]}]},"minecraft:group_size":{"radius":32,"filters":{"all_of":[{"test":"has_component","operator":"!=","value":"minecraft:is_baby"},{"test":"is_family","value":"hoglin"}]}},"minecraft:behavior.hurt_by_target":{"priority":2},"minecraft:on_target_acquired":{"event":"become_angry_event","target":"self"},"minecraft:loot":{"table":"loot_tables/entities/hoglin.json"},"minecraft:behavior.melee_attack":{"priority":4,"speed_multiplier":1,"track_target":true,"reach_multiplier":2.5,"cooldown_time":2},"minecraft:attack":{"damage":[3,9]},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":0.6},"minecraft:breedable":{"require_tame":false,"love_filters":{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:attack_cooldown"},"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["crimson_fungus"]}},"unhuntable_adult":{"minecraft:type_family":{"family":["hoglin","hoglin_adult","mob"]}},"huntable_adult":{"minecraft:type_family":{"family":["hoglin","hoglin_adult","hoglin_huntable","mob"]}}},"components":{"minecraft:nameable":{},"minecraft:health":{"value":40,"max":40},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:knockback_resistance":{"value":0.5},"minecraft:behavior.nearest_attackable_target":{"priority":4,"within_radius":16.0,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:attack_cooldown"}]},"max_dist":16}],"must_see":true},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:behavior.avoid_mob_type":{"priority":0,"remove_target":true,"entity_types":[{"filters":{"all_of":[{"test":"has_target","subject":"other","value":true},{"test":"is_family","subject":"other","value":"piglin"}]},"check_if_outnumbered":true,"max_dist":10,"sprint_speed_multiplier":1.2}],"avoid_mob_sound":"retreat","sound_interval":{"range_min":2.0,"range_max":5.0}},"minecraft:behavior.avoid_block":{"priority":1,"tick_interval":5,"search_range":8,"search_height":4,"walk_speed_modifier":1,"sprint_speed_modifier":1,"avoid_block_sound":"retreat","sound_interval":{"range_min":2.0,"range_max":5.0},"target_selection_method":"nearest","target_blocks":["minecraft:warped_fungus","minecraft:portal","minecraft:respawn_anchor"],"on_escape":[{"event":"escaped_event","target":"self"}]},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":0.4},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6.0,"probability":0.02},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"spawn_adult"},{"weight":5,"trigger":"spawn_baby"}]},"minecraft:entity_born":{"trigger":"spawn_baby"},"spawn_adult":{"add":{"component_groups":["minecraft:hoglin_adult","huntable_adult","zombification_sensor"]}},"spawn_baby":{"add":{"component_groups":["minecraft:hoglin_baby","zombification_sensor"]}},"stop_zombification_event":{"add":{"component_groups":["zombification_sensor"]},"remove":{"component_groups":["start_zombification"]}},"become_zombie_event":{"add":{"component_groups":["become_zombie"]}},"start_zombification_event":{"add":{"component_groups":["start_zombification"]},"remove":{"component_groups":["zombification_sensor"]}},"spawn_adult_unhuntable":{"add":{"component_groups":["minecraft:hoglin_adult","unhuntable_adult","zombification_sensor"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:hoglin_baby"]},"add":{"component_groups":["minecraft:hoglin_adult","huntable_adult"]}},"become_angry_event":{"add":{"component_groups":["angry_hoglin"]}},"become_calm_event":{"remove":{"component_groups":["angry_hoglin"]}},"escaped_event":{"add":{"component_groups":["attack_cooldown"]},"remove":{"component_groups":["angry_hoglin"]}},"attack_cooldown_complete_event":{"remove":{"component_groups":["attack_cooldown"]}}}}}'},4193:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:horse_baby":{"minecraft:is_baby":{},"minecraft:scale_by_age":{"start_scale":0.5,"end_scale":1.0},"minecraft:ageable":{"duration":1200,"feed_items":[{"item":"wheat","growth":0.016667},{"item":"sugar","growth":0.025},{"item":"hay_block","growth":0.15},{"item":"apple","growth":0.05},{"item":"golden_carrot","growth":0.05},{"item":"golden_apple","growth":0.2},{"item":"appleEnchanted","growth":0.2}],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":4,"speed_multiplier":1.0}},"minecraft:horse_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/horse.json"},"minecraft:behavior.run_around_like_crazy":{"priority":1,"speed_multiplier":1.2},"minecraft:behavior.breed":{"priority":2,"speed_multiplier":1.0}},"minecraft:horse_wild":{"minecraft:rideable":{"seat_count":1,"family_types":["player","zombie"],"interact_text":"action.interact.mount","seats":{"position":[0.0,1.1,-0.2]}},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:tamemount":{"min_temper":0,"max_temper":100,"feed_text":"action.interact.feed","ride_text":"action.interact.mount","feed_items":[{"item":"wheat","temper_mod":3},{"item":"sugar","temper_mod":3},{"item":"apple","temper_mod":3},{"item":"golden_carrot","temper_mod":5},{"item":"golden_apple","temper_mod":10},{"item":"appleEnchanted","temper_mod":10}],"auto_reject_items":[{"item":"horsearmorleather"},{"item":"horsearmoriron"},{"item":"horsearmorgold"},{"item":"horsearmordiamond"},{"item":"saddle"}],"tame_event":{"event":"minecraft:on_tame","target":"self"}}},"minecraft:horse_tamed":{"minecraft:is_tamed":{},"minecraft:rideable":{"seat_count":1,"crouching_skip_interact":true,"family_types":["player"],"interact_text":"action.interact.ride.horse","seats":{"position":[0.0,1.1,-0.2]}},"minecraft:inventory":{"inventory_size":2,"container_type":"horse"},"minecraft:breedable":{"require_tame":true,"inherit_tamed":false,"breeds_with":[{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}}],"breed_items":["golden_carrot","golden_apple","appleEnchanted"]},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.2,"items":["golden_apple","appleEnchanted","golden_carrot"]}},"minecraft:horse_saddled":{"minecraft:is_saddled":{},"minecraft:input_ground_controlled":{},"minecraft:can_power_jump":{},"minecraft:behavior.player_ride_tamed":{}},"minecraft:base_white":{"minecraft:variant":{"value":0}},"minecraft:base_creamy":{"minecraft:variant":{"value":1}},"minecraft:base_chestnut":{"minecraft:variant":{"value":2}},"minecraft:base_brown":{"minecraft:variant":{"value":3}},"minecraft:base_black":{"minecraft:variant":{"value":4}},"minecraft:base_gray":{"minecraft:variant":{"value":5}},"minecraft:base_darkbrown":{"minecraft:variant":{"value":6}},"minecraft:markings_none":{"minecraft:mark_variant":{"value":0}},"minecraft:markings_white_details":{"minecraft:mark_variant":{"value":1}},"minecraft:markings_white_fields":{"minecraft:mark_variant":{"value":2}},"minecraft:markings_white_dots":{"minecraft:mark_variant":{"value":3}},"minecraft:markings_black_dots":{"minecraft:mark_variant":{"value":4}}},"components":{"minecraft:equippable":{"slots":[{"slot":0,"item":"saddle","accepted_items":["saddle"],"on_equip":{"event":"minecraft:horse_saddled"},"on_unequip":{"event":"minecraft:horse_unsaddled"}},{"slot":1,"item":"horsearmoriron","accepted_items":["horsearmorleather","horsearmoriron","horsearmorgold","horsearmordiamond"]}]},"minecraft:type_family":{"family":["horse","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":1.4,"height":1.6},"minecraft:health":{"value":{"range_min":15,"range_max":30}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":{"range_min":0.1125,"range_max":0.3375}},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:nameable":{},"minecraft:horse.jump_strength":{"value":{"range_min":0.4,"range_max":1.0}},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:healable":{"items":[{"item":"wheat","heal_amount":2},{"item":"sugar","heal_amount":1},{"item":"hay_block","heal_amount":20},{"item":"apple","heal_amount":3},{"item":"golden_carrot","heal_amount":4},{"item":"golden_apple","heal_amount":10},{"item":"appleEnchanted","heal_amount":10}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":3,"speed_multiplier":1.2},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.7},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":36,"add":{"component_groups":["minecraft:horse_adult","minecraft:horse_wild"]}},{"weight":9,"add":{"component_groups":["minecraft:horse_baby"]}}]},{"randomize":[{"weight":1,"add":{"component_groups":["minecraft:base_white"]}},{"weight":1,"add":{"component_groups":["minecraft:base_creamy"]}},{"weight":1,"add":{"component_groups":["minecraft:base_chestnut"]}},{"weight":1,"add":{"component_groups":["minecraft:base_brown"]}},{"weight":1,"add":{"component_groups":["minecraft:base_black"]}},{"weight":1,"add":{"component_groups":["minecraft:base_gray"]}},{"weight":1,"add":{"component_groups":["minecraft:base_darkbrown"]}}]},{"randomize":[{"weight":1,"add":{"component_groups":["minecraft:markings_none"]}},{"weight":1,"add":{"component_groups":["minecraft:markings_white_details"]}},{"weight":1,"add":{"component_groups":["minecraft:markings_white_fields"]}},{"weight":1,"add":{"component_groups":["minecraft:markings_white_dots"]}},{"weight":1,"add":{"component_groups":["minecraft:markings_black_dots"]}}]}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:horse_baby"]}},"minecraft:on_tame":{"remove":{"component_groups":["minecraft:horse_wild"]},"add":{"component_groups":["minecraft:horse_tamed"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:horse_baby"]},"add":{"component_groups":["minecraft:horse_adult","minecraft:horse_wild"]}},"minecraft:horse_saddled":{"add":{"component_groups":["minecraft:horse_saddled"]}},"minecraft:horse_unsaddled":{"remove":{"component_groups":["minecraft:horse_saddled"]}},"minecraft:make_white":{"add":{"component_groups":["minecraft:base_white"]}},"minecraft:make_creamy":{"add":{"component_groups":["minecraft:base_creamy"]}},"minecraft:make_chestnut":{"add":{"component_groups":["minecraft:base_chestnut"]}},"minecraft:make_brown":{"add":{"component_groups":["minecraft:base_brown"]}},"minecraft:make_black":{"add":{"component_groups":["minecraft:base_black"]}},"minecraft:make_gray":{"add":{"component_groups":["minecraft:base_gray"]}},"minecraft:make_darkbrown":{"add":{"component_groups":["minecraft:base_darkbrown"]}}}}}'},4577:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:look_to_start_zombie_transformation":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":true},"event":"minecraft:start_transforming"}}},"minecraft:start_zombie_transformation":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":false},"event":"minecraft:stop_transforming"}},"minecraft:timer":{"looping":false,"time":30,"time_down_event":{"event":"minecraft:convert_to_zombie"}}},"minecraft:convert_to_zombie":{"minecraft:transformation":{"into":"minecraft:zombie","transformation_sound":"convert_to_drowned","drop_equipment":true,"delay":{"value":15}},"minecraft:is_shaking":{}},"minecraft:convert_to_baby_zombie":{"minecraft:transformation":{"into":"minecraft:zombie","transformation_sound":"convert_to_drowned","drop_equipment":true,"delay":{"value":15}},"minecraft:is_shaking":{}},"minecraft:zombie_husk_baby":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:is_baby":{},"minecraft:scale":{"value":0.53125},"minecraft:movement":{"value":0.35}},"minecraft:zombie_husk_adult":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:movement":{"value":0.23},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,1.1,-0.35],"lock_rider_rotation":0}},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true},"minecraft:scale":{"value":1.0625}},"minecraft:zombie_husk_jockey":{"minecraft:behavior.find_mount":{"priority":1,"within_radius":16}}},"components":{"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:nameable":{},"minecraft:type_family":{"family":["husk","zombie","undead","monster","mob"]},"minecraft:loot":{"table":"loot_tables/entities/zombie.json"},"minecraft:equipment":{"table":"loot_tables/entities/zombie_equipment.json"},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:attack":{"damage":3,"effect_name":"hunger","effect_duration":30},"minecraft:variant":{"value":2},"minecraft:conditional_bandwidth_optimization":{},"minecraft:navigation.walk":{"is_amphibious":true,"can_pass_doors":true,"can_break_doors":true,"avoid_portals":false},"minecraft:annotation.break_door":{},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:shareables":{"items":[{"item":"minecraft:netherite_sword","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_sword","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_sword","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:golden_sword","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:stone_sword","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:wooden_sword","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_helmet","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_helmet","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_helmet","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_helmet","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_helmet","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_helmet","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_chestplate","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_chestplate","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_chestplate","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_chestplate","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_chestplate","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_chestplate","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_leggings","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_leggings","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_leggings","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_leggings","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_leggings","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_leggings","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_boots","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_boots","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_boots","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_boots","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_boots","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_boots","want_amount":1,"surplus_amount":1,"priority":5}]},"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":true},"event":"minecraft:start_transforming"}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.equip_item":{"priority":2},"minecraft:behavior.melee_attack":{"priority":3},"minecraft:behavior.stomp_turtle_egg":{"priority":4,"speed_multiplier":1,"search_range":10,"search_height":2,"goal_radius":1.14,"interval":20},"minecraft:behavior.pickup_items":{"priority":6,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0,"pickup_based_on_chance":true,"can_pickup_any_item":true},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"reselect_targets":true,"within_radius":25.0,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":35},{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},"max_dist":35,"must_see":false},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":35}]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":9500,"remove":{},"add":{"component_groups":["minecraft:zombie_husk_adult"]}},{"weight":425,"remove":{},"add":{"component_groups":["minecraft:zombie_husk_baby"]}},{"weight":75,"remove":{},"add":{"component_groups":["minecraft:zombie_husk_baby","minecraft:zombie_husk_jockey"]}}]},"minecraft:start_transforming":{"add":{"component_groups":["minecraft:start_zombie_transformation"]},"remove":{"component_groups":["minecraft:look_to_start_zombie_transformation"]}},"minecraft:stop_transforming":{"add":{"component_groups":["minecraft:look_to_start_zombie_transformation"]},"remove":{"component_groups":["minecraft:start_zombie_transformation"]}},"minecraft:convert_to_zombie":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:convert_to_zombie"]},"remove":{"component_groups":["minecraft:start_zombie_transformation"]}},{"filters":{"test":"has_component","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:convert_to_baby_zombie"]},"remove":{"component_groups":["minecraft:start_zombie_transformation"]}}]}}}}'},1613:e=>{e.exports='{"format_version":"1.13.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:iron_golem","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:player_created":{"minecraft:behavior.hurt_by_target":{"priority":2,"entity_types":{"filters":{"all_of":[{"test":"is_family","subject":"other","operator":"!=","value":"player"},{"test":"is_family","subject":"other","operator":"!=","value":"creeper"}]}}}},"minecraft:village_created":{"minecraft:behavior.defend_village_target":{"priority":1,"must_reach":true,"attack_chance":0.05,"entity_types":{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"mob"},{"test":"is_family","subject":"other","value":"player"}]}}},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"defender","update_interval_base":60,"update_interval_variant":40,"can_find_poi":false,"can_migrate":true,"first_founding_reward":0}}},"components":{"minecraft:type_family":{"family":["irongolem","mob"]},"minecraft:nameable":{},"minecraft:collision_box":{"width":1.4,"height":2.9},"minecraft:loot":{"table":"loot_tables/entities/iron_golem.json"},"minecraft:health":{"value":100,"max":100},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":false,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:attack":{"damage":{"range_min":7,"range_max":21}},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:knockback_resistance":{"value":1.0},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{"mass":2.0},"minecraft:preferred_path":{"max_fall_blocks":1,"jump_cost":5,"default_block_cost":1.5,"preferred_path_blocks":[{"cost":0,"blocks":["grass_path"]},{"cost":1,"blocks":["cobblestone","stone","stonebrick","sandstone","mossy_cobblestone","stone_slab","stone_slab2","stone_slab3","stone_slab4","double_stone_slab","double_stone_slab2","double_stone_slab3","double_stone_slab4","wooden_slab","double_wooden_slab","planks","brick_block","nether_brick","red_nether_brick","end_bricks","red_sandstone","stained_glass","glass","glowstone","prismarine","emerald_block","diamond_block","lapis_block","gold_block","redstone_block","purple_glazed_terracotta","white_glazed_terracotta","orange_glazed_terracotta","magenta_glazed_terracotta","light_blue_glazed_terracotta","yellow_glazed_terracotta","lime_glazed_terracotta","pink_glazed_terracotta","gray_glazed_terracotta","silver_glazed_terracotta","cyan_glazed_terracotta","blue_glazed_terracotta","brown_glazed_terracotta","green_glazed_terracotta","red_glazed_terracotta","black_glazed_terracotta"]},{"cost":50,"blocks":["bed","lectern","composter","grindstone","blast_furnace","smoker","fletching_table","cartography_table","brewing_stand","smithing_table","cauldron","barrel","loom","stonecutter"]}]},"minecraft:behavior.target_when_pushed":{"priority":1,"percent_chance":5.0,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"monster"},{"test":"is_family","subject":"other","operator":"!=","value":"creeper"}]}}]},"minecraft:behavior.melee_attack":{"priority":1,"track_target":true},"minecraft:behavior.move_towards_target":{"priority":2,"speed_multiplier":0.9,"within_radius":32},"minecraft:behavior.move_through_village":{"priority":3,"speed_multiplier":0.6,"only_at_night":true},"minecraft:behavior.move_towards_dwelling_restriction":{"priority":4,"speed_multiplier":1},"minecraft:behavior.offer_flower":{"priority":5},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.6,"xz_dist":16},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:behavior.nearest_attackable_target":{"priority":3,"must_reach":true,"must_see":true,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"monster"},{"test":"is_family","subject":"other","operator":"!=","value":"creeper"}]},"within_default":10},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"hoglin"},{"test":"is_difficulty","operator":"!=","value":"peaceful"}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"zoglin"},{"test":"is_difficulty","operator":"!=","value":"peaceful"}]},"max_dist":16}]},"minecraft:behavior.hurt_by_target":{"priority":2,"entity_types":{"filters":{"test":"is_family","subject":"other","operator":"!=","value":"creeper"}}},"minecraft:persistent":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:follow_range":{"value":64},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:from_player":{"add":{"component_groups":["minecraft:player_created"]}},"minecraft:from_village":{"add":{"component_groups":["minecraft:village_created"]}}}}}'},9509:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:llama","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:llama_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":[{"item":"wheat","growth":0.1},{"item":"hay_block","growth":0.9}],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":1.0}},"minecraft:llama_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/llama.json"},"minecraft:collision_box":{"width":0.9,"height":1.87},"minecraft:behavior.breed":{"priority":4,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":true,"inherit_tamed":false,"love_filters":{"test":"is_mark_variant","subject":"self","operator":"!=","value":1},"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["hay_block"]}},"minecraft:llama_wandering_trader":{"minecraft:mark_variant":{"value":1},"minecraft:on_friendly_anger":{"event":"minecraft:defend_wandering_trader","target":"self"},"minecraft:environment_sensor":{"triggers":{"filters":{"all_of":[{"test":"is_leashed","subject":"self","value":false},{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:is_tamed"}]},"event":"minecraft:on_tame"}},"minecraft:persistent":{}},"minecraft:strength_1":{"minecraft:strength":{"value":1,"max":5}},"minecraft:strength_2":{"minecraft:strength":{"value":2,"max":5}},"minecraft:strength_3":{"minecraft:strength":{"value":3,"max":5}},"minecraft:strength_4":{"minecraft:strength":{"value":4,"max":5}},"minecraft:strength_5":{"minecraft:strength":{"value":5,"max":5}},"minecraft:llama_creamy":{"minecraft:variant":{"value":0}},"minecraft:llama_white":{"minecraft:variant":{"value":1}},"minecraft:llama_brown":{"minecraft:variant":{"value":2}},"minecraft:llama_gray":{"minecraft:variant":{"value":3}},"minecraft:llama_wild":{"minecraft:rideable":{"seat_count":1,"family_types":["player"],"interact_text":"action.interact.mount","seats":{"position":[0.0,1.25,-0.3]}},"minecraft:tamemount":{"min_temper":0,"max_temper":30,"feed_text":"action.interact.feed","ride_text":"action.interact.mount","feed_items":[{"item":"wheat","temper_mod":3},{"item":"hay_block","temper_mod":6}],"auto_reject_items":[{"item":"horsearmorleather"},{"item":"horsearmoriron"},{"item":"horsearmorgold"},{"item":"horsearmordiamond"},{"item":"saddle"}],"tame_event":{"event":"minecraft:on_tame","target":"self"}}},"minecraft:llama_tamed":{"minecraft:is_tamed":{},"minecraft:rideable":{"seat_count":1,"crouching_skip_interact":true,"family_types":["player"],"interact_text":"action.interact.ride.horse","seats":{"position":[0.0,1.1,-0.2]}},"minecraft:inventory":{"inventory_size":16,"container_type":"horse","additional_slots_per_strength":3},"minecraft:equippable":{"slots":[{"slot":1,"item":"carpet","accepted_items":["carpet"]}]}},"minecraft:llama_unchested":{"minecraft:interact":{"interactions":[{"play_sounds":"armor.equip_generic","on_interact":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","domain":"hand","subject":"other","value":"chest"}]},"event":"minecraft:on_chest","target":"self"},"use_item":true,"interact_text":"action.interact.attachchest"}]}},"minecraft:llama_chested":{"minecraft:is_chested":{}},"minecraft:llama_angry":{"minecraft:angry":{"duration":4,"broadcast_anger":false,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:behavior.ranged_attack":{"priority":2,"attack_radius":64,"charge_shoot_trigger":2,"charge_charged_trigger":1}},"minecraft:llama_angry_wolf":{"minecraft:angry":{"duration":-1,"broadcast_anger":false,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:behavior.ranged_attack":{"priority":2,"attack_radius":64,"charge_shoot_trigger":2,"charge_charged_trigger":1}},"minecraft:llama_defend_trader":{"minecraft:angry":{"duration":10,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:behavior.ranged_attack":{"priority":2,"attack_radius":64,"charge_shoot_trigger":2,"charge_charged_trigger":1}},"minecraft:in_caravan":{"minecraft:damage_sensor":{"triggers":{"cause":"all","deals_damage":true}}}},"components":{"minecraft:type_family":{"family":["llama","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:mark_variant":{"value":0},"minecraft:health":{"value":{"range_min":15,"range_max":30}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:follow_range":{"value":40,"max":40},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0,"can_be_stolen":true},"minecraft:balloonable":{},"minecraft:healable":{"items":[{"item":"wheat","heal_amount":2},{"item":"hay_block","heal_amount":10}]},"minecraft:shooter":{"def":"minecraft:llama_spit"},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.run_around_like_crazy":{"priority":1,"speed_multiplier":1.2},"minecraft:behavior.follow_caravan":{"priority":3,"speed_multiplier":2.1,"entity_count":10,"entity_types":{"filters":{"test":"is_family","subject":"other","value":"llama"}}},"minecraft:behavior.panic":{"priority":4,"speed_multiplier":1.2},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.7},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:behavior.mount_pathing":{"priority":1,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true},"minecraft:behavior.hurt_by_target":{"priority":1,"hurt_owner":true},"minecraft:conditional_bandwidth_optimization":{},"minecraft:damage_sensor":{"triggers":{"cause":"all","deals_damage":true,"on_damage":{"filters":{"test":"in_caravan","value":false},"event":"minecraft:become_angry"}}},"minecraft:behavior.nearest_attackable_target":{"priority":2,"attack_interval":16,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"wolf"},{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_tamed"}]},"max_dist":10}],"must_see":false,"must_reach":true},"minecraft:on_target_acquired":{"filters":{"all_of":[{"test":"is_family","subject":"target","value":"wolf"},{"test":"has_component","subject":"target","operator":"!=","value":"minecraft:is_tamed"}]},"event":"minecraft:mad_at_wolf","target":"self"},"minecraft:on_target_escape":{"filters":{"all_of":[{"test":"is_family","subject":"target","value":"wolf"},{"test":"has_component","subject":"target","operator":"!=","value":"minecraft:is_tamed"}]},"event":"minecraft:on_calm","target":"self"},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":90,"trigger":"minecraft:spawn_adult"},{"weight":10,"trigger":"minecraft:spawn_baby"}]}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:llama_baby"]}},"minecraft:from_wandering_trader":{"sequence":[{"add":{"component_groups":["minecraft:llama_adult","minecraft:llama_wandering_trader"]}},{"trigger":"minecraft:add_attributes"}]},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:llama_baby"]},"add":{"component_groups":["minecraft:llama_adult","minecraft:llama_wild"]}},"minecraft:on_tame":{"remove":{"component_groups":["minecraft:llama_wild"]},"add":{"component_groups":["minecraft:llama_tamed","minecraft:llama_unchested"]}},"minecraft:join_caravan":{"add":{"component_groups":["minecraft:in_caravan"]}},"minecraft:leave_caravan":{"remove":{"component_groups":["minecraft:in_caravan"]}},"minecraft:mad_at_wolf":{"add":{"component_groups":["minecraft:llama_angry_wolf"]}},"minecraft:defend_wandering_trader":{"add":{"component_groups":["minecraft:llama_defend_trader"]}},"minecraft:become_angry":{"add":{"component_groups":["minecraft:llama_angry"]}},"minecraft:on_calm":{"remove":{"component_groups":["minecraft:llama_angry","minecraft:llama_angry_wolf","minecraft:llama_defend_trader"]}},"minecraft:on_chest":{"remove":{"component_groups":["minecraft:llama_unchested"]},"add":{"component_groups":["minecraft:llama_chested"]}},"minecraft:add_attributes":{"sequence":[{"randomize":[{"weight":32,"add":{"component_groups":["minecraft:strength_1"]}},{"weight":32,"add":{"component_groups":["minecraft:strength_2"]}},{"weight":32,"add":{"component_groups":["minecraft:strength_3"]}},{"weight":2,"add":{"component_groups":["minecraft:strength_4"]}},{"weight":2,"add":{"component_groups":["minecraft:strength_5"]}}]},{"randomize":[{"weight":25,"add":{"component_groups":["minecraft:llama_creamy"]}},{"weight":25,"add":{"component_groups":["minecraft:llama_white"]}},{"weight":25,"add":{"component_groups":["minecraft:llama_brown"]}},{"weight":25,"add":{"component_groups":["minecraft:llama_gray"]}}]}]},"minecraft:spawn_baby":{"add":{"component_groups":["minecraft:llama_baby"]},"trigger":"minecraft:add_attributes"},"minecraft:spawn_adult":{"add":{"component_groups":["minecraft:llama_adult","minecraft:llama_wild"]},"trigger":"minecraft:add_attributes"}}}}'},4627:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:magma_cube","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:slime_large":{"minecraft:collision_box":{"width":2.08,"height":2.08},"minecraft:health":{"value":16,"max":16},"minecraft:movement":{"value":0.75},"minecraft:attack":{"damage":6},"minecraft:loot":{"table":"loot_tables/entities/magma_cube.json"}},"minecraft:slime_medium":{"minecraft:collision_box":{"width":0.78,"height":0.78},"minecraft:health":{"value":4,"max":4},"minecraft:movement":{"value":0.66},"minecraft:attack":{"damage":4},"minecraft:loot":{"table":"loot_tables/entities/magma_cube.json"}},"minecraft:slime_small":{"minecraft:collision_box":{"width":0.52,"height":0.52},"minecraft:health":{"value":1,"max":1},"minecraft:movement":{"value":0.6},"minecraft:attack":{"damage":2}},"minecraft:slime_calm":{"minecraft:movement.jump":{"jump_delay":[2.0,6.0]}},"minecraft:slime_aggressive":{"minecraft:movement.jump":{"jump_delay":[0.667,2.0]}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? query.variant : 0"},"minecraft:type_family":{"family":["magmacube","monster","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_lava":true},"minecraft:nameable":{},"minecraft:fire_immune":{},"minecraft:burns_in_daylight":false,"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true},"minecraft:jump.static":{},"minecraft:movement.jump":{"jump_delay":[2.0,6.0]},"minecraft:can_climb":{},"minecraft:on_target_acquired":{"event":"minecraft:become_aggressive","target":"self"},"minecraft:on_target_escape":{"event":"minecraft:become_calm","target":"self"},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.slime_float":{"priority":1,"jump_chance_percentage":0.8,"speed_multiplier":1.2},"minecraft:behavior.slime_attack":{"priority":3},"minecraft:behavior.slime_random_direction":{"priority":4,"add_random_time_range":3,"turn_range":360,"min_change_direction_time":2.0},"minecraft:behavior.slime_keep_on_jumping":{"priority":5,"speed_multiplier":1.0},"minecraft:behavior.nearest_attackable_target":{"priority":2,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":16}],"must_see":true},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["minecraft:slime_calm"]}},"minecraft:become_calm":{"add":{"component_groups":["minecraft:slime_calm"]}},"minecraft:become_aggressive":{"add":{"component_groups":["minecraft:slime_aggressive"]}}}}}'},65:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:mooshroom_become_cow":{"minecraft:transformation":{"into":"minecraft:cow"}},"minecraft:cow_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":"wheat","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1.1}},"minecraft:cow_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/mooshroom.json"},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"breed_items":"wheat","breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"deny_parents_variant":{"chance":0.00098,"min_variant":0,"max_variant":1}},"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"bowl"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_component","operator":"!=","value":"minecraft:transformation"}]},"event":"minecraft:flowerless","target":"self"},"add_items":{"table":"loot_tables/gameplay/entities/mooshroom_milking.json"},"use_item":true,"play_sounds":"milk_suspiciously","interact_text":"action.interact.moostew"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:2"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":7}]},"event":"minecraft:ate_allium","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:3"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":3}]},"event":"minecraft:ate_bluet","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:1"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":6}]},"event":"minecraft:ate_orchid","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:9"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":1}]},"event":"minecraft:ate_cornflower","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"yellow_flower"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":5}]},"event":"minecraft:ate_dandelion","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:10"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":4}]},"event":"minecraft:ate_lily","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:8"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":8}]},"event":"minecraft:ate_daisy","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:0"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":0}]},"event":"minecraft:ate_poppy","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"any_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:4"},{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:5"},{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:6"},{"test":"has_equipment","subject":"other","domain":"hand","value":"red_flower:7"}],"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":2}]},"event":"minecraft:ate_tulip","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"wither_rose"},{"test":"is_family","subject":"other","value":"player"},{"test":"is_variant","subject":"self","operator":"==","value":1},{"test":"is_mark_variant","subject":"self","operator":"!=","value":9}]},"event":"minecraft:ate_rose","target":"self"},"use_item":true,"play_sounds":"eat","particle_on_start":{"particle_type":"smoke","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.feed"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"shears"},{"test":"has_component","operator":"!=","value":"minecraft:transformation"},{"test":"is_variant","subject":"self","operator":"==","value":0}]},"event":"become_cow","target":"self"},"use_item":false,"hurt_item":1,"play_sounds":"shear","spawn_items":{"table":"loot_tables/entities/mooshroom_shear.json"},"particle_on_start":{"particle_type":"largeexplode","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.mooshear"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"shears"},{"test":"has_component","operator":"!=","value":"minecraft:transformation"},{"test":"is_variant","subject":"self","operator":"==","value":1}]},"event":"become_cow","target":"self"},"use_item":false,"hurt_item":1,"play_sounds":"shear","spawn_items":{"table":"loot_tables/entities/brown_mooshroom_shear.json"},"particle_on_start":{"particle_type":"largeexplode","particle_y_offset":0.25,"particle_offset_towards_interactor":true},"interact_text":"action.interact.mooshear"},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"bucket:0"},{"test":"is_family","subject":"other","value":"player"}]}},"use_item":true,"transform_to_item":"bucket:1","play_sounds":"milk","interact_text":"action.interact.milk"}]}},"minecraft:mooshroom_fed_nothing":{"minecraft:mark_variant":{"value":-1}},"minecraft:mooshroom_brown_fed_poppy":{"minecraft:mark_variant":{"value":0}},"minecraft:mooshroom_brown_fed_cornflower":{"minecraft:mark_variant":{"value":1}},"minecraft:mooshroom_brown_fed_tulips":{"minecraft:mark_variant":{"value":2}},"minecraft:mooshroom_brown_fed_azure_bluet":{"minecraft:mark_variant":{"value":3}},"minecraft:mooshroom_brown_fed_lily_of_the_valley":{"minecraft:mark_variant":{"value":4}},"minecraft:mooshroom_brown_fed_dandelion":{"minecraft:mark_variant":{"value":5}},"minecraft:mooshroom_brown_fed_blue_orchid":{"minecraft:mark_variant":{"value":6}},"minecraft:mooshroom_brown_fed_allium":{"minecraft:mark_variant":{"value":7}},"minecraft:mooshroom_brown_fed_oxeye_daisy":{"minecraft:mark_variant":{"value":8}},"minecraft:mooshroom_brown_fed_wither_rose":{"minecraft:mark_variant":{"value":9}},"minecraft:mooshroom_red":{"minecraft:variant":{"value":0}},"minecraft:mooshroom_brown":{"minecraft:variant":{"value":1}}},"components":{"minecraft:type_family":{"family":["mushroomcow","mob"]},"minecraft:mark_variant":{"value":-1},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.9,"height":1.3},"minecraft:nameable":{},"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,1.105,0.0]}},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":1.25,"items":["wheat"]},"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":1.1},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{},"minecraft:damage_sensor":{"triggers":[{"on_damage":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"lightning"},{"test":"is_variant","subject":"self","operator":"==","value":0}]},"event":"minecraft:become_brown"},"deals_damage":false,"on_damage_sound_event":"convert_mooshroom"},{"on_damage":{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"lightning"},{"test":"is_variant","subject":"self","operator":"==","value":1}]},"event":"minecraft:become_red"},"deals_damage":false,"on_damage_sound_event":"convert_mooshroom"}]}},"events":{"become_cow":{"remove":{},"add":{"component_groups":["minecraft:mooshroom_become_cow"]}},"minecraft:entity_spawned":{"randomize":[{"weight":95,"remove":{},"add":{"component_groups":["minecraft:cow_adult","minecraft:mooshroom_red"]}},{"weight":5,"remove":{},"add":{"component_groups":["minecraft:cow_baby","minecraft:mooshroom_red"]}}]},"minecraft:entity_born":{"remove":{},"add":{"component_groups":["minecraft:cow_baby"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:cow_baby"]},"add":{"component_groups":["minecraft:cow_adult"]}},"minecraft:flowerless":{"add":{"component_groups":["minecraft:mooshroom_fed_nothing"]}},"minecraft:ate_allium":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_allium"]}},"minecraft:ate_cornflower":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_cornflower"]}},"minecraft:ate_lily":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_lily_of_the_valley"]}},"minecraft:ate_rose":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_wither_rose"]}},"minecraft:ate_orchid":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_blue_orchid"]}},"minecraft:ate_daisy":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_oxeye_daisy"]}},"minecraft:ate_tulip":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_tulips"]}},"minecraft:ate_bluet":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_azure_bluet"]}},"minecraft:ate_poppy":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_poppy"]}},"minecraft:ate_dandelion":{"add":{"component_groups":["minecraft:mooshroom_brown_fed_dandelion"]}},"minecraft:become_red":{"remove":{"component_groups":["minecraft:mooshroom_brown"]},"add":{"component_groups":["minecraft:mooshroom_red","minecraft:mooshroom_fed_nothing"]}},"minecraft:become_brown":{"remove":{"component_groups":["minecraft:mooshroom_red"]},"add":{"component_groups":["minecraft:mooshroom_brown","minecraft:mooshroom_fed_nothing"]}},"minecraft:become_brown_adult":{"remove":{"component_groups":["minecraft:mooshroom_red"]},"add":{"component_groups":["minecraft:mooshroom_brown","minecraft:cow_adult","minecraft:mooshroom_fed_nothing"]}},"minecraft:become_red_adult":{"remove":{"component_groups":["minecraft:mooshroom_brown","minecraft:cow_baby"]},"add":{"component_groups":["minecraft:mooshroom_red","minecraft:cow_adult"]}}}}}'},3373:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:mule_baby":{"minecraft:is_baby":{},"minecraft:scale_by_age":{"start_scale":0.5,"end_scale":1.0},"minecraft:ageable":{"duration":1200,"feed_items":[{"item":"wheat","growth":0.016667},{"item":"sugar","growth":0.025},{"item":"hay_block","growth":0.15},{"item":"apple","growth":0.05},{"item":"golden_carrot","growth":0.05},{"item":"golden_apple","growth":0.2},{"item":"appleEnchanted","growth":0.2}],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":4,"speed_multiplier":1.0}},"minecraft:mule_adult":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/horse.json"},"minecraft:behavior.run_around_like_crazy":{"priority":1,"speed_multiplier":1.2}},"minecraft:mule_wild":{"minecraft:rideable":{"seat_count":1,"family_types":["player","zombie"],"interact_text":"action.interact.mount","seats":{"position":[0.0,0.975,-0.2]}},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:tamemount":{"min_temper":0,"max_temper":100,"feed_text":"action.interact.feed","ride_text":"action.interact.mount","feed_items":[{"item":"wheat","temper_mod":3},{"item":"sugar","temper_mod":3},{"item":"apple","temper_mod":3},{"item":"golden_carrot","temper_mod":5},{"item":"golden_apple","temper_mod":10},{"item":"appleEnchanted","temper_mod":10}],"auto_reject_items":[{"item":"horsearmorleather"},{"item":"horsearmoriron"},{"item":"horsearmorgold"},{"item":"horsearmordiamond"},{"item":"saddle"}],"tame_event":{"event":"minecraft:on_tame","target":"self"}}},"minecraft:mule_tamed":{"minecraft:is_tamed":{},"minecraft:equippable":{"slots":[{"slot":0,"item":"saddle","accepted_items":["saddle"],"on_equip":{"event":"minecraft:mule_saddled"},"on_unequip":{"event":"minecraft:mule_unsaddled"}}]},"minecraft:rideable":{"seat_count":1,"crouching_skip_interact":true,"family_types":["player"],"interact_text":"action.interact.ride.horse","seats":{"position":[0.0,0.975,-0.2]}},"minecraft:inventory":{"inventory_size":16,"container_type":"horse"},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.2,"items":["apple","carrot","golden_apple","appleEnchanted","golden_carrot","carrotOnAStick","hay_block","sugar","bread","wheat"]}},"minecraft:mule_unchested":{"minecraft:interact":{"interactions":[{"play_sounds":"armor.equip_generic","on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"chest"},{"test":"is_family","subject":"other","value":"player"}]},"event":"minecraft:on_chest","target":"self"},"use_item":true,"interact_text":"action.interact.attachchest"}]}},"minecraft:mule_chested":{"minecraft:is_chested":{}},"minecraft:mule_saddled":{"minecraft:is_saddled":{},"minecraft:input_ground_controlled":{},"minecraft:can_power_jump":{},"minecraft:behavior.player_ride_tamed":{}}},"components":{"minecraft:type_family":{"family":["mule","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":1.4,"height":1.6},"minecraft:health":{"value":{"range_min":15,"range_max":30}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.175},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:nameable":{},"minecraft:horse.jump_strength":{"value":0.5},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:healable":{"items":[{"item":"wheat","heal_amount":2},{"item":"sugar","heal_amount":1},{"item":"hay_block","heal_amount":20},{"item":"apple","heal_amount":3},{"item":"golden_carrot","heal_amount":4},{"item":"golden_apple","heal_amount":10},{"item":"appleEnchanted","heal_amount":10}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.2},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.7},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":80,"add":{"component_groups":["minecraft:mule_adult","minecraft:mule_wild"]}},{"weight":20,"add":{"component_groups":["minecraft:mule_baby"]}}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:mule_baby"]}},"minecraft:on_tame":{"remove":{"component_groups":["minecraft:mule_wild"]},"add":{"component_groups":["minecraft:mule_tamed","minecraft:mule_unchested"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:mule_baby"]},"add":{"component_groups":["minecraft:mule_adult","minecraft:mule_wild"]}},"minecraft:on_chest":{"remove":{"component_groups":["minecraft:mule_unchested"]},"add":{"component_groups":["minecraft:mule_chested"]}},"minecraft:mule_saddled":{"add":{"component_groups":["minecraft:mule_saddled"]}},"minecraft:mule_unsaddled":{"remove":{"component_groups":["minecraft:mule_saddled"]}}}}}'},7111:e=>{e.exports='{"format_version":"1.19.30","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:npc","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:damage_sensor":{"triggers":{"cause":"all","deals_damage":false}},"minecraft:type_family":{"family":["npc","mob"]},"minecraft:fire_immune":true,"minecraft:movement":{"value":0.5},"minecraft:loot":{"table":"loot_tables/empty.json"},"minecraft:collision_box":{"width":0.6,"height":2.1},"minecraft:behavior.look_at_player":{"priority":0,"look_distance":6.0,"probability":0.02},"minecraft:persistent":{},"minecraft:npc":{"npc_data":{"portrait_offsets":{"translate":[-7,50,0],"scale":[1.75,1.75,1.75]},"picker_offsets":{"translate":[0,20,0],"scale":[1.7,1.7,1.7]},"skin_list":[{"variant":0}]}},"minecraft:nameable":{"always_show":false,"allow_name_tag_renaming":false},"minecraft:physics":{}}}}'},4528:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:ocelot","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:ocelot_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":["fish","salmon"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}}},"minecraft:ocelot_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/ocelot.json"},"minecraft:scale":{"value":1}},"minecraft:ocelot_wild":{"minecraft:trusting":{"probability":0.33,"trust_items":["fish","salmon"],"trust_event":{"event":"minecraft:on_trust","target":"self"}},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":0.5,"within_radius":16,"can_get_scared":true,"items":["fish","salmon"]},"minecraft:behavior.avoid_mob_type":{"priority":5,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":10,"walk_speed_multiplier":0.8,"sprint_speed_multiplier":1.33}]},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.35,0.0]}}},"minecraft:ocelot_trusting":{"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":0.5,"within_radius":16,"items":["fish","salmon"]},"minecraft:breedable":{"require_tame":false,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["fish","salmon"]}},"minecraft:ocelot_tame":{"minecraft:is_tamed":{},"minecraft:health":{"value":20,"max":20},"minecraft:sittable":{},"minecraft:behavior.follow_owner":{"priority":4,"speed_multiplier":1.0,"start_distance":10,"stop_distance":2},"minecraft:behavior.stay_while_sitting":{"priority":3},"minecraft:behavior.ocelot_sit_on_block":{"priority":6,"speed_multiplier":1.0}}},"components":{"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:attack_damage":{"value":4},"minecraft:nameable":{},"minecraft:type_family":{"family":["ocelot","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.6,"height":0.7},"minecraft:movement":{"value":0.3},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25},"minecraft:behavior.nearest_attackable_target":{"priority":1,"reselect_targets":true,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"chicken"},"max_dist":8},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":8}]},"minecraft:behavior.mount_pathing":{"priority":1,"speed_multiplier":1.25,"target_dist":0,"track_target":true},"minecraft:behavior.leap_at_target":{"priority":3,"target_dist":0.3},"minecraft:behavior.ocelotattack":{"priority":4,"cooldown_time":1.0,"x_max_rotation":30.0,"y_max_head_rotation":30.0,"max_distance":15.0,"max_sneak_range":15.0,"max_sprint_range":4.0,"reach_multiplier":2.0,"sneak_speed_multiplier":0.6,"sprint_speed_multiplier":1.33,"walk_speed_multiplier":0.8},"minecraft:behavior.random_stroll":{"priority":8,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":9},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0,"on_leash":{"event":"minecraft:on_leash","target":"self"},"on_unleash":{"event":"minecraft:on_unleash","target":"self"}},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":3,"remove":{},"add":{"component_groups":["minecraft:ocelot_adult","minecraft:ocelot_wild"]}},{"weight":1,"remove":{},"add":{"component_groups":["minecraft:ocelot_baby","minecraft:ocelot_wild"]}}]}]},"minecraft:entity_born":{"sequence":[{"remove":{},"add":{"component_groups":["minecraft:ocelot_baby","minecraft:ocelot_trusting"]}}]},"minecraft:entity_born_wild":{"remove":{"component_groups":["minecraft:ocelot_trusting"]},"add":{"component_groups":["minecraft:ocelot_baby","minecraft:ocelot_wild"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:ocelot_baby"]},"add":{"component_groups":["minecraft:ocelot_adult"]}},"minecraft:on_trust":{"sequence":[{"remove":{"component_groups":["minecraft:ocelot_wild"]}},{"add":{"component_groups":["minecraft:ocelot_trusting"]}}]},"minecraft:on_leash":{"add":{"component_groups":["minecraft:ocelot_leashed"]}},"minecraft:on_unleash":{"remove":{"component_groups":["minecraft:ocelot_leashed"]}}}}}'},88:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:panda_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.4},"minecraft:ageable":{"duration":1200,"feed_items":"bamboo","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.roll":{"priority":12,"probability":0.0016},"minecraft:behavior.follow_parent":{"priority":13,"speed_multiplier":1.1},"minecraft:on_target_acquired":{"event":"minecraft:on_scared","target":"self"},"minecraft:behavior.sneeze":{"priority":7,"probability":0.0001666,"cooldown_time":1.0,"within_radius":10.0,"entity_types":[{"filters":{"all_of":[{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},{"test":"is_family","subject":"other","value":"panda"},{"test":"in_water","subject":"other","operator":"!=","value":true},{"test":"on_ground","operator":"==","value":true}]},"max_dist":10}],"drop_item_chance":0.001,"loot_table":"loot_tables/entities/panda_sneeze.json","prepare_sound":"presneeze","prepare_time":1.0,"sound":"sneeze"}},"minecraft:panda_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/panda.json"},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"blend_attributes":false,"environment_requirements":{"blocks":"bamboo","count":8,"radius":5},"breed_items":"bamboo","breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"mutation_factor":{"variant":1.0}},"minecraft:on_target_acquired":{"event":"minecraft:become_angry","target":"self"},"minecraft:on_target_escape":{"event":"minecraft:on_calm","target":"self"},"minecraft:attack":{"damage":2.0},"minecraft:behavior.melee_attack":{"priority":2,"attack_once":true,"track_target":true,"reach_multiplier":1.0}},"minecraft:panda_lazy":{"minecraft:variant":{"value":1},"minecraft:behavior.lay_down":{"priority":5,"interval":400,"random_stop_interval":2000},"minecraft:behavior.random_sitting":{"priority":6,"start_chance":0.02,"stop_chance":0.2,"cooldown":25,"min_sit_time":15},"minecraft:behavior.snacking":{"priority":3,"snacking_cooldown":17.5,"snacking_cooldown_min":10,"snacking_stop_chance":0.0011,"items":["bamboo","cake"]},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":2.5},"minecraft:movement":{"value":0.07}},"minecraft:panda_worried":{"minecraft:variant":{"value":2},"minecraft:behavior.scared":{"priority":1,"sound_interval":20},"minecraft:behavior.avoid_mob_type":{"priority":5,"max_dist":16,"max_flee":20,"entity_types":[{"filters":{"test":"is_family","operator":"!=","subject":"other","value":"panda"},"max_dist":16,"sprint_speed_multiplier":1.5}]}},"minecraft:panda_playful":{"minecraft:variant":{"value":3},"minecraft:behavior.roll":{"priority":12,"probability":0.013}},"minecraft:panda_brown":{"minecraft:variant":{"value":4}},"minecraft:panda_weak":{"minecraft:variant":{"value":5},"minecraft:health":{"value":10,"max":10}},"minecraft:panda_sneezing":{"minecraft:behavior.sneeze":{"priority":7,"probability":0.002,"cooldown_time":1.0,"within_radius":10.0,"entity_types":[{"filters":{"all_of":[{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},{"test":"is_family","subject":"other","value":"panda"},{"test":"in_water","subject":"other","operator":"!=","value":true},{"test":"on_ground","operator":"==","value":true}]},"max_dist":10}],"drop_item_chance":0.001,"loot_table":"loot_tables/entities/panda_sneeze.json","prepare_sound":"presneeze","prepare_time":1.0,"sound":"sneeze"}},"minecraft:panda_aggressive":{"minecraft:type_family":{"family":["panda","panda_aggressive","mob"]},"minecraft:variant":{"value":6},"minecraft:attack":{"damage":6.0},"minecraft:behavior.melee_attack":{"priority":2,"track_target":true,"reach_multiplier":1.0},"minecraft:on_friendly_anger":{"event":"minecraft:on_anger","target":"self"},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25,"ignore_mob_damage":true}},"minecraft:panda_angry":{"minecraft:angry":{"duration":500,"broadcast_anger":true,"broadcast_range":41,"broadcast_filters":{"test":"is_family","operator":"==","value":"panda_aggressive"},"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:on_target_acquired":{}},"minecraft:baby_scared":{"minecraft:angry":{"duration":1,"broadcast_anger":true,"broadcast_range":41,"broadcast_filters":{"test":"is_family","operator":"==","value":"panda_aggressive"},"calm_event":{"event":"minecraft:baby_on_calm","target":"self"}}}},"components":{"minecraft:type_family":{"family":["panda"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:navigation.walk":{"can_float":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:scale":{"value":1.0},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:giveable":{"triggers":{"cooldown":3.0,"items":["bamboo","cake"],"on_give":{"event":"minecraft:on_calm","target":"self"}}},"minecraft:inventory":{"inventory_size":1,"private":true},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:collision_box":{"width":1.7,"height":1.5},"minecraft:nameable":{},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.15},"minecraft:water_movement":{"drag_factor":0.98},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.random_sitting":{"priority":5,"start_chance":0.01,"stop_chance":0.3,"cooldown":30,"min_sit_time":10},"minecraft:behavior.snacking":{"priority":2,"snacking_cooldown":22.5,"snacking_cooldown_min":20,"snacking_stop_chance":0.001334,"items":["bamboo","cake"]},"minecraft:behavior.mount_pathing":{"priority":5,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":1.25,"items":["bamboo"]},"minecraft:behavior.random_stroll":{"priority":14,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25},"minecraft:balloonable":{"mass":1.5},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,1.105,0.0]}},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:variant":{"value":0},"minecraft:conditional_bandwidth_optimization":{},"minecraft:genetics":{"mutation_rate":0.03125,"genes":[{"name":"panda_variant","allele_range":{"range_min":0,"range_max":15},"genetic_variants":[{"main_allele":0,"birth_event":{"event":"minecraft:panda_lazy","target":"self"}},{"main_allele":1,"birth_event":{"event":"minecraft:panda_worried","target":"self"}},{"main_allele":2,"birth_event":{"event":"minecraft:panda_playful","target":"self"}},{"main_allele":3,"birth_event":{"event":"minecraft:panda_aggressive","target":"self"}},{"both_allele":{"range_min":4,"range_max":7},"birth_event":{"event":"minecraft:panda_weak","target":"self"}},{"both_allele":{"range_min":8,"range_max":9},"birth_event":{"event":"minecraft:panda_brown","target":"self"}}]}]}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"add":{"component_groups":["minecraft:panda_adult"]}},{"weight":5,"add":{"component_groups":["minecraft:panda_baby"]}}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:panda_baby"]}},"minecraft:ageable_grow_up":{"sequence":[{"remove":{"component_groups":["minecraft:panda_baby"]}},{"add":{"component_groups":["minecraft:panda_adult"]}},{"filters":{"test":"is_variant","subject":"self","operator":"==","value":3},"add":{"component_groups":["minecraft:panda_playful"]}},{"filters":{"test":"is_variant","subject":"self","operator":"==","value":6},"add":{"component_groups":["minecraft:panda_aggressive"]}}]},"minecraft:panda_lazy":{"add":{"component_groups":["minecraft:panda_lazy"]}},"minecraft:panda_worried":{"add":{"component_groups":["minecraft:panda_worried"]}},"minecraft:panda_playful":{"add":{"component_groups":["minecraft:panda_playful"]}},"minecraft:panda_brown":{"add":{"component_groups":["minecraft:panda_brown"]}},"minecraft:panda_weak":{"sequence":[{"add":{"component_groups":["minecraft:panda_weak"]}},{"filters":{"test":"has_component","operator":"==","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:panda_sneezing"]}}]},"minecraft:panda_aggressive":{"add":{"component_groups":["minecraft:panda_aggressive"]}},"minecraft:on_scared":{"add":{"component_groups":["minecraft:baby_scared"]}},"minecraft:baby_on_calm":{"remove":{"component_groups":["minecraft:baby_scared"]}},"minecraft:become_angry":{"add":{"component_groups":["minecraft:panda_angry"]}},"minecraft:on_calm":{"remove":{"component_groups":["minecraft:panda_angry"]}}}}}'},280:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:parrot","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:parrot_red":{"minecraft:variant":{"value":0}},"minecraft:parrot_blue":{"minecraft:variant":{"value":1}},"minecraft:parrot_green":{"minecraft:variant":{"value":2}},"minecraft:parrot_cyan":{"minecraft:variant":{"value":3}},"minecraft:parrot_silver":{"minecraft:variant":{"value":4}},"minecraft:parrot_adult":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/parrot.json"}},"minecraft:parrot_wild":{"minecraft:type_family":{"family":["parrot_wild","mob"]},"minecraft:tameable":{"probability":0.33,"tame_items":["wheat_seeds","pumpkin_seeds","melon_seeds","beetroot_seeds"],"tame_event":{"event":"minecraft:on_tame","target":"self"}},"minecraft:behavior.random_fly":{"priority":2,"xz_dist":15,"y_dist":1,"y_offset":0,"speed_multiplier":1.0,"can_land_on_trees":true,"avoid_damage_blocks":true},"minecraft:behavior.follow_mob":{"priority":3,"speed_multiplier":1.0,"stop_distance":3,"search_range":20}},"minecraft:parrot_tame":{"minecraft:type_family":{"family":["parrot_tame","mob"]},"minecraft:is_tamed":{},"minecraft:behavior.follow_owner":{"priority":2,"speed_multiplier":1.0,"start_distance":5,"stop_distance":1},"minecraft:sittable":{},"minecraft:behavior.stay_while_sitting":{"priority":1},"minecraft:behavior.find_mount":{"priority":3,"within_radius":16,"avoid_water":true,"start_delay":100,"target_needed":false,"mount_distance":2.0}}},"components":{"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.5,"height":1},"minecraft:nameable":{},"minecraft:health":{"value":6,"max":6},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.4},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:jump.static":{},"minecraft:can_fly":{},"minecraft:navigation.fly":{"can_path_over_water":true,"can_path_from_air":true},"minecraft:movement.fly":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":0,"speed_multiplier":1.25},"minecraft:behavior.look_at_player":{"priority":1,"look_distance":8.0},"minecraft:conditional_bandwidth_optimization":{},"minecraft:healable":{"force_use":true,"filters":{"test":"is_riding","operator":"!=","value":true},"items":[{"item":"cookie","heal_amount":0,"effects":[{"name":"fatal_poison","chance":1.0,"duration":1000,"amplifier":0}]}]},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":20,"add":{"component_groups":["minecraft:parrot_red","minecraft:parrot_adult","minecraft:parrot_wild"]}},{"weight":20,"add":{"component_groups":["minecraft:parrot_blue","minecraft:parrot_adult","minecraft:parrot_wild"]}},{"weight":20,"add":{"component_groups":["minecraft:parrot_green","minecraft:parrot_adult","minecraft:parrot_wild"]}},{"weight":20,"add":{"component_groups":["minecraft:parrot_cyan","minecraft:parrot_adult","minecraft:parrot_wild"]}},{"weight":20,"add":{"component_groups":["minecraft:parrot_silver","minecraft:parrot_adult","minecraft:parrot_wild"]}}]},"minecraft:on_tame":{"remove":{"component_groups":["minecraft:parrot_wild"]},"add":{"component_groups":["minecraft:parrot_tame"]}}}}}'},5937:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:type_family":{"family":["phantom","undead","monster","mob"]},"minecraft:loot":{"table":"loot_tables/entities/phantom.json"},"minecraft:nameable":{},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:physics":{"has_gravity":false},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{},"minecraft:attack":{"damage":6},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_air":true,"breathes_water":false},"minecraft:collision_box":{"width":0.9,"height":0.5},"minecraft:movement":{"value":1.8},"minecraft:movement.glide":{"start_speed":0.1,"speed_when_turning":0.2},"minecraft:burns_in_daylight":{},"minecraft:follow_range":{"value":64,"max":64},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.avoid_mob_type":{"priority":0,"max_dist":16.0,"ignore_visibility":true,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"ocelot"},{"test":"is_family","subject":"other","value":"cat"}]},"max_dist":16}]},"minecraft:behavior.nearest_attackable_target":{"priority":1,"reselect_targets":true,"scan_interval":20,"within_radius":64.0,"must_see_forget_duration":0.5,"target_search_height":80.0,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":64}]},"minecraft:behavior.swoop_attack":{"priority":2,"damage_reach":0.2,"speed_multiplier":1.0,"delay_range":[10.0,20.0]},"minecraft:behavior.circle_around_anchor":{"priority":3,"radius_change":1.0,"radius_adjustment_chance":0.004,"height_adjustment_chance":0.002857,"goal_radius":1.0,"angle_change":15.0,"radius_range":[5.0,15.0],"height_offset_range":[-4.0,5.0],"height_above_target_range":[20.0,40.0]}}}}'},6068:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:pig_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":["carrot","beetroot","potato"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1.1}},"minecraft:pig_transform":{"minecraft:transformation":{"into":"minecraft:pig_zombie","delay":0.5}},"minecraft:pig_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/pig.json"},"minecraft:behavior.breed":{"priority":4,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["carrot","beetroot","potato"]}},"minecraft:pig_unsaddled":{"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"test":"has_equipment","subject":"other","domain":"hand","value":"saddle"},"event":"minecraft:on_saddled"},"use_item":true,"play_sounds":"saddle","interact_text":"action.interact.saddle"}]},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.63,0.0]}}},"minecraft:pig_saddled":{"minecraft:is_saddled":{},"minecraft:loot":{"table":"loot_tables/entities/pig_saddled.json"},"minecraft:boostable":{"speed_multiplier":2.0,"duration":3.0,"boost_items":[{"item":"carrotOnAStick","damage":2,"replace_item":"fishing_rod"}]},"minecraft:rideable":{"seat_count":1,"interact_text":"action.interact.mount","family_types":["player"],"seats":{"position":[0.0,0.63,0.0]}},"minecraft:item_controllable":{"control_items":"carrotOnAStick"},"minecraft:behavior.controlled_by_player":{"priority":0}}},"components":{"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":[{"test":"is_family","subject":"other","value":"lightning"},{"test":"is_difficulty","operator":"!=","value":"peaceful"}],"event":"become_zombie"},"deals_damage":false}},"minecraft:type_family":{"family":["pig","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:collision_box":{"width":0.9,"height":0.9},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{"mass":0.75},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.mount_pathing":{"priority":1,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true},"minecraft:behavior.float":{"priority":2},"minecraft:behavior.panic":{"priority":3,"speed_multiplier":1.25},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.2,"items":["potato","carrot","beetroot","carrotOnAStick"]},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"become_zombie":{"remove":{},"add":{"component_groups":["minecraft:pig_transform"]}},"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"minecraft:spawn_adult"},{"weight":5,"remove":{},"add":{"component_groups":["minecraft:pig_baby"]}}]},"minecraft:entity_born":{"remove":{},"add":{"component_groups":["minecraft:pig_baby"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:pig_baby"]},"add":{"component_groups":["minecraft:pig_adult","minecraft:pig_unsaddled"]}},"minecraft:on_saddled":{"remove":{"component_groups":["minecraft:pig_unsaddled"]},"add":{"component_groups":["minecraft:pig_saddled"]}},"minecraft:spawn_adult":{"add":{"component_groups":["minecraft:pig_adult","minecraft:pig_unsaddled"]}}}}}'},4719:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:piglin","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"zombification_sensor":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"in_nether","subject":"self","operator":"==","value":false},"event":"start_zombification_event"}}},"start_zombification":{"minecraft:is_shaking":{},"minecraft:environment_sensor":{"triggers":{"filters":{"test":"in_nether","subject":"self","operator":"==","value":true},"event":"stop_zombification_event"}},"minecraft:timer":{"looping":false,"time":15,"time_down_event":{"event":"become_zombie_event"}}},"become_zombie":{"minecraft:transformation":{"into":"minecraft:zombie_pigman","transformation_sound":"converted_to_zombified","keep_level":true,"drop_inventory":true,"preserve_equipment":true}},"ranged_unit":{"minecraft:behavior.ranged_attack":{"priority":8,"attack_interval_min":1,"attack_interval_max":1,"attack_radius":8,"attack_radius_min":4,"speed_multiplier":1.0,"target_in_sight_time":0.1},"minecraft:shooter":{"def":"minecraft:arrow"},"minecraft:behavior.charge_held_item":{"priority":3,"items":["minecraft:arrow"]},"minecraft:equipment":{"table":"loot_tables/entities/piglin_gear_ranged.json"},"minecraft:variant":{"value":0}},"melee_unit":{"minecraft:behavior.melee_attack":{"priority":8,"speed_multiplier":1.0,"track_target":true},"minecraft:attack":{"damage":5},"minecraft:equipment":{"table":"loot_tables/entities/piglin_gear_melee.json"},"minecraft:variant":{"value":1}},"angry":{"minecraft:angry":{"duration":30,"broadcast_anger":true,"broadcast_anger_on_attack":true,"broadcast_anger_on_being_attacked":true,"broadcast_range":16,"broadcast_targets":["piglin"],"calm_event":{"event":"become_calm_event","target":"self"},"filters":{"all_of":[{"test":"is_family","subject":"other","operator":"!=","value":"piglin"},{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:attack_cooldown"}]},"angry_sound":"angry","sound_interval":{"range_min":2.0,"range_max":5.0}}},"attack_cooldown":{"minecraft:attack_cooldown":{"attack_cooldown_time":[30.0,120.0],"attack_cooldown_complete_event":{"event":"attack_cooldown_complete_event","target":"self"}}},"piglin_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:movement":{"value":0.42},"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 1 + (query.equipment_count * Math.Random(1,2)) : 0"},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.1}},"piglin_adult":{"minecraft:group_size":{"radius":32,"filters":{"all_of":[{"test":"has_component","operator":"!=","value":"minecraft:is_baby"},{"test":"is_family","value":"piglin"}]}},"minecraft:movement":{"value":0.35},"minecraft:barter":{"barter_table":"loot_tables/entities/piglin_barter.json","cooldown_after_being_attacked":20},"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:celebrate_hunt":{"celebration_targets":{"all_of":[{"test":"is_family","value":"hoglin"}]},"broadcast":true,"duration":10,"celebrate_sound":"celebrate","sound_interval":{"range_min":2.0,"range_max":5.0},"radius":16},"minecraft:block_sensor":{"sensor_radius":16,"on_break":[{"block_list":["minecraft:gold_block","minecraft:gilded_blackstone","minecraft:nether_gold_ore","minecraft:gold_ore","minecraft:chest","minecraft:trapped_chest","minecraft:ender_chest","minecraft:barrel","minecraft:shulker_box","minecraft:undyed_shulker_box"],"on_block_broken":"important_block_destroyed_event"}]}},"interactable_piglin":{"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"gold_ingot"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:is_baby"}]}},"barter":true,"admire":true,"use_item":true,"cooldown_after_being_attacked":20,"interact_text":"action.interact.barter"}]}},"hunter":{"minecraft:type_family":{"family":["piglin","piglin_hunter","monster"]}},"not_hunter":{"minecraft:type_family":{"family":["piglin","monster"]}},"alert_for_attack_targets":{"minecraft:behavior.nearest_attackable_target":{"priority":7,"within_radius":16.0,"persist_time":2.0,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"wither"}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"self","value":"piglin_hunter"},{"test":"is_family","subject":"other","value":"hoglin_huntable"},{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:attack_cooldown"}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"has_equipment","subject":"other","domain":"head","operator":"!=","value":"golden_helmet"},{"test":"has_equipment","subject":"other","domain":"torso","operator":"!=","value":"golden_chestplate"},{"test":"has_equipment","subject":"other","domain":"leg","operator":"!=","value":"golden_leggings"},{"test":"has_equipment","subject":"other","domain":"feet","operator":"!=","value":"golden_boots"}]},"max_dist":16},{"filters":{"any_of":[{"test":"has_container_open","subject":"other","operator":"==","value":true}]},"max_dist":16}],"must_see":true}},"take_target_as_response_to_block_break":{"minecraft:behavior.nearest_attackable_target":{"priority":7,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":16}]}},"piglin_jockey":{"minecraft:behavior.find_mount":{"priority":1,"within_radius":16,"start_delay":15,"max_failed_attempts":20}}},"components":{"minecraft:equip_item":{},"minecraft:admire_item":{"duration":8,"cooldown_after_being_attacked":20},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:on_target_acquired":{"event":"become_angry_event","target":"self"},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:health":{"value":16,"max":16},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:loot":{"table":"loot_tables/entities/piglin.json"},"minecraft:navigation.walk":{"can_path_over_water":true,"can_open_doors":true},"minecraft:annotation.open_door":{},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:nameable":{},"minecraft:inventory":{"inventory_size":8},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.admire_item":{"priority":2,"admire_item_sound":"admire","sound_interval":{"range_min":2.0,"range_max":5.0},"on_admire_item_start":{"event":"admire_item_started_event","target":"self"},"on_admire_item_stop":{"event":"admire_item_stopped_event","target":"self"}},"minecraft:behavior.barter":{"priority":3},"minecraft:conditional_bandwidth_optimization":{},"minecraft:behavior.avoid_mob_type":{"priority":4,"remove_target":true,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"zombie_pigman"}]},"max_dist":6},{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"zoglin"}]},"max_dist":6},{"filters":{"all_of":[{"test":"has_target","subject":"other","value":true},{"test":"is_family","subject":"other","value":"hoglin"}]},"sprint_speed_multiplier":1.2,"check_if_outnumbered":true}],"on_escape_event":{"event":"become_calm_event","target":"self"},"avoid_mob_sound":"retreat","sound_interval":{"range_min":2.0,"range_max":5.0}},"minecraft:behavior.equip_item":{"priority":5},"minecraft:behavior.pickup_items":{"priority":6,"max_dist":10,"goal_radius":2,"speed_multiplier":0.8,"pickup_based_on_chance":false,"can_pickup_any_item":false,"cooldown_after_being_attacked":20.0},"minecraft:behavior.avoid_block":{"priority":9,"tick_interval":5,"search_range":8,"search_height":4,"sprint_speed_modifier":1.1,"target_selection_method":"nearest","target_blocks":["minecraft:soul_fire","minecraft:soul_lantern","minecraft:soul_torch","minecraft:item.soul_campfire"],"avoid_block_sound":"retreat","sound_interval":{"range_min":2.0,"range_max":5.0}},"minecraft:behavior.random_stroll":{"priority":10,"speed_multiplier":0.6},"minecraft:behavior.look_at_player":{"priority":11,"look_distance":8},"minecraft:behavior.random_look_around":{"priority":12},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:follow_range":{"value":64},"minecraft:shareables":{"items":[{"item":"minecraft:golden_sword","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_axe","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_hoe","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_pickaxe","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_shovel","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_rail","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_helmet","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_chestplate","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_leggings","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_boots","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_apple","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:appleEnchanted","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:golden_carrot","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:gold_block","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:gold_nugget","priority":2,"stored_in_inventory":true},{"item":"minecraft:gold_ore","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:nether_gold_ore","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:gilded_blackstone","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:horsearmorgold","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:crossbow","priority":2},{"item":"minecraft:porkchop","consume_item":true,"priority":3,"max_amount":64},{"item":"minecraft:cooked_porkchop","consume_item":true,"priority":3,"max_amount":64},{"item":"minecraft:netherite_helmet","priority":3},{"item":"minecraft:diamond_helmet","priority":4},{"item":"minecraft:iron_helmet","priority":5},{"item":"minecraft:chainmail_helmet","priority":6},{"item":"minecraft:leather_helmet","priority":7},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:skull:2","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:skull:3","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:skull:4","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:skull:5","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":8},{"item":"minecraft:netherite_chestplate","priority":3},{"item":"minecraft:diamond_chestplate","priority":4},{"item":"minecraft:iron_chestplate","priority":5},{"item":"minecraft:chainmail_chestplate","priority":6},{"item":"minecraft:leather_chestplate","priority":7},{"item":"minecraft:elytra","priority":7},{"item":"minecraft:netherite_leggings","priority":3},{"item":"minecraft:diamond_leggings","priority":4},{"item":"minecraft:iron_leggings","priority":5},{"item":"minecraft:chainmail_leggings","priority":6},{"item":"minecraft:leather_leggings","priority":7},{"item":"minecraft:netherite_boots","priority":3},{"item":"minecraft:diamond_boots","priority":4},{"item":"minecraft:iron_boots","priority":5},{"item":"minecraft:chainmail_boots","priority":6},{"item":"minecraft:bell","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:clock","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:speckled_melon","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:light_weighted_pressure_plate","priority":2,"admire":true,"pickup_limit":1,"stored_in_inventory":true},{"item":"minecraft:leather_boots","priority":7},{"item":"minecraft:netherite_sword","priority":3},{"item":"minecraft:diamond_sword","priority":4},{"item":"minecraft:iron_sword","priority":5},{"item":"minecraft:stone_sword","priority":6},{"item":"minecraft:wooden_sword","priority":7},{"item":"minecraft:shield","priority":7},{"item":"minecraft:gold_ingot","priority":1,"pickup_limit":1,"admire":true,"barter":true}]}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":5,"trigger":"spawn_baby"},{"weight":95,"trigger":"spawn_adult"}]},"minecraft:entity_born":{"trigger":"spawn_baby"},"spawn_adult_no_hunting":{"randomize":[{"weight":1,"trigger":"spawn_adult_ranged_no_hunting"},{"weight":1,"trigger":"spawn_adult_melee_no_hunting"}]},"spawn_adult":{"randomize":[{"weight":1,"trigger":"spawn_adult_ranged"},{"weight":1,"trigger":"spawn_adult_melee"}]},"spawn_adult_ranged":{"add":{"component_groups":["piglin_adult","zombification_sensor","alert_for_attack_targets","ranged_unit","attack_cooldown","hunter","interactable_piglin"]}},"spawn_adult_ranged_no_hunting":{"add":{"component_groups":["piglin_adult","zombification_sensor","alert_for_attack_targets","ranged_unit","attack_cooldown","not_hunter","interactable_piglin"]}},"spawn_adult_melee":{"add":{"component_groups":["piglin_adult","zombification_sensor","alert_for_attack_targets","melee_unit","attack_cooldown","hunter","interactable_piglin"]}},"spawn_adult_melee_no_hunting":{"add":{"component_groups":["piglin_adult","zombification_sensor","alert_for_attack_targets","melee_unit","attack_cooldown","not_hunter","interactable_piglin"]}},"spawn_baby":{"randomize":[{"weight":9,"add":{"component_groups":["piglin_baby","zombification_sensor","not_hunter"]}},{"weight":1,"add":{"component_groups":["piglin_baby","zombification_sensor","piglin_jockey","not_hunter"]}}]},"stop_zombification_event":{"add":{"component_groups":["zombification_sensor"]},"remove":{"component_groups":["start_zombification"]}},"start_zombification_event":{"add":{"component_groups":["start_zombification"]},"remove":{"component_groups":["zombification_sensor"]}},"become_angry_event":{"add":{"component_groups":["angry"]}},"become_calm_event":{"remove":{"component_groups":["angry","take_target_as_response_to_block_break"]},"add":{"component_groups":["alert_for_attack_targets","attack_cooldown"]}},"attack_cooldown_complete_event":{"remove":{"component_groups":["attack_cooldown"]}},"become_zombie_event":{"add":{"component_groups":["become_zombie"]}},"important_block_destroyed_event":{"remove":{"component_groups":["alert_for_attack_targets"]},"add":{"component_groups":["take_target_as_response_to_block_break"]}},"admire_item_started_event":{"remove":{"component_groups":["interactable_piglin"]}},"admire_item_stopped_event":{"add":{"component_groups":["interactable_piglin"]}}}}}'},3680:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:pillager","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:celebrate":{"minecraft:behavior.celebrate":{"priority":5,"celebration_sound":"celebrate","sound_interval":{"range_min":2.0,"range_max":7.0},"jump_interval":{"range_min":1.0,"range_max":3.5},"duration":30.0,"on_celebration_end_event":{"event":"minecraft:stop_celebrating","target":"self"}}},"minecraft:ranged_attack":{"minecraft:behavior.ranged_attack":{"priority":4,"attack_interval_min":1.0,"attack_interval_max":1.0,"attack_radius":8.0},"minecraft:shooter":{"def":"minecraft:arrow"},"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":true},"event":"minecraft:melee_mode"}}},"minecraft:melee_attack":{"minecraft:behavior.melee_attack":{"priority":4,"track_target":true},"minecraft:attack":{"damage":3},"minecraft:environment_sensor":{"triggers":{"filters":{"test":"in_water","subject":"self","operator":"==","value":false},"event":"minecraft:ranged_mode"}}},"minecraft:raid_configuration":{"minecraft:dweller":{"dwelling_type":"village","dweller_role":"hostile","update_interval_base":60,"update_interval_variant":40,"can_find_poi":false,"can_migrate":false,"first_founding_reward":0},"minecraft:behavior.move_to_village":{"priority":5,"speed_multiplier":1.0,"goal_radius":2.0},"minecraft:loot":{"table":"loot_tables/entities/pillager_raid.json"},"minecraft:ambient_sound_interval":{"value":2.0,"range":4.0,"event_name":"ambient.in.raid"}},"minecraft:illager_squad_captain":{"minecraft:is_illager_captain":{},"minecraft:variant":{"value":1},"minecraft:equipment":{"table":"loot_tables/entities/pillager_captain_equipment.json","slot_drop_chance":[{"slot":"slot.armor.chest","drop_chance":1.0}]},"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":{"all_of":[{"test":"has_damage","value":"fatal"},{"test":"is_family","subject":"other","value":"player"}]},"event":"minecraft:gain_bad_omen","target":"other"}}},"minecraft:on_hurt":{"event":"minecraft:ranged_mode","target":"self"},"minecraft:on_hurt_by_player":{"event":"minecraft:ranged_mode","target":"self"}},"minecraft:patrol_captain":{"minecraft:is_illager_captain":{},"minecraft:variant":{"value":1},"minecraft:equipment":{"table":"loot_tables/entities/pillager_captain_equipment.json","slot_drop_chance":[{"slot":"slot.armor.chest","drop_chance":1.0}]},"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":{"all_of":[{"test":"has_damage","value":"fatal"},{"test":"is_family","subject":"other","value":"player"}]},"event":"minecraft:gain_bad_omen","target":"other"}}},"minecraft:on_hurt":{"event":"minecraft:ranged_mode","target":"self"},"minecraft:on_hurt_by_player":{"event":"minecraft:ranged_mode","target":"self"},"minecraft:on_target_escape":{"event":"minecraft:calm","target":"self"},"minecraft:behavior.hold_ground":{"priority":5,"min_radius":10,"broadcast":true,"broadcast_range":8,"within_radius_event":{"event":"minecraft:ranged_mode","target":"self"}},"minecraft:behavior.move_to_random_block":{"priority":6,"speed_multiplier":0.55,"within_radius":8,"block_distance":512}},"minecraft:patrol_follower":{"minecraft:behavior.follow_target_captain":{"priority":5,"speed_multiplier":0.8,"within_radius":64,"follow_distance":5},"minecraft:behavior.hold_ground":{"priority":6,"min_radius":10,"broadcast":true,"broadcast_range":8,"within_radius_event":{"event":"minecraft:ranged_mode","target":"self"}},"minecraft:on_hurt":{"event":"minecraft:ranged_mode","target":"self"},"minecraft:on_hurt_by_player":{"event":"minecraft:ranged_mode","target":"self"},"minecraft:on_target_escape":{"event":"minecraft:calm","target":"self"}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0"},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:type_family":{"family":["pillager","monster","illager","mob"]},"minecraft:variant":{"value":0},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:health":{"value":24,"max":24},"minecraft:conditional_bandwidth_optimization":{},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:loot":{"table":"loot_tables/entities/pillager.json"},"minecraft:shareables":{"items":[{"item":"minecraft:banner:15","want_amount":1,"surplus_amount":1,"priority":0}]},"minecraft:movement":{"value":0.35},"minecraft:navigation.walk":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:nameable":{},"minecraft:equipment":{"table":"loot_tables/entities/pillager_gear.json"},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.hurt_by_target":{"priority":1,"entity_types":{"filters":{"test":"is_family","subject":"other","operator":"!=","value":"illager"},"max_dist":64}},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"reselect_targets":true,"within_radius":16.0,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"irongolem"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"}]},"max_dist":16}]},"minecraft:behavior.equip_item":{"priority":3},"minecraft:behavior.pickup_items":{"priority":7,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0},"minecraft:behavior.random_stroll":{"priority":8,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":9,"look_distance":8},"minecraft:behavior.random_look_around":{"priority":10},"minecraft:behavior.charge_held_item":{"priority":3,"items":["minecraft:arrow"]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:follow_range":{"value":64}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["minecraft:ranged_attack"]}},"minecraft:spawn_for_raid":{"add":{"component_groups":["minecraft:ranged_attack","minecraft:raid_configuration"]}},"minecraft:spawn_as_patrol_follower":{"add":{"component_groups":["minecraft:patrol_follower"]}},"minecraft:spawn_as_illager_captain":{"add":{"component_groups":["minecraft:ranged_attack","minecraft:illager_squad_captain"]}},"minecraft:promote_to_illager_captain":{"add":{"component_groups":["minecraft:illager_squad_captain"]},"remove":{"component_groups":["minecraft:patrol_follower"]}},"minecraft:promote_to_patrol_captain":{"add":{"component_groups":["minecraft:patrol_captain"]},"remove":{"component_groups":["minecraft:patrol_follower"]}},"minecraft:melee_mode":{"remove":{"component_groups":["minecraft:ranged_attack"]},"add":{"component_groups":["minecraft:melee_attack"]}},"minecraft:ranged_mode":{"remove":{"component_groups":["minecraft:melee_attack"]},"add":{"component_groups":["minecraft:ranged_attack"]}},"minecraft:start_celebrating":{"add":{"component_groups":["minecraft:celebrate"]}},"minecraft:stop_celebrating":{"remove":{"component_groups":["minecraft:celebrate"]}},"minecraft:calm":{"remove":{"component_groups":["minecraft:melee_attack","minecraft:ranged_attack"]}}}}}'},9839:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:polar_bear","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":4,"speed_multiplier":1.25}},"minecraft:baby_wild":{"minecraft:on_target_acquired":{"event":"minecraft:on_scared","target":"self"},"minecraft:behavior.nearest_attackable_target":{"priority":4,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":16}]}},"minecraft:baby_scared":{"minecraft:angry":{"duration":1,"broadcast_anger":true,"broadcast_range":41,"calm_event":{"event":"minecraft:baby_on_calm","target":"self"}}},"minecraft:adult":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/polar_bear.json"}},"minecraft:adult_wild":{"minecraft:on_target_acquired":{"event":"minecraft:on_anger","target":"self"},"minecraft:on_friendly_anger":{"event":"minecraft:on_anger","target":"self"},"minecraft:behavior.nearest_attackable_target":{"priority":4,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"fox"},"max_dist":16}],"must_see":false}},"minecraft:adult_hostile":{"minecraft:attack":{"damage":6.0},"minecraft:angry":{"duration":500,"broadcast_anger":false,"broadcast_range":20,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:behavior.stomp_attack":{"priority":1,"track_target":true,"require_complete_path":true,"stomp_range_multiplier":2.0,"no_damage_range_multiplier":2.0}}},"components":{"minecraft:type_family":{"family":["polarbear","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:health":{"value":30},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:collision_box":{"width":1.3,"height":1.4},"minecraft:movement":{"value":0.25},"minecraft:water_movement":{"drag_factor":0.98},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:follow_range":{"value":48},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.random_stroll":{"priority":5},"minecraft:behavior.look_at_player":{"priority":6,"target_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":7},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:behavior.panic":{"priority":2,"speed_multiplier":2.0},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":9,"add":{"component_groups":["minecraft:adult","minecraft:adult_wild"]}},{"weight":1,"add":{"component_groups":["minecraft:baby","minecraft:baby_wild"]}}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:baby","minecraft:baby_wild"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:baby","minecraft:baby_wild","minecraft:baby_scared"]},"add":{"component_groups":["minecraft:adult","minecraft:adult_wild"]}},"minecraft:on_calm":{"remove":{"component_groups":["minecraft:adult_hostile"]},"add":{"component_groups":["minecraft:adult_wild"]}},"minecraft:on_anger":{"remove":{"component_groups":["minecraft:adult_wild"]},"add":{"component_groups":["minecraft:adult_hostile"]}},"minecraft:baby_on_calm":{"remove":{"component_groups":["minecraft:baby_scared"]},"add":{"component_groups":["minecraft:baby_wild"]}},"minecraft:on_scared":{"remove":{"component_groups":["minecraft:baby_wild"]},"add":{"component_groups":["minecraft:baby_scared"]}}}}}'},8688:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:rabbit","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.4},"minecraft:ageable":{"duration":1200,"feed_items":["golden_carrot","carrot","yellow_flower"],"grow_up":{"event":"grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1.1}},"adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/rabbit.json"},"minecraft:scale":{"value":0.6},"minecraft:behavior.breed":{"priority":2,"speed_multiplier":1.0},"minecraft:breedable":{"breed_items":["golden_carrot","carrot","yellow_flower"],"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}"},"require_tame":false,"mutation_factor":{"variant":0.2}}},"coat_brown":{"minecraft:variant":{"value":0}},"coat_white":{"minecraft:variant":{"value":1}},"coat_black":{"minecraft:variant":{"value":2}},"coat_splotched":{"minecraft:variant":{"value":3}},"coat_desert":{"minecraft:variant":{"value":4}},"coat_salt":{"minecraft:variant":{"value":5}}},"components":{"minecraft:type_family":{"family":["rabbit","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:health":{"value":3,"max":3},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:collision_box":{"width":0.67,"height":0.67},"minecraft:movement":{"value":0.3},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true},"minecraft:movement.skip":{},"minecraft:jump.dynamic":{},"minecraft:can_climb":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{"mass":0.4},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":2.2},"minecraft:behavior.avoid_mob_type":{"priority":4,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":8,"walk_speed_multiplier":1.5,"sprint_speed_multiplier":1.8},{"filters":{"test":"is_family","subject":"other","value":"wolf"},"max_dist":4,"walk_speed_multiplier":1.5,"sprint_speed_multiplier":1.8},{"filters":{"test":"is_family","subject":"other","value":"monster"},"max_dist":4,"walk_speed_multiplier":1.5,"sprint_speed_multiplier":1.5}]},"minecraft:behavior.breed":{"priority":2,"speed_multiplier":0.8},"minecraft:behavior.tempt":{"priority":3,"speed_multiplier":1,"items":["golden_carrot","carrot","yellow_flower"]},"minecraft:behavior.raid_garden":{"priority":5,"blocks":["carrots"],"search_range":16,"goal_radius":0.8},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.6,"xz_dist":2,"y_dist":1},"minecraft:behavior.look_at_player":{"priority":11},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"in_desert":{"add":{"component_groups":["coat_desert"]}},"in_snow":{"randomize":[{"weight":80,"add":{"component_groups":["coat_white"]}},{"weight":20,"add":{"component_groups":["coat_splotched"]}}]},"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":3,"add":{"component_groups":["adult"]}},{"weight":1,"add":{"component_groups":["baby"]}}]},{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":50,"add":{"component_groups":["coat_brown"]}},{"weight":40,"add":{"component_groups":["coat_black"]}},{"weight":10,"add":{"component_groups":["coat_salt"]}}]},{"filters":{"test":"is_biome","value":"desert"},"add":{"component_groups":["coat_desert"]}},{"filters":{"test":"is_snow_covered","value":true},"randomize":[{"weight":80,"add":{"component_groups":["coat_white"]}},{"weight":20,"add":{"component_groups":["coat_splotched"]}}]}]},"minecraft:entity_born":{"sequence":[{"add":{"component_groups":["baby"]}},{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":50,"add":{"component_groups":["coat_brown"]}},{"weight":40,"add":{"component_groups":["coat_black"]}},{"weight":10,"add":{"component_groups":["coat_salt"]}}]},{"filters":{"test":"is_biome","value":"desert"},"add":{"component_groups":["coat_desert"]}},{"filters":{"test":"is_snow_covered","value":true},"randomize":[{"weight":80,"add":{"component_groups":["coat_white"]}},{"weight":20,"add":{"component_groups":["coat_splotched"]}}]}]},"grow_up":{"remove":{"component_groups":["baby"]},"add":{"component_groups":["adult"]}}}}}'},9170:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:celebrate":{"minecraft:behavior.celebrate":{"priority":5,"celebration_sound":"celebrate","sound_interval":{"range_min":2.0,"range_max":7.0},"jump_interval":{"range_min":1.0,"range_max":3.5},"duration":30.0,"on_celebration_end_event":{"event":"minecraft:stop_celebrating","target":"self"}}},"minecraft:pillager_rider":{"minecraft:addrider":{"entity_type":"minecraft:pillager"}},"minecraft:pillager_rider_for_raid":{"minecraft:addrider":{"entity_type":"minecraft:pillager","spawn_event":"minecraft:spawn_for_raid"}},"minecraft:evoker_rider_for_raid":{"minecraft:addrider":{"entity_type":"minecraft:evocation_illager","spawn_event":"minecraft:spawn_for_raid"}},"minecraft:pillager_captain_rider":{"minecraft:addrider":{"entity_type":"minecraft:pillager","spawn_event":"minecraft:spawn_as_illager_captain"}},"minecraft:vindicator_rider":{"minecraft:addrider":{"entity_type":"minecraft:vindicator"}},"minecraft:vindicator_captain_rider":{"minecraft:addrider":{"entity_type":"minecraft:vindicator","spawn_event":"minecraft:spawn_as_illager_captain"}},"minecraft:raid_configuration":{"minecraft:dweller":{"dwelling_type":"village","dweller_role":"hostile","update_interval_base":60,"update_interval_variant":40,"can_find_poi":false,"can_migrate":false,"first_founding_reward":0},"minecraft:behavior.move_to_village":{"priority":5,"speed_multiplier":1.0,"goal_radius":2.0},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":1.0},"minecraft:ambient_sound_interval":{"value":4.0,"range":8.0,"event_name":"ambient.in.raid"}},"minecraft:hostile":{"minecraft:movement":{"value":0.3},"minecraft:behavior.delayed_attack":{"priority":4,"attack_once":false,"track_target":true,"require_complete_path":false,"random_stop_interval":0,"reach_multiplier":1.5,"speed_multiplier":1.0,"attack_duration":0.75,"hit_delay_pct":0.5},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.4},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6,"angle_of_view_horizontal":45,"probability":1},"minecraft:behavior.look_at_entity":{"priority":10,"look_distance":8,"angle_of_view_horizontal":45,"filters":{"test":"is_family","subject":"other","value":"mob"}},"minecraft:behavior.hurt_by_target":{"priority":2,"entity_types":{"filters":{"test":"is_family","subject":"other","operator":"!=","value":"illager"},"max_dist":64}},"minecraft:behavior.nearest_attackable_target":{"priority":3,"must_see":true,"within_radius":16.0,"entity_types":[{"filters":{"any_of":[{"subject":"other","test":"is_family","value":"player"},{"subject":"other","test":"is_family","value":"irongolem"}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"}]},"max_dist":16}]},"minecraft:behavior.mount_pathing":{"priority":5,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true}},"stunned":{"minecraft:is_stunned":{},"minecraft:timer":{"looping":false,"time":2,"time_down_event":{"event":"minecraft:start_roar"}}},"roaring":{"minecraft:behavior.knockback_roar":{"priority":1,"duration":1,"attack_time":0.5,"knockback_damage":6,"knockback_strength":3,"knockback_range":4,"knockback_filters":{"test":"is_family","subject":"other","operator":"!=","value":"ravager"},"damage_filters":{"test":"is_family","subject":"other","operator":"!=","value":"illager"},"on_roar_end":{"event":"minecraft:end_roar"},"cooldown_time":0.1}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 20 : 0"},"minecraft:behavior.float":{"priority":0},"minecraft:ravager_blocked":{"knockback_strength":3.0,"reaction_choices":[{"weight":1,"value":{"event":"minecraft:become_stunned","target":"self"}},{"weight":1}]},"minecraft:attack":{"damage":12.0},"minecraft:breathable":{"suffocate_time":0,"total_supply":15},"minecraft:collision_box":{"height":1.9,"width":1.2},"minecraft:health":{"max":100,"value":100},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:jump.static":{},"minecraft:loot":{"table":"loot_tables/entities/ravager.json"},"minecraft:knockback_resistance":{"value":0.5},"minecraft:movement":{"value":0.0},"minecraft:movement.basic":{},"minecraft:nameable":{},"minecraft:navigation.walk":{"avoid_damage_blocks":true,"can_path_over_water":true,"can_sink":false},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:break_blocks":{"breakable_blocks":["bamboo","bamboo_sapling","beetroot","brown_mushroom","carrots","carved_pumpkin","chorus_flower","chorus_plant","deadbush","double_plant","leaves","leaves2","lit_pumpkin","melon_block","melon_stem","potatoes","pumpkin","pumpkin_stem","red_flower","red_mushroom","crimson_fungus","warped_fungus","reeds","sapling","snow_layer","sweet_berry_bush","tallgrass","turtle_egg","vine","waterlily","wheat","yellow_flower"]},"minecraft:follow_range":{"value":64},"minecraft:rideable":{"seat_count":1,"family_types":["pillager","vindicator","evocation_illager"],"seats":{"position":[0.0,2.1,-0.3]}},"minecraft:type_family":{"family":["monster","illager","ravager","mob"]}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["minecraft:hostile"]}},"minecraft:spawn_for_raid":{"add":{"component_groups":["minecraft:hostile","minecraft:raid_configuration"]}},"minecraft:spawn_for_raid_with_evoker_rider":{"add":{"component_groups":["minecraft:hostile","minecraft:evoker_rider_for_raid","minecraft:raid_configuration"]}},"minecraft:spawn_for_raid_with_pillager_rider":{"add":{"component_groups":["minecraft:hostile","minecraft:pillager_rider_for_raid","minecraft:raid_configuration"]}},"minecraft:spawn_with_pillager_rider":{"add":{"component_groups":["minecraft:hostile","minecraft:pillager_rider"]}},"minecraft:spawn_with_pillager_captain_rider":{"add":{"component_groups":["minecraft:hostile","minecraft:pillager_captain_rider"]}},"minecraft:spawn_with_vindicator_rider":{"add":{"component_groups":["minecraft:hostile","minecraft:vindicator_rider"]}},"minecraft:spawn_with_vindicator_captain_rider":{"add":{"component_groups":["minecraft:hostile","minecraft:vindicator_captain_rider"]}},"minecraft:become_stunned":{"add":{"component_groups":["stunned"]},"remove":{"component_groups":["minecraft:hostile"]}},"minecraft:start_roar":{"add":{"component_groups":["roaring"]},"remove":{"component_groups":["stunned"]}},"minecraft:end_roar":{"add":{"component_groups":["minecraft:hostile"]},"remove":{"component_groups":["roaring"]}},"minecraft:start_celebrating":{"add":{"component_groups":["minecraft:celebrate"]}},"minecraft:stop_celebrating":{"remove":{"component_groups":["minecraft:celebrate"]}}}}}'},8706:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:cod","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"scale_small":{"minecraft:scale":{"value":0.5},"minecraft:health":{"value":6,"max":6},"minecraft:loot":{"table":"loot_tables/entities/salmon_normal.json"}},"scale_normal":{"minecraft:scale":{"value":1},"minecraft:health":{"value":6,"max":6},"minecraft:loot":{"table":"loot_tables/entities/salmon_normal.json"}},"scale_large":{"minecraft:scale":{"value":1.5},"minecraft:health":{"value":6,"max":6},"minecraft:loot":{"table":"loot_tables/entities/salmon_large.json"}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:type_family":{"family":["salmon","fish"]},"minecraft:collision_box":{"width":0.5,"height":0.5},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_air":false,"breathes_water":true},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.12},"minecraft:underwater_movement":{"value":0.12},"minecraft:navigation.generic":{"is_amphibious":false,"can_path_over_water":false,"can_swim":true,"can_walk":false,"can_breach":false,"can_sink":false},"minecraft:movement.sway":{"sway_amplitude":0.0},"minecraft:physics":{"has_gravity":false},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:despawn":{"despawn_from_distance":{"min_distance":32,"max_distance":40}},"minecraft:behavior.avoid_mob_type":{"priority":1,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":3,"max_flee":10,"walk_speed_multiplier":1.5,"sprint_speed_multiplier":2.0}]},"minecraft:behavior.swim_idle":{"priority":5,"idle_time":5.0,"success_rate":0.1},"minecraft:behavior.random_swim":{"speed_multiplier":1.0,"priority":3,"xz_dist":16,"y_dist":4,"interval":0},"minecraft:behavior.swim_wander":{"priority":4,"interval":0.0166,"look_ahead":5.0,"speed_multiplier":0.014,"wander_time":5.0},"minecraft:flocking":{"in_water":true,"match_variants":false,"use_center_of_mass":false,"low_flock_limit":4,"high_flock_limit":8,"goal_weight":2.0,"loner_chance":0.1,"influence_radius":3.0,"breach_influence":7.0,"separation_weight":0.65,"separation_threshold":0.15,"cohesion_weight":2.25,"cohesion_threshold":1.5,"innner_cohesion_threshold":1.5,"min_height":4.0,"max_height":4.0,"block_distance":1.0,"block_weight":0.75},"minecraft:nameable":{},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":30,"add":{"component_groups":["adult","scale_small"]}},{"weight":50,"add":{"component_groups":["adult","scale_normal"]}},{"weight":15,"add":{"component_groups":["adult","scale_large"]}}]}}}}'},1652:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:loot_sheared":{"minecraft:loot":{"table":"loot_tables/entities/sheep_sheared.json"}},"minecraft:loot_wooly":{"minecraft:loot":{"table":"loot_tables/entities/sheep.json"}},"minecraft:rideable_sheared":{"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.9,0.0]}}},"minecraft:rideable_wooly":{"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.975,0.0]}}},"minecraft:sheep_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":"wheat","grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1.1}},"minecraft:sheep_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:breedable":{"require_tame":false,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}"},"breed_items":"wheat"}},"minecraft:sheep_dyeable":{"minecraft:is_dyeable":{"interact_text":"action.interact.dye"}},"minecraft:sheep_sheared":{"minecraft:is_sheared":{}},"minecraft:sheep_white":{"minecraft:color":{"value":0}},"minecraft:sheep_brown":{"minecraft:color":{"value":12}},"minecraft:sheep_black":{"minecraft:color":{"value":15}},"minecraft:sheep_gray":{"minecraft:color":{"value":8}},"minecraft:sheep_light_gray":{"minecraft:color":{"value":7}},"minecraft:sheep_pink":{"minecraft:color":{"value":6}},"minecraft:sheep_red":{"minecraft:color":{"value":14}}},"components":{"minecraft:type_family":{"family":["sheep","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.9,"height":1.3},"minecraft:nameable":{},"minecraft:health":{"value":8,"max":8},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:interact":{"interactions":[{"cooldown":2.5,"use_item":false,"hurt_item":1,"spawn_items":{"table":"loot_tables/entities/sheep_shear.json"},"play_sounds":"shear","interact_text":"action.interact.shear","on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"shears"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_component","operator":"!=","value":"minecraft:is_baby"},{"test":"has_component","value":"minecraft:is_dyeable"}]},"event":"minecraft:on_sheared","target":"self"}}]},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{"mass":0.75},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":1.25},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.5,"target_dist":0.0,"track_target":true},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":1.25,"items":["wheat"]},"minecraft:behavior.follow_parent":{"priority":5,"speed_multiplier":1.1},"minecraft:behavior.eat_block":{"priority":6,"success_chance":"query.is_baby ? 0.02 : 0.001","time_until_eat":1.8,"eat_and_replace_block_pairs":[{"eat_block":"grass","replace_block":"dirt"},{"eat_block":"tallgrass","replace_block":"air"}],"on_eat":{"event":"minecraft:on_eat_block","target":"self"}},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"sequence":[{"randomize":[{"weight":95,"remove":{},"trigger":"spawn_adult"},{"weight":5,"remove":{},"trigger":"spawn_baby"}]},{"randomize":[{"weight":81836,"add":{"component_groups":["minecraft:sheep_white"]}},{"weight":5000,"add":{"component_groups":["minecraft:sheep_black"]}},{"weight":5000,"add":{"component_groups":["minecraft:sheep_light_gray"]}},{"weight":5000,"add":{"component_groups":["minecraft:sheep_gray"]}},{"weight":3000,"add":{"component_groups":["minecraft:sheep_brown"]}},{"weight":164,"add":{"component_groups":["minecraft:sheep_pink"]}}]}]},"spawn_adult":{"add":{"component_groups":["minecraft:sheep_adult","minecraft:sheep_dyeable","minecraft:rideable_wooly","minecraft:loot_wooly"]}},"spawn_baby":{"add":{"component_groups":["minecraft:sheep_baby","minecraft:sheep_dyeable","minecraft:rideable_sheared"]}},"minecraft:entity_born":{"remove":{},"add":{"component_groups":["minecraft:sheep_baby","minecraft:sheep_dyeable","minecraft:rideable_sheared"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:sheep_baby"]},"add":{"component_groups":["minecraft:sheep_adult","minecraft:rideable_wooly","minecraft:loot_wooly"]}},"minecraft:on_sheared":{"remove":{"component_groups":["minecraft:sheep_dyeable","minecraft:loot_wooly"]},"add":{"component_groups":["minecraft:sheep_sheared","minecraft:rideable_sheared","minecraft:loot_sheared"]}},"minecraft:on_eat_block":{"sequence":[{"remove":{"component_groups":["minecraft:sheep_sheared"]},"add":{"component_groups":["minecraft:sheep_dyeable"]}},{"filters":{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:rideable_wooly","minecraft:loot_wooly"]},"remove":{"component_groups":["minecraft:loot_sheared"]}}]},"wololo":{"add":{"component_groups":["minecraft:sheep_red"]}}}}}'},936:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:shulker","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:shulker_purple":{"minecraft:variant":{"value":5}},"minecraft:shulker_black":{"minecraft:variant":{"value":0}},"minecraft:shulker_blue":{"minecraft:variant":{"value":4}},"minecraft:shulker_brown":{"minecraft:variant":{"value":3}},"minecraft:shulker_cyan":{"minecraft:variant":{"value":6}},"minecraft:shulker_gray":{"minecraft:variant":{"value":8}},"minecraft:shulker_green":{"minecraft:variant":{"value":2}},"minecraft:shulker_light_blue":{"minecraft:variant":{"value":12}},"minecraft:shulker_lime":{"minecraft:variant":{"value":10}},"minecraft:shulker_magenta":{"minecraft:variant":{"value":13}},"minecraft:shulker_orange":{"minecraft:variant":{"value":14}},"minecraft:shulker_pink":{"minecraft:variant":{"value":9}},"minecraft:shulker_red":{"minecraft:variant":{"value":1}},"minecraft:shulker_silver":{"minecraft:variant":{"value":7}},"minecraft:shulker_undyed":{"minecraft:variant":{"value":16}},"minecraft:shulker_white":{"minecraft:variant":{"value":15}},"minecraft:shulker_yellow":{"minecraft:variant":{"value":11}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:type_family":{"family":["shulker","monster","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:conditional_bandwidth_optimization":{"default_values":{"max_optimized_distance":80.0,"max_dropped_ticks":10,"use_motion_prediction_hints":true}},"minecraft:health":{"value":30,"max":30},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.0,"max":0.0},"minecraft:loot":{"table":"loot_tables/entities/shulker.json"},"minecraft:peek":{"on_open":{"event":"minecraft:on_open"},"on_close":{"event":"minecraft:on_close"},"on_target_open":{"event":"minecraft:on_open"}},"minecraft:behavior.look_at_player":{"priority":1,"look_distance":6.0,"probability":0.02},"minecraft:shooter":{"def":"minecraft:shulker_bullet"},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:behavior.ranged_attack":{"attack_interval_min":1,"attack_interval_max":3,"attack_radius":15},"minecraft:behavior.hurt_by_target":{"priority":2},"minecraft:behavior.nearest_attackable_target":{"priority":3,"entity_types":{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":16},"must_see":true},"minecraft:navigation.walk":{},"minecraft:movement.basic":{},"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"all_of":[{"any_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:0"},{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:16"}]},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_black"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:8"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_gray"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:7"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_silver"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"any_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:15"},{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:19"}]},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_white"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:12"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_light_blue"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:14"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_orange"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:1"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_red"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"any_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:4"},{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:18"}]},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_blue"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:5"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_purple"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:13"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_magenta"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:9"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_pink"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"any_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:3"},{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:17"}]},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_brown"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:11"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_yellow"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:10"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_lime"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:2"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_green"},"use_item":true},{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"dye:6"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_ability","subject":"other","value":"instabuild"}]},"event":"minecraft:turn_cyan"},"use_item":true}]},"minecraft:physics":{}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["minecraft:shulker_undyed"]}},"minecraft:turn_purple":{"add":{"component_groups":["minecraft:shulker_purple"]}},"minecraft:turn_black":{"add":{"component_groups":["minecraft:shulker_black"]}},"minecraft:turn_blue":{"add":{"component_groups":["minecraft:shulker_blue"]}},"minecraft:turn_brown":{"add":{"component_groups":["minecraft:shulker_brown"]}},"minecraft:turn_cyan":{"add":{"component_groups":["minecraft:shulker_cyan"]}},"minecraft:turn_gray":{"add":{"component_groups":["minecraft:shulker_gray"]}},"minecraft:turn_green":{"add":{"component_groups":["minecraft:shulker_green"]}},"minecraft:turn_light_blue":{"add":{"component_groups":["minecraft:shulker_light_blue"]}},"minecraft:turn_lime":{"add":{"component_groups":["minecraft:shulker_lime"]}},"minecraft:turn_magenta":{"add":{"component_groups":["minecraft:shulker_magenta"]}},"minecraft:turn_orange":{"add":{"component_groups":["minecraft:shulker_orange"]}},"minecraft:turn_pink":{"add":{"component_groups":["minecraft:shulker_pink"]}},"minecraft:turn_red":{"add":{"component_groups":["minecraft:shulker_red"]}},"minecraft:turn_silver":{"add":{"component_groups":["minecraft:shulker_silver"]}},"minecraft:turn_white":{"add":{"component_groups":["minecraft:shulker_white"]}},"minecraft:turn_yellow":{"add":{"component_groups":["minecraft:shulker_yellow"]}}}}}'},7815:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:silverfish_calm":{"minecraft:on_target_acquired":{"event":"minecraft:become_angry","target":"self"}},"minecraft:silverfish_angry":{"minecraft:angry":{"duration":-1,"broadcast_anger":true,"broadcast_range":20,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:behavior.melee_attack":{"priority":4,"track_target":true},"minecraft:behavior.silverfish_wake_up_friends":{"priority":1}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:type_family":{"family":["silverfish","monster","mob","arthropod"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:loot":{"table":"loot_tables/entities/silverfish.json"},"minecraft:health":{"value":8,"max":8},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:attack":{"damage":1},"minecraft:collision_box":{"width":0.4,"height":0.3},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":1},"minecraft:behavior.silverfish_merge_with_stone":{"priority":5},"minecraft:behavior.nearest_attackable_target":{"priority":2,"attack_interval":10,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":8}]},"minecraft:behavior.hurt_by_target":{"priority":1,"alert_same_type":true},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"remove":{},"add":{"component_groups":["minecraft:silverfish_calm"]}},"minecraft:become_angry":{"remove":{"minecraft:silverfish_calm":{}},"add":{"component_groups":["minecraft:silverfish_angry"]}},"minecraft:on_calm":{"remove":{"minecraft:silverfish_angry":{}},"add":{"component_groups":["minecraft:silverfish_calm"]}}}}}'},1239:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:lightning_immune":{"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":{"other_with_families":"lightning"}},"deals_damage":false}}},"minecraft:ranged_attack":{"minecraft:behavior.ranged_attack":{"priority":0,"attack_interval_min":1.0,"attack_interval_max":3.0,"attack_radius":15.0},"minecraft:shooter":{"def":"minecraft:arrow"},"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":true},"event":"minecraft:melee_mode"},{"filters":{"test":"has_ranged_weapon","subject":"self","operator":"==","value":false},"event":"minecraft:melee_mode"}]}},"minecraft:melee_attack":{"minecraft:behavior.melee_attack":{"priority":4,"track_target":true,"speed_multiplier":1.25},"minecraft:attack":{"damage":3},"minecraft:environment_sensor":{"triggers":[{"filters":{"all_of":[{"test":"in_water","subject":"self","operator":"==","value":false},{"test":"has_ranged_weapon","subject":"self","operator":"==","value":true}]},"event":"minecraft:ranged_mode"}]}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:type_family":{"family":["skeleton","undead","monster","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true},"minecraft:burns_in_daylight":{},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:loot":{"table":"loot_tables/entities/skeleton.json"},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"is_amphibious":true,"avoid_sun":true,"avoid_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:nameable":{},"minecraft:equipment":{"table":"loot_tables/entities/skeleton_gear.json"},"minecraft:shooter":{"def":"minecraft:arrow"},"minecraft:environment_sensor":{"triggers":[{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":true},"event":"minecraft:melee_mode"},{"filters":{"test":"has_ranged_weapon","subject":"self","operator":"==","value":false},"event":"minecraft:melee_mode"}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:shareables":{"items":[{"item":"minecraft:netherite_sword","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_sword","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_sword","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:stone_sword","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_sword","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:wooden_sword","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:bow","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:netherite_helmet","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_helmet","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_helmet","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_helmet","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_helmet","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_helmet","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_chestplate","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_chestplate","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_chestplate","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_chestplate","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_chestplate","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_chestplate","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_leggings","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_leggings","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_leggings","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_leggings","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_leggings","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_leggings","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_boots","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_boots","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_boots","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_boots","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_boots","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_boots","want_amount":1,"surplus_amount":1,"priority":5}]},"minecraft:behavior.ranged_attack":{"priority":0,"attack_interval_min":1.0,"attack_interval_max":3.0,"attack_radius":15.0},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"reselect_targets":true,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":16},{"filters":{"test":"is_family","subject":"other","value":"irongolem"},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":16}]},"minecraft:behavior.flee_sun":{"priority":2,"speed_multiplier":1},"minecraft:behavior.equip_item":{"priority":3},"minecraft:behavior.avoid_mob_type":{"priority":4,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"wolf"},"max_dist":6,"walk_speed_multiplier":1.2,"sprint_speed_multiplier":1.2}]},"minecraft:behavior.pickup_items":{"priority":5,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0,"pickup_based_on_chance":true,"can_pickup_any_item":true},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":8},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["minecraft:ranged_attack"]}},"minecraft:spring_trap":{"add":{"component_groups":["minecraft:lightning_immune"]}},"minecraft:melee_mode":{"remove":{"component_groups":["minecraft:ranged_attack"]},"add":{"component_groups":["minecraft:melee_attack"]}},"minecraft:ranged_mode":{"remove":{"component_groups":["minecraft:melee_attack"]},"add":{"component_groups":["minecraft:ranged_attack"]}}}}}'},704:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:slime","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:slime_large":{"minecraft:collision_box":{"width":2.08,"height":2.08},"minecraft:health":{"value":16,"max":16},"minecraft:movement":{"value":0.6},"minecraft:attack":{"damage":4}},"minecraft:slime_medium":{"minecraft:collision_box":{"width":1.04,"height":1.04},"minecraft:health":{"value":4,"max":4},"minecraft:movement":{"value":0.4},"minecraft:attack":{"damage":2}},"minecraft:slime_small":{"minecraft:collision_box":{"width":0.52,"height":0.52},"minecraft:health":{"value":1,"max":1},"minecraft:movement":{"value":0.3},"minecraft:attack":{"damage":0},"minecraft:loot":{"table":"loot_tables/entities/slime.json"}},"minecraft:slime_calm":{"minecraft:movement.jump":{"jump_delay":[0.5,1.5]}},"minecraft:slime_aggressive":{"minecraft:movement.jump":{"jump_delay":[0.16,0.5]}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? query.variant : 0"},"minecraft:type_family":{"family":["slime","monster","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement.jump":{"jump_delay":[0.5,1.5]},"minecraft:on_target_acquired":{"event":"minecraft:become_aggressive","target":"self"},"minecraft:on_target_escape":{"event":"minecraft:become_calm","target":"self"},"minecraft:nameable":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.slime_float":{"priority":1,"jump_chance_percentage":0.8,"speed_multiplier":1.2},"minecraft:behavior.slime_attack":{"priority":3},"minecraft:behavior.slime_random_direction":{"priority":4,"add_random_time_range":3,"turn_range":360,"min_change_direction_time":2.0},"minecraft:behavior.slime_keep_on_jumping":{"priority":5,"speed_multiplier":1.0},"minecraft:behavior.nearest_attackable_target":{"priority":2,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":16}],"must_see":true},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["minecraft:slime_calm"]}},"minecraft:become_calm":{"add":{"component_groups":["minecraft:slime_calm"]}},"minecraft:become_aggressive":{"add":{"component_groups":["minecraft:slime_aggressive"]}}}}}'},431:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"sniffer_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.45},"minecraft:ageable":{"duration":2400,"feed_items":["torchflower_seeds"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}}},"sniffer_adult":{"minecraft:behavior.breed":{"priority":3,"speed_multiplier":1.0},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:breedable":{"require_tame":false,"causes_pregnancy":true,"breeds_with":[{"mate_type":"minecraft:sniffer","breed_event":{"event":"on_pregnant","target":"self"}}],"breed_items":["torchflower_seeds"]}},"feeling_happy":{"minecraft:behavior.timer_flag_3":{"priority":5,"cooldown_range":0.0,"duration_range":[2.0,5.0],"on_end":{"event":"on_feeling_happy_end","target":"self"}}},"stand_up":{"minecraft:behavior.timer_flag_2":{"priority":2,"control_flags":["move"],"cooldown_range":0.0,"duration_range":[2.0,5.0],"on_end":{"event":"on_rising_end","target":"self"}}},"pushable":{"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"sniffer_pregnant":{"minecraft:spawn_entity":{"entities":{"min_wait_time":0,"max_wait_time":0,"spawn_sound":"plop","spawn_item":"sniffer_egg","spawn_item_event":{"event":"on_egg_spawned","target":"self"},"single_use":true}},"minecraft:is_pregnant":{}},"sniffer_search_and_dig":{"minecraft:behavior.random_search_and_dig":{"priority":5,"speed_multiplier":1.25,"find_valid_position_retries":5,"target_blocks":["minecraft:dirt","minecraft:grass","minecraft:podzol","minecraft:dirt_with_roots","minecraft:moss_block","minecraft:mud","minecraft:muddy_mangrove_roots"],"goal_radius":2.0,"search_range_xz":20.0,"search_range_y":3,"cooldown_range":0.0,"digging_duration_range":[8.0,10.0],"item_table":"loot_tables/gameplay/entities/sniffer_seeds.json","spawn_item_after_seconds":6.0,"spawn_item_pos_offset":2.25,"on_searching_start":{"event":"on_searching_start","target":"self"},"on_fail_during_searching":{"event":"on_fail_during_searching","target":"self"},"on_digging_start":{"event":"on_digging_start","target":"self"},"on_item_found":{"event":"on_item_found","target":"self"},"on_fail_during_digging":{"event":"on_fail_during_digging","target":"self"},"on_success":{"event":"on_search_and_digging_success","target":"self"}}}},"components":{"minecraft:behavior.float":{"priority":0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":2},"minecraft:behavior.tempt":{"priority":4,"speed_multiplier":1.25,"items":["torchflower_seeds"]},"minecraft:behavior.timer_flag_1":{"priority":6,"control_flags":["move","look"],"cooldown_range":[400.0,500.0],"duration_range":2.0,"on_end":{"event":"on_scenting_success","target":"self"}},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":8,"target_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:collision_box":{"width":1.9,"height":1.75},"minecraft:healable":{"items":[{"item":"torchflower_seeds","heal_amount":2}]},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:type_family":{"family":["sniffer","mob"]},"minecraft:is_hidden_when_invisible":{},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:health":{"value":14},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:follow_range":{"value":64.0},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:movement":{"value":0.09},"minecraft:persistent":{},"minecraft:physics":{},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"trigger":"minecraft:spawn_adult"},{"weight":5,"trigger":"minecraft:entity_born"}]},"minecraft:spawn_adult":{"add":{"component_groups":["sniffer_adult","pushable"]}},"minecraft:entity_born":{"add":{"component_groups":["sniffer_baby","pushable"]}},"on_pregnant":{"add":{"component_groups":["sniffer_pregnant"]}},"on_egg_spawned":{"remove":{"component_groups":["sniffer_pregnant"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["sniffer_baby"]},"add":{"component_groups":["sniffer_adult"]}},"on_scenting_success":{"sequence":[{"filters":{"test":"has_component","subject":"self","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["sniffer_search_and_dig"]}}]},"on_digging_start":{"remove":{"component_groups":["pushable"]}},"on_item_found":{"add":{"component_groups":["feeling_happy"]}},"on_feeling_happy_end":{"remove":{"component_groups":["feeling_happy"]}},"on_fail_during_searching":{"remove":{"component_groups":["sniffer_search_and_dig"]}},"on_fail_during_digging":{"remove":{"component_groups":["sniffer_search_and_dig"]},"add":{"component_groups":["pushable","stand_up"]}},"on_search_and_digging_success":{"remove":{"component_groups":["sniffer_search_and_dig"]},"add":{"component_groups":["pushable","stand_up"]}},"on_rising_end":{"remove":{"component_groups":["stand_up"]}}}}}'},2728:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:snowman_sheared":{"minecraft:is_sheared":{}}},"components":{"minecraft:type_family":{"family":["snowgolem","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:collision_box":{"width":0.4,"height":1.8},"minecraft:loot":{"table":"loot_tables/entities/snowman.json"},"minecraft:health":{"value":4,"max":4},"minecraft:movement":{"value":0.2},"minecraft:navigation.walk":{"avoid_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:attack":{"damage":2},"minecraft:damage_sensor":{"triggers":{"cause":"fall","deals_damage":false}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4},{"filters":{"test":"is_temperature_value","operator":">","value":1.0},"cause":"temperature","damage_per_tick":1},{"filters":{"test":"in_water_or_rain","operator":"==","value":true},"cause":"drowning","damage_per_tick":1}]},"minecraft:interact":{"interactions":[{"cooldown":2.5,"use_item":false,"hurt_item":1,"spawn_items":{"table":"loot_tables/entities/snow_golem_shear.json"},"play_sounds":"shear","interact_text":"action.interact.shear","on_interact":{"filters":{"all_of":[{"test":"has_equipment","subject":"other","domain":"hand","value":"shears"},{"test":"is_family","subject":"other","value":"player"},{"test":"has_component","operator":"!=","value":"minecraft:is_sheared"}]},"event":"minecraft:on_sheared","target":"self"}}]},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:balloonable":{},"minecraft:behavior.ranged_attack":{"priority":1,"speed_multiplier":1.25,"attack_interval":1,"attack_radius":10},"minecraft:shooter":{"def":"minecraft:snowball"},"minecraft:trail":{"block_type":"minecraft:snow_layer","spawn_filter":{"test":"is_temperature_value","operator":"<","value":0.81}},"minecraft:behavior.random_stroll":{"priority":2,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":3,"look_distance":6.0},"minecraft:behavior.random_look_around":{"priority":4},"minecraft:behavior.nearest_attackable_target":{"priority":1,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"monster"},"within_default":6}]},"minecraft:persistent":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:on_sheared":{"remove":{},"add":{"component_groups":["minecraft:snowman_sheared"]}}}}}'},9165:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:spider_jockey":{"minecraft:addrider":{"entity_type":"minecraft:skeleton"},"minecraft:rideable":{"seat_count":1,"family_types":["skeleton"],"seats":{"position":[0.0,0.54,0.0]}}},"minecraft:spider_stray_jockey":{"minecraft:addrider":{"entity_type":"minecraft:skeleton.stray"},"minecraft:rideable":{"seat_count":1,"family_types":["skeleton"],"seats":{"position":[0.0,0.54,0.0]}}},"minecraft:spider_wither_jockey":{"minecraft:addrider":{"entity_type":"minecraft:skeleton.wither"},"minecraft:rideable":{"seat_count":1,"family_types":["skeleton"],"seats":{"position":[0.0,0.54,0.0]}}},"minecraft:spider_neutral":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_brightness","operator":"<","value":0.49},"event":"minecraft:become_hostile"}},"minecraft:on_target_acquired":{"event":"minecraft:become_angry"}},"minecraft:spider_hostile":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_brightness","operator":">","value":0.49},"event":"minecraft:become_neutral"}},"minecraft:on_target_acquired":{"event":"minecraft:become_angry"},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"attack_interval":5,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":16}]}},"minecraft:spider_angry":{"minecraft:angry":{"duration":10,"duration_delta":3,"calm_event":{"event":"minecraft:become_calm","target":"self"}},"minecraft:behavior.leap_at_target":{"priority":4,"yd":0.4,"must_be_on_ground":false},"minecraft:behavior.melee_attack":{"priority":3,"track_target":true,"reach_multiplier":0.8}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:nameable":{},"minecraft:type_family":{"family":["spider","monster","mob","arthropod"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:loot":{"table":"loot_tables/entities/spider.json"},"minecraft:collision_box":{"width":1.4,"height":0.9},"minecraft:health":{"value":16,"max":16},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.3},"minecraft:navigation.climb":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:attack":{"damage":3},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":1},"minecraft:behavior.mount_pathing":{"priority":5,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":7},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.54,-0.1]}},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":1,"randomize":[{"weight":80,"filters":{"all_of":[{"test":"is_daytime","value":false},{"test":"is_snow_covered","value":true},{"test":"is_underground","value":false}]},"remove":{},"add":{"component_groups":["minecraft:spider_stray_jockey","minecraft:spider_neutral"]}},{"weight":80,"filters":{"test":"is_biome","value":"the_nether"},"remove":{},"add":{"component_groups":["minecraft:spider_wither_jockey","minecraft:spider_neutral"]}},{"weight":20,"filters":{"any_of":[{"test":"is_daytime","value":false},{"test":"is_underground","value":true}]},"remove":{},"add":{"component_groups":["minecraft:spider_jockey","minecraft:spider_neutral"]}}]},{"weight":99,"remove":{},"add":{"component_groups":["minecraft:spider_neutral"]}}]},"minecraft:become_hostile":{"remove":{"component_groups":["minecraft:spider_neutral"]},"add":{"component_groups":["minecraft:spider_hostile"]}},"minecraft:become_neutral":{"remove":{"component_groups":["minecraft:spider_hostile"]},"add":{"component_groups":["minecraft:spider_neutral"]}},"minecraft:become_angry":{"add":{"component_groups":["minecraft:spider_angry"]}},"minecraft:become_calm":{"remove":{"component_groups":["minecraft:spider_angry"]}}}}}'},7534:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:squid","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:squid_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5}}},"components":{"minecraft:experience_reward":{"on_death":"!query.is_baby && query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:nameable":{},"minecraft:type_family":{"family":["squid","mob"]},"minecraft:collision_box":{"width":0.95,"height":0.95},"minecraft:health":{"value":10,"max":10},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:loot":{"table":"loot_tables/entities/squid.json"},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_air":false,"breathes_water":true},"minecraft:movement":{"value":0.2},"minecraft:navigation.walk":{"can_path_over_water":true,"can_sink":false},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.squid_move_away_from_ground":{"priority":1},"minecraft:behavior.squid_flee":{"priority":2},"minecraft:behavior.squid_idle":{"priority":2},"minecraft:behavior.squid_dive":{"priority":2},"minecraft:behavior.squid_out_of_water":{"priority":2},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":95,"remove":{},"add":{}},{"weight":5,"remove":{},"add":{"component_groups":["minecraft:squid_baby"]}}]}}}}'},1369:e=>{e.exports='{"format_version":"1.14.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:strider_saddled":{"minecraft:is_saddled":{},"minecraft:loot":{"table":"loot_tables/entities/strider_saddled.json"},"minecraft:boostable":{"speed_multiplier":2.0,"duration":16.0,"boost_items":[{"item":"warped_fungus_on_a_stick","damage":1,"replace_item":"fishing_rod"}]},"minecraft:rideable":{"priority":0,"seat_count":1,"crouching_skip_interact":true,"family_types":["player"],"interact_text":"action.interact.ride.strider","seats":{"position":[0.0,1.6,-0.2]}},"minecraft:item_controllable":{"control_items":"warped_fungus_on_a_stick"},"minecraft:behavior.controlled_by_player":{"priority":0,"mount_speed_multiplier":1.45}},"minecraft:strider_unsaddled":{"minecraft:interact":{"interactions":[{"on_interact":{"filters":{"test":"has_equipment","subject":"other","domain":"hand","value":"saddle"},"event":"minecraft:on_saddled"},"use_item":true,"play_sounds":"saddle","interact_text":"action.interact.saddle"}]}},"minecraft:strider_piglin_jockey":{"minecraft:addrider":{"entity_type":"minecraft:zombie_pigman","spawn_event":"minecraft:spawn_as_strider_jockey"},"minecraft:rideable":{"priority":0,"seat_count":1,"crouching_skip_interact":true,"family_types":["player","zombie_pigman"],"interact_text":"action.interact.ride.strider","seats":{"position":[0.0,1.65,-0.2]}}},"minecraft:strider_parent_jockey":{"minecraft:addrider":{"entity_type":"minecraft:strider","spawn_event":"spawn_baby"},"minecraft:rideable":{"seat_count":1,"family_types":["strider"],"seats":{"position":[0.0,1.6,0.0]}}},"minecraft:strider_baby":{"minecraft:type_family":{"family":["strider","strider_baby","mob"]},"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":["warped_fungus"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.follow_parent":{"priority":6,"speed_multiplier":1.1}},"minecraft:strider_adult":{"minecraft:type_family":{"family":["strider","strider_adult","mob"]},"minecraft:behavior.breed":{"priority":4,"speed_multiplier":1.0},"minecraft:loot":{"table":"loot_tables/entities/strider.json"},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:breedable":{"require_tame":false,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["warped_fungus"]}},"minecraft:start_suffocating":{"minecraft:is_shaking":{},"minecraft:environment_sensor":{"triggers":{"filters":{"any_of":[{"test":"in_lava","subject":"self","operator":"==","value":true},{"test":"in_lava","subject":"other","operator":"==","value":true}]},"event":"stop_suffocating"}}},"minecraft:detect_suffocating":{"minecraft:environment_sensor":{"triggers":{"filters":{"all_of":[{"test":"in_lava","subject":"self","operator":"==","value":false},{"any_of":[{"test":"is_riding","subject":"self","operator":"==","value":false},{"test":"in_lava","subject":"other","operator":"==","value":false}]}]},"event":"start_suffocating"}}}},"components":{"minecraft:type_family":{"family":["strider","mob"]},"minecraft:collision_box":{"width":0.9,"height":1.7},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_water_or_rain","operator":"==","value":true},"cause":"drowning","damage_per_tick":1}]},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:movement":{"value":0.16},"minecraft:lava_movement":{"value":0.32},"minecraft:movement.basic":{},"minecraft:navigation.walk":{"can_path_over_lava":true,"avoid_water":true,"can_sink":false,"can_walk_in_lava":true},"minecraft:jump.static":{},"minecraft:health":{"value":20,"max":20},"minecraft:fire_immune":{},"minecraft:nameable":{},"minecraft:physics":{},"minecraft:behavior.rise_to_liquid_level":{"priority":0,"liquid_y_offset":0.25,"rise_delta":0.01,"sink_delta":0.01},"minecraft:behavior.move_to_liquid":{"priority":7,"search_range":16,"search_height":10,"goal_radius":0.9,"material_type":"Lava","search_count":30},"minecraft:behavior.random_stroll":{"priority":8,"speed_multiplier":0.8},"minecraft:behavior.look_at_player":{"priority":9,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":10},"minecraft:behavior.panic":{"priority":3,"speed_multiplier":1.1,"panic_sound":"panic","sound_interval":{"range_min":1.0,"range_max":3.0}},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.2,"items":["warped_fungus","warped_fungus_on_a_stick"],"can_tempt_while_ridden":true,"tempt_sound":"tempt","sound_interval":{"range_min":2.0,"range_max":5.0}},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":40,"trigger":"spawn_adult"},{"weight":2,"trigger":"spawn_adult_piglin_jockey"},{"weight":8,"trigger":"spawn_adult_parent_jockey"},{"weight":50,"trigger":"spawn_baby"}]},"minecraft:entity_born":{"trigger":"spawn_baby"},"spawn_adult":{"add":{"component_groups":["minecraft:strider_adult","minecraft:strider_unsaddled","minecraft:detect_suffocating"]}},"spawn_adult_parent_jockey":{"add":{"component_groups":["minecraft:strider_adult","minecraft:strider_parent_jockey","minecraft:strider_unsaddled","minecraft:detect_suffocating"]}},"spawn_adult_piglin_jockey":{"add":{"component_groups":["minecraft:strider_adult","minecraft:strider_saddled","minecraft:strider_piglin_jockey","minecraft:detect_suffocating"]}},"spawn_baby":{"add":{"component_groups":["minecraft:strider_baby","minecraft:detect_suffocating"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:strider_baby"]},"add":{"component_groups":["minecraft:strider_adult","minecraft:strider_unsaddled"]}},"minecraft:on_saddled":{"remove":{"component_groups":["minecraft:strider_unsaddled"]},"add":{"component_groups":["minecraft:strider_saddled"]}},"start_suffocating":{"add":{"component_groups":["minecraft:start_suffocating"]}},"stop_suffocating":{"add":{"component_groups":["minecraft:detect_suffocating"]},"remove":{"component_groups":["minecraft:start_suffocating"]}}}}}'},927:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"grow_up":{"minecraft:transformation":{"into":"minecraft:frog","transformation_sound":"convert_to_frog"}}},"components":{"minecraft:is_hidden_when_invisible":{},"minecraft:type_family":{"family":["tadpole","mob"]},"minecraft:collision_box":{"width":0.8,"height":0.6},"minecraft:breathable":{"total_supply":8,"suffocate_time":0,"breathes_water":true,"breathes_air":false,"generates_bubbles":false},"minecraft:nameable":{},"minecraft:health":{"value":6},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:navigation.generic":{"can_path_over_water":true,"can_swim":true,"can_walk":false,"can_sink":false,"avoid_damage_blocks":true},"minecraft:movement.sway":{"sway_amplitude":0.0},"minecraft:movement":{"value":0.1},"minecraft:underwater_movement":{"value":0.1},"minecraft:physics":{},"minecraft:pushable":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:is_baby":{},"minecraft:ageable":{"duration":1200,"feed_items":["slime_ball"],"grow_up":{"event":"ageable_grow_up","target":"self"}},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":2.0},"minecraft:behavior.tempt":{"priority":5,"speed_multiplier":1.25,"can_tempt_vertically":true,"items":["slime_ball"]},"minecraft:behavior.random_swim":{"priority":2,"interval":100},"minecraft:behavior.look_at_player":{"priority":3,"target_distance":6.0,"probability":0.02}},"events":{"ageable_grow_up":{"sequence":[{"add":{"component_groups":["grow_up"]}}]}}}}'},2998:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:baby":{"minecraft:type_family":{"family":["turtle","baby_turtle","mob"]},"minecraft:collision_box":{"width":0.6,"height":0.2},"minecraft:underwater_movement":{"value":0.06},"minecraft:is_baby":{},"minecraft:scale":{"value":0.16},"minecraft:behavior.move_to_water":{"priority":1,"search_range":15,"search_height":5,"goal_radius":0.1},"minecraft:ageable":{"duration":1200,"feed_items":["seagrass"],"drop_items":["turtle_shell_piece"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}}},"minecraft:adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:type_family":{"family":["turtle","mob"]},"minecraft:collision_box":{"width":1.2,"height":0.4},"minecraft:underwater_movement":{"value":0.12},"minecraft:loot":{"table":"loot_tables/entities/sea_turtle.json"},"minecraft:breedable":{"require_tame":false,"causes_pregnancy":true,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:become_pregnant","target":"self"}},"breed_items":["seagrass"]},"minecraft:behavior.breed":{"priority":2,"speed_multiplier":1.0},"minecraft:behavior.move_to_land":{"priority":6,"search_range":16,"search_height":5,"goal_radius":0.5},"minecraft:behavior.random_stroll":{"priority":9,"interval":100}},"minecraft:pregnant":{"minecraft:behavior.go_home":{"priority":1,"speed_multiplier":1.0,"interval":700,"goal_radius":4.0,"on_home":{"event":"minecraft:go_lay_egg","target":"self"}}},"minecraft:wants_to_lay_egg":{"minecraft:behavior.lay_egg":{"priority":1,"speed_multiplier":1.0,"search_range":16,"search_height":4,"goal_radius":1.5,"on_lay":{"event":"minecraft:laid_egg","target":"self"}}}},"components":{"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true,"breathes_air":true,"generates_bubbles":false},"minecraft:nameable":{},"minecraft:health":{"value":30},"minecraft:damage_sensor":{"triggers":{"cause":"lightning","deals_damage":true,"damage_multiplier":2000.0}},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.1},"minecraft:water_movement":{"drag_factor":0.9},"minecraft:navigation.generic":{"is_amphibious":true,"can_path_over_water":false,"can_swim":true,"can_walk":true,"can_sink":false,"avoid_damage_blocks":true},"minecraft:movement.amphibious":{"max_turn":5.0},"minecraft:jump.static":{},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:home":{},"minecraft:follow_range":{"value":1024},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.panic":{"priority":0,"prefer_water":true,"speed_multiplier":1.2},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.tempt":{"priority":3,"speed_multiplier":1.1,"items":["seagrass"]},"minecraft:behavior.move_to_water":{"priority":4,"search_range":16,"search_height":5,"goal_radius":1.5},"minecraft:behavior.random_swim":{"priority":7,"interval":0,"xz_dist":30,"y_dist":15},"minecraft:behavior.look_at_player":{"priority":8,"target_distance":6.0,"probability":0.02},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":9,"add":{"component_groups":["minecraft:adult"]}},{"weight":1,"add":{"component_groups":["minecraft:baby"]}}]},"minecraft:entity_born":{"add":{"component_groups":["minecraft:baby"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:baby"]},"add":{"component_groups":["minecraft:adult"]}},"minecraft:become_pregnant":{"add":{"component_groups":["minecraft:pregnant"]}},"minecraft:go_lay_egg":{"add":{"component_groups":["minecraft:wants_to_lay_egg"]},"remove":{"component_groups":["minecraft:pregnant"]}},"minecraft:laid_egg":{"remove":{"component_groups":["minecraft:wants_to_lay_egg"]}}}}}'},7359:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:vex","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:nameable":{},"minecraft:type_family":{"family":["vex","monster","mob"]},"minecraft:equipment":{"table":"loot_tables/entities/vex_gear.json"},"minecraft:health":{"value":14,"max":14},"minecraft:attack":{"damage":3},"minecraft:collision_box":{"width":0.4,"height":0.8},"minecraft:movement":{"value":1.0},"minecraft:navigation.walk":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:fire_immune":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.charge_attack":{"priority":4},"minecraft:behavior.nearest_attackable_target":{"priority":3,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"irongolem"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},"max_dist":70},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"}]},"max_dist":70}],"must_see":true},"minecraft:behavior.look_at_player":{"priority":9,"look_distance":6.0,"probability":0.02},"minecraft:behavior.look_at_entity":{"priority":9,"look_distance":6.0,"probability":0.02,"filters":{"test":"is_family","subject":"other","value":"mob"}},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:physics":{"has_gravity":false,"has_collision":false},"minecraft:conditional_bandwidth_optimization":{}}}}'},834:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:villager","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"trade_resupply_component_group":{"minecraft:trade_resupply":{}},"become_witch":{"minecraft:transformation":{"into":"minecraft:witch","delay":0.5}},"become_zombie":{"minecraft:transformation":{"into":"minecraft:zombie_villager_v2","keep_level":true}},"work_schedule":{"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":10,"scheduled_events":[{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":0},{"test":"hourly_clock_time","operator":"<","value":8000}]},"event":"minecraft:schedule_work_pro_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":8000},{"test":"hourly_clock_time","operator":"<","value":10000}]},"event":"minecraft:schedule_gather_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":10000},{"test":"hourly_clock_time","operator":"<","value":11000}]},"event":"minecraft:schedule_work_pro_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":11000},{"test":"hourly_clock_time","operator":"<","value":12000}]},"event":"minecraft:schedule_home_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":12000},{"test":"hourly_clock_time","operator":"<","value":24000}]},"event":"minecraft:schedule_bed_villager"}]}},"basic_schedule":{"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":10,"scheduled_events":[{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":0},{"test":"hourly_clock_time","operator":"<","value":8000}]},"event":"minecraft:schedule_wander_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":8000},{"test":"hourly_clock_time","operator":"<","value":10000}]},"event":"minecraft:schedule_gather_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":10000},{"test":"hourly_clock_time","operator":"<","value":11000}]},"event":"minecraft:schedule_wander_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":11000},{"test":"hourly_clock_time","operator":"<","value":12000}]},"event":"minecraft:schedule_home_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":12000},{"test":"hourly_clock_time","operator":"<","value":24000}]},"event":"minecraft:schedule_bed_villager"}]}},"child_schedule":{"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":10,"scheduled_events":[{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":0},{"test":"hourly_clock_time","operator":"<","value":11000}]},"event":"minecraft:schedule_play_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":11000},{"test":"hourly_clock_time","operator":"<","value":12000}]},"event":"minecraft:schedule_home_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":12000},{"test":"hourly_clock_time","operator":"<","value":24000}]},"event":"minecraft:schedule_bed_villager"}]}},"jobless_schedule":{"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":10,"scheduled_events":[{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":2000},{"test":"hourly_clock_time","operator":"<","value":13000}]},"event":"minecraft:schedule_wander_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":13000},{"test":"hourly_clock_time","operator":"<","value":14000}]},"event":"minecraft:schedule_home_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":14000},{"test":"hourly_clock_time","operator":"<","value":24000}]},"event":"minecraft:schedule_bed_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":0},{"test":"hourly_clock_time","operator":"<","value":2000}]},"event":"minecraft:schedule_bed_villager"}]}},"fisher_schedule":{"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":10,"scheduled_events":[{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":0},{"test":"hourly_clock_time","operator":"<","value":8000}]},"event":"minecraft:schedule_work_fisher"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":8000},{"test":"hourly_clock_time","operator":"<","value":10000}]},"event":"minecraft:schedule_gather_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":10000},{"test":"hourly_clock_time","operator":"<","value":11000}]},"event":"minecraft:schedule_work_fisher"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":11000},{"test":"hourly_clock_time","operator":"<","value":12000}]},"event":"minecraft:schedule_home_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":12000},{"test":"hourly_clock_time","operator":"<","value":24000}]},"event":"minecraft:schedule_bed_villager"}]}},"librarian_schedule":{"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":10,"scheduled_events":[{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":0},{"test":"hourly_clock_time","operator":"<","value":8000}]},"event":"minecraft:schedule_work_librarian"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":8000},{"test":"hourly_clock_time","operator":"<","value":10000}]},"event":"minecraft:schedule_gather_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":10000},{"test":"hourly_clock_time","operator":"<","value":11000}]},"event":"minecraft:schedule_work_librarian"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":11000},{"test":"hourly_clock_time","operator":"<","value":12000}]},"event":"minecraft:schedule_home_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":12000},{"test":"hourly_clock_time","operator":"<","value":24000}]},"event":"minecraft:schedule_bed_villager"}]}},"farmer_schedule":{"minecraft:scheduler":{"min_delay_secs":0,"max_delay_secs":10,"scheduled_events":[{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":0},{"test":"hourly_clock_time","operator":"<","value":8000}]},"event":"minecraft:schedule_work_farmer"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":8000},{"test":"hourly_clock_time","operator":"<","value":10000}]},"event":"minecraft:schedule_gather_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":10000},{"test":"hourly_clock_time","operator":"<","value":11000}]},"event":"minecraft:schedule_work_farmer"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":11000},{"test":"hourly_clock_time","operator":"<","value":12000}]},"event":"minecraft:schedule_home_villager"},{"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":12000},{"test":"hourly_clock_time","operator":"<","value":24000}]},"event":"minecraft:schedule_bed_villager"}]}},"job_specific_goals":{"minecraft:behavior.inspect_bookshelf":{},"minecraft:behavior.harvest_farm_block":{},"minecraft:behavior.explore_outskirts":{},"minecraft:behavior.work":{},"minecraft:behavior.mingle":{},"minecraft:behavior.sleep":{}},"work_schedule_villager":{"minecraft:behavior.work":{"priority":7,"active_time":250,"speed_multiplier":0.5,"goal_cooldown":200,"sound_delay_min":100,"sound_delay_max":200,"can_work_in_rain":false,"work_in_rain_tolerance":100,"on_arrival":{"event":"minecraft:resupply_trades","target":"self"}}},"work_schedule_fisher":{"minecraft:behavior.work":{"priority":7,"active_time":250,"speed_multiplier":0.5,"goal_cooldown":200,"sound_delay_min":100,"sound_delay_max":200,"can_work_in_rain":false,"work_in_rain_tolerance":100,"on_arrival":{"event":"minecraft:resupply_trades","target":"self"}}},"work_schedule_farmer":{"minecraft:shareables":{"items":[{"item":"minecraft:bread","want_amount":3,"surplus_amount":6,"stored_in_inventory":true},{"item":"minecraft:carrot","want_amount":60,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:potato","want_amount":60,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:beetroot","want_amount":60,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:wheat_seeds","want_amount":64,"surplus_amount":64,"stored_in_inventory":true},{"item":"minecraft:beetroot_seeds","want_amount":64,"surplus_amount":64,"stored_in_inventory":true},{"item":"minecraft:wheat","want_amount":45,"surplus_amount":18,"craft_into":"minecraft:bread","stored_in_inventory":true}]},"minecraft:behavior.work":{"priority":7,"active_time":250,"speed_multiplier":0.5,"goal_cooldown":200,"sound_delay_min":100,"sound_delay_max":200,"can_work_in_rain":false,"work_in_rain_tolerance":100,"on_arrival":{"event":"minecraft:resupply_trades","target":"self"}},"minecraft:behavior.harvest_farm_block":{"priority":8,"speed_multiplier":0.5}},"work_schedule_librarian":{"minecraft:behavior.work":{"priority":7,"active_time":250,"speed_multiplier":0.5,"goal_cooldown":200,"sound_delay_min":100,"sound_delay_max":200,"can_work_in_rain":false,"work_in_rain_tolerance":100,"on_arrival":{"event":"minecraft:resupply_trades","target":"self"}},"minecraft:behavior.inspect_bookshelf":{"priority":8,"speed_multiplier":0.6,"search_range":4,"search_height":3,"goal_radius":0.8,"search_count":0}},"play_schedule_villager":{"minecraft:behavior.play":{"priority":8,"speed_multiplier":0.32}},"gather_schedule_villager":{"minecraft:behavior.mingle":{"priority":7,"speed_multiplier":0.5,"duration":30,"cooldown_time":10,"mingle_partner_type":"minecraft:villager_v2","mingle_distance":2.0}},"home_schedule_villager":{},"bed_schedule_villager":{"minecraft:behavior.sleep":{"priority":3,"goal_radius":1.5,"speed_multiplier":0.6,"sleep_collider_height":0.3,"sleep_collider_width":1.0,"sleep_y_offset":0.6,"timeout_cooldown":10.0}},"wander_schedule_villager":{"minecraft:behavior.explore_outskirts":{"priority":9,"explore_dist":6.0,"wait_time":200,"speed_multiplier":0.6}},"behavior_peasant":{"minecraft:shareables":{"items":[{"item":"minecraft:bread","want_amount":3,"surplus_amount":6,"stored_in_inventory":true},{"item":"minecraft:carrot","want_amount":60,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:potato","want_amount":60,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:beetroot","want_amount":60,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:wheat_seeds","want_amount":64,"surplus_amount":64,"stored_in_inventory":true},{"item":"minecraft:beetroot_seeds","want_amount":64,"surplus_amount":64,"stored_in_inventory":true},{"item":"minecraft:wheat","want_amount":45,"surplus_amount":18,"craft_into":"minecraft:bread","stored_in_inventory":true}]}},"behavior_non_peasant":{"minecraft:shareables":{"items":[{"item":"minecraft:bread","want_amount":3,"surplus_amount":6,"stored_in_inventory":true},{"item":"minecraft:carrot","want_amount":12,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:potato","want_amount":12,"surplus_amount":24,"stored_in_inventory":true},{"item":"minecraft:beetroot","want_amount":12,"surplus_amount":24,"stored_in_inventory":true}]}},"trade_components":{"minecraft:behavior.trade_interest":{},"minecraft:economy_trade_table":{}},"unskilled":{"minecraft:type_family":{"family":["villager","peasant","mob"]},"minecraft:variant":{"value":0}},"farmer":{"minecraft:type_family":{"family":["villager","peasant","farmer","mob"]},"minecraft:variant":{"value":1},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.farmer","table":"trading/economy_trades/farmer_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"farmer","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"fisherman":{"minecraft:type_family":{"family":["villager","peasant","fisherman","mob"]},"minecraft:variant":{"value":2},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.fisherman","table":"trading/economy_trades/fisherman_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"fisherman","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"shepherd":{"minecraft:type_family":{"family":["villager","peasant","shepherd","mob"]},"minecraft:variant":{"value":3},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.shepherd","table":"trading/economy_trades/shepherd_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"shepherd","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"fletcher":{"minecraft:type_family":{"family":["villager","peasant","fletcher","mob"]},"minecraft:variant":{"value":4},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.fletcher","table":"trading/economy_trades/fletcher_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"fletcher","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"librarian":{"minecraft:type_family":{"family":["villager","librarian","mob"]},"minecraft:variant":{"value":5},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.librarian","table":"trading/economy_trades/librarian_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"librarian","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"cartographer":{"minecraft:type_family":{"family":["villager","cartographer","mob"]},"minecraft:variant":{"value":6},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.cartographer","table":"trading/economy_trades/cartographer_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"cartographer","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"cleric":{"minecraft:type_family":{"family":["villager","priest","cleric","mob"]},"minecraft:variant":{"value":7},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.cleric","table":"trading/economy_trades/cleric_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"cleric","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"armorer":{"minecraft:type_family":{"family":["villager","blacksmith","armorer","mob"]},"minecraft:variant":{"value":8},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.armor","table":"trading/economy_trades/armorer_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"armorer","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"weaponsmith":{"minecraft:type_family":{"family":["villager","blacksmith","weaponsmith","mob"]},"minecraft:variant":{"value":9},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.weapon","table":"trading/economy_trades/weapon_smith_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"weaponsmith","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"toolsmith":{"minecraft:type_family":{"family":["villager","blacksmith","toolsmith","mob"]},"minecraft:variant":{"value":10},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.tool","table":"trading/economy_trades/tool_smith_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"toolsmith","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"butcher":{"minecraft:type_family":{"family":["villager","artisan","butcher","mob"]},"minecraft:variant":{"value":11},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.butcher","table":"trading/economy_trades/butcher_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"butcher","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"leatherworker":{"minecraft:type_family":{"family":["villager","artisan","leatherworker","mob"]},"minecraft:variant":{"value":12},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.leather","table":"trading/economy_trades/leather_worker_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"leatherworker","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"mason":{"minecraft:type_family":{"family":["villager","artisan","stone_mason","mob"]},"minecraft:variant":{"value":13},"minecraft:behavior.trade_interest":{"priority":5,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:economy_trade_table":{"display_name":"entity.villager.mason","table":"trading/economy_trades/stone_mason_trades.json","new_screen":true,"persist_trades":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","preferred_profession":"mason","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5}},"nitwit":{"minecraft:type_family":{"family":["villager","peasant","nitwit","mob"]},"minecraft:variant":{"value":14}},"baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}},"minecraft:behavior.take_flower":{"priority":9},"minecraft:preferred_path":{"max_fall_blocks":1,"jump_cost":5,"default_block_cost":1.5,"preferred_path_blocks":[{"cost":0,"blocks":["grass_path"]},{"cost":1,"blocks":["cobblestone","stone","stonebrick","sandstone","mossy_cobblestone","stone_slab","stone_slab2","stone_slab3","stone_slab4","double_stone_slab","double_stone_slab2","double_stone_slab3","double_stone_slab4","wooden_slab","double_wooden_slab","planks","brick_block","nether_brick","red_nether_brick","end_bricks","red_sandstone","stained_glass","glass","glowstone","prismarine","emerald_block","diamond_block","lapis_block","gold_block","redstone_block","purple_glazed_terracotta","white_glazed_terracotta","orange_glazed_terracotta","magenta_glazed_terracotta","light_blue_glazed_terracotta","yellow_glazed_terracotta","lime_glazed_terracotta","pink_glazed_terracotta","gray_glazed_terracotta","silver_glazed_terracotta","cyan_glazed_terracotta","blue_glazed_terracotta","brown_glazed_terracotta","green_glazed_terracotta","red_glazed_terracotta","black_glazed_terracotta"]},{"cost":50,"blocks":["bed","lectern","composter","grindstone","blast_furnace","smoker","fletching_table","cartography_table","brewing_stand","smithing_table","cauldron","barrel","loom","stonecutter"]}]}},"adult":{"minecraft:behavior.make_love":{"priority":5},"minecraft:behavior.receive_love":{"priority":6},"minecraft:preferred_path":{"max_fall_blocks":1,"jump_cost":20,"default_block_cost":3,"preferred_path_blocks":[{"cost":0,"blocks":["grass_path"]},{"cost":1,"blocks":["cobblestone","stone","stonebrick","sandstone","mossy_cobblestone","stone_slab","stone_slab2","stone_slab3","stone_slab4","double_stone_slab","double_stone_slab2","double_stone_slab3","double_stone_slab4","wooden_slab","double_wooden_slab","planks","brick_block","nether_brick","red_nether_brick","end_bricks","red_sandstone","stained_glass","glass","glowstone","prismarine","emerald_block","diamond_block","lapis_block","gold_block","redstone_block","purple_glazed_terracotta","white_glazed_terracotta","orange_glazed_terracotta","magenta_glazed_terracotta","light_blue_glazed_terracotta","yellow_glazed_terracotta","lime_glazed_terracotta","pink_glazed_terracotta","gray_glazed_terracotta","silver_glazed_terracotta","cyan_glazed_terracotta","blue_glazed_terracotta","brown_glazed_terracotta","green_glazed_terracotta","red_glazed_terracotta","black_glazed_terracotta"]},{"cost":50,"blocks":["bed","lectern","composter","grindstone","blast_furnace","smoker","fletching_table","cartography_table","brewing_stand","smithing_table","cauldron","barrel","loom","stonecutter"]}]}},"villager_skin_0":{"minecraft:skin_id":{"value":0}},"villager_skin_1":{"minecraft:skin_id":{"value":1}},"villager_skin_2":{"minecraft:skin_id":{"value":2}},"villager_skin_3":{"minecraft:skin_id":{"value":3}},"villager_skin_4":{"minecraft:skin_id":{"value":4}},"villager_skin_5":{"minecraft:skin_id":{"value":5}},"desert_villager":{"minecraft:mark_variant":{"value":1}},"jungle_villager":{"minecraft:mark_variant":{"value":2}},"savanna_villager":{"minecraft:mark_variant":{"value":3}},"snow_villager":{"minecraft:mark_variant":{"value":4}},"swamp_villager":{"minecraft:mark_variant":{"value":5}},"taiga_villager":{"minecraft:mark_variant":{"value":6}}},"components":{"minecraft:type_family":{"family":["villager","mob"]},"minecraft:mark_variant":{"value":0},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:hide":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:nameable":{},"minecraft:movement":{"value":0.5},"minecraft:navigation.walk":{"can_path_over_water":true,"can_pass_doors":true,"can_open_doors":true,"avoid_water":true},"minecraft:follow_range":{"value":128},"minecraft:annotation.open_door":{},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:inventory":{"inventory_size":8,"private":true},"minecraft:dweller":{"dwelling_type":"village","dweller_role":"inhabitant","update_interval_base":60,"update_interval_variant":40,"can_find_poi":true,"can_migrate":true,"first_founding_reward":5},"minecraft:damage_sensor":{"triggers":[{"on_damage":{"filters":{"test":"is_family","subject":"other","value":"lightning"},"event":"become_witch"},"deals_damage":false},{"on_damage":{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"zombie"},{"test":"is_family","subject":"other","value":"husk"}],"all_of":[{"test":"has_damage","value":"fatal"}]},"event":"become_zombie"}}]},"minecraft:persistent":{},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.hide":{"priority":0,"speed_multiplier":0.8,"poi_type":"bed","duration":30.0},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":0.6},"minecraft:behavior.trade_with_player":{"priority":2},"minecraft:behavior.avoid_mob_type":{"priority":4,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"zombie"},{"test":"is_family","subject":"other","value":"zombie_villager"},{"test":"is_family","subject":"other","value":"zombie_pigman"},{"test":"is_family","subject":"other","value":"illager"},{"test":"is_family","subject":"other","value":"vex"}]},"max_dist":8,"walk_speed_multiplier":0.6,"sprint_speed_multiplier":0.6}]},"minecraft:behavior.pickup_items":{"priority":4,"max_dist":3,"goal_radius":2,"speed_multiplier":0.5,"can_pickup_to_hand_or_equipment":false},"minecraft:behavior.move_indoors":{"priority":6,"speed_multiplier":0.8,"timeout_cooldown":8.0},"minecraft:behavior.look_at_trading_player":{"priority":7},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":8,"probability":0.02},"minecraft:behavior.share_items":{"priority":9,"max_dist":3,"goal_radius":2.0,"speed_multiplier":0.5,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"villager"}}]},"minecraft:behavior.move_towards_restriction":{"priority":10,"speed_multiplier":0.6},"minecraft:behavior.random_stroll":{"priority":10,"speed_multiplier":0.6},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"become_witch":{"add":{"component_groups":["become_witch"]}},"become_zombie":{"sequence":[{"filters":{"test":"is_difficulty","value":"normal"},"randomize":[{"weight":50,"add":{"component_groups":["become_zombie"]}},{"weight":50}]},{"filters":{"test":"is_difficulty","value":"hard"},"add":{"component_groups":["become_zombie"]}}]},"minecraft:entity_spawned":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:skin_id"},"randomize":[{"weight":1,"add":{"component_groups":["villager_skin_0"]}},{"weight":1,"add":{"component_groups":["villager_skin_1"]}},{"weight":1,"add":{"component_groups":["villager_skin_2"]}},{"weight":1,"add":{"component_groups":["villager_skin_3"]}},{"weight":1,"add":{"component_groups":["villager_skin_4"]}},{"weight":1,"add":{"component_groups":["villager_skin_5"]}}]},{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":5,"add":{"component_groups":["baby","child_schedule"]}},{"weight":95,"sequence":[{"add":{"component_groups":["adult"]}},{"randomize":[{"weight":1,"add":{"component_groups":["farmer","behavior_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["fisherman","behavior_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["shepherd","behavior_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["fletcher","behavior_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["librarian","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["cartographer","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["cleric","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["armorer","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["weaponsmith","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["toolsmith","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["butcher","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["leatherworker","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["mason","behavior_non_peasant","basic_schedule"]}},{"weight":1,"add":{"component_groups":["nitwit","behavior_peasant","jobless_schedule"]}}]}]}]},{"filters":{"any_of":[{"test":"has_biome_tag","value":"desert"},{"test":"has_biome_tag","value":"mesa"}]},"add":{"component_groups":["desert_villager"]}},{"filters":{"test":"has_biome_tag","value":"jungle"},"add":{"component_groups":["jungle_villager"]}},{"filters":{"test":"has_biome_tag","value":"savanna"},"add":{"component_groups":["savanna_villager"]}},{"filters":{"any_of":[{"all_of":[{"test":"has_biome_tag","value":"cold"},{"test":"has_biome_tag","operator":"!=","value":"ocean"}]},{"test":"has_biome_tag","value":"frozen"}]},"add":{"component_groups":["snow_villager"]}},{"filters":{"test":"has_biome_tag","value":"swamp"},"add":{"component_groups":["swamp_villager"]}},{"filters":{"all_of":[{"any_of":[{"test":"has_biome_tag","value":"taiga"},{"test":"has_biome_tag","value":"extreme_hills"}]},{"test":"has_biome_tag","operator":"!=","value":"cold"}]},"add":{"component_groups":["taiga_villager"]}}]},"minecraft:spawn_from_village":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":5,"add":{"component_groups":["baby","child_schedule"]}},{"weight":95,"add":{"component_groups":["adult"]},"sequence":[{"randomize":[{"weight":90,"add":{"component_groups":["unskilled","behavior_peasant","basic_schedule"]}},{"weight":10,"add":{"component_groups":["nitwit","behavior_peasant","jobless_schedule"]}}]}]}]},{"filters":{"test":"has_component","operator":"!=","value":"minecraft:skin_id"},"randomize":[{"weight":1,"add":{"component_groups":["villager_skin_0"]}},{"weight":1,"add":{"component_groups":["villager_skin_1"]}},{"weight":1,"add":{"component_groups":["villager_skin_2"]}},{"weight":1,"add":{"component_groups":["villager_skin_3"]}},{"weight":1,"add":{"component_groups":["villager_skin_4"]}},{"weight":1,"add":{"component_groups":["villager_skin_5"]}}]},{"filters":{"any_of":[{"test":"has_biome_tag","value":"desert"},{"test":"has_biome_tag","value":"mesa"}]},"add":{"component_groups":["desert_villager"]}},{"filters":{"test":"has_biome_tag","value":"jungle"},"add":{"component_groups":["jungle_villager"]}},{"filters":{"test":"has_biome_tag","value":"savanna"},"add":{"component_groups":["savanna_villager"]}},{"filters":{"any_of":[{"all_of":[{"test":"has_biome_tag","value":"cold"},{"test":"has_biome_tag","operator":"!=","value":"ocean"}]},{"test":"has_biome_tag","value":"frozen"}]},"add":{"component_groups":["snow_villager"]}},{"filters":{"test":"has_biome_tag","value":"swamp"},"add":{"component_groups":["swamp_villager"]}},{"filters":{"all_of":[{"any_of":[{"test":"has_biome_tag","value":"taiga"},{"test":"has_biome_tag","value":"extreme_hills"}]},{"test":"has_biome_tag","operator":"!=","value":"cold"}]},"add":{"component_groups":["taiga_villager"]}}]},"minecraft:entity_transformed":{"sequence":[{"filters":{"test":"has_component","subject":"other","operator":"==","value":"minecraft:is_baby"},"add":{"component_groups":["baby","child_schedule"]}},{"filters":{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["adult"]},"sequence":[{"filters":{"test":"is_family","subject":"other","value":"farmer"},"add":{"component_groups":["farmer","behavior_peasant","farmer_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"fisherman"},"add":{"component_groups":["fisherman","behavior_peasant","fisher_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"shepherd"},"add":{"component_groups":["shepherd","behavior_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"fletcher"},"add":{"component_groups":["fletcher","behavior_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"librarian"},"add":{"component_groups":["librarian","behavior_non_peasant","librarian_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"cartographer"},"add":{"component_groups":["cartographer","behavior_non_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"cleric"},"add":{"component_groups":["cleric","behavior_non_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"armorer"},"add":{"component_groups":["armorer","behavior_non_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"weaponsmith"},"add":{"component_groups":["weaponsmith","behavior_non_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"toolsmith"},"add":{"component_groups":["toolsmith","behavior_non_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"butcher"},"add":{"component_groups":["butcher","behavior_non_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"leatherworker"},"add":{"component_groups":["leatherworker","behavior_non_peasant","work_schedule"]}},{"filters":{"test":"is_family","subject":"other","value":"mason"},"add":{"component_groups":["mason","behavior_non_peasant","work_schedule"]}}]},{"filters":{"test":"is_family","subject":"other","operator":"==","value":"zombie_villager"},"sequence":[{"filters":{"test":"is_skin_id","subject":"other","value":0},"add":{"component_groups":["villager_skin_0"]}},{"filters":{"test":"is_skin_id","subject":"other","value":1},"add":{"component_groups":["villager_skin_1"]}},{"filters":{"test":"is_skin_id","subject":"other","value":2},"add":{"component_groups":["villager_skin_2"]}},{"filters":{"test":"is_skin_id","subject":"other","value":3},"add":{"component_groups":["villager_skin_3"]}},{"filters":{"test":"is_skin_id","subject":"other","value":4},"add":{"component_groups":["villager_skin_4"]}},{"filters":{"test":"is_skin_id","subject":"other","value":5},"add":{"component_groups":["villager_skin_5"]}},{"filters":{"test":"is_mark_variant","subject":"other","value":1},"add":{"component_groups":["desert_villager"]}},{"filters":{"test":"is_mark_variant","subject":"other","value":2},"add":{"component_groups":["jungle_villager"]}},{"filters":{"test":"is_mark_variant","subject":"other","value":3},"add":{"component_groups":["savanna_villager"]}},{"filters":{"test":"is_mark_variant","subject":"other","value":4},"add":{"component_groups":["snow_villager"]}},{"filters":{"test":"is_mark_variant","subject":"other","value":5},"add":{"component_groups":["swamp_villager"]}},{"filters":{"test":"is_mark_variant","subject":"other","value":6},"add":{"component_groups":["taiga_villager"]}}]},{"filters":{"test":"is_family","subject":"other","operator":"==","value":"villager"},"sequence":[{"randomize":[{"weight":1,"add":{"component_groups":["villager_skin_0"]}},{"weight":1,"add":{"component_groups":["villager_skin_1"]}},{"weight":1,"add":{"component_groups":["villager_skin_2"]}},{"weight":1,"add":{"component_groups":["villager_skin_3"]}},{"weight":1,"add":{"component_groups":["villager_skin_4"]}},{"weight":1,"add":{"component_groups":["villager_skin_5"]}}]},{"filters":{"any_of":[{"test":"has_biome_tag","value":"desert"},{"test":"has_biome_tag","value":"mesa"}]},"add":{"component_groups":["desert_villager"]}},{"filters":{"test":"has_biome_tag","value":"jungle"},"add":{"component_groups":["jungle_villager"]}},{"filters":{"test":"has_biome_tag","value":"savanna"},"add":{"component_groups":["savanna_villager"]}},{"filters":{"any_of":[{"all_of":[{"test":"has_biome_tag","value":"cold"},{"test":"has_biome_tag","operator":"!=","value":"ocean"}]},{"test":"has_biome_tag","value":"frozen"}]},"add":{"component_groups":["snow_villager"]}},{"filters":{"test":"has_biome_tag","value":"swamp"},"add":{"component_groups":["swamp_villager"]}},{"filters":{"all_of":[{"any_of":[{"test":"has_biome_tag","value":"taiga"},{"test":"has_biome_tag","value":"extreme_hills"}]},{"test":"has_biome_tag","operator":"!=","value":"cold"}]},"add":{"component_groups":["taiga_villager"]}}]}]},"minecraft:entity_born":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:skin_id"},"randomize":[{"weight":1,"add":{"component_groups":["villager_skin_0"]}},{"weight":1,"add":{"component_groups":["villager_skin_1"]}},{"weight":1,"add":{"component_groups":["villager_skin_2"]}},{"weight":1,"add":{"component_groups":["villager_skin_3"]}},{"weight":1,"add":{"component_groups":["villager_skin_4"]}},{"weight":1,"add":{"component_groups":["villager_skin_5"]}}]},{"add":{"component_groups":["baby","unskilled","child_schedule"]}},{"filters":{"test":"has_biome_tag","value":"desert"},"add":{"component_groups":["desert_villager"]}},{"filters":{"test":"has_biome_tag","value":"jungle"},"add":{"component_groups":["jungle_villager"]}},{"filters":{"test":"has_biome_tag","value":"savanna"},"add":{"component_groups":["savanna_villager"]}},{"filters":{"any_of":[{"test":"has_biome_tag","value":"cold"},{"test":"has_biome_tag","value":"frozen"}]},"add":{"component_groups":["snow_villager"]}},{"filters":{"test":"has_biome_tag","value":"swamp"},"add":{"component_groups":["swamp_villager"]}},{"filters":{"test":"has_biome_tag","value":"taiga"},"add":{"component_groups":["taiga_villager"]}}]},"minecraft:spawn_farmer":{"randomize":[{"weight":5,"add":{"component_groups":["farmer","adult","behavior_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":5,"add":{"component_groups":["fisherman","adult","behavior_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":5,"add":{"component_groups":["shepherd","adult","behavior_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":5,"add":{"component_groups":["fletcher","adult","behavior_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":5,"add":{"component_groups":["mason","adult","behavior_non_peasant","work_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}}]},"minecraft:spawn_librarian":{"randomize":[{"weight":20,"add":{"component_groups":["librarian","adult","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":20,"add":{"component_groups":["cartographer","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}}]},"minecraft:spawn_cleric":{"add":{"component_groups":["cleric","adult","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},"minecraft:spawn_armorer":{"randomize":[{"weight":6,"add":{"component_groups":["armorer","adult","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":6,"add":{"component_groups":["weaponsmith","adult","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":6,"add":{"component_groups":["toolsmith","adult","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}}]},"minecraft:spawn_butcher":{"randomize":[{"weight":10,"add":{"component_groups":["butcher","adult","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}},{"weight":10,"add":{"component_groups":["leatherworker","adult","behavior_non_peasant","basic_schedule"]},"remove":{"component_groups":["baby","child_schedule"]}}]},"minecraft:ageable_grow_up":{"randomize":[{"weight":10,"remove":{"component_groups":["baby","child_schedule"]},"add":{"component_groups":["adult","nitwit","behavior_peasant","jobless_schedule"]}},{"weight":90,"remove":{"component_groups":["baby","child_schedule"]},"add":{"component_groups":["adult","unskilled","behavior_peasant","basic_schedule"]}}]},"minecraft:become_unskilled":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["adult","unskilled","behavior_peasant","basic_schedule"]}},"minecraft:become_cleric":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["cleric","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_farmer":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["farmer","adult","behavior_peasant","farmer_schedule"]}},"minecraft:become_fisherman":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["fisherman","adult","behavior_non_peasant","fisher_schedule"]}},"minecraft:become_fletcher":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["fletcher","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_librarian":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["librarian","adult","behavior_non_peasant","librarian_schedule"]}},"minecraft:become_cartographer":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["cartographer","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_armorer":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["armorer","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_weaponsmith":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["weaponsmith","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_toolsmith":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["toolsmith","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_butcher":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["butcher","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_leatherworker":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["leatherworker","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_sheperd":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["shepherd","adult","behavior_non_peasant","work_schedule"]}},"minecraft:become_mason":{"remove":{"component_groups":["baby","child_schedule","job_specific_goals","trade_components"]},"add":{"component_groups":["mason","adult","behavior_non_peasant","work_schedule"]}},"minecraft:schedule_wander_villager":{"remove":{"component_groups":["home_schedule_villager","bed_schedule_villager","wander_schedule_villager","job_specific_goals","play_schedule_villager","trade_resupply_component_group"]},"add":{"component_groups":["wander_schedule_villager"]}},"minecraft:schedule_gather_villager":{"remove":{"component_groups":["bed_schedule_villager","wander_schedule_villager","home_schedule_villager","job_specific_goals","play_schedule_villager","trade_resupply_component_group"]},"add":{"component_groups":["gather_schedule_villager"]}},"minecraft:schedule_home_villager":{"remove":{"component_groups":["bed_schedule_villager","wander_schedule_villager","gather_schedule_villager","job_specific_goals","play_schedule_villager","trade_resupply_component_group"]},"add":{"component_groups":["home_schedule_villager"]}},"minecraft:schedule_bed_villager":{"remove":{"component_groups":["home_schedule_villager","gather_schedule_villager","wander_schedule_villager","job_specific_goals","play_schedule_villager","trade_resupply_component_group"]},"add":{"component_groups":["bed_schedule_villager"]}},"minecraft:schedule_play_villager":{"remove":{"component_groups":["home_schedule_villager","gather_schedule_villager","wander_schedule_villager","bed_schedule_villager","job_specific_goals","trade_resupply_component_group"]},"add":{"component_groups":["play_schedule_villager"]}},"minecraft:schedule_work_pro_villager":{"remove":{"component_groups":["home_schedule_villager","gather_schedule_villager","wander_schedule_villager","bed_schedule_villager","play_schedule_villager"]},"add":{"component_groups":["work_schedule_villager"]}},"minecraft:schedule_work_farmer":{"remove":{"component_groups":["home_schedule_villager","gather_schedule_villager","wander_schedule_villager","bed_schedule_villager","job_specific_goals","play_schedule_villager"]},"add":{"component_groups":["work_schedule_farmer"]}},"minecraft:schedule_work_fisher":{"remove":{"component_groups":["home_schedule_villager","gather_schedule_villager","wander_schedule_villager","bed_schedule_villager","job_specific_goals","play_schedule_villager"]},"add":{"component_groups":["work_schedule_fisher"]}},"minecraft:schedule_work_librarian":{"remove":{"component_groups":["home_schedule_villager","gather_schedule_villager","wander_schedule_villager","bed_schedule_villager","job_specific_goals","play_schedule_villager"]},"add":{"component_groups":["work_schedule_librarian"]}},"minecraft:resupply_trades":{"add":{"component_groups":["trade_resupply_component_group"]}}}}}'},3967:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:celebrate":{"minecraft:behavior.celebrate":{"priority":5,"celebration_sound":"celebrate","sound_interval":{"range_min":2.0,"range_max":7.0},"jump_interval":{"range_min":1.0,"range_max":3.5},"duration":30.0,"on_celebration_end_event":{"event":"minecraft:stop_celebrating","target":"self"}}},"minecraft:vindicator_aggro":{"minecraft:angry":{"duration":-1,"broadcast_anger":false,"calm_event":{"event":"minecraft:stop_aggro","target":"self"}}},"minecraft:vindicator_johnny":{"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"within_radius":12.0,"must_see_forget_duration":40.0,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","operator":"!=","value":"illager"}]},"max_dist":12}]}},"minecraft:default_targeting":{"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"within_radius":12.0,"must_see_forget_duration":40.0,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},"max_dist":12},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"}]},"max_dist":12}]}},"minecraft:raid_configuration":{"minecraft:dweller":{"dwelling_type":"village","dweller_role":"hostile","update_interval_base":60,"update_interval_variant":40,"can_find_poi":false,"can_migrate":false,"first_founding_reward":0},"minecraft:behavior.move_to_village":{"priority":4,"speed_multiplier":1.0,"goal_radius":2.0},"minecraft:loot":{"table":"loot_tables/entities/vindicator_raid.json"},"minecraft:navigation.walk":{"can_path_over_water":true,"can_pass_doors":true,"can_break_doors":true},"minecraft:annotation.break_door":{"break_time":30,"min_difficulty":"normal"},"minecraft:ambient_sound_interval":{"value":2.0,"range":4.0,"event_name":"ambient.in.raid"}},"minecraft:illager_squad_captain":{"minecraft:is_illager_captain":{},"minecraft:variant":{"value":1},"minecraft:equipment":{"table":"loot_tables/entities/vindicator_captain_equipment.json","slot_drop_chance":[{"slot":"slot.armor.chest","drop_chance":1.0}]},"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":{"all_of":[{"test":"has_damage","value":"fatal"},{"test":"is_family","subject":"other","value":"player"}]},"event":"minecraft:gain_bad_omen","target":"other"}}}},"minecraft:patrol_captain":{"minecraft:is_illager_captain":{},"minecraft:variant":{"value":1},"minecraft:equipment":{"table":"loot_tables/entities/vindicator_captain_equipment.json","slot_drop_chance":[{"slot":"slot.armor.chest","drop_chance":1.0}]},"minecraft:damage_sensor":{"triggers":{"on_damage":{"filters":{"all_of":[{"test":"has_damage","value":"fatal"},{"test":"is_family","subject":"other","value":"player"}]},"event":"minecraft:gain_bad_omen","target":"other"}}},"minecraft:behavior.move_to_random_block":{"priority":5,"speed_multiplier":0.55,"within_radius":8,"block_distance":512}},"minecraft:patrol_follower":{"minecraft:behavior.follow_target_captain":{"priority":5,"speed_multiplier":0.8,"within_radius":64,"follow_distance":5}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0"},"minecraft:conditional_bandwidth_optimization":{},"minecraft:nameable":{"default_trigger":{"event":"minecraft:stop_johnny","target":"self"},"name_actions":[{"name_filter":"Johnny","on_named":{"event":"minecraft:start_johnny","target":"self"}}]},"minecraft:type_family":{"family":["vindicator","monster","illager","mob"]},"minecraft:variant":{"value":0},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:health":{"value":24,"max":24},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:attack":{"damage":8},"minecraft:movement":{"value":0.35},"minecraft:navigation.walk":{"can_path_over_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:follow_range":{"value":64},"minecraft:loot":{"table":"loot_tables/entities/vindication_illager.json"},"minecraft:equipment":{"table":"loot_tables/entities/vindicator_gear.json"},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.melee_attack":{"priority":3},"minecraft:behavior.random_stroll":{"priority":9,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":10,"look_distance":8,"probability":0.02},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:on_target_acquired":{"event":"minecraft:become_aggro","target":"self"},"minecraft:on_target_escape":{"event":"minecraft:stop_aggro","target":"self"},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"minecraft:entity_spawned":{"add":{"component_groups":["minecraft:default_targeting"]}},"minecraft:spawn_as_patrol_follower":{"add":{"component_groups":["minecraft:default_targeting","minecraft:patrol_follower"]}},"minecraft:become_aggro":{"add":{"component_groups":["minecraft:vindicator_aggro"]}},"minecraft:stop_aggro":{"remove":{"component_groups":["minecraft:vindicator_aggro"]}},"minecraft:start_johnny":{"add":{"component_groups":["minecraft:vindicator_johnny"]}},"minecraft:stop_johnny":{"remove":{"component_groups":["minecraft:vindicator_johnny"]},"add":{"component_groups":["minecraft:default_targeting"]}},"minecraft:spawn_for_raid":{"add":{"component_groups":["minecraft:default_targeting","minecraft:raid_configuration"]}},"minecraft:spawn_as_illager_captain":{"add":{"component_groups":["minecraft:illager_squad_captain"]}},"minecraft:promote_to_illager_captain":{"add":{"component_groups":["minecraft:illager_squad_captain"]},"remove":{"component_groups":["minecraft:patrol_follower"]}},"minecraft:promote_to_patrol_captain":{"add":{"component_groups":["minecraft:patrol_captain"]},"remove":{"component_groups":["minecraft:patrol_follower"]}},"minecraft:start_celebrating":{"add":{"component_groups":["minecraft:celebrate"]}},"minecraft:stop_celebrating":{"remove":{"component_groups":["minecraft:celebrate"]}}}}}'},8996:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:wandering_trader","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"managed":{"minecraft:managed_wandering_trader":{}},"despawning":{"minecraft:type_family":{"family":["wandering_trader","wandering_trader_despawning","mob"]}},"minecraft:scared":{"minecraft:angry":{"duration":5,"broadcastAnger":true,"broadcastRange":10,"broadcast_targets":["llama"],"broadcast_filters":{"test":"is_leashed_to","subject":"other","value":true},"calm_event":{"event":"minecraft:become_calm","target":"self"}}}},"components":{"minecraft:type_family":{"family":["wandering_trader","mob"]},"minecraft:is_hidden_when_invisible":{},"minecraft:timer":{"looping":false,"random_time_choices":[{"weight":50,"value":2400},{"weight":50,"value":3600}],"time_down_event":{"event":"minecraft:start_despawn","target":"self"}},"minecraft:spawn_entity":{"entities":[{"min_wait_time":0,"max_wait_time":0,"spawn_entity":"llama","spawn_event":"minecraft:from_wandering_trader","single_use":true,"num_to_spawn":2,"should_leash":true}]},"minecraft:economy_trade_table":{"display_name":"entity.wandering_trader.name","table":"trading/economy_trades/wandering_trader_trades.json","new_screen":true},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:movement":{"value":0.5},"minecraft:navigation.walk":{"can_path_over_water":true,"can_pass_doors":true,"can_open_doors":true,"avoid_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:behavior.float":{"priority":0},"minecraft:conditional_bandwidth_optimization":{},"minecraft:despawn":{"remove_child_entities":true,"filters":{"all_of":[{"any_of":[{"test":"is_family","subject":"self","value":"wandering_trader_despawning"},{"test":"has_trade_supply","subject":"self","value":false}]},{"test":"distance_to_nearest_player","operator":">","value":24}]}},"minecraft:damage_sensor":{"triggers":[{"cause":"entity_attack","deals_damage":true,"on_damage":{"event":"minecraft:become_scared"}},{"cause":"projectile","deals_damage":true,"on_damage":{"event":"minecraft:become_scared"}},{"cause":"magic","deals_damage":true,"on_damage":{"event":"minecraft:become_scared"}}]},"minecraft:behavior.trade_with_player":{"priority":1},"minecraft:behavior.trade_interest":{"priority":3,"within_radius":6.0,"interest_time":45.0,"remove_item_time":1.0,"carried_item_switch_time":2.0,"cooldown":2.0},"minecraft:behavior.look_at_trading_player":{"priority":4},"minecraft:behavior.panic":{"priority":1,"speed_multiplier":0.6},"minecraft:behavior.drink_potion":{"priority":1,"speed_modifier":-0.2,"potions":[{"id":7,"chance":1.0,"filters":{"all_of":[{"any_of":[{"test":"hourly_clock_time","operator":">=","value":18000},{"test":"hourly_clock_time","operator":"<","value":12000}]},{"test":"is_visible","subject":"self","value":true},{"any_of":[{"test":"is_avoiding_mobs","subject":"self","value":true},{"all_of":[{"test":"has_component","subject":"self","value":"minecraft:angry"},{"test":"is_family","subject":"target","operator":"!=","value":"player"}]}]}]}},{"id":8,"chance":1.0,"filters":{"all_of":[{"test":"hourly_clock_time","operator":">=","value":12000},{"test":"hourly_clock_time","operator":"<","value":18000},{"test":"is_visible","subject":"self","value":true},{"any_of":[{"test":"is_avoiding_mobs","subject":"self","value":true},{"test":"has_component","subject":"self","value":"minecraft:angry"}]}]}}]},"minecraft:behavior.avoid_mob_type":{"priority":2,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"zombie"},{"test":"is_family","subject":"other","value":"zombie_villager"},{"test":"is_family","subject":"other","value":"zombie_pigman"},{"test":"is_family","subject":"other","value":"illager"},{"test":"is_family","subject":"other","value":"vex"}]},"walk_speed_multiplier":0.6,"sprint_speed_multiplier":0.6}],"max_dist":6},"minecraft:behavior.restrict_open_door":{"priority":5},"minecraft:behavior.open_door":{"priority":6,"close_door_after":true},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":8,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}},"events":{"minecraft:scheduled":{"add":{"component_groups":["managed"]}},"minecraft:start_despawn":{"add":{"component_groups":["despawning"]}},"minecraft:become_scared":{"add":{"component_groups":["minecraft:scared"]}},"minecraft:become_calm":{"remove":{"component_groups":["minecraft:scared"]}}}}}'},4021:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:warden","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"emerging":{"minecraft:behavior.emerge":{"duration":7.0,"on_done":{"event":"minecraft:emerged","target":"self"}}},"pushable":{"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true}}},"components":{"minecraft:movement_sound_distance_offset":{"value":0.55},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:attack":{"damage":30},"minecraft:vibration_listener":{},"minecraft:vibration_damper":{},"minecraft:suspect_tracking":{},"minecraft:anger_level":{"max_anger":150,"angry_threshold":80,"remove_targets_below_angry_threshold":true,"angry_boost":20,"anger_decrement_interval":1.0,"default_annoyingness":35,"default_projectile_annoyingness":10,"on_increase_sounds":[{"sound":"listening_angry","condition":"query.anger_level(this) >= 40"},{"sound":"listening","condition":"query.anger_level(this) >= 0"}],"nuisance_filter":{"all_of":[{"test":"is_family","subject":"other","operator":"not","value":"warden"},{"test":"is_family","subject":"other","operator":"not","value":"inanimate"}]}},"minecraft:is_hidden_when_invisible":{},"minecraft:type_family":{"family":["warden","monster","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:navigation.walk":{"can_path_over_water":true,"can_path_over_lava":true,"avoid_damage_blocks":true},"minecraft:ambient_sound_interval":{"value":2.0,"range":4.0,"event_name":"ambient","event_names":[{"event_name":"angry","condition":"query.anger_level(this) >= 80"},{"event_name":"agitated","condition":"query.anger_level(this) >= 40"}]},"minecraft:heartbeat":{"interval":"2.0 - math.clamp(query.anger_level / 80 * 1.5, 0, 1.5)"},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:collision_box":{"width":0.9,"height":2.9},"minecraft:health":{"value":500,"max":500},"minecraft:movement":{"value":0.3},"minecraft:knockback_resistance":{"value":1.0},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.dig":{"priority":1,"duration":5.5,"idle_time":60.0,"vibration_is_disturbance":true,"suspicion_is_disturbance":true,"digs_in_daylight":false},"minecraft:behavior.roar":{"priority":2,"duration":4.2},"minecraft:behavior.sonic_boom":{"priority":3,"duration":3.0,"speed_multiplier":1.2,"attack_damage":10,"attack_range_horizontal":15,"attack_range_vertical":20,"attack_cooldown":2,"knockback_vertical_strength":0.5,"knockback_horizontal_strength":2.5,"knockback_height_cap":0.5,"duration_until_attack_sound":1.7,"charge_sound":"sonic_charge","attack_sound":"sonic_boom"},"minecraft:behavior.melee_attack":{"priority":4,"speed_multiplier":1.2,"melee_fov":360},"minecraft:behavior.investigate_suspicious_location":{"priority":5,"speed_multiplier":0.7},"minecraft:behavior.sniff":{"priority":6,"duration":4.16,"sniffing_radius":24.0,"suspicion_radius_horizontal":6.0,"suspicion_radius_vertical":20.0,"cooldown_range":[5.0,10.0]},"minecraft:behavior.random_stroll":{"priority":9,"speed_multiplier":0.5},"minecraft:behavior.random_look_around":{"priority":11},"minecraft:physics":{},"minecraft:mob_effect":{"effect_range":20,"effect_time":13,"mob_effect":"darkness","cooldown_time":6,"entity_filter":{"all_of":[{"test":"is_family","subject":"other","value":"player"},{"operator":"not","test":"has_ability","subject":"other","value":"invulnerable"}]}},"minecraft:follow_range":30,"minecraft:fire_immune":{},"minecraft:nameable":{},"minecraft:loot":{"table":"loot_tables/entities/warden.json"}},"events":{"minecraft:spawn_emerging":{"add":{"component_groups":["emerging"]}},"minecraft:emerged":{"add":{"component_groups":["pushable"]},"remove":{"component_groups":["emerging"]}},"minecraft:entity_spawned":{"add":{"component_groups":["pushable"]}},"on_digging_event":{"remove":{"component_groups":["pushable"]}}}}}'},5219:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:witch","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:celebrate":{"minecraft:behavior.celebrate":{"priority":5,"celebration_sound":"celebrate","sound_interval":{"range_min":2.0,"range_max":7.0},"jump_interval":{"range_min":1.0,"range_max":3.5},"duration":30.0,"on_celebration_end_event":{"event":"minecraft:stop_celebrating","target":"self"}}},"minecraft:raid_configuration":{"minecraft:dweller":{"dwelling_type":"village","dweller_role":"hostile","update_interval_base":60,"update_interval_variant":40,"can_find_poi":false,"can_migrate":false,"first_founding_reward":0},"minecraft:behavior.move_to_village":{"priority":3,"speed_multiplier":1.2,"goal_radius":2.0},"minecraft:ambient_sound_interval":{"value":2.0,"range":4.0,"event_name":"ambient.in.raid"}}},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0"},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:nameable":{},"minecraft:loot":{"table":"loot_tables/entities/witch.json"},"minecraft:health":{"value":26,"max":26},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_water":false},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":1},"minecraft:behavior.ranged_attack":{"priority":2,"speed_multiplier":1.0,"attack_interval_min":3,"attack_interval_max":3,"attack_radius":10.0},"minecraft:behavior.random_stroll":{"priority":4,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":5,"look_distance":8.0},"minecraft:behavior.random_look_around":{"priority":5,"look_distance":8.0},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":10}],"must_reach":true},"minecraft:type_family":{"family":["witch","monster","mob"]},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:follow_range":{"value":64},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:spawn_for_raid":{"add":{"component_groups":["minecraft:raid_configuration"]}},"minecraft:start_celebrating":{"add":{"component_groups":["minecraft:celebrate"]}},"minecraft:stop_celebrating":{"remove":{"component_groups":["minecraft:celebrate"]}}}}}'},2079:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"components":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:nameable":{},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true},"minecraft:health":{"value":20,"max":20},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.72,"height":2.01},"minecraft:attack":{"damage":4,"effect_name":"wither","effect_duration":10},"minecraft:loot":{"table":"loot_tables/entities/wither_skeleton.json"},"minecraft:equipment":{"table":"loot_tables/entities/wither_skeleton_gear.json"},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"is_amphibious":true,"avoid_sun":true,"avoid_water":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:shareables":{"items":[{"item":"minecraft:netherite_sword","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_sword","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_sword","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:stone_sword","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_sword","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:wooden_sword","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:wooden_shovel","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:stone_shovel","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:golden_shovel","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:iron_shovel","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:diamond_shovel","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:netherite_shovel","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:wooden_pickaxe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:stone_pickaxe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:golden_pickaxe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:iron_pickaxe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:diamond_pickaxe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:netherite_pickaxe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:wooden_axe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:stone_axe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:golden_axe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:iron_axe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:diamond_axe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:netherite_axe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:wooden_hoe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:stone_hoe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:golden_hoe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:iron_hoe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:diamond_hoe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:netherite_hoe","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:netherite_helmet","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_helmet","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_helmet","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_helmet","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_helmet","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_helmet","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_chestplate","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_chestplate","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_chestplate","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_chestplate","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_chestplate","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_chestplate","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_leggings","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_leggings","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_leggings","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_leggings","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_leggings","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_leggings","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_boots","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_boots","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_boots","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_boots","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_boots","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_boots","want_amount":1,"surplus_amount":1,"priority":5}]},"minecraft:scale":{"value":1.2},"minecraft:fire_immune":{},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"reselect_targets":true,"must_see":true,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"player"},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"piglin"},{"test":"is_difficulty","operator":"!=","value":"peaceful"}]},"max_dist":16},{"filters":{"test":"is_family","subject":"other","value":"irongolem"},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":16}]},"minecraft:behavior.equip_item":{"priority":3},"minecraft:behavior.melee_attack":{"priority":4,"track_target":true,"speed_multiplier":1.25},"minecraft:behavior.pickup_items":{"priority":5,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0,"pickup_based_on_chance":true},"minecraft:behavior.random_stroll":{"priority":6,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":7,"look_distance":8},"minecraft:behavior.random_look_around":{"priority":8},"minecraft:type_family":{"family":["wither","monster","undead","skeleton","mob"]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{}}}}'},5096:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","runtime_identifier":"minecraft:wolf","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:wolf_baby":{"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:ageable":{"duration":1200,"feed_items":["chicken","cooked_chicken","beef","cooked_beef","muttonRaw","muttonCooked","porkchop","cooked_porkchop","rabbit","cooked_rabbit","rotten_flesh"],"grow_up":{"event":"minecraft:ageable_grow_up","target":"self"}}},"minecraft:wolf_adult":{"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? Math.Random(1,3) : 0"},"minecraft:loot":{"table":"loot_tables/entities/wolf.json"},"minecraft:breedable":{"require_tame":true,"require_full_health":true,"breeds_with":{"mate_type":"{identifier}","baby_type":"{identifier}","breed_event":{"event":"minecraft:entity_born","target":"baby"}},"breed_items":["chicken","cooked_chicken","beef","cooked_beef","muttonRaw","muttonCooked","porkchop","cooked_porkchop","rabbit","cooked_rabbit","rotten_flesh"]}},"minecraft:wolf_angry":{"minecraft:angry":{"duration":25,"broadcast_anger":true,"broadcast_range":20,"calm_event":{"event":"minecraft:on_calm","target":"self"}},"minecraft:on_target_acquired":{},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.675,-0.1]}}},"minecraft:wolf_wild":{"minecraft:behavior.avoid_mob_type":{"priority":3,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"llama"},"max_dist":24,"walk_speed_multiplier":1.5,"sprint_speed_multiplier":1.5}],"probability_per_strength":0.14},"minecraft:tameable":{"probability":0.33,"tame_items":"bone","tame_event":{"event":"minecraft:on_tame","target":"self"}},"minecraft:behavior.nearest_attackable_target":{"priority":4,"reselect_targets":true,"must_see":true,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"skeleton"},{"test":"is_family","subject":"other","value":"sheep"},{"test":"is_family","subject":"other","value":"rabbit"},{"test":"is_family","subject":"other","value":"fox"}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":16},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"skeleton"},{"test":"is_underwater","subject":"other","operator":"!=","value":true}]},"max_dist":16}]},"minecraft:on_target_acquired":{"event":"minecraft:become_angry","target":"self"},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,0.675,-0.1]}}},"minecraft:wolf_tame":{"minecraft:is_tamed":{},"minecraft:health":{"value":20,"max":20},"minecraft:behavior.follow_owner":{"priority":6,"speed_multiplier":1.0,"start_distance":10,"stop_distance":2},"minecraft:attack":{"damage":4},"minecraft:behavior.breed":{"priority":2,"speed_multiplier":1.0},"minecraft:behavior.owner_hurt_by_target":{"priority":1},"minecraft:behavior.owner_hurt_target":{"priority":2},"minecraft:behavior.nearest_attackable_target":{"priority":5,"must_see":true,"entity_types":[{"filters":{"test":"is_family","subject":"other","value":"skeleton"},"max_dist":16}]},"minecraft:sittable":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0,"on_leash":{"event":"minecraft:on_leash","target":"self"},"on_unleash":{"event":"minecraft:on_unleash","target":"self"}}}},"components":{"minecraft:nameable":{},"minecraft:type_family":{"family":["wolf","mob"]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0},"minecraft:collision_box":{"width":0.6,"height":0.8},"minecraft:health":{"value":8,"max":8},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:movement":{"value":0.3},"minecraft:navigation.walk":{"can_path_over_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:attack":{"damage":3},"minecraft:healable":{"items":[{"item":"porkchop","heal_amount":3},{"item":"cooked_porkchop","heal_amount":8},{"item":"fish","heal_amount":2},{"item":"salmon","heal_amount":2},{"item":"clownfish","heal_amount":1},{"item":"pufferfish","heal_amount":1},{"item":"cooked_fish","heal_amount":5},{"item":"cooked_salmon","heal_amount":6},{"item":"beef","heal_amount":3},{"item":"cooked_beef","heal_amount":8},{"item":"chicken","heal_amount":2},{"item":"cooked_chicken","heal_amount":6},{"item":"muttonRaw","heal_amount":2},{"item":"muttonCooked","heal_amount":6},{"item":"rotten_flesh","heal_amount":4},{"item":"rabbit","heal_amount":3},{"item":"cooked_rabbit","heal_amount":5},{"item":"rabbit_stew","heal_amount":10}]},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.float":{"priority":0},"minecraft:behavior.mount_pathing":{"priority":1,"speed_multiplier":1.25,"target_dist":0,"track_target":true},"minecraft:behavior.stay_while_sitting":{"priority":3},"minecraft:behavior.leap_at_target":{"priority":4,"target_dist":0.4},"minecraft:behavior.melee_attack":{"priority":5},"minecraft:behavior.random_stroll":{"priority":8,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":6,"target_distance":6.0,"probability":0.02},"minecraft:behavior.beg":{"priority":9,"look_distance":8,"look_time":[2,4],"items":["bone","porkchop","cooked_porkchop","chicken","cooked_chicken","beef","cooked_beef","rotten_flesh","muttonraw","muttoncooked","rabbit","cooked_rabbit"]},"minecraft:behavior.hurt_by_target":{"priority":3},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":9,"remove":{},"add":{"component_groups":["minecraft:wolf_adult","minecraft:wolf_wild"]}},{"weight":1,"remove":{},"add":{"component_groups":["minecraft:wolf_baby","minecraft:wolf_wild"]}}]},"minecraft:entity_born":{"remove":{},"add":{"component_groups":["minecraft:wolf_baby","minecraft:wolf_tame"]}},"minecraft:ageable_grow_up":{"remove":{"component_groups":["minecraft:wolf_baby"]},"add":{"component_groups":["minecraft:wolf_adult"]}},"minecraft:ageable_set_baby":{"remove":{"component_groups":["minecraft:wolf_adult"]},"add":{"component_groups":["minecraft:wolf_baby"]}},"minecraft:on_tame":{"remove":{"component_groups":["minecraft:wolf_wild"]},"add":{"component_groups":["minecraft:wolf_tame"]}},"minecraft:become_angry":{"remove":{"component_groups":["minecraft:wolf_wild"]},"add":{"component_groups":["minecraft:wolf_angry"]}},"minecraft:on_calm":{"remove":{"component_groups":["minecraft:wolf_angry"]},"add":{"component_groups":["minecraft:wolf_wild"]}}}}}'},4079:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"zoglin_baby":{"minecraft:type_family":{"family":["zoglin","zoglin_baby","undead","mob"]},"minecraft:is_baby":{},"minecraft:attack":{"damage":1},"minecraft:scale":{"value":0.5},"minecraft:collision_box":{"width":0.85,"height":0.85},"minecraft:custom_hit_test":{"hitboxes":[{"width":1.0,"height":0.85,"pivot":[0,0.5,0]}]}},"zoglin_adult":{"minecraft:type_family":{"family":["zoglin","zoglin_adult","undead","mob"]},"minecraft:collision_box":{"width":0.9,"height":0.9},"minecraft:custom_hit_test":{"hitboxes":[{"width":2.0,"height":1.75,"pivot":[0,1,0]}]},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:attack":{"damage":[3,8]}}},"components":{"minecraft:nameable":{},"minecraft:loot":{"table":"loot_tables/entities/zoglin.json"},"minecraft:experience_reward":{"on_bred":"Math.Random(1,7)","on_death":"query.last_hit_by_player ? 5 : 0"},"minecraft:health":{"value":40,"max":40},"minecraft:knockback_resistance":{"value":0.5},"minecraft:behavior.nearest_attackable_target":{"priority":3,"within_radius":16.0,"entity_types":[{"filters":{"all_of":[{"test":"is_family","subject":"other","operator":"!=","value":"zoglin"},{"test":"is_family","subject":"other","operator":"!=","value":"creeper"}]},"max_dist":16}],"must_see":true},"minecraft:behavior.melee_attack":{"priority":4,"speed_multiplier":1.4,"track_target":true},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true},"minecraft:movement":{"value":0.25},"minecraft:navigation.walk":{"is_amphibious":true,"can_path_over_water":false,"avoid_water":true,"avoid_damage_blocks":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:fire_immune":{},"minecraft:leashable":{"soft_distance":4.0,"hard_distance":6.0,"max_distance":10.0},"minecraft:despawn":{"filters":{"any_of":[{"all_of":[{"test":"is_persistent","value":false},{"test":"distance_to_nearest_player","operator":">","value":54}]},{"all_of":[{"test":"is_persistent","value":false},{"test":"inactivity_timer","subject":"self","value":30},{"test":"random_chance","value":800},{"test":"distance_to_nearest_player","operator":">","value":32}]}]}},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1.0},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6.0,"probability":0.02},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_transformed":{"sequence":[{"filters":{"test":"has_component","subject":"other","value":"minecraft:is_baby"},"add":{"component_groups":["zoglin_baby"]}},{"filters":{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["zoglin_adult"]}}]},"minecraft:entity_spawned":{"randomize":[{"weight":95,"add":{"component_groups":["zoglin_adult"]}},{"weight":5,"add":{"component_groups":["zoglin_baby"]}}]},"minecraft:as_adult":{"add":{"component_groups":["zoglin_adult"]}},"minecraft:as_baby":{"add":{"component_groups":["zoglin_baby"]}}}}}'},6342:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:look_to_start_drowned_transformation":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":true},"event":"minecraft:start_transforming"}}},"minecraft:start_drowned_transformation":{"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_underwater","subject":"self","operator":"==","value":false},"event":"minecraft:stop_transforming"}},"minecraft:timer":{"looping":false,"time":30,"time_down_event":{"event":"minecraft:convert_to_drowned"}}},"minecraft:convert_to_drowned":{"minecraft:transformation":{"into":"minecraft:drowned","transformation_sound":"convert_to_drowned","drop_equipment":true,"delay":{"value":15}},"minecraft:is_shaking":{}},"minecraft:convert_to_baby_drowned":{"minecraft:transformation":{"into":"minecraft:drowned","transformation_sound":"convert_to_drowned","drop_equipment":true,"delay":{"value":15}},"minecraft:is_shaking":{}},"minecraft:zombie_baby":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:movement":{"value":0.35}},"minecraft:zombie_adult":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:movement":{"value":0.23},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,1.1,-0.35],"lock_rider_rotation":0}},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true}},"minecraft:zombie_jockey":{"minecraft:behavior.find_mount":{"priority":1,"within_radius":16,"start_delay":15,"max_failed_attempts":20}},"minecraft:can_have_equipment":{"minecraft:equipment":{"table":"loot_tables/entities/zombie_equipment.json"}}},"components":{"minecraft:nameable":{},"minecraft:type_family":{"family":["zombie","undead","monster","mob"]},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:burns_in_daylight":{},"minecraft:movement.basic":{},"minecraft:navigation.walk":{"is_amphibious":true,"can_pass_doors":true,"can_walk":true,"can_break_doors":true},"minecraft:annotation.break_door":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_air":true,"breathes_water":true},"minecraft:attack":{"damage":3},"minecraft:loot":{"table":"loot_tables/entities/zombie.json"},"minecraft:shareables":{"items":[{"item":"minecraft:netherite_sword","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_sword","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_sword","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:stone_sword","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_sword","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:wooden_sword","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_helmet","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_helmet","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_helmet","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_helmet","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_helmet","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_helmet","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_chestplate","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_chestplate","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_chestplate","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_chestplate","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_chestplate","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_chestplate","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_leggings","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_leggings","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_leggings","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_leggings","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_leggings","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_leggings","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_boots","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_boots","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_boots","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_boots","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_boots","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_boots","want_amount":1,"surplus_amount":1,"priority":5}]},"minecraft:environment_sensor":{"triggers":{"filters":{"test":"is_underwater","operator":"==","value":true},"event":"minecraft:start_transforming"}},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.equip_item":{"priority":2},"minecraft:behavior.melee_attack":{"priority":3},"minecraft:behavior.stomp_turtle_egg":{"priority":4,"speed_multiplier":1,"search_range":10,"search_height":2,"goal_radius":1.14,"interval":20},"minecraft:behavior.pickup_items":{"priority":6,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0,"pickup_based_on_chance":true,"can_pickup_any_item":true},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"reselect_targets":true,"within_radius":25.0,"must_see_forget_duration":17.0,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":35},{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},"max_dist":35,"must_see":false},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":35}]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_spawned":{"randomize":[{"weight":380,"remove":{},"add":{"component_groups":["minecraft:zombie_adult","minecraft:can_have_equipment"]}},{"weight":17,"remove":{},"add":{"component_groups":["minecraft:zombie_baby","minecraft:can_have_equipment"]}},{"weight":3,"remove":{},"add":{"component_groups":["minecraft:zombie_baby","minecraft:zombie_jockey","minecraft:can_have_equipment"]}}]},"minecraft:as_adult":{"add":{"component_groups":["minecraft:zombie_adult"]}},"minecraft:as_baby":{"add":{"component_groups":["minecraft:zombie_baby"]}},"minecraft:start_transforming":{"add":{"component_groups":["minecraft:start_drowned_transformation"]},"remove":{"component_groups":["minecraft:look_to_start_drowned_transformation"]}},"minecraft:stop_transforming":{"add":{"component_groups":["minecraft:look_to_start_drowned_transformation"]},"remove":{"component_groups":["minecraft:start_drowned_transformation"]}},"minecraft:convert_to_drowned":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:convert_to_drowned"]},"remove":{"component_groups":["minecraft:start_drowned_transformation"]}},{"filters":{"test":"has_component","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:convert_to_baby_drowned"]},"remove":{"component_groups":["minecraft:start_drowned_transformation"]}}]}}}}'},1363:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"minecraft:pig_zombie_baby":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:is_baby":{},"minecraft:scale":{"value":0.5}},"minecraft:pig_zombie_adult":{"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,1.1,-0.35],"lock_rider_rotation":0}},"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"}},"minecraft:pig_zombie_angry":{"minecraft:angry":{"duration":25,"broadcast_anger":true,"broadcast_range":20,"calm_event":{"event":"minecraft:on_calm","target":"self"}}},"minecraft:pig_zombie_calm":{"minecraft:on_target_acquired":{"event":"minecraft:become_angry","target":"self"}},"minecraft:strider_jockey":{"minecraft:equipment":{"table":"loot_tables/entities/zombified_piglin_rider_gear.json"}}},"components":{"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:nameable":{},"minecraft:navigation.walk":{"is_amphibious":true,"can_pass_doors":true,"can_open_doors":true,"avoid_water":true,"avoid_portals":true},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:fire_immune":{},"minecraft:type_family":{"family":["zombie_pigman","undead","monster","mob"]},"minecraft:loot":{"table":"loot_tables/entities/zombie_pigman.json"},"minecraft:equipment":{"table":"loot_tables/entities/zombie_pigman_gear.json"},"minecraft:health":{"value":20,"max":20},"minecraft:movement":{"value":0.23},"minecraft:attack":{"damage":5},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:shareables":{"items":[{"item":"minecraft:netherite_sword","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_sword","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:iron_sword","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:stone_sword","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:golden_sword","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:wooden_sword","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:netherite_helmet","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_helmet","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_helmet","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_helmet","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_helmet","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_helmet","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_chestplate","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_chestplate","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_chestplate","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_chestplate","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_chestplate","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_chestplate","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_leggings","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_leggings","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_leggings","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_leggings","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_leggings","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_leggings","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_boots","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_boots","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_boots","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_boots","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_boots","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_boots","want_amount":1,"surplus_amount":1,"priority":5}]},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.mount_pathing":{"priority":2,"speed_multiplier":1.25,"target_dist":0,"track_target":true},"minecraft:behavior.equip_item":{"priority":3},"minecraft:behavior.melee_attack":{"priority":4,"speed_multiplier":1.5},"minecraft:behavior.stomp_turtle_egg":{"priority":5,"speed_multiplier":1,"search_range":10,"search_height":2,"goal_radius":1.14,"interval":20},"minecraft:behavior.pickup_items":{"priority":6,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0,"pickup_based_on_chance":true,"can_pickup_any_item":true},"minecraft:behavior.random_stroll":{"priority":7,"speed_multiplier":1.0},"minecraft:behavior.look_at_player":{"priority":8,"look_distance":6.0,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":9},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"minecraft:entity_transformed":{"sequence":[{"filters":{"test":"has_component","subject":"other","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:pig_zombie_baby","minecraft:pig_zombie_calm"]}},{"filters":{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["minecraft:pig_zombie_adult","minecraft:pig_zombie_calm"]}}]},"minecraft:entity_spawned":{"randomize":[{"weight":95,"remove":{},"add":{"component_groups":["minecraft:pig_zombie_adult","minecraft:pig_zombie_calm"]}},{"weight":5,"remove":{},"add":{"component_groups":["minecraft:pig_zombie_baby","minecraft:pig_zombie_calm"]}}]},"minecraft:on_calm":{"remove":{"component_groups":["minecraft:pig_zombie_angry"]},"add":{"component_groups":["minecraft:pig_zombie_calm"]}},"minecraft:become_angry":{"remove":{"component_groups":["minecraft:pig_zombie_calm"]},"add":{"component_groups":["minecraft:pig_zombie_angry"]}},"minecraft:spawn_as_strider_jockey":{"add":{"component_groups":["minecraft:strider_jockey"]}}}}}'},7173:e=>{e.exports='{"format_version":"1.16.0","minecraft:entity":{"description":{"identifier":"{identifier}","is_spawnable":true,"is_summonable":true,"is_experimental":false},"component_groups":{"become_zombie_villager_v2":{"minecraft:transformation":{"into":"minecraft:zombie_villager_v2","keep_level":false}},"baby":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:is_baby":{},"minecraft:scale":{"value":0.5},"minecraft:movement":{"value":0.35}},"adult":{"minecraft:experience_reward":{"on_death":"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"},"minecraft:movement":{"value":0.23},"minecraft:rideable":{"seat_count":1,"family_types":["zombie"],"seats":{"position":[0.0,1.1,-0.35]}},"minecraft:behavior.mount_pathing":{"priority":5,"speed_multiplier":1.25,"target_dist":0.0,"track_target":true}},"jockey":{"minecraft:behavior.find_mount":{"priority":1,"within_radius":16}},"from_abandoned_village":{"minecraft:navigation.walk":{"is_amphibious":true,"can_pass_doors":true,"can_open_doors":true,"avoid_water":true,"avoid_sun":true},"minecraft:behavior.flee_sun":{"priority":4,"speed_multiplier":1}},"to_villager":{"minecraft:transformation":{"into":"minecraft:villager","begin_transform_sound":"remedy","transformation_sound":"unfect","delay":{"value":100,"block_assist_chance":0.01,"block_radius":4,"block_chance":0.3,"block_types":["minecraft:bed","minecraft:iron_bars"]}},"minecraft:spell_effects":{"add_effects":[{"effect":"strength","duration":100},{"effect":"heal","duration":100}],"remove_effects":"weakness"},"minecraft:is_shaking":{}},"farmer":{"minecraft:type_family":{"family":["farmer","zombie","zombie_villager","undead","monster","mob"]},"minecraft:variant":{"value":0}},"fisherman":{"minecraft:type_family":{"family":["fisherman","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":0}},"shepherd":{"minecraft:type_family":{"family":["shepherd","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":0}},"fletcher":{"minecraft:type_family":{"family":["fletcher","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":0}},"librarian":{"minecraft:type_family":{"family":["librarian","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":1}},"cartographer":{"minecraft:type_family":{"family":["cartographer","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":1}},"cleric":{"minecraft:type_family":{"family":["cleric","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":2}},"armorer":{"minecraft:type_family":{"family":["armorer","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":3}},"weaponsmith":{"minecraft:type_family":{"family":["weaponsmith","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":3}},"toolsmith":{"minecraft:type_family":{"family":["toolsmith","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":3}},"butcher":{"minecraft:type_family":{"family":["butcher","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":4}},"leatherworker":{"minecraft:type_family":{"family":["leatherworker","zombie_villager","zombie","undead","monster","mob"]},"minecraft:variant":{"value":4}}},"components":{"minecraft:navigation.walk":{"is_amphibious":true,"can_pass_doors":true,"can_break_doors":true,"avoid_sun":false},"minecraft:annotation.break_door":{},"minecraft:movement.basic":{},"minecraft:jump.static":{},"minecraft:can_climb":{},"minecraft:breathable":{"total_supply":15,"suffocate_time":0,"breathes_water":true},"minecraft:loot":{"table":"loot_tables/entities/zombie.json"},"minecraft:equip_item":{},"minecraft:collision_box":{"width":0.6,"height":1.9},"minecraft:burns_in_daylight":{},"minecraft:health":{"value":20,"max":20},"minecraft:hurt_on_condition":{"damage_conditions":[{"filters":{"test":"in_lava","subject":"self","operator":"==","value":true},"cause":"lava","damage_per_tick":4}]},"minecraft:attack":{"damage":3},"minecraft:nameable":{},"minecraft:shareables":{"items":[{"item":"minecraft:netherite_sword","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_sword","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_sword","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:stone_sword","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_sword","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:wooden_sword","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_helmet","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_helmet","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_helmet","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_helmet","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_helmet","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_helmet","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:turtle_helmet","want_amount":1,"surplus_amount":1,"priority":6},{"item":"minecraft:skull:0","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:skull:1","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:carved_pumpkin","want_amount":1,"surplus_amount":1,"priority":7},{"item":"minecraft:netherite_chestplate","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_chestplate","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_chestplate","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_chestplate","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_chestplate","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_chestplate","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_leggings","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_leggings","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_leggings","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_leggings","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_leggings","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_leggings","want_amount":1,"surplus_amount":1,"priority":5},{"item":"minecraft:netherite_boots","want_amount":1,"surplus_amount":1,"priority":0},{"item":"minecraft:diamond_boots","want_amount":1,"surplus_amount":1,"priority":1},{"item":"minecraft:iron_boots","want_amount":1,"surplus_amount":1,"priority":2},{"item":"minecraft:chainmail_boots","want_amount":1,"surplus_amount":1,"priority":3},{"item":"minecraft:golden_boots","want_amount":1,"surplus_amount":1,"priority":4},{"item":"minecraft:leather_boots","want_amount":1,"surplus_amount":1,"priority":5}]},"minecraft:interact":{"interactions":{"on_interact":{"filters":{"all_of":[{"test":"has_equipment","domain":"hand","subject":"other","value":"golden_apple"},{"test":"has_component","subject":"self","value":"minecraft:effect.weakness"}]},"event":"villager_converted","target":"self"},"use_item":true,"interact_text":"action.interact.cure"}},"minecraft:despawn":{"despawn_from_distance":{}},"minecraft:behavior.melee_attack":{"priority":6},"minecraft:behavior.equip_item":{"priority":3},"minecraft:behavior.stomp_turtle_egg":{"priority":4,"speed_multiplier":1,"search_range":10,"search_height":2,"goal_radius":1.14,"interval":20},"minecraft:behavior.pickup_items":{"priority":8,"max_dist":3,"goal_radius":2,"speed_multiplier":1.0,"pickup_based_on_chance":true,"can_pickup_any_item":true},"minecraft:behavior.random_stroll":{"priority":9,"speed_multiplier":1},"minecraft:behavior.look_at_player":{"priority":10,"look_distance":6,"probability":0.02},"minecraft:behavior.random_look_around":{"priority":11},"minecraft:behavior.hurt_by_target":{"priority":1},"minecraft:behavior.nearest_attackable_target":{"priority":2,"must_see":true,"reselect_targets":true,"entity_types":[{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"player"},{"test":"is_family","subject":"other","value":"snowgolem"},{"test":"is_family","subject":"other","value":"irongolem"}]},"max_dist":35},{"filters":{"any_of":[{"test":"is_family","subject":"other","value":"villager"},{"test":"is_family","subject":"other","value":"wandering_trader"}]},"max_dist":35,"must_see":false},{"filters":{"all_of":[{"test":"is_family","subject":"other","value":"baby_turtle"},{"test":"in_water","subject":"other","operator":"!=","value":true}]},"max_dist":35}]},"minecraft:physics":{},"minecraft:pushable":{"is_pushable":true,"is_pushable_by_piston":true},"minecraft:conditional_bandwidth_optimization":{}},"events":{"villager_converted":{"remove":{},"add":{"component_groups":["to_villager"]}},"minecraft:entity_spawned":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":9500,"remove":{},"add":{"component_groups":["adult"]}},{"weight":425,"remove":{},"add":{"component_groups":["baby"]}},{"weight":75,"remove":{},"add":{"component_groups":["baby","jockey"]}}]},{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":5,"add":{"component_groups":["farmer"]}},{"weight":5,"add":{"component_groups":["fisherman"]}},{"weight":5,"add":{"component_groups":["shepherd"]}},{"weight":5,"add":{"component_groups":["fletcher"]}},{"weight":20,"add":{"component_groups":["librarian"]}},{"weight":20,"add":{"component_groups":["cartographer"]}},{"weight":20,"add":{"component_groups":["cleric"]}},{"weight":6,"add":{"component_groups":["armorer"]}},{"weight":6,"add":{"component_groups":["weaponsmith"]}},{"weight":6,"add":{"component_groups":["toolsmith"]}},{"weight":10,"add":{"component_groups":["butcher"]}},{"weight":10,"add":{"component_groups":["leatherworker"]}}]}]},"minecraft:entity_transformed":{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"sequence":[{"filters":{"test":"has_component","subject":"other","value":"minecraft:is_baby"},"add":{"component_groups":["baby"]}},{"filters":{"test":"has_component","subject":"other","operator":"!=","value":"minecraft:is_baby"},"add":{"component_groups":["adult"]}},{"filters":{"test":"is_family","subject":"other","value":"farmer"},"add":{"component_groups":["farmer"]}},{"filters":{"test":"is_family","subject":"other","value":"fisherman"},"add":{"component_groups":["fisherman"]}},{"filters":{"test":"is_family","subject":"other","value":"shepherd"},"add":{"component_groups":["shepherd"]}},{"filters":{"test":"is_family","subject":"other","value":"fletcher"},"add":{"component_groups":["fletcher"]}},{"filters":{"test":"is_family","subject":"other","value":"librarian"},"add":{"component_groups":["librarian"]}},{"filters":{"test":"is_family","subject":"other","value":"cartographer"},"add":{"component_groups":["cartographer"]}},{"filters":{"test":"is_family","subject":"other","value":"cleric"},"add":{"component_groups":["cleric"]}},{"filters":{"test":"is_family","subject":"other","value":"armorer"},"add":{"component_groups":["armorer"]}},{"filters":{"test":"is_family","subject":"other","value":"weaponsmith"},"add":{"component_groups":["weaponsmith"]}},{"filters":{"test":"is_family","subject":"other","value":"toolsmith"},"add":{"component_groups":["toolsmith"]}},{"filters":{"test":"is_family","subject":"other","value":"butcher"},"add":{"component_groups":["butcher"]}},{"filters":{"test":"is_family","subject":"other","value":"leatherworker"},"add":{"component_groups":["leatherworker"]}}]},"minecraft:become_cleric":{"add":{"component_groups":["cleric"]}},"from_village":{"sequence":[{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":9500,"remove":{},"add":{"component_groups":["adult"]}},{"weight":425,"remove":{},"add":{"component_groups":["baby"]}},{"weight":75,"remove":{},"add":{"component_groups":["baby","jockey"]}}]},{"filters":{"test":"has_component","operator":"!=","value":"minecraft:variant"},"randomize":[{"weight":5,"add":{"component_groups":["farmer"]}},{"weight":5,"add":{"component_groups":["fisherman"]}},{"weight":5,"add":{"component_groups":["shepherd"]}},{"weight":5,"add":{"component_groups":["fletcher"]}},{"weight":20,"add":{"component_groups":["librarian"]}},{"weight":20,"add":{"component_groups":["cartographer"]}},{"weight":20,"add":{"component_groups":["cleric"]}},{"weight":6,"add":{"component_groups":["armorer"]}},{"weight":6,"add":{"component_groups":["weaponsmith"]}},{"weight":6,"add":{"component_groups":["toolsmith"]}},{"weight":10,"add":{"component_groups":["butcher"]}},{"weight":10,"add":{"component_groups":["leatherworker"]}}]},{"add":{"component_groups":["from_abandoned_village"]}}]}}}}'},5939:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"blockbench:basic","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/basic"},"geometry":{"default":"geometry.{name}"},"render_controllers":["controller.render.default"]}}}'},8397:e=>{e.exports='{"format_version":"1.19.0","minecraft:client_entity":{"description":{"identifier":"blockbench:vehicle","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/vehicle"},"geometry":{"default":"geometry.{name}"},"render_controllers":["controller.render.default"],"animations":{"drive":"animation.{name}.drive"},"scripts":{"initialize":["variable.steering = 0;"],"pre_animation":["query.has_rider ? (variable.steering = Math.lerp(variable.steering, query.yaw_speed, 0.15));"],"animate":["drive"]}}}}'},8965:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"allay"},"textures":{"default":"textures/entity/{name}"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#00daff","overlay_color":"#00adff"},"animations":{"idle":"animation.{name}.idle","fly":"animation.{name}.fly","hold_item":"animation.{name}.hold_item","general":"controller.animation.allay.general","holding":"controller.animation.allay.holding"},"scripts":{"pre_animation":["variable.holding_trident = query.is_item_name_any(\'slot.weapon.mainhand\', \'minecraft:trident\');"],"animate":["general","holding"]},"render_controllers":["controller.render.allay"],"enable_attachables":true}}}'},9231:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"geometry":{"default":"geometry.{name}"},"textures":{"default":"textures/entity/{name}"},"render_controllers":["controller.render.armadillo"],"scripts":{"pre_animation":["variable.x_head_rotation = math.clamp(query.target_x_rotation, -32.5, 32.5);","variable.y_head_rotation = math.clamp(query.target_y_rotation, -22.5, 25);","variable.is_rolled_up = query.property(\'minecraft:armadillo_state\') != \'unrolled\';","variable.rolled_up_time = variable.is_rolled_up ? ((variable.rolled_up_time ?? 0.0) + query.delta_time) : 0.0;","variable.is_peeking = query.property(\'minecraft:armadillo_state\') == \'rolled_up_peeking\';","variable.is_unrolling = query.property(\'minecraft:armadillo_state\') == \'rolled_up_unrolling\';","variable.unrolling_time = variable.is_unrolling ? ((variable.unrolling_time ?? 0.0) + query.delta_time) : 0.0;","variable.use_rolled_up_model = variable.rolled_up_time >= 0.2083 && (variable.unrolling_time == 0.0 || variable.unrolling_time <= 1.25 );","variable.walking = query.modified_move_speed > 0.01 && !variable.is_rolled_up;","variable.walk_anim_time_update = query.anim_time + math.min(3.0, math.lerp(2.0, 5.0, query.modified_move_speed)) * query.delta_time;"],"animate":["look_at_target_controller","walk_controller","roll_up_controller"],"should_update_effects_offscreen":"1.0"},"animations":{"look_at_target":"animation.{name}.look_at_target","look_at_target_controller":"controller.animation.armadillo.look_at_target","walk":"animation.{name}.walk","walk_controller":"controller.animation.armadillo.walk","roll_up":"animation.{name}.roll_up","rolled_up":"animation.{name}.rolled_up","peek":"animation.{name}.peek","unroll":"animation.{name}.unroll","unroll_fast":"animation.{name}.unroll_fast","roll_up_controller":"controller.animation.armadillo.roll_up"},"sound_effects":{"roll":"mob.armadillo.roll","land":"mob.armadillo.land","peek":"mob.armadillo.peek","unroll_start":"mob.armadillo.unroll_start","unroll_finish":"mob.armadillo.unroll_finish"},"spawn_egg":{"base_color":"#ad716d","overlay_color":"#824848"}}}}'},5154:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/{name}"},"animations":{"default_pose":"animation.{name}.default_pose","no_pose":"animation.{name}.no_pose","solemn_pose":"animation.{name}.solemn_pose","athena_pose":"animation.{name}.athena_pose","brandish_pose":"animation.{name}.brandish_pose","honor_pose":"animation.{name}.honor_pose","entertain_pose":"animation.{name}.entertain_pose","salute_pose":"animation.{name}.salute_pose","riposte_pose":"animation.{name}.riposte_pose","zombie_pose":"animation.{name}.zombie_pose","cancan_a_pose":"animation.{name}.cancan_a_pose","cancan_b_pose":"animation.{name}.cancan_b_pose","hero_pose":"animation.{name}.hero_pose","wiggle":"animation.{name}.wiggle","controller.pose":"controller.animation.armor_stand.pose","controller.wiggling":"controller.animation.armor_stand.wiggle"},"scripts":{"initialize":["variable.armor_stand.pose_index = 0;","variable.armor_stand.hurt_time = 0;"],"animate":["controller.pose","controller.wiggling"]},"geometry":{"default":"geometry.{name}"},"render_controllers":["controller.render.armor_stand"],"enable_attachables":true}}}'},4971:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"axolotl","limbs":"axolotl_limbs"},"textures":{"blue":"textures/entity/axolotl/axolotl_blue","cyan":"textures/entity/axolotl/axolotl_cyan","gold":"textures/entity/axolotl/axolotl_gold","lucy":"textures/entity/axolotl/axolotl_lucy","wild":"textures/entity/axolotl/axolotl_wild"},"geometry":{"default":"geometry.{name}"},"animations":{"idle_float":"animation.{name}.idle_underwater","idle_floor":"animation.{name}.idle_floor","idle_floor_water":"animation.{name}.idle_floor_underwater","swim":"animation.{name}.swim","walk_floor":"animation.{name}.walk_floor","walk_floor_water":"animation.{name}.walk_floor_underwater","play_dead":"animation.{name}.play_dead","swim_angle":"animation.{name}.swim_angle","look_at_target":"animation.common.look_at_target"},"scripts":{"pre_animation":["variable.moving = query.ground_speed > 0 || query.vertical_speed > 0;","variable.pitch = query.body_x_rotation;"]},"animation_controllers":[{"general":"controller.animation.axolotl.general"},{"move":"controller.animation.axolotl.move"}],"render_controllers":["controller.render.axolotl"],"spawn_egg":{"base_color":"#0xfbc1e3","overlay_color":"#0xa62d74"}}}}'},4271:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/bat"},"geometry":{"default":"geometry.{name}"},"scripts":{"scale":"0.35"},"animations":{"resting":"animation.{name}.resting","flying":"animation.{name}.flying"},"animation_controllers":[{"move":"controller.animation.bat.move"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":18}}}}'},1326:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/bee/bee","angry":"textures/entity/bee/bee_angry","nectar":"textures/entity/bee/bee_nectar","angry_nectar":"textures/entity/bee/bee_angry_nectar"},"geometry":{"default":"geometry.{name}"},"animations":{"flying":"animation.{name}.flying","drip":"controller.animation.bee.drip","controller_bee_sting":"controller.animation.bee.sting","bee_sting":"animation.{name}.sting","bee_no_stinger":"animation.{name}.no_stinger","bee_fly_bobbing":"animation.{name}.fly.bobbing","bee_root_controller":"controller.animation.bee.root"},"particle_effects":{"nectar_dripping":"minecraft:nectar_drip_particle"},"scripts":{"animate":["bee_root_controller",{"bee_no_stinger":"query.mark_variant == 1"}]},"render_controllers":["controller.render.bee"],"spawn_egg":{"texture":"egg_bee","texture_index":0}}}}'},9446:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"body":"blaze_body","head":"blaze_head"},"textures":{"default":"textures/entity/blaze"},"geometry":{"default":"geometry.{name}"},"animations":{"look_at_target":"animation.common.look_at_target","move":"animation.{name}.move"},"particle_effects":{"charged_flames":"minecraft:mobflame_emitter"},"animation_controllers":[{"move":"controller.animation.blaze.move"},{"flame":"controller.animation.blaze.flame"}],"render_controllers":["controller.render.blaze"],"spawn_egg":{"texture":"spawn_egg","texture_index":21}}}}'},5409:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_emissive_alpha","breeze_wind":"breeze_wind"},"textures":{"default":"textures/entity/breeze/breeze","breeze_wind":"textures/entity/breeze/breeze_wind"},"geometry":{"default":"geometry.{name}","breeze_wind_top":"geometry.breeze_wind_top","breeze_wind_mid":"geometry.breeze_wind_mid","breeze_wind_bottom":"geometry.breeze_wind_bottom"},"spawn_egg":{"base_color":"#af94df","overlay_color":"#9166df"},"scripts":{"animate":["look_at_controller","idle_controller","move_controller","ground_particles_controller","shoot_controller","jump_controller","idle_ground_sound_controller"],"should_update_effects_offscreen":"1.0"},"animations":{"look_at":"animation.common.look_at_target","idle":"animation.{name}.idle","jump":"animation.{name}.jump","shoot":"animation.{name}.shoot","slide":"animation.{name}.slide","idle_ground_particles":"animation.{name}.idle_ground_particles","slide_ground_particles":"animation.{name}.slide_ground_particles","whirl_sound":"animation.{name}.whirl_sound","idle_ground_sound":"animation.{name}.idle_ground_sound","look_at_controller":"controller.animation.breeze.look_at","idle_controller":"controller.animation.breeze.idle","move_controller":"controller.animation.breeze.move","ground_particles_controller":"controller.animation.breeze.ground_particles","shoot_controller":"controller.animation.breeze.shoot","jump_controller":"controller.animation.breeze.jump","idle_ground_sound_controller":"controller.animation.breeze.idle_ground_sound"},"render_controllers":["controller.render.breeze","controller.render.breeze_wind_top","controller.render.breeze_wind_mid","controller.render.breeze_wind_bottom"],"sound_effects":{"charge":"mob.breeze.charge","inhale":"mob.breeze.inhale","slide":"mob.breeze.slide","whirl":"mob.breeze.whirl","idle_ground_sound":"mob.breeze.idle_ground"},"particle_effects":{"ground_particles":"minecraft:breeze_ground_particle"}}}}'},9388:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"camel"},"textures":{"default":"textures/entity/camel/camel"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#fcc369","overlay_color":"#cb9337"},"animations":{"moving":"animation.{name}.walk","sit_down":"animation.{name}.sit_down","sitting":"animation.{name}.sit","stand_up":"animation.{name}.stand_up","look_at_target":"animation.{name}.look_at_target","dashing":"animation.{name}.dash","dashing_sound":"animation.{name}.dash_sound","idle":"animation.{name}.idle","main":"controller.animation.camel.general"},"scripts":{"pre_animation":["variable.dash_cooldown = (!(variable.last_dash_cooldown ?? true) && query.has_dash_cooldown) ? 2.75 : ( variable.dash_cooldown ?? 0 );","variable.dash_cooldown = math.max(0, variable.dash_cooldown-query.delta_time);","variable.dash_cooldown_progress = (2.75 - variable.dash_cooldown) / 2.75;","variable.last_dash_cooldown = query.has_dash_cooldown;","variable.moving = query.modified_move_speed > 0.05 || query.vertical_speed > 0.05;","variable.xTargetRot = math.clamp(query.target_x_rotation, -30, 30);","variable.xHeadRot = variable.dash_cooldown_progress > 0 ? math.clamp(variable.xTargetRot + (45 * (1 - variable.dash_cooldown_progress)), -25, 70) : variable.xTargetRot;","variable.yHeadRot = math.clamp(query.target_y_rotation, -30, 30);"],"animate":["main","idle"]},"sound_effects":{"sit_down":"mob.camel.sit","stand_up":"mob.camel.stand","dash":"mob.camel.dash"},"render_controllers":["controller.render.camel"]}}}'},5118:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"cat"},"textures":{"white":"textures/entity/cat/white","black":"textures/entity/cat/tuxedo","red":"textures/entity/cat/redtabby","siamese":"textures/entity/cat/siamesecat","british":"textures/entity/cat/britishshorthair","calico":"textures/entity/cat/calico","persian":"textures/entity/cat/persian","ragdoll":"textures/entity/cat/ragdoll","tabby":"textures/entity/cat/tabby","jellie":"textures/entity/cat/jellie","all_black":"textures/entity/cat/allblackcat","white_tame":"textures/entity/cat/white_tame","black_tame":"textures/entity/cat/tuxedo_tame","red_tame":"textures/entity/cat/redtabby_tame","siamese_tame":"textures/entity/cat/siamesecat_tame","british_tame":"textures/entity/cat/britishshorthair_tame","calico_tame":"textures/entity/cat/calico_tame","persian_tame":"textures/entity/cat/persian_tame","ragdoll_tame":"textures/entity/cat/ragdoll_tame","tabby_tame":"textures/entity/cat/tabby_tame","all_black_tame":"textures/entity/cat/allblackcat_tame","jellie_tame":"textures/entity/cat/jellie_tame"},"geometry":{"default":"geometry.{name}"},"animations":{"sneak":"animation.{name}.sneak","walk":"animation.{name}.walk","sprint":"animation.{name}.sprint","sit":"animation.{name}.sit","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform","lie_down":"animation.{name}.lie_down"},"animation_controllers":[{"look_at_target":"controller.animation.cat.look_at_target"},{"move":"controller.animation.cat.move"},{"baby":"controller.animation.cat.baby"}],"render_controllers":["controller.render.cat"],"spawn_egg":{"texture":"spawn_egg","texture_index":53}}}}'},8839:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"spider","invisible":"spider_invisible"},"textures":{"default":"textures/entity/spider/cave_spider"},"geometry":{"default":"geometry.{name}"},"scripts":{"scale":"0.7"},"animations":{"default_leg_pose":"animation.{name}.default_leg_pose","look_at_target":"animation.spider.look_at_target","walk":"animation.{name}.walk"},"animation_controllers":[{"move":"controller.animation.spider.move"}],"render_controllers":["controller.render.spider"],"spawn_egg":{"texture":"spawn_egg","texture_index":22}}}}'},9471:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.12.0","materials":{"default":"entity_alphatest","legs":"chicken_legs"},"textures":{"default":"textures/entity/chicken"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move","general":"animation.{name}.general","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform"},"scripts":{"animate":["general",{"move":"query.modified_move_speed"},"look_at_target",{"baby_transform":"query.is_baby"}]},"render_controllers":["controller.render.chicken"],"spawn_egg":{"texture":"spawn_egg","texture_index":0}}}}'},6500:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/fish/cod"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.ZRot = !query.is_in_water ? Math.cos((query.time_stamp + query.frame_alpha) * 14.32) * 90 : 0.0;","variable.AnimationAmountBlend = Math.lerp(variable.AnimationAmountPrev, variable.AnimationAmount, query.frame_alpha);"]},"animations":{"flop":"animation.{name}.flop","swim":"animation.{name}.swim"},"animation_controllers":[{"general":"controller.animation.fish.general"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":45}}}}'},4647:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/cow/cow"},"geometry":{"default":"geometry.{name}"},"animations":{"walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform"},"scripts":{"animate":[{"walk":"query.modified_move_speed"},"look_at_target",{"baby_transform":"query.is_baby"}]},"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":1}}}}'},5620:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_alphatest","charged":"charged_creeper"},"textures":{"default":"textures/entity/creeper/creeper","charged":"textures/entity/creeper/creeper_armor"},"geometry":{"default":"geometry.{name}","charged":"geometry.creeper.charged"},"spawn_egg":{"texture":"spawn_egg","texture_index":6},"scripts":{"pre_animation":["variable.wobble = Math.sin(query.swell_amount * 5730) * query.swell_amount * 0.01 + 1.0;","variable.swelling_scale1 = (Math.pow(Math.clamp(query.swell_amount, 0.0, 1.0), 4.0) * 0.4 + 1.0) * variable.wobble;","variable.swelling_scale2 = (Math.pow(Math.clamp(query.swell_amount, 0.0, 1.0), 4.0) * 0.1 + 1.0) / variable.wobble;","variable.leg_rot = Math.cos(query.modified_distance_moved * 38.17326) * 80.22 * query.modified_move_speed;","variable.flash = Math.mod(Math.Round(query.swell_amount * 10.0), 2.0);"]},"animations":{"creeper_head":"animation.common.look_at_target","creeper_legs":"animation.{name}.legs","creeper_swelling":"animation.{name}.swelling"},"animation_controllers":[{"creeper_head":"controller.animation.creeper.head"},{"creeper_legs":"controller.animation.creeper.legs"},{"creeper_swelling":"controller.animation.creeper.swelling"}],"render_controllers":["controller.render.creeper","controller.render.creeper_armor"]}}}'},3730:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/dolphin"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move"},"animation_controllers":[{"general":"controller.animation.dolphin.general"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":49}}}}'},5392:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"horse"},"textures":{"donkey":"textures/entity/horse2/donkey","markings_none":"textures/entity/horse2/horse_markings_none","armor_none":"textures/entity/horse2/armor/horse_armor_none"},"geometry":{"default":"geometry.{name}"},"animations":{"baby_transform":"animation.{name}.baby_transform","walk":"animation.{name}.walk","eat":"animation.{name}.eat","rear":"animation.{name}.rear","tail":"animation.{name}.tail","look_at_player":"animation.{name}.look_at_player"},"scripts":{"scale":"0.87","initialize":["variable.eat_anim = 0;","variable.stand_anim = 0;","variable.leg_stand_factor = 0;","variable.leg_x_rot_anim = 0;"],"pre_animation":["variable.eat_anim = math.clamp(variable.eat_anim + (query.is_grazing ? ((1.0 - variable.eat_anim) * 0.4 + 0.05) : -variable.eat_anim * 0.4 - 0.05) * query.delta_time * 20.0, 0.0, 1.0);","variable.head_x_rot = query.target_x_rotation + (query.modified_move_speed > 0.2 ? (math.cos(query.modified_distance_moved * 11.46) * 11.46 * query.modified_move_speed + query.modified_move_speed * 11.46) : 0.0);","variable.inverse_max_stand_eat = (1.0 - math.max(variable.stand_anim, variable.eat_anim));","variable.leg_stand_factor = math.cos((query.modified_distance_moved * 38.38) + 180.0);","variable.leg_x_rot_anim = variable.leg_stand_factor * 45.8 * query.modified_move_speed;"],"animate":[{"baby_transform":"query.is_baby"},"walk","look_at_player",{"rear":"variable.stand_anim > 0.0"},{"eat":"!query.is_standing"},{"tail":"Math.mod(q.life_time, 10) < 0.5"}]},"render_controllers":["controller.render.donkey.v3"],"spawn_egg":{"texture":"spawn_egg","texture_index":30}}}}'},5111:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.16.0","materials":{"default":"drowned"},"textures":{"default":"textures/entity/zombie/drowned"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"],"animate":[{"humanoid_big_head":"query.is_baby"},"look_at_target","move",{"riding.arms":"query.is_riding"},{"riding.legs":"query.is_riding"},"holding",{"charging":"query.is_charging"},"attack_controller",{"brandish_spear":"variable.is_brandishing_spear"},"bob",{"damage_nearby_mobs":"variable.damage_nearby_mobs"},{"use_item_progress":"( variable.use_item_interval_progress > 0.0 ) || ( variable.use_item_startup_progress > 0.0 )"},{"swimming":"variable.swim_amount > 0.0"}]},"animations":{"humanoid_big_head":"animation.humanoid.big_head","look_at_target":"controller.animation.humanoid.look_at_target","look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","use_item_progress":"animation.humanoid.use_item_progress","attack_controller":"controller.animation.drowned.attack.rotations","zombie_attack_bare_hand":"animation.zombie.attack_bare_hand","attack_rotations":"animation.{name}.attack.rotations","swimming":"animation.zombie.swimming"},"render_controllers":["controller.render.default"],"enable_attachables":true,"spawn_egg":{"texture":"spawn_egg","texture_index":48}}}}'},4682:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_emissive_alpha","invisible":"enderman_invisible"},"textures":{"default":"textures/entity/enderman/enderman"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 28.65;"]},"animations":{"look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.{name}.move","attack.rotations":"animation.{name}.attack.rotations","bob":"animation.{name}.bob","arms_legs":"animation.{name}.arms_legs","carrying":"animation.{name}.carrying","scary_face":"animation.{name}.scary_face"},"animation_controllers":[{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"attack":"controller.animation.humanoid.attack"},{"bob":"controller.animation.humanoid.bob"},{"carrying":"controller.animation.enderman.carrying"},{"scary_face":"controller.animation.enderman.scary_face"}],"render_controllers":["controller.render.enderman"],"spawn_egg":{"texture":"spawn_egg","texture_index":7}}}}'},3795:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/endermite"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move"},"animation_controllers":[{"move":"controller.animation.endermite.move"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":25}}}}'},3185:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/illager/evoker"},"geometry":{"default":"geometry.{name}"},"scripts":{"scale":"0.9375","animate":["controller_general","controller_move"]},"animations":{"general":"animation.{name}.general","casting":"animation.{name}.casting","look_at_target":"animation.common.look_at_target","move":"animation.{name}.move","celebrating":"animation.humanoid.celebrating","controller_general":"controller.animation.evoker.general","controller_move":"controller.animation.villager.move"},"particle_effects":{"spell":"minecraft:evoker_spell"},"render_controllers":["controller.render.evoker"],"spawn_egg":{"texture":"spawn_egg","texture_index":40}}}}'},7457:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"red":"textures/entity/fox/fox","arctic":"textures/entity/fox/arctic_fox"},"geometry":{"default":"geometry.{name}"},"animations":{"walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform","crouch":"animation.{name}.crouch","sleep":"animation.{name}.sleep","setup":"animation.{name}.setup","sit":"animation.{name}.sit","wiggle":"animation.{name}.wiggle","stuck":"animation.{name}.stuck","pounce":"animation.{name}.pounce","move":"controller.animation.fox.move"},"scripts":{"animate":["setup",{"baby_transform":"query.is_baby"},"move"]},"render_controllers":["controller.render.fox"],"spawn_egg":{"texture":"spawn_egg","texture_index":55}}}}'},7718:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"frog"},"textures":{"temperate":"textures/entity/frog/temperate_frog","cold":"textures/entity/frog/cold_frog","warm":"textures/entity/frog/warm_frog"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#d07444","overlay_color":"#ffc77c"},"animations":{"croak":"animation.{name}.croak","jump":"animation.{name}.jump","tongue":"animation.{name}.tongue","walk":"animation.{name}.walk","swim":"animation.{name}.swim","idle_water":"animation.{name}.idle.water","look_at_target":"animation.common.look_at_target","general":"controller.animation.frog.general","croaking":"controller.animation.frog.croaking","eat_mob":"controller.animation.frog.eat_mob"},"scripts":{"animate":["general","croaking","eat_mob"],"pre_animation":["variable.moving = query.ground_speed > 0 || query.vertical_speed > 0;"]},"render_controllers":["controller.render.frog"]}}}'},9073:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"ghast"},"textures":{"default":"textures/entity/ghast/ghast","shooting":"textures/entity/ghast/ghast_shooting"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"texture":"spawn_egg","texture_index":19},"animations":{"move":"animation.{name}.move","scale":"animation.{name}.scale"},"animation_controllers":[{"move":"controller.animation.ghast.move"},{"scale":"controller.animation.ghast.scale"}],"render_controllers":["controller.render.ghast"]}}}'},7056:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"glow_squid"},"textures":{"default":"textures/entity/glow_squid/glow_squid"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move","squid_rotate":"animation.{name}.rotate"},"scripts":{"animate":["move","squid_rotate"]},"render_controllers":["controller.render.glow_squid"],"spawn_egg":{"base_color":"#0x095656","overlay_color":"#0x85f1bc"}}}}'},709:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"goat"},"textures":{"default":"textures/entity/goat/goat"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#c0ac90","overlay_color":"#857261"},"scripts":{"pre_animation":["variable.tcos_right_side = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;","variable.tcos_left_side = -variable.tcos_right_side;","variable.attack_head_rot = Math.sin(variable.attack_time * 180.0) * -37.3;","variable.ram_head_rot = Math.sin(variable.should_bow_head * 90.0) * 37.3;"],"animate":["walk","look_at_target",{"attack":"variable.has_target && variable.attack_time >= 0.0"},"ram_attack","horns"]},"animations":{"walk":"animation.{name}.walk","look_at_target":"animation.{name}.look_at_target","attack":"animation.{name}.attack","ram_attack":"animation.{name}.ram_attack","horns":"animation.{name}.horns"},"render_controllers":["controller.render.default"]}}}'},9273:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"guardian","ghost":"guardian_ghost"},"textures":{"default":"textures/entity/guardian","elder":"textures/entity/guardian_elder","beam":"textures/entity/guardian_beam"},"geometry":{"default":"geometry.{name}","ghost":"geometry.{name}"},"animations":{"setup":"animation.{name}.setup","spikes":"animation.{name}.spikes","swim":"animation.{name}.swim","look_at_target":"animation.common.look_at_target","move_eye":"animation.{name}.move_eye"},"scripts":{"pre_animation":["variable.spike_shake = Math.sin(query.life_time * 2000)/50;","variable.spike_animation_speed = query.life_time < 0.1 ? 0.0 : (!query.is_in_water ? (Math.round(Math.sin(query.life_time * 2000)) == 0.0 ? (Math.random(0.0, 1.0)) : (variable.spike_animation_speed)) : (query.is_moving ? (variable.spike_animation_speed - variable.spike_animation_speed * 0.06) : (variable.spike_animation_speed + (1.0 - variable.spike_animation_speed) * 0.06)));","variable.spike_extension = (1.0 - variable.spike_animation_speed) * 0.55;","variable.tail_animation_speed = query.life_time < 0.1 ? 0.0 : (!query.is_in_water ? 2.0 : query.is_moving ? (variable.tail_animation_speed < 0.5 ? 4.0 : variable.tail_animation_speed + (0.5 - variable.tail_animation_speed) * 0.1) : variable.tail_animation_speed + (0.125 - variable.tail_animation_speed) * 0.2);","variable.tail_swim = query.life_time < 0.1 ? 0.0 : (variable.tail_swim + variable.tail_animation_speed);","variable.tail_base_angle = Math.sin(variable.tail_swim*20.0);"],"animate":["setup","spikes","swim","look_at_target","move_eye"]},"render_controllers":["controller.render.guardian"],"spawn_egg":{"texture":"spawn_egg","texture_index":26}}}}'},3626:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"ghast"},"geometry":{"default":"geometry.{name}","ropes":"geometry.happy_ghast_ropes"},"textures":{"ghastling":"textures/entity/{name}/ghastling","happy_ghast":"textures/entity/{name}/{name}","ropes":"textures/entity/happy_ghast/happy_ghast_ropes"},"render_controllers":["controller.render.happy_ghast","controller.render.happy_ghast_ropes"],"scripts":{"pre_animation":["variable.is_harnessed = query.equipment_count > 0;","variable.shrink_scalar_to_avoid_z_fighting = 3.975f / 4.0f;","variable.shrink_scalar_when_harnessed = variable.is_harnessed ? (16.0f / 17.0f) : 1.0f;","variable.scale = variable.shrink_scalar_to_avoid_z_fighting * variable.shrink_scalar_when_harnessed;","variable.render_ropes = variable.is_harnessed && query.has_any_leashed_entity_of_type(\'minecraft:boat\', \'minecraft:chest_boat\', \'minecraft:horse\', \'minecraft:skeleton_horse\', \'minecraft:zombie_horse\', \'minecraft:mule\', \'minecraft:donkey\', \'minecraft:camel\', \'minecraft:sniffer\');"],"animate":["move_controller","scale_controller"],"should_update_effects_offscreen":"1.0"},"animations":{"move":"animation.{name}.move","move_controller":"controller.animation.happy_ghast.move","scale":"animation.{name}.scale","scale_controller":"controller.animation.happy_ghast.scale"},"enable_attachables":true,"spawn_egg":{"texture":"spawn_egg_happy_ghast"}}}}'},1139:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"hoglin"},"textures":{"default":"textures/entity/hoglin/hoglin"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#C66E55","overlay_color":"#5f6464"},"scripts":{"pre_animation":["variable.tcos_right_side = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;","variable.tcos_left_side = -variable.tcos_right_side;","variable.attack_head_rot = Math.sin(variable.attack_time * 180.0) * -37.3;"]},"animations":{"walk":"animation.{name}.walk","look_at_target":"animation.{name}.look_at_target","attack":"animation.{name}.attack","hoglin_baby_scaling":"animation.{name}.baby_scaling"},"animation_controllers":[{"look_at_target":"controller.animation.hoglin.look_at_target"},{"walk":"controller.animation.hoglin.walk"},{"attack":"controller.animation.hoglin.attack"},{"hoglin_baby_scaling":"controller.animation.hoglin.baby_scaling"}],"render_controllers":["controller.render.default"]}}}'},1373:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"horse_leather_armor"},"textures":{"base_brown":"textures/entity/horse2/horse_brown","base_white":"textures/entity/horse2/horse_white","base_creamy":"textures/entity/horse2/horse_creamy","base_chestnut":"textures/entity/horse2/horse_chestnut","base_black":"textures/entity/horse2/horse_black","base_gray":"textures/entity/horse2/horse_gray","base_darkbrown":"textures/entity/horse2/horse_darkbrown","markings_none":"textures/entity/horse2/horse_markings_none","markings_white":"textures/entity/horse2/horse_markings_white","markings_whitefield":"textures/entity/horse2/horse_markings_whitefield","markings_whitedots":"textures/entity/horse2/horse_markings_whitedots","markings_blackdots":"textures/entity/horse2/horse_markings_blackdots","armor_none":"textures/entity/horse2/armor/horse_armor_none","armor_leather":"textures/entity/horse2/armor/horse_armor_leather","armor_iron":"textures/entity/horse2/armor/horse_armor_iron","armor_gold":"textures/entity/horse2/armor/horse_armor_gold","armor_diamond":"textures/entity/horse2/armor/horse_armor_diamond"},"geometry":{"default":"geometry.{name}"},"animations":{"baby_transform":"animation.{name}.baby_transform","walk":"animation.{name}.walk","eat":"animation.{name}.eat","rear":"animation.{name}.rear","tail":"animation.{name}.tail","look_at_player":"animation.{name}.look_at_player"},"scripts":{"initialize":["variable.eat_anim = 0;","variable.stand_anim = 0;","variable.leg_stand_factor = 0;","variable.leg_x_rot_anim = 0;"],"pre_animation":["variable.armor_texture_slot = query.armor_texture_slot(1);","variable.eat_anim = math.clamp(variable.eat_anim + (query.is_grazing ? ((1.0 - variable.eat_anim) * 0.4 + 0.05) : -variable.eat_anim * 0.4 - 0.05) * query.delta_time * 20.0, 0.0, 1.0);","variable.head_x_rot = query.target_x_rotation + (query.modified_move_speed > 0.2 ? (math.cos(query.modified_distance_moved * 11.46) * 11.46 * query.modified_move_speed + query.modified_move_speed * 11.46) : 0.0);","variable.inverse_max_stand_eat = (1.0 - math.max(variable.stand_anim, variable.eat_anim));","variable.leg_stand_factor = math.cos((query.modified_distance_moved * 38.38) + 180.0);","variable.leg_x_rot_anim = variable.leg_stand_factor * 45.8 * query.modified_move_speed;"],"animate":[{"baby_transform":"query.is_baby"},"walk","look_at_player",{"rear":"variable.stand_anim > 0.0"},{"eat":"!query.is_standing"},{"tail":"Math.mod(q.life_time, 10) < 0.5"}]},"render_controllers":["controller.render.horse.v3"],"spawn_egg":{"texture":"spawn_egg","texture_index":23}}}}'},8387:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"husk"},"textures":{"default":"textures/entity/zombie/husk"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"]},"animations":{"humanoid_big_head":"animation.humanoid.big_head","look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","attack.rotations":"animation.humanoid.attack.rotations","sneaking":"animation.humanoid.sneaking","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","bow_and_arrow":"animation.humanoid.bow_and_arrow","use_item_progress":"animation.humanoid.use_item_progress","zombie_attack_bare_hand":"animation.zombie.attack_bare_hand","swimming":"animation.zombie.swimming"},"animation_controllers":[{"humanoid_baby_big_head":"controller.animation.humanoid.baby_big_head"},{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"riding":"controller.animation.humanoid.riding"},{"holding":"controller.animation.humanoid.holding"},{"brandish_spear":"controller.animation.humanoid.brandish_spear"},{"charging":"controller.animation.humanoid.charging"},{"attack":"controller.animation.humanoid.attack"},{"sneaking":"controller.animation.humanoid.sneaking"},{"bob":"controller.animation.humanoid.bob"},{"damage_nearby_mobs":"controller.animation.humanoid.damage_nearby_mobs"},{"bow_and_arrow":"controller.animation.humanoid.bow_and_arrow"},{"use_item_progress":"controller.animation.humanoid.use_item_progress"},{"zombie_attack_bare_hand":"controller.animation.zombie.attack_bare_hand"},{"swimming":"controller.animation.zombie.swimming"}],"render_controllers":["controller.render.default"],"enable_attachables":true,"spawn_egg":{"texture":"spawn_egg","texture_index":28}}}}'},7399:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"iron_golem"},"textures":{"default":"textures/entity/iron_golem"},"geometry":{"default":"geometry.{name}"},"animations":{"walk":"animation.{name}.walk","move":"animation.{name}.move","walk_to_target":"animation.{name}.walk_to_target","move_to_target":"animation.{name}.move_to_target","attack":"animation.{name}.attack","flower":"animation.{name}.flower","look_at_target":"animation.common.look_at_target","move_controller":"controller.animation.iron_golem.move","arm_controller":"controller.animation.iron_golem.arm_movement"},"scripts":{"pre_animation":["variable.modified_tcos0 = Math.clamp(((Math.cos(query.modified_distance_moved * 13.5) * Math.min(query.modified_move_speed, 0.6) / variable.gliding_speed_value) * 25.0), -12.5, 12.5);"],"animate":["look_at_target","move_controller","arm_controller"]},"render_controllers":["controller.render.default"]}}}'},8985:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"llama"},"textures":{"creamy":"textures/entity/llama/llama_creamy","white":"textures/entity/llama/llama_white","brown":"textures/entity/llama/llama_brown","gray":"textures/entity/llama/llama_gray","decor_none":"textures/entity/llama/decor/decor_none","decor_white":"textures/entity/llama/decor/decor_white","decor_orange":"textures/entity/llama/decor/decor_orange","decor_magenta":"textures/entity/llama/decor/decor_magenta","decor_light_blue":"textures/entity/llama/decor/decor_light_blue","decor_yellow":"textures/entity/llama/decor/decor_yellow","decor_lime":"textures/entity/llama/decor/decor_lime","decor_pink":"textures/entity/llama/decor/decor_pink","decor_gray":"textures/entity/llama/decor/decor_gray","decor_silver":"textures/entity/llama/decor/decor_silver","decor_cyan":"textures/entity/llama/decor/decor_cyan","decor_purple":"textures/entity/llama/decor/decor_purple","decor_blue":"textures/entity/llama/decor/decor_blue","decor_brown":"textures/entity/llama/decor/decor_brown","decor_green":"textures/entity/llama/decor/decor_green","decor_red":"textures/entity/llama/decor/decor_red","decor_black":"textures/entity/llama/decor/decor_black","decor_wandering_trader":"textures/entity/llama/decor/trader_llama_decor"},"geometry":{"default":"geometry.{name}"},"animations":{"setup":"animation.llama.setup","walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","baby_transform":"animation.llama.baby_transform"},"animation_controllers":[{"move":"controller.animation.llama.move"},{"baby":"controller.animation.llama.baby"}],"render_controllers":["controller.render.llama"],"spawn_egg":{"texture":"spawn_egg","texture_index":38}}}}'},2109:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_emissive_alpha"},"textures":{"default":"textures/entity/slime/magmacube"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.slime_squish_factor = (query.previous_squish_value + (query.current_squish_value - query.previous_squish_value) * query.frame_alpha);","variable.bounce = 1 / ((variable.slime_squish_factor / (query.variant * 0.5 + 1)) + 1);","variable.horizontal_scale_amount = variable.bounce * query.variant;","variable.vertical_scale_amount = (1 / variable.bounce) * query.variant;"],"scaleX":"variable.horizontal_scale_amount","scaleY":"variable.vertical_scale_amount","scaleZ":"variable.horizontal_scale_amount"},"animations":{"move":"animation.{name}.move"},"animation_controllers":[{"general":"controller.animation.magma_cube.general"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":20}}}}'},4037:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/cow/mooshroom"},"geometry":{"default":"geometry.{name}"},"animations":{"walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform"},"animation_controllers":[{"move":"controller.animation.mooshroom.move"},{"baby":"controller.animation.mooshroom.baby"}],"render_controllers":["controller.render.mooshroom"],"spawn_egg":{"texture":"spawn_egg","texture_index":5}}}}'},6243:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"horse"},"textures":{"mule":"textures/entity/horse2/mule","markings_none":"textures/entity/horse2/horse_markings_none","armor_none":"textures/entity/horse2/armor/horse_armor_none"},"geometry":{"default":"geometry.{name}"},"animations":{"baby_transform":"animation.{name}.baby_transform","walk":"animation.{name}.walk","eat":"animation.{name}.eat","rear":"animation.{name}.rear","tail":"animation.{name}.tail","look_at_player":"animation.{name}.look_at_player"},"scripts":{"scale":"0.92","initialize":["variable.eat_anim = 0;","variable.stand_anim = 0;","variable.leg_stand_factor = 0;","variable.leg_x_rot_anim = 0;"],"pre_animation":["variable.eat_anim = math.clamp(variable.eat_anim + (query.is_grazing ? ((1.0 - variable.eat_anim) * 0.4 + 0.05) : -variable.eat_anim * 0.4 - 0.05) * query.delta_time * 20.0, 0.0, 1.0);","variable.head_x_rot = query.target_x_rotation + (query.modified_move_speed > 0.2 ? (math.cos(query.modified_distance_moved * 11.46) * 11.46 * query.modified_move_speed + query.modified_move_speed * 11.46) : 0.0);","variable.inverse_max_stand_eat = (1.0 - math.max(variable.stand_anim, variable.eat_anim));","variable.leg_stand_factor = math.cos((query.modified_distance_moved * 38.38) + 180.0);","variable.leg_x_rot_anim = variable.leg_stand_factor * 45.8 * query.modified_move_speed;"],"animate":[{"baby_transform":"query.is_baby"},"walk","look_at_player",{"rear":"variable.stand_anim > 0.0"},{"eat":"!query.is_standing"},{"tail":"Math.mod(q.life_time, 10) < 0.5"}]},"render_controllers":["controller.render.mule.v3"],"spawn_egg":{"texture":"spawn_egg","texture_index":31}}}}'},8003:e=>{e.exports='{"format_version":"1.12.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"npc"},"textures":{"default":"textures/entity/npc"},"geometry":{"default":"geometry.npc"},"scripts":{"animate":[{"move":"query.modified_move_speed"},"look_at_target",{"baby_transform":"query.is_baby"}]},"animations":{"look_at_target":"animation.common.look_at_target","move":"animation.npc.move","baby_transform":"animation.npc.baby_transform"},"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":35}}}}'},2688:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"ocelot"},"textures":{"default":"textures/entity/cat/ocelot"},"geometry":{"default":"geometry.{name}"},"animations":{"sneak":"animation.{name}.sneak","walk":"animation.{name}.walk","sprint":"animation.{name}.sprint","sit":"animation.{name}.sit","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform"},"animation_controllers":[{"move":"controller.animation.ocelot.move"},{"baby":"controller.animation.ocelot.baby"},{"look_at_target":"controller.animation.ocelot.look_at_target"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":16}}}}'},3514:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/panda/panda","lazy":"textures/entity/panda/panda_lazy","worried":"textures/entity/panda/panda_worried","playful":"textures/entity/panda/panda_playful","brown":"textures/entity/panda/panda_brown","weak":"textures/entity/panda/panda_sneezy","aggressive":"textures/entity/panda/panda_aggressive"},"geometry":{"default":"geometry.{name}"},"animations":{"unhappy":"animation.{name}.unhappy","sneezing":"animation.{name}.sneezing","walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform","sitting":"animation.{name}.sitting","rolling":"animation.{name}.rolling","lying":"animation.{name}.lying"},"animation_controllers":[{"move":"controller.animation.panda.move"},{"unhappy":"controller.animation.panda.unhappy"},{"sneezing":"controller.animation.panda.sneezing"},{"baby":"controller.animation.panda.baby"}],"render_controllers":["controller.render.panda"],"spawn_egg":{"texture":"spawn_egg","texture_index":54}}}}'},2592:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"parrot"},"textures":{"blue":"textures/entity/parrot/parrot_blue","green":"textures/entity/parrot/parrot_green","red_blue":"textures/entity/parrot/parrot_red_blue","yellow_blue":"textures/entity/parrot/parrot_yellow_blue","grey":"textures/entity/parrot/parrot_grey"},"geometry":{"default":"geometry.{name}"},"animations":{"moving":"animation.{name}.moving","base":"animation.{name}.base","dance":"animation.{name}.dance","sitting":"animation.{name}.sitting","flying":"animation.{name}.flying","standing":"animation.{name}.standing","look_at_target":"animation.common.look_at_target","movement_controller":"controller.animation.parrot.move"},"scripts":{"pre_animation":["variable.state = query.is_dancing ? 3 : (query.is_sitting ? 2 : (!query.is_on_ground && !query.is_jumping && !query.is_riding ? 0 : 1));","variable.dance.x = Math.cos(query.life_time * 57.3 * 20.0);","variable.dance.y = -Math.sin(query.life_time * 57.3 * 20.0);","variable.wing_flap = ((math.sin(query.wing_flap_position * 57.3) + 1) * query.wing_flap_speed);"],"animate":["look_at_target","movement_controller"]},"render_controllers":["controller.render.parrot"],"spawn_egg":{"texture":"spawn_egg","texture_index":43}}}}'},2725:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"phantom","invisible":"phantom_invisible"},"textures":{"default":"textures/entity/phantom"},"geometry":{"default":"geometry.{name}"},"scripts":{"initialize":["variable.runtimeid = 0;","variable.tailrotx = -5.0;","variable.wingrotz = 0.0;"],"animate":["phantom_base_pose_controller","move"]},"animations":{"phantom_base_pose":"animation.{name}.base_pose","phantom_base_pose_controller":"controller.animation.phantom.base_pose","move":"animation.{name}.move"},"particle_effects":{"wing_dust":"minecraft:phantom_trail_particle"},"sound_effects":{"flap":"mob.phantom.flap"},"render_controllers":["controller.render.phantom"],"spawn_egg":{"texture":"spawn_egg","texture_index":51}}}}'},4750:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/pig/pig","saddled":"textures/entity/pig/pig_saddle"},"geometry":{"default":"geometry.{name}"},"animations":{"setup":"animation.{name}.setup","walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform"},"scripts":{"animate":["setup",{"walk":"query.modified_move_speed"},"look_at_target",{"baby_transform":"query.is_baby"}]},"render_controllers":["controller.render.pig"],"spawn_egg":{"texture":"spawn_egg","texture_index":2}}}}'},1569:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"piglin"},"textures":{"default":"textures/entity/piglin/piglin"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#995f40","overlay_color":"#f9f3a4"},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;","variable.attack = Math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3;","variable.attack2 = Math.sin(variable.attack_time * 180.0) * 57.3;","variable.z_bob = Math.cos(query.life_time * 103.13244) * 2.865 + 2.865;","variable.x_bob = Math.sin(query.life_time * 76.776372) * 2.865;"],"animate":[{"admire":"query.is_admiring"},{"humanoid_big_head":"query.is_baby"},{"celebrate_hunt":"query.is_celebrating"},{"celebrate_hunt_special":"query.is_celebrating_special"},"move","bob","look_at_target_controller","piglin_attack_controller","riding_controller"]},"animations":{"move":"animation.{name}.move","bob":"animation.humanoid.bob","humanoid_big_head":"animation.humanoid.big_head","admire":"animation.{name}.admire","celebrate_hunt":"animation.{name}.celebrate_hunt","celebrate_hunt_special":"animation.{name}.celebrate_hunt_special","look_at_target_controller":"controller.animation.humanoid.look_at_target","look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","piglin_attack_controller":"controller.animation.piglin.attack","crossbow_hold":"animation.{name}.crossbow.hold","crossbow_charge":"animation.{name}.crossbow.charge","melee_attack":"animation.{name}.sword.attack","hand_attack":"animation.{name}.hand.attack","riding_controller":"controller.animation.humanoid.riding","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs"},"render_controllers":["controller.render.piglin"],"enable_attachables":true}}}'},5324:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"pillager"},"textures":{"default":"textures/entity/pillager"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"texture":"spawn_egg","texture_index":56},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"],"animate":["pillager_root_controller"]},"animations":{"humanoid_base_pose":"animation.humanoid.base_pose","look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","attack.rotations":"animation.humanoid.attack.rotations","bob":"animation.humanoid.bob","crossbow_hold":"animation.pillager.crossbow.hold","crossbow_charge":"animation.pillager.crossbow.charge","celebrating":"animation.humanoid.celebrating","controller_humanoid_base_pose":"controller.animation.humanoid.base_pose","controller_look_at_target":"controller.animation.humanoid.look_at_target","controller_move":"controller.animation.humanoid.move","controller_riding":"controller.animation.humanoid.riding","controller_attack":"controller.animation.humanoid.attack","controller_bob":"controller.animation.humanoid.bob","controller_pillager_attack":"controller.animation.pillager.attack","pillager_root_controller":"controller.animation.pillager.root"},"render_controllers":["controller.render.default"],"enable_attachables":true}}}'},1217:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/polarbear"},"geometry":{"default":"geometry.{name}"},"animations":{"walk":"animation.{name}.walk","move":"animation.{name}.move","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform"},"scripts":{"scale":"1.2"},"animation_controllers":[{"move":"controller.animation.polarbear.move"},{"baby":"controller.animation.polarbear.baby"}],"render_controllers":["controller.render.polarbear"],"spawn_egg":{"texture":"spawn_egg","texture_index":37}}}}'},5976:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"entity_alphatest"},"textures":{"brown":"textures/entity/rabbit/brown","white":"textures/entity/rabbit/white","black":"textures/entity/rabbit/blackrabbit","white_splotched":"textures/entity/rabbit/white_splotched","gold":"textures/entity/rabbit/gold","salt":"textures/entity/rabbit/salt","toast":"textures/entity/rabbit/toast"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move","baby_transform":"animation.{name}.baby_transform","look_at_target":"animation.common.look_at_target"},"animation_controllers":[{"general":"controller.animation.rabbit.general"},{"baby":"controller.animation.rabbit.baby"}],"render_controllers":["controller.render.rabbit"],"spawn_egg":{"texture":"spawn_egg","texture_index":24}}}}'},3828:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","textures":{"default":"textures/entity/illager/ravager"},"materials":{"default":"ravager"},"geometry":{"default":"geometry.{name}"},"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":57},"animations":{"walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","idle_mouth":"animation.{name}.idle_mouth","stunned":"animation.{name}.stunned","roaring":"animation.{name}.roaring","move":"controller.animation.ravager.move","head":"controller.animation.ravager.head_movement","biting":"animation.{name}.biting"},"scripts":{"pre_animation":["variable.roar_length = 1.0;","variable.bite_anim_duration = 0.75f;","variable.bite_neck_length = 10;"],"animate":["move","head"]},"particle_effects":{"stun_particles":"minecraft:stunned_emitter"}}}}'},5722:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/fish/salmon"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.ZRot = !query.is_in_water ? Math.cos((query.time_stamp + query.frame_alpha) * 14.32) * 90 : 0.0;","variable.AnimationAmountBlend = Math.lerp(variable.AnimationAmountPrev, variable.AnimationAmount, query.frame_alpha);"]},"animations":{"flop":"animation.{name}.flop","swim":"animation.{name}.swim"},"animation_controllers":[{"general":"controller.animation.fish.general"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":47}}}}'},7043:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"sheep"},"textures":{"default":"textures/entity/sheep/sheep"},"geometry":{"default":"geometry.{name}","sheared":"geometry.sheep.sheared.v1.8"},"animations":{"setup":"animation.{name}.setup","grazing":"animation.{name}.grazing","walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","baby_transform":"animation.{name}.baby_transform","move":"controller.animation.sheep.move"},"scripts":{"animate":["setup","look_at_target","move",{"baby_transform":"query.is_baby"}]},"render_controllers":["controller.render.sheep"],"spawn_egg":{"texture":"spawn_egg","texture_index":3}}}}'},1546:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"shulker"},"textures":{"undyed":"textures/entity/shulker/shulker_undyed","white":"textures/entity/shulker/shulker_white","orange":"textures/entity/shulker/shulker_orange","magenta":"textures/entity/shulker/shulker_magenta","light_blue":"textures/entity/shulker/shulker_light_blue","yellow":"textures/entity/shulker/shulker_yellow","lime":"textures/entity/shulker/shulker_lime","pink":"textures/entity/shulker/shulker_pink","gray":"textures/entity/shulker/shulker_gray","silver":"textures/entity/shulker/shulker_silver","cyan":"textures/entity/shulker/shulker_cyan","purple":"textures/entity/shulker/shulker_purple","blue":"textures/entity/shulker/shulker_blue","brown":"textures/entity/shulker/shulker_brown","green":"textures/entity/shulker/shulker_green","red":"textures/entity/shulker/shulker_red","black":"textures/entity/shulker/shulker_black"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"texture":"spawn_egg","texture_index":34},"scripts":{"pre_animation":["variable.Shulker.LidPositionFactor = 180 * (0.5 + variable.Shulker.PeekAmount);","variable.Shulker.LidRotationFactor = -1 + Math.sin(180 * (0.5 + variable.Shulker.PeekAmount));","variable.Shulker.UpFacing = variable.Shulker.FacingDirection == 1;","variable.Shulker.NorthFacing = variable.Shulker.FacingDirection == 2;","variable.Shulker.SouthFacing = variable.Shulker.FacingDirection == 3;","variable.Shulker.WestFacing = variable.Shulker.FacingDirection == 4;","variable.Shulker.EastFacing = variable.Shulker.FacingDirection == 5;","variable.Shulker.XPreRotation = variable.Shulker.UpFacing * 180 + variable.Shulker.NorthFacing * 90 - variable.Shulker.SouthFacing * 90;","variable.Shulker.ZPreRotation = variable.Shulker.NorthFacing * 180 + variable.Shulker.WestFacing * 90 - variable.Shulker.EastFacing * 90;","variable.Shulker.XOffset = -variable.Shulker.WestFacing * 7.99 + variable.Shulker.EastFacing * 7.99;","variable.Shulker.YOffset = variable.Shulker.UpFacing * 16 + variable.Shulker.NorthFacing * 7.99 + variable.Shulker.SouthFacing * 7.99 + variable.Shulker.WestFacing * 7.99 + variable.Shulker.EastFacing * 7.99;","variable.Shulker.ZOffset = variable.Shulker.NorthFacing * 7.99 - variable.Shulker.SouthFacing * 7.99;"]},"animations":{"facing":"animation.{name}.facing","move":"animation.{name}.move","look_at_target":"animation.common.look_at_target"},"animation_controllers":[{"facing":"controller.animation.shulker.facing"},{"move":"controller.animation.shulker.move"}],"render_controllers":["controller.render.shulker"]}}}'},5701:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"silverfish","body_layer":"silverfish_layers"},"textures":{"default":"textures/entity/silverfish"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move"},"animation_controllers":[{"move":"controller.animation.silverfish.move"}],"render_controllers":["controller.render.silverfish"],"spawn_egg":{"texture":"spawn_egg","texture_index":8}}}}'},5373:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"skeleton"},"textures":{"default":"textures/entity/skeleton/skeleton"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"texture":"spawn_egg","texture_index":9},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"]},"animations":{"look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","attack.rotations":"animation.humanoid.attack.rotations","sneaking":"animation.humanoid.sneaking","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","bow_and_arrow":"animation.humanoid.bow_and_arrow","swimming":"animation.zombie.swimming","use_item_progress":"animation.humanoid.use_item_progress","skeleton_attack":"animation.skeleton.attack"},"animation_controllers":[{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"riding":"controller.animation.humanoid.riding"},{"holding":"controller.animation.humanoid.holding"},{"brandish_spear":"controller.animation.humanoid.brandish_spear"},{"charging":"controller.animation.humanoid.charging"},{"attack":"controller.animation.humanoid.attack"},{"sneaking":"controller.animation.humanoid.sneaking"},{"bob":"controller.animation.humanoid.bob"},{"damage_nearby_mobs":"controller.animation.humanoid.damage_nearby_mobs"},{"bow_and_arrow":"controller.animation.humanoid.bow_and_arrow"},{"swimming":"controller.animation.zombie.swimming"},{"use_item_progress":"controller.animation.humanoid.use_item_progress"},{"skeleton_attack":"controller.animation.skeleton.attack"}],"render_controllers":["controller.render.default"],"enable_attachables":true}}}'},2162:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"slime_outer"},"textures":{"default":"textures/entity/slime/slime"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.squish_factor = (query.previous_squish_value + (query.current_squish_value - query.previous_squish_value) * query.frame_alpha);","variable.bounce = 1 / ((variable.squish_factor / (query.variant * 0.5 + 1)) + 1);","variable.horizontal_scale_amount = variable.bounce * query.variant;","variable.vertical_scale_amount = (1 / variable.bounce) * query.variant;"],"scaleX":"variable.horizontal_scale_amount","scaleY":"variable.vertical_scale_amount","scaleZ":"variable.horizontal_scale_amount"},"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":10}}}}'},6123:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"sniffer"},"textures":{"default":"textures/entity/sniffer/sniffer"},"geometry":{"default":"geometry.{name}"},"animations":{"baby_transform":"animation.{name}.baby_transform","walk":"animation.{name}.walk","look_at_target":"animation.common.look_at_target","sniffsniff":"animation.{name}.sniffsniff","long_sniff":"animation.{name}.longsniff","search":"animation.{name}.search","dig":"animation.{name}.dig","stand_up":"animation.{name}.stand_up","feeling_happy":"animation.{name}.feeling_happy","controller_walk":"controller.animation.sniffer.walk","controller_sniffsniff":"controller.animation.sniffer.sniffsniff","controller_long_sniff":"controller.animation.sniffer.long_sniff","controller_search":"controller.animation.sniffer.search","controller_dig":"controller.animation.sniffer.dig","controller_stand_up":"controller.animation.sniffer.stand_up","controller_feeling_happy":"controller.animation.sniffer.feeling_happy"},"scripts":{"pre_animation":["variable.moving = math.min(1.0, query.modified_move_speed * 10);"],"animate":["look_at_target",{"baby_transform":"query.is_baby"},"controller_walk","controller_sniffsniff","controller_long_sniff","controller_search","controller_dig","controller_stand_up","controller_feeling_happy"]},"render_controllers":["controller.render.sniffer"],"spawn_egg":{"base_color":"#871E09","overlay_color":"#25AB70"},"sound_effects":{"drop_seed":"mob.sniffer.drop_seed","sniffsniff":"mob.sniffer.sniffsniff","searching":"mob.sniffer.searching","long_sniff":"mob.sniffer.long_sniff","digging":"mob.sniffer.digging","stand_up":"mob.sniffer.stand_up","happy":"mob.sniffer.happy"}}}}'},8312:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/snow_golem"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move","sheared":"animation.{name}.sheared","look_at_target":"animation.common.look_at_target","move_controller":"controller.animation.snowgolem.move.v1.8"},"scripts":{"animate":["move_controller",{"sheared":"query.is_sheared"}]},"render_controllers":["controller.render.default"]}}}'},7719:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"spider","invisible":"spider_invisible"},"textures":{"default":"textures/entity/spider/spider"},"geometry":{"default":"geometry.{name}"},"animations":{"default_leg_pose":"animation.{name}.default_leg_pose","look_at_target":"animation.{name}.look_at_target","walk":"animation.{name}.walk"},"animation_controllers":[{"move":"controller.animation.spider.move"}],"render_controllers":["controller.render.spider"],"spawn_egg":{"texture":"spawn_egg","texture_index":11}}}}'},2416:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/squid"},"geometry":{"default":"geometry.{name}"},"animations":{"move":"animation.{name}.move","squid_rotate":"animation.{name}.rotate"},"scripts":{"animate":["move","squid_rotate"]},"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":15}}}}'},4381:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"strider"},"textures":{"default":"textures/entity/strider/strider","saddled":"textures/entity/strider/strider_saddled","suffocated":"textures/entity/strider/strider_suffocated","suffocated_saddled":"textures/entity/strider/strider_suffocated_saddled"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#9c3436","overlay_color":"#4d494d"},"scripts":{"pre_animation":["variable.animation_speed = Math.min(query.modified_move_speed, 0.25);","variable.speed = 85.9437;","variable.bristle_flow=Math.cos(query.modified_distance_moved * variable.speed + 180) * variable.animation_speed;","variable.bristle_range_mod=1;","variable.bristle_speed_mod=1;"],"animate":["look_at_target","walk","bristle_flow"]},"animations":{"look_at_target":"animation.{name}.look_at_target.default","walk":"animation.{name}.walk","bristle_flow":"animation.{name}.bristle_flow"},"render_controllers":["controller.render.strider"]}}}'},8203:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"{name}"},"textures":{"default":"textures/entity/{name}"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#6d533d","overlay_color":"#160a00"},"animations":{"swim":"animation.{name}.swim","general":"controller.animation.tadpole.general"},"scripts":{"animate":["general"]},"render_controllers":["controller.render.tadpole"]}}}'},2482:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"entity_alphatest"},"textures":{"default":"textures/entity/sea_turtle"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.timeMultiplier = query.has_rider ? 0.39972 : 1.0;","variable.backLegMultiplier = query.has_rider ? 0.5 : 3.0;","variable.frontLegMultiplier = query.has_rider ? 2.0 : 8.0;","variable.legSpeedMultiplier = query.has_rider ? 2.0 : 5.0;"],"scale":"1.2"},"animations":{"general":"animation.{name}.general","move":"animation.{name}.move","ground_move":"animation.{name}.ground_move","look_at_target":"animation.common.look_at_target"},"animation_controllers":[{"general":"controller.animation.turtle.general"},{"move":"controller.animation.turtle.move"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":50}}}}'},4931:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"vex"},"textures":{"default":"textures/entity/vex/vex","charging":"textures/entity/vex/vex_charging"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"],"scale":"0.4"},"animations":{"look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","attack.rotations":"animation.{name}.attack.rotations","sneaking":"animation.humanoid.sneaking","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","bow_and_arrow":"animation.humanoid.bow_and_arrow","swimming":"animation.humanoid.swimming","use_item_progress":"animation.humanoid.use_item_progress","vex_move":"animation.{name}.move"},"animation_controllers":[{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"riding":"controller.animation.humanoid.riding"},{"holding":"controller.animation.humanoid.holding"},{"brandish_spear":"controller.animation.humanoid.brandish_spear"},{"charging":"controller.animation.humanoid.charging"},{"attack":"controller.animation.humanoid.attack"},{"sneaking":"controller.animation.humanoid.sneaking"},{"bob":"controller.animation.humanoid.bob"},{"damage_nearby_mobs":"controller.animation.humanoid.damage_nearby_mobs"},{"bow_and_arrow":"controller.animation.humanoid.bow_and_arrow"},{"swimming":"controller.animation.humanoid.swimming"},{"use_item_progress":"controller.animation.humanoid.use_item_progress"},{"vex_move":"controller.animation.vex.move"}],"render_controllers":["controller.render.vex"],"spawn_egg":{"texture":"spawn_egg","texture_index":41}}}}'},5398:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"villager_v2","masked":"villager_v2_masked"},"textures":{"base":"textures/entity/villager2/villager","base2":"textures/entity/villager2/villager","base3":"textures/entity/villager2/villager","base4":"textures/entity/villager2/villager","base5":"textures/entity/villager2/villager","base6":"textures/entity/villager2/villager","desert":"textures/entity/villager2/biomes/biome_desert","jungle":"textures/entity/villager2/biomes/biome_jungle","plains":"textures/entity/villager2/biomes/biome_plains","savanna":"textures/entity/villager2/biomes/biome_savanna","snow":"textures/entity/villager2/biomes/biome_snow","swamp":"textures/entity/villager2/biomes/biome_swamp","taiga":"textures/entity/villager2/biomes/biome_taiga","armorer":"textures/entity/villager2/professions/armorer","butcher":"textures/entity/villager2/professions/butcher","cartographer":"textures/entity/villager2/professions/cartographer","cleric":"textures/entity/villager2/professions/cleric","farmer":"textures/entity/villager2/professions/farmer","fisherman":"textures/entity/villager2/professions/fisherman","fletcher":"textures/entity/villager2/professions/fletcher","leatherworker":"textures/entity/villager2/professions/leatherworker","librarian":"textures/entity/villager2/professions/librarian","shepherd":"textures/entity/villager2/professions/shepherd","tool_smith":"textures/entity/villager2/professions/toolsmith","weapon_smith":"textures/entity/villager2/professions/weaponsmith","stonemason":"textures/entity/villager2/professions/stonemason","nitwit":"textures/entity/villager2/professions/nitwit","unskilled":"textures/entity/villager2/professions/unskilled","level_stone":"textures/entity/villager2/levels/level_stone","level_iron":"textures/entity/villager2/levels/level_iron","level_gold":"textures/entity/villager2/levels/level_gold","level_emerald":"textures/entity/villager2/levels/level_emerald","level_diamond":"textures/entity/villager2/levels/level_diamond"},"geometry":{"default":"geometry.{name}"},"scripts":{"scale":"0.9375","pre_animation":["variable.num_professions = 15;","variable.num_tiers = 3;","variable.profession_index = (query.variant < variable.num_professions ? query.variant : 0);","variable.level_index = query.trade_tier;"]},"animations":{"general":"animation.villager.general","look_at_target":"animation.common.look_at_target","move":"animation.villager.move","baby_transform":"animation.villager.baby_transform","get_in_bed":"animation.villager.get_in_bed"},"animation_controllers":[{"general":"controller.animation.villager_v2.general"},{"move":"controller.animation.villager_v2.move"},{"baby":"controller.animation.villager_v2.baby"}],"render_controllers":["controller.render.villager_v2_base","controller.render.villager_v2_masked","controller.render.villager_v2_level"],"spawn_egg":{"texture":"spawn_egg","texture_index":14}}}}'},9005:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"vindicator"},"textures":{"default":"textures/entity/vindicator"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"texture":"spawn_egg","texture_index":39},"scripts":{"scale":"0.9375","animate":["vindicator_base","vindicator_walk","controller_look_at_target","controller_vindicator_base","controller_riding"]},"animations":{"look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","riding.arms":"animation.{name}.riding.arms","riding.legs":"animation.{name}.riding.legs","vindicator_base":"animation.{name}.base","vindicator_attack":"animation.{name}.attack","vindicator_hand_attack":"animation.{name}.hand_attack","vindicator_walk":"animation.{name}.walk","celebrating":"animation.humanoid.celebrating","controller_look_at_target":"controller.animation.humanoid.look_at_target","controller_vindicator_base":"controller.animation.vindicator.base","controller_riding":"controller.animation.humanoid.riding"},"render_controllers":["controller.render.vindicator"],"enable_attachables":true}}}'},5172:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"wandering_trader"},"textures":{"default":"textures/entity/wandering_trader"},"geometry":{"default":"geometry.{name}"},"scripts":{"scale":"0.9375"},"animations":{"general":"animation.{name}.general","look_at_target":"animation.common.look_at_target","raise_arms":"animation.{name}.raise_arms","move":"animation.{name}.move"},"animation_controllers":[{"general":"controller.animation.villager.general"},{"raise_arms":"controller.animation.villager_v2.raise_arms"},{"move":"controller.animation.villager.move"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg_wandering_trader"}}}}'},9807:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"warden","bioluminescent_layer":"warden_bioluminescent_layer"},"textures":{"default":"textures/entity/warden/warden","bioluminescent_layer":"textures/entity/warden/warden_bioluminescent_layer","spots_1":"textures/entity/warden/warden_pulsating_spots_1","spots_2":"textures/entity/warden/warden_pulsating_spots_2","tendrils":"textures/entity/warden/warden_tendrils","heart":"textures/entity/warden/warden_heart"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.animation_speed = Math.min(0.5, 3.0 * query.modified_move_speed);","variable.anim_pos_mod = 49.388962;","variable.bob = query.life_time * 20;","variable.modified_bob = variable.bob * 0.1 * 57.2958;","variable.modified_bob_sin = math.sin(variable.modified_bob);","variable.modified_bob_cos = math.cos(variable.modified_bob);","variable.pi = 180;","variable.halfpi = variable.pi / 2.0;","variable.tendril_animation_length = 0.5;","variable.head_x_rot = (68.7549 * math.cos(query.modified_distance_moved * variable.anim_pos_mod + variable.halfpi) * math.min(0.35, variable.animation_speed)) + (math.sin(variable.bob * 5.72958) * 0.06);","variable.head_z_rot = (17.1887 * math.sin(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed) + (Math.cos(variable.bob * 5.72958) * 0.06);","variable.body_x_rot = (57.2958 * math.cos(query.modified_distance_moved * variable.anim_pos_mod) * math.min(0.35, variable.animation_speed)) + (math.cos(variable.bob * 5.72958) * 0.025);","variable.body_z_rot = (5.72958 * math.sin(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed) + (math.sin(variable.bob * 5.72958) * 0.025);","variable.left_leg_x_rot = 57.2958 * math.cos(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed;","variable.right_leg_x_rot = 57.2958 * math.cos(query.modified_distance_moved * variable.anim_pos_mod + variable.pi) * variable.animation_speed;","variable.left_arm_x_rot = -(45.8366 * math.cos(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed);","variable.right_arm_x_rot = -(45.8366 * math.sin(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed);","variable.vibration_phase = query.time_since_last_vibration_detection;","variable.tendril_animation = variable.vibration_phase < 0.0 ? 0.0 : 1.0 - (math.min(query.time_since_last_vibration_detection, variable.tendril_animation_length) / variable.tendril_animation_length);","variable.left_tendril_x_rot = variable.tendril_animation * (math.cos(variable.bob * 128.9155) * variable.pi * 0.1);","variable.right_tendril_x_rot = variable.left_tendril_x_rot * -1;","variable.spots_1_alpha = 0.25 * math.cos(variable.bob * 2.578);","variable.spots_2_alpha = 0.25 * math.cos(variable.bob * 2.578 + 180.0);","variable.tendrils_alpha = variable.tendril_animation;","variable.heart_alpha = 0.8 * (1.0 - query.heartbeat_phase);"],"animate":["base_pose",{"move":"!(query.is_emerging || query.is_digging)"},"shiver_controller","bob",{"emerge":"query.is_emerging"},"sniff_controller",{"dig":"query.is_digging"},"roar_controller",{"look_at_target":"!(query.is_emerging || query.is_digging)"},"melee_attack_controller",{"swimming":"query.swim_amount > 0.0"},"hurt_controller","sonic_boom_controller"]},"animations":{"emerge":"animation.{name}.emerge","sniff":"animation.{name}.sniff","sniff_controller":"controller.animation.warden.sniff","dig":"animation.{name}.dig","roar":"animation.{name}.roar","roar_controller":"controller.animation.warden.roar","shiver":"animation.{name}.shiver","shiver_controller":"controller.animation.warden.shiver","base_pose":"animation.humanoid.base_pose.v1.0","look_at_target":"animation.{name}.look_at_target.default","move":"animation.{name}.move","melee_attack":"animation.{name}.attack","melee_attack_controller":"controller.animation.warden.melee_attacking","bob":"animation.{name}.bob","swimming":"animation.humanoid.swimming.v1.0","hurt":"animation.{name}.hurt","hurt_controller":"controller.animation.warden.hurt","sonic_boom":"animation.{name}.sonic_boom","sonic_boom_controller":"controller.animation.warden.sonic_boom"},"render_controllers":["controller.render.warden","controller.render.warden_bioluminescent_layer","controller.render.warden_spots_1","controller.render.warden_spots_2","controller.render.warden_tendrils","controller.render.warden_heart"],"enable_attachables":true,"spawn_egg":{"base_color":"#0F4649","overlay_color":"#39D6E0"},"sound_effects":{"emerge":"mob.warden.emerge","sniff":"mob.warden.sniff","dig":"mob.warden.dig","roar":"mob.warden.roar","clicking":"mob.warden.clicking"},"particle_effects":{"digging":"minecraft:warden_dig"}}}}'},3883:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"witch"},"textures":{"default":"textures/entity/witch"},"geometry":{"default":"geometry.{name}"},"scripts":{"scale":"0.9375"},"animations":{"villager_general":"animation.{name}.villager_general","look_at_target":"animation.common.look_at_target","move":"animation.{name}.move","general":"animation.{name}.general"},"animation_controllers":[{"general":"controller.animation.witch.general"},{"move":"controller.animation.villager.move"}],"render_controllers":["controller.render.default"],"spawn_egg":{"texture":"spawn_egg","texture_index":17}}}}'},5383:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"skeleton"},"textures":{"default":"textures/entity/skeleton/wither_skeleton"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"]},"animations":{"look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","attack.rotations":"animation.humanoid.attack.rotations","sneaking":"animation.humanoid.sneaking","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","bow_and_arrow":"animation.humanoid.bow_and_arrow","use_item_progress":"animation.humanoid.use_item_progress","wither_skeleton_attack":"animation.wither_skeleton.attack","swimming":"animation.zombie.swimming"},"animation_controllers":[{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"riding":"controller.animation.humanoid.riding"},{"holding":"controller.animation.humanoid.holding"},{"brandish_spear":"controller.animation.humanoid.brandish_spear"},{"charging":"controller.animation.humanoid.charging"},{"attack":"controller.animation.humanoid.attack"},{"sneaking":"controller.animation.humanoid.sneaking"},{"damage_nearby_mobs":"controller.animation.humanoid.damage_nearby_mobs"},{"bow_and_arrow":"controller.animation.humanoid.bow_and_arrow"},{"use_item_progress":"controller.animation.humanoid.use_item_progress"},{"wither_skeleton_attack":"controller.animation.wither_skeleton.attack"},{"swimming":"controller.animation.zombie.swimming"}],"render_controllers":["controller.render.default"],"enable_attachables":true,"spawn_egg":{"texture":"spawn_egg","texture_index":29}}}}'},1300:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"wolf"},"textures":{"default":"textures/entity/wolf/wolf","angry":"textures/entity/wolf/wolf_angry","tame":"textures/entity/wolf/wolf_tame"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.body_shake_angle = 0.05 * query.frame_alpha + query.shake_angle;","variable.body_roll_progress = Math.clamp((variable.body_shake_angle - 0.16) / 1.8, 0, 1);","variable.body_rot_z = Math.sin(variable.body_roll_progress * 180) * Math.sin(variable.body_roll_progress * 1980) * 27;","variable.upper_body_roll_progress = Math.clamp((variable.body_shake_angle - 0.08) / 1.8, 0, 1);","variable.upper_body_rot_z = (Math.sin(variable.upper_body_roll_progress * 180) * Math.sin(variable.upper_body_roll_progress * 1980) * 27) - variable.body_rot_z;","variable.tail_roll_progress = Math.clamp((variable.body_shake_angle - 0.2) / 1.8, 0, 1);","variable.tail_rot_z = (Math.sin(variable.tail_roll_progress * 180) * Math.sin(variable.tail_roll_progress * 1980) * 27) - variable.body_rot_z;","variable.head_roll_progress = Math.clamp(variable.body_shake_angle / 1.8, 0, 1);","variable.head_rot_z = (Math.sin(variable.head_roll_progress * 180) * Math.sin(variable.head_roll_progress * 1980) * 27) - variable.body_rot_z;"]},"animations":{"wolf_baby_scaling":"animation.{name}.baby_scaling","wolf_look_at":"animation.common.look_at_target","wolf_head_rot_z":"animation.{name}.head_rot_z","wolf_tail_default":"animation.{name}.tail_default","wolf_angry":"animation.{name}.angry","wolf_sitting":"animation.{name}.sitting","wolf_shaking":"animation.{name}.shaking","wolf_leg_default":"animation.{name}.leg_default"},"animation_controllers":[{"wolf_look_at":"controller.animation.wolf.look_at"},{"wolf_baby_scaling":"controller.animation.wolf.baby_scaling"},{"wolf_head_rot_z":"controller.animation.wolf.head_rot_z"},{"wolf_tail_default":"controller.animation.wolf.tail_default"},{"wolf_angry":"controller.animation.wolf.angry"},{"wolf_sitting":"controller.animation.wolf.sitting"},{"wolf_shaking":"controller.animation.wolf.shaking"}],"render_controllers":["controller.render.{name}"],"spawn_egg":{"texture":"spawn_egg","texture_index":4}}}}'},3101:e=>{e.exports='{"format_version":"1.10.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"zoglin"},"textures":{"default":"textures/entity/zoglin/zoglin"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"base_color":"#c66e55","overlay_color":"#e6e6e6"},"scripts":{"pre_animation":["variable.tcos_right_side = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;","variable.tcos_left_side = -variable.tcos_right_side;","variable.attack_head_rot = Math.sin(variable.attack_time * 180.0) * -37.3;"],"animate":["walk","look_at_target",{"attack":"variable.has_target && variable.attack_time >= 0.0"},{"hoglin_baby_scaling":"query.is_baby"}]},"animations":{"walk":"animation.{name}.walk","look_at_target":"animation.{name}.look_at_target","attack":"animation.{name}.attack","hoglin_baby_scaling":"animation.{name}.baby_scaling"},"render_controllers":["controller.render.default"]}}}'},4322:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"zombie"},"textures":{"default":"textures/entity/zombie/zombie"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"texture":"spawn_egg","texture_index":12},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"]},"animations":{"humanoid_big_head":"animation.humanoid.big_head","look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","attack.rotations":"animation.humanoid.attack.rotations","sneaking":"animation.humanoid.sneaking","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","bow_and_arrow":"animation.humanoid.bow_and_arrow","use_item_progress":"animation.humanoid.use_item_progress","zombie_attack_bare_hand":"animation.zombie.attack_bare_hand","swimming":"animation.zombie.swimming"},"animation_controllers":[{"humanoid_baby_big_head":"controller.animation.humanoid.baby_big_head"},{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"riding":"controller.animation.humanoid.riding"},{"holding":"controller.animation.humanoid.holding"},{"brandish_spear":"controller.animation.humanoid.brandish_spear"},{"charging":"controller.animation.humanoid.charging"},{"attack":"controller.animation.humanoid.attack"},{"sneaking":"controller.animation.humanoid.sneaking"},{"bob":"controller.animation.humanoid.bob"},{"damage_nearby_mobs":"controller.animation.humanoid.damage_nearby_mobs"},{"bow_and_arrow":"controller.animation.humanoid.bow_and_arrow"},{"use_item_progress":"controller.animation.humanoid.use_item_progress"},{"zombie_attack_bare_hand":"controller.animation.zombie.attack_bare_hand"},{"swimming":"controller.animation.zombie.swimming"}],"render_controllers":["controller.render.default"],"enable_attachables":true}}}'},507:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","min_engine_version":"1.8.0","materials":{"default":"zombie"},"textures":{"default":"textures/entity/piglin/zombie_piglin"},"geometry":{"default":"geometry.{name}"},"spawn_egg":{"texture":"spawn_egg","texture_index":13},"scripts":{"pre_animation":["variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"]},"animations":{"humanoid_big_head":"animation.humanoid.big_head","humanoid_base_pose":"animation.humanoid.base_pose","look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","attack.rotations":"animation.humanoid.attack.rotations","sneaking":"animation.humanoid.sneaking","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","bow_and_arrow":"animation.humanoid.bow_and_arrow","swimming":"animation.humanoid.swimming","use_item_progress":"animation.humanoid.use_item_progress","zombie_attack_bare_hand":"animation.zombie.attack_bare_hand"},"animation_controllers":[{"humanoid_baby_big_head":"controller.animation.humanoid.baby_big_head"},{"humanoid_base_pose":"controller.animation.humanoid.base_pose"},{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"riding":"controller.animation.humanoid.riding"},{"holding":"controller.animation.humanoid.holding"},{"brandish_spear":"controller.animation.humanoid.brandish_spear"},{"charging":"controller.animation.humanoid.charging"},{"attack":"controller.animation.humanoid.attack"},{"sneaking":"controller.animation.humanoid.sneaking"},{"bob":"controller.animation.humanoid.bob"},{"damage_nearby_mobs":"controller.animation.humanoid.damage_nearby_mobs"},{"bow_and_arrow":"controller.animation.humanoid.bow_and_arrow"},{"swimming":"controller.animation.humanoid.swimming"},{"use_item_progress":"controller.animation.humanoid.use_item_progress"},{"zombie_attack_bare_hand":"controller.animation.zombie.attack_bare_hand"}],"render_controllers":["controller.render.default"],"enable_attachables":true}}}'},533:e=>{e.exports='{"format_version":"1.8.0","minecraft:client_entity":{"description":{"identifier":"{identifier}","materials":{"default":"zombie_villager_v2","masked":"zombie_villager_v2_masked"},"textures":{"default":"textures/entity/zombie_villager2/zombie-villager","desert":"textures/entity/zombie_villager2/biomes/biome-desert-zombie","jungle":"textures/entity/zombie_villager2/biomes/biome-jungle-zombie","plains":"textures/entity/zombie_villager2/biomes/biome-plains-zombie","savanna":"textures/entity/zombie_villager2/biomes/biome-savanna-zombie","snow":"textures/entity/zombie_villager2/biomes/biome-snow-zombie","swamp":"textures/entity/zombie_villager2/biomes/biome-swamp-zombie","taiga":"textures/entity/zombie_villager2/biomes/biome-taiga-zombie","armorer":"textures/entity/zombie_villager2/professions/armorer","butcher":"textures/entity/zombie_villager2/professions/butcher","cartographer":"textures/entity/zombie_villager2/professions/cartographer","cleric":"textures/entity/zombie_villager2/professions/cleric","farmer":"textures/entity/zombie_villager2/professions/farmer","fisherman":"textures/entity/zombie_villager2/professions/fisherman","fletcher":"textures/entity/zombie_villager2/professions/fletcher","leatherworker":"textures/entity/zombie_villager2/professions/leatherworker","librarian":"textures/entity/zombie_villager2/professions/librarian","shepherd":"textures/entity/zombie_villager2/professions/shepherd","tool_smith":"textures/entity/zombie_villager2/professions/toolsmith","weapon_smith":"textures/entity/zombie_villager2/professions/weaponsmith","stonemason":"textures/entity/zombie_villager2/professions/stonemason","nitwit":"textures/entity/zombie_villager2/professions/nitwit"},"geometry":{"default":"geometry.{name}"},"scripts":{"pre_animation":["variable.num_professions = 14;","variable.profession_index = ((query.variant < variable.num_professions) ? query.variant : 0);","variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;"]},"animations":{"humanoid_big_head":"animation.humanoid.big_head","humanoid_base_pose":"animation.humanoid.base_pose","look_at_target_default":"animation.humanoid.look_at_target.default","look_at_target_gliding":"animation.humanoid.look_at_target.gliding","look_at_target_swimming":"animation.humanoid.look_at_target.swimming","move":"animation.humanoid.move","riding.arms":"animation.humanoid.riding.arms","riding.legs":"animation.humanoid.riding.legs","holding":"animation.humanoid.holding","brandish_spear":"animation.humanoid.brandish_spear","charging":"animation.humanoid.charging","attack.rotations":"animation.humanoid.attack.rotations","sneaking":"animation.humanoid.sneaking","bob":"animation.humanoid.bob","damage_nearby_mobs":"animation.humanoid.damage_nearby_mobs","bow_and_arrow":"animation.humanoid.bow_and_arrow","use_item_progress":"animation.humanoid.use_item_progress","zombie_attack_bare_hand":"animation.zombie.attack_bare_hand","swimming":"animation.zombie.swimming"},"animation_controllers":[{"humanoid_baby_big_head":"controller.animation.humanoid.baby_big_head"},{"humanoid_base_pose":"controller.animation.humanoid.base_pose"},{"look_at_target":"controller.animation.humanoid.look_at_target"},{"move":"controller.animation.humanoid.move"},{"riding":"controller.animation.humanoid.riding"},{"holding":"controller.animation.humanoid.holding"},{"brandish_spear":"controller.animation.humanoid.brandish_spear"},{"charging":"controller.animation.humanoid.charging"},{"attack":"controller.animation.humanoid.attack"},{"sneaking":"controller.animation.humanoid.sneaking"},{"bob":"controller.animation.humanoid.bob"},{"damage_nearby_mobs":"controller.animation.humanoid.damage_nearby_mobs"},{"bow_and_arrow":"controller.animation.humanoid.bow_and_arrow"},{"use_item_progress":"controller.animation.humanoid.use_item_progress"},{"zombie_attack_bare_hand":"controller.animation.zombie.attack_bare_hand"},{"swimming":"controller.animation.zombie.swimming"}],"render_controllers":["controller.render.zombie_villager_v2_base","controller.render.zombie_villager_v2_masked"],"enable_attachables":true,"spawn_egg":{"texture":"spawn_egg","texture_index":42}}}}'},4462:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":1.5,"visible_bounds_offset":[0,0.25,0]},"bones":[{"name":"root","pivot":[0,0,0],"cubes":[{"origin":[-6,0,-6],"size":[12,8,12],"uv":[0,0]}]}]}]}'},4384:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":128,"visible_bounds_width":4,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root","pivot":[0,0,0]},{"name":"body","parent":"root","pivot":[0,0,0],"cubes":[{"origin":[-9,3,-16],"size":[18,9,32],"uv":[0,0]}]},{"name":"steering_wheel","parent":"body","pivot":[0,13,-7],"cubes":[{"origin":[-3,10,-9],"size":[6,6,2],"uv":[0,20]}]},{"name":"wheel_front_left","parent":"root","pivot":[10,5,-13],"cubes":[{"origin":[9,0,-18],"size":[6,10,10],"uv":[0,0]}]},{"name":"wheel_front_right","parent":"root","pivot":[-10,5,-13],"cubes":[{"origin":[-15,0,-18],"size":[6,10,10],"uv":[0,0],"mirror":true}]},{"name":"wheel_back_left","parent":"root","pivot":[10,5,13],"cubes":[{"origin":[9,0,8],"size":[6,10,10],"uv":[0,0]}]},{"name":"wheel_back_right","parent":"root","pivot":[-10,5,13],"cubes":[{"origin":[-15,0,8],"size":[6,10,10],"uv":[0,0],"mirror":true}]}]}]}'},4774:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":32,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root","pivot":[0,0,0]},{"name":"head","parent":"root","pivot":[0,4,0],"cubes":[{"origin":[-2.5,4.01,-2.5],"size":[5,5,5],"uv":[0,0]}]},{"name":"body","parent":"root","pivot":[0,4,0],"cubes":[{"origin":[-1.5,0,-1],"size":[3,4,2],"uv":[0,10]},{"origin":[-1.5,-1,-1],"size":[3,5,2],"inflate":-0.2,"uv":[0,16]}],"locators":{"lead":[0,5,0]}},{"name":"rightItem","parent":"body","pivot":[0,-1,-2],"rotation":[-80,0,0]},{"name":"right_arm","parent":"body","pivot":[-1.75,3.5,0],"cubes":[{"origin":[-2.5,0,-1],"size":[1,4,2],"uv":[23,0]}]},{"name":"left_arm","parent":"body","pivot":[1.75,3.5,0],"cubes":[{"origin":[1.5,0,-1],"size":[1,4,2],"uv":[23,6]}]},{"name":"left_wing","parent":"body","pivot":[0.5,3,1],"cubes":[{"origin":[0.5,-2,1],"size":[0,5,8],"uv":[16,14]}]},{"name":"right_wing","parent":"body","pivot":[-0.5,3,1],"cubes":[{"origin":[-0.5,-2,1],"size":[0,5,8],"uv":[16,14]}]}]}]}'},2032:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"body","pivot":[0,3,4],"cubes":[{"origin":[-4,2,-6],"size":[8,8,12],"inflate":0.3,"uv":[0,20]},{"origin":[-4,2,-6],"size":[8,8,12],"uv":[0,40]}],"locators":{"lead":[0,5,-7]}},{"name":"tail","parent":"body","pivot":[0,6,5],"rotation":[29,0,0],"cubes":[{"origin":[-0.5,0.08645,5.09326],"size":[1,6,1],"uv":[44,53]}]},{"name":"head","parent":"body","pivot":[0,5,-7],"cubes":[{"origin":[-1.5,1,-8],"size":[3,5,2],"pivot":[0,5,-7],"rotation":[-22.5,0,0],"uv":[43,15]}]},{"name":"right_ear","parent":"head","pivot":[-1,6,-7],"cubes":[{"origin":[-3.5,4,-7.6],"size":[2,5,0],"pivot":[-1.5,6,-7.6],"rotation":[10.80524,-22.13991,-4.11405],"uv":[43,10]}]},{"name":"left_ear","parent":"head","pivot":[1,7,-7],"cubes":[{"origin":[1.5,4,-7.6],"size":[2,5,0],"pivot":[1.5,6,-7.6],"rotation":[10.80524,22.13991,4.11405],"uv":[47,10]}]},{"name":"right_hind_leg","pivot":[-2,3,4],"cubes":[{"origin":[-3,0,3],"size":[2,3,2],"uv":[51,31]}]},{"name":"left_hind_leg","pivot":[2,3,4],"cubes":[{"origin":[1,0,3],"size":[2,3,2],"uv":[42,31]}]},{"name":"right_front_leg","pivot":[-2,3,-4],"cubes":[{"origin":[-3,0,-5],"size":[2,3,2],"uv":[51,43]}]},{"name":"left_front_leg","pivot":[2,3,-4],"cubes":[{"origin":[1,0,-5],"size":[2,3,2],"uv":[42,43]}]},{"name":"body_rolled_up","pivot":[0,0,0],"cubes":[{"origin":[-5,0,-6],"size":[10,10,10],"uv":[0,0]}]}]}]}'},2711:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64.0,"texture_height":64.0,"visible_bounds_offset":[0.0,0.5,0.0],"visible_bounds_width":1.5},"bones":[{"name":"baseplate","cubes":[{"origin":[-6.0,0.0,-6.0],"size":[12.0,1.0,12.0],"uv":[0.0,32.0]}]},{"name":"waist","parent":"baseplate","pivot":[0.0,12.0,0.0]},{"name":"body","parent":"waist","pivot":[0.0,24.0,0.0],"cubes":[{"origin":[-6.0,21.0,-1.5],"size":[12.0,3.0,3.0],"uv":[0.0,26.0]},{"origin":[-3.0,14.0,-1.0],"size":[2.0,7.0,2.0],"uv":[16.0,0.0]},{"origin":[1.0,14.0,-1.0],"size":[2.0,7.0,2.0],"uv":[48.0,16.0]},{"origin":[-4.0,12.0,-1.0],"size":[8.0,2.0,2.0],"uv":[0.0,48.0]}]},{"name":"head","parent":"body","pivot":[0.0,24.0,0.0],"cubes":[{"origin":[-1.0,24.0,-1.0],"size":[2.0,7.0,2.0],"uv":[0.0,0.0]}]},{"name":"hat","parent":"head","pivot":[0.0,24.0,0.0],"cubes":[{"origin":[-4.0,24.0,-4.0],"size":[8.0,8.0,8.0],"uv":[32.0,0.0]}]},{"name":"leftarm","parent":"body","mirror":true,"pivot":[5.0,22.0,0.0],"cubes":[{"origin":[5.0,12.0,-1.0],"size":[2.0,12.0,2.0],"uv":[32.0,16.0]}]},{"name":"leftitem","parent":"leftarm","pivot":[6.0,15.0,1.0]},{"name":"leftleg","parent":"body","mirror":true,"pivot":[1.9,12.0,0.0],"cubes":[{"origin":[0.9,1.0,-1.0],"size":[2.0,11.0,2.0],"uv":[40.0,16.0]}]},{"name":"rightarm","parent":"body","pivot":[-5.0,22.0,0.0],"cubes":[{"origin":[-7.0,12.0,-1.0],"size":[2.0,12.0,2.0],"uv":[24.0,0.0]}]},{"name":"rightitem","parent":"rightarm","pivot":[-6.0,15.0,1.0]},{"name":"rightleg","parent":"body","pivot":[-1.9,12.0,0.0],"cubes":[{"origin":[-2.9,1.0,-1.0],"size":[2.0,11.0,2.0],"uv":[8.0,0.0]}]}]}]}'},6600:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root","pivot":[0,-4,0]},{"name":"body","parent":"root","pivot":[0,3,4],"cubes":[{"origin":[-4,0,-5],"size":[8,4,10],"uv":[0,11]},{"origin":[0,0,-5],"size":[0,5,9],"uv":[2,17]}],"locators":{"lead":[0,0,-5]}},{"name":"right_arm","parent":"body","pivot":[-4,1,-4],"rotation":[0,-90,0],"cubes":[{"origin":[-6,-4,-4],"size":[3,5,0],"uv":[2,13]}]},{"name":"right_leg","parent":"body","pivot":[-4,1,4],"rotation":[0,90,0],"cubes":[{"origin":[-5,-4,4],"size":[3,5,0],"uv":[2,13]}]},{"name":"left_arm","parent":"body","pivot":[4,1,-4],"rotation":[0,90,0],"cubes":[{"origin":[3,-4,-4],"size":[3,5,0],"pivot":[4,1,-4],"rotation":[0,0,0],"uv":[2,13]}]},{"name":"left_leg","parent":"body","pivot":[4,1,4],"rotation":[0,-90,0],"cubes":[{"origin":[2,-4,4],"size":[3,5,0],"uv":[2,13]}]},{"name":"tail","parent":"body","pivot":[0,2,4],"cubes":[{"origin":[0,0,4],"size":[0,5,12],"uv":[2,19]}]},{"name":"head","parent":"body","pivot":[0,2,-5],"reset":true,"cubes":[{"origin":[-4,0,-10],"size":[8,5,5],"uv":[0,1]}]},{"name":"left_gills","parent":"head","pivot":[4,2,-6],"cubes":[{"origin":[4,0,-6],"size":[3,7,0],"uv":[11,40]}]},{"name":"right_gills","parent":"head","pivot":[-4,2,-6],"cubes":[{"origin":[-7,0,-6],"size":[3,7,0],"uv":[0,40]}]},{"name":"top_gills","parent":"head","pivot":[0,5,-6],"cubes":[{"origin":[-4,5,-6],"size":[8,3,0],"uv":[3,37]}]}]}]}'},4980:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":4,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"head","pivot":[0,24,0],"cubes":[{"origin":[-3,21,-3],"size":[6,6,6],"uv":[0,0]}]},{"name":"rightEar","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,26,-2],"size":[3,4,1],"uv":[24,0]}]},{"name":"leftEar","parent":"head","pivot":[0,24,0],"mirror":true,"cubes":[{"origin":[1,26,-2],"size":[3,4,1],"uv":[24,0]}]},{"name":"body","pivot":[0,24,0],"cubes":[{"origin":[-3,8,-3],"size":[6,12,6],"uv":[0,16]},{"origin":[-5,-8,0],"size":[10,16,1],"uv":[0,34]}]},{"name":"rightWing","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-12,7,1.5],"size":[10,16,1],"uv":[42,0]}]},{"name":"rightWingTip","parent":"rightWing","pivot":[-12,23,1.5],"cubes":[{"origin":[-20,10,1.5],"size":[8,12,1],"uv":[24,16]}]},{"name":"leftWing","parent":"body","pivot":[0,24,0],"mirror":true,"cubes":[{"origin":[2,7,1.5],"size":[10,16,1],"uv":[42,0]}]},{"name":"leftWingTip","parent":"leftWing","pivot":[12,23,1.5],"mirror":true,"cubes":[{"origin":[12,10,1.5],"size":[8,12,1],"uv":[24,16]}]}]}]}'},859:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"body","pivot":[0.5,5,0],"cubes":[{"origin":[-3,2,-5],"size":[7,7,10],"uv":[0,0]},{"origin":[2,7,-8],"size":[1,2,3],"uv":[2,0]},{"origin":[-2,7,-8],"size":[1,2,3],"uv":[2,3]}],"locators":{"lead":[0,4,-1]}},{"name":"stinger","parent":"body","pivot":[0.5,6,1],"cubes":[{"origin":[0.5,5,5],"size":[0,1,2],"uv":[26,7]}]},{"name":"rightwing_bone","parent":"body","pivot":[-1,9,-3],"rotation":[15,-15,0],"cubes":[{"origin":[-10,9,-3],"size":[9,0,6],"uv":[0,18]}]},{"name":"leftwing_bone","parent":"body","pivot":[2,9,-3],"rotation":[15,15,0],"cubes":[{"origin":[2,9,-3],"size":[9,0,6],"uv":[9,24]}]},{"name":"leg_front","parent":"body","pivot":[2,2,-2],"cubes":[{"origin":[-3,0,-2],"size":[7,2,0],"uv":[26,1]}]},{"name":"leg_mid","parent":"body","pivot":[2,2,0],"cubes":[{"origin":[-3,0,0],"size":[7,2,0],"uv":[26,3]}]},{"name":"leg_back","parent":"body","pivot":[2,2,2],"cubes":[{"origin":[-3,0,2],"size":[7,2,0],"uv":[26,5]}]}]}]}'},2767:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"upperBodyParts0","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts1","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts2","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts3","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts4","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts5","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts6","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts7","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts8","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts9","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts10","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"upperBodyParts11","pivot":[0,24,0],"cubes":[{"origin":[0,16,0],"size":[2,8,2],"uv":[0,16]}]},{"name":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,20,-4],"size":[8,8,8],"uv":[0,0]}]}]}]}'},8472:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":32,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"body","pivot":[0,0,0]},{"name":"rods","parent":"body","pivot":[0,16,0],"cubes":[{"origin":[-1,11,-6],"size":[2,8,2],"pivot":[0,19,-3],"rotation":[22.5,0,0],"uv":[0,17]},{"origin":[-3.59808,11,-1.5],"size":[2,8,2],"pivot":[-2.59808,19,1.5],"rotation":[-157.5,60,180],"uv":[0,17]},{"origin":[1.59808,11,-1.5],"size":[2,8,2],"pivot":[2.59808,19,1.5],"rotation":[-157.5,-60,180],"uv":[0,17]}]},{"name":"head","parent":"body","pivot":[0,20,0],"cubes":[{"origin":[-4,20,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"eyes","parent":"head","pivot":[0,20,0],"cubes":[{"origin":[-5,22,-4.2],"size":[10,3,4],"uv":[4,24]}]},{"name":"tornado_body","pivot":[0,0,0]},{"name":"tornado_bottom","parent":"tornado_body","pivot":[0,0,0]},{"name":"tornado_mid","parent":"tornado_bottom","pivot":[0,7,0]},{"name":"tornado_top","parent":"tornado_mid","pivot":[0,13,0]}]}]}'},9877:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":128,"visible_bounds_width":4,"visible_bounds_height":5,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"root","pivot":[0,0,0],"locators":{"root_standing":[0,32,0],"root_sitting":[0,12,0]}},{"name":"body","parent":"root","pivot":[0.5,20,9.5],"cubes":[{"origin":[-7.5,20,-14],"size":[15,12,27],"uv":[0,25]}],"locators":{"driver_seat":[0,30,-11],"back_seat":[0,30,10]}},{"name":"saddle","parent":"body","pivot":[0.5,20,9.5],"cubes":[{"origin":[-4.5,32,-6],"size":[9,5,11],"inflate":0.1,"uv":[74,64]},{"origin":[-3.5,37,-6],"size":[7,3,11],"inflate":0.1,"uv":[92,114]},{"origin":[-7.5,20,-14],"size":[15,12,27],"inflate":0.1,"uv":[0,89]}]},{"name":"tail","parent":"body","pivot":[0,29,13],"cubes":[{"origin":[-1.5,15,13],"size":[3,14,0],"pivot":[0,29,13],"rotation":[0,180,0],"uv":[122,0]}]},{"name":"head","parent":"body","pivot":[0.5,25,-10],"cubes":[{"origin":[-3.5,22,-25],"size":[7,8,19],"uv":[60,24]},{"origin":[-3.5,30,-25],"size":[7,14,7],"uv":[21,0]},{"origin":[-2.5,39,-31],"size":[5,5,6],"uv":[50,0]}],"locators":{"lead":[0.0,25,-15]}},{"name":"bridle","parent":"head","pivot":[0.5,25,-10],"cubes":[{"origin":[-3.5,22,-25],"size":[7,8,19],"inflate":0.1,"uv":[60,87]},{"origin":[-3.5,30,-25],"size":[7,14,7],"inflate":0.1,"uv":[21,64]},{"origin":[-2.5,39,-31.1],"size":[5,5,6],"inflate":0.1,"uv":[50,64]},{"origin":[2.5,40,-28],"size":[1,2,2],"uv":[74,70]},{"origin":[-3.5,40,-28],"size":[1,2,2],"uv":[74,70],"mirror":true}]},{"name":"left_ear","parent":"head","pivot":[3,43,-19.5],"cubes":[{"origin":[3,42.5,-20.5],"size":[3,1,2],"uv":[45,0]}]},{"name":"right_ear","parent":"head","pivot":[-3,43,-19.5],"cubes":[{"origin":[-6,42.5,-20.5],"size":[3,1,2],"uv":[67,0]}]},{"name":"reins","parent":"head","pivot":[3.7,41,-27],"cubes":[{"origin":[3.7,34,-27],"size":[0,7,15],"uv":[98,42]},{"origin":[-3.7,34,-12],"size":[7.4,7,0],"uv":[84,57]},{"origin":[-3.7,34,-27],"size":[0,7,15],"uv":[98,42]}]},{"name":"hump","parent":"body","pivot":[0.5,32,0],"cubes":[{"origin":[-4.5,32,-6],"size":[9,5,11],"uv":[74,0]}]},{"name":"right_front_leg","parent":"root","pivot":[-4.9,23,-10.5],"cubes":[{"origin":[-7.4,0,-13],"size":[5,21,5],"uv":[0,26]}]},{"name":"left_front_leg","parent":"root","pivot":[4.9,23,-10.5],"cubes":[{"origin":[2.4,0,-13],"size":[5,21,5],"uv":[0,0]}]},{"name":"left_hind_leg","parent":"root","pivot":[4.9,23,9.5],"cubes":[{"origin":[2.4,0,7],"size":[5,21,5],"uv":[58,16]}]},{"name":"right_hind_leg","parent":"root","pivot":[-4.9,23,9.5],"cubes":[{"origin":[-7.4,0,7],"size":[5,21,5],"uv":[94,16]}]}]}]}'},6587:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":4,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"body","pivot":[0,7,1],"cubes":[{"origin":[-2,-1,-2],"size":[4,16,6],"pivot":[0,7,1],"rotation":[90,0,0],"uv":[20,0]}]},{"name":"head","parent":"body","pivot":[0,9,-9],"cubes":[{"origin":[-2.5,7,-12],"size":[5,4,5],"uv":[0,0]},{"origin":[-1.5,7.01562,-13],"size":[3,2,2],"uv":[0,24]},{"origin":[-2,11,-9],"size":[1,1,2],"uv":[0,10]},{"origin":[1,11,-9],"size":[1,1,2],"uv":[6,10]}],"locators":{"lead":[0,9,-9]}},{"name":"tail1","parent":"body","pivot":[0,9,8],"cubes":[{"origin":[-0.5,1,8],"size":[1,8,1],"pivot":[0,9,8],"rotation":[47.5,0,0],"uv":[0,15]}]},{"name":"tail2","parent":"tail1","pivot":[0,3.6,13.9],"rotation":[95,0,0],"cubes":[{"origin":[-0.5,-4.4,13.9],"size":[1,8,1],"uv":[4,15]}]},{"name":"backLegL","parent":"body","pivot":[1.1,6,7],"cubes":[{"origin":[0.1,0,6],"size":[2,6,2],"uv":[8,13]}]},{"name":"backLegR","parent":"body","pivot":[-1.1,6,7],"cubes":[{"origin":[-2.1,0,6],"size":[2,6,2],"uv":[8,13]}]},{"name":"frontLegL","parent":"body","pivot":[1.2,10,-4],"cubes":[{"origin":[0.2,0.2,-5],"size":[2,10,2],"uv":[40,0]}]},{"name":"frontLegR","parent":"body","pivot":[-1.2,10,-4],"cubes":[{"origin":[-2.2,0.2,-5],"size":[2,10,2],"uv":[40,0]}]}]}]}'},816:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":2.25,"visible_bounds_offset":[0,0.875,0]},"bones":[{"name":"body","pivot":[0,8,0],"cubes":[{"origin":[-3,4,-3],"size":[6,8,6],"pivot":[0,8,0],"rotation":[90,0,0],"uv":[0,9]}]},{"name":"head","pivot":[0,9,-4],"cubes":[{"origin":[-2,9,-6],"size":[4,6,3],"uv":[0,0]}],"locators":{"lead":[0,9,-4]}},{"name":"comb","parent":"head","pivot":[0,9,-4],"cubes":[{"origin":[-1,9,-7],"size":[2,2,2],"uv":[14,4]}]},{"name":"beak","parent":"head","pivot":[0,9,-4],"cubes":[{"origin":[-2,11,-8],"size":[4,2,2],"uv":[14,0]}]},{"name":"leg0","pivot":[-2,5,1],"cubes":[{"origin":[-3,0,-2],"size":[3,5,3],"uv":[26,0]}]},{"name":"leg1","pivot":[1,5,1],"cubes":[{"origin":[0,0,-2],"size":[3,5,3],"uv":[26,0]}]},{"name":"wing0","pivot":[-3,11,0],"cubes":[{"origin":[-4,7,-3],"size":[1,4,6],"uv":[24,13]}]},{"name":"wing1","pivot":[3,11,0],"cubes":[{"origin":[3,7,-3],"size":[1,4,6],"uv":[24,13]}]}]}]}'},6169:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":32,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":1.5,"visible_bounds_offset":[0,0.25,0]},"bones":[{"name":"body","pivot":[0,0,0],"cubes":[{"origin":[-1,0,1],"size":[2,4,7],"uv":[0,0]},{"origin":[0,4,0],"size":[0,1,6],"uv":[20,-6]},{"origin":[0,-1,3],"size":[0,1,2],"uv":[22,-1]}]},{"name":"head","parent":"body","pivot":[0,2,0],"cubes":[{"origin":[-0.9992,1.0008,-3],"size":[2,3,1],"uv":[0,0]},{"origin":[-1,0,-2],"size":[2,4,3],"uv":[11,0]}]},{"name":"leftFin","parent":"body","pivot":[1,1,0],"rotation":[0,0,35],"cubes":[{"origin":[1,0,0],"size":[2,1,2],"uv":[24,4]}]},{"name":"rightFin","parent":"body","pivot":[-1,1,0],"rotation":[0,0,-35],"cubes":[{"origin":[-3,0,0],"size":[2,1,2],"uv":[24,1]}]},{"name":"tailfin","parent":"body","pivot":[0,0,8],"cubes":[{"origin":[0,0,8],"size":[0,4,6],"uv":[20,1]}]},{"name":"waist","parent":"body","pivot":[0,0,0]}]}]}'},7528:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":3.125,"visible_bounds_offset":[0,1.4375,0]},"bones":[{"name":"body","pivot":[0,19,2],"cubes":[{"origin":[-6,11,-5],"size":[12,18,10],"pivot":[0,19,2],"rotation":[90,0,0],"uv":[18,4]},{"origin":[-2,11,-6],"size":[4,6,1],"pivot":[0,19,2],"rotation":[90,0,0],"uv":[52,0]}]},{"name":"head","parent":"body","pivot":[0,20,-8],"cubes":[{"origin":[-4,16,-14],"size":[8,8,6],"uv":[0,0]},{"origin":[-5,22,-12],"size":[1,3,1],"uv":[22,0]},{"origin":[4,22,-12],"size":[1,3,1],"uv":[22,0]}],"locators":{"lead":[0,20,-8]}},{"name":"leg0","parent":"body","pivot":[-4,12,7],"cubes":[{"origin":[-6,0,5],"size":[4,12,4],"uv":[0,16]}]},{"name":"leg1","parent":"body","pivot":[4,12,7],"mirror":true,"cubes":[{"origin":[2,0,5],"size":[4,12,4],"uv":[0,16]}]},{"name":"leg2","parent":"body","pivot":[-4,12,-6],"cubes":[{"origin":[-6,0,-7],"size":[4,12,4],"uv":[0,16]}]},{"name":"leg3","parent":"body","pivot":[4,12,-6],"mirror":true,"cubes":[{"origin":[2,0,-7],"size":[4,12,4],"uv":[0,16]}]}]}]}'},7793:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":3.25,"visible_bounds_offset":[0,1.375,0]},"bones":[{"name":"body","pivot":[0,0,0],"cubes":[{"origin":[-4,6,-2],"size":[8,12,4],"uv":[16,16]}]},{"name":"head","parent":"body","pivot":[0,18,0],"cubes":[{"origin":[-4,18,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"leg0","parent":"body","pivot":[-2,6,4],"cubes":[{"origin":[-4,0,2],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg1","parent":"body","pivot":[2,6,4],"cubes":[{"origin":[0,0,2],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg2","parent":"body","pivot":[-2,6,-4],"cubes":[{"origin":[-4,0,-6],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg3","parent":"body","pivot":[2,6,-4],"cubes":[{"origin":[0,0,-6],"size":[4,6,4],"uv":[0,16]}]}]},{"description":{"identifier":"geometry.{name}.charged","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":3.25,"visible_bounds_offset":[0,1.375,0]},"bones":[{"name":"body","pivot":[0,0,0],"cubes":[{"origin":[-4,6,-2],"size":[8,12,4],"uv":[16,16]}]},{"name":"head","parent":"body","pivot":[0,18,0],"cubes":[{"origin":[-4,18,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"leg0","parent":"body","pivot":[-2,6,4],"cubes":[{"origin":[-4,0,2],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg1","parent":"body","pivot":[2,6,4],"cubes":[{"origin":[0,0,2],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg2","parent":"body","pivot":[-2,6,-4],"cubes":[{"origin":[-4,0,-6],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg3","parent":"body","pivot":[2,6,-4],"cubes":[{"origin":[0,0,-6],"size":[4,6,4],"uv":[0,16]}]}]}]}'},2059:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":5,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"body","pivot":[0,0,-3],"cubes":[{"origin":[-4,0,-3],"size":[8,7,13],"uv":[0,13]}]},{"name":"head","parent":"body","pivot":[0,0,-3],"cubes":[{"origin":[-4,0,-9],"size":[8,7,6],"uv":[0,0]}],"locators":{"lead":[0,0,0]}},{"name":"nose","parent":"head","pivot":[0,0,-13],"cubes":[{"origin":[-1,0,-13],"size":[2,2,4],"uv":[0,13]}]},{"name":"tail","parent":"body","pivot":[0,2.5,11],"cubes":[{"origin":[-2,0,10],"size":[4,5,11],"uv":[0,33]}]},{"name":"tail_fin","parent":"tail","pivot":[0,2.5,20],"cubes":[{"origin":[-5,2,19],"size":[10,1,6],"uv":[0,49]}]},{"name":"back_fin","parent":"body","pivot":[0,7,2],"rotation":[-30,0,0],"cubes":[{"origin":[-0.5,6.25,1],"size":[1,5,4],"uv":[29,0]}]},{"name":"left_fin","parent":"body","pivot":[3,1,-1],"rotation":[0,-25,20],"cubes":[{"origin":[3,1,-2.5],"size":[8,1,4],"uv":[40,0]}]},{"name":"right_fin","parent":"body","pivot":[-3,1,-1],"rotation":[0,25,-20],"cubes":[{"origin":[-11,1,-2.5],"size":[8,1,4],"uv":[40,6]}]}]}]}'},9636:e=>{e.exports='{"format_version":"1.16.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":2.5,"visible_bounds_height":2.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"body","pivot":[0.0,24.0,0.0],"cubes":[{"origin":[-4.0,12.0,-2.0],"size":[8.0,12.0,4.0],"uv":[16,16]}]},{"name":"jacket","parent":"body","pivot":[0.0,24.0,0.0],"cubes":[{"origin":[-4.0,12.0,-2.0],"size":[8.0,12.0,4.0],"uv":[16,32],"inflate":0.5}]},{"name":"head","parent":"body","pivot":[0.0,24.0,0.0],"cubes":[{"origin":[-4.0,24.0,-4.0],"size":[8.0,8.0,8.0],"uv":[0,0],"inflate":0.5}]},{"name":"hat","parent":"head","pivot":[0.0,24.0,0.0],"cubes":[{"origin":[-4.0,24.0,-4.0],"size":[8.0,8.0,8.0],"uv":[32,0],"inflate":1.0}]},{"name":"rightArm","parent":"body","pivot":[-5.0,22.0,0.0],"cubes":[{"origin":[-7.0,12.0,-2.0],"size":[4.0,12.0,4.0],"uv":[0,16]}]},{"name":"leftArm","parent":"body","pivot":[5.0,22.0,0.0],"cubes":[{"origin":[4.0,12.0,-2.0],"size":[4.0,12.0,4.0],"uv":[40,16],"mirror":true}]},{"name":"rightSleeve","parent":"rightArm","pivot":[-5.0,22.0,0.0],"cubes":[{"origin":[-7.0,12.0,-2.0],"size":[4.0,12.0,4.0],"uv":[48,48],"inflate":0.5}]},{"name":"leftSleeve","parent":"leftArm","pivot":[5.0,22.0,0.0],"cubes":[{"origin":[4.0,12.0,-2.0],"size":[4.0,12.0,4.0],"uv":[40,32],"inflate":0.5,"mirror":true}]},{"name":"rightLeg","parent":"body","pivot":[-1.9,12.0,0.0],"cubes":[{"origin":[-4.05,0.0,-2.0],"size":[4.0,12.0,4.0],"uv":[16,48]}]},{"name":"leftLeg","parent":"body","pivot":[1.9,12.0,0.0],"cubes":[{"origin":[0.05,0.0,-2.0],"size":[4.0,12.0,4.0],"uv":[32,48],"mirror":true}]},{"name":"rightPants","parent":"rightLeg","pivot":[-1.9,12.0,0.0],"cubes":[{"origin":[-4.25,0.0,-2.0],"size":[4.0,12.0,4.0],"uv":[0,48],"inflate":0.25}]},{"name":"leftPants","parent":"leftLeg","pivot":[1.9,12.0,0.0],"cubes":[{"origin":[0.25,0.0,-2.0],"size":[4.0,12.0,4.0],"uv":[0,32],"inflate":0.25,"mirror":true}]},{"name":"waist","parent":"body","pivot":[0.0,12.0,0.0]},{"name":"rightItem","parent":"rightArm","pivot":[-6.0,15.0,1.0]},{"name":"leftItem","parent":"leftArm","pivot":[6.0,15.0,1.0]}]}]}'},7953:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":4,"visible_bounds_offset":[0,2,0]},"bones":[{"name":"body","pivot":[0,42,0],"reset":true,"cubes":[{"origin":[-4,30,-2],"size":[8,12,4],"uv":[32,16]}]},{"name":"head","parent":"body","pivot":[0,42,0],"cubes":[{"origin":[-4,42,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"hat","parent":"head","pivot":[0,42,0],"reset":true,"cubes":[{"origin":[-4,41.5,-4],"size":[8,8,8],"inflate":-0.5,"uv":[0,16]}]},{"name":"rightArm","parent":"body","pivot":[-5,40,0],"reset":true,"cubes":[{"origin":[-6,12,-1],"size":[2,30,2],"uv":[56,0]}]},{"name":"rightItem","parent":"rightArm","pivot":[-8,19,1]},{"name":"leftArm","parent":"body","pivot":[5,40,0],"reset":true,"mirror":true,"cubes":[{"origin":[4,12,-1],"size":[2,30,2],"uv":[56,0]}]},{"name":"rightLeg","parent":"body","pivot":[-2,30,0],"reset":true,"cubes":[{"origin":[-3,0,-1],"size":[2,30,2],"uv":[56,0]}]},{"name":"leftLeg","parent":"body","pivot":[2,30,0],"reset":true,"mirror":true,"cubes":[{"origin":[1,0,-1],"size":[2,30,2],"uv":[56,0]}]}]}]}'},836:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":1.5,"visible_bounds_offset":[0,0.25,0]},"bones":[{"name":"section_2","pivot":[0,0,2.5],"cubes":[{"origin":[-1.5,0,2.5],"size":[3,3,1],"uv":[0,14]}]},{"name":"section_0","parent":"section_2","pivot":[0,0,0],"cubes":[{"origin":[-2,0,-4.4],"size":[4,3,2],"uv":[0,0]}]},{"name":"section_1","parent":"section_2","pivot":[0,0,0],"cubes":[{"origin":[-3,0,-2.4],"size":[6,4,5],"uv":[0,5]}]},{"name":"section_3","parent":"section_2","pivot":[0,0,0],"cubes":[{"origin":[-0.5,0,3.5],"size":[1,2,1],"uv":[0,18]}]}]}]}'},6341:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-3],"size":[8,12,6],"uv":[16,20]},{"origin":[-4,6,-3],"size":[8,18,6],"inflate":0.5,"uv":[0,38]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"uv":[0,0]}]},{"name":"nose","parent":"head","pivot":[0,26,0],"cubes":[{"origin":[-1,23,-6],"size":[2,4,2],"uv":[24,0]}]},{"name":"arms","parent":"body","pivot":[0,22,0],"cubes":[{"origin":[-8,16,-2],"size":[4,8,4],"uv":[44,22]},{"origin":[4,16,-2],"size":[4,8,4],"uv":[44,22]},{"origin":[-4,16,-2],"size":[8,4,4],"uv":[40,38]}]},{"name":"leg0","parent":"body","pivot":[-2,12,0],"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"leg1","parent":"body","pivot":[2,12,0],"mirror":true,"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,46]}],"locators":{"right_hand":[-6,12,0]}},{"name":"rightItem","parent":"rightArm","pivot":[-5.5,16,0.5]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[40,46]}],"locators":{"left_hand":[6,12,0]}}]}]}'},8966:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":4,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root","pivot":[0,0,0]},{"name":"body","parent":"root","pivot":[0,8,0],"cubes":[{"origin":[-3,0,-3],"size":[6,11,6],"pivot":[0,8,0],"rotation":[90,0,0],"uv":[30,15]}]},{"name":"head","parent":"body","pivot":[0,8,-3],"cubes":[{"origin":[-4,4,-9],"size":[8,6,6],"uv":[0,0]},{"origin":[-4,10,-8],"size":[2,2,1],"uv":[0,0]},{"origin":[2,10,-8],"size":[2,2,1],"uv":[22,0]},{"origin":[-2,4,-12],"size":[4,2,3],"uv":[0,24]}],"locators":{"held_item":[-2,5,-10],"lead":[0,4,-4]}},{"name":"head_sleeping","parent":"head","pivot":[0,8,-3],"cubes":[{"origin":[-4,4,-9],"size":[8,6,6],"uv":[0,12]},{"origin":[-4,10,-8],"size":[2,2,1],"uv":[0,0]},{"origin":[2,10,-8],"size":[2,2,1],"uv":[22,0]},{"origin":[-2,4,-12],"size":[4,2,3],"uv":[0,24]}]},{"name":"leg0","parent":"body","pivot":[-3,6,6],"cubes":[{"origin":[-3.005,0,5],"size":[2,6,2],"uv":[14,24]}]},{"name":"leg1","parent":"body","pivot":[1,6,6],"cubes":[{"origin":[1.005,0,5],"size":[2,6,2],"uv":[22,24]}]},{"name":"leg2","parent":"body","pivot":[-3,6,-1],"cubes":[{"origin":[-3.005,0,-2],"size":[2,6,2],"uv":[14,24]}]},{"name":"leg3","parent":"body","pivot":[1,6,-1],"cubes":[{"origin":[1.005,0,-2],"size":[2,6,2],"uv":[22,24]}]},{"name":"tail","parent":"body","pivot":[0,8,7],"rotation":[90,0,0],"cubes":[{"origin":[-2,-2,4.75],"size":[4,9,5],"uv":[28,0]}]},{"name":"world","pivot":[0,0,0]}]}]}'},1165:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":48,"texture_height":48,"visible_bounds_width":1,"visible_bounds_height":0.8,"visible_bounds_offset":[0,0.25,0]},"bones":[{"name":"root","pivot":[0,0,0]},{"name":"body","parent":"root","pivot":[0,2,4],"cubes":[{"origin":[-3.5,1,-4],"size":[7,3,9],"uv":[3,1]},{"origin":[-3.5,3,-4],"size":[7,0,9],"uv":[23,22]}]},{"name":"head","parent":"body","pivot":[0,4,3],"cubes":[{"origin":[-3.5,5,-4],"size":[7,0,9],"uv":[23,13]},{"origin":[-3.5,3,-4],"size":[7,3,9],"uv":[0,13]}],"locators":{"lead":[0,6,0]}},{"name":"eyes","parent":"head","pivot":[-0.5,4,5]},{"name":"right_eye","parent":"eyes","pivot":[-2,7,-1.5],"cubes":[{"origin":[-3.5,6,-3],"size":[3,2,3],"uv":[0,0]}]},{"name":"left_eye","parent":"eyes","pivot":[2,7,-1.5],"cubes":[{"origin":[0.5,6,-3],"size":[3,2,3],"uv":[0,5]}]},{"name":"croaking_body","parent":"body","pivot":[0,3,-1],"cubes":[{"origin":[-3.5,1.1,-3.9],"size":[7,2,3],"inflate":-0.1,"uv":[26,5]}]},{"name":"tongue","parent":"body","pivot":[0,3.1,5],"cubes":[{"origin":[-2,3.1,-2.1],"size":[4,0,7],"uv":[17,13]}]},{"name":"left_arm","parent":"body","pivot":[4,3,-2.5],"cubes":[{"origin":[3,0,-3.5],"size":[2,3,3],"uv":[0,32]},{"origin":[0,-0.01,-7.5],"size":[8,0,8],"pivot":[4,0,-3.5],"rotation":[0,0,0],"uv":[18,40]}]},{"name":"right_arm","parent":"body","pivot":[-4,3,-2.5],"cubes":[{"origin":[-5,0,-3.5],"size":[2,3,3],"uv":[0,38]},{"origin":[-8,-0.01,-7.5],"size":[8,0,8],"uv":[2,40]}]},{"name":"left_leg","parent":"root","pivot":[3.5,3,4],"cubes":[{"origin":[2.5,0,2],"size":[3,3,4],"uv":[14,25]},{"origin":[1.5,-0.01,0],"size":[8,0,8],"pivot":[5.5,0,4],"rotation":[0,0,0],"uv":[2,32]}]},{"name":"right_leg","parent":"root","pivot":[-3.5,3,4],"cubes":[{"origin":[-5.5,0,2],"size":[3,3,4],"uv":[0,25]},{"origin":[-9.5,-0.01,0],"size":[8,0,8],"pivot":[-5.5,0,4],"rotation":[0,0,0],"uv":[18,32]}]}]}]}'},2494:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":6,"visible_bounds_height":10,"visible_bounds_offset":[0,4,0]},"bones":[{"name":"body","pivot":[0,1.5,0],"cubes":[{"origin":[-8,0,-8],"size":[16,16,16],"uv":[0,0]}]},{"name":"tentacles_0","parent":"body","pivot":[-3.8,1,-5],"cubes":[{"origin":[-4.8,-8,-6],"size":[2,9,2],"uv":[0,0]}]},{"name":"tentacles_1","parent":"body","pivot":[1.3,1,-5],"cubes":[{"origin":[0.3,-10,-6],"size":[2,11,2],"uv":[0,0]}]},{"name":"tentacles_2","parent":"body","pivot":[6.3,1,-5],"cubes":[{"origin":[5.3,-7,-6],"size":[2,8,2],"uv":[0,0]}]},{"name":"tentacles_3","parent":"body","pivot":[-6.3,1,0],"cubes":[{"origin":[-7.3,-8,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"tentacles_4","parent":"body","pivot":[-1.3,1,0],"cubes":[{"origin":[-2.3,-12,-1],"size":[2,13,2],"uv":[0,0]}]},{"name":"tentacles_5","parent":"body","pivot":[3.8,1,0],"cubes":[{"origin":[2.8,-10,-1],"size":[2,11,2],"uv":[0,0]}]},{"name":"tentacles_6","parent":"body","pivot":[-3.8,1,5],"cubes":[{"origin":[-4.8,-11,4],"size":[2,12,2],"uv":[0,0]}]},{"name":"tentacles_7","parent":"body","pivot":[1.3,1,5],"cubes":[{"origin":[0.3,-11,4],"size":[2,12,2],"uv":[0,0]}]},{"name":"tentacles_8","parent":"body","pivot":[6.3,1,5],"cubes":[{"origin":[5.3,-12,4],"size":[2,13,2],"uv":[0,0]}]}]}]}'},4700:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"left_back_leg","pivot":[1,10,4],"cubes":[{"origin":[1,0,4],"size":[3,6,3],"uv":[36,29]}]},{"name":"right_back_leg","pivot":[-3,10,4],"cubes":[{"origin":[-3,0,4],"size":[3,6,3],"uv":[49,29]}]},{"name":"right_front_leg","pivot":[-3,10,-6],"cubes":[{"origin":[-3,0,-6],"size":[3,10,3],"uv":[49,2]}]},{"name":"left_front_leg","pivot":[1,10,-6],"cubes":[{"origin":[1,0,-6],"size":[3,10,3],"uv":[35,2]}]},{"name":"body","pivot":[0,0,0],"cubes":[{"origin":[-4,6,-7],"size":[9,11,16],"uv":[1,1]},{"origin":[-5,4,-8],"size":[11,14,11],"uv":[0,28]}]},{"name":"head","pivot":[0.5,17,-8],"cubes":[{"origin":[-2,15,-16],"size":[5,7,10],"pivot":[1,18,-8],"rotation":[55,0,0],"uv":[34,46]},{"origin":[3,19,-10],"size":[3,2,1],"uv":[2,61],"mirror":true},{"origin":[-5,19,-10],"size":[3,2,1],"uv":[2,61]},{"origin":[0.5,6,-14],"size":[0,7,5],"uv":[23,52]}]},{"name":"right_horn","parent":"head","pivot":[1,18,-8],"cubes":[{"origin":[-1.99,19,-10],"size":[2,7,2],"uv":[12,55]}]},{"name":"left_horn","parent":"head","pivot":[1,18,-8],"cubes":[{"origin":[0.99,19,-10],"size":[2,7,2],"uv":[12,55]}]}]}]}'},2548:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3.5,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"head","pivot":[0,0,0],"mirror":true,"cubes":[{"origin":[-6,2,-8],"size":[12,12,16],"uv":[0,0],"mirror":false},{"origin":[-8,2,-6],"size":[2,12,12],"uv":[0,28],"mirror":false},{"origin":[6,2,-6],"size":[2,12,12],"uv":[0,28]},{"origin":[-6,14,-6],"size":[12,2,12],"uv":[16,40]},{"origin":[-6,0,-6],"size":[12,2,12],"uv":[16,40]}]},{"name":"eye","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,6,0],"size":[2,2,1],"uv":[8,0]}]},{"name":"tailpart0","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-2,6,7],"size":[4,4,8],"uv":[40,0]}]},{"name":"tailpart1","parent":"tailpart0","pivot":[0,24,0],"cubes":[{"origin":[0,7,0],"size":[3,3,7],"uv":[0,54]}]},{"name":"tailpart2","parent":"tailpart1","pivot":[0,24,0],"cubes":[{"origin":[0,8,0],"size":[2,2,6],"uv":[41,32]},{"origin":[1,4.5,3],"size":[1,9,9],"uv":[25,19]}]},{"name":"spikepart0","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart1","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart2","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart3","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart4","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart5","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart6","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart7","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart8","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart9","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart10","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]},{"name":"spikepart11","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-1,19.5,-1],"size":[2,9,2],"uv":[0,0]}]}]}]}'},3703:e=>{e.exports='{"format_version":"1.21.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":5,"visible_bounds_height":7,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,0,0],"cubes":[{"origin":[-32,0,-32],"size":[64,64,64],"uv":{"north":{"uv":[16,16],"uv_size":[16,16]},"east":{"uv":[0,16],"uv_size":[16,16]},"south":{"uv":[48,16],"uv_size":[16,16]},"west":{"uv":[32,16],"uv_size":[16,16]},"up":{"uv":[16,0],"uv_size":[16,16]},"down":{"uv":[32,16],"uv_size":[16,-16]}}},{"origin":[-30.5,1.5,-30.5],"size":[61,61,61],"inflate":-0.5,"uv":{"north":{"uv":[16,48],"uv_size":[16,16]},"east":{"uv":[0,48],"uv_size":[16,16]},"south":{"uv":[48,48],"uv_size":[16,16]},"west":{"uv":[32,48],"uv_size":[16,16]},"up":{"uv":[16,32],"uv_size":[16,16]},"down":{"uv":[32,48],"uv_size":[16,-16]}}}],"locators":{"lead":[0,0,0],"lead_hold":[0,24,0],"multi_lead_hold_1":[31,24,31],"multi_lead_hold_2":[31,24,-27],"multi_lead_hold_3":[-31,24,-27],"multi_lead_hold_4":[-31,24,31]}},{"name":"tentacles_0","parent":"body","pivot":[-15.2,4,-20],"cubes":[{"origin":[-19.2,-16,-24],"size":[8,20,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,5]},"east":{"uv":[0,2],"uv_size":[2,5]},"south":{"uv":[6,2],"uv_size":[2,5]},"west":{"uv":[4,2],"uv_size":[2,5]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_1","parent":"body","pivot":[5.2,4,-20],"cubes":[{"origin":[1.2,-24,-24],"size":[8,28,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,7]},"east":{"uv":[0,2],"uv_size":[2,7]},"south":{"uv":[6,2],"uv_size":[2,7]},"west":{"uv":[4,2],"uv_size":[2,7]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_2","parent":"body","pivot":[25.2,4,-20],"cubes":[{"origin":[21.2,-12,-24],"size":[8,16,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,4]},"east":{"uv":[0,2],"uv_size":[2,4]},"south":{"uv":[6,2],"uv_size":[2,4]},"west":{"uv":[4,2],"uv_size":[2,4]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_3","parent":"body","pivot":[-25.2,4,0],"cubes":[{"origin":[-29.2,-16,-4],"size":[8,20,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,5]},"east":{"uv":[0,2],"uv_size":[2,5]},"south":{"uv":[6,2],"uv_size":[2,5]},"west":{"uv":[4,2],"uv_size":[2,5]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_4","parent":"body","pivot":[-5.2,4,0],"cubes":[{"origin":[-9.2,-16,-4],"size":[8,20,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,5]},"east":{"uv":[0,2],"uv_size":[2,5]},"south":{"uv":[6,2],"uv_size":[2,5]},"west":{"uv":[4,2],"uv_size":[2,5]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_5","parent":"body","pivot":[15.2,4,0],"cubes":[{"origin":[11.2,-24,-4],"size":[8,28,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,7]},"east":{"uv":[0,2],"uv_size":[2,7]},"south":{"uv":[6,2],"uv_size":[2,7]},"west":{"uv":[4,2],"uv_size":[2,7]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_6","parent":"body","pivot":[-15.2,4,20],"cubes":[{"origin":[-19.2,-28,16],"size":[8,32,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,8]},"east":{"uv":[0,2],"uv_size":[2,8]},"south":{"uv":[6,2],"uv_size":[2,8]},"west":{"uv":[4,2],"uv_size":[2,8]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_7","parent":"body","pivot":[5.2,4,20],"cubes":[{"origin":[1.2,-28,16],"size":[8,32,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,8]},"east":{"uv":[0,2],"uv_size":[2,8]},"south":{"uv":[6,2],"uv_size":[2,8]},"west":{"uv":[4,2],"uv_size":[2,8]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]},{"name":"tentacles_8","parent":"body","pivot":[25.2,4,20],"cubes":[{"origin":[21.2,-16,16],"size":[8,20,8],"uv":{"north":{"uv":[2,2],"uv_size":[2,5]},"east":{"uv":[0,2],"uv_size":[2,5]},"south":{"uv":[6,2],"uv_size":[2,5]},"west":{"uv":[4,2],"uv_size":[2,5]},"up":{"uv":[2,0],"uv_size":[2,2]},"down":{"uv":[4,2],"uv_size":[2,-2]}}}]}]}]}'},1538:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":64,"visible_bounds_width":4,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,19,-3],"cubes":[{"origin":[-8,11,-7],"size":[16,14,26],"inflate":0.02,"uv":[1,1]},{"origin":[0,22,-10],"size":[0,10,19],"inflate":0.02,"uv":[90,33]}],"locators":{"lead":[0,20,-5]}},{"name":"head","parent":"body","pivot":[0,22,-5],"rotation":[50,0,0],"cubes":[{"origin":[-7,21,-24],"size":[14,6,19],"uv":[61,1]},{"origin":[-8,22,-19],"size":[2,11,2],"uv":[1,13]},{"origin":[6,22,-19],"size":[2,11,2],"uv":[1,13]}]},{"name":"right_ear","parent":"head","pivot":[-7,27,-7],"rotation":[0,0,-50],"cubes":[{"origin":[-13,26,-10],"size":[6,1,4],"uv":[1,1]}]},{"name":"left_ear","parent":"head","pivot":[7,27,-7],"rotation":[0,0,50],"cubes":[{"origin":[7,26,-10],"size":[6,1,4],"uv":[1,6]}]},{"name":"leg_back_right","pivot":[6,8,17],"cubes":[{"origin":[-8,0,13],"size":[5,11,5],"uv":[21,45]}]},{"name":"leg_back_left","pivot":[-6,8,17],"cubes":[{"origin":[3,0,13],"size":[5,11,5],"uv":[0,45]}]},{"name":"leg_front_right","pivot":[-6,12,-3],"cubes":[{"origin":[-8,0,-6],"size":[6,14,6],"uv":[66,42]}]},{"name":"leg_front_left","pivot":[6,12,-3],"cubes":[{"origin":[2,0,-6],"size":[6,14,6],"uv":[41,42]}]}]}]}'},2510:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":4,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"Body","pivot":[0,13,9],"cubes":[{"origin":[-5,11,-11],"size":[10,10,22],"uv":[0,32]}]},{"name":"Tail","parent":"Body","pivot":[0,20,11],"rotation":[25,0,0],"cubes":[{"origin":[-1.5,6,9],"size":[3,14,4],"uv":[42,36]}]},{"name":"LegBL","parent":"Body","pivot":[3,11,9],"cubes":[{"origin":[1,0,7],"size":[4,11,4],"uv":[48,21],"mirror":true}]},{"name":"LegBR","parent":"Body","pivot":[-3,11,9],"cubes":[{"origin":[-5,0,7],"size":[4,11,4],"uv":[48,21]}]},{"name":"LegFL","parent":"Body","pivot":[3,11,-9],"cubes":[{"origin":[1,0,-11],"size":[4,11,4],"uv":[48,21],"mirror":true}]},{"name":"LegFR","parent":"Body","pivot":[-3,11,-9],"cubes":[{"origin":[-5,0,-11],"size":[4,11,4],"uv":[48,21]}]},{"name":"Neck","parent":"Body","pivot":[0,17,-8],"rotation":[30,0,0],"cubes":[{"origin":[-2,16,-11],"size":[4,12,7],"uv":[0,35]}],"locators":{"lead":[0,17,-8]}},{"name":"Head","parent":"Neck","pivot":[0,28,-11],"cubes":[{"origin":[-3,28,-11],"size":[6,5,7],"uv":[0,13]}]},{"name":"Muzzle","parent":"Head","pivot":[0,28,-11],"cubes":[{"origin":[-2,28,-16],"size":[4,5,5],"uv":[0,25]}]},{"name":"EarL","parent":"Head","pivot":[0,17,-8],"rotation":[0,0,5],"cubes":[{"origin":[-0.5,32,-5.01],"size":[2,3,1],"uv":[19,16],"mirror":true}]},{"name":"EarR","parent":"Head","pivot":[0,17,-8],"rotation":[0,0,-5],"cubes":[{"origin":[-1.5,32,-5.01],"size":[2,3,1],"uv":[19,16]}]},{"name":"MuleEarL","parent":"Head","pivot":[0,17,-8],"rotation":[0,0,15],"cubes":[{"origin":[-3,32,-5.01],"size":[2,7,1],"uv":[0,12],"mirror":true}]},{"name":"MuleEarR","parent":"Head","pivot":[0,17,-8],"rotation":[0,0,-15],"cubes":[{"origin":[1,32,-5.01],"size":[2,7,1],"uv":[0,12]}]},{"name":"ReinsL","parent":"Head","pivot":[2,30.5,-13.5],"rotation":[-35,0,0],"cubes":[{"origin":[3.1,29,-13],"size":[0,3,16],"uv":[32,2]}]},{"name":"ReinsR","parent":"Head","pivot":[-3,30.5,-13.5],"rotation":[-35,0,0],"cubes":[{"origin":[-3.1,29,-13],"size":[0,3,16],"uv":[32,2]}]},{"name":"Bridle","parent":"Head","pivot":[0,17,-8],"cubes":[{"origin":[-2,28,-13],"size":[4,5,2],"inflate":0.25,"uv":[19,0]},{"origin":[-3,28,-11],"size":[6,5,7],"inflate":0.25,"uv":[0,0]}]},{"name":"BitL","parent":"Bridle","pivot":[0,17,-8],"cubes":[{"origin":[2,29,-14],"size":[1,2,2],"uv":[29,5]}]},{"name":"BitR","parent":"Bridle","pivot":[0,17,-8],"cubes":[{"origin":[-3,29,-14],"size":[1,2,2],"uv":[29,5]}]},{"name":"Mane","parent":"Neck","pivot":[0,17,-8],"cubes":[{"origin":[-1,17,-3.95],"size":[2,16,2],"uv":[56,36]}]},{"name":"BagL","parent":"Body","pivot":[5,21,11],"rotation":[0,90,0],"cubes":[{"origin":[6,13,11],"size":[8,8,3],"uv":[26,21],"mirror":true}]},{"name":"BagR","parent":"Body","pivot":[-5,21,11],"rotation":[0,-90,0],"cubes":[{"origin":[-14,13,11],"size":[8,8,3],"uv":[26,21]}]},{"name":"Saddle","parent":"Body","pivot":[0,22,2],"cubes":[{"origin":[-5,12,-3.5],"size":[10,9,9],"inflate":0.5,"uv":[26,0]}]}]}]}'},910:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"waist","pivot":[0,12,0]},{"name":"body","parent":"waist","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-2],"size":[8,12,4],"uv":[16,16]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"hat","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"inflate":0.5,"uv":[32,0]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,16]}]},{"name":"rightItem","parent":"rightArm","pivot":[-6,15,1]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[40,16]}]},{"name":"leftItem","parent":"leftArm","pivot":[6,15,1]},{"name":"rightLeg","parent":"body","pivot":[-1.9,12,0],"cubes":[{"origin":[-3.9,0,-2],"size":[4,12,4],"uv":[0,16]}]},{"name":"leftLeg","parent":"body","pivot":[1.9,12,0],"mirror":true,"cubes":[{"origin":[-0.1,0,-2],"size":[4,12,4],"uv":[0,16]}]}]}]}'},7010:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":128,"visible_bounds_width":3,"visible_bounds_height":4,"visible_bounds_offset":[0,2,0]},"bones":[{"name":"body","pivot":[0,31,0],"cubes":[{"origin":[-9,21,-6],"size":[18,12,11],"uv":[0,40]},{"origin":[-4.5,16,-3],"size":[9,5,6],"inflate":0.5,"uv":[0,70]}]},{"name":"head","parent":"body","pivot":[0,31,-2],"cubes":[{"origin":[-4,33,-7.5],"size":[8,10,8],"uv":[0,0]},{"origin":[-1,32,-9.5],"size":[2,4,2],"uv":[24,0]}],"locators":{"lead":[0,31,-2]}},{"name":"arm0","parent":"body","pivot":[0,31,0],"cubes":[{"origin":[-13,3.5,-3],"size":[4,30,6],"uv":[60,21]}]},{"name":"arm1","parent":"body","pivot":[0,31,0],"cubes":[{"origin":[9,3.5,-3],"size":[4,30,6],"uv":[60,58]}]},{"name":"leg0","parent":"body","pivot":[-4,13,0],"cubes":[{"origin":[-7.5,0,-3],"size":[6,16,5],"uv":[37,0]}]},{"name":"leg1","parent":"body","pivot":[5,13,0],"mirror":true,"cubes":[{"origin":[1.5,0,-3],"size":[6,16,5],"uv":[60,0]}]}]}]}'},4010:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":3.25,"visible_bounds_offset":[0,1.375,0]},"bones":[{"name":"body","pivot":[0,19,2],"cubes":[{"origin":[-6,11,-5],"size":[12,18,10],"pivot":[0,19,2],"rotation":[90,0,0],"uv":[29,0]}]},{"name":"head","parent":"body","pivot":[0,17,-6],"cubes":[{"origin":[-2,27,-16],"size":[4,4,9],"uv":[0,0]},{"origin":[-4,15,-12],"size":[8,18,6],"uv":[0,14]},{"origin":[-4,33,-10],"size":[3,3,2],"uv":[17,0]},{"origin":[1,33,-10],"size":[3,3,2],"uv":[17,0]}],"locators":{"lead":[0,18,-11]}},{"name":"chest1","parent":"body","pivot":[-8.5,21,3],"rotation":[0,90,0],"cubes":[{"origin":[-11.5,13,3],"size":[8,8,3],"uv":[45,28]}]},{"name":"chest2","parent":"body","pivot":[5.5,21,3],"rotation":[0,90,0],"cubes":[{"origin":[2.5,13,3],"size":[8,8,3],"uv":[45,41]}]},{"name":"leg0","parent":"body","pivot":[-3.5,14,6],"cubes":[{"origin":[-5.5,0,4],"size":[4,14,4],"uv":[29,29]}]},{"name":"leg1","parent":"body","pivot":[3.5,14,6],"cubes":[{"origin":[1.5,0,4],"size":[4,14,4],"uv":[29,29]}]},{"name":"leg2","parent":"body","pivot":[-3.5,14,-5],"cubes":[{"origin":[-5.5,0,-7],"size":[4,14,4],"uv":[29,29]}]},{"name":"leg3","parent":"body","pivot":[3.5,14,-5],"cubes":[{"origin":[1.5,0,-7],"size":[4,14,4],"uv":[29,29]}]}]}]}'},5580:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2.5,"visible_bounds_height":5,"visible_bounds_offset":[0,2.5,0]},"bones":[{"name":"insideCube","pivot":[0,0,0],"cubes":[{"origin":[-2,2,-2],"size":[4,4,4],"uv":[0,16]}]},{"name":"bodyCube_0","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,7,-4],"size":[8,1,8],"uv":[0,0]}]},{"name":"bodyCube_1","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,6,-4],"size":[8,1,8],"uv":[0,1]}]},{"name":"bodyCube_2","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,5,-4],"size":[8,1,8],"uv":[24,10]}]},{"name":"bodyCube_3","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,4,-4],"size":[8,1,8],"uv":[24,19]}]},{"name":"bodyCube_4","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,3,-4],"size":[8,1,8],"uv":[0,4]}]},{"name":"bodyCube_5","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,2,-4],"size":[8,1,8],"uv":[0,5]}]},{"name":"bodyCube_6","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,1,-4],"size":[8,1,8],"uv":[0,6]}]},{"name":"bodyCube_7","parent":"insideCube","pivot":[0,24,0],"cubes":[{"origin":[-4,0,-4],"size":[8,1,8],"uv":[0,7]}]}]}]}'},1566:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,19,2],"cubes":[{"origin":[-6,11,-5],"size":[12,18,10],"pivot":[0,19,2],"rotation":[90,0,0],"uv":[18,4]},{"origin":[-2,11,-6],"size":[4,6,1],"pivot":[0,19,2],"rotation":[90,0,0],"uv":[52,0]}]},{"name":"mushroom1","parent":"body","pivot":[2.5,22,8.5],"cubes":[{"origin":[-1.5,22,8.5],"size":[8,7,0],"uv":[0,33]},{"origin":[-1.5,22,8.5],"size":[8,7,0],"pivot":[2.5,22,8.5],"rotation":[0,90,0],"uv":[0,33]}]},{"name":"mushroom2","parent":"body","pivot":[-3,22,0],"rotation":[0,45,0],"cubes":[{"origin":[-7,22,0],"size":[8,7,0],"uv":[0,33]},{"origin":[-7,22,0],"size":[8,7,0],"pivot":[-3,22,0],"rotation":[0,90,0],"uv":[0,33]}]},{"name":"leg0","parent":"body","pivot":[-4,12,7],"cubes":[{"origin":[-6,0,5],"size":[4,12,4],"uv":[0,16]}]},{"name":"leg1","parent":"body","pivot":[4,12,7],"mirror":true,"cubes":[{"origin":[2,0,5],"size":[4,12,4],"uv":[0,16]}]},{"name":"leg2","parent":"body","pivot":[-4,12,-6],"cubes":[{"origin":[-6,0,-7],"size":[4,12,4],"uv":[0,16]}]},{"name":"leg3","parent":"body","pivot":[4,12,-6],"mirror":true,"cubes":[{"origin":[2,0,-7],"size":[4,12,4],"uv":[0,16]}]},{"name":"head","pivot":[0,20,-8],"cubes":[{"origin":[-4,16,-14],"size":[8,8,6],"uv":[0,0]},{"origin":[-5,22,-12],"size":[1,3,1],"uv":[22,0]},{"origin":[4,22,-12],"size":[1,3,1],"uv":[22,0]}],"locators":{"lead":[0,20,-8]}},{"name":"mushroom3","parent":"head","pivot":[0,24,-11.25],"rotation":[0,-40,0],"cubes":[{"origin":[-4,24,-11.25],"size":[8,7,0],"uv":[0,33]},{"origin":[-4,24,-11.25],"size":[8,7,0],"pivot":[0,24,-11.25],"rotation":[0,90,0],"uv":[0,33]}]}]}]}'},4784:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.npc","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-3],"size":[8,12,6],"uv":[16,20]},{"origin":[-4,6,-3],"size":[8,18,6],"inflate":0.5,"uv":[0,38]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"uv":[0,0]}]},{"name":"hat","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"inflate":0.5,"uv":[32,0]}]},{"name":"nose","parent":"head","pivot":[0,26,0],"cubes":[{"origin":[-1,23,-6],"size":[2,4,2],"uv":[24,0]}]},{"name":"arms","parent":"body","pivot":[0,21,-1],"rotation":[-42.97,0,0],"cubes":[{"origin":[-4,15,-3],"size":[8,4,4],"uv":[40,38]},{"origin":[-8,15,-3],"size":[4,8,4],"uv":[44,22]},{"origin":[4,15,-3],"size":[4,8,4],"uv":[44,46]}]},{"name":"leg0","pivot":[-2,12,0],"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"leg1","pivot":[2,12,0],"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,22]}]}]}]}'},7615:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":4,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"body","pivot":[0,7,1],"cubes":[{"origin":[-2,-1,-2],"size":[4,16,6],"pivot":[0,7,1],"rotation":[90,0,0],"uv":[20,0]}]},{"name":"head","parent":"body","pivot":[0,9,-9],"cubes":[{"origin":[-2.5,7,-12],"size":[5,4,5],"uv":[0,0]},{"origin":[-1.5,7.01562,-13],"size":[3,2,2],"uv":[0,24]},{"origin":[-2,11,-9],"size":[1,1,2],"uv":[0,10]},{"origin":[1,11,-9],"size":[1,1,2],"uv":[6,10]}],"locators":{"lead":[0,9,-9]}},{"name":"tail1","parent":"body","pivot":[0,9,8],"cubes":[{"origin":[-0.5,1,8],"size":[1,8,1],"pivot":[0,9,8],"rotation":[52.5,0,0],"uv":[0,15]}]},{"name":"tail2","parent":"tail1","pivot":[0,4.125,14.35],"cubes":[{"origin":[-0.5,-3.875,14.35],"size":[1,8,1],"pivot":[0,4.125,14.35],"rotation":[90,0,0],"uv":[4,15]}]},{"name":"backLegL","parent":"body","pivot":[1.1,6,7],"cubes":[{"origin":[0.1,0,6],"size":[2,6,2],"uv":[8,13]}]},{"name":"backLegR","parent":"body","pivot":[-1.1,6,7],"cubes":[{"origin":[-2.1,0,6],"size":[2,6,2],"uv":[8,13]}]},{"name":"frontLegL","parent":"body","pivot":[1.2,10,-4],"cubes":[{"origin":[0.2,0.2,-5],"size":[2,10,2],"uv":[40,0]}]},{"name":"frontLegR","parent":"body","pivot":[-1.2,10,-4],"cubes":[{"origin":[-2.2,0.2,-5],"size":[2,10,2],"uv":[40,0]}]}]}]}'},3783:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"body","pivot":[0,14,0],"cubes":[{"origin":[-9.5,1,-6.5],"size":[19,26,13],"pivot":[0,14,0],"rotation":[90,0,0],"uv":[0,25]}]},{"name":"head","parent":"body","pivot":[0,12.5,-17],"cubes":[{"origin":[-6.5,7.5,-21],"size":[13,10,9],"uv":[0,6]},{"origin":[-3.5,7.5,-23],"size":[7,5,2],"uv":[45,16]},{"origin":[-8.5,16.5,-18],"size":[5,4,1],"uv":[52,25]},{"origin":[3.5,16.5,-18],"size":[5,4,1],"uv":[52,25]}],"locators":{"lead":[0,14,-16]}},{"name":"leg0","parent":"body","pivot":[-5.5,9,9],"cubes":[{"origin":[-8.5,0,6],"size":[6,9,6],"uv":[40,0]}]},{"name":"leg1","parent":"body","pivot":[5.5,9,9],"cubes":[{"origin":[2.5,0,6],"size":[6,9,6],"uv":[40,0]}]},{"name":"leg2","parent":"body","pivot":[-5.5,9,-9],"cubes":[{"origin":[-8.5,0,-12],"size":[6,9,6],"uv":[40,0]}]},{"name":"leg3","parent":"body","pivot":[5.5,9,-9],"cubes":[{"origin":[2.5,0,-12],"size":[6,9,6],"uv":[40,0]}]}]}]}'},2735:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":32,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"body","pivot":[0,7.5,-3],"rotation":[25,0,0],"cubes":[{"origin":[-1.5,1.5,-4.5],"size":[3,6,3],"uv":[2,8]}]},{"name":"wing0","parent":"body","pivot":[1.5,7.1,-2.8],"rotation":[-10,180,0],"cubes":[{"origin":[1,2.1,-4.3],"size":[1,5,3],"uv":[19,8]}]},{"name":"wing1","parent":"body","pivot":[-1.5,7.1,-2.8],"rotation":[-10,180,0],"cubes":[{"origin":[-2,2.1,-4.3],"size":[1,5,3],"uv":[19,8]}]},{"name":"head","pivot":[0,8.3,-2.8],"cubes":[{"origin":[-1,6.8,-3.8],"size":[2,3,2],"uv":[2,2]},{"origin":[-1,9.8,-5.8],"size":[2,1,4],"uv":[10,0]},{"origin":[-0.5,7.8,-4.7],"size":[1,2,1],"uv":[11,7]},{"origin":[-0.5,8.1,-5.7],"size":[1,1.7,1],"uv":[16,7]},{"origin":[0,9.1,-4.9],"size":[0,5,4],"uv":[2,18]}]},{"name":"tail","pivot":[0,2.9,1.2],"rotation":[50,0,0],"cubes":[{"origin":[-1.5,-0.1,0.2],"size":[3,4,1],"uv":[22,1]}]},{"name":"leg0","pivot":[1.5,1.5,-0.5],"cubes":[{"origin":[0.5,0,-1.5],"size":[1,2,1],"uv":[14,18]}]},{"name":"leg1","pivot":[-0.5,1.5,-0.5],"cubes":[{"origin":[-1.5,0,-1.5],"size":[1,2,1],"uv":[14,18]}]}]}]}'},7582:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":4,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"body","pivot":[0,24,0],"cubes":[{"origin":[-3,23,-8],"size":[5,3,9],"uv":[0,8]}]},{"name":"wing0","parent":"body","pivot":[2,26,-8],"rotation":[0,0,5.7],"cubes":[{"origin":[2,24,-8],"size":[6,2,9],"uv":[23,12]}]},{"name":"wingtip0","parent":"wing0","pivot":[8,26,-8],"rotation":[0,0,5.7],"cubes":[{"origin":[8,25,-8],"size":[13,1,9],"uv":[16,24]}],"locators":{"left_wing":[21,26,0]}},{"name":"wing1","parent":"body","pivot":[-3,26,-8],"rotation":[0,0,-5.7],"mirror":true,"cubes":[{"origin":[-9,24,-8],"size":[6,2,9],"uv":[23,12]}]},{"name":"wingtip1","parent":"wing1","pivot":[-9,26,-8],"rotation":[0,0,-5.7],"mirror":true,"cubes":[{"origin":[-22,25,-8],"size":[13,1,9],"uv":[16,24]}],"locators":{"right_wing":[-22,24,0]}},{"name":"head","parent":"body","pivot":[0,23,-7],"rotation":[11.5,0,0],"cubes":[{"origin":[-4,22,-12],"size":[7,3,5],"uv":[0,0]}]},{"name":"tail","parent":"body","pivot":[0,26,1],"cubes":[{"origin":[-2,24,1],"size":[3,2,6],"uv":[3,20]}]},{"name":"tailtip","parent":"tail","pivot":[0,25.5,7],"cubes":[{"origin":[-1,24.5,7],"size":[1,1,6],"uv":[4,29]}]}]}]}'},4891:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":2.25,"visible_bounds_offset":[0,0.875,0]},"bones":[{"name":"body","pivot":[0,13,2],"cubes":[{"origin":[-5,7,-5],"size":[10,16,8],"pivot":[0,13,2],"rotation":[90,0,0],"uv":[28,8]}]},{"name":"head","parent":"body","pivot":[0,12,-6],"cubes":[{"origin":[-4,8,-14],"size":[8,8,8],"uv":[0,0]},{"origin":[-2,9,-15],"size":[4,3,1],"uv":[16,16]}],"locators":{"lead":[0,14,-6]}},{"name":"leg0","parent":"body","pivot":[-3,6,7],"cubes":[{"origin":[-5,0,5],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg1","parent":"body","pivot":[3,6,7],"mirror":true,"cubes":[{"origin":[1,0,5],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg2","parent":"body","pivot":[-3,6,-5],"cubes":[{"origin":[-5,0,-7],"size":[4,6,4],"uv":[0,16]}]},{"name":"leg3","parent":"body","pivot":[3,6,-5],"mirror":true,"cubes":[{"origin":[1,0,-7],"size":[4,6,4],"uv":[0,16]}]}]}]}'},5264:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-2],"size":[8,12,4],"uv":[16,16]},{"origin":[-4,12,-2],"size":[8,12,4],"uv":[16,32],"inflate":0.25}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-5,24,-4],"size":[10,8,8],"uv":[0,0],"inflate":-0.02},{"origin":[-2,24,-5],"size":[4,4,1],"uv":[31,1]},{"origin":[2,24,-5],"size":[1,2,1],"uv":[2,4]},{"origin":[-3,24,-5],"size":[1,2,1],"uv":[2,0]}],"inflate":-0.02},{"name":"leftear","parent":"head","pivot":[5,30,0],"rotation":[0,0,-30],"cubes":[{"origin":[4,25,-2],"size":[1,5,4],"uv":[51,6]}]},{"name":"rightear","parent":"head","pivot":[-5,30,0],"rotation":[0,0,30],"cubes":[{"origin":[-5,25,-2],"size":[1,5,4],"uv":[39,6]}]},{"name":"hat","parent":"head","pivot":[0,24,0]},{"name":"rightarm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,16]},{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,32],"inflate":0.25}]},{"name":"rightItem","parent":"rightarm","pivot":[-6,15,1]},{"name":"leftarm","parent":"body","pivot":[5,22,0],"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[32,48]},{"origin":[4,12,-2],"size":[4,12,4],"uv":[48,48],"inflate":0.25}]},{"name":"leftItem","parent":"leftArm","pivot":[6.0,15.0,1.0]},{"name":"rightleg","parent":"body","pivot":[-1.9,12,0],"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,16]},{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,32],"inflate":0.25}]},{"name":"leftleg","parent":"body","pivot":[1.9,12,0],"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[16,48]},{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,48],"inflate":0.25}]}]}]}'},9271:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"waist","pivot":[0,12,0]},{"name":"body","parent":"waist","pivot":[0,0,0],"cubes":[{"origin":[-4,12,-3],"size":[8,12,6],"uv":[16,20]},{"origin":[-4,6,-3],"size":[8,18,6],"inflate":0.5,"uv":[0,38]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"uv":[0,0]}],"locators":{"lead":[0,0,0]}},{"name":"nose","parent":"head","pivot":[0,26,0],"cubes":[{"origin":[-1,23,-6],"size":[2,4,2],"uv":[24,0]}]},{"name":"leftLeg","parent":"body","pivot":[2,12,0],"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"rightLeg","parent":"body","pivot":[-2,12,0],"mirror":true,"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"rightarm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,46]}]},{"name":"rightItem","pivot":[-6,15,1],"parent":"rightArm"},{"name":"leftarm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[40,46]}]},{"name":"leftItem","pivot":[6.0,15.0,1.0],"parent":"leftArm"}]}]}'},952:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":64,"visible_bounds_width":4,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"body","pivot":[-2,15,12],"cubes":[{"origin":[-7,14,5],"size":[14,14,11],"pivot":[0,15,12],"rotation":[90,0,0],"uv":[0,19]},{"origin":[-6,28,5],"size":[12,12,10],"pivot":[0,15,12],"rotation":[90,0,0],"uv":[39,0]}]},{"name":"head","parent":"body","pivot":[0,14,-16],"mirror":true,"cubes":[{"origin":[-3.5,10,-19],"size":[7,7,7],"uv":[0,0],"mirror":false},{"origin":[-2.5,10,-22],"size":[5,3,3],"uv":[0,44],"mirror":false},{"origin":[-4.5,16,-17],"size":[2,2,1],"uv":[26,0],"mirror":false},{"origin":[2.5,16,-17],"size":[2,2,1],"uv":[26,0]}],"locators":{"lead":[0,14,-16]}},{"name":"leg0","parent":"body","pivot":[-4.5,10,6],"cubes":[{"origin":[-6.5,0,4],"size":[4,10,8],"uv":[50,22]}]},{"name":"leg1","parent":"body","pivot":[4.5,10,6],"cubes":[{"origin":[2.5,0,4],"size":[4,10,8],"uv":[50,22]}]},{"name":"leg2","parent":"body","pivot":[-3.5,10,-8],"cubes":[{"origin":[-5.5,0,-10],"size":[4,10,6],"uv":[50,40]}]},{"name":"leg3","parent":"body","pivot":[3.5,10,-8],"cubes":[{"origin":[1.5,0,-10],"size":[4,10,6],"uv":[50,40]}]}]}]}'},7775:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"rearFootLeft","pivot":[3,6.5,3.7],"mirror":true,"cubes":[{"origin":[2,0,0],"size":[2,1,7],"uv":[8,24]}]},{"name":"rearFootRight","pivot":[-3,6.5,3.7],"mirror":true,"cubes":[{"origin":[-4,0,0],"size":[2,1,7],"uv":[26,24]}]},{"name":"haunchLeft","pivot":[3,6.5,3.7],"rotation":[-20,0,0],"mirror":true,"cubes":[{"origin":[2,2.5,3.7],"size":[2,4,5],"uv":[16,15]}]},{"name":"haunchRight","pivot":[-3,6.5,3.7],"rotation":[-20,0,0],"mirror":true,"cubes":[{"origin":[-4,2.5,3.7],"size":[2,4,5],"uv":[30,15]}]},{"name":"body","pivot":[0,5,8],"rotation":[-20,0,0],"mirror":true,"cubes":[{"origin":[-3,2,-2],"size":[6,5,10],"uv":[0,0]}]},{"name":"frontLegLeft","pivot":[3,7,-1],"rotation":[-10,0,0],"mirror":true,"cubes":[{"origin":[2,0,-2],"size":[2,7,2],"uv":[8,15]}]},{"name":"frontLegRight","pivot":[-3,7,-1],"rotation":[-10,0,0],"mirror":true,"cubes":[{"origin":[-4,0,-2],"size":[2,7,2],"uv":[0,15]}]},{"name":"head","pivot":[0,8,-1],"mirror":true,"cubes":[{"origin":[-2.5,8,-6],"size":[5,4,5],"uv":[32,0]}],"locators":{"lead":[0,8,-1]}},{"name":"earRight","parent":"head","pivot":[0,8,-1],"rotation":[0,-15,0],"mirror":true,"cubes":[{"origin":[-2.5,12,-2],"size":[2,5,1],"uv":[58,0]}]},{"name":"earLeft","parent":"head","pivot":[0,8,-1],"rotation":[0,15,0],"mirror":true,"cubes":[{"origin":[0.5,12,-2],"size":[2,5,1],"uv":[52,0]}]},{"name":"nose","parent":"head","pivot":[0,8,-1],"mirror":true,"cubes":[{"origin":[-0.5,9.5,-6.5],"size":[1,1,1],"uv":[32,9]}]},{"name":"tail","pivot":[0,4,7],"rotation":[-20,0,0],"mirror":true,"cubes":[{"origin":[-1.5,2.5,7],"size":[3,3,2],"uv":[52,6]}]}]}]}'},5069:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":128,"visible_bounds_width":5,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"body","pivot":[0,19,2],"rotation":[90,0,0],"cubes":[{"origin":[-7,10,-2],"size":[14,16,20],"uv":[0,55]},{"origin":[-6,-3,-2],"size":[12,13,18],"uv":[0,91]}]},{"name":"neck","pivot":[0,20,-20],"cubes":[{"origin":[-5,21,-10],"size":[10,10,18],"uv":[68,73]}]},{"name":"head","parent":"neck","pivot":[0,28,-10],"cubes":[{"origin":[-8,14,-24],"size":[16,20,16],"uv":[0,0]},{"origin":[-2,12,-28],"size":[4,8,4],"uv":[0,0]}],"locators":{"stun":[0,32,-15]}},{"name":"mouth","parent":"head","pivot":[0,15,-10],"cubes":[{"origin":[-8,13,-24],"size":[16,3,16],"uv":[0,36]}]},{"name":"horns","parent":"head","pivot":[-5,27,-19],"rotation":[60,0,0],"cubes":[{"origin":[-10,27,-20],"size":[2,14,4],"uv":[74,55]},{"origin":[8,27,-20],"size":[2,14,4],"uv":[74,55]}]},{"name":"leg0","pivot":[-12,30,22],"cubes":[{"origin":[-12,0,17],"size":[8,37,8],"uv":[96,0]}]},{"name":"leg1","pivot":[4,30,22],"cubes":[{"origin":[4,0,17],"size":[8,37,8],"uv":[96,0]}]},{"name":"leg2","pivot":[-4,26,-4],"cubes":[{"origin":[-12,0,-8],"size":[8,37,8],"uv":[64,0]}]},{"name":"leg3","pivot":[-4,26,-4],"cubes":[{"origin":[4,0,-8],"size":[8,37,8],"uv":[64,0]}]}]}]}'},9597:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":32,"texture_height":32,"visible_bounds_width":4,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"body_front","pivot":[0,0,-4],"cubes":[{"origin":[-1.5,3.5,-4],"size":[3,5,8],"uv":[0,0]}]},{"name":"body_back","parent":"body_front","pivot":[0,0,4],"cubes":[{"origin":[-1.5,3.5,4],"size":[3,5,8],"uv":[0,13]}]},{"name":"dorsal_back","parent":"body_back","pivot":[0,5,4],"cubes":[{"origin":[0,8.5,4],"size":[0,2,3],"uv":[2,3]}]},{"name":"tailfin","parent":"body_back","pivot":[0,0,12],"cubes":[{"origin":[0,3.5,12],"size":[0,5,6],"uv":[20,10]}]},{"name":"dorsal_front","parent":"body_front","pivot":[0,5,2],"cubes":[{"origin":[0,8.5,2],"size":[0,2,2],"uv":[4,2]}]},{"name":"head","parent":"body_front","pivot":[0,3,-4],"cubes":[{"origin":[-1,4.5,-7],"size":[2,4,3],"uv":[22,0]}],"locators":{"lead":[0,3,-4]}},{"name":"leftFin","parent":"body_front","pivot":[1.5,1,-4],"rotation":[0,0,35],"cubes":[{"origin":[-0.50752,3.86703,-4],"size":[2,0,2],"uv":[2,0]}]},{"name":"rightFin","parent":"body_front","pivot":[-1.5,1,-4],"rotation":[0,0,-35],"cubes":[{"origin":[-1.49258,3.86703,-4],"size":[2,0,2],"uv":[-2,0]}]}]}]}'},9880:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":2.375,"visible_bounds_offset":[0,0.8125,0]},"bones":[{"name":"body","pivot":[0,19,2],"cubes":[{"origin":[-4,13,-5],"size":[8,16,6],"pivot":[0,19,2],"rotation":[90,0,0],"uv":[28,8]},{"origin":[-4,13,-5],"size":[8,16,6],"inflate":1.75,"pivot":[0,19,2],"rotation":[90,0,0],"uv":[28,40]}]},{"name":"leg0","parent":"body","pivot":[-3,12,7],"cubes":[{"origin":[-5,0,5],"size":[4,12,4],"uv":[0,16]},{"origin":[-5,6,5],"size":[4,6,4],"inflate":0.5,"uv":[0,48]}]},{"name":"leg1","parent":"body","pivot":[3,12,7],"cubes":[{"origin":[1,0,5],"size":[4,12,4],"uv":[0,16]},{"origin":[1,6,5],"size":[4,6,4],"inflate":0.5,"uv":[0,48]}]},{"name":"leg2","parent":"body","pivot":[-3,12,-5],"cubes":[{"origin":[-5,0,-7],"size":[4,12,4],"uv":[0,16]},{"origin":[-5,6,-7],"size":[4,6,4],"inflate":0.5,"uv":[0,48]}]},{"name":"leg3","parent":"body","pivot":[3,12,-5],"cubes":[{"origin":[1,0,-7],"size":[4,12,4],"uv":[0,16]},{"origin":[1,6,-7],"size":[4,6,4],"inflate":0.5,"uv":[0,48]}]},{"name":"head","pivot":[0,18,-8],"cubes":[{"origin":[-3,16,-14],"size":[6,6,8],"uv":[0,0]},{"origin":[-3,16,-12],"size":[6,6,6],"inflate":0.6,"uv":[0,32]}],"locators":{"lead":[0,18,-8]}}]}]}'},8575:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":3,"visible_bounds_offset":[0,0.5,0]},"bones":[{"name":"base","pivot":[0,0,0],"cubes":[{"origin":[-8,0,-8],"size":[16,8,16],"uv":[0,28]}]},{"name":"lid","parent":"base","pivot":[0,0,0],"cubes":[{"origin":[-8,4,-8],"size":[16,12,16],"uv":[0,0]}]},{"name":"head","parent":"base","pivot":[0,12,0],"cubes":[{"origin":[-3,6,-3],"size":[6,6,6],"uv":[0,52]}]}]}]}'},7920:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":1,"visible_bounds_offset":[0,0.5,0]},"bones":[{"name":"bodyPart_2","pivot":[0,4,1],"cubes":[{"origin":[-3,0,-0.5],"size":[6,4,3],"uv":[0,9]}]},{"name":"bodyPart_0","parent":"bodyPart_2","pivot":[0,2,-3.5],"cubes":[{"origin":[-1.5,0,-4.5],"size":[3,2,2],"uv":[0,0]}]},{"name":"bodyPart_1","parent":"bodyPart_2","pivot":[0,3,-1.5],"cubes":[{"origin":[-2,0,-2.5],"size":[4,3,2],"uv":[0,4]}]},{"name":"bodyLayer_2","parent":"bodyPart_1","pivot":[0,5,-1.5],"cubes":[{"origin":[-3,0,-3],"size":[6,5,2],"uv":[20,18]}]},{"name":"bodyPart_3","parent":"bodyPart_2","pivot":[0,3,4],"cubes":[{"origin":[-1.5,0,2.5],"size":[3,3,3],"uv":[0,16]}]},{"name":"bodyPart_4","parent":"bodyPart_2","pivot":[0,2,7],"cubes":[{"origin":[-1,0,5.5],"size":[2,2,3],"uv":[0,22]}]},{"name":"bodyLayer_1","parent":"bodyPart_4","pivot":[0,4,7],"cubes":[{"origin":[-3,0,5.5],"size":[6,4,3],"uv":[20,11]}]},{"name":"bodyPart_5","parent":"bodyPart_2","pivot":[0,1,9.5],"cubes":[{"origin":[-1,0,8.5],"size":[2,1,2],"uv":[11,0]}]},{"name":"bodyPart_6","parent":"bodyPart_2","pivot":[0,1,11.5],"cubes":[{"origin":[-0.5,0,10.5],"size":[1,1,2],"uv":[13,4]}]},{"name":"bodyLayer_0","parent":"bodyPart_2","pivot":[0,8,1],"cubes":[{"origin":[-5,0,-0.5],"size":[10,8,3],"uv":[20,0]}]}]}]}'},9872:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"waist","pivot":[0,12,0]},{"name":"body","parent":"waist","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-2],"size":[8,12,4],"uv":[16,16]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"hat","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"inflate":0.5,"uv":[32,0]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-6,12,-1],"size":[2,12,2],"uv":[40,16]}]},{"name":"rightItem","parent":"rightArm","pivot":[-6,15,1]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-1],"size":[2,12,2],"uv":[40,16]}]},{"name":"leftItem","parent":"leftArm","pivot":[6,15,1]},{"name":"rightLeg","parent":"body","pivot":[-2,12,0],"cubes":[{"origin":[-3,0,-1],"size":[2,12,2],"uv":[0,16]}]},{"name":"leftLeg","parent":"body","pivot":[2,12,0],"mirror":true,"cubes":[{"origin":[1,0,-1],"size":[2,12,2],"uv":[0,16]}]}]}]}'},3255:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":5,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"cube","pivot":[0,24,0],"cubes":[{"origin":[-3,1,-3],"size":[6,6,6],"uv":[0,16]},{"origin":[-4,0,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"eye0","parent":"cube","pivot":[0,24,0],"cubes":[{"origin":[-3.3,4,-3.5],"size":[2,2,2],"uv":[32,0]}]},{"name":"eye1","parent":"cube","pivot":[0,24,0],"cubes":[{"origin":[1.3,4,-3.5],"size":[2,2,2],"uv":[32,4]}]},{"name":"mouth","parent":"cube","pivot":[0,24,0],"cubes":[{"origin":[0,2,-3.5],"size":[1,1,1],"uv":[32,8]}]}]}]}'},9520:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":192,"texture_height":192,"visible_bounds_width":4,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"bone","pivot":[0,19,0]},{"name":"body","parent":"bone","pivot":[0,0,0],"cubes":[{"origin":[-12.5,9,-20],"size":[25,24,40],"inflate":0.5,"uv":[62,0]},{"origin":[-12.5,4,-20],"size":[25,29,40],"uv":[62,68]},{"origin":[-12.5,8,-20],"size":[25,0,40],"uv":[87,68]}],"locators":{"lead":[0,13,-19]}},{"name":"head","parent":"body","pivot":[0,13.5,-19.4],"cubes":[{"origin":[-6.5,3,-30.9],"size":[13,18,11],"uv":[8,15]},{"origin":[-6.5,6,-30.9],"size":[13,0,11],"uv":[8,4]}]},{"name":"left_ear","parent":"head","pivot":[6.4,21,-23.9],"cubes":[{"origin":[6.4,2,-26.9],"size":[1,19,7],"uv":[2,0]}]},{"name":"right_ear","parent":"head","pivot":[-6.4,21,-23.9],"cubes":[{"origin":[-7.4,2,-26.9],"size":[1,19,7],"uv":[48,0]}]},{"name":"nose","parent":"head","pivot":[0,18,-30.9],"cubes":[{"origin":[-6.5,18,-39.9],"size":[13,2,9],"uv":[10,45]}]},{"name":"lower_beak","parent":"head","pivot":[0,11,-31.9],"cubes":[{"origin":[-6.5,6,-39.9],"size":[13,12,9],"uv":[10,57]}]},{"name":"right_front_leg","parent":"bone","pivot":[-7.5,9,-15],"cubes":[{"origin":[-11,0,-19],"size":[7,10,8],"uv":[32,87]}]},{"name":"right_mid_leg","parent":"bone","pivot":[-7.5,9,0],"cubes":[{"origin":[-11,0,-4],"size":[7,10,8],"uv":[32,105]}]},{"name":"right_hind_leg","parent":"bone","pivot":[-7.5,9,15],"cubes":[{"origin":[-11,0,11],"size":[7,10,8],"uv":[32,123]}]},{"name":"left_front_leg","parent":"bone","pivot":[7.5,9,-15],"cubes":[{"origin":[4,0,-19],"size":[7,10,8],"uv":[0,87]}]},{"name":"left_mid_leg","parent":"bone","pivot":[7.5,9,0],"cubes":[{"origin":[4,0,-4],"size":[7,10,8],"uv":[0,105]}]},{"name":"left_hind_leg","parent":"bone","pivot":[7.5,9,15],"cubes":[{"origin":[4,0,11],"size":[7,10,8],"uv":[0,123]}]}]}]}'},6615:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":5,"visible_bounds_height":4,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"piece2","pivot":[0,0,0],"cubes":[{"origin":[-6,0,-6],"size":[12,12,12],"inflate":-0.5,"uv":{"north":{"uv":[12,48],"uv_size":[12,12]},"east":{"uv":[0,48],"uv_size":[12,12]},"south":{"uv":[36,48],"uv_size":[12,12]},"west":{"uv":[24,48],"uv_size":[12,12]},"up":{"uv":[12,36],"uv_size":[12,12]},"down":{"uv":[24,48],"uv_size":[12,-12]}}}]},{"name":"piece1","parent":"piece2","pivot":[0,11,0],"cubes":[{"origin":[-5,11,-5],"size":[10,10,10],"inflate":-0.5,"uv":{"north":{"uv":[10,26],"uv_size":[10,10]},"east":{"uv":[0,26],"uv_size":[10,10]},"south":{"uv":[30,26],"uv_size":[10,10]},"west":{"uv":[20,26],"uv_size":[10,10]},"up":{"uv":[10,16],"uv_size":[10,10]},"down":{"uv":[20,26],"uv_size":[10,-10]}}}]},{"name":"head","parent":"piece1","pivot":[0,20,0],"cubes":[{"origin":[-4,20,-4],"size":[8,8,8],"inflate":-0.5,"uv":{"north":{"uv":[8,8],"uv_size":[8,8]},"east":{"uv":[0,8],"uv_size":[8,8]},"south":{"uv":[24,8],"uv_size":[8,8]},"west":{"uv":[16,8],"uv_size":[8,8]},"up":{"uv":[8,0],"uv_size":[8,8]},"down":{"uv":[16,8],"uv_size":[8,-8]}}}],"locators":{"lead":[0,20,0]}},{"name":"pumpkin","parent":"head","pivot":[0,25.5,0],"cubes":[{"origin":[-8,17.5,-8],"size":[16,16,16],"inflate":-3,"uv":{"north":{"uv":[48,48],"uv_size":[16,16]},"east":{"uv":[48,32],"uv_size":[16,16]},"south":{"uv":[48,32],"uv_size":[16,16]},"west":{"uv":[48,32],"uv_size":[16,16]},"up":{"uv":[64,32],"uv_size":[-16,-16]},"down":{"uv":[64,32],"uv_size":[-16,-16]}}}]},{"name":"arm1","parent":"piece1","pivot":[0,18,0],"rotation":[0,0,57.3],"cubes":[{"origin":[1,20,-1],"size":[12,2,2],"inflate":-0.5,"uv":{"north":{"uv":[34,2],"uv_size":[12,2]},"east":{"uv":[32,2],"uv_size":[2,2]},"south":{"uv":[48,2],"uv_size":[12,2]},"west":{"uv":[46,2],"uv_size":[2,2]},"up":{"uv":[34,0],"uv_size":[12,2]},"down":{"uv":[46,2],"uv_size":[12,-2]}}}]},{"name":"arm2","parent":"piece1","pivot":[0,18,0],"rotation":[0,0,-57.3],"cubes":[{"origin":[-13,20,-1],"size":[12,2,2],"inflate":-0.5,"uv":{"north":{"uv":[46,2],"uv_size":[-12,2]},"east":{"uv":[48,2],"uv_size":[-2,2]},"south":{"uv":[60,2],"uv_size":[-12,2]},"west":{"uv":[34,2],"uv_size":[-2,2]},"up":{"uv":[46,0],"uv_size":[-12,2]},"down":{"uv":[58,2],"uv_size":[-12,-2]}}}]}]}]}'},178:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":4,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"body0","pivot":[0,9,0],"cubes":[{"origin":[-3,6,-3],"size":[6,6,6],"uv":[0,0]}]},{"name":"head","parent":"body0","pivot":[0,9,-3],"cubes":[{"origin":[-4,5,-11],"size":[8,8,8],"uv":[32,4]}]},{"name":"body1","parent":"body0","pivot":[0,9,9],"cubes":[{"origin":[-5,5,3],"size":[10,8,12],"uv":[0,12]}]},{"name":"leg0","parent":"body0","pivot":[-4,9,2],"cubes":[{"origin":[-19,8,1],"size":[16,2,2],"uv":[18,0]}]},{"name":"leg1","parent":"body0","pivot":[4,9,2],"cubes":[{"origin":[3,8,1],"size":[16,2,2],"uv":[18,0]}]},{"name":"leg2","parent":"body0","pivot":[-4,9,1],"cubes":[{"origin":[-19,8,0],"size":[16,2,2],"uv":[18,0]}]},{"name":"leg3","parent":"body0","pivot":[4,9,1],"cubes":[{"origin":[3,8,0],"size":[16,2,2],"uv":[18,0]}]},{"name":"leg4","parent":"body0","pivot":[-4,9,0],"cubes":[{"origin":[-19,8,-1],"size":[16,2,2],"uv":[18,0]}]},{"name":"leg5","parent":"body0","pivot":[4,9,0],"cubes":[{"origin":[3,8,-1],"size":[16,2,2],"uv":[18,0]}]},{"name":"leg6","parent":"body0","pivot":[-4,9,-1],"cubes":[{"origin":[-19,8,-2],"size":[16,2,2],"uv":[18,0]}]},{"name":"leg7","parent":"body0","pivot":[4,9,-1],"cubes":[{"origin":[3,8,-2],"size":[16,2,2],"uv":[18,0]}]}]}]}'},1921:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":3.5,"visible_bounds_offset":[0,-0.25,0]},"bones":[{"name":"body","pivot":[0,0,0],"cubes":[{"origin":[-6,-8,-6],"size":[12,16,12],"uv":[0,0]}]},{"name":"tentacle1","parent":"body","pivot":[5,-7,0],"rotation":[0,90,0],"cubes":[{"origin":[4,-25,-1],"size":[2,18,2],"uv":[48,0]}]},{"name":"tentacle2","parent":"body","pivot":[3.5,-7,3.5],"rotation":[0,45,0],"cubes":[{"origin":[2.5,-25,2.5],"size":[2,18,2],"uv":[48,0]}]},{"name":"tentacle3","parent":"body","pivot":[0,-7,5],"cubes":[{"origin":[-1,-25,4],"size":[2,18,2],"uv":[48,0]}]},{"name":"tentacle4","parent":"body","pivot":[-3.5,-7,3.5],"rotation":[0,-45,0],"cubes":[{"origin":[-4.5,-25,2.5],"size":[2,18,2],"uv":[48,0]}]},{"name":"tentacle5","parent":"body","pivot":[-5,-7,0],"rotation":[0,-90,0],"cubes":[{"origin":[-6,-25,-1],"size":[2,18,2],"uv":[48,0]}]},{"name":"tentacle6","parent":"body","pivot":[-3.5,-7,-3.5],"rotation":[0,-135,0],"cubes":[{"origin":[-4.5,-25,-4.5],"size":[2,18,2],"uv":[48,0]}]},{"name":"tentacle7","parent":"body","pivot":[0,-7,-5],"rotation":[0,-180,0],"cubes":[{"origin":[-1,-25,-6],"size":[2,18,2],"uv":[48,0]}]},{"name":"tentacle8","parent":"body","pivot":[3.5,-7,-3.5],"rotation":[0,-225,0],"cubes":[{"origin":[2.5,-25,-4.5],"size":[2,18,2],"uv":[48,0]}]}]}]}'},9854:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":128,"visible_bounds_width":3,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"right_leg","pivot":[-4,16,0],"cubes":[{"origin":[-6,0,-2],"size":[4,16,4],"uv":[0,32]}]},{"name":"left_leg","pivot":[4,16,0],"cubes":[{"origin":[2,0,-2],"size":[4,16,4],"uv":[0,55]}]},{"name":"body","pivot":[0,16,0],"cubes":[{"origin":[-8,14,-8],"size":[16,14,16],"uv":[0,0]}],"locators":{"lead":[0,15,-1]}},{"name":"bristle5","parent":"body","pivot":[8,19,0],"cubes":[{"origin":[8,19,-8],"size":[12,0,16],"pivot":[8,19,0],"rotation":[0,0,70],"uv":[16,65]}]},{"name":"bristle4","parent":"body","pivot":[8,24,0],"cubes":[{"origin":[8,24,-8],"size":[12,0,16],"pivot":[8,24,0],"rotation":[0,0,65],"uv":[16,49]}]},{"name":"bristle3","parent":"body","pivot":[8,28,0],"cubes":[{"origin":[8,28,-8],"size":[12,0,16],"pivot":[8,28,0],"rotation":[0,0,50],"uv":[16,33]}]},{"name":"bristle2","parent":"body","pivot":[-8,28,0],"cubes":[{"origin":[-20,28,-8],"size":[12,0,16],"pivot":[-8,28,0],"rotation":[0,0,-50],"uv":[16,33],"mirror":true}]},{"name":"bristle1","parent":"body","pivot":[-8,24,0],"cubes":[{"origin":[-20,24,-8],"size":[12,0,16],"pivot":[-8,24,0],"rotation":[0,0,-65],"uv":[16,49],"mirror":true}]},{"name":"bristle0","parent":"body","pivot":[-8,19,0],"cubes":[{"origin":[-20,19,-8],"size":[12,0,16],"pivot":[-8,19,0],"rotation":[0,0,-70],"uv":[16,65],"mirror":true}]}]}]}'},1704:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":16,"texture_height":16,"visible_bounds_width":1,"visible_bounds_height":0.8,"visible_bounds_offset":[0,0.25,0]},"bones":[{"name":"root","pivot":[0,0,0]},{"name":"body","parent":"root","pivot":[0,0,1],"cubes":[{"origin":[-1.5,3,-2.5],"size":[3,2,3],"uv":[0,0]}]},{"name":"tail","parent":"root","pivot":[0,0,1],"cubes":[{"origin":[0,3,-0.5],"size":[0,2,7],"uv":[0,0]}]}]}]}'},969:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":64,"visible_bounds_width":4,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"body","pivot":[0,13,-10],"cubes":[{"origin":[-9.5,-10,-20],"size":[19,20,6],"pivot":[0,13,-10],"rotation":[90,0,0],"uv":[6,37]},{"origin":[-5.5,-8,-23],"size":[11,18,3],"pivot":[0,13,-10],"rotation":[90,0,0],"uv":[30,1]}]},{"name":"head","parent":"body","pivot":[0,5,-10],"cubes":[{"origin":[-3,1,-13],"size":[6,5,6],"uv":[2,0]}]},{"name":"eggbelly","parent":"body","pivot":[0,13,-10],"rotation":[90,0,0],"cubes":[{"origin":[-4.5,-8,-24],"size":[9,18,1],"uv":[69,33]}]},{"name":"leg0","parent":"body","pivot":[-3.5,2,11],"cubes":[{"origin":[-5.5,1,11],"size":[4,1,10],"uv":[0,23]}]},{"name":"leg1","parent":"body","pivot":[3.5,2,11],"cubes":[{"origin":[1.5,1,11],"size":[4,1,10],"uv":[0,12]}]},{"name":"leg2","parent":"body","pivot":[-5,3,-4],"cubes":[{"origin":[-18,2,-6],"size":[13,1,5],"uv":[26,30]}]},{"name":"leg3","parent":"body","pivot":[5,3,-4],"cubes":[{"origin":[5,2,-6],"size":[13,1,5],"uv":[26,24]}]}]}]}'},3904:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":4,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-2],"size":[8,12,4],"uv":[16,16]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,16]}]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[40,16]}]},{"name":"leg0","parent":"body","pivot":[-1.9,12,0],"cubes":[{"origin":[-3.9,0,-2],"size":[4,12,4],"uv":[0,16]},{"origin":[-2.9,3,-2],"size":[6,10,4],"uv":[32,0]}]},{"name":"leftwing","parent":"body","pivot":[0,24,0],"mirror":true,"cubes":[{"origin":[0,12,0],"size":[20,12,1],"uv":[0,32]}]},{"name":"rightwing","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-20,12,0],"size":[20,12,1],"uv":[0,32]}]},{"name":"rightItem","pivot":[-6,13,0]}]}]}'},8725:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":3,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,0,0],"cubes":[{"origin":[-4,12,-3],"size":[8,12,6],"uv":[16,20]},{"origin":[-4,6,-3],"size":[8,18,6],"inflate":0.5,"uv":[0,38]}],"locators":{"lead_hold":[0,40,0]}},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"uv":[0,0]}]},{"name":"helmet","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"inflate":0.5,"uv":[32,0]}]},{"name":"brim","parent":"head","pivot":[0,24,0],"rotation":[-90,0,0],"cubes":[{"origin":[-8,16,-6],"size":[16,16,1],"inflate":0.1,"uv":[30,47]}]},{"name":"nose","parent":"head","pivot":[0,26,0],"cubes":[{"origin":[-1,23,-6],"size":[2,4,2],"uv":[24,0]}]},{"name":"arms","parent":"body","pivot":[0,21,-1],"rotation":[-42.97,0,0],"cubes":[{"origin":[-4,15,-3],"size":[8,4,4],"uv":[40,38]},{"origin":[-8,15,-3],"size":[4,8,4],"uv":[44,22]},{"origin":[4,15,-3],"size":[4,8,4],"uv":[44,22],"mirror":true}]},{"name":"held_item","parent":"arms","pivot":[0,-1,-1]},{"name":"leg0","parent":"body","pivot":[-2,12,0],"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"leg1","parent":"body","pivot":[2,12,0],"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,22],"mirror":true}]}]}]}'},4288:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-3],"size":[8,12,6],"uv":[16,20]},{"origin":[-4,6,-3],"size":[8,18,6],"inflate":0.5,"uv":[0,38]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"uv":[0,0]}]},{"name":"nose","parent":"head","pivot":[0,26,0],"cubes":[{"origin":[-1,23,-6],"size":[2,4,2],"uv":[24,0]}]},{"name":"arms","parent":"body","pivot":[0,22,0],"cubes":[{"origin":[-8,16,-2],"size":[4,8,4],"uv":[44,22]},{"origin":[4,16,-2],"size":[4,8,4],"uv":[44,22]},{"origin":[-4,16,-2],"size":[8,4,4],"uv":[40,38]}]},{"name":"leg0","parent":"body","pivot":[-2,12,0],"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"leg1","parent":"body","pivot":[2,12,0],"mirror":true,"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,46]}]},{"name":"rightItem","parent":"rightArm","pivot":[-5.5,16,0.5]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[40,46]}]},{"name":"leftItem","parent":"leftArm","pivot":[6,15,1]}]}]}'},266:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":128,"texture_height":128,"visible_bounds_width":4,"visible_bounds_height":6,"visible_bounds_offset":[0,2,0]},"bones":[{"name":"root","pivot":[0,0,0]},{"name":"body","parent":"root","pivot":[0,21,0],"cubes":[{"origin":[-9,13,-4],"size":[18,21,11],"uv":[0,0]}]},{"name":"right_ribcage","parent":"body","pivot":[-7,23,-4],"cubes":[{"origin":[-9,13,-4.1],"size":[9,21,0],"uv":[90,11]}]},{"name":"left_ribcage","parent":"body","pivot":[7,23,-4],"cubes":[{"origin":[0,13,-4.1],"size":[9,21,0],"uv":[90,11],"mirror":true}]},{"name":"head","parent":"body","pivot":[0,34,0],"cubes":[{"origin":[-8,34,-5],"size":[16,16,10],"uv":[0,32]}]},{"name":"right_tendril","parent":"head","pivot":[-8,46,0],"cubes":[{"origin":[-24,43,0],"size":[16,16,0],"uv":[52,32]}]},{"name":"left_tendril","parent":"head","pivot":[8,46,0],"cubes":[{"origin":[8,43,0],"size":[16,16,0],"uv":[58,0]}]},{"name":"right_arm","parent":"body","pivot":[-13,34,1],"cubes":[{"origin":[-17,6,-3],"size":[8,28,8],"uv":[44,50]}]},{"name":"left_arm","parent":"body","pivot":[13,34,1],"cubes":[{"origin":[9,6,-3],"size":[8,28,8],"uv":[0,58]}]},{"name":"right_leg","parent":"root","pivot":[-5.9,13,0],"cubes":[{"origin":[-9,0,-3],"size":[6,13,6],"uv":[76,48]}]},{"name":"left_leg","parent":"root","pivot":[5.9,13,0],"cubes":[{"origin":[3,0,-3],"size":[6,13,6],"uv":[76,76]}]}]}]}'},3140:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":128,"visible_bounds_width":2,"visible_bounds_height":4.5,"visible_bounds_offset":[0,1.75,0]},"bones":[{"name":"body","pivot":[0,24,0],"mirror":true,"cubes":[{"origin":[-4,12,-3],"size":[8,12,6],"uv":[16,20]},{"origin":[-4,6,-3],"size":[8,18,6],"inflate":0.5,"uv":[0,38]}]},{"name":"head","parent":"body","pivot":[0,24,0],"mirror":true,"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"uv":[0,0]}]},{"name":"nose","parent":"head","pivot":[0,26,0],"mirror":true,"cubes":[{"origin":[-1,25,-6.75],"size":[1,1,1],"inflate":-0.25,"uv":[0,0]},{"origin":[-1,23,-6],"size":[2,4,2],"uv":[24,0]}]},{"name":"hat","parent":"head","pivot":[5,32.03,-5],"mirror":true,"cubes":[{"origin":[-5,32.05,-5],"size":[10,2,10],"uv":[0,64]}]},{"name":"hat2","parent":"hat","pivot":[-1.75,32,2],"rotation":[-3,0,1.5],"mirror":true,"cubes":[{"origin":[-3.75,33.5,-3],"size":[7,4,7],"uv":[0,76]}]},{"name":"hat3","parent":"hat2","pivot":[-1.75,35,2],"rotation":[-6,0,3],"mirror":true,"cubes":[{"origin":[-2.5,36.5,-1],"size":[4,4,4],"uv":[0,87]}]},{"name":"hat4","parent":"hat3","pivot":[-1.75,38,2],"rotation":[-12,0,6],"mirror":true,"cubes":[{"origin":[-1.25,40,1],"size":[1,2,1],"inflate":0.25,"uv":[0,95]}]},{"name":"arms","parent":"body","pivot":[0,21,-1],"rotation":[-42.97,0,0],"mirror":true,"cubes":[{"origin":[-4,15,-3],"size":[8,4,4],"uv":[40,38]},{"origin":[4,15,-3],"size":[4,8,4],"uv":[44,22]},{"origin":[-8,15,-3],"size":[4,8,4],"uv":[44,22]}]},{"name":"leg0","parent":"body","pivot":[2,12,0],"mirror":true,"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"leg1","parent":"body","pivot":[-2,12,0],"mirror":true,"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,22],"mirror":false}]}]}]}'},5936:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"waist","pivot":[0,12,0]},{"name":"body","parent":"waist","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-2],"size":[8,12,4],"uv":[16,16]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"hat","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"inflate":0.5,"uv":[32,0]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-6,12,-1],"size":[2,12,2],"uv":[40,16]}]},{"name":"rightItem","parent":"rightArm","pivot":[-5,15,1]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-1],"size":[2,12,2],"uv":[40,16]}]},{"name":"leftItem","parent":"leftArm","pivot":[6,15,1]},{"name":"rightLeg","parent":"body","pivot":[-2,12,0],"cubes":[{"origin":[-3,0,-1],"size":[2,12,2],"uv":[0,16]}]},{"name":"leftLeg","parent":"body","pivot":[2,12,0],"mirror":true,"cubes":[{"origin":[1,0,-1],"size":[2,12,2],"uv":[0,16]}]}]}]}'},9071:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":2,"visible_bounds_offset":[0,1,0]},"bones":[{"name":"head","pivot":[-1,10.5,-7],"cubes":[{"origin":[-4,7.5,-9],"size":[6,6,4],"uv":[0,0]},{"origin":[-4,13.5,-7],"size":[2,2,1],"uv":[16,14]},{"origin":[0,13.5,-7],"size":[2,2,1],"uv":[16,14]},{"origin":[-2.5,7.51563,-12],"size":[3,3,4],"uv":[0,10]}],"locators":{"lead":[-1,10.5,-7]}},{"name":"body","pivot":[0,10,2],"rotation":[90,0,0],"cubes":[{"origin":[-4,3,-1],"size":[6,9,6],"uv":[18,14]}]},{"name":"upperBody","pivot":[-1,10,-3],"rotation":[90,0,0],"cubes":[{"origin":[-5,7,-6],"size":[8,6,7],"uv":[21,0]}]},{"name":"leg0","pivot":[-2.5,8,7],"cubes":[{"origin":[-3.5,0,6],"size":[2,8,2],"uv":[0,18]}]},{"name":"leg1","pivot":[0.5,8,7],"cubes":[{"origin":[-0.5,0,6],"size":[2,8,2],"uv":[0,18]}]},{"name":"leg2","pivot":[-2.5,8,-4],"cubes":[{"origin":[-3.5,0,-5],"size":[2,8,2],"uv":[0,18]}]},{"name":"leg3","pivot":[0.5,8,-4],"cubes":[{"origin":[-0.5,0,-5],"size":[2,8,2],"uv":[0,18]}]},{"name":"tail","pivot":[-1,12,8],"cubes":[{"origin":[-2,4,7],"size":[2,8,2],"uv":[9,18]}]}]}]}'},6537:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"waist","pivot":[0,12,0]},{"name":"body","parent":"waist","pivot":[0,24,0],"cubes":[{"origin":[-4,12,-2],"size":[8,12,4],"uv":[16,16]}]},{"name":"head","parent":"body","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"uv":[0,0]}]},{"name":"hat","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"inflate":0.5,"uv":[32,0]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[40,16]}]},{"name":"rightItem","parent":"rightArm","pivot":[-6,15,1]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"mirror":true,"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[40,16]}]},{"name":"leftItem","parent":"leftArm","pivot":[6,15,1]},{"name":"rightLeg","parent":"body","pivot":[-1.9,12,0],"cubes":[{"origin":[-3.9,0,-2],"size":[4,12,4],"uv":[0,16]}]},{"name":"leftLeg","parent":"body","pivot":[1.9,12,0],"mirror":true,"cubes":[{"origin":[-0.1,0,-2],"size":[4,12,4],"uv":[0,16]}]}]}]}'},1994:e=>{e.exports='{"format_version":"1.12.0","minecraft:geometry":[{"description":{"identifier":"geometry.{name}","texture_width":64,"texture_height":64,"visible_bounds_width":2,"visible_bounds_height":3,"visible_bounds_offset":[0,1.5,0]},"bones":[{"name":"hat2","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"inflate":0.5,"uv":[32,0]}]},{"name":"waist","pivot":[0,12,0]},{"name":"body","parent":"waist","pivot":[0,24,0],"reset":true,"cubes":[{"origin":[-4,12,-3],"size":[8,12,6],"uv":[16,20]},{"origin":[-4,6,-3],"size":[8,18,6],"inflate":0.5,"uv":[0,38]}]},{"name":"head","parent":"body","pivot":[0,24,0],"reset":true,"cubes":[{"origin":[-4,24,-4],"size":[8,10,8],"inflate":0.25,"uv":[0,0]},{"origin":[-1,23,-6],"size":[2,4,2],"inflate":0.25,"uv":[24,0]}]},{"name":"hat","parent":"head","pivot":[0,24,0],"cubes":[{"origin":[-4,24,-4],"size":[8,8,8],"inflate":0.5,"uv":[32,0]}]},{"name":"rightArm","parent":"body","pivot":[-5,22,0],"reset":true,"cubes":[{"origin":[-8,12,-2],"size":[4,12,4],"uv":[44,38]}]},{"name":"rightItem","parent":"rightArm","pivot":[-6,15,1]},{"name":"leftArm","parent":"body","pivot":[5,22,0],"reset":true,"mirror":true,"cubes":[{"origin":[4,12,-2],"size":[4,12,4],"uv":[44,38]}]},{"name":"leftItem","parent":"leftArm","pivot":[6,15,1]},{"name":"rightLeg","parent":"body","pivot":[-2,12,0],"reset":true,"cubes":[{"origin":[-4,0,-2],"size":[4,12,4],"uv":[0,22]}]},{"name":"leftLeg","parent":"body","pivot":[2,12,0],"reset":true,"mirror":true,"cubes":[{"origin":[0,0,-2],"size":[4,12,4],"uv":[0,22]}]}]}]}'},4692:e=>{e.exports='{"format_version":"1.8.0","render_controllers":{"controller.render.{name}":{"geometry":"Geometry.default","materials":[{"*":"Material.default"}],"textures":["query.is_angry ? Texture.angry : (query.is_tamed ? Texture.tame : Texture.default)"]}}}'},8569:e=>{e.exports='{"entity_sounds":{"defaults":{"events":{"ambient":"","ambient.in.raid":"","ambient.in.water":"","celebrate":"","death":"game.player.die","death.in.water":"","drink":{"pitch":[0.90,1.10],"sound":"random.drink","volume":0.350},"drink.honey":{"pitch":[0.90,1.0],"sound":"random.drink_honey","volume":0.50},"eat":{"pitch":[0.80,1.20],"sound":"random.eat","volume":[0.50,1.10]},"fall.big":{"pitch":1.0,"sound":"damage.fallbig","volume":0.750},"fall.small":{"pitch":1.0,"sound":"damage.fallsmall","volume":0.750},"fizz":{"pitch":[1.20,2.0],"sound":"random.fizz","volume":0.70},"flop":"","hurt":"game.player.hurt","hurt.in.water":"","splash":{"pitch":[0.60,1.40],"sound":"entity.generic.splash"},"swim":{"pitch":[0.60,1.40],"sound":"random.swim"}},"pitch":[0.80,1.20],"volume":1.0},"entities":{"allay":{"events":{"ambient":"mob.allay.idle","ambient.tame":"mob.allay.idle_holding","death":"mob.allay.death","hurt":"mob.allay.hurt"},"pitch":[0.80,1.20],"volume":1},"armadillo":{"events":{"ambient":"mob.armadillo.ambient","death":"mob.armadillo.death","eat":"mob.armadillo.eat","hurt":"mob.armadillo.hurt","hurt.reduced":"mob.armadillo.hurt_reduced","step":"mob.armadillo.step"},"pitch":[0.80,1.20],"volume":1.0},"axolotl":{"events":{"ambient":"mob.axolotl.idle","ambient.in.water":"mob.axolotl.idle_water","attack":"mob.axolotl.attack","death":"mob.axolotl.death","eat":"","hurt":"mob.axolotl.hurt","splash":"mob.axolotl.splash","swim":"mob.axolotl.swim"},"pitch":[0.80,1.20],"volume":1.0},"bat":{"events":{"ambient":"mob.bat.idle","death":"mob.bat.death","hurt":"mob.bat.hurt","takeoff":{"pitch":[0.80,1.20],"sound":"mob.bat.takeoff","volume":0.050}},"pitch":[0.760,1.140],"volume":0.10},"bee":{"events":{"ambient.pollinate":{"sound":"mob.bee.pollinate","volume":0.850},"attack":{"pitch":[0.80,1.0],"sound":"mob.bee.sting"},"death":{"pitch":[0.90,1.10],"sound":"mob.bee.death","volume":0.60},"eat":"","hurt":{"pitch":[0.90,1.10],"sound":"mob.bee.hurt","volume":0.60}},"pitch":1.0,"volume":0.60},"blaze":{"events":{"ambient":"mob.blaze.breathe","death":"mob.blaze.death","hurt":"mob.blaze.hit","shoot":"mob.blaze.shoot"},"pitch":[0.80,1.20],"volume":2.0},"bogged":{"events":{"ambient":"mob.bogged.ambient","death":"mob.bogged.death","hurt":"mob.bogged.hurt","step":{"pitch":1.0,"sound":"mob.bogged.step","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"breeze":{"events":{"ambient":{"pitch":[0.70,1.10],"sound":"mob.breeze.idle_ground","volume":[0.80,1.0]},"ambient.in.air":{"pitch":[0.70,1.10],"sound":"mob.breeze.idle_air","volume":[0.80,1.0]},"charge":{"pitch":1.0,"sound":"mob.breeze.charge","volume":1.0},"death":{"pitch":1.0,"sound":"mob.breeze.death","volume":1.0},"hurt":{"pitch":1.0,"sound":"mob.breeze.hurt","volume":1.0},"jump":{"pitch":1.0,"sound":"mob.breeze.jump","volume":1.0},"land":{"pitch":1.0,"sound":"mob.breeze.land","volume":1.0},"reflect":{"pitch":1.0,"sound":"mob.breeze.deflect","volume":1.0},"shoot":{"pitch":[1.0,1.20],"sound":"mob.breeze.shoot","volume":1.50},"step":{"volume":0.0}},"pitch":[0.80,1.20],"volume":1.0},"camel":{"events":{"ambient":"mob.camel.ambient","death":"mob.camel.death","eat":"mob.camel.eat","hurt":"mob.camel.hurt","saddle":"mob.horse.leather","step":"mob.camel.step","step_sand":"mob.camel.step_sand","unsaddle":"mob.unsaddle"},"pitch":[0.80,1.20],"volume":1},"camel_husk":{"events":{"ambient":"mob.camel_husk.ambient","dash_ready":"mob.camel_husk.dash_ready","death":"mob.camel_husk.death","eat":"mob.camel_husk.eat","hurt":"mob.camel_husk.hurt","saddle":"mob.horse.leather","step":"mob.camel_husk.step","step_sand":"mob.camel_husk.step_sand"},"pitch":[0.80,1.20],"volume":1},"cat":{"events":{"ambient":"mob.cat.straymeow","ambient.tame":"mob.cat.meow","death":"mob.cat.hit","eat":"mob.cat.eat","hurt":"mob.cat.hit","purr":"mob.cat.purr","purreow":"mob.cat.purreow","tempt":{"pitch":1.0,"sound":"mob.cat.beg_for_food","volume":0.70}},"pitch":[0.80,1.20],"volume":1.0},"cave_spider":{"events":{"ambient":"mob.spider.say","death":"mob.spider.death","hurt":"mob.spider.say","step":{"pitch":[0.90,1.10],"sound":"mob.spider.step","volume":0.350}},"pitch":[0.80,1.20],"volume":1.0},"chicken":{"events":{"ambient":"mob.chicken.say","death":"mob.chicken.hurt","eat":"","hurt":"mob.chicken.hurt","plop":"mob.chicken.plop","step":{"pitch":1.0,"sound":"mob.chicken.step","volume":0.250}},"pitch":[0.80,1.20],"volume":1.0},"cod":{"events":{"flop":{"pitch":1.0,"sound":"mob.fish.flop","volume":1.0},"hurt":"mob.fish.hurt","hurt.in.water":"mob.fish.hurt","step":{"pitch":1.0,"sound":"mob.fish.step","volume":0.150}},"pitch":[0.80,1.20],"volume":1.0},"copper_golem":{"__molang_version":13,"events":{"deactivate":"mob.copper_golem.becoming_statue","death":"mob.copper_golem.death","hurt":"mob.copper_golem.hurt","spawn":"mob.copper_golem.spawn","step":"mob.copper_golem.step"},"pitch":1.0,"variants":{"key":"query.property(\'minecraft:oxidation_level\')","map":{"oxidized":{"events":{"death":"mob.copper_golem.oxidized.death","hurt":"mob.copper_golem.oxidized.hurt","step":"mob.copper_golem.oxidized.step"},"pitch":1.0,"volume":1.0},"weathered":{"events":{"death":"mob.copper_golem.weathered.death","hurt":"mob.copper_golem.weathered.hurt","step":"mob.copper_golem.weathered.step"},"pitch":1.0,"volume":1.0}}},"volume":1.0},"cow":{"events":{"ambient":"mob.cow.say","death":"mob.cow.death","eat":"","hurt":"mob.cow.hurt","step":"mob.cow.step"},"pitch":[0.80,1.20],"volume":1.0},"creaking":{"events":{"activate":"mob.creaking.activate","ambient":"mob.creaking.ambient","attack":"mob.creaking.attack","creaking_heart_spawn":"mob.creaking.spawn","deactivate":"mob.creaking.deactivate","death":"mob.creaking.death","freeze":"mob.creaking.freeze","step":{"pitch":1.0,"sound":"mob.creaking.step","volume":0.80},"unfreeze":"mob.creaking.unfreeze"},"pitch":1.0,"volume":1.0},"creeper":{"events":{"death":"mob.creeper.death","fuse":{"pitch":0.50,"sound":"random.fuse","volume":1.0},"hurt":"mob.creeper.say"},"pitch":[0.80,1.20],"volume":1.0},"dolphin":{"events":{"ambient":"mob.dolphin.idle","ambient.in.water":"mob.dolphin.idle_water","attack":"mob.dolphin.attack","breathe":"mob.dolphin.blowhole","death":"mob.dolphin.death","death.in.water":"mob.dolphin.death","eat":{"pitch":1.0,"sound":"mob.dolphin.eat","volume":0.70},"hurt":"mob.dolphin.hurt","hurt.in.water":"mob.dolphin.hurt","jump":{"pitch":1.0,"sound":"mob.dolphin.jump","volume":0.70},"splash":"mob.dolphin.splash","swim":"mob.dolphin.swim"},"pitch":[0.80,1.20],"volume":1.0},"donkey":{"events":{"add.chest":{"pitch":[0.80,1.20],"sound":"mob.horse.armor","volume":1.0},"ambient":"mob.horse.donkey.idle","armor":{"pitch":1.0,"sound":"mob.horse.armor","volume":0.60},"breathe":{"pitch":1.0,"sound":"mob.horse.breathe","volume":0.70},"death":"mob.horse.donkey.death","eat":{"pitch":[0.80,1.20],"sound":"mob.horse.eat","volume":[0.50,1.50]},"hurt":"mob.horse.donkey.hit","jump":{"pitch":1.0,"sound":"mob.horse.jump","volume":0.40},"land":{"pitch":1.0,"sound":"mob.horse.land","volume":0.40},"mad":"mob.horse.donkey.angry","saddle":{"pitch":1.0,"sound":"mob.horse.leather","volume":0.50},"unsaddle":"mob.unsaddle"},"pitch":[0.80,1.20],"volume":0.80},"drowned":{"events":{"ambient":"mob.drowned.say","ambient.in.water":"mob.drowned.say_water","death":"mob.drowned.death","death.in.water":"mob.drowned.death_water","hurt":"mob.drowned.hurt","hurt.in.water":"mob.drowned.hurt_water","step":"mob.drowned.step"},"pitch":[0.80,1.20],"volume":1.0},"elder_guardian":{"events":{"ambient":"mob.guardian.land_idle","ambient.in.water":"mob.elderguardian.idle","death":"mob.elderguardian.death","death.in.water":"mob.elderguardian.death","flop":"mob.guardian.flop","hurt":"mob.guardian.land_hit","hurt.in.water":"mob.elderguardian.hit"},"pitch":[0.80,1.20],"volume":1.0},"ender_dragon":{"events":{"death":"mob.enderdragon.death","flap":"mob.enderdragon.flap","hurt":"mob.enderdragon.hit","mad":"mob.enderdragon.growl"},"pitch":[0.80,1.20],"volume":80.0},"enderman":{"events":{"ambient":"mob.endermen.idle","death":"mob.endermen.death","hurt":"mob.endermen.hit","mad":"mob.endermen.scream","stare":{"pitch":1.0,"sound":"mob.endermen.stare","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"endermite":{"events":{"ambient":"mob.endermite.say","death":"mob.endermite.kill","hurt":"mob.endermite.hit","step":{"pitch":1.0,"sound":"mob.endermite.step","volume":0.150}},"pitch":[0.80,1.20],"volume":1.0},"evocation_fang":{"events":{"fang":"mob.evocation_fangs.attack"},"pitch":[0.80,1.20],"volume":0.80},"evocation_illager":{"events":{"ambient":"mob.evocation_illager.ambient","ambient.in.raid":{"pitch":[0.80,1.20],"sound":"mob.evocation_illager.ambient","volume":3.0},"cast.spell":"mob.evocation_illager.cast_spell","celebrate":"mob.evocation_illager.celebrate","death":"mob.evocation_illager.death","hurt":"mob.evocation_illager.hurt","prepare.attack":"mob.evocation_illager.prepare_attack","prepare.summon":"mob.evocation_illager.prepare_summon","prepare.wololo":"mob.evocation_illager.prepare_wololo"},"pitch":[0.80,1.20],"volume":1.0},"fishing_hook":{"events":{"splash":{"sound":"random.splash"}},"pitch":[0.60,1.40],"volume":0.250},"fox":{"events":{"ambient":"mob.fox.ambient","attack":"mob.fox.bite","death":"mob.fox.death","eat":"mob.fox.eat","hurt":"mob.fox.hurt","mad":"mob.fox.aggro","screech":{"sound":"mob.fox.screech","volume":2},"sleep":"mob.fox.sleep","teleport":"entity.fox.teleport"},"pitch":[0.80,1.20],"volume":1.0},"frog":{"events":{"ambient":"mob.frog.ambient","ambient.baby":{"pitch":1.20,"sound":"mob.frog.ambient","volume":2.50},"death":"mob.frog.death","eat":"mob.frog.eat","hurt":"mob.frog.hurt","jump_to_block":"mob.frog.jump_to_block","step":"mob.frog.step"},"pitch":[0.80,1.20],"volume":1},"ghast":{"events":{"ambient":"mob.ghast.moan","death":"mob.ghast.death","hurt":"mob.ghast.scream","shoot":{"sound":"mob.ghast.fireball","volume":0.70},"warn":"mob.ghast.charge"},"pitch":[0.80,1.20],"volume":5.0},"glow_squid":{"events":{"ambient":"mob.glow_squid.ambient","death":"mob.glow_squid.death","hurt":"mob.glow_squid.hurt"},"pitch":[0.80,1.20],"volume":0.40},"goat":{"events":{"ambient":"mob.goat.ambient","ambient.screamer":"mob.goat.ambient.screamer","death":"mob.goat.death","death.screamer":"mob.goat.death.screamer","eat":"mob.goat.eat","hurt":"mob.goat.hurt","hurt.screamer":"mob.goat.hurt.screamer","step":"mob.goat.step"},"pitch":[0.80,1.20],"volume":1},"guardian":{"events":{"ambient":"mob.guardian.land_idle","ambient.in.water":"mob.guardian.ambient","death":"mob.guardian.land_death","death.in.water":"mob.guardian.death","flop":"mob.guardian.flop","hurt":"mob.guardian.land_hit","hurt.in.water":"mob.guardian.hit"},"pitch":[0.80,1.20],"volume":1.0},"happy_ghast":{"__molang_version":13,"events":{"ambient":"mob.happy_ghast.ambient","armor.equip_generic":"mob.happy_ghast.harness_equip","armor.unequip_generic":"mob.happy_ghast.harness_unequip","attach":"mob.happy_ghast.goggles_down","death":"mob.happy_ghast.death","detach":"mob.happy_ghast.goggles_up","hurt":"mob.happy_ghast.hurt"},"pitch":1.0,"variants":{"key":"query.is_baby ? \'ghastling\' : \'adult\'","map":{"adult":{"events":{"ambient":"mob.happy_ghast.ambient","death":"mob.happy_ghast.death","hurt":"mob.happy_ghast.hurt"},"pitch":1.0,"volume":4.0},"ghastling":{"events":{"ambient":"mob.ghastling.ambient","death":"mob.ghastling.death","hurt":"mob.ghastling.hurt","spawn":"mob.ghastling.spawn"},"pitch":0.50,"volume":1.0}}},"volume":1.0},"hoglin":{"events":{"ambient":"mob.hoglin.ambient","angry":"mob.hoglin.angry","attack":"mob.hoglin.attack","death":"mob.hoglin.death","eat":"","hurt":"mob.hoglin.hurt","retreat":"mob.hoglin.retreat","step":{"pitch":1.0,"sound":"mob.hoglin.step","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"horse":{"__molang_version":13,"events":{"add.chest":"mob.horse.armor","ambient":"mob.horse.idle","armor":"mob.horse.armor","armor.unequip_generic":"mob.horse.horse_armor_unequip","breathe":"mob.horse.breathe","death":"mob.horse.death","eat":"mob.horse.eat","hurt":"mob.horse.hit","jump":"mob.horse.jump","land":"mob.horse.land","mad":"mob.horse.angry","saddle":"mob.horse.leather","unsaddle":"mob.unsaddle"},"pitch":[0.80,1.20],"variants":{"key":"query.is_baby ? \'baby\' : \'adult\'","map":{"adult":{"events":{"add.chest":{"pitch":[0.80,1.20],"sound":"mob.horse.armor","volume":1.0},"ambient":{"sound":"mob.horse.idle","volume":1.0},"armor":{"pitch":1.0,"sound":"mob.horse.armor","volume":0.60},"breathe":{"pitch":1.0,"sound":"mob.horse.breathe","volume":1.0},"death":{"pitch":0.90,"sound":"mob.horse.death","volume":0.50},"eat":{"pitch":[0.80,1.20],"sound":"mob.horse.eat","volume":[0.50,1.50]},"hurt":{"sound":"mob.horse.hit","volume":0.450},"jump":{"pitch":1.0,"sound":"mob.horse.jump","volume":0.40},"land":{"pitch":1.0,"sound":"mob.horse.land","volume":0.40},"saddle":{"pitch":1.0,"sound":"mob.horse.leather","volume":0.60}},"pitch":1.0,"volume":1.0},"baby":{"events":{"ambient":{"pitch":0.50,"sound":"mob.baby_horse.ambient","volume":1.0},"ambient.baby":{"pitch":0.50,"sound":"mob.baby_horse.ambient","volume":1.0},"angry":{"pitch":0.0,"sound":"mob.baby_horse.angry","volume":1.0},"breathe":{"pitch":0.0,"sound":"mob.baby_horse.breathe","volume":1.0},"death":{"pitch":0.50,"sound":"mob.baby_horse.death","volume":1.0},"eat":{"pitch":0.0,"sound":"mob.baby_horse.eat","volume":1.0},"hurt":{"pitch":0.50,"sound":"mob.baby_horse.hurt","volume":1.0},"land":{"pitch":0.0,"sound":"mob.baby_horse.land","volume":1.0}},"pitch":1.0,"volume":0.0}}},"volume":0.80},"husk":{"events":{"ambient":"mob.husk.ambient","death":"mob.husk.death","hurt":"mob.husk.hurt","step":{"pitch":1.0,"sound":"mob.husk.step","volume":0.350}},"pitch":[0.80,1.20],"volume":1.0},"iron_golem":{"events":{"ambient":"mob.irongolem.say","death":"mob.irongolem.death","hurt":"mob.irongolem.hit","irongolem.crack":"mob.irongolem.crack","irongolem.repair":"mob.irongolem.repair","step":{"pitch":1.0,"sound":"mob.irongolem.walk","volume":1.0},"throw":{"pitch":1.0,"sound":"mob.irongolem.throw","volume":1.0}},"pitch":[0.80,1.0],"volume":1.0},"item":{"events":{"fizz":{"pitch":[2.0,2.40],"sound":"random.fizz","volume":0.40}},"pitch":[0.80,1.20],"volume":1.0},"lightning_bolt":{"events":{"explode":{"pitch":[0.30,0.70],"sound":"ambient.weather.lightning.impact"},"thunder":{"pitch":[0.60,1.0],"sound":"ambient.weather.thunder"}},"volume":1000.0},"llama":{"events":{"add.chest":{"pitch":[0.80,1.20],"sound":"mob.horse.armor","volume":1.0},"ambient":"mob.llama.idle","armor":{"pitch":1.0,"sound":"mob.llama.swag","volume":0.50},"armor.unequip_generic":"mob.llama.carpet_unequip","death":"mob.llama.death","eat":{"pitch":[0.80,1.20],"sound":"mob.llama.eat","volume":[0.50,1.50]},"hurt":"mob.llama.hurt","mad":"mob.llama.angry","shoot":"mob.llama.spit","step":{"pitch":1.0,"sound":"mob.llama.step","volume":0.150}},"pitch":[0.80,1.20],"volume":0.80},"magma_cube":{"events":{"ambient":"","attack":{"pitch":[0.80,1.20],"sound":"mob.attack"},"death":"mob.magmacube.small","hurt":"mob.magmacube.small","squish.big":{"pitch":[0.640,0.960],"sound":"mob.magmacube.big"},"squish.small":{"pitch":[0.640,0.960],"sound":"mob.magmacube.small"}},"pitch":[0.80,1.20],"volume":1.0},"minecart":{"events":{"step":""}},"minecraft:npc":{"events":{"ambient":"mob.villager.idle","death":"dig.wood","hurt":"mob.villager.hit"},"pitch":[0.80,1.20],"volume":1.0},"mooshroom":{"events":{"ambient":"mob.cow.say","death":"mob.cow.hurt","eat":"mob.mooshroom.eat","hurt":"mob.cow.hurt","step":{"pitch":[0.90,1.10],"sound":"mob.cow.step","volume":0.650}},"pitch":[0.80,1.20],"volume":1.0},"mule":{"events":{"add.chest":{"pitch":[0.80,1.20],"sound":"mob.horse.armor","volume":1.0},"ambient":"mob.horse.donkey.idle","armor":{"pitch":1.0,"sound":"mob.horse.armor","volume":0.60},"breathe":{"pitch":1.0,"sound":"mob.horse.breathe","volume":0.70},"death":"mob.horse.donkey.death","eat":{"pitch":[0.80,1.20],"sound":"mob.horse.eat","volume":[0.50,1.50]},"hurt":"mob.horse.donkey.hit","jump":{"pitch":1.0,"sound":"mob.horse.jump","volume":0.40},"land":{"pitch":1.0,"sound":"mob.horse.land","volume":0.40},"mad":"mob.horse.donkey.angry","saddle":{"pitch":1.0,"sound":"mob.horse.leather","volume":0.60},"unsaddle":"mob.unsaddle"},"pitch":[0.80,1.20],"volume":0.80},"nautilus":{"__molang_version":13,"events":{"ambient":"mob.nautilus.ambient","ambient.in.water":"mob.nautilus.ambient.in.water","armor.unequip_generic":"mob.nautilus.armor_unequip","dash_ready":"mob.nautilus.dash_ready","death":"mob.nautilus.death","death.in.water":"mob.nautilus.death.in.water","eat":"mob.nautilus.eat","hurt":"mob.nautilus.hurt","hurt.in.water":"mob.nautilus.hurt.in.water","saddle":"mob.nautilus.saddle","saddle_in_water":"mob.nautilus.saddle_underwater","swim":"mob.nautilus.swim","unsaddle":"mob.unsaddle"},"pitch":1.0,"variants":{"key":"query.is_baby ? \'baby\' : \'adult\'","map":{"adult":{"events":{"ambient":"mob.nautilus.ambient","ambient.in.water":"mob.nautilus.ambient.in.water","dash_ready":"mob.nautilus.dash_ready","death":"mob.nautilus.death","death.in.water":"mob.nautilus.death.in.water","eat":"mob.nautilus.eat","hurt":"mob.nautilus.hurt","hurt.in.water":"mob.nautilus.hurt.in.water","swim":"mob.nautilus.swim"},"pitch":1.0,"volume":3.0},"baby":{"events":{"ambient":"mob.baby_nautilus.ambient","ambient.in.water":"mob.baby_nautilus.ambient.in.water","death":"mob.baby_nautilus.death","death.in.water":"mob.baby_nautilus.death.in.water","eat":"mob.nautilus.eat","hurt":"mob.baby_nautilus.hurt","hurt.in.water":"mob.baby_nautilus.hurt.in.water","swim":"mob.nautilus.swim"},"pitch":1.0,"volume":3.0}}},"volume":3.0},"npc":{"events":{"death":"dig.wood","hurt":"mob.villager.hit","spawn":"mob.villager.idle"},"pitch":[0.80,1.20],"volume":1.0},"ocelot":{"events":{"ambient":"mob.ocelot.idle","death":"mob.ocelot.death","eat":"mob.cat.eat","hurt":{"sound":"mob.cat.hit","volume":0.450}},"pitch":[0.80,1.20],"volume":1.0},"panda":{"events":{"ambient":"mob.panda.idle","ambient.aggressive":"mob.panda.idle.aggressive","ambient.baby":"mob.panda_baby.idle","ambient.worried":"mob.panda.idle.worried","attack":"mob.panda.bite","cant_breed":"mob.panda.cant_breed","death":{"sound":"mob.panda.death","volume":0.820},"eat":"mob.panda.eat","hurt":{"sound":"mob.panda.hurt","volume":0.820},"presneeze":"mob.panda.presneeze","sneeze":"mob.panda.sneeze","step":{"sound":"mob.panda.step","volume":0.40}},"pitch":[0.80,1.20],"volume":1.0},"parched":{"events":{"ambient":"mob.parched.ambient","death":"mob.parched.death","hurt":"mob.parched.hurt","step":{"pitch":1.0,"sound":"mob.parched.step","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"parrot":{"events":{"ambient":{"sound":"mob.parrot.idle","volume":0.70},"death":{"pitch":[0.80,1.0],"sound":"mob.parrot.death","volume":1.0},"eat":"mob.parrot.eat","fly":"mob.parrot.fly","hurt":{"pitch":[0.80,1.0],"sound":"mob.parrot.hurt","volume":1.0},"imitate.blaze":{"pitch":1.80,"sound":"mob.imitate.blaze","volume":0.40},"imitate.bogged":{"pitch":1.70,"sound":"mob.imitate.bogged","volume":0.70},"imitate.breeze":{"pitch":1.70,"sound":"mob.imitate.breeze","volume":0.70},"imitate.camel_husk":{"pitch":1.70,"sound":"mob.imitate.camel_husk","volume":0.70},"imitate.cave_spider":{"pitch":1.80,"sound":"mob.imitate.spider","volume":0.60},"imitate.creaking":{"pitch":1.0,"sound":"mob.imitate.creaking","volume":1.0},"imitate.creeper":{"pitch":1.80,"sound":"imitate.fuse","volume":0.60},"imitate.drowned":{"pitch":1.80,"sound":"mob.imitate.drowned","volume":0.60},"imitate.elder_guardian":{"pitch":1.70,"sound":"mob.imitate.guardian","volume":0.70},"imitate.ender_dragon":{"pitch":1.80,"sound":"mob.imitate.enderdragon","volume":0.20},"imitate.enderman":{"pitch":1.70,"sound":"mob.imitate.endermen","volume":0.50},"imitate.endermite":{"pitch":1.80,"sound":"mob.imitate.endermite","volume":0.70},"imitate.evocation_illager":{"pitch":1.80,"sound":"mob.imitate.evocation_illager","volume":0.60},"imitate.ghast":{"pitch":1.80,"sound":"mob.imitate.ghast","volume":0.70},"imitate.guardian":{"pitch":1.80,"sound":"mob.imitate.guardian","volume":0.70},"imitate.happy_ghast":{"pitch":1.70,"sound":"mob.imitate.happy_ghast"},"imitate.husk":{"pitch":1.80,"sound":"mob.imitate.husk","volume":0.60},"imitate.magma_cube":{"pitch":1.80,"sound":"mob.imitate.magmacube","volume":0.60},"imitate.parched":{"pitch":1.70,"sound":"mob.imitate.parched","volume":0.70},"imitate.phantom":{"pitch":1.50,"sound":"mob.imitate.phantom","volume":0.70},"imitate.pillager":{"pitch":1.80,"sound":"mob.imitate.pillager","volume":0.70},"imitate.polar_bear":{"pitch":0.80,"sound":"mob.imitate.polarbear","volume":0.70},"imitate.ravager":{"pitch":1.70,"sound":"mob.imitate.ravager","volume":0.70},"imitate.shulker":{"pitch":1.70,"sound":"mob.imitate.shulker","volume":0.40},"imitate.silverfish":{"pitch":1.80,"sound":"mob.imitate.silverfish","volume":0.70},"imitate.skeleton":{"pitch":1.70,"sound":"mob.imitate.skeleton","volume":1},"imitate.slime":{"pitch":1.80,"sound":"mob.imitate.slime","volume":0.60},"imitate.spider":{"pitch":1.80,"sound":"mob.imitate.spider","volume":0.60},"imitate.stray":{"pitch":1.60,"sound":"mob.imitate.stray","volume":0.60},"imitate.vex":{"pitch":1.60,"sound":"mob.imitate.vex","volume":0.80},"imitate.vindication_illager":{"pitch":1.70,"sound":"mob.imitate.vindicator","volume":0.60},"imitate.warden":{"pitch":1.80,"sound":"mob.imitate.warden","volume":0.80},"imitate.witch":{"pitch":1.80,"sound":"mob.imitate.witch","volume":0.50},"imitate.wither":{"pitch":1.80,"sound":"mob.imitate.wither","volume":0.20},"imitate.wither_skeleton":{"pitch":1.80,"sound":"mob.imitate.wither_skeleton","volume":0.70},"imitate.wolf":{"pitch":1.80,"sound":"mob.imitate.wolf","volume":0.60},"imitate.zoglin":{"pitch":1.70,"sound":"mob.imitate.zoglin","volume":0.70},"imitate.zombie":{"pitch":1.80,"sound":"mob.imitate.zombie","volume":0.60},"imitate.zombie_pigman":{"pitch":1.80,"sound":"mob.imitate.zombiepig","volume":0.40},"imitate.zombie_villager":{"pitch":1.80,"sound":"mob.imitate.zombie_villager","volume":0.60},"step":"mob.parrot.step"},"pitch":[0.80,1.20],"volume":1.0},"phantom":{"events":{"ambient":"mob.phantom.idle","attack":"mob.phantom.bite","death":"mob.phantom.death","flap":"mob.phantom.flap","hurt":"mob.phantom.hurt","swoop":{"pitch":[0.950,1.050],"sound":"mob.phantom.swoop"}},"pitch":[0.80,1.20],"volume":10.0},"pig":{"events":{"ambient":"mob.pig.say","boost":"mob.pig.boost","death":"mob.pig.death","death.to.zombie":"mob.pig.death","eat":"mob.pig.eat","hurt":"mob.pig.say","step":"mob.pig.step","unsaddle":"mob.unsaddle"},"pitch":[0.80,1.20],"volume":1.0},"piglin":{"events":{"admire":"mob.piglin.admiring_item","ambient":"mob.piglin.ambient","angry":"mob.piglin.angry","attack":"mob.piglin.attack","celebrate":"mob.piglin.celebrate","death":"mob.piglin.death","hurt":"mob.piglin.hurt","retreat":"mob.piglin.retreat","step":{"sound":"mob.piglin.step","volume":0.350}},"pitch":[0.80,1.20],"volume":1.0},"piglin_brute":{"events":{"ambient":"mob.piglin_brute.ambient","angry":"mob.piglin_brute.angry","death":"mob.piglin_brute.death","hurt":"mob.piglin_brute.hurt","step":{"sound":"mob.piglin_brute.step","volume":0.350}},"pitch":[0.80,1.20],"volume":1.0},"pillager":{"events":{"ambient":"mob.pillager.idle","ambient.in.raid":{"pitch":[0.80,1.20],"sound":"mob.pillager.idle","volume":3.0},"celebrate":"mob.pillager.celebrate","death":"mob.pillager.death","hurt":"mob.pillager.hurt"},"pitch":[0.80,1.20],"volume":1.0},"player":{"events":{"attack.critical":"game.player.attack.critical","attack.nodamage":"game.player.attack.nodamage","attack.strong":"game.player.attack.strong","death":"game.player.die","death.in.water":"game.player.die","elderguardian.curse":{"pitch":1.0,"sound":"mob.elderguardian.curse","volume":1.0},"hurt":"game.player.hurt","hurt.in.water":"game.player.hurt","splash":{"pitch":[0.60,1.40],"sound":"entity.generic.splash"},"teleport":"entity.player.teleport","throw":{"pitch":[0.330,0.50],"sound":"random.bow","volume":0.50}},"pitch":[0.80,1.20],"volume":1.0},"polar_bear":{"events":{"ambient":"mob.polarbear.idle","ambient.baby":"mob.polarbear_baby.idle","death":"mob.polarbear.death","hurt":{"sound":"mob.polarbear.hurt","volume":0.70},"mob.warning":{"pitch":1.0,"sound":"mob.polarbear.warning","volume":1.20},"step":{"pitch":1.0,"sound":"mob.polarbear.step","volume":0.70}},"pitch":[0.80,1.20],"volume":1.0},"pufferfish":{"events":{"flop":{"pitch":1.0,"sound":"mob.fish.flop","volume":1.0},"hurt":"mob.fish.hurt","hurt.in.water":"mob.fish.hurt","step":{"pitch":1.0,"sound":"mob.fish.step","volume":0.150}},"pitch":[0.80,1.20],"volume":1.0},"rabbit":{"events":{"ambient":"mob.rabbit.idle","death":"mob.rabbit.death","eat":"","hurt":"mob.rabbit.hurt"},"pitch":[0.80,1.20],"volume":0.80},"ravager":{"events":{"ambient":"mob.ravager.ambient","ambient.in.raid":{"pitch":[0.80,1.20],"sound":"mob.ravager.ambient","volume":3.0},"attack.strong":"mob.ravager.bite","celebrate":"mob.ravager.celebrate","death":"mob.ravager.death","hurt":"mob.ravager.hurt","roar":"mob.ravager.roar","step":"mob.ravager.step","stun":"mob.ravager.stun"},"pitch":[0.80,1.20],"volume":1.0},"salmon":{"events":{"flop":{"pitch":1.0,"sound":"mob.fish.flop","volume":1.0},"hurt":"mob.fish.hurt","hurt.in.water":"mob.fish.hurt","step":{"pitch":1.0,"sound":"mob.fish.step","volume":0.150}},"pitch":[0.80,1.20],"volume":1.0},"sheep":{"events":{"ambient":"mob.sheep.say","death":"mob.sheep.say","eat":"","hurt":"mob.sheep.say","step":{"pitch":1.0,"sound":"mob.sheep.step","volume":0.40}},"pitch":[0.80,1.20],"volume":1.0},"shulker":{"events":{"ambient":"mob.shulker.ambient","death":"mob.shulker.death","hurt":"mob.shulker.hurt","shoot":"mob.shulker.shoot","shulker.close":"mob.shulker.close","shulker.open":"mob.shulker.open","teleport":"mob.shulker.teleport"},"pitch":[0.80,1.20],"volume":1.0},"silverfish":{"events":{"ambient":"mob.silverfish.say","death":"mob.silverfish.kill","hurt":"mob.silverfish.hit","step":{"pitch":1.0,"sound":"mob.silverfish.step","volume":0.350}},"pitch":[0.80,1.20],"volume":1.0},"skeleton":{"events":{"ambient":"mob.skeleton.say","death":"mob.skeleton.death","hurt":{"sound":"mob.skeleton.hurt","volume":0.70},"step":{"pitch":1.0,"sound":"mob.skeleton.step","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"skeleton_horse":{"events":{"add.chest":{"pitch":[0.80,1.20],"sound":"mob.horse.armor","volume":1.0},"ambient":"mob.horse.skeleton.idle","armor":{"pitch":1.0,"sound":"mob.horse.armor","volume":0.60},"breathe":{"pitch":1.0,"sound":"mob.horse.breathe","volume":0.70},"death":"mob.horse.skeleton.death","hurt":"mob.horse.skeleton.hit","jump":{"pitch":1.0,"sound":"mob.horse.jump","volume":0.40},"land":{"pitch":1.0,"sound":"mob.horse.land","volume":0.40},"saddle":{"pitch":1.0,"sound":"mob.horse.leather","volume":0.60}},"pitch":[0.80,1.20],"volume":0.80},"slime":{"events":{"ambient":"","attack":{"pitch":[0.80,1.20],"sound":"mob.attack"},"death":"mob.slime.small","hurt":"mob.slime.small","squish.big":{"pitch":[0.640,0.960],"sound":"mob.slime.big"},"squish.small":{"pitch":[0.640,0.960],"sound":"mob.slime.small"}},"pitch":[0.80,1.20],"volume":1.0},"sniffer":{"events":{"ambient":"mob.sniffer.idle","death":"mob.sniffer.death","eat":"mob.sniffer.eat","hurt":"mob.sniffer.hurt","plop":"mob.sniffer.plop","step":"mob.sniffer.step"},"pitch":[0.80,1.20],"volume":1.0},"snow_golem":{"events":{"death":{"pitch":[0.80,1.20],"sound":"mob.snowgolem.death"},"hurt":{"pitch":[0.80,1.20],"sound":"mob.snowgolem.hurt"},"shoot":{"pitch":[0.330,0.50],"sound":"mob.snowgolem.shoot"}},"pitch":[0.80,1.20],"volume":1.0},"spider":{"events":{"ambient":"mob.spider.say","death":"mob.spider.death","hurt":"mob.spider.say","step":{"pitch":[0.90,1.10],"sound":"mob.spider.step","volume":0.350}},"pitch":[0.80,1.20],"volume":1.0},"squid":{"events":{"ambient":"mob.squid.ambient","death":"mob.squid.death","hurt":"mob.squid.hurt"},"pitch":[0.80,1.20],"volume":0.40},"stray":{"events":{"ambient":"mob.stray.ambient","death":"mob.stray.death","hurt":"mob.stray.hurt","step":{"pitch":1.0,"sound":"mob.stray.step","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"strider":{"events":{"ambient":"mob.strider.idle","death":"mob.strider.death","eat":"mob.strider.eat","hurt":"mob.strider.hurt","panic":"mob.strider.panic","step":{"pitch":1.0,"sound":"mob.strider.step","volume":0.250},"step_lava":{"pitch":1.0,"sound":"mob.strider.step_lava","volume":0.20},"tempt":"mob.strider.tempt","unsaddle":"mob.unsaddle"},"pitch":[0.80,1.20],"volume":1.0},"tadpole":{"events":{"death":"mob.tadpole.death","flop":{"pitch":1.0,"sound":"mob.fish.flop","volume":1.0},"hurt":"mob.tadpole.hurt"},"pitch":[0.80,1.20],"volume":1},"trader_llama":{"events":{"add.chest":{"pitch":[0.80,1.20],"sound":"mob.horse.armor","volume":1.0},"ambient":"mob.llama.idle","armor":{"pitch":1.0,"sound":"mob.llama.swag","volume":0.50},"death":"mob.llama.death","eat":{"pitch":[0.80,1.20],"sound":"mob.llama.eat","volume":[0.50,1.50]},"hurt":"mob.llama.hurt","mad":"mob.llama.angry","shoot":"mob.llama.spit","step":{"pitch":1.0,"sound":"mob.llama.step","volume":0.150}},"pitch":[0.80,1.20],"volume":0.80},"tropicalfish":{"events":{"flop":{"pitch":1.0,"sound":"mob.fish.flop","volume":1.0},"hurt":"mob.fish.hurt","hurt.in.water":"mob.fish.hurt","step":{"pitch":1.0,"sound":"mob.fish.step","volume":0.150}},"pitch":[0.80,1.20],"volume":1.0},"turtle":{"events":{"ambient":"mob.turtle.ambient","born":{"pitch":1.0,"sound":"mob.turtle_baby.born","volume":1.0},"death":"mob.turtle.death","death.baby":"mob.turtle_baby.death","eat":"","hurt":"mob.turtle.hurt","hurt.baby":"mob.turtle_baby.hurt","step":{"pitch":1.0,"sound":"mob.turtle.step","volume":1.0},"step.baby":{"pitch":1.0,"sound":"mob.turtle_baby.step","volume":1.0},"swim":{"pitch":[0.60,1.40],"sound":"mob.turtle.swim"}},"pitch":[0.80,1.20],"volume":1.0},"vex":{"events":{"ambient":"mob.vex.ambient","charge":"mob.vex.charge","death":"mob.vex.death","hurt":"mob.vex.hurt"},"pitch":[0.80,1.20],"volume":1.0},"villager":{"events":{"ambient":"mob.villager.idle","death":"mob.villager.death","death.to.zombie":"mob.villager.death","haggle":"mob.villager.haggle","haggle.no":"mob.villager.no","haggle.yes":"mob.villager.yes","hurt":"mob.villager.hit"},"pitch":[0.80,1.20],"volume":1.0},"villager_v2":{"events":{"ambient":"mob.villager.idle","death":"mob.villager.death","death.to.zombie":"mob.villager.death","haggle":"mob.villager.haggle","haggle.no":"mob.villager.no","haggle.yes":"mob.villager.yes","hurt":"mob.villager.hit"},"pitch":[0.80,1.20],"volume":1.0},"vindicator":{"events":{"ambient":"mob.vindicator.idle","ambient.in.raid":{"pitch":[0.80,1.20],"sound":"mob.vindicator.idle","volume":3.0},"celebrate":"mob.vindicator.celebrate","death":"mob.vindicator.death","hurt":"mob.vindicator.hurt"},"pitch":[0.80,1.20],"volume":1.0},"wandering_trader":{"events":{"ambient":"mob.wanderingtrader.idle","death":"mob.wanderingtrader.death","disappeared":"mob.wanderingtrader.disappeared","drink":"mob.wanderingtrader.drink_potion","drink.milk":"mob.wanderingtrader.drink_milk","haggle":"mob.wanderingtrader.haggle","haggle.no":"mob.wanderingtrader.no","haggle.yes":"mob.wanderingtrader.yes","hurt":"mob.wanderingtrader.hurt","reappeared":"mob.wanderingtrader.reappeared"},"pitch":[0.80,1.20],"volume":1.0},"warden":{"events":{"agitated":{"pitch":[0.80,1.20],"sound":"mob.warden.agitated","volume":10.0},"ambient":"mob.warden.idle","angry":{"pitch":[0.80,1.20],"sound":"mob.warden.angry","volume":10.0},"attack":{"pitch":1.0,"sound":"mob.warden.attack","volume":10.0},"death":{"pitch":[0.80,1.0],"sound":"mob.warden.death","volume":1.0},"heartbeat":{"pitch":1.0,"sound":"mob.warden.heartbeat","volume":5.0},"hurt":{"pitch":[0.80,1.0],"sound":"mob.warden.hurt","volume":1.0},"listening":{"pitch":[0.80,1.20],"sound":"mob.warden.listening","volume":10.0},"listening_angry":{"pitch":[0.80,1.20],"sound":"mob.warden.listening_angry","volume":10.0},"nearby_close":{"pitch":[0.80,1.20],"sound":"mob.warden.nearby_close","volume":5.0},"nearby_closer":{"pitch":[0.80,1.20],"sound":"mob.warden.nearby_closer","volume":5.0},"nearby_closest":{"pitch":[0.80,1.20],"sound":"mob.warden.nearby_closest","volume":5.0},"roar":{"pitch":1.0,"sound":"mob.warden.roar","volume":10.0},"step":{"pitch":1.0,"sound":"mob.warden.step","volume":10.0}},"pitch":[0.80,1.20],"volume":1.0},"witch":{"events":{"ambient":"mob.witch.ambient","ambient.in.raid":{"pitch":[0.80,1.20],"sound":"mob.witch.ambient","volume":3.0},"celebrate":"mob.witch.celebrate","death":"mob.witch.death","drink":{"pitch":1.0,"sound":"mob.witch.drink","volume":1.0},"hurt":"mob.witch.hurt","throw":{"pitch":1.0,"sound":"mob.witch.throw","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"wither":{"events":{"ambient":"mob.wither.ambient","break.block":{"pitch":1.0,"sound":"mob.wither.break_block","volume":1.0},"death":"mob.wither.death","death.mid.volume":{"sound":"mob.wither.death","volume":0.750},"death.min.volume":{"sound":"mob.wither.death","volume":0.50},"hurt":"mob.wither.hurt","shoot":{"pitch":1.0,"sound":"mob.wither.shoot","volume":3.0},"spawn":{"pitch":1.0,"sound":"mob.wither.spawn","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"wither_skeleton":{"events":{"ambient":{"pitch":[0.80,1.20],"sound":"entity.wither_skeleton.ambient","volume":1.0},"death":{"pitch":[0.80,1.20],"sound":"entity.wither_skeleton.death","volume":1.0},"hurt":{"pitch":[0.80,1.20],"sound":"entity.wither_skeleton.hurt","volume":1.0},"step":{"pitch":1.0,"sound":"entity.wither_skeleton.step","volume":1.0}},"pitch":[0.80,1.20],"volume":1.0},"wolf":{"events":{"ambient":"mob.wolf.bark","death":"mob.wolf.death","eat":"","growl":"mob.wolf.growl","hurt":"mob.wolf.hurt","hurt.reduced":"armor.damage_wolf","pant":"mob.wolf.panting","shake":"mob.wolf.shake","step":"mob.wolf.step","whine":"mob.wolf.whine"},"pitch":[0.80,1.20],"volume":1.0},"xp_orb":{"events":{"fizz":{"pitch":[2.0,2.40],"sound":"random.fizz","volume":0.40}},"pitch":[0.80,1.20],"volume":1.0},"zoglin":{"events":{"ambient":"mob.zoglin.idle","angry":"mob.zoglin.angry","attack":"mob.zoglin.attack","death":"mob.zoglin.death","hurt":"mob.zoglin.hurt","step":{"pitch":1.0,"sound":"mob.zoglin.step","volume":0.150}},"pitch":[0.80,1.20],"volume":1.0},"zombie":{"events":{"ambient":"mob.zombie.say","death":"mob.zombie.death","hurt":"mob.zombie.hurt","step":{"pitch":1.0,"sound":"mob.zombie.step","volume":0.450}},"pitch":[0.80,1.20],"volume":1.0},"zombie_horse":{"events":{"add.chest":{"pitch":[0.80,1.20],"sound":"mob.horse.armor","volume":1.0},"ambient":"mob.horse.zombie.idle","armor":{"pitch":1.0,"sound":"mob.horse.armor","volume":0.60},"breathe":{"pitch":1.0,"sound":"mob.horse.breathe","volume":0.70},"death":"mob.horse.zombie.death","eat":{"pitch":[0.80,1.20],"sound":"mob.horse.eat","volume":[0.50,1.50]},"hurt":"mob.horse.zombie.hit","jump":{"pitch":1.0,"sound":"mob.horse.jump","volume":0.40},"land":{"pitch":1.0,"sound":"mob.horse.land","volume":0.40},"mad":"mob.horse.zombie.angry","saddle":{"pitch":1.0,"sound":"mob.horse.leather","volume":0.60}},"pitch":[0.80,1.20],"volume":0.80},"zombie_nautilus":{"events":{"ambient":"mob.zombie_nautilus.ambient","ambient.in.water":"mob.zombie_nautilus.ambient.in.water","armor.unequip_generic":"mob.nautilus.armor_unequip","dash_ready":"mob.zombie_nautilus.dash_ready","death":"mob.zombie_nautilus.death","death.in.water":"mob.zombie_nautilus.death.in.water","eat":"mob.zombie_nautilus.eat","hurt":"mob.zombie_nautilus.hurt","hurt.in.water":"mob.zombie_nautilus.hurt.in.water","saddle":"mob.nautilus.saddle","saddle_in_water":"mob.nautilus.saddle_underwater","swim":"mob.zombie_nautilus.swim","unsaddle":"mob.unsaddle"},"pitch":1.0,"volume":3.0},"zombie_pigman":{"events":{"ambient":"mob.zombiepig.zpig","death":"mob.zombiepig.zpigdeath","hurt":"mob.zombiepig.zpighurt","mad":{"pitch":[1.440,2.160],"sound":"mob.zombiepig.zpigangry","volume":2.0}},"pitch":[0.80,1.20],"volume":1.0},"zombie_villager":{"events":{"ambient":"mob.zombie_villager.say","death":"mob.zombie_villager.death","hurt":"mob.zombie_villager.hurt","step":{"pitch":1.0,"sound":"mob.zombie.step","volume":0.450}},"pitch":[0.80,1.20],"volume":1.0},"zombie_villager_v2":{"events":{"ambient":"mob.zombie_villager.say","death":"mob.zombie_villager.death","hurt":"mob.zombie_villager.hurt","step":{"pitch":1.0,"sound":"mob.zombie.step","volume":0.450}},"pitch":[0.80,1.20],"volume":1.0}}}}'},6662:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,'\ndialog#minecraft_entity_wizard {\n\t\tmax-width: 100%;\n}\ndialog#minecraft_entity_wizard .dialog_handle {\n\t\tmargin-bottom: 0;\n}\ndialog#minecraft_entity_wizard .button_bar {\n\t\tdisplay: none;\n}\n#entity_wizard_wrapper {\n\t\tdisplay: flex;\n\t\tmin-height: 460px;\n\t\tposition: relative;\n\t\t--color-subtle_text: #91949C;\n}\n#entity_wizard_start_page {\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t\tpadding: 12px 20px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: cover;\n\t\tbackground-position: center;\n\t\timage-rendering: auto;\n}\n#entity_wizard_start_page > div {\n\t\tdisplay: inline-block;\n}\n#entity_wizard_start_page > img {\n\t\tdisplay: inline-block;\n\t\tvertical-align: middle;\n\t\tmargin-left: 16px;\n\t\tmargin-top: 16px;\n\t\tmargin-bottom: -8px;\n\t\tmargin-right: -56px;\n}\n#entity_wizard_start_page section {\n\t\tmax-width: 480px;\n\t\tpadding: 0 20px;\n\t\tmargin: auto;\n}\n#entity_wizard_start_page #entity_wizard_start_button {\n\t\tbackground-color: var(--color-accent);\n\t\tcolor: var(--color-light);\n\t\theight: 40px;\n\t\twidth: 128px;\n}\n#entity_wizard_sidebar {\n\t\tbackground-color: var(--color-back);\n\t\tflex: 0 0 160px;\n\t\tpadding: 16px 0;\n\t\tposition: relative;\n}\n@media (max-device-width: 640px) {\n#entity_wizard_sidebar {\n\t\t\tdisplay: none;\n}\n}\n#entity_wizard_sidebar li {\n\t\twidth: 100%;\n\t\tpadding: 6px 20px;\n\t\tborder-left: 4px solid transparent;\n\t\tcursor: pointer;\n}\n#entity_wizard_sidebar li:hover {\n\t\tcolor: var(--color-light);\n}\n#entity_wizard_sidebar li.selected {\n\t\tbackground-color: var(--color-ui);\n\t\tborder-left: 4px solid var(--color-accent);\n}\n#entity_wizard_sidebar .entity_wizard_documentation {\n\t\tposition: absolute;\n\t\tbottom: 10px;\n\t\tpadding: 8px;\n}\n.entity_wizard_documentation a {\n\t\ttext-decoration: none;\n}\n.entity_wizard_documentation a i {\n\t\tdisplay: inline;\n\t\tvertical-align: text-bottom;\n\t\tpointer-events: none;\n}\n.entity_wizard_documentation a span {\n\t\ttext-decoration: underline;\n\t\tpointer-events: none;\n}\n#entity_wizard_page {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex-grow: 1;\n\t\tpadding: 5px 20px;\n}\n#entity_wizard_page > content {\n\t\tflex-grow: 1;\n}\n#entity_wizard_navigation {\n\t\tflex: 40px 0 0;\n\t\tpadding: 8px;\n\t\tdisplay: flex;\n}\n#entity_wizard_back_button {\n\t\tpadding: 5px;\n \theight: 32px;\n\t\tcursor: pointer;\n}\n#entity_wizard_back_button:hover {\n\t\tcolor: var(--color-light);\n}\n#entity_wizard_navigation .bar_spacer {\n\t\tflex-grow: 1;\n}\n#entity_wizard_next_button {\n\t\tbackground-color: var(--color-accent);\n\t\tcolor: var(--color-light);\n\t\twidth: 112px;\n\t\tmargin-right: 4px;\n}\n\n\t/* Required */\n#entity_wizard_page #required_message {\n\t\tpadding-top: 5px;\n\t\tpadding-left: 16px;\n}\n#entity_wizard_page #required_message::before, #entity_wizard_page label.required::after {\n\t\tcontent: "*";\n\t\tfont-size: 1.2em;\n\t\tline-height: 0;\n\t\tvertical-align: inherit;\n\t\tcolor: var(--color-accent);\n}\n#minecraft_entity_wizard section {\n\t\tpadding-top: 16px;\n}\n#minecraft_entity_wizard p {\n\t\tcolor: var(--color-subtle_text);\n\t\tline-height: normal;\n}\n#minecraft_entity_wizard input[type=text], #minecraft_entity_wizard input[type=number] {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tbackground-color: var(--color-back);\n\t\tborder: 1px solid var(--color-border);\n\t\tpadding: 4px 8px;\n\t\tborder-radius: 5px;\n}\n.entity_wizard_target_selection {\n\t\tposition: absolute;\n\t\tbackground-color: var(--color-ui);\n\t\ttop: 8px;\n\t\tright: 20px;\n\t\tmin-width: 156px;\n}\n#entity_wizard_id_error {\n\t\tposition: absolute;\n\t\tright: 28px;\n\t\tmargin-top: -28px;\n}\n#entity_wizard_id_error:hover .entity_wizard_tooltip {\n\t\tdisplay: block;\n \tvisibility: visible;\n\t\tmargin: 0;\n \tright: -5px;\n}\nul.entity_wizard_mob_list {\n\t\tmax-height: 360px;\n\t\twidth: 100%;\n\t\toverflow-y: scroll;\n}\nul.entity_wizard_mob_list > li {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tposition: relative;\n\t\tfloat: left;\n\t\twidth: 122px;\n\t\theight: 90px;\n\t\tmargin: 2px;\n\t\tbackground-color: var(--color-back);\n\t\tborder-radius: 5px;\n\t\tcursor: pointer;\n\t\tbox-sizing: content-box;\n\t\tborder: 1px solid transparent;\n\t\tbackground-size: 96px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: 12px 3px;\n\t\timage-rendering: auto;\n}\nul.entity_wizard_mob_list > li:hover {\n\t\tbackground-color: var(--color-selected);\n\t\tcolor: var(--color-light);\n}\nul.entity_wizard_mob_list > li.selected {\n\t\t border-color: var(--color-accent);\n}\nul.entity_wizard_mob_list > li.selected::after {\n\t\tposition: absolute;\n\t\tcontent: "\\f00c";\n\t\tfont-family: \'Font Awesome 6 Free\';\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-accent);\n\t\tbackground-color: var(--color-ui);\n\t\theight: 19px;\n\t\ttop: -8px;\n\t\tright: -4px;\n\t\tborder-bottom-left-radius: 8px;\n\t\tpadding-left: 2px;\n}\nul.entity_wizard_mob_list > li label {\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t\tmargin-top: auto;\n\t\tpointer-events: none;\n}\n#entity_wizard_page input[type="radio"] {\n\t\tvertical-align: middle;\n\t\tmargin-top: -4px;\n\t\tmargin-right: 6px;\n}\n#entity_wizard_page code.code {\n\t\tbackground-color: var(--color-back);\n\t\tborder: 1px solid var(--color-border);\n\t\tpadding: 1px;\n}\n.dialogue_designer_icon {\n\t\tvertical-align: middle;\n\t\tmargin-bottom: 1px;\n\t\tmargin-right: 2px;\n}\n#entity_wizard_launch_vscode img {\n\t\tvertical-align: top;\n\t\tmargin-right: 4px;\n}\n\n',""]);const r=o},4457:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,"\n#entity_wizard_egg_color_preview {\n\theight: 64px;\n\twidth: 64px;\n\tbackground-color: var(--color-back);\n}\n#entity_wizard_egg_color_preview canvas {\n\theight: 100%;\n\twidth: 100%;\n}\n",""]);const r=o},7691:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,"\n#entity_wizard_export_options {\n\tdisplay: grid;\n\tgrid-template-columns: auto auto;\n\tgrid-gap: 10px;\n\tmin-height: 125px;\n}\n.entity_wizard_export_option {\n\tdisplay: inline-block;\n\tborder: 1px solid;\n\tborder-bottom: 10px solid;\n\tpadding: 12px;\n\tbackground-color: var(--color-back);\n\tcursor: pointer;\n\tborder-radius: 5px;\n}\n.entity_wizard_export_option:hover {\n\tbackground-color: var(--color-button);\n}\n.entity_wizard_export_option:not(.selected) {\n\tborder-top-color: transparent !important;\n\tborder-left-color: transparent !important;\n\tborder-right-color: transparent !important;\n}\n.entity_wizard_export_option > h3 {\n\tmargin: 0;\n}\n#entity_wizard_pack_list li {\n\tdisplay: inline-block;\n\twidth: min(100%, 254px);\n\toverflow: hidden;\n\tpadding: 4px;\n\tcursor: pointer;\n\tborder-radius: 5px;\n}\n#entity_wizard_pack_list li:hover {\n\tcolor: var(--color-light);\n}\n#entity_wizard_pack_list li.selected {\n\tbackground-color: var(--color-accent);\n\tcolor: var(--color-accent_text);\n}\n#entity_wizard_pack_list li img, #entity_wizard_pack_list li div {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 32px;\n\tbackground-color: var(--color-back);\n\tvertical-align: middle;\n\tmargin-right: 2px;\n}\n#entity_wizard_pack_list li > i {\n\tvertical-align: middle;\n\tpadding: 5px;\n\tmax-width: unset;\n}\n",""]);const r=o},9966:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,"\n.entity_wizard_icon_picker {\n\t\tdisplay: flex;\n}\n.entity_wizard_icon_picker label {\n\t\tpadding: 3px;\n}\n.entity_wizard_icon_picker > .icon_picker_left {\n\t\tbackground-color: var(--color-back);\n\t\tmargin-right: 8px;\n\t\theight: 64px;\n\t\twidth: 64px;\n}\n.entity_wizard_icon_picker > .icon_picker_right {\n\t\theight: 24px;\n \tcursor: pointer;\n}\n.entity_wizard_icon_picker > .icon_picker_right label {\n \tcursor: inherit;\n}\n.entity_wizard_icon_picker > .icon_picker_right:hover {\n\t\tcolor: var(--color-light);\n}\n.entity_wizard_icon_picker > .icon_picker_right i.icon {\n\t\tvertical-align: text-bottom;\n}\n",""]);const r=o},8627:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,'\n#entity_wizard_loot_list {\n\tmargin: 6px -6px;\n\toverflow-y: auto;\n\tbackground: var(--color-back);\n\tmin-height: 20px;\n}\n#entity_wizard_loot_list > li {\n\tmargin: 10px;\n\tpadding: 10px;\n\tbackground: var(--color-ui);\n\ttext-align: right;\n}\n#entity_wizard_loot_list > li > p {\n\ttext-align: left;\n}\n#entity_wizard_loot_item_list {\n\tmargin: 6px 0;\n}\n#entity_wizard_loot_item_list > li {\n\tdisplay: flex;\n\tpadding: 3px 0;\n}\n#entity_wizard_loot_item_list > li > bb-select {\n\twidth: 335px;\n}\n#entity_wizard_loot_item_list > li > input[type="text"] {\n\twidth: 60%;\n}\n#entity_wizard_loot_item_list > li > .tool {\n\tflex-shrink: 0;\n}\n#entity_wizard_loot_item_list > li > label {\n\tpadding-left: 14px;\n\tpadding-right: 4px;\n\tmargin-left: auto;\n\tpadding-top: 2px;\n\twhite-space: nowrap;\n}\n#entity_wizard_loot_item_list > li > input {\n\theight: 30px;\n}\n\n',""]);const r=o},7983:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,"\n#entity_wizard_egg_color_bar {\n\tdisplay: flex;\n}\n#entity_wizard_egg_color_preview {\n\tmargin: 8px;\n\tmargin-left: 0;\n}\n",""]);const r=o},6314:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var a=e(t);return t[2]?"@media ".concat(t[2]," {").concat(a,"}"):a})).join("")},t.i=function(e,a,i){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(i)for(var r=0;r{"use strict";var i,o=function(){var e={};return function(t){if(void 0===e[t]){var a=document.querySelector(t);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(e){a=null}e[t]=a}return e[t]}}(),r=[];function n(e){for(var t=-1,a=0;a{"use strict";a.r(t);var i=a(5072),o=a.n(i),r=a(6662);o()(r.A,{insert:"head",singleton:!1}),r.A.locals},2694:(e,t,a)=>{"use strict";a.r(t);var i=a(5072),o=a.n(i),r=a(4457);o()(r.A,{insert:"head",singleton:!1}),r.A.locals},1083:(e,t,a)=>{"use strict";a.r(t);var i=a(5072),o=a.n(i),r=a(7691);o()(r.A,{insert:"head",singleton:!1}),r.A.locals},4769:(e,t,a)=>{"use strict";a.r(t);var i=a(5072),o=a.n(i),r=a(9966);o()(r.A,{insert:"head",singleton:!1}),r.A.locals},742:(e,t,a)=>{"use strict";a.r(t);var i=a(5072),o=a.n(i),r=a(8627);o()(r.A,{insert:"head",singleton:!1}),r.A.locals},4737:(e,t,a)=>{"use strict";a.r(t);var i=a(5072),o=a.n(i),r=a(7983);o()(r.A,{insert:"head",singleton:!1}),r.A.locals},5317:e=>{"use strict";e.exports=require("child_process")},9896:e=>{"use strict";e.exports=require("fs")},857:e=>{"use strict";e.exports=require("os")}},t={};function a(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={id:i,exports:{}};return e[i](r,r.exports,a),r.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var i in t)a.o(t,i)&&!a.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nc=void 0,(()=>{"use strict";var e=function(){var e=this,t=e._self._c;return t("div",{attrs:{id:"entity_wizard_wrapper"}},["start"==e.open_page?[t("div",{style:{backgroundImage:`url('${e.start_page_background}')`},attrs:{id:"entity_wizard_start_page"}},[t("div",[t("h2",[e._v("Create your Entity!")]),e._v(" "),e._m(0),e._v(" "),e._m(1),e._v(" "),t("section",[t("button",{attrs:{id:"entity_wizard_start_button"},on:{click:function(t){e.open_page="metadata"}}},[e._v("Let's Go!")]),e._v(" "),t("button",{staticClass:"cancel_btn",staticStyle:{display:"none"},on:{click:function(t){return e.cancel(t,!0)}}},[e._v("Cancel")])])]),e._v(" "),t("img",{staticStyle:{"image-rendering":"auto"},attrs:{src:e.start_page_image,width:"280px"}})])]:[t("ul",{attrs:{id:"entity_wizard_sidebar"}},[e._l(e.pages,(function(a,i){return t("li",{key:i,class:{selected:e.open_page==i},on:{click:function(t){return e.switchPage(i)}}},[e._v(e._s(a.name))])})),e._v(" "),e._m(2)],2),e._v(" "),t("div",{attrs:{id:"entity_wizard_page"}},[t("h2",[e._v(e._s(e.pages[e.open_page].name))]),e._v(" "),"metadata"==e.open_page?t("div",{staticClass:"entity_wizard_target_selection"},[t("p",{staticClass:"description"},[e._v("Game Variant")]),e._v(" "),t("select-input",{attrs:{options:e.edition_options},model:{value:e.form.edition,callback:function(t){e.$set(e.form,"edition",t)},expression:"form.edition"}})],1):e._e(),e._v(" "),"metadata"==e.open_page?t("content",[t("section",[t("label",{staticClass:"required"},[e._v("Display Name")]),e._v(" "),t("p",[e._v("The display name will be visible to players in-game.")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.display_name,expression:"form.display_name"}],attrs:{type:"text",placeholder:"Red Panda"},domProps:{value:e.form.display_name},on:{input:[function(t){t.target.composing||e.$set(e.form,"display_name",t.target.value)},function(t){return e.inputDisplayName()}]}})]),e._v(" "),t("section",[t("label",{staticClass:"required"},[e._v("Identifier")]),e._v(" "),t("p",[e._v("The identifier is used internally in the addon to identify this entity type.\n\t\t\t\t\t\tAn identifier consists of the namespace and the entity name, separated by a colon.\n\t\t\t\t\t\tThe namespace should be a short and unique version of your name or the name of your addon.\n\t\t\t\t\t")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.identifier,expression:"form.identifier"}],attrs:{type:"text",placeholder:"myname:red_panda"},domProps:{value:e.form.identifier},on:{input:[function(t){t.target.composing||e.$set(e.form,"identifier",t.target.value)},function(t){e.has_customized_id=!0}]}}),e._v(" "),e.identifier_error?t("div",{attrs:{id:"entity_wizard_id_error"}},[t("i",{staticClass:"material-icons",staticStyle:{color:"#ff415b"}},[e._v("error")]),e._v(" "),t("div",{staticClass:"entity_wizard_tooltip tooltip"},[e._v(e._s(e.identifier_error))])]):e._e()])]):e._e(),e._v(" "),"appearance"==e.open_page?t("content",[e._m(3),e._v(" "),t("section",[t("label",{staticClass:"required"},[e._v("Mob")]),e._v(" "),t("search-bar",{staticStyle:{width:"220px"},attrs:{placeholder:"Search..."},model:{value:e.appearance_search_term,callback:function(t){e.appearance_search_term=t},expression:"appearance_search_term"}}),e._v(" "),t("ul",{staticClass:"entity_wizard_mob_list"},e._l(e.appearance_mobs,(function(a,i){return t("li",{key:i,class:{selected:i==e.form.appearance},style:{backgroundImage:e.getThumbnail(a.thumbnail)},on:{click:function(t){e.form.appearance=i}}},[t("label",[e._v(e._s(a.name))])])})),0)],1)]):e._e(),e._v(" "),"behavior"==e.open_page?t("content",[e._m(4),e._v(" "),t("section",[t("input",{attrs:{type:"radio",id:"entity_wizard_behavior_same",value:"colors"},domProps:{checked:e.form.behavior==e.form.appearance},on:{change:function(t){e.form.behavior=e.form.appearance}}}),e._v(" "),t("label",{attrs:{for:"entity_wizard_behavior_same"}},[e._v("Same Behavior")]),e._v(" "),t("p",[e._v(e._s(e.getSameBehaviorText(e.form.appearance)))])]),e._v(" "),t("section",[t("input",{attrs:{type:"radio",id:"entity_wizard_behavior_different",value:"texture"},domProps:{checked:e.form.behavior!=e.form.appearance},on:{change:function(t){e.form.behavior="basic"==e.form.appearance?"basic_walking":"basic"}}}),e._v(" "),t("label",{attrs:{for:"entity_wizard_behavior_different"}},[e._v("Different Behavior")]),e._v(" "),t("p",[e._v("Use the behavior from another mob.")]),e._v(" "),e._m(5),e._v(" "),e.form.behavior!=e.form.appearance?[t("label",[e._v("Mob")]),e._v(" "),t("search-bar",{staticStyle:{width:"220px"},attrs:{placeholder:"Search..."},model:{value:e.behavior_search_term,callback:function(t){e.behavior_search_term=t},expression:"behavior_search_term"}}),e._v(" "),t("ul",{staticClass:"entity_wizard_mob_list"},e._l(e.behavior_mobs,(function(a,i){return t("li",{key:i,class:{selected:i==e.form.behavior},style:{backgroundImage:e.getThumbnail(a.thumbnail)},on:{click:function(t){e.form.behavior=i}}},[t("label",[e._v(e._s(a.name))])])})),0)]:e._e()],2)]):e._e(),e._v(" "),"loot"==e.open_page?t("content",[t("loot-editor",{attrs:{form:e.form,mobs:e.mobs}})],1):e._e(),e._v(" "),"spawn_egg"==e.open_page?t("content",[t("spawn-egg",{attrs:{form:e.form}})],1):e._e(),e._v(" "),"export"==e.open_page?t("content",{attrs:{id:"entity_wizard_export_page"}},[t("export",{attrs:{form:e.form}})],1):e._e(),e._v(" "),"next_steps"==e.open_page?t("content",[t("section",["mcaddon"==e.form.export_mode||"integrate_mcaddon"==e.form.export_mode?t("label",[e._v("The packs have now been exported to your selected destination")]):t("label",[e._v("The packs have now been exported into Minecraft: "+e._s(e.edition_options[e.form.edition])+". Enable the packs to test them.")]),e._v(" "),t("button",{staticStyle:{"margin-top":"8px","margin-bottom":"24px",display:"block"},on:{click:function(t){return e.openInstallInstructions(e.form.export_mode)}}},[t("i",{staticClass:"material-icons icon"},[e._v("help")]),e._v("How do I install packs?")]),e._v(" "),"none"==e.form.spawn_egg_mode?t("p",[e._v("Now you can spawn your entity using the command "),t("code",{staticClass:"code",on:{click:function(t){return e.copySummonCommand()}}},[e._v("/summon "+e._s(e.form.identifier))])]):t("p",[e._v("Now you can find the spawn egg in the creative inventory and spawn your entity!")])]),e._v(" "),"mcaddon"!=e.form.export_mode&&"integrate_mcaddon"!=e.form.export_mode?t("section",[t("label",[e._v("Let's continue editing the entity!")]),e._v(" "),t("p",[e._v("After you close this dialog, you will be able to edit the model, texture and animations in Blockbench")]),e._v(" "),t("p",[e._v("You can edit the behavior of the entity using a code editor, Visual Studio Code is recommended!")]),e._v(" "),t("button",{attrs:{id:"entity_wizard_launch_vscode"},on:{click:function(t){return e.VSCode.open(e.behavior_pack_path,e.resource_pack_path)}}},[t("img",{attrs:{src:e.VSCode.icon,width:"22px"}}),e._v("\n\t\t\t\t\t\tOpen in VS Code\n\t\t\t\t\t")])]):t("section",[t("label",[e._v("Now let's edit the entity model!")]),e._v(" "),t("p",{staticClass:"description"},[e._v("After you close this dialog, you will be able to edit the model, texture and animations in Blockbench")]),e._v(" "),e._m(6)]),e._v(" "),"npc"==e.form.behavior?t("section",[t("label",[t("img",{staticClass:"dialogue_designer_icon",attrs:{src:e.dialogue_designer_icon,width:"32px"}}),e._v("\n\t\t\t\t\t\tCheck out "),t("a",{attrs:{href:"https://jannisx11.github.io/dialogue-designer/",rel:"noopener"}},[e._v("Dialogue Designer")]),e._v(" to create an interactive dialogue for your NPC!\n\t\t\t\t\t")])]):e._e(),e._v(" "),e._m(7)]):e._e(),e._v(" "),t("div",{attrs:{id:"entity_wizard_navigation"}},["metadata"!=e.open_page?t("div",{attrs:{id:"entity_wizard_back_button"},on:{click:function(t){return e.previousPage()}}},[t("i",{staticClass:"material-icons"},[e._v("arrow_back")])]):e._e(),e._v(" "),t("div",{staticClass:"bar_spacer"},["next_steps"!=e.open_page&&"spawn_egg"!=e.open_page?t("div",{attrs:{id:"required_message"}},[e._v(" = Required")]):e._e()]),e._v(" "),t("button",{staticClass:"confirm_btn",attrs:{id:"entity_wizard_next_button"},on:{click:function(t){return e.nextPage()}}},[e._v(e._s(e.pages[e.open_page].button||"Next"))]),e._v(" "),t("button",{staticClass:"cancel_btn",on:{click:function(t){return e.cancel(t)}}},[e._v("Cancel")])])])]],2)};e._withStripped=!0;var t=a(5825),i=a.n(t),o=a(5939),r=a.n(o);const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAAgVBMVEUAAACWsLt4jpcCAwNJlsOSUFCESEhhNTVCiLBCiLExZIMwY4FiNTWESEgEBQVOjrSMZWiESUkwYoDX4uaZZGJiqsySUFBJlsOkwc1QnMaXXVvT3+TF1t2rxtGmw85Zo8m90dlep8uUV1ajwc2Js8pancWen6iVZWhLmMSUVFS80NiRr4FFAAAAE3RSTlMAzE0BgIDAQMDAQEBBvwJzdnBAQCJZxAAAAWxJREFUaN7t1FlOwzAUhWG3gc60DJmadGKG7n+BOLYqRz2SFR5sX8T5V/Dp3MSKMcYYY4wxxhhjjDHG2HXZeDQaZ0pKmlPrpJAMZ7/b7WWQ1pbzpLOktUpZ5jhdyVZCjgRSjyOCdMUBkooXrpNsJeRIIPU4EkjrYZwo7xKuk36lzdtrXZ/boaD2XNf1x70K1031rkmHUzuIczpozmd5qwJlQBWS/JwyNAhIfk5w0Pa4BZKH8928hAYVBZA8nDyPAAKShxMFBCQPJxoISciJCEISciKDkAScuCAkAScuCEmOkwSEpAtHAMiSLEcIqHjuQHlOEEF/EfR1/B2oKYOCNlXVIyEIOboHFbDFrE9CEHImUxW2pSMhCDkrFb7F3JEABJwYZbCSAeGxMhU8XMmBUqyDJAQZzt1Uxc8dzoFC/lnDV3Igu85KRQ5XMqAm0bGQZNIW+ymnzxyuErHOpcdZB5pI4XQt56I4jDHG/lM/DvyfGkXuxs4AAAAASUVORK5CYII=";var m=a(4462),s=a.n(m);const l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABZElEQVR4Xu2XPUpDQRSF54GgkN48iARFIVtI7yJcgpsxFqZKlRXYuYiQOo0QyA8GXsQ2hZUyVmkCczmNnPelvofhnPO9O5MqBX9vi81PRDIdjSPj6XX6VIUE4nD4sBzA8O6q6NjZ8iPlAHrdumh+t28IAAL4BNgB4b1UtGBODIUPYwlyC3AN8g5o/UMosnX//VP4vhmF3vb14jHiP03mL6H5s4ev0PzF7XP4Jjs+oMoBDLuXRYfO9p8pB3Bdd4rm183hL4DOTb9o/rDaphzAeW9QNP+9e08EAAF8AuyAooVx6r8AS7Dt16CCj4NWWiAEYJAABBiUKFmAACk+AzEEGJQoWYAAKT4DMQQYlChZgAApPgMxBBiUKFmAACk+AzEEGJQoWYAAKT4DMQQYlChZgAApPgMxBBiUKFmAACk+AzEEGJQoWYAAKT4DMQQYlChZgAApPgMxBBiUKFmAACk+A3HrCfgFq4gYUP/zkAUAAAAASUVORK5CYII=";var A=a(2813),c=a.n(A),d=a(4815),p=a.n(d),u=a(8397),g=a.n(u),h=a(4384),f=a.n(h),_=a(1568),b=a.n(_),v=a(6040),y=a.n(v),w=a(5154),B=a.n(w),k=a(2711),C=a.n(k),Q=a(1333),E=a.n(Q),I=a(1833),x=a.n(I),D=a(8965),S=a.n(D),z=a(4774),M=a.n(z),U=a(1864),R=a.n(U),j=a(487),G=a.n(j),O=a(9231),J=a.n(O),Y=a(2032),F=a.n(Y),q=a(5622),H=a.n(q),V=a(5727),K=a.n(V),N=a(4971),T=a.n(N),P=a(6600),W=a.n(P),L=a(6498),Z=a.n(L),X=a(203),ee=a.n(X),te=a(4271),ae=a.n(te),ie=a(4980),oe=a.n(ie),re=a(2902),ne=a.n(re),me=a(9868),se=a.n(me),le=a(1326),Ae=a.n(le),ce=a(859),de=a.n(ce),pe=a(4017),ue=a.n(pe),ge=a(6880),he=a.n(ge),fe=a(9446),_e=a.n(fe),be=a(2767),ve=a.n(be),ye=a(5129),we=a.n(ye),Be=a(2903),ke=a.n(Be),Ce=a(5409),Qe=a.n(Ce),Ee=a(8472),Ie=a.n(Ee),xe=a(5076),De=a.n(xe),Se=a(6010),ze=a.n(Se),Me=a(9388),Ue=a.n(Me),Re=a(9877),je=a.n(Re),Ge=a(4043),Oe=a.n(Ge),Je=a(7508),Ye=a.n(Je),Fe=a(5118),qe=a.n(Fe),He=a(6587),Ve=a.n(He),Ke=a(6609),Ne=a.n(Ke),Te=a(9407),Pe=a.n(Te),We=a(8839),Le=a.n(We),Ze=a(178),Xe=a.n(Ze),$e=a(9694),et=a.n($e),tt=a(6207),at=a.n(tt),it=a(9471),ot=a.n(it),rt=a(816),nt=a.n(rt),mt=a(9830),st=a.n(mt),lt=a(662),At=a.n(lt),ct=a(6500),dt=a.n(ct),pt=a(6169),ut=a.n(pt),gt=a(6451),ht=a.n(gt),ft=a(247),_t=a.n(ft),bt=a(4647),vt=a.n(bt),yt=a(7528),wt=a.n(yt),Bt=a(7230),kt=a.n(Bt),Ct=a(2710),Qt=a.n(Ct),Et=a(5620),It=a.n(Et),xt=a(7793),Dt=a.n(xt),St=a(1955),zt=a.n(St),Mt=a(3084),Ut=a.n(Mt),Rt=a(3730),jt=a.n(Rt),Gt=a(2059),Ot=a.n(Gt),Jt=a(8741),Yt=a.n(Jt),Ft=a(6428),qt=a.n(Ft),Ht=a(5392),Vt=a.n(Ht),Kt=a(2510),Nt=a.n(Kt),Tt=a(5491),Pt=a.n(Tt),Wt=a(5111),Lt=a.n(Wt),Zt=a(9636),Xt=a.n(Zt),$t=a(6494),ea=a.n($t),ta=a(8486),aa=a.n(ta),ia=a(4682),oa=a.n(ia),ra=a(7953),na=a.n(ra),ma=a(9693),sa=a.n(ma),la=a(331),Aa=a.n(la),ca=a(3795),da=a.n(ca),pa=a(836),ua=a.n(pa),ga=a(4730),ha=a.n(ga),fa=a(6285),_a=a.n(fa),ba=a(3185),va=a.n(ba),ya=a(6341),wa=a.n(ya),Ba=a(4597),ka=a.n(Ba),Ca=a(5225),Qa=a.n(Ca),Ea=a(7457),Ia=a.n(Ea),xa=a(8966),Da=a.n(xa),Sa=a(3684),za=a.n(Sa),Ma=a(9930),Ua=a.n(Ma),Ra=a(7718),ja=a.n(Ra),Ga=a(1165),Oa=a.n(Ga),Ja=a(7257),Ya=a.n(Ja),Fa=a(9009),qa=a.n(Fa),Ha=a(9073),Va=a.n(Ha),Ka=a(2494),Na=a.n(Ka),Ta=a(4532),Pa=a.n(Ta),Wa=a(4188),La=a.n(Wa),Za=a(7056),Xa=a.n(Za),$a=a(1195),ei=a.n($a),ti=a(709),ai=a.n(ti),ii=a(4700),oi=a.n(ii),ri=a(216),ni=a.n(ri),mi=a(6187),si=a.n(mi),li=a(9273),Ai=a.n(li),ci=a(2548),di=a.n(ci),pi=a(7308),ui=a.n(pi),gi=a(784),hi=a.n(gi),fi=a(3626),_i=a.n(fi),bi=a(3703),vi=a.n(bi),yi=a(2797),wi=a.n(yi),Bi=a(5309),ki=a.n(Bi),Ci=a(1139),Qi=a.n(Ci),Ei=a(1538),Ii=a.n(Ei),xi=a(7514),Di=a.n(xi),Si=a(4193),zi=a.n(Si),Mi=a(1373),Ui=a.n(Mi),Ri=a(7504),ji=a.n(Ri);const Gi="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAEG0lEQVQ4EQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjmgMdwQiP4QAAAABJRU5ErkJggg==",Oi="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAEG0lEQVQ4EQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjmgMdwQiP4QAAAABJRU5ErkJggg==";var Ji=a(4577),Yi=a.n(Ji),Fi=a(8387),qi=a.n(Fi),Hi=a(910),Vi=a.n(Hi),Ki=a(2533),Ni=a.n(Ki),Ti=a(1613),Pi=a.n(Ti),Wi=a(7399),Li=a.n(Wi),Zi=a(7010),Xi=a.n(Zi),$i=a(6046),eo=a.n($i),to=a(9509),ao=a.n(to),io=a(8985),oo=a.n(io),ro=a(4010),no=a.n(ro),mo=a(5100),so=a.n(mo),lo=a(4627),Ao=a.n(lo),co=a(2109),po=a.n(co),uo=a(5580),go=a.n(uo),ho=a(9296),fo=a.n(ho),_o=a(65),bo=a.n(_o),vo=a(4037),yo=a.n(vo),wo=a(1566),Bo=a.n(wo),ko=a(7720),Co=a.n(ko),Qo=a(3373),Eo=a.n(Qo),Io=a(6243),xo=a.n(Io),Do=a(7111),So=a.n(Do),zo=a(8003),Mo=a.n(zo),Uo=a(4784),Ro=a.n(Uo),jo=a(5802),Go=a.n(jo),Oo=a(4528),Jo=a.n(Oo),Yo=a(2688),Fo=a.n(Yo),qo=a(7615),Ho=a.n(qo),Vo=a(8207),Ko=a.n(Vo),No=a(88),To=a.n(No),Po=a(3514),Wo=a.n(Po),Lo=a(3783),Zo=a.n(Lo),Xo=a(621),$o=a.n(Xo),er=a(280),tr=a.n(er),ar=a(2592),ir=a.n(ar),or=a(2735),rr=a.n(or),nr=a(4223),mr=a.n(nr),sr=a(5937),lr=a.n(sr),Ar=a(2725),cr=a.n(Ar),dr=a(7582),pr=a.n(dr),ur=a(3832),gr=a.n(ur),hr=a(6068),fr=a.n(hr),_r=a(4750),br=a.n(_r),vr=a(4891),yr=a.n(vr),wr=a(8097),Br=a.n(wr),kr=a(4719),Cr=a.n(kr),Qr=a(1569),Er=a.n(Qr),Ir=a(5264),xr=a.n(Ir),Dr=a(4452),Sr=a.n(Dr),zr=a(9839),Mr=a.n(zr),Ur=a(1217),Rr=a.n(Ur),jr=a(952),Gr=a.n(jr),Or=a(9412),Jr=a.n(Or),Yr=a(3680),Fr=a.n(Yr),qr=a(5324),Hr=a.n(qr),Vr=a(9271),Kr=a.n(Vr),Nr=a(8539),Tr=a.n(Nr),Pr=a(8688),Wr=a.n(Pr),Lr=a(5976),Zr=a.n(Lr),Xr=a(7775),$r=a.n(Xr),en=a(1687),tn=a.n(en),an=a(9170),on=a.n(an),rn=a(3828),nn=a.n(rn),mn=a(5069),sn=a.n(mn),ln=a(1987),An=a.n(ln),cn=a(8706),dn=a.n(cn),pn=a(5722),un=a.n(pn),gn=a(9597),hn=a.n(gn),fn=a(7597),_n=a.n(fn),bn=a(1652),vn=a.n(bn),yn=a(7043),wn=a.n(yn),Bn=a(9880),kn=a.n(Bn),Cn=a(2202),Qn=a.n(Cn),En=a(936),In=a.n(En),xn=a(1546),Dn=a.n(xn),Sn=a(8575),zn=a.n(Sn),Mn=a(4541),Un=a.n(Mn),Rn=a(7815),jn=a.n(Rn),Gn=a(5701),On=a.n(Gn),Jn=a(7920),Yn=a.n(Jn),Fn=a(600),qn=a.n(Fn),Hn=a(1239),Vn=a.n(Hn),Kn=a(5373),Nn=a.n(Kn),Tn=a(9872),Pn=a.n(Tn),Wn=a(6400),Ln=a.n(Wn),Zn=a(704),Xn=a.n(Zn),$n=a(2162),em=a.n($n),tm=a(3255),am=a.n(tm),im=a(431),om=a.n(im),rm=a(6123),nm=a.n(rm),mm=a(9520),sm=a.n(mm),lm=a(4354),Am=a.n(lm),cm=a(2728),dm=a.n(cm),pm=a(8312),um=a.n(pm),gm=a(6615),hm=a.n(gm),fm=a(759),_m=a.n(fm),bm=a(9165),vm=a.n(bm),ym=a(7719),wm=a.n(ym),Bm=a(7534),km=a.n(Bm),Cm=a(2416),Qm=a.n(Cm),Em=a(1921),Im=a.n(Em),xm=a(3823),Dm=a.n(xm),Sm=a(1369),zm=a.n(Sm),Mm=a(4381),Um=a.n(Mm),Rm=a(9854),jm=a.n(Rm),Gm=a(7808),Om=a.n(Gm),Jm=a(927),Ym=a.n(Jm),Fm=a(8203),qm=a.n(Fm),Hm=a(1704),Vm=a.n(Hm),Km=a(7250),Nm=a.n(Km),Tm=a(2998),Pm=a.n(Tm),Wm=a(2482),Lm=a.n(Wm),Zm=a(969),Xm=a.n(Zm),$m=a(2869),es=a.n($m),ts=a(7359),as=a.n(ts),is=a(4931),os=a.n(is),rs=a(3904),ns=a.n(rs),ms=a(410),ss=a.n(ms),ls=a(834),As=a.n(ls),cs=a(5398),ds=a.n(cs),ps=a(8725),us=a.n(ps),gs=a(4361),hs=a.n(gs);const fs="data:image/png;base64,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";var _s=a(3967),bs=a.n(_s),vs=a(9005),ys=a.n(vs),ws=a(4288),Bs=a.n(ws),ks=a(1424),Cs=a.n(ks),Qs=a(8996),Es=a.n(Qs),Is=a(5172),xs=a.n(Is),Ds=a(4021),Ss=a.n(Ds),zs=a(9807),Ms=a.n(zs),Us=a(266),Rs=a.n(Us),js=a(1654),Gs=a.n(js),Os=a(5219),Js=a.n(Os),Ys=a(3883),Fs=a.n(Ys),qs=a(3140),Hs=a.n(qs),Vs=a(1154),Ks=a.n(Vs),Ns=a(2079),Ts=a.n(Ns),Ps=a(5383),Ws=a.n(Ps),Ls=a(5936),Zs=a.n(Ls),Xs=a(46),$s=a.n(Xs),el=a(5096),tl=a.n(el),al=a(1300),il=a.n(al),ol=a(9071),rl=a.n(ol),nl=a(4179),ml=a.n(nl),sl=a(4692),ll=a.n(sl),Al=a(4079),cl=a.n(Al),dl=a(3101),pl=a.n(dl),ul=a(1363),gl=a.n(ul),hl=a(507),fl=a.n(hl),_l=a(7173),bl=a.n(_l),vl=a(533),yl=a.n(vl),wl=a(1994),Bl=a.n(wl);const kl="data:image/png;base64,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";var Cl=a(6342),Ql=a.n(Cl),El=a(4322),Il=a.n(El),xl=a(6537),Dl=a.n(xl);const Sl={};Sl.basic={name:"Basic (Still)",behavior:i(),entity:r(),model:s(),thumbnail:n,textures:{default:l}},Sl.basic_walking={name:"Basic (Walking)",behavior:c(),model:s(),thumbnail:n,textures:{default:l}},Sl.vehicle={name:"Vehicle",behavior:p(),entity:g(),model:f(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAACaUlEQVR4nO3aMWhTQRgA4D8SUOgiCjZQEUXFVejS3dWlIDg6OIiTYDcR1KWTddBBHErpUFwUl4y6FyeHLIJgFQtpcXAp6lSnpL6Y17xX+5o0931bfu5dbvjh7r/7a1FQs/Vlu198aeFZ3/Gvlx7X/mfesvLWUVbRdY+LepnBMxdOZ36vfvoWERFTk41MfH2jXWoRvfOWlbeOssquexwcGfYCGC4JkDgJkDgJkDgJkDgJkDgJkLhS9wCdertXivXzuKhfaS8Uuol72TrZN7588UT/+Px8Zt769e99x739WeTfqUo9ImJm8tSug1Y3NiMi4mxjIhNfa29FRMTEuTO7fr/1+WtERBydupSJ/17/WGKpVMEZIHESIHESIHESIHESIHESIHESIHH1iJ06f5BO3d+rU+cPou4fPfV3jblaxOCev1/xMBPv9M6tFP2ne/3DzdadfekJZG9sAYnrvgUMuuvvvctfuX93OyLi2PknSXXRjpvMa2DeXX+Hu/zxYwtInARInARIXOYMkFfnd9jzx0/3HiBiru+Abp2fU8dzuNkCEicBEleqK7gqed3GZelOLq9WtCu4Ko3WrX2Z58X7p/syz17ldT2XddA3q4W6gquyurEZP57fyMQuP3pV6NsPD65lA9PTA7uTq5LX9VzWMKqskTgDNBdno7k4e2DfsWMkEoDhGYlD4NWbbw70O3YMPQGO317+5xWyiL/PCmvtrYghHwIPK1tA4iRA4ko1hVZl0CNUUUWbU6visQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg0PkDW7OdcDUbPUwAAAAASUVORK5CYII="},animations:b()},Sl.armor_stand={name:"Armor Stand",behavior:y(),entity:B(),model:C(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAACtVBMVEUAAAA5Lh0FBQVFOSFKPSYxJxcZGRkEAwNaWlpvWjZXRitTU1MuLi4/Pz8ZGRkKCAVPPyRIOyIrKys6OjqEbEMpIBIpIxcBAQF7e3t3d3d0XjtlUjBvWjhSQionIBOmh1Z5eXl+fn4xJhVqVjZfTy9OQCZaWlpXV1dVVVUoIBM1KxsPDAd1WzOBgYGAgIBYWFhbRyiNckd7ZD5bSy83LBlWRipCNB0vJBRWVlYsIhNaSTBVRCxSQioeGA0yJxaIbkeYeUxuVTBcRylZWVlVVVV1dXVxcXFxXjecflJIOB9lZWVWRit8ZT9fUC9ZSS06LhowKBw3LhtANCAQDQiTdkyMckSUlJR/aj5fTy6ZmZmbfk5uWTllTixpVjOQdEg+MBqWlpZ0XjtiYmJ7e3trVzWgoKB0dHSSdUuNjY1mVDJSQCN3d3e0kl6NckWLcURtWDeenp6nh1aOc0aEbUFkUjGZfE1+Zj9aRieqilaUd0uIb0J1Xziwj1mYek2CaD99Zz2YmJiKcUNUQyZHNx6GhoagglGegFBqUzBgUC9MOyFAMhuQkJBsbGyWeU2RdEmHbkNcSSmcnJyampqPj46vjlmVekqJbkZwWzpoVDNrVzKAgIBlZWWafU2Pc0mHbUF1Xzt7YjpyXDp3XjhtVTFiUTBeTS1KOSCFhYWReEZ7ZD54XTRYRSaSkpJ+fn2lhVR3YD5wXDZeSipPPySNcUd8Zjx6ZTt3YTp0XTdxWDJnUi9iTy9hTCuIiIiBgYF1dXWsi1mRdkiFa0OCbEB4YjxwWzhwWjVuWTNpUS5XRSiKioqCgoJzY0eAZjx5eXlycnJvb2+XfEl+aT14YjlzWjR7enmtjVdsX0phVkWCaUJ6YDZDNR2OiYOIhYBzaFmihFGEc1COeVhVSTdeXl58b1t8a090ZUhxX0TBuLYYAAAAVHRSTlMAfgt+fn44B+nKyrd3dDQQy75vbMF+QAL+/svKvr5E7+fjy76+vrq2sWNNKfnq6OXjzMrKyr6+vru0gIB7e3Tw7Onp6Ofl5OLg4NjUwb+6t31qXB8oqI9rAAAJC0lEQVRo3s3aVVcbaRgH8GlL293tbtt1d3d3d/d3mGEshARCAnEnVgJJSIIEl+LuxYpDcSuVrWy3a13/HPtMSg8Xe7vM5H/gZm7yO+/7SHIS7P/Jvlc/emUfFjPZ9+qd6enpd8YO6bYj6Xx8X2AxktuQy5buqyOvxmIk9yIDbiHJ2AHdZ9TgDjJHeT8WI7mPIIwOspmNGdDzHoLoI5uVL2AxkquZyqG+loHQi1iM5Gqmy7sSkkhiBnRvo1WVJQl5b8fEze7NOVRW2Rpslj6PiZl9r9153Q3fPHJjdA4hNE8qpSKeEHDe0p/tdVG2p4F0n7EGQCaTmIMxzverj3LZq/VO59OPfE5kGOZFntRx/hI95bM5nSUlTufMXAZMarJZzMEYR/miK/6IXm/71YDXZjpaxmkxa2iH3e/323iRv70dx43EknVCdBBF+W29pe3t1SONBID6x0VcHQCizGaKMs9l+kvSG5nR+iWr1frUHTdiYiUuj3Ihu8tMEHn6dG55tDNgtfbXOq8TjbQD5eUhBcedIhCy9x5Rnw9E6n22kt6Tt4lE2mlBgwU13CAT4FANl9drs9uO6H1QUCf1192AiZCdozWDBGHMZBiNIZ9TIJc+3Xayvb0UTsnpFIO0LcCMDBHEUNeEBlcoFAihmkw4HRhLeltJiU14UpzZHZgY9wypVHOZPEeBNESBPj3dadPzN0f5HsaETRy0fL1cOuxVfUcU5CPEGQoII9QSv0tKfj1pc372KCZodpRS1IxUuqCs/I4ggMTh9YF1juPssN6oeXmBb3YbJmh24Jkc1yAncwgCnyP48q5nTqsNHEf5LWUdclZLCw7KIIZYJZmj0LiqCf6UFidO42pFPkWV1yCpOKDDURAy2IdNfR6iUjWWqUYIQIPigPDMIRNJ5nBIjVeSykrPkmqCMOYDiM5Q19G00KBtGTjuJskWr0bN4fIcJTvnOjXGl3c1gHAAaXdigmZbZ32tu2UlFMqEudjHsuxhe7VZA7WE8io0hjpazgoOGmUCA62SUNO6AjlYZWQJzzRwDQ4PQs2D6JDwoLjM00x/sHXAxDBNsw3jqmBltMormufzTWUAMkWEBlHcyMSKnKabGIbpt6qCixttR3Z2LjdWqLxWwUEzhEcqpWlzbRMTsUZMh6HtPHzb1Z5fZlRBb7/AXRZn5wDUIJdXU8g9pmTZkVocJ6DtBsxmx7LKW0ELDUKchijXsvK8ajsUNSs/3Xne7W7xhkJmyujRSssFH4ywTo20tsLEv/dwyLX0CLTdWBDaTl1qJOalC3Lhl2uGURtdHQiaiqZn1Z3RtqvQ4DUFdeVyVoxdBp+e59QcD5KbPNSMg7FqaVqNK6Jz6CtM0FzPDBGnSJOvRI2ruTroro7qjbZT5OejQ3B2Arf99aquyj5vkPLP4DguJ0ll2aW2UyC1YSGHFBp0x8ddTETSSlGU2Y3LlWW9fpSvcUPbsY2D/Ponvddjwmb3w09FQl9mwDvZpqbZXr2+mttoO4YZqa30/igRGsSTHv0WPkmbmxiDv1dv3mg7cgx2SVAiAZAI2fchgVCAMVCU336x7UhlTf0ykyUJjm/DxMjur98EUJmZotxN69B2Ss1ZOypdX6ngJ7U4ubWgiSlAeWY301g6pznrPItQNWWRiggiauvLEEIWppGifDaXRYFclKWBFg10OZGBWyw1PAguznXoEOwS+zCrFQ10iwLHO7QVdfXMCLKXug7VqfMR/zGoXDQQMuDDMJg99Y2ohjCW0xrckC+VN0jFAl3hNuAOsmXlMM4ByEPTGbBL6ugG6U5MnOxnJhpHvFnBegD9MOzRfvrYei2AWrJex8TJFUyXqlXyY9CiABBdkbP/sc7l06YsiUQs0DOGMfiubEBehjh1B9TS/jfeXmbA8/KjmDh5hqIyIhFWuvgDFDcs+eew7W+80/ryLkys3ALTp4NkF8aYwNAwLPl74Nn2vZh4uRxXuzpaWsgALHkvLPnnMHEDICOxaI2Qs7OjjErSOn4FJnJ4UKW1v6IMudQmUwMdAyBNbaV1nAYQVSaNAdCtGhxftI5rZ1FedVnDgvig/YFTmsUu1Y8dCKEfWHkMgJguayQkkTg4hCysvPxZTOTcOtqlgsE8YMFxziJfkIoOuhyvHcsaqJC6Ycl76HLpfkzcAKiUckul0sbzbo0Flvw9mMi5Jb+UKoDvPEY7mwIBuDuRQbse+A0ZZtxKknSvN8GklrSee+kGTLTs2nPzmQsK/h0jmaOhBhdVWf3So9M3PyDSqt/14M0paZMXiAIN//szNeVCdaRS+ld3lewmMUhwOrKq1MT4CwT/+zMTW5CXhzpIpfbvZB2Qjr0kMGnvnhO5x1cPJCQUHnV8B6DmFQtCqMPEskcLk5N14TMpKXsEJO198CZZT3ZiAniS/2H6l5YGQpJ5xE9qAPEPkwuz04Qj7X3oJllVOD4+PhFOqOhPJjqpQx34oMLCKtmjvDMhXFw8yZMEeOsY5RTrknWJG6Sfvldlhc79/BtuJIZzmtmj8BREB+BvFUgPbjXpoZSU6bUDCUVFPGfj/+dfipN13zuMfC1FfuefJEAdFQGp6phMtgfb0qS2HUtJkRXDiyXqkpPhxcEEF6dL/l414ehbaZX8nlyYCM+KwBOWpaQcz03CtjSpqaltaTwJJEXxxcXdl2rpF1WEsQazJOfAWchDw1My2fGDSUlbDLr27tTUKRlPWo2P7w7HJyRs1hLTFTzXA/fFk1KrZLK0XPA8eQ22tdl97d1TPZNtaSdyp1ejNRQuDl8i/fIz3GR3OJzYnZZ7fDr34MGDT16zHdvqAOmDydRJ2fEzbZPhBJ0uMQzXFi2lwouV3L1adWY6Nynp4MHLhOBsnNLkWlt225RsLRH6KQEw/MUd0PHNFV7jLyvpjyRBOJuk99uys9d6jk33xOsKEyAbpO5jJ9LS4LKS3hOKs0m6Kzs7uwrKu6cYMHBhuqL41KnpE3wlRy9L8Gy/iidFh0AqlFBhcsJqFVwWNPq7VwrO2SRF51LaVHF88dpUW9UJ4FwmBmeT9ASMyuwemayHL2XxOP8lxQjnIulxIKXFCucSKS12OBdJn/xPnH8BGVtgPjDo3IIAAAAASUVORK5CYII=",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQXSURBVHja7Vq9ihRBEJ53EARB8AXMxdAHEDQQxEDhknsARTbSRcTDSNmTyxbFDVwjNxA0uMjA/B7C52itOb/l26J6anp79qbndhqK/qve6fqqurq7eqvqf/r96TAIfX//qKZKpV/zg/Dx9d2AfJv+z6/ur3mq0pIHwNPHt+uJI0/tl9/8+vZhtL+39PPDkwD69u5BrSGQ1IVOnt1Z1zW/5Kx9Jt2GMfiO1HsHQAvNgkNAzi1eDSByBk6DB/7eAZBJCr04uBUO791ck9TRp/uljLoGgsGTcVpgDWLvALB5Clmm3GTWGhQLTO7XPEX4ANYiyilmba3xJhDBW4QF6PXNZtvGrJnPc6gaZPmt3gHw1rxn1pZ3jzlUbWFFWEAIoZE8s7YAjDlUdp6gQQDQZNZtnSw7UPYbxQPgmbU3XjtU7VOKB8Az67YWZAE5CB+QS9qhakdaPAC7BmsEoJQEh5VDKUB1HU/wxreygFwAcjSfG0/wxhdrATquoMm7bmffNWAyXRE+ngIAnw108MW7bmffNboEABNOASAWZYIg3nU7+67Bx9RcgkZSAOA7gnXo8q7b2XeNvrcxL6boXbc7uWsIanoNow5UuV/zgA/5NvGIJifXdN3Ovmtg4qwJFlh7Zy04h9IYhLaW4zk577qdfdfY9V3AA8BzcrwUrPhlZ3cNmVRT8DPWJiQPKtInOercBuJvaR8Qc3I6pK63vWxfxUwQgLczJm6ztBHjByjeQchycmzaVvyyM2cNACztWVpuYx26zbIAz8npdwjtDzp9F2DhoD05g7NG8XaIMboOIXgcj4VFNAVlWdidb8s8SRZKJqG3KG4TXhZSjwUwPBb9RT2OWkdZmJ5ljhbvNmOroSRtYkdHR2E6nW6QtHXVPggAlstlWK1WJs3n87pfCEKl8A8CAJn0YrGoCWUIAWElh6ZT+AcBACYMYgGZAEAK/2AAEOLJW+Y9mUxCKn/xAMg61SbMdTZ1OLoU/kE5wZg2IRyWQAp/8QCImca0yU4NJp3KX/zTmGjJcmBNTjCF/8IfUrYBAObM+7je3qRvNpuFVP7iX5KwptmB8brmdvYBbfmLPxrr46usW2i6zXHX479wgSztMOlDCx9hYdqWQ7P2fiYsA/392I7Bc+Hfr8Y0pjFlb4Mcm9Oxfo72NL0JDh6IvQWAI79C+PenLrflGxwAWtsIXnLZsooY3+hULkOy/hS5VwDwC1Hyv64uQ9LvfHsHgLXl7a0PwMPk6Bl7PKzumDY+UhmdqfXuAbjyMvz5UdXEZdTRxmWuN45XSHeRdw7A2Zd/v331eE2xupeb44cAQHVtGU5PznOUrTrarH6dr/sjgpS1BK6f1rR8U23ksfa2eU0RgZo0G6vvDIDj5+dU3TirCXW0eblVBv0FQMwNT8+BndkAAAAASUVORK5CYII="},animations:E()},Sl.allay={name:"Allay",behavior:x(),entity:S(),model:M(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABo0lEQVRYw+1VsUrEQBDdT7AXLKwUDisRGwUtrDzwI/wQweIa/+BSXGdh6Q+cIIiVWqhctLARVA6bFAoGRt7KWya5PS4bLglIBh6zs5md9zK7mxjjse3XD+km33L4I9YjXjl/m4ApaMs3EpRvSE4gRoGl0yeHYAFXUlyAJifKCOhciwAHI3Fdw3imgKM0S464jICFCxEAb++2rkgnovSPlORRKqXOAFoP7N2KLF4mdg3GmaStly/Zf5cMKIBAnM/BOt9h1bVBSgHwiCcE6IIUg4KMAcT5HIDk7Bbi4FvAwkiAQpLAtAfYRooIEjBt7zcePx059wzFYdrzGUVgXed+nNkCxLq2Pvn6Rph8kibHGIX0FiDO57ATFME1PgF4e30jvJ3QV8zMyfhyPIQ8kFOTQ79ws6zQLVjvDQXQAnxzpioD0W4UC68KxoCd78d2Ds8qEwCy7tnYkfueV9qB1hq31eO7QRH8bwFrvYcBvR5rX5mAzZORJaHnvG+uMgHa+56FGv+etXw/9K+apLWRa7Nf0n6ccLwTxc+NkMNqJW+EsLXW5mm/rBdS0hfxFsYAAAAASUVORK5CYII="},animations:R()},Sl.armadillo={name:"Armadillo",disable_on_edu:!0,behavior:G(),entity:J(),model:F(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:H()},Sl.axolotl={name:"Axolotl",behavior:K(),entity:T(),model:W(),thumbnail:"data:image/png;base64,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",textures:{blue:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACrElEQVR42u1YPU8bQRC9f0HFL6BPQYPSE6WDAA0NEg52XCShQSIfIJQyUn4ATRQkKEAk/yNd2iA7EQUuQYgEeeO38jjDsGvfXQh3N54nPe3e7vm8793s7O4lieE29nad23l/4Ym6vF5dPxu0fz668qRr9GX5r8Nj54axMANAORhql+KlCVkNmEkeB1moAbE3EhPPTchjwEQyeYOFGjAqLO/SANwfMyDrs+7VgFgOyDpoyiuh/0DffxcbG0Ba0kDJBG4Gbyt1xichecTzKSGTJDei9AZQJEwndU8S+WHxhyddUz+9+dDqEGJpDYit9aNCXv6usgY8WvjqVl90bnBUYpL3+2f0N0coOfNsjkoJbgRFAG9barbd5rvOrTePNvSpN4CLl0sj+iohsj7fcqG6NCC0VSYDQhujyhiwsnLuQvWxMYAPVA46Sw6Q4iuRAxDyGCxKXs+aAyodAWlzAC1/qiIg7Srg1/W+ATwPqIiAfzEAbzm2DKqJANoJYucH8h0jTQGQDKDrUhuQ9uRHiY+2yrKe9zhd+DfAYUfcUWeA2Nkh7RE7tJ8o7AswFypLEjnMAG6ELPlxO3aqLMwAKZDmNm978HB3MO/pHlnHPdIMukc+jxIpf869fQIzRPB0rvUbrM21PRsLP91GrbcjrJ10ny+3rkHVBnzadw5EKMqy9F917sqAkHhugmoDkIBeNv9mZm4A9anPATT/wVdr7V+vG60u+KZ5eg2OZXJsPGl3ib0T4oDqRUMkyrfPTjwxHT4eXPopgVK96FgyhHiVCXGr/r0rBSPxyRJ9KhMin9+SMAekCEHdto4a8W17yuXpU4MvS7MuJBRt6BuLKJAmqBefJ7RVTYdY2A8Try4i0pqgejqkEaZSvOUAywGWAwwGg8FgMBgMBoPBYDAYxgp/APIqUnv/FcsYAAAAAElFTkSuQmCC",cyan:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACjElEQVR42u1YPU8CQRC9X2Dnv/AX2NrbGqiNNlRYUVgbaYyViY0dRCvjD/CjMMFgYkQJVphgbCxs0IKgnpmTIc9hF+4QubtlXjLZu13uuPdu9t3sep5iEHfPn/5x/SMIOpbnuZOmv3PWDoL7+ZzGovxX69X3h0VsAlDIh+F+SV6KEFWABW/JGLEKYHsjLIAkjyKMI8CcN/8rYhVgVFpOUgAS1CYAjSVWAJsHRBWAfcWUaTT272RtDxA20CBZEBSH20Q7PhMZhzyKgFkgsyTxAnAmLHq5IPpEj85/onfO40wajXFYJFYA27c+TMrjdakVAIsaTNlhxiR/T/fg+/Cx7Et9dYhCcAZg33Lp3jeJSX005rwAkyyPYwO+KfnWTCWxSQBTYZQaAfBB5UPPhADo1tK5o3iAJJ8KD7jNFgMi1OJxVA9IdQYgYTyWArC5OZUBYb8CWPWhDziRAX8RgN6y7TPoTAZwJchVHlaMPAW4H3+XaAHCrvzkklcej7ucjn0PcNgSd9QawLZ2CLvENtUTse0AI1HZyo0OkwAohGxxuW1bVcYmgCTIcxj7cH7bVn9sgngtfhmwZSPF+0xtC0xhQSOzV6V4ypeCqBVuOgcbl93d9dPu2mqlQ+G0ABcP70YDY6OKbYt6Wmi+dIzkUQSnBbhuvQ1819HBE72vNykP4Pnf84AGeQDFZqHWoZhJc3zMl9sc9ex+P5wnTSSRPE0H8gkyS2qdJ20zQzZL5wQg8pIwb3pgy2bppABhgjNFS0cXUctsf40z5gwqhUO/XLwamN/UR2MzkQVsgHIrzN0KcGWrOo1rUpf2Njg5HWTa2+D0dAhDzEny6gHqAeoBCoVCoVAoFAqFQqFQKBQzhW+/9zhmA3i/DAAAAABJRU5ErkJggg==",gold:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACVklEQVR42u1ZsU7DMBD1zNAPoAO/gMTGxsQvMDAzVUgVIxM7U0fENzDyAUh8AAtIDFRi6IAEbDAwGF3EVY+rnTihxMnlnnRKYiep7+X8fOc6Z1jFx822f7naK4zO5fX1dOTvL7YK43a+pr46v+Xvxr7MshFAJgfD7dJ5SUJdAvbHLmhZCYh9ESZAOo8kNCFgc+O3ZSWgKizXSQARGiOA+jpLQEwD6hLAuhKKNOr7d2djA0g1FEgmBMnhY6cVnx1p4jySgFEgo6TzBHAk7LpJYezk2+ygML7mfnYahbHMOktAbK1PCXl8rrcEYFKDIVsmTPJ+ege/h89lW++zQySCIwDbZocjHyKT2qhPPQHrTI+zAb+U/GqhlDhEQCgx6g0BOFA56EEQgGotlbuOBkjne6EBNMjXx51isHheVwN6HQGpGsDipioCUlcBzPpQB1REwF8IoK8cWwbVRABngpzlYcbIU4Db8b5OE5Ba+cmSV543Laez7wGWlbhVNUCsdkgtsUP5RLYdYHRUHuVGR4gAJEIesdyOVZXZCJAO8hzGNpzfseqPRRCfxZUBjyyk+J7WtsAMETxM3BfZ/OTHztwnGdb2qgmICRgLVbYt6rbX+TISVBMg//FBApr84dFLDVjO/yFqQAxPp86z3R6PlqbeaXISnc+esbXtdJUoqiOAnJeO8qYHHlksVRKQYhwpljpqxPPU+SZ9arA4d35xueootVHfIKJAkqDe+fmRe2/jmd6FffR+jRGRSoLq6ZDimErnTQNMA0wDDAaDwWAwGAwGg8FgMBgGhW8QHTbfpJ2c/QAAAABJRU5ErkJggg==",lucy:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACW0lEQVR42u1YsU7DMBDNL7DyD6wIMbLTkb2dGRj6B7C0K6IjIxsDOxJi68pSVqADYyQYQYRepater3bqhFI7l3vSya6dpLmX8/Ods8ywis/bSTG9uJ8b9eXvu6PzYty7nhuP82+aq/JfX4/TosyiEUAmX4bHpfOShKoEnGQHTotKgO+LMAHSeSShDgG72c6SRSVgXVhukgAi1EcAzSVLgE8DqhLAuuKKNJr7d2d9LxBqKJBMCJLDbdKKz47UcR5JwCiQUZI8ARwJh9np3GS482+eZ6dRGMssWQJ8e31IyON9jSUAkxoM2TJhktfTM/g53Jdjjc8OkQiOABy72esXLjJpjObUE7DJ9Dga8EvJr+ZKiV0EuBKjxhCALypfuhUEoFpL5a6iAdL5RmjA036/+B6/F9Riv6oGNDoC0GHsSwJkcqQiAkJ3Acz6UAdURMBfCKCv7NsG1UQAZ4Kc5WHGyEuAx/G6pAkIrfxkySv7dcvp6GeAZSXuuhrAVzuEltiufCLaCTA6Klt50OEiAImQLZbbvqoyGgHSQV7DOIbr21f9sQjivbgzYMtCis/Z2hGYwYPn42FO9tYdLRmPk6kmwCdgLFTRjqi3vc+XkaCeALmvo4Infa63KQ2Q619aK8XxtXv1wzbpDBem3mlyEp2XuqDe6XWiqI4Acl46yocerlYlASHGkWKpo1bxqzOnBh9nl8WkM8hXl8cgp7lWRAE5+tIbLZylvmrnZxnewzbuSfqLz9LgYIfoWnURIcPeB9XLIcQxlc6bBpgGmAYYDAaDwWAwGAwGg8FgMLQKv1kna47WuMdJAAAAAElFTkSuQmCC",wild:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACbklEQVR42u1YMU7DQBAMouEBNHRQUaBItAgkijQUIFEAEl0aKiokKvIE6PgBT+CDhrU00mS4u9hR0NmbHWl1zp0x3rm98e5OJoG/+Hx9bBbzq9bsWn/fXp428+vz1jCP37bW5399vT0070+zxsaUVSHAXsgc1Zf5/nhu59V5JaEvASf7B0mrRgA7r7sDAtR5JmEdAvZ2dpesKgG5sMTcJgkwQnME2FoVAizUc2cSBOQ0oC8B0JVUpNnavzuLF9BdLwkTr7FAghAmB+OgFR+OlHYdIqi7xCRwFGiUDJ4ARMLx4bQ1OIndxW+sw2kWxpINloDctz4X9rkcYbQEcFLDIVsSJr3fnoHn4FrnRp8dsgbwsQBJF9OjJkWmzdmaCwJyumC2yfS4GnindNf006fZIghIJUajIYBfVF9atUCF0gUBrNaq3LzbegRMG1gD1PlRaIC9pO2qjXy9SgNwNFxEQEkDUrUAz40+Arr0CDTr4xrCRQR0yQNSBCACcp9BN3kAMkFkeZw24whgnu8bNAGa7iLb03ktefU6VzHmyuhcpVktw+MzruVxl3JX7+ex1F3SnKJaB5gd1VEbHSkCmAgdudxOFVe8VqUcZidwhnmOz3eu+oMI8t/ylyFFlD6rWg8w8Iu72Vlj9nJ/s2SYN3NNgAoXjzDXBOScZxLcR4B+11nBB93X25QG6PlX20px3EpBhLPsvOqCe6dXiaJLDVBH0fTgEWLpNhFaZYiUSB09otS6ctHW6kJAqnuDanBrokC7w66dX8c5V4T0bVq6jIiuJLg+Dl0JCA0IDQgNiDQ4EAgEAoFAIBAIBAKBQGDM+AGhA7lVmhxIoQAAAABJRU5ErkJggg=="},animations:Z()},Sl.bat={name:"Bat",behavior:ee(),entity:ae(),model:oe(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAE4UlEQVR4Xu2az2sTQRTHJyK4hR7SUGmDHhIUS8RL/QHWk156UTwIXjz4x3nwIniQeulF8VAFq/UghoqSXCQFS9pDoSuIke+Yb3iZzP6YZDbt1l0om92dX+/z3rx586YlFXEtXyz3giBQweycLhEe7KkwDBXe6ecw1Hc+v/28U4pq687NRm9/t6PK81XdDq+4OlFt+X4fOeiVK4s9Cs9OOXgIv3fwD8DcbKAhRAkD4VGOAAiTELe+7UeOwSbshbNndHu8vv/85VTfbDNWa7IwhAcQCELh+R0QogQhyOp8oDq74cCS2EZ7J0wtAISvVCqqsXROd93c/qG63a4iBMJxgRILgEKbIFwsAABQ/9ZKXXU6oWq1O6qzu68tBxBcANxYqvYg/GH4Rw9pJjg1gIBnwFlYWFBrbz6lhppoAXPBoe5sL5zRdzkN0vgACQDlN962NABeLgAe37/eg/D4g/CE0N3/rX9Xyqf1/cmLTT8ApPD4DQjSiUGQ6nxZC+QiiG1up3n3cPVqD4JDYAiLO54Jg5bxbP1jegDS29PkccecxZyXAmOQmMd8T58QN3hXJxfXFixAapu/zTpOU4BOypzv1DitgJ1wKnA62CDJAflc6iQAat4GYSwANvIQXsYBUnjTMUZpLisAnPNeAGhn1jd3Cvxy/YO6fKmi6rW6ng4bm0315WtX3V29NnCGUvsMjEwQWU0BOkD6BNmvkwXQBxCCadr1WnWwfpuQbIGRCcCnc5RTgP3QGU4EQAvfD3HZEIRttVtD8sAaTKcoNe8SIKXx+mYZBjpc76OmgZMFjDOQo65jAzG2BaDio3vLOlqjdqOCnnHC1yxhRYFwtoC8AiBcE4QzgCy1NM22uVl6v91JHwlGDdDcwyPchRM0AyPWf/66nbrTLKEAgpfdIJZHJDCw/cWF+Y+4HzGBGTfAd4wLwHXAvuElZnHk0gYAiAtk2EzH6QpAzlsXk50aAFgANc9OsYevny8PhccMjtIAkNkcruUIZFy2r1MFgOBI7t1pAbZBPF3bivUBdFBIWHDfjnawhXXZvk4NAJygjPq4R5AbJA4mjQ8AgEajoYVnUoP1XZYt7wAe3K4NJRkn6cC2V8DUiBMe/R05AER+cnlLepaQzLImQBPApNvXSRRkq1uiqUN7Mu0ln1FRpseYMWKKTJY1Eym5AQAhscbLvJ80aVtOkETl+QGXSJZ/9a6ppwC9frPZHChinCyudwtg1lYGN1IwOsKk1JdZn+WRESIAmcNH+XFC10wAyCMvdGA+2zqNKyO/MSUWFfEdeSQICzDP+eSzeR6I2EAmQfgcdfeZEvOtfbRXkgC0GQsBpVDSMmwABtOmX591cwGAR1UUAvE/wl5c/M2o0HxvKyvrHXsAiPnlSa+Z1yMUnuXpJbF/rmczSfObz6RoJlOgthh4iwRtAywAOBx/Z6HhpDaPRRYnaZBZfh8BgCmBbS+uaZ36ZilgUtsjAJgKQ0Wkw467F08SMOn7EABqXx6InnQrGAIQ9Z9hJ9kKRixA/sMTY4TjvpQlmXnc9xEAKEyBGSP8NwAmIZnXukUckFfN+Rp3YQG+SOa1ncIC8qo5X+MuLMAXyby2U1hAXjXna9yFBfgimdd2CgvIq+Z8jbuwAF8k89pOYQF51ZyvcRcW4ItkXtspLCCvmvM17r/6aXpunfHxSQAAAABJRU5ErkJggg=="},animations:ne()},Sl.bee={name:"Bee",behavior:se(),entity:Ae(),model:de(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA4RJREFUeJztmM1rG0cYh591ZGwrUdwoUgqxKcVgKJgG44v/gEChUHIT7qGQlF5K/4beQu+5NKSH0Ca00FJ6C/QDQs+mkDpxDDJbwkaVTVt9dVfWrES1bA/KTGd3JVeBVlKseUCM5nve37wz80oWQ1K4tBKmU6cQ3YB06lSkruwJ3JZI9Fk8neb+LwfWsHOMg9SwDaXRMtWF2K02+3fyk+UXXjob/vGnZ8n0eRf8XzO0AB99eIGF/Dznzq/SqNkq9SttNr8IB/b74Bsvkn9z5WXuPPBUOm4iO7C+thkC7OxtJ3bm6sbqQCu/ffL7wAn0XY7v+iR4gfKA9bXNsJ/hEukBfqXNxddeB3huD4jv+iR4wdDqn3gPiBM/DvodoHNY3OWt7/8CoFL9Z7h8rgtA4ZPJ9oCZQRU7e9vWzt62JYVYyM8n2jRqdt/yQdx5YFvH5cfBQAEk+r0gb349r5PPddXnReFfBZDozx8QEeLi0nLfPnr5+tpmKL1pkrAKl1ZCgK++fIN337nPp59fVmk/4iLEvQBIjLP19g8AkQhSD6REN+DrR0/GchxmAOqiQ6NmU/aE2tl+6UbhZ+UJjZrN5fePEm3073K8uuioCcteL2TWxYiH1qMkJRfnV9qqUC5SvvO//uQAs9y7nlIGnju/yr3ruzz6rlfnv7qrLkTZXx+3LjqQnmP5bFrVSS/Q24+amWx6DoCqk8FtiYgQ0Lv9r91ucOWGw62lm6q8UbO5tXSTKzccrt1uJF4Dv9LGbQmqTgaAbHou4vJlT6i8XMM4mKmLDm5LYO8XVWFciHrTJZtZ5G5hK9L5bmGLbGaRetNVZdJwib1fxG0J6qKD6AZAz+WlJ4huEDkioybltgQlv7ewkh/w9HHvLqo6GXI0WcjPKyOzmUX8SluFxHo59IyXO/70sUXJD6hUU5T8gFd4Jkp6Thmcffa930/pUaFCNxnFHR6UKfkB9n6R1tEy0OHjrVkgx+kzZ6g6kKNJ1cnw2XvQOpoFoPhjB7A4PChS8gMePvwtMZk0VDd4nMYbhsX1nNAPgtAPgokLZP53XM+JGD11IkiD/SAIpRhxUU48/QyeShF09z/uD5ITjR8E4dQafxzylZi6owHJl2GqRNBfBv3FGO+qRsTUvw76ZTi15//qxup0hsgGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMhheEvwFg2Tfa8nIOyAAAAABJRU5ErkJggg==",nectar:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABGpJREFUeJztmF9oW1UYwH+36/827douQ1vxYSwgDkuN4h7EpyqoD1VktcMU0tWApZ1MZGwgDisNHRtuTHCxg66tsqqrWmSsbP4ZPvggRXBdt0prZGa1rdOkicnaexPJ9fpQ7iF/uq2gLqk5P7ic3O875zvn+853zncJrJHm+i2G024zohNjSa3TbjMat9YZD99dZYz0tie1jVvrjLXaz3pmxo4Ih2fGjhhmQJx2m7F5Y0XaM9LbbmzeWJEWAFO2mi4TKGvtODf6qFFiLaaqxkZo0UtVjQ3vzzbKYqOcGf7tpuM6P/0paQ6n3Wa8971XMdt/sPZ/haQFNGzbbgBMTI2nLcxptxknBo7xUvsraUbOXV0JwDv7drD78CdJut//iAhbmzdWGLd6zwRi8oZt243VHDcxM0DzR6m974GVwYWtzE/uX3MGpO56NmTBmid32m0GwNDIIG3P70rSmRlgkpgJ6yYDUkk9Dol3QCIL05f59vN5APyBfCG3booD0HzCl9UZkHczxcTUuDIxNa6YgSixFgudUtgKQGjRmyS/HanOZtp5uEUATBLvBbMCGH+eEu+JWDfFxbNeuG0ATBLLH6zsvklt3T2rjkmUN2zbbpjZlE0ozfVbDE9/DzXl37Cr9QKDpxpFuxqpQUjNAiDNTsvOLwBwH+yi90AfAGpcx9Pfw96ObtS4zseTVzNyHPIAdr6wj9Cil7mISmjRy9DIoNjhxNbefFFkQmjRS2PHUlof87dS2CrsuQ92AdB7oI/5GxqKouA+2MXejm4Aoc8EeUE1BoDmj/LV+dMAPP5kC7DikOaPMnnexy/fFXC2J19cgFU1Ns725AvdwvRlYXQuohL89Q1ht3PPUYJqDDWu8+HwIQZPD1BtvQs1rgPQuefoHXM4lbzq0iIAAj4LP86Mo/mjSR1KrMW0nQzRdMxHX51HOBZa9NJX56HpmI+2kyFKrMUEIk+LcZo/ykcfHCbgswDgeftVSvM3sLejm0DwGkH/dUZG3wfAXEMmUGbGjhgOl5v9TZUcOhPms+P3s1z0HGWxUVHiHnTMU22pJHgjzMXhOgD+KmrnoR09aXLNHxXjn+36QditLCulurRInHsT8y6wPuLIzB3gcLmZ1XTqm15mVtO5dkXB4XIT8FnEjppOVlsqRYbE5jxJclhxPuCz4HC5uXZFYVbT8QfyGe5/nfCySlCN0ek6wFxE5bWeDt7q6yaoxnjqmd2Z8B0A8el2YeBdABbm55jVdLwz09QuLREAjrcUAJsoKy8n4IOSoifQfF8y9CIsLxUAMP11DFBYmJ9mVtO5dOm6mOQxx5vcW7KB8LIKQHhZxeFyU1lWKmSSbCYc8Rmarhuarmfdh8x/TjjiS3I654JgOqzpumEGIzUo/3tWczgng5CY/uYfJDmHputGzjp/K8wqkXNHA9IrQ04FIbEyJFaMzK7qDpHz1SHxMszZ8++023LzE1kikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEsk74G/7Ri/57lmM8AAAAAElFTkSuQmCC",angry:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA29JREFUeJztmEtoU0EUhv+b1j5ib7VtWqF2VSwIxVK6SbtuEQS3RRdCcScuu3YluHVdV1KwoIhrH1BchiLU9AUpkZLGNKhJW3PTzCQ1w3URZpx7b1JT0CRtzgdhMu85/5yZM4mBKpkdG7b9rS1gRQF/a4ujLmExZHLM0+fSRT+Wv+wZ1c5RD1qrbSiNlqkuxEY6W74T95YPXO62f/y0DJmedsH/mqoFePJoAJ39HejpG8HhflSlPJVHcMmu2O/hG8uRvzV8BYurlkrrjWMHxkeDNgCEt1Y8OzM3MVLRyrc73ytOoO+ye9cbwQuUB4yPBu1yhkukB/BUHoPXbwDAqT3AveuN4AVVq3/uPcCN+zjod4BOMrKB2+9/AQBS6T/D9QeKAIDZZ43tAb5KFeGtFSO8tWJIITr7OzxtDvejZcsrsbgaNU7K14OKAkj0e0He/Hpepz9QVJ+zwl8FkOjhD4BDiMGrQ2X76OXjo0FbelMjYcyODdsA8OrlTdy/t4znL6ZVWg63CG4vAOAZ587dDwDgeEHqDylWFHi9vlOX4+ADgANWwOF+FAmLqZ0tl07MflaecLgfxfSDI08b/bsc74AV1IQJq/Rk1sVwP61riU8ujqfyqlAuUsb59Xcx8FQeywtdysCevhEsL3QhGdnA108XkIxsePrr4x6wAlhRYKjbr+pYUXja1xpfr78dAJCOmcjkmEMIoHT7B+bDSMdMR50UJx0zEZgPe6IBT+WRyTGkYyYAoNff7nD5hMVUXq6hHvgOWAGZHEN0O6IK3UKEzDYE5sMwZ5Ycnc2ZJQTmwwiZbapMGi6JbkeQyTHlAUDJ5aUnsKJwHJFa48vkGOK8tLA4F9jdLN1F+o5PZY8RMtuQ7Z5UZTyVR7Z7EiGzDVPZY1Umd3x300CcC6TSrYhz4RAhYTEkLKaML/dTulaop5t8xSX3Eohzgeh2BLmjIQAF4PE1DAJId3UBMSCAbMnQp+MYPDrCLgB8LAAwkNyLIM4F1ta+eSaThuoG19N4oloyVszmQthciIZ7yPx3MlbMYXTTiSAN5kLYUgy3KOeecgY3pQi6+5/0B8m5hgthN63xJyGjRNMdDcAbGZpKBD0y6BGjvquqEU0fHfTLsGnP/9zESHM+kQmCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIIgzwm/zHk8y2FFodwAAAABJRU5ErkJggg==",angry_nectar:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABHlJREFUeJztmG9oW1UUwH+vq+nftOvaFO3ED2OBYbGUIHZj+MUq6D5MEeuGKcTVgqWdTEbZQBxWFzo27FDQ2kFpp2zqqhYZVOef6gc/1CJo96fSGplpbes0aWrT9r2k5Pn8UN7lJem6grpk5v7gcfPuuffce84995xHYJ3UVW0xPC6nERkZiGs9LqdRu3Wzce8dJUZfe0NcW7t1s7Fe/WnP+ECHMHh8oMMwHeJxOY3yjUVJT197g1G+sSjJAWbfarJUoKx34FT/TiPPkUtJqZO5WR8lpU58vzgpiPZz/uzv153X/NHPcWt4XE7j7e99itn+g73/K8RtoLqyxgAYGR1O2pjH5TRO9bzGsw3PJyn59OqKA9449AT7T3wYJ/vjz7DQVb6xyFjrPRWIxasra4zVDDcxI0ALRKjYds/KZFs905cOrzsCEk89HaJg3Yt7XE4D4HRfL08/uS9OZkaAiTUSbpkISCTxOlhzgJWZscsMfTYNQCCYLfodZTEA6k750zoCsq4nGBkdVkZGhxXTEXmOXCFTbPUAzM364vpvRKKxqTYe1nCAiTUvmBXAWD4j3q04ymLiuVW4oQNMrOUPVk7fpGLznavOsfZXV9YYZjSlE0pd1Rajs/sopYXfsK9+kN4ztaJdjUQnJEYBkKRnz97PAfAea6H9SBcAakyns/sorU1tqDGdDy5dTcl1yALY+9Qh5mZ9TIVV5mZ9nO7rFSdsbV11P4hImJv1Udu0mDTG/K3Y6oU+77EWANqPdDG9oKEoCt5jLbQ2tQEIeSrICqlRALRAhC8vnAPgwYf3ACsGaYEIly740QIRBrsKRQIsKXUy2FXIzNhlfv3uNmbGLgulU2GV0G8vCb3NB04SUqOoMZ33zh6n91wPmxy3o8Z0AJoPnLxpBieStSk/B4Cg385P48NogUjcgDxHLmUHRwj67WiBiDDMdE7Qb6fs4Ah5jlyC4V1inhaI8P67Jwj67QB0vn6Q/OwNtDa1EQxNEApco6//HQDMPaQCZXygw3A3ejm8u5jj5+f5+M27Wcp5nIJovyhxX+3ysWNhGXv4W2IXnwHgr5wGbNt2slC0nSG7jQc+WckFWiAi5j/W8qPQW1yQz6b8HHHvTcxc4LjPnZoc4G70MqnpVO1+jklNZ+KKgrvRS9BvFye6Y2GZIbuNhaLtIkKiU53C+B0LywAiItyNXiauKExqOoFgNme7X2R+SSWkRmluPMJUWOWFo0282tVGSI3yyKP7U2E7AOLTbbDnLQBmpqeY1HR842NULC4SBHhlKxVAsLAQ/JCX8xCa/ws4WU3F4iITAF9HAYWZ6TEmNZ2LF6+JRe53v8xdeRuYX1IBmF9ScTd6KS7IF32SdGY+7Dc0XTc0XU+7D5n/nPmwP87ojHOCabCm64bpjESn/O9ZzeCMdII1/M0/SDIOTdeNjDV+LcwqkXFXA5IrQ0Y5wVoZrBUjtbu6SWR8dbAmw4y9/x6XMzM/kSUSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgktwh/Awh8kWIftpuuAAAAAElFTkSuQmCC"},animations:ue()},Sl.blaze={name:"Blaze",behavior:he(),entity:_e(),model:ve(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TtUUqDlYUcchQnSyIijhKFYtgobQVWnUwufRDaNKQpLg4Cq4FBz8Wqw4uzro6uAqC4AeIm5uToouU+L+k0CLGg+N+vLv3uHsHCPUyU82OcUDVLCMVj4nZ3IoYeIUf/QhiAF0SM/VEeiEDz/F1Dx9f76I8y/vcn6NHyZsM8InEs0w3LOJ14ulNS+e8TxxmJUkhPiceM+iCxI9cl11+41x0WOCZYSOTmiMOE4vFNpbbmJUMlXiKOKKoGuULWZcVzluc1XKVNe/JXxjKa8tprtMcRhyLSCAJETKq2EAZFqK0aqSYSNF+zMM/5PiT5JLJtQFGjnlUoEJy/OB/8LtbszA54SaFYkDni21/jACBXaBRs+3vY9tunAD+Z+BKa/krdWDmk/RaS4scAb3bwMV1S5P3gMsdYPBJlwzJkfw0hUIBeD+jb8oBfbdA96rbW3Mfpw9AhrpaugEODoHRImWvebw72N7bv2ea/f0AJWRyiHDOpsMAAAAGYktHRAD8APwA/HxSMqAAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflAxUMJRhYv0w5AAAC10lEQVRo3u1ZQYvTQBT+sikEZC8K3qRECiuYwi6991So4M0fsPgbvLmwh0W8rSCevKiX/ABPwrYgWnoTLLS0hRSCoSzsYWFPPVjIEA+TN/OSttqDbNK0D8q8vHnTzvcy8973qBGGIf4mpudEAICKnZzwAwDAm2NPmQIB2KYcZ31p+xiGBnIse2t5VWzAqssPgY8DEgj5GfbkFI37h0C1htzLegHwA2DelbpVl+DjEwDIt71/qEeybYLsrfX2Hx8nAMOqS1vFhm1q0AScwAeiKCeA3j6NpKdOARcelM0OAIHkSZDAV2yV8NKAZ32ZEPMupbUTIAGfd+M8IINjm0Cw5P5vygkorXcCgpUnAPBUEAh8tZasDHkWI/r9JFKJjcCldX73udDcqrXcL51TYpsQL41sc4Af6A2OXQ1q7OryRxyAcwGrrn3GrvYbu3reD5IlFMDg5FT/1qrA3mYABq63NLuLjrfIAVZUBNHxlvoNXA+i42Fw1gLGLsT7UzhlyGcA4lMr+wBMRLyheMMKEKAAwLrA0Z1XKjhHd78B1oUEt2QN5l0MzlqYCGA0BZyynH/7QT6321DrMs8B5zVEdgM4iEuWUwY+/wKePZTjgQlMhJ6fCDk3mkod0L5kJ7/gq9SbTQmaegWSZhNwXmfbKxjnNUT0YDcWN002vnm7AXxv62fyTX8Hb5KoNPJmqVoDXvzIOADPgYjKFgFatmFA69zG6z5fz4HyPiE9vvsZZlwFGOBhL9nK8u5u1tdzNHI/sg97Wl9Fk/PUKEkekK7TLMuL0pdc9/P/pxdIl7Yc1OfbCwAnQekGiLfABRUjGj2KFpqfGLjwb4CnV4W+AiXh38Cs3FNkxiTgl9fAg/tbcAUurxNMTnQ8kE2NRU+CREuJxaX1Ql8BRWljjj5paPqLKeAU/QQQZydeTzq3FfoEEM8H4/vcVvgy+K9/hrYiCe4CsAvALgC7AGyr/AF5oLftKJDGmgAAAABJRU5ErkJggg=="},animations:we()},Sl.breeze={name:"Breeze",behavior:ke(),entity:Qe(),model:Ie(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAwFJREFUWIXllr9rE2Ecxj8XIiSXkohJDtOKaLWLOJjij60guDk5uQlSF8E/wG5u4uKiY110kiLFURAKVZRSaRzEWmJKEZu0l6R4l+SSIuQc0vfNe5e0qa0pis+Sy/v98Tz3zTfPnUYPTE3Ou4l4EwDH0Twxp66RyW+SM5co2CapqEHBNj05s08nvEU+BHsJSMSbOI6GU+/so4ddAMZOXmS1ZjEUiQGwWrMAePv1Ta/2vQWo5HrYRdfdjnOAl68e8rOYA2Dg2FnGr94lFTV6Cgj0FKCQOHWNUjkgfwoxgdWaxcbyvMyrfv8kp7BvAYIoEW+SiDclqVPX0HUXu1qQo1fR7WxPAsTYHWfr7uut0Qsh0YEUJ47WOTJ8gUplg0plg0PJU7siZzc7AFAqt3X698CuFtD149y7OUEi3qRUDqCHXZx6g6Qe3b+A7RZQxIqOzYv33yg6NoAkjQ6kiA6kegrQpibn3Z22W435yf3Yqc92OUHTCsHWwhqxhkwSJCtrYRkT57re3gt1H8R+mFZIEp4ZdiTZylq4gyvoJxbqSuWAbGTEGqhuqMYADFpxIcqg1c+0Qnxe1mV/8WlaIVkfXFz/wuI6nt9LdbShSIxMfhPy+Jxuk6FIbOs6hmm1HdCuFjxjX62lPH3b51ZrAkXH9iyRaFB0bHJKQU5ZMoCcudQiVM5EH9FL9Pb3FdCu33niqgUiwf9QUW1Vjannar0KkZ+KGh0c2tiN+66/kcCz2+9GAc7d+kFi5PyCGitlP4x+nDwMwJUHpxf8taKfSt7tBqSA/xbSKWam59xSOcCj2dekogbPH4/v+CLxpyBNvlQOkIg3u77V9BPazPRcxw4IMQCXr13q6yQ8E8D35FOv+4Wg11YbnuuDQMC0QtJCVX9X/bqfCApy/ztc2+f7LCBnLnVYqOrbfRdAF+/2f++rgIP8z/8byGbNdK3mpms1N/27taIumzV3Xbuty2WzZnpwMEk+X2RwMAlAJKJl/ISAzMnni4yMGJltWu4d3aayl7v9K/EL8kLEqax7cgsAAAAASUVORK5CYII=",breeze_wind:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAACJUlEQVR42u3bSU7jQBQAUG7LRfoqrFkj9R0Q3IElElKUddh1uxs81PwLvyfV0vav+kMcKbm7AwAAAAAAAAAAfpDL9XY/ar1/pK3n17cva/S55MbdYw9H9qIDJmrII8UWeoK07PRWkyila4/eO2zFbR2A3px3Qoz8+Enq0NL3gb0N1ZgKww9ydMWFrbBJXqpbFvipDjZCIeZOklCJLQ2yxUjv9bGy9/UsSteZwgAAAAAAAMAJXK63X8v1/vF3Pb++/Vk591vea2stn3PkWf/HvLZyrm1+wGsHk3PYEQpmq2h67udoUbRKfJMC2gs6tZBS7rOX1BrJLU1ar+RmbSq3w4dv4MQff6UN12XalQac0t25G6sZY6vpk9PEhxJeo6pKkzayk76LM+K7yuj4AAAAAAAAAICJ1PoFznI9/X75do2If28fa7Eejbfmc1vsL9qPccgsqLAJLf1p2FYH1poeJd2TEs/WPVtPwmwjxzf9G26KiZH7jpFaqCnTScXNNtqCd2iPAifYC1vIxM72Xz8AAACquFxvD2vL6fysfFbNbcmDjl6bsnrsZWSMzNglwQrwnz2pzNhFFWLijO4UI7dzxerY87zD6AAAADj7V8LH5cq5JnXVjIUGRZCStBGxrMVTWpi1990inioxllwcqVjIy5XJVngoYTt7xoM/1cFEKe6eiWiZ2J5F1bMomzdQrxFmxVzmJwAAAAAAAAAAAAAAAAAAAEBwn/Zgy9NBkl8iAAAAAElFTkSuQmCC"},animations:De()},Sl.camel={name:"Camel",behavior:ze(),entity:Ue(),model:je(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Oe()},Sl.cat={name:"Cat",aliases:"ocelot",behavior:Ye(),entity:qe(),model:Ve(),thumbnail:"data:image/png;base64,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",animations:Ne(),textures:{allblackcat_tame:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERACsbQK8cAAADXUlEQVRo3u1Zu24TQRQ93p3xrhY/lEQ4VZBS5BOoEwr4gggJCYkCia+goOA3KJCoEB0VEihlIvEJFJHoEiki6ySbtWdWpiB3cz2efdlrO5E5jT2zszNzz33ObGM0GsFEu9UTQdBN21EUIh704brNtC9JhlAq1iiJjbVHQkgPAKDVAADA22d/fufO1W71RFP6GKoYAHBxeVp67Tw4ts4g6Kab1GoATsa0oI3Tf7NdhCDopoTVCZH54GaxOheNohBN6QMAlI6h1T+NKp1NwGZvR5hE8P6T0196LgTYkCRDuG4TSTKsvND3H18Vb+/uPpVX1+dYNkTVF6YRngS2kTnNnFoNSrlNKQIouAjpQatBpsmvr22lz2kDUvoTBGYFRpvAZQQnt+EBsy7hAUBw/6NFfn7axvHBGZ5/6OPz6w62n2zg8cvjMeGVjseyAuHo6GjkOA6SJEGj0cDe3jMphT821nWbkMKH0jEODr4p13VxeHgIIcQNMQlc18VNhpIksJBercIDQMPz2kKK28AkhZ8Gmrf7r/D+y8eU+avrc/CxNnQ7mxOaonmVjlOtEwkAxjRsswACT4M0bxz39cwEUEMKP43SfEOUEosiNifA3HyW8EUEhP2TsbEm+bMSIGadIC9tkcZM0sgaOOF58YdbUN1w+MZtQS2rvwpsGuR9QnqF9cY8hJ8qDVZNVabfctCzPOGnTbulCSDt+l4HrtuE73eEqTHeX7YG51odqluNc4HKVJlVzhvTpcGSC5BvE2Fl3svya9P8lwln3gtQBiEfttUOSy+FTfPe7O2IKApxcXmqzcPI+tpWahFZx1jSPBVOZjVIQTAv8i+MAN/vCNKQ73cE5fEg6E6cxGx1QZHm88ZQAFwmEYUuQMWMVgNEUYgoCifO87YAyKM7T2EUBHlf3eVtJQIoIJmRn+ffsH8yVtbSb1FuJivImpuPMX8XagFFJJjFSJ7gJADP/3njqVawCb8IMgoLoSpHV5s5m2UsZQFeDpchY64EkLZo8VkKEVvlZ0uBXHgav2jhAUDwk1gdkbjodveuwZnH5ed9gqBb1Xarl8aDOq7B7w0B3HdXEU671RP01ebdizdpZRZF4cx37vcBjdaDh4JfS/G7vLo+P91pAmzfBlfKBbDi+E/AqhPwF5MYIpd+k1Z1AAAAAElFTkSuQmCC",allblackcat:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAE4ElEQVRoge2YT2gcVRzHv7P7Zmfd3TTGsNlCmtDoQoM5WCr+QQRrDgb0IkUNYjGlLQbvIV48eKgX8ebFghUCKijFIIJSsHoRQaRghS0NqBETS2vcbGa7mczsm+V5WH8vb19mZiedLbSSDyzD/PbNm/f7837v9xuDV2ahYk6cRSFfFLlcv5Q5jg3XqyOdzkhZq9XEzNS48e6n3wIABgqDqDWq0Ll/eAIAYBimYKYFAPC5BwBQ739b/dnY8bDCSGlcZMwsmtwFAKzcuGrQe5PAdAGvzGL46EX43AMzLfjcQy7XD9erB04wNz0Z60VN7kqFSQn9PgpySJyxu0EawJw4C6BtAHVxdA2CvB/XCI5jI2Nm2+/xXfi87VHuuzvmoLkPjT0mVDkZQpFHRk43jGcPl/DFx8+jdmUVADDw4AEMH70o9IHrtRUAQDqdQavVBACsbVyTLx8oDOLUcw/JhRO0BRx3U5hsW3md69U/AhXRDaDz99qviQzANpoZPPXiV4roFwDhXifldWqNKuamJzE3PbnDCISqeKvVlDklbM4wfO71bCsYhXxRZMys3O9RIa/mhSZ3A/PCzNS4AaDDCHPTk1i4cFVEKaxGkwolPzVhqso3NteSbQHL6hMmy0J9yU8fjWH5uypeOlfHZ6f2YezpQTxyfLljAUFhDAD9+0odi+S+C5Nld4wnGW0L9dRRcRwbAOT66J7omQHUxdJi3nxhBmfOLwBoK765tYGofQy0DUDjg4xA3k+nM3Iu1fg6qsLqMUjzet7N5AagG4oEoDP707kd5XmCDKAvPkx5INoAdv1Gx1iai0hqAKZO4Hk3k8z1HyVpUPJYVPiTwaPyT9g26gWpxflR8MoshoplwZgleGUWvDKLxflRLM6PSjkAWempV/0XRJAHVRkzrcjkS8/cDqT3h4plsV5bwdblEwawXRiR3Pe9WKE2VCwLYDsHqFGgbwH6LywBAtv1Rxhx1xVGijFLMGYJx7GRTmdQOPKJGHj0c1HIF0UhX5Ryy+oThXwxsihRYaaFXK5fetZk2Y5egsbQFghjbeOaMTM1bqjXrcsnDPv7aWP9m2OJlAcA9sbrrxgA8PZ7H0phUC4gz7peve3hGJYP29d6+O+Wxp//AADS92S6jOzOjmao19AJQntYj4K4UNd3LmH3p2PUGlXsHzwoTJaVRcVQsSwcx0Zjc80gzwfhcw/rGysdkTBULAvV82rhpJa/evEVBm82DACo2dcTKRpGav/gQQG0PWRZfYIUzuX6Eaa8z72u9XicMfQfRUkQv/9VwbEnS6H/JyXVbQAVMz734Dg2HMdGk7uRijHT6uj/9SZIl0XNxb9+Fe+/83i3Zd4yTC1Kgs5a7ruw6y70cjnOuUyejRpPY9RGS90Wh05fAnBpt3rFJkULVK9hkBJRypNCat0eNZ5qBfVZda7VC89g6YOHI9eVhK6nAIVs3J5dD2c9YtQkqFeEQcbYXKkiP9LbzK8ivwfQy/WsvNsvLvfdOyL0ji0MPeKCiiIh+G09BZiq9K0UJTr6sRhFnOaL+oukX3/DSPVS+bsRgy99icbwExgpjcszX21OysV2yfvDleim5G5FJsFuTcn/ldTAkZPigQOHBTMtvPXya/IsdhwbS8s/Ju627nQYsH10nTm/0NNPznvssccedzr/AgLG2pFUz3nXAAAAAElFTkSuQmCC",blackcat:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJfSURBVGje7ZgxSwMxFMfvG4gudlCnguCirn4EOxZEHVR0cHISXFz9Gn4ChwoObuooIt0s+AVETqUq6tLh5B39l9c0uXu55O5a2sCfXI5rmvdL3stLgs7TYaBqrrIYqapWV6MwDHui9kFtOWj/fCRqeqoSi75vNpu936r9p/Vj+t652ABQDSAA0MgD4G0dAA4BBmAQSRA4ADKe/56Lw+R9mcYCOQNYX5mNjQ4varGSAACCbtZMEKQApDPvHcDa0vyA0v7UNGgdBADA8jdBKA2A1FipdBCozQOoLg4MFQAa4Pb5TPxMNbWzwOCBT5XJFWw1dCtAAsGX8SMBABB4HmELAN+iH/5+ZACkxQDJ1svh4b23PACd0nPjZKEnvKdvkXjwWhK0XADAfahWdxKqvQPgxnMAaZmaCYApEEoB6AKoVwC6AanP/BtfAKQQsI3ymibs934n+L7bck+FT4/2tZLm4lkBSAOhDkD7uh4rdwDc310AuOQBOgA0+4DgXPiguRE0QEkmljcApNImlb4N5r0LmFyADm6FAeCJiPpOCkCNA2pSY9wFuidUWvY4sXLlDgCzx2uenOQNoHQX4HuuugeTsgDg2Vza/2PmsQq+bjf7bq8KAaCDYANAjQM2ZwEyngznLlDoCkBqrPqe7fk9KwDT0gcU7wCQc0O2AKC/h72+WyKJOs9XgTTl9nYpmpR7EwBck+FsoLYBKGmQrdZj8Pb5am1c2k2zFxcA9feXswjiQNIA+DJKYiyXv2vxLgCTD5YNoDAX2KjvRjfHx3HNs7CxANBoXA5obABMyqRMyliXf4CvS4vS3/Y/AAAAAElFTkSuQmCC",britishshorthair_tame:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERADZ4RsPFAAADpElEQVRo3u1YS2sTURT+Mo9KZ5pFGQxCtdUWClJEtNsuhOBfELtwI+JK3GVRkJaK4KLQVTfW2o3QFP+C9GFaaDfRlQilJU0fUCeELtKkYmYaF3rHk5k7M3nMxEA8MGTuzOTOnO9+5zvn3EilUoHd5hcXJACIKioKpSIA4CB77Hju1fSUgRptfnFBiioqAFhz0vHTx08Mv//T76jn3V4m8S5GFRWxyzEAQAyAntOh9ij4l8bACtq4ADDn6Xj/8AgAoGm9yOdPG3oZW3kAVXN4zZdcTlZ948jN4arr4w/HjcABcDNN620YhNsjt8p0vJpKyY0CyQO0JQA0Y6uplEzHxbOSFVbFs5Kvo1QvggwHiYqTWxjoOR3Xr111PPN6ZsYB4EQiwaUkz2E/x+kqhwWCxHN69MoOhu6/xIf3c3jw6Bn2Pj5H+mTYAsPLtre3K4IgwDRNRCIRrG1syAAczrPxvbGxsiiK2NragiT9/hzTNCGKIv5kKJlH+SDo7xoC6ZNhzM1OYi21ibnZSaRPYjVPmNnPWB+8f3hk6QVdbea8pvVifXNTpuyyM49n+fyppUfNmkDRpC8slIroH+irQprdZ9eKZyXHYRdNu9CpPYr1nN0RXvbxyxJNM8CtAIk3OOHKyorEgGJxms+fWo7bQaJxXchmqmoQv5UPAhiBChpP1Nyuu5me0x0OaFqvawhQIIYGbjiYyJx0+23LNLiXzXCrN8qC/oE+Lnj2UKglUzRjkTfv3koMUarQ9Jyt1EH22LcGpyHAqM1WizrDAGCU5zEHAOLxuBEqALxmyKsZYeamHcnlpMQccnOegspYwnNez+lNl7otD4FCqQhwRJCXBRgIbgIYVK73BeDF1LREW0wmehOJhOEmgPQZN1Vn51QEeTFNtYKGQlgdIDXRqEQsB1fXPwm7mV1BUbqhKN1If/lsnbsdo3fuXlTR9rsuqKoKo1yuWkHDNFH++bcf6uqScX7+A6Is4pLcxa0FVFXF4ODgRZgACGH0+Sz+aSqzl8D2EHDTgbBNsOdmXvFRTx7WPeKfNkX2GoAJZy39RuAAMOeDAMEuXNRRr/aXsYbVEK0CwjcL1FuIUBGkpStVf1rWMhCjiuqZEkMFwGuHp97NR5r7KUt4GkCZxACJKqqj6WoZA4JoMf12d9vNBLrP14lmtcN097UV1GsbBrjdCHMTop0sspRcslb+67cda98dQOiNSFsxgLcF1hEMqLUd7jgN+A/AfwA6w34B4LFBPXf9P10AAAAASUVORK5CYII=",britishshorthair:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAEnElEQVRoge2ZXWgcVRTHf7NuC+4mQlizBGISsdCieZK8lCBUAgpSwURo8yAq+EEEqw8l7kOEtCgVWUMebB4McQWRtqQBa6ltCIaKIvoU0UAtLYS4mxbCrMMq+6E0yPgQzuyZ2dnvjUjND5aZ3L1z9/7PPefccyfG1rUxNHv6Z5lNzNkA7aEw2UIegFTyNl42Vy4YU/NXAehoi5DJWSV9HuruB+D96Xft9lAYwBlT/3109Fmj5GHF+fnPbT2P8dgbhvxuMwS9DVvXxlhYDRPtjAIQBcy0Sbgt5DvA+OhQUxOoFTFWq3EMsKd/Ftg2gIgXop1Rft24BUAk0oFlZQCQ1a/VCLLygDOG3HvHkLEXLy3Zur3/4f3e9oqeU43gM899wcUzw5gLh6t2jkQ6nKsWMDV/lURbhPHRIWfiXiwr4zwvz3rHqBdt0EYJ/H5nL4eOXGH4xCrDJ1Y5dORKQwNJ/FfyBsvKOKLzuYLTru/90EJbIVpjzCbmbL/40mFgpk3fSekVFNa+OWOAe0XHR4foGhixJY/4CZak5kWSH7iTstyPvfxqUyHgMoCIHui6yb4nPuT8ZzMcff4Ya1+9ycrmduyJMcoZQNwc8P1exOukqp9pDxUTsJk2q654swYI+DWubO5nZnqSr7/9jpnpSUd8LbSHws4HiuLyuUKJePlOP+NNwH74GbZRAlCMK+3q2UKe3r5u1wro1YeiKP3ReJMlbIuXfjoxAr67j/TbKYLNupCX5eVlWwwlXmBZGUe410i6GMom1yt6gddgrTBM8EKsl6dffIoPLu+zAd46vGYAfPnpIgDX7z9mA0zEYkYmZzkVX7nKb/HSEtHOqMubIpEOVyXpDQEoxr6ZNjHTZsnql7s2S2AknnKKIM1IPMVIPOVqk7JTX70fgLXkum/y0ruAFi+I0bQH+IVZuZBrBEPqfsvKuJKUvpfJppK3OfXOyYoho0MA3LuFnnBvXzfgXnk/1x84+KghBZZc25IT3Mn+yd9/bXHf4+caVw8EUz/9YACcOv1JxY6ziTm7t6/bOSiVyx0iRLYwP/Hec0U58X71B0Au9RsA99y7t+Kca6HkMNQs2UIefJKgoL1LPKtcAtRhJOGVaPL058XI5Cym4qdtwHHv9+JxJ/HJfTkmYjGXJ5w9d9aG7clXOk5LaFWqQs20yeuvHTcAMn9sNqKvKsbbkyddAiU2a8UbCsvLyzaUVnE6x4B7J9BG8IaC5IDE5Z/rmletBMqd85uhkni/Elj6+uWBrcUX+Ch+sOVzFJxSuJwh6t2H/YogTT5XcO0s0lfXDjr5HXhlhejgxTok1UcAiuJbYQTv/q+FVjoNitesJdddbbeWnuTGxwM1yqmfqrtAvcWGLm116aqzPxTLWjGiPkC5CqENi3BPazO/Jgj+hxahWuHjxXtM9tYB2su0J4lB2kNh16HrwPGVen6+blwe4Fee1kurD1dy3mj27W85Avo93/+R4EuPdRm57kHX21edyAYf6QHg+182/v3ZsXMrL/i+EYKdfQnxXyKw8GPWltW/dv0msJ2RH+x5oOp/a+4GHA/wewW2yy677HK38w9rBcEZWeOGrAAAAABJRU5ErkJggg==",calico_tame:"data:image/png;base64,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",calico:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAFWUlEQVR42uxZXWgcVRQ+ExfBbkxIt4naajCbfSl5aVPaJ2mrm5XWUAQ1fVCkrdUEIrSCIgUjPrgFqT5oH4QWxIBUpDGltpBKk9gN+FAaTPNSfIm7osafTdPSdGteNOP97s65uXN39ifZmRCIB5bZmbmzd75zv/Odc+5atm2TaT9lMvJiOFxL9+7l5LX01FTBuEQiYVGFNvXZroKJej7P0YN1dXxqnR+6Uvb5THPfkucuZSGviwD+cFOjc9ZIf2ZnqD7SWNVE1lP99MDPX9Lf6cvq2v7dUTqbSsvvcIQASbHDYwyYVsJqvC5+c7JXff/9ynFauHFanUca6pc92fzjL9K66NPyc2vrJxRvyUonlDGsvH171pLPtYWuyc/4id22F6t8YYBclb4u2hffsrhiWzsVeBxnb99Z0kQYj+fgBH5WOoGOCkfUinCYE1dqC54DcFhDxKaatm51vUG8F9/znQHsBJ2ufhiAM/g7szPKCRzXpQyrD2NNwjmcUjUDIHiI+Zee26NicfG4oCam60fJ1l4mIlby2sRkwRvsaN/iuSwAzDrC4PkIO3XIvfrQAugAgwRzws49OCEMNviwQCEvQRo89Sq1Jk5SbOhHimzcTAeuTlJvhZNxXIKedsfH6roJXhdVGVqxfhsiCdB4loHzAsxrq89OUItTjThPpdOSATBmAezMuW/pvktD9O/eZyh38QUVb48dHFAv4KUD6wVTeOym7QkV8/pqM3jWkuZHN0mhnR4fVvGuZ49iegJrbWmxqmaApJRwAkBz+hOhQbRzp7iZU6kJ6VCPQx2UcoADAE4AILu+03Uf4DkcdCAYy8+VAuy3hXQPxp/Y5rr51WtH5DF1ppPC9zep69vfTrH3PUIgaesUtpxVZuCm05h9uuIz9U0RNh2B89aWKkOAK0EWNFPEtFxrMRNKxD/nbQmGQ8CsJPUQYAcgBC6OTtKliZt0d25OahLqBGSJUlZMdKuqA6o1ZsDL754T2WREAjr23gcuFkRjMQWc6X82lXNlIrAg4xFmfpoUQaaTrtDWyBuLRYdDZ4eiFoeAFwPEGDn4eCq/MADPWSa6a7GQYQfcGjikYn9iLs+M9roZyR6EgHCCtfHJdwJzgNIAM5bGR9zghRrb653SFALppb5obpi6e9sbJZ29zOwrmDHxSFadgz2wL94PthcIVUrnSi1fS+SdQATh3CC/Z5q7XVnA7CtYAMECOI7DoPfDETofIAOkCAr1V0I3+v0PLkH0qvaKiZCTRWyzskMs3/hnRwELWAR/7e9S149duKvAI3zEd+uj5xeonAAvmwEaeEVvXhmUyZXmXz2FAsC6aIcqYVHF1RvFEOuOXlxJu7CHget7BcG1w3rt78eE+A0AkMCdFGgKrNlac2GFIgwaojNgRfYD+KWLdXCljqZxDuf8bo7jKlBnFm/AoNLsSQ4IAd2gWLAiDig3mQkaRQ2A4Dg8POwai9jPC2DhBorZEOkG8GACQvDZI5/K30Hsc2cYWBbAJKOZqFReeN6rjV2q1e77WjVL7ABd/fWyFkeuBd4azG9P4D16kmP53mNwf7BpEAodp8ui+EC6yxYMSI+dViqvFzKmYcVQB6B7++W36QL2eGkA7nHBxeBhsn7o66KOwycUCwJLg9PfJWUW4MbDbD/ffP0VS49vL9ErtZtbomdw5X+uHJkBqrhKDgTLAFZqSxyxITFvDFgqOD+sWDgGxYC8GrZ129ycsFP82HAoxwAvC1L0ChjAjQZvdqzEJsRqMuuPv7KqEuQtMO1/gEA7sVXlAH3DkYuYRx5qslY7AK+/9pa1I7RWrYbWuP3vgLXugP8EGABT2d7tU6lJvAAAAABJRU5ErkJggg==",graytabby_tame:"data:image/png;base64,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",jellie_tame:"data:image/png;base64,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",jellie:"data:image/png;base64,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",persian_tame:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERAR3N4QvEAAADIUlEQVRo3u1Yv2vbQBR+ks9QhNe6aHJA2DT9gZY6pVAylW6l0Km0dCh0TiBroUP/gED/glKalO7dSqbS1E6TISJQg10PmlycVWiJhTood3k63Z1kS7ZK4wdGutNZd+97733vPWlhGAIvzu4msVoNNh72XRCJ/fzdBLKK+4Uk5gwzuvojgMYj9btOjwgAgPP14/R7K0QXTWLl+TH/LLf4IyhTiOxBrd5k9954EFPeajWkXpFVvPEAanV031Bbnnndwxfx+at3JoUDgJVn45wKH/ypn+Hxld97VQuFmN0ux3ukHsDi83wjVVhkkZv6fhWPhwpuESqK+QKfLS8AlPCY1Q0zuYFhQm3FZIh740F0+P4myUqMw77LQOMVd3o+2GlWnhMIQg94eXAbvr15Cj+f3YC1T79g/e1neH/3JNMLu91uqOs6BEEAmqbBrcqPKlWYV9xqNeBkcu/serMCnU4HCImOEwQBVCoVCMMQ1q5BVejyBZGndryzwVIeH/sRUSXnlKnx/oNM6/hQEpGu6EyJc6Wlz9QQ6PkAEB3SQpvSTfAVKxT9TwRA/B2yjKHikCyGKEo0USHkHW4nD9XemqrgYTyRwfoqa2MAhNf21qQYAGilxruUbF4BAPUW7DkyDhCtm0byAkDm4Va8JWUhgNdhy2KrO9/3lHvNVD9gD/jw+hWxV41YrIrunZ4PTx6vpiPOeYAqHHgQYjUIZfmcJDcTB6him1pE2oycHhHwRzHS5PO/LOvwxRcYZu5St5QQAMNkdb6V2g+cu/7KuhyMeQPg7EYVHbWqd7hNKMHQe5648BpR9aZKXTgcLAX7L0K0450NIipkMgsfo7RLQ2GgygIx5UVWn3MI6IX390j5Yd8FvgymBRTzJArSglxe+kFEBgQ9oOwqa15q9WaC/JyeD/aqwebozxsPov/hxmeRAOAPHYWAwH1Ewe/FJTR9FguDOTQ8ubJAWjmrKkRkfcPF2JUT4YK8gKSVorN8fMSFj6xpwiEx7LulZQOSpRmZNivUGheeYcO/LTpVusxcXKZkL4X/U9HhkssSgCUASwCWACwBuMzyFz6jzlJ6Dg/9AAAAAElFTkSuQmCC",persian:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAEhUlEQVRoge2YXWgcVRTHf4PbgJutJqYsBD8SGjYlDbI+RaGhkSAFibZBKLHaIkKwoLQvCYKK3/gg2BerDxVFqtUoCtZiK4qIUfPQlEBXqYGUSGOElJh1o9ndhE3q+DBz7t75zGYnfdv/y9y9c+fec/7n866xeukwOrZ0nuDiqaNmW3uLmpuemsEPx0dGjTc+/R6AxkQTuXzWs2b7rZ0A/J15x/S8jDdbz+Ici9t2Gb6H2Ggo/m4CZL79EICW/hcNOTcKYu6J1UuHWSm0OOba2lsUCfoYYHigN5IAFOeifR8RioAtnScAiwCARDKlFuXnLwOW8vKcnppBrF8NCfn5yySS5fHwU8873sveYnlBes8ha1CeD/Wc9RDb9+hpvvyon/nP+tSkrrz6HRAGIux7iSaGB3qV4G5YCqfUeHpqhjb7nU7mhrAJ3hNbLNXRs/+cNvULY+f6yvFpH6TnBLC8YE37nctnGR7oXZcEHUG5xYPinCNfOGSLCEMSnrJ62OY242JBPxwfGTUABwnDA70cOdCjEqv728xkkb3PvO7ryg0LY+UQiDeXrW6Pjda90ULAb/Lx83fy4wsPM/7ITro+/o3dr3zC+3f/WtGG7779qiXwwpiy+JEDPYBXcSEk3Z0CUVS3tBv63CYlT0Mvee7Y1+NWn4Ng901331fROoHf2XqouM93yxXZAzKTRcAucdqhcoj+hLJC1ndepLude7jLpsCdU3RUYojNgi97S+PHPE3L1q6hipg2r5wxITxPCNwkBCnpZwx5VipXEIwvnr6DBx67n1h9nwmwVjhrAHx18msA+p98ywTL1XL5rOr4gjq/hoUxU7xF9xwIzgHudRtBZAJkIJYTAqQxkvlKY03WC4I8wVF5tLV6r5BIpsj8/F3oeXcdfDMaASefGzTTHfHAdlfGmckiD+3rWJdx88oZhweIMpWSADjK3eK2XYb0FvJMzDxLaWmZayur3HTvSPXaA7Gpf/8zps7nee3gUOhCsezFU0dNCGE+3kwiaSmtOr72Fg+p4BPz7h4koCfJ/7EAwA031oXKXAl8+4DIsEmAcmXxgyOpte727BGEusZ6SrkC15ZLkUU1cvksM6dfdlhVqsDWriHDryLocIeEOX/BpDjnKZ/g3xOoMAhQ+JbUg6Ehl/vnatjrdWGISwukkal4A1dyNOcvWPvZJOjwqwKOMPAhYTG+3ZMD+OkJVvMr7BiciE7A0vgxUxdsUwiwlfdLqpnJIpJ0BWEe8NfoS0bjztsoLS1TmPWW3eT+sxuS1w2VA4I6trAmxDeD29k7kUzRhmV1t/Lg9IY2UDlDVQCbkB2DE8BEJCXD4InxoN4/CJ4coHWCOqSUAoqEwGoAioji1c+NwmwW8YK15RLx5M1qmfQr1WLdKlDxnT3kW/e9ofy7fAfxkGB7UmE2S/3tTY4QaO3/oWqZ3IhBeCtaTaelx3/QpUnepTvi6t8hP0+wQsCLP7/ZA0D9PR9sVDwHHB6wGTeuqNdTN/zuGwDlDiAiAaL09bpuXg/IX+011FBDDTXUUEMNUfA/XU55oQKUV7MAAAAASUVORK5CYII=",ragdoll_tame:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERASXl47NaAAADqUlEQVRo3u1YPUhbURT+8nIDr9DSV2iGDBkUAv4gWTNlKELngJtdbKGgjlWXrkXwp1sTp+rkVCGTQ0E6uBihixUTaMElQ4ZAEzqUCybcDvW8ntx3XxKTvEijBx557+a+d893znd+7g0ppaDLwV5WJFNpRGNxVCtlnBWOcVm88Mxb28o10KX8KJ2LaCwOAKhWygAA/pyYnGl0eh8A8rs7N167nQjTIIEnJZOpNG5bSJ9Bi/BbjDzPjUHGOSsc97QYeR6A+226T0zOGN+p1+stOr5+u94y7jhOX0yw/BQlquV3d1zFSeFeGPHz1+8rfhHwXo2pG3SgDMjv7mB8atoFSs/9SLn4NcKfL4sX7jdN+UUHyvPFIMNB6MmJPELUT6bSLQrS3GQqjYO9rMeAcwvLRkqaAHcCzr0clBEEX4iy/bM3Obx4tYLTw208n3+H7Mccvrxf8iRIkxQKBWVZFprNJkKhECYmJiLVShnjU9MuYGJXNBZHqVS6CofDODk5gRB/1Wk2mwiHw1BK4cmjBxET5QdBfwAQlIzI8+NT03hcO8fp4TY2V5fweX8d1cq56z19vi4EWGcV9zbdz2bm8dR5GNENats2pJS+QHkC7dsApAyB4h5e28p5sj/9+tI386+KkLJkWM4Ancq2bQOAC5yPDRKwxwC8ofArRY7jwHEc93+/eVSebNtGfCzR4jHdYBwQAeX3fMzP8+3K543L4MFeVpiSmt+4n3DFpZQtDPBrbqSU7mUC3e43kDI4CJFSolope/IFzyWcCdFY3ON1KWVXlaIfCX0vfhM6TU0Zm/qBTj24lFLwWOallYPh36WcYTKCbduNQA1g2gy124ywfNHoZAACdZTf91SAzMtFTziY4j5oA1hB0Z/Xa/I0ZwCxIhqL+4IfhoSUUthcXRJ8i0lJb25hudEpAeqdXzchwBuhaqWM+FjCWP6GEgIbK4stAHVqdhI9FMgA3AhH+X1P/Pt1lcPOAVa/mxy/EPDr5EzrVStl2LZ9K2FgtVNsEHVYn3dZvHDZcFY4bjGQqQ8IPAd82v0g/Dq0boDqOYA6QaoCpm6Ql0DTaQ+9f82KQEOgYyPUSyNCnmx3pthNf09GCNwA7XZ3vR4+8s2QDp4/z2bmPfv7YYZCW/r3InRG5zhOx40T32zdlritcLdlbtREEEB++jqo05b/Qaxuy9fISq1WE0opoZQSGyuL7v31OEb9CtVqNaEnonq93pLQRlm63g7fuRxwb4B7A9wN+QN1QRbvD6ZXkgAAAABJRU5ErkJggg==",ragdoll:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAFGUlEQVRoge2YT2gcVRjAf7PZhtEUQygRY7rFBNrqBs3BgyGHKEEUrdDuIeQQqbKWhC25iNsUbA891ErTCIIxMVYXqhaRIOnBmlaklAhtcsghidliDpFmlUjXZSLZukO2cTxs3+yb2dl/mT2Ukh8s8+btmzff973v+943T0kv9iGzo2WM8ciw0drWQX2Dj/hqjLnpKZaji9hZunVDGfruGgB1O3ehJRM5Y5obWwCYufmTUd/gAyC+GgNAvq/f06jkPCwRX/nTAJiIjALQe+q0It7rBq+9I73Yx+9KhylcfYOP1rYOx4eXbt0g3N3pSoBSEfJUGtMAO1rGgIwB5JUXniBobetgbnoKALH6pRpBrDxgzi3aV46dt4wVc5P2GHJ/74kz9/sR/QU9pxiegz2XALgzfoA74wdMQYWrTURGTcGFwHaPKMUQwmhye256ymJM+VcKskG3indto5oXu36UuuY5+LqHZn+LqehEZJRmf0vBibRkgnB3J+HuzrwKyEZYji6aczrlF5n4asyaLyoYDspSdN6SnETCCwRDZigIA8jhIMbaufL9eQWwGCHc3cm+Z9qNQgqLpGZHJD/AlEdu7/M/5yoEzBwgK9/53ghvvhNm5vIQr/ac5tMvR7j20VGAnJxgZ+ib6xmB09m+4+e+tuwkdmPeH2+JdSdkl6+E+wN45qanLKvZ7G+hVltg5vIQg8eOcvXiSWq1BdNd7eNLEdS+jS5HF83nnRRRVbWg0IXeXS5eIZjI7vLKDJwbMQfK/+erCwAIWF1VNqzsAWCNZ6G0ruvmVKJP3jEqjff40KirGLLTe+KMoaoqvqa9Zp+TwWSF5BUXbScvsBuiEp7gnRjYwxtvvcalmWcNgEMvLCgAP1yYBODe0wMGQFewX9GSCbPiy1f5qVVZwXVdd/QAgVh9p1UXyFum09Ut3sDgCgyOMR4ZtvwRGFwBYDyS7RNlp/0qk0qlgIxS8dWYpXACLLkEsp5Q3+DLUV7X9aJbpFuUpei8IQSSY9SesSFTDxQLmVQqZUB2VeWEKSsjzytyhqMRNv9VRG0hrjtvv8/GeopNPc1jL33rygDeC6MfKwAffBIpOHApOm8EgiECwZABlLT/2osW2bByLOdTPh/Jlb8BqHqkuqTxhfC4nsEBOaZFGIDVA4RX1Df4ylIeoLquBoDN1IZrWRUtmeDzUycNwHTv8ciwmfhEOx9dwX6LJ5QSAnIhFF+N4WvamzcRPvlEU0FP0/75qyRF86GcDYcsCgaCobImsIeCMABkjfDzxMWc+AfnqrKUHMAvvaSTOvuPzLo2gKfYR85W0HXd4gEyTu+Lr8ZQVdUxDNKTh/lssI3qX9/lw7d3k548TDqZmfu3L553Lav5LeC0TwOW6s/pWgz7fi2HgX0OXddzjLD/yCwwW5ZS5ZAT43alihUc9hygaZqhqqpZB8jzOG2tkHvaI55XVZX/5vqUu7EEdf7dbKynuJfa4NHHa82x4iBnq+QcidnZSiEi3L/QmWIpHqTrOulYghrfLjbWU9yNZSrPpw5dL1umfHiBnGpNZqvfCvLHkF15+f7lQE9OvSDvCJkQyOWPq68AUNP21VbEM7F4QCW+uOrq6sozWLC/4N9O3xsA2QrApQHynfM9yIij9krgbaq6rSQb2y2nr3LyavdnXPNGtDInMOXi9ty/GHlL4UqeujzQaJpmCM6GQ2Zb0zRDSyZo9/tML3gY8QCsra0B2SMwcb/NNtts87DzP9vO+4s0uvUuAAAAAElFTkSuQmCC",red:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQKSURBVGje7Vg9axVBFN0/IGKljWIdBJ+ISALaCBYGKxttRFSwsooIYiuCoLwqYCNYpBFF8QPsoqWIpDIBsVDwxY88Y1SiTYp17/Wd9ezdOzMbsorRBA6z+7I7M/fccz9ms6XpU5nF3I3hfPHB/pxHxdzcLxT3J0a3ZwuL81FsWL9Joe8/v12+27vaUfSvD+evrwzlqXnsXlLPN0XmEfDy3Na8d7GTfxjfnb+5vC2XexnZABAApAjQzdP7YjgMEiKaEADIe60TgD+5lgU+TexVvLu2S1FuQIwwXoiRUFGAGF+8L/OL0ZhHrplMnkvWFvJBljijTSVkBzobf8r+5qhCrmVBgSgAkIXZC3bxEAkeAVAAyzq0QXGC7EVGEID32lBCNjK0uQYrt1ouCLDvkVASAPkTCbG5QgrQUGwxFFTu4mGPaUDuZSPyHI/WCM4LlphKAiUCUgroT4zovrAeE9BKCGBSMVwM0w0Vmzx4aZ0uoCMlPniEDWDgmTJ3sOcNCZxfMFrFgQCs17oCrMQ8qduNzXY7umHvWeQMbNQlgYxHrvHyDhwyf2uPwttTKwTUMn2EgNDzUIAlpvJswPt4TzA7vjPvdXcovPXb7gcaE2ANspL1yOB3bAjwevy8F1IonbUEWly31gdgUrm+c3ZLCfwuPYK+YEYLbqCaEsDyxyjzaAJG+MhoK0kxtk4AG88ENJ0QIVBRhpcII+FTUYCXQNskwNtQDfRMasKQhF0jHMnbkEIZ5VEc9u3J0ezr4yM6CriRw2+4jhJw/vRxF7HDSCz72kweJIBimaXPVURCwCNg4eEhhRAgIxvPXa1gRQRwvNsyGWtda54MSTjQSzA8AtSoAQkAvM6AAtCNeqjIlmU8NTWV8/9CPUGjEIgQYJ/HAQyHsdjmtcUuvMwkyL19JtkJphofrwaHDiMsZcjYqwI8n9cA4UgeCgFrqPwmHpdreB4hkSQg1GQ06Q5jCqiUQZMHvD7ATYiU2Di2GSEiYqgpIJSFSwnzSN8FQgTY5ilGADdY/A1CkDIkBChACPr+9JgCipBrkJCFvF/eU821Ndirw2hqagcd08TIb9Lf2yYIJ1CRvwCehwq+PDpc+4IF2bMKvFwA4zVvxHKAm8EDtdxTgOfZ2FmA12Xv6/8HpYxDIOZtJsKWRC8MMi/RMdAa27iLfbuzRsQIsOcKi5jEvZLH9d8SYPevZbDmdfTcAyyXAECkxl+JmmDpxf2srY+dy/ogEmxaCgLwmQxnA3sPgmKLzMw8y/qf37e26eXU+fRhaMD6x7cXcoBJSRHwuz2UKmMrPw0OCLA1/28h4I+EgGCyuy+fHBvTkZuc/4KAV/dOKqbvnimv0eT88wSkjsOpv1VPwGo3YI2ANQJWhh9uppdF+i2p1QAAAABJRU5ErkJggg==",redtabby_tame:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERAS5yMWrSAAAFOklEQVRo3u2Zz2/TZhjHP7GdJo5jkkDTQrUqgwqEVA7bYUUrXHrqAU0VFy67bX/BkJDGDU2aepi0/QXsxGVolx562KnSVvHrMNAEEhIIsbGlNKFzI+d1UtdJdnDt2E5CUxKqje578Y++b+zneb7P9/2+bqzVahFF+easktJ0LGHiHQGYW2oPWlkgf+mWQ58o35xVmL4CY+dhZQHbqAGQSKqIjQqFy4+c3eYH32Uvz34dlG43Kw/WsPUa8UwC40WR+kaV5JE0idKqH8BekdJ0rMB1IqmijroBKdpIX7/hBZ/SdIaFrgk4du4U9mYdgGaySTqnIqcVePTNGz/IEqabvNIqKU1n0yjRErvPe/n9jOIYNXKnJ7CESeXBGqlzusuoITChawKMx0UARlQNCcllxdM1Mh8ce+MkPCt8t82zZ8AEjH7F1Ksv4q0+qplIqDjU3ILE28kcFgu6JiAxqYepK0yOFU61teANcCJdjDN23r0ordJSw7Tuha0tVytGskkcsU3ySHqoSVDE8rwifq8QzyQQL/9GO3oY4q4OAFRwK2+uG0h1iWay6R89GgbRk5Je8N204TVJUBJxHGqY64bbhpG20gZNgCVM7Jognkkwompupmd+5PLzKa6/f4bPnz/k+tw95JUFSAPVJnZNkBjVuwrSnTt3WpIk0Wg0iMViTOlr8Y7gd64bdxf5bfLatpyXeXr7NoriBthoNJBlmVarxYkd4keDH5YYxtaufxQSmV4VCS6LlSclpENx9PFcx9jWqyaAm6RJnUbVQT57NcyA0iqNu4sAOEaNEVXDrglfd4LQChm26rWdxDgd76Rd+GkgEZQAlJyKuW701ZPmuoF0KN4xNqXppDSdZrKJVsiEdKRxd7Hn0pmY1NEKGZScipJTcXDYtm22bZvYqIQlTBoNh0RS7aj8IJoUSsBe1uBeNLSEiSVMn6refZ+6QRO1w4YgrfXxHHJaIVM4QvZknuzJfJvi01favzF9pf0u3v1BNODoZ/cc36l1EbF+1tsgaf9a/FBpZZp+C/SD4LJrvCgyompsV7aomZtkPv0Wxs67JsozYjt+opewDrwMDgJ5PI42nkEj41dKPnu1c1yg+rnTE3575QoT/v0sY1hekEMItmsCyuWy0q3iIcwtUS6XlX78vz6e62+Jm1uClYWQkntzg3Py+Xz35+UvDicB/gMu3dp1M5PSdP/YS32Nx8WQksdGe8hMadUPtvXKbZngPLsmqG9UyV/iraLvFojuDnsZEO3oYUayyXAld6GvVnBbJqwrGfYDEoBYnlfE8ryfDLE8r9y/f18J/s0LxktC+eZsaI4HL/h+jUp0jL1Zx1w3sDfr/obsrTIg2PNW4PxU8UvKT0wl+oJBJuzWAh6N09ULyJ8shwcGNlXRtpGQ2Hj6B6qeJcc+tEBQrLzzIN2DwUaZEIWn6AAxIfluMLpsNaoOclrBEmZoTrAt9q0FvGCiAfnBztzoNDNBQ7IH49RrrLlu+NT3zj13+lYZ0K3iIbrP3HCr5wU/txQ2JD1MjZJT6bWJ8VYAWVawnhu+CbJrgupGGQBVz+4LA5RgwN3awFfxIIVfo+repipIdb/nI/PsSj3kFnPaxL5UvasGRPu7w4j0aTwsYbaD7gPeWI8pQSO1H4iVfvg4LISRDUZ++qLDO4yOVSC6b3/XEfP+L7Cx9rWvVs1flv2kDOv7+7+aAQDJX39urwQcHPhO8GExBX/OwnsPODOxywfOd40BQp3m+BRYJ2KkYscRAOLRwF9c/1MacFAhccDxfwIOegL+ATgWmLJSflrzAAAAAElFTkSuQmCC",redtabby:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAHyElEQVRogeWZbYwUdx3HP7PPs7PTveGOA+64bgGLLYemkbS1HAlQI5Ec5nhTsSHRaI28MGqiXCIY2xcmYERr9I21gRhIjSV948WjBBOFyImRpEoIi6XoWXoHVxbWYdmdfZjdvfXF7H92Znd2b9u7F6LfN7Pzf/7+/r/HWamc3Ecz9CuXa1FFJW9kEU8Atk80Bp0d48CJvPSjk39ome/E2sFhAK69uqbG8Dj0b4GzY5h6AYBwRMZIZ4jvOy91Wqd8alfNeZbg6GTH8d0i4NWYuTSHqRYIxsPoM7copnNEemOEU1M2AYH9e54FYCFBRBWVvOM9HJGR+yxCASXU1WEF+aiiUu5qxsKwBRAc/gUA5eQ+Vo2sx7xXBGA+Mk9Mk/HHApA84posSO/f8yz79zzbUQh5I2sJLzVFVFG5p6eoGY1+IcjmtYsnP1Or6AW0xwbIG1kyl+aIjqiUT+2qweI1ITC29zdM/Go3qTdG7Ub97VsAhGQFHz4AMv+YI/7EqhYhiMN2IwSBvJElHJGpYd2mtcak59hwWKZCwbqQYGO+mLdYTfDdM0Nsfe5Ndr90md0vXWbrc28SHlIJD6lIfT6URBypz8eqkfUdF3JqgyeGx61n/xYYHqcmN8h0Qqlk+YpQTwSASG+sq3ndIvC7Hz5eM25kCMbDGO//G2XlMiqUyVyaAyCDdfPZ2zq+oo/5yLz9pK6GAoe/EOXAibzk1ITpm0lLKP1bPA/gcrJeBwwHqVAge1u3zNCBvJEVSvGhIaVOPlMrzWRRVi6jnCmhJOLkn3qNF365jmOPbOSFd69w7Ev/tB1fNVehohcID6k2geZDVXMV+93/9AFv8qkpqn85bI2JBajmKvhjAZqjj1SWKL5/396vNJN17V3e9utF+QBp7tiTLifT7kacB8tcT+F7KIi6QmsZW7s7D4BZMAgPqRaxZiE4yFf0AiFZwSxYHjEkK671lEScUtEyg2q14upbCgH4AAKaTPa2DixsW9nbOr6Hgi1jo4pKVFGZj8yjJOL2LQEWWUfodCI8pKIk4gQ0mYAmU6FC2TQpmyZSn8/SqGqFcER27dXNWbuBr9uB7TZzHiZvZG07Fe223TqTqLo2OG1aXaHhjwWIJ3rpeXQ5PY8ub5iXcKDbJ2B4vHEW0b4IBPo++QkJrOwPQNv4cWny+Gl7wMimwRpA/54/S3ouTX+sFz2XRqs/y+ByRMbPPlWrxedtE+gGzrCrz9wiJCuUMyUK2XvE974M/VusJEokYvV8op1j/UACaG5wkncdMpf2fDbDvyKIsiKOQty+Kf/TB1rHOW5fe2wAsMxLSwzY7T30kxckl4CsF6RUKmWFsjY2CjTU9+zYgplX8NzzrtCYN7LYNUAzzo61RBF7jlhvdNIOq+IZu3EQM1ugWizjj1j6Z8xYF6JtWI2ZrecOqoyZLWBu/Enb8wZ++v3v1Ak97urYf9id8dnFSP3Zzvvqb99yeXKpr42bSU3ZZGt3LZNxzjMLBsV0jr7R1qm59+4C4JdDmLpBOWel7dqG1UBDGAagDPV671+HZzEkoDnsPTe5wxUm2yUgyspldtZm3+QC6qskLJNxtdXfvVLdkKZg6gbVgglAMBax2uo3L0gLDRAVqRckPZe21VbcavDc87V3Bn7AmvUJSfQ1hzwhjGZN8DQBZwQQSE1B8kiLCZj3ipRKBcJhK+yt+9o7HU3u2tFNBGMRWzDGTJqPfuUt15jpm8n2AkidfKbm1eEkaRPxaG8WQO6VrTWhykKNYx9Zjv+zp9wb1H1OVFFbzAbg/uxtZLUH5Ru/b/EBnP8q5VzRRXT69RFiD/fRv3mC1IUxzGyBkGoJMZc41FkAzuzP63en7LCTBog5Xtlg9bejLTmDF/KFoCQcm7DtZrQTRCcIrQiIg3byxvmnXrNubPtEI1oMj5NPHmnrCz5IluasH8Jh2a4AATZ8awZ4q83MVqz9/J8AmD2zg5Aqo1+dJZZYDkBQCQNQNkoMDg4zfTNJQNyu101HFdUin5pq2PH2CXdC0gSR1AQ0S/2aKzjAjgB+f4D8u1YKLuqBXPoOALLaYxMxZtJ2eKsUTKL9bocp1F7c+vTrIxgzaVY3+YLUhTHKRoncjTsNDXASblZ9lxd3Zl4dvLooqgTsyjB5pGWemSm6skVNGbBrEgFjJo0y1OsygUd2n3ONmT2zA7AcorZhtS2I1IUx9KuzLkE1UNcAQdgpACcB7c73pMnjpxl58mPw92N2e3DnCU8BNJfDC0GMFZqirtBc/UN7vdVfkHZCGepFvzrLtaObPOP/taOb7N/BnSdYOzjs4QNaCowz3TERC49OSkEgfPXblDb82PGFyIQTn+4w0+SVlw+SG9zsap2+2W6093twY+PdBIKJ9jtO30y2RgFXzE5Nsftz35QAxndZzv7IpOXkxfuuL+5k8vhptr34t7Ybzb33L5YPrCYQWOz3GwvNiU2nOL8QAtoTB6Xc4GZ8939uMau8yvz5Uwt+qhLIJQ6x7cX2cRZg1cNrPvQB22VxiyHthO2iI3/9YyMSLMnSS4OlItoOPv3SoVr51K7axetVrlzczMXrVbtzqf59+W9GAMCQh1mzDvJrJaLSGgwAI7noL64PAqTvfv3Lnh2iHNZincvJdh9GHhRIDzqBxaLrj6L/q/i/F8B/AG5dy7ZXrMqkAAAAAElFTkSuQmCC",siamese:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALhSURBVGje7ZkxSxxBFMf3C0hIZZqE1CKobfINPDsRYiMSCytbmxT5AKnT+Q0ipJDESozYiGhIkyMHNhaCnIhJSNJccfKW/OW/z/d2xtvZu4O7gT+7M+zuzfvNvJk377LO9/VMa+v9uy6093m7+/XwU64f3w4KWmvMZDd/rkv1+NGTXPrdpYWXBYW+c9487LLQXrl4ALhzgKEhCADooQD4N+R+4AC4js7NTT8vdBIA5MqdLoMQA0DD5G9pw7UqA5ifncyNbn9o5JJ7GA8xABivp60HwQPAEOQ+duSTA3gx9fSePACQN20tCGUAAGGgANgolgbAdbxjdciCIHUPADQwAPIRPbrtdrs78fYoN1auUteLodchrBEs2Umk/ax1mkvueXfB2hIytjYAFgRvEYzpFI8sDBTDLy9adxD01lr2PYFltcv7lQFYP867gDfVvalsPQNDNYBY4xGPaEl7EgBWRwBB0w/5cgiAiNvKAMhv67VJK1kcgAVO7j9uPrsT2uVZBB58DS1aIQBloy/P9B0AG88AQpFaCACm/tABgD/xNqfFz/QCADtA7AzAAomQF9sqrjJgf49Wst9flquHwm82XpuKjcV7BeD5P0Ydu44F4GZ3MVftANjfqwLQu4AHwDokaQAy+oBQucgHtZ9zPbTnpwagT6EIpT1VLmW+L0oBgAMhQLDWAL3oeTNARl4ObkMJgKNFjgM8AAzBykPghCrTHidWVu0AEMt70gA4ctShMIfD1hnAOpQN3AVC0ZgGIG08uhoA/N86C1gAMPKYBb/2XxWyV7UDCAUiFgCc8WNPgzpDxBLjxXB2gb7OAITG2ve8bVBnj+AqHA8AAEPwAHhTH1CGDgD073i1kCWKUae1k8WG3MmSoiEASJPhbKDrAFTWyWbzJLv6eflg40KZ5iQuAOqYlvp4GwKQyqgYY1np0uL/AfAfIcMEoHYX4OwsMkCcqBwZAJwDHCkA4zIu4zLS5RbYn4QNQgva+QAAAABJRU5ErkJggg==",siamesecat_tame:"data:image/png;base64,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",siamesecat:"data:image/png;base64,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",tabby_tame:"data:image/png;base64,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",tabby:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATxSURBVGhD7ZhNaB1VGIa/e0NLaJPatNpUUUoiYgNaRY0VKV2IXURXVqm4sP6CYl1J6w8qKOpCUl21iohY68pi7ULaLvxZhCKJFbFViAomSGqahpTENC1pgl59Tu47fJnM3JvcyaUQ8sBwzpk7c+Z87/dzTpKzBLbfdWNhzeUNtvqyOjv795gNDg0b4zi7D3Qkvp/E3ue2FTZtudeab7nT9r/9snX91F38ZYr93/5ccq6d2zYXaHe98aYtW3ml1TdeN+tvlyJfbGeA0Svq60IrEKTp6rWhrZQLI6dD6wVNEjcNjNcc80GiAPEFKRoQBC/SViLC2uYmG+jpLY7MWq69Jpo7jfs3rS/I+zhjx0Nbrf3VV0JE6H4WEgVgQSxs9NzYDOMJ4UrBe0JzlhNy+dIl1ts/GC44PzEZhCj33mxJTQFC3bcg47e/8FZY/FxAPCAKFEVqS81FlCACYPxtLc2h7f6jb15EyKngyVC8rgWxwGNfHQ59f7/31MC02uBJK2ZnfusoKAJ8Dislbmp7JPE9UgCjBUVZIMBLHx7JVAyDAHQkAoY+s2vUvj/0i93x6HHr3Ndqt993g73XviIIUMp4wGOC5xERr4MvYBiOuHwPtNsAHsbrrIl7jD38xnd4Zy47URI1W1rXv3b+wrhx/TUwZPmaGlu37klb3thmw6f7QjsyfKt1dnbZ7z194Tlgcep7hoZHwxzLapfaxYkJO3PqT1u16gqra2iwJbX14ZocHwtj7vM7z/E87w2OnAsGYvTkxYnwHdrJf/4N8zddtSY80/+/MNw/0Tv4evihQqIUiOfTPVsfLPbMjnzxWbE3hfdWKTSvUueBp54NUdDz43eR9xXS3tMSAAh/nomvT/cyp0CxnTf8lgWIQGphPCgNPv9gz4x0kmA/dPcET3ujZTCt6hXvZ02BaBfgpMZVHEak3S8FC9UeLzBcRVDIQJ7jeRkIbHtUeqJHRksEDJ8vIvVk5I53D0xTNO1+Gj6lSCMdfthC8bxE8MWQFMO4eBpA+/t7QxsXT3NlPRLn+g/vKYyPjdjRrpORsqjt+20bN1ht3Uo79E1HWSHYtlTBvQgsVkbLGGrBpx9/FKWBr/aqAweP/ZrJwHLMevL4sTMt94gAFi4PEtqP73wx9IXEwPvvtO8u3p1KBS8GdSBrjpcj9SRYKRhM5cYYLnJYHlcLCn2e4R3VAMaCcbUJ6hK2tAo3P5ZHwVdmChTET35Eip7x4e+R9+MHIZ33QWlU7QiIToJCoYcRqrpJBQqPcT++wLQaABJCAoBqgNKG9yQE43L/J8hKng/7i4+yIG88LQsjtBGHvu7H4X3m0RyEOXs+xIsgvynnvWh+XG3yGIRhuvRRvMCBhAWRx74FHUbiEBnMCRhHqhDm8jggBOGPQHyPSzXAEx9Xg7wM5VJee+UxGgN8y8LUT4LfMYh5Nt7cklgLOBk+/NgTQUgZiiBciiL61SbUAOWzzz1gEfsOfhn6PnzVh8brN0/LUX8QAowHL4BqQPzvAVA9ANZR7RqQU8UHUgC8GHM9iLALKK8lhCIl7Y8hiUUEeuNxTNY/dsqR83+88HG/1bG4am9Dl5ppEaDQFwhS7aPopSYy7sTRTyIhtG9DPMcXGtFRmJz0ra/YC5moBrAlnf36pK2+e0M4ncFCz38IEYDxhH3r80+HlvEiiyyyyMLH7D+mOQv2YM3IzAAAAABJRU5ErkJggg==",tuxedo_tame:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERAgZsqZHrAAACbUlEQVRo3u1ZPUjDQBR+LReQ4mjAwhVcgp2EdJKIrp3EQcjo0kUHwc3B2cFNcNCloxQyVih0tRikQ4dOhS6CAYc4liJYqIsvXNI2vWtymhoflCSXn5f73vfe+3LNjMdjCFohXyTBsZXVHNh20zs2jDL0+50RcJqmlYhlVYFSCoZRho/B0Hf+9a0X+ix8p063BQAAqqpy+w6zrMjFjuN4kw9OYFmN8F74MRiCaVbAsqoLO6OUeiDyWpCNpa1d37vPY848y/CmAJsKGH0R5+122+fo8OBI4UmBsHeJAwAiesOi1FcURaGUeqnEAvmrKTAPYRF6hkUEJx/cT2QN6HRbcPZQhMcLFfYuXbje77G5J0R1NvKsWVYVTLMC9/d3n9/3zSSPTAAydH2TyHSwspoDbH9sNzHNSiwpELUGZGVTDLuHYZQjgYhb3GfHowIwivk31VgRJVIDkEEoxHAfxyOnALZBTSsRAJhQd7PGRQpjUEWKiKl6o+bTD2wnoZRGVoREdgpEjRROWFbnIK7rEjZfC/kiYXs0Rs91XSKq/8PMtptcLJgVYVVV4wEAHfT7HS5qI2BRqScqiWVZ9iecJEn4TK0BGF3sqYV8kdQbNdB1fST7Y+S3LbIQCgIQdxeQDTBXCrBCZFERMi3n4xAy0gHA6LFbVpz8+QUR226C4zgehfGYUjpB62XrANwpEFzJEa3q+D0Q19rCjzIA+31cwiPxXaDeqPku0HV9BH/YSJhoSVKuSmMAfg3OWhpbdqGTCCm8FDXA2NmG4401uHt5B/vpORXR9wC4ub2aOHF6cp4OAKb9MZImS30N+Acg7QB8AT3XPI98MXL+AAAAAElFTkSuQmCC",tuxedo:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAACYElEQVRo3u2YMUsDMRTH7xuILnZQp4Lgoq5+BDsWRB1UdHByKnTxs/gJHCo4uKmjiHSz4DeQE6mKunQ4eYf/8poml5cmd+3RFv7kEq65vF/yXl4S9Z5PI1VLldVEVbW6mcRx3BfVT2rrUff7PVPzc5VU9H673e7/V+3f1g/ew/fRniSJlyIXAKoBBAAqPQD8TAA4BBiAQWRB4ABo4Pz/XBwm78s0FsgbwPbGYmp0fFlLlQUAEHSzZoIgBWCb+dwAbK0tD8n2UdOgdRAAAMvfBGFsAKTGSqWDQHUeQHVxYKIA0AD3LxbSZyqpPgoMHvhUmVzBVRO3AiQQQhlfCgCAwPMIVwB4F/3w9tIAsMUAydbL4aE9WB6ATum51VzpC+2UI1BQUktJ0PIBAPehUt1JqAwOgBvPAdgyNRMAUyCUAtAF0KAAdANSn/k7oQBIIWAb5SVN2M/DQfR1v+efCp+fHWslzcVHBSANhDoA3Zt6qtwBcH/3AeCTB+gA0OwDgjcAPmhuBA1QkonlDQCptElj3wbz3gVMLkAHt8IA8EREbZMCUOOAmtQYd4H/Eyote5xYuXIHgNnjJU9O8gYwdhfge666B+uCoQQAz+Zs38fMYxV83u0O3F4VAkAHwQWAGgdczgJkPBnOXaDQFYDUWPU91/P7qABMSx9QggNAzg25AoB+H48Gbokk6r1cR9KUO9ilaFbuTQBwTYazgVoHoKxBdjpP0dvHq7NxtpvmIC4A6qYlaAMQyiiJsVzhrsUnHEBhLrBTP0xuG4205FnYVABota6GNDUAfDsou2YAZgCmHMAfOKGQ6jMfQKgAAAAASUVORK5CYII=",white_tame:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERAgyMfHj1AAADmUlEQVRo3u1Z3YrTQBQ+TSelP4HF1FIoFBRE3aWyKCIism+x+DwKvoFPoRe+gltEvNgbSViXlS2FQqGGREuTdM1P48VyhkmaTJI2tbrruWkzk87M+c7fd6alIAggKpoxJU2pQZ9104Kv6heQZZmOGYYBBwcHHmQU056TOhEBAMD2XAAAYJ+leo27lmZMSa1aob8RKiTz3jwR4gabUoMe0vZcYMFYVeYXTuh79DlNmlKDKl+kCEkTuFmRm+qmRYGdjEdgey7opgWT8SjxNwvHIwvHI1nH80quBQzDAFmWwTCM3BsNvp267HOj0RCHg3PYtuRGcBXlUeE4MFdZ0/ZcGjYteWc9ANjkYntuoss/f/qMzuMB+v3+EoBJiTFO4SyK66YFbPJjlS9CSoqikHanG9pE+/EO9h6+Am2oQOvWA3hz/AFe3GyGDpAUt6ZpuoIggO/7UCqVQJIksd3pLr2PY7PZzC2Xy+D7PhByiafv+1AulyEIArh9554IAPR8ummF1mnJO14hITC/cGA4Pod2pwutG4egDQ+h//ItaEOFKj4cXM7z5Mmjx2LUUpPxiCrMWr3d6UIbQGTBj/MAWimq4bnJeLR2CJQURSHsgWrVylL2x8zNszzK3t37S4fHw6LysiyHgOQBcHJ2ugQ6e4Zer7eeB2RZQKpcYiTVa6mIs6WpVq3EgobewALOyz+sB22MBywcj8QltaTxPBJnQXasTsRUvrEJ5Vcqg3lLFXpBnOBcXRILL7uZc8DR0REBANjt7VOUk2Ku3emmZt04doa5APMA5gCk3DzrF8X5EwGIa4Z4in38/Ilb71kAULkoALu9fcrvU2N0wwAIm6aaLPfHCvA3SSkIAlBVlbDuvXA8opsWtOQdj9dwxLWxC8cjrFuzxIllg1HytTUPUFWVoIVUVaUdVlNqQJLytuemUtIs7+Acesk2JDUEMH6xddVNa6mfj2ul5xcOtS5bwjCrs2NFcvvcAGDGT6K4k/EITs5OQ7QWP9NqM1qWR5/Zi5dteIPAHjCN57PKpynE1n/e+8gV4pT/E2CkEqE8rWtc0xKlsWwSjDJCHhgbqwLf9Z8ErRWXlfNmYdOeEzamedaPehwqH+pDUi5L1wZgZtmEdxmy6TK0dR7g/3LJNuvw1u8EUUHNmFIgirgG/2cA4MXfdRBBM6YE/7U5fv2eXnrqpnXl3Z9WAfZaKnLlfPUByNoOX9kQgGsu/wG47gD8BiIoaztNTB++AAAAAElFTkSuQmCC",white:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM9SURBVGhD7ZjdahQxFMezq/WjVdDWKgiCV6Li4iPsU4jP44UPo174DBURL7yRFRVBKQiC1q6Ctn5UWfml8x9OQ5KZ6exuy7o/CDmTyWRyPnKSmY6L8Gnz62jl1FJx5dzm9y336sVzt7y8XLQ4NxwOXb/fjz4f49vW9mjx6IKXt//s+Npen15azI7FnE6eOFY+c+T4Qu135+gW9R5QXpOktsbYLz9+/i6kXTm8roI5SPlxEjUA6GXjfCmRJMN+/PDey7Qhp/j7a2dEKS5LUu1NSRogBmFv6yZISbwtef3d26zy06CRAWA/yguUlcJ2nKZjKnIobenY5MLAuZDXfWo8SWIMSSXGtbW1kZJoTOHUc2Hy07vF+ZUzrZJhF48woFV+48sDt3q552Xqe583vWyV5zkUCgvrkozPxCmDwcDX3BPI127cLGuK1nRY6K/5SR4n5RJg4JdvXvuwWj17y22sD9yjO/d9ffvcip8A9+tMAEPhNbhw8ZI3FjXgfYptU98c1ghCy6kNHTxUyH5CmoyiAaz1q156/crVQtrN+oLnFPp4XsqDDfEQjG77gp1Dr9drtQTGcpiwKGzBLheQAQh52qzBIWYEDAD0jRm/rQHKJcDESVTFZUmqvQkxD9o2FE9FgIgpPw4ab4N1kfdz65t7VTlFOSNV2tKRdxWWkFpztFdtO3YJCOUCxmHSygE6cue8P64zf4rag0uxx0+f+OvUvh3mAJQLDYCxoc43xqQNMLElILSDKIrseeAw4K3LVmjDGy/iNa5jIS1QLvyMpb8Na2TtBAp/4H257U9MPAJ0DmCCyFKY8Ewpj1JSLEWdPrpHv4Oicglo/TJJZAoTzymGV7kv7yr8QZnbtuXGmjRdZXzVIUzUHoE1cWqrRAx5NjU2qE9YTwsfAVVGEFb5FFLA7vG5/vTRWSFUfhrGqFwChCyFT1/JtoSgkJ04ylvD2iQYGsYuhWlFQvk/QJ4Is3LTLMynsFUk5/0w4hQJlqqfpW3p6G8tFo9tSZPehg6a7D4PM2+Aova/ngpxzxF11g1QJkHWn8r/RBfPKw88u/vQ5wHyAQeeWfc++F0AQTsAyiuLt/3jOmfOnDmHG+f+Aa1lvXj2EgkXAAAAAElFTkSuQmCC"}},Sl.cave_spider={name:"Cave Spider",behavior:Pe(),entity:Le(),model:Xe(),thumbnail:"data:image/png;base64,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",animations:et(),textures:{default:"data:image/png;base64,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"}},Sl.chicken={name:"Chicken",aliases:"bird",behavior:at(),entity:ot(),model:nt(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAACrFBMVEUAAAADAwIFBQQUEgkJCAcoIhJcUygpJRIZFQ1dXV3dyWOLiooBAQGCdjpbTSvT09NpaWlBQD4ODg3DsVd9AABLPyRUSyUhISElIhiWlpacnJytkVKQgkFyZzJ9fX0AAABGRkZISEhCQDMiIiLLuFqMjIylpaW1oVJNOht0dHRDQ0MVEwnjzmXZ2dlvb29oaGhHR0dFPyPCCwvIpl7BwcHUwF6Tk5O7AACdeDdSRzWwsLCkpKSukVKdnZ24p1JkZGSEhISIcUB1dXWKfT14ZDlrYTBNTU1fAABlWy1LOhomIRlMTExKPiMlJSV9d2uLiHOSkpJnUzONjY3GxsatkFF+fn5yNhlcXFwkHQ+Zi0RLS0tGAAAYFAzo6OiZmZmIiIh/f3/Ozs6pqal3d3fl0Gaenp7MzMy1tbXAwMB4Wyqadjawhj20o07MqmB0WCi0tLSPj4/MAABaRB/m5uazllSXl5cAAABaTjumpqaKioqCgoLT09Ph4eGSkpLR0dGZAAC3t7eHh4eFhYXc3NyysrKfn5+9vb2urq6jo6OOjo6Dg4Pa2trHx8ehoaHDw8ObmpqVcjTb29u5ubmxsbF9fX17e3vLy8vJycm9mjnV1dW/v7+srKyEZC/e3t6np6fFxcWEfG7QsWGmfzuTcTcCAgHg4OC1jTvj4+N0dHR9d25ra2vhymXdxGSfQEB6YzudeDdfSCG+DQbFAADX19ecnJzjzWXdw2TYu2PVt2LNrGDBr1SZdzxvXDu8mDlsUiV5eXmrgztyXThhTCqWOxs+MRqzppCpfn6Kh3WCe27ZxWCijV6lmVyxj1SzVFSzmlK7n1GhSklHR0dGRkaxhz25kzqObDFpVDBfPhx8Hw6WAwG4rY63rY6DgHp4a1WGajqfJyecJSWWOhs/MhvIDQ0B60kpAAAAXXRSTlMAAwcaCzmCOSbH9+ABkYLpc2kQ2ZxeXUYt49vZo6GcnGpeUUjp4tvYo4BfGP3vnYBgVvv67+zq6uTk2traz83Ir6qdmpZ3dnZwbWxeXEnz7enk49rYzMzFuKp2Vx7/RNzuAAAHJElEQVRo3t3aVZfTQBTA8eDu7u7u7u7ukIQWaIFCCyVQChQoUii0uBZ3d3d3d9cvwr2dmU4gLRwgIT38X7a7+7C/M7kzmYcV/qjU2XtVyCkkTamzZxsyZEiVZCEhh5StWhKQOGf7lKFDa5tN4hw3cCBOylyyZX7yKX3ViikEo+Mc1s416PHNcsMsIaeJ3b62eX7kLHM6C1ZMKRgd53AScIZExxs4EJKqBpwQkKobvkpFZ7HZWeAmT23BlO3whXxcaKfNnYGepWvtZY0mFR3hWx8dZWiBGwz4IT4JOJCxJASNGOFDDuab6qOflgyhLTk6JRx1bByxKkxlBY0cbwRhZJSHuGchac1UypllW7QStl4YOMgEEnl2hpEQxERklIGk5ojiSnxwyMGmHLU7o9kKljCI1JKBcJZYnAMgWDTGQemCtcDBcSprDKnYE4uWhJwZwME2qjiko3OBgzUyglRs4jYtiXGwlVOnfMdxL/HhLEHhlUMbdkqhP2jixG22hWqSmhOdoalTvuOQ8QYOhCS9QVDANldFWko5DMRDECpwH8LCYSMWwiwZALKpSB5mUbQg3HLkWMCFA47es5Sy/zYCYiQOmjZ5vgZESOz57Vw4l77sMunF6VB/9NYv2xBESBspCDmSlADEOCPgjJwxFzger1U3Drb1GoBIex5HCEiRJBXI7dYu01DgYDMiXqvVqgenY4MDW6KgHc8evmGgidseR9QgxbUxurMWuH+c7RF2W9QzFxfIqgdnEnRgC3BWQw/fEhAeAitiIMUlSWHgYEjiHAhJ8MQgIP01qMck0rlL51dHOz/hehQE7SIgmnMoxF+4dHuRcJNhM5S/Bo3aehk5Z/GJnQfOjqejR9+7ngjED2otCTmy/PegUaO2HkAOtgM52L3327QgLQc7OpS28Zgs6wHCDsJQ8+iO2wYgmB0OisdZ72OcyCJJJ1Bi0i4Vx++1MY47LkcUdQVx0tlz9BC49HyTiiPLsxe4yc5iN203e8OGQy5R1Au0brGKhBxyCABn5NgYyC9Dy3DHAwdCkpvyfOGQJDFQcOZfg0aOVJM+TKKtGzl2rBbEW7OT3d+cksRAwZmSpANITcJDAHoBmsQgPIr4dVKJgeZLki4gDQk5WpB/RjyOKBoDUpMWj2Xd4iD/vLn28CotxygQJ3HQhUO7GWgycCAgTfmOowX9/VCnL68mMRByxo+noJnBaUsJyBkaQS7/CzYAQQuaGYRtrztpMeUQEP4ReZrNBiRnSBQXwuUfOF55vsiukxwUJOeQ3qTFhENBM2UZQdAGEVoFF0k7nJIAYhwKUlxemYB0JxGOBjQPBXjbXiozEHAoCF96OoKQ1JeBxjLPlXda0Kq4oMnA0RWE5T78mYOQs2meKwZyakDTOGjyNHEaAy3XETRu3OGrFIQcj8USA7ksAed3IEkRKQg5IgMtv2jVFURIAHr56pEF4iD4ZhmfIeRQEHIYSL5oteoNQtLYl69eT98/j4D8XgKC5sR2mciaDxwOWm41AISk19OnT98/fM48i4tw1KCFKpDiUsR/AToyPQoaPnyOhJhEK4QbXeEe/UGD6n0PgmZSj/dYDGQnIGpQCMcve/UGYanb1YsL8orLZsdAs5eGCchFQciRjQEhqSYDPaIg5NhsKhC81WZwEOEQ0MwVOoOwTPe/IujjjYAnBCDC+QFkC8RALuAQEL6DLxoBGr7ofs1PNyyBgMXiCU1GTmRZIhDuQQYKyrA+hoAgCyu6OhZLZNmyOCDg8JBjGGhODDQ7CoI2eAhIcUWcBKT4NZx/CfIMn+OxzMGTxwNvtYCoTJaCcTn98hkB8mhB+GNFgjbgeuE7NRiHkwE4uoOwkEcDglwIwt+EJAQZzuEgJG1IANrAQYZzsD7DafN+CfqBk1kwpJQ5yvwM5PdKxxCEx6Dxq8NJDBSZrQbRk0c6FvqBU0owNiQhiJA4aLJM+4GjfVhGkABESR4NaLnxHC2peAEmgkMgEehWDsHwtCQ8BObFA226MyGNYHha0nBMC+p6Z8IE40FaUlwQzk7WCSaAoqQ4INzoJoFwx/X8AdSsiyCYCEJSdw4CTmbBVBCWum1dCrpZAzjmg4A0sC6Abt51pBKSA4Sr1O2uw5FEIEEo4khqUFrHg2QDORwPkg3kSCf8Rv8pKH3hLMSQsn3pM+aD0hfeO2xYRiABZ9iwYbfPmAlCTuVhEJAKIwcrl9M80ODWtcZsPjFMXa4aKQSzQJWAg23ep+GYA0rRuTd6Tp88zjw4SyaCkFSIczjJNBCS8uYikL2nTsRIleh/V5c7809BnIQcnCVOSgWcpuQQ+OcgJJUbQ+KkVsjBSqcXTChFnkLoYTuOV6dNasGc1KQk4KhJp/YChY+3eSGpMeUkD4kdAsdP0gdXuVUKwcyQhJzTZJYqD8gvmB4cAqfpeBdOAg6bJahFknDojvsbzjfW5mspUxngPQAAAABJRU5ErkJggg==",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAGfSURBVGje7Vg7TgMxEPWh6FHEHSgoSUWHuAoSd6DhAlRptkoRaS8AK3ELJJMJO9HLaGbiJOB1HD/pyZv9KPvejmfGDgEQ1xiGITL6vt9hULB4vomr1+tII/Hl6WqHIQHfX49J9/07WDibQKK7rtvQMmB+O9uKp+NDDSDxzCIMwAgg4ZFOr0nH8st7TDXi4/1hI57GSb/6oZAC9zH1ffq3uziZAfSTIoDIlzgicByv/z4/Rgjz1PfJHglS2D5SLqjKABaUIhorghT+V0Z8Lu/zG4ACWYAmmqtClQawOMz6eF4y1A5vSkhgTqgGWm7gcxdlABqB+QLFW11iVQbIthhNqTInYBJEoVpSPCYCvAVWMQZYlUArjccm2WJWgDifveZIywO8cpR9gyeweAOsKmAZoHWN4/rC/d8iDZDzH8VjEpTPauNZGSBFasRrGqQxZ2GA9pWtZKdFhwc2Sm614Sh3obJWB22Oa72/VgW8FtnaR7CiBu/LaoCWvVMNkD2CFGx1jtooc1D2en8qvYZJqyBW2byY1WZDQ0NDQ0NDw9T4AXr53/OT/m8uAAAAAElFTkSuQmCC"},animations:st()},Sl.cod={name:"Cod",aliases:"fish",behavior:At(),entity:dt(),model:ut(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABjUlEQVRYw+1WMU4DMRD0TyJR8ARaChoqJCpEJNKlokpPCZHSIsEbKEiHKClANDyAIjyBRxjGunHGmzUKIaSJTxrZXu/tjmfXpwsxxnA96sfL4XF8vrsiAuxcf85eiLA/OEl78Md7ugf74+15jqMxPBt8U3IPDAYgwfvrFMgESFoJ4MGel/g7Dm2F34KjMmWSLnkiwBepgKgE/3ngkGInILkoUxKQ4AU0ydvDTbKRkFXL2kQFJs9geTMBXVgwOAngBDu93ah1xhw2zGsEOiWiSwCy1qAKoM5MbNUiESJ0j55afLi9vAJIIo240C9e+bomVgJ5XShAZjytHT0bRi0D5dUmNd2v5chNngjUEtQarebDsunpmAy++p0pFOBJ7MgrhrXOvVE/Xgrs309Osw/msNkmjOuAl9wm8+y5PjWwcfCRsXfaNhnhNbSNx2YsrsRfoNf3J79/I7Aspk8f5TVclUB/fBH2jg4TMIftYHj2ayJrJbCKEhuTvlqCTROwaAQagUagEWgEGoHtJoDfkC+ediSxd/s1IgAAAABJRU5ErkJggg=="},animations:ht()},Sl.cow={name:"Cow",behavior:_t(),entity:vt(),model:wt(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQpSURBVGjevZmhbhwxEIb3ISIVllQFRZWilpYcOYVGB4oOVKcoKK8QEh6puuCoJCzgQHl1JCSkhXmPosrNWPpP//43M/Zeq5w0Ou+u7fV8Ho9nvEMpZTD5sX0cyaf3b8rs49ud3N7els1mU8v2DPLh3esqfM9keP6dnp6W4+PjWtb+/9dP+zX5fX9femWIALDyJqY8AAAClFexZ4vFolxcXNR/k5cC8Hh9PVLQrk3K3d3gSRcAU8iUNyvoAWAym81G8lIATOn1+fkOgJX/GQDM//LysmBpZMqbmOmzvCQAtQD7N2W5HvRuAoDy9m8AUM6UN0ir1WpgQb/Whwn6RX8oq2/R59E12nnmfxAAzLQOFINXp6fOMAOgCqCNLjsA8JTXPtDGFIbZo5wC0Bezl1cHyH4Az6EQt2Xr4WVj/wo0Uh5idVRZtOX7aMuzzpYQAsAL/zx3gsYZAB6g1f16dla+X12NZlPbMQCePb6vk6D1PbMHfJ4AU/Tb5y9VtBwCgPn+XK/Lr5ub+uKHh4cqvAz4vpWtLurzjKoCHoBo5j3ocMAeCLvPfUTevguACRQaqnsoOwC7F9RWww5ApkS0tDzl+bnnIDHjDEjvWVsvMPJkBIAhZAq0JFOO4bRMXv1N5Jv4Gk5zMgDtUMtPT08jyZTgXaAFx6ujO4Rda5jtbbn8bDKAaNbtnils5r5cLqtYGRAUVjQoVj6zMp59hsBtsrgD5YMAeDNn5e12WxWfz+dVrKwAemYme87v44jTC7iihIb7nAwgCoQgGtCYoA1L5MAQ+UFaJpyBsn8v7uB+ce1Fm1xvMoCTk5PJADwIkYVEIDLHp0sQz7ItswlAo71XR0cW1laxsqc8A9CBevRbEHhdt+IFBeA5Uw27UwC69RwKQEF4TiuzAramKVsrQ/DC5yYAncUpAFqBT4/5e2bM+UQWg2RbKkeNVjcFwGJKs/QC8JbDFOVZNA/xAGhSpA6Qc4YRAN3OvOsohOWOWhEemzUU61FezwoiC+CQ2csl9pImD4AOWrM2b90xgMwsPQARCAXAHj06p/CyxMgHjABk66jH9FoAdMAYnCqv25gCiM4BvC03Wgb8bO88oGddTQWggwAAT/kIgM6mZ/J8XMdKsv9AXy6AKMDwToK13AKgM9AbIrPyvBxbZwdRgqU7yZ4P8F7gHWlFTrAnwWkpH4XHXggcQY4mIgXADqpnF2DFskCIz/S8bTD6iMH1shQ7c7ituiMAUfYWzRibNDqqH0MaW6CmrtFHjAxA6xA3eq5199LhKDPzYnOeVQWQnfCqqUcfMbw8P4tFeg5i1Cr3DkSigwdv4PxiBpDFC95ajz5itPyClwjx+1uZJi/doZWGtlJTBhBBiJxd9BGjxzm2xhcFQthddgA01u8RLzlqfSuMAHiO8JC+IFkUyLEFxv0XsXAXcxf0h/wAAAAASUVORK5CYII="},animations:kt()},Sl.creeper={name:"Creeper",behavior:Qt(),entity:It(),model:Dt(),thumbnail:"data:image/png;base64,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",animations:zt(),textures:{default:"data:image/png;base64,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"}},Sl.dolphin={name:"Dolphin",behavior:Ut(),entity:jt(),model:Ot(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Yt()},Sl.donkey={name:"Donkey",rideable:!0,behavior:qt(),entity:Vt(),model:Nt(),animations:ji(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAC+lBMVEUAAABSSkNCOTBMOy5PRDk1MzBnWEtGPjg8OTZCPDhmVklDLyBZTUJTTUhXMhYSEhJvYFJPSEJAPTpYT0YzLSiFgHYcGxqFgHcxKiWFeW0yKSI8ODRZMxeCgHY3NjZfUkYxKiM5NTITExMWEQ4RERGEe3BUTEWEgnkNDQ1FQkBvYFNFQT5ISEg9OTWCdmpsXVCDe24NDQ1gUkZ/bV4zHQ1QT005MiuDcWENDQ06NzVAOjV6cWZVMBUNDQ14b2VMSUdsXlMSEhKDcWFCOTAxMTGBdWhHQj0rKixhTkBjT0ENDQ2Fc2MNDQ1BJRAkHxptQR5tXU9tQR6qo5hNLBVtQR6up5x2cWlDOjJNQjhHPTVJPzZTSD5ZTUI9NCw2LidCOC4xKiNmWEtvYFN2SShRRjt9bFxDOTCAbl5GPDRdUEVMQTdfUkZOQzkMDAxCJxM/Ni41Hw4vGgtUTUZZMxdKQDc+NS00LCVBODCIdWVSRzxQRTs7OjpiOhxbT0M5IhBzRiZOLBNVST9PRDmGc2NlV0pfOBuLeGc7MytsQB6DcWE3MClGOzFrZl59eXB0cGdtXlFgU0dYTEFCQkGKVS5vQh9jVUk6MioWFhZSLxUUFBQ8JBNzY1WIdGNXS0BKQzw8NC1nPh9vbGRhVEhORDw3KB1WMRZnYlt8alppW043NjZxRCM7LSMsJiFbNRlLKxSOiH5wZ112ZldPSEFIPTM7NTExMTGATyoSEBCGhHxRS0U+OjY5MCkzIRWup5yJfnJiXVVcVk9YUUpFPztGMCFFLBqEgnl6dm56alt5Z1g9PT1AMSdpQCJQMh5mXVM0MzM4My8zMC07Mil1SSh9dWtuY1prXE9OPjJGNytBLSCooZaAfXaCfnRYV1ZKSkpuVkVDPTdLOi6HUyxCNStsRCYkIBs/KRrV0srCvrRPT056XEhzWUcvLSqXkomGeGuAcmRgYGBmUEArKixbPysoGQ/Rzsa0sKiWlZWJZEpxTzdUOSYwIxqYj4RiV016cWYpg0vXAAAAV3RSTlMABX4Vfw5/f+1HKBqAQPXdrqdVMSgM/tPEuZeOiICAf35oZUg2KPHw7d7dycF4XVYV9fPv6OTVyMexpqSRe3psZlEc9PLu6t/Ws66XlXb01cW6nZV0bDoAbvRSAAAOQUlEQVRo3szYZ2wSYRgH8HMm7r01xj0+uPeKIxr31jsOQaweCGXdCWgRj1qGoEU0UoG2VlQqtSjGXWNt69bWvVfce8e9Pvi8d84YjQkY/SfY2C/95f88997bYn+SYnXqtGmH/UcZZrFYDlbA/p/UeWyh4juUxf6b1Ki1/7RcPrgU9t+kWQvXEbl8CPb/pM2+fSAqj/0/6bP/4kq5vAyG0r8/9h+k50WXfFLzamijug5sg/371KjlSp47t1UJ/hDo2gz752k3cOGRhGWLGmF9noCo439wLE1cmL8shRxQvdlF12NLfBXs36fvro0LNPouxWrl5CxUDiqG/fOMOJwgnLd0ft2eOfsuKpVVsX+dMpFI4ruzJ8RrV+53uQqUPbB/nXKT3mVmrgsEDhs2rnCt1g347czatq5cDfu7KVbZnRWOOBwO880d8/P3CzS/nlmxtq3jIH+ZVNrt3n18bdCWbTbffCdezYi6/4rTl+NwJHRDaFKp8d94ANq63fHHj9f0e88XmYH0vGCHmHv7N8G+pUT9+iUwnvON1LSm11upccw9Zd3uNCpO4IfUPB8A0vOgoR5WbkQn+tuO9ao4Y0bFwQc3bKCoDQdl1Aae1GG+FxLrlvp3DG2gIGf0fu/D48eevS3SajV49dpamv7K8SUm+tDnWUhmsc9yymSIdSAtLi4ekfwxLalYV4oPkDKOb57iTglr2dvLa3fqVLf652FBO+tmwCcTSFfS7RaZ7DMrBCS5wb+tUixBPRFFlm6RUZRz1sEU9xlSn8qmnlhepdh3HJuJiw1aOvzA4rTY7bOouLQQP7k5En+/GF6GKMqS7rTMsoBq1qwDbncCvopkz+k2Ni/xhWMDTsDh8ThMUFMmIkFLMLQDMgoaQpF3id0DZk1zzkKRIY/M7V65MYPZOJlQkBl1+VU2OTyOIvNUc7Z56tRsk81kmwGkK04nGho0lPb1EIhJqnVIcVOcKF2WDi0dyGJWr2Bm5urOs+Id43yJmcDxZJ88WeSji6aiZAdgcJmI9ENLWcLiMXplKK0h6ktFToo6kFzw+nUGTW9i2dzDgcxMm8mBmlkHT9xN4PxIomC5wQScxQI8RiCsZFYaxXlAgzzJK17nhOnCgkKafmHz+WwBM0JEtJEAfPmBxK834swxEgK8R2yOxPGj3XEhZzrnCVEHdq3erbpIasNMPkO/8Of6fJmm7Klbr081Tb2+9RvIDOttWzcDBmq7ctAtFwoRSFI9Bp4Soxw3rxxETz144qxpH5kC1UOjNleQn5wfXuv124rg+Ck6uY7dugSy9TtQgAfN8J0VCoXTlAg0PAagMQ7YkJP3QxQkLSVFsbsgeSPDspqM/NVzyW1+1YuTWx2RVFarvY5AX0syZwegoUxfYkStvoY4BAK1Lxc9aMjbbDMEkdI0ymmSeauTd6WyNwQMM1fh3bZWte35EhvLshHb1OvfGjIXOfgTKVENuYY4OhzHJaroK2rWkZLdRyLPzQebRPqlhu0FBXvVhdKrzCqCWGvAb3lrhp5HirZuzfY4PFt50UkPLLQNcVJZBDpHEDAwDtS+RLS/+9R68iQv7/F9WAmHr1AkkmYwu/eob2uWisnpBDEd1/i9NRccTH+DygGCwwztoPMacWCQLA9KSjB+Bql6Rwmqk7f+woe8vDzZW8c6tXqeKCzNOL/3ttgg1uMkTGGmd9sLrdZttyPSdQ+stwkedxPXDqtl2VTk2bvJKDQij3StStWyVFSesY/yLuzceeHDY4p6plazwRPaPXv27jUYJEsVAlTQDS2KhJJZgASzCsCLdYYtMTExwsL3ec7ZaUSSkQSORrR2W5QVTdi58+7dnSDKe+KeH2a14Y25eyJ7gxKJQQdrqiiEmWhTw9s0KRY7JB0N1mbyeAJqxGR5DjzxOh0MbKZIJFrr36aK6hZS68LdO3de3t25Pu/UcrE4N3j56XZiQfj9ewNJENf2qOEGcn6TktAQSTL7LDu8R0MPTDC0dak0jerhOUIlKSAVsG0I5PWrVNFc1Joef/Xyzp07rx7lZYjniXdffroLPDT9Ht9UeBt+3u1CgBEkTsw5KJM5nTJI6FkEygEQm8pzjAqBQDAdx7+BumFRpN7lR6+goZ0u8e6NV58+vSzIpSHBXDSP8zdwbnC4Mg4kiJNut1MpgIGw7G2OQxA8CBaIHxlsUZMoQKU6L1z/6NKF9QsLGObe5cuHNtN0blgaprWp5yfjOIk8xBmeku60251ThEIAo4GdU4InAQ4gJYBQPRwIPFFW1Gbhvpz9D1cs3L+L2b5m9uzjEoNeKg0GRXrRTFwAnrlu1A7sD3yhstA7iwPRhUQSAimnCY28hwcBJ0oQVsd1aV/+9v378xkmY82aLQ+Dy/XQjV6kwacTioQzwAiB5QDcv1YSQggBHYqC9A2j8HOMOt1n0Lz5tzhQ0+heHTn7LrkKViQzkM1HjxdK9XoNWggpjivi4XKaxn+yJhEED8pdYBQE6cm8BoYG56dUz3HEYg40NMrLfoNLOftcC5ldqxlcXLfKoqSZy6XSySJoCMenxJ2xWqdkWa0pi4GTlMAJYGokgBKmof/ARpMK/DNHbABQ1Gc1VqxBi5yci8mrkxlx7WIN4+ULNCJU0UwOlDXFarUumkugCD9HqSNgZLBDCUn8E4aOxKXII0Gg6F9nWA1EWpHPdCmFNYyPF0phalLkwePPZE2ZMmUuroB2lIQQOuEuhqQyqD1HJCXBI0iSP4FaorM6BiQX07wsBiC5nJypWc55NPIpKEpcR6JegASBg3KVcI/62rQE8OgIBQ/iJyYZ2aTl0Cbtm8bkT7ANkstgCDRn0jJur8EjmmNFoKTpAgHsjYDgQTr4B0CwP/DKIEiAz4R+IBKJpC7WrxQWEw9q6VPzdvPaNBjHATy+O18OvhwEwZeLIOrRg168iP4JT/LsSZpKCGkSLJQ0pQk9pBQK7SZtYLt1ZS0Me7Joe1h3EBWFHrYhCh5kCJ4ET94V/D5JrYgvp4X6hY5Qdvjs97z9no4KyLFSiWWKpKDrOv5uZnGRh4mC/kvyipjFnkRjUNGWEINMQa7qtvcKu51jjLFSxjQKeb70m1MQOtTJgElxhd6JNPZMQTUikbO7DtofcBGz9UIWm0tmaQpCih4HdeEpvrj/cWvwC6iWlURcFHcfpDVLjGUsZup1PWulO50KQJR78IOfXdiGTPEdHQ0HPwYMoCp2rcRAVgYgyyp51ChVOpbVsYkJDq9SmdfJjHyjrVHEoXmcMa0WIYaTECjIZFgkajCbWRk8mcQEByAET/HDB38ETjf3WNa1TLoZHcSOsz8BkFZsMQSQUiljYc0BxDmOyCPFMocCJOV4mh02ASG7DzokehNSjPkJMlGdKcggo164tpbLLbxPpyudJEGUghSwHxgrw0GEAEQhcbjHAGjUG64vrD3O9d+mkRhEaTIgKmoBKABNBs7hIMIlBolWlmj4PkDPDNIFqNOIQfiVxEDafMSZDBwlPJDw5PG0NfT9cIW/bZS+pht8DkkmQEYSqwwgp6xpWouDWgAFgYSDLU4BjRjprg2H4WM0HqRQK/B9HaCSKAJEEgAdbGggmZwUNFmx2LQCTZf1woSDrD9bCB8HVErhDaXdjeZ/pSRiXJMBpRst8QdpvogVVwQoLxNEjpK79Mygkl5PpUjWrVGb8bRQH/QIyYAYC7qc5GmT6GDgsCVyFg+Hbx1NpQwpheQVVZFsVuw22TxAeSUxENvczE2qZIoeQNUamv4sanT44h5hHyw6XlkFoNSTVhFVmpcIQO2EQJa12X+wEJMcLLosukF5GdP58LU9/DPJ8hNwOMgFiNCuaTMPI9pWq4mAlkqN9Lc3Dx5wUpwqb3aUdv4abhMcpJWlOh8xVQVIpx6bb3mY9lW1VruQAChdWUq/ebQIUX+zOAEhG1kiIBy0YlMq1XWA3A2Mns0CamD+VAFMBIRw0OpCv98JxBhUIyKZgsLxQMJmVd+oKgCl6qJHC0p12U0I1LAqE9Dim0604qq1PHF+gg5cHn8ZPnc0Ua5ujziIGnrWdZVkQOcrDdaIQasvH/UtxpYaBiFTUJSTdz+H4bo48H0O0g0j9Vp1FTUR0DFWAujt4qvV1QcApTNsCfcyA40HMYSfuXg5/LTj+/6VeMUBxKNUk7l1ZCr3+vj/y+r7Kcjk7aD4y/371vWd8c3TxzVbqk9AblWWEwEhnbcLT5/lFgFqTEAIQL+QTp4WhOPr0YqLhmxDlrfPJQDS7BZIAdrltUV0X5XKX0AIQJ92nvP9s8A3hkFvuPug/YFGNdZkJlmhm/2HaSQCOYb5J9CR6zuhP3A0Q1G20bTdPrnroEO0a2uoEu++rLcP05lGXCGDmFT4PZhLd/wvWysGOP7hcweEBEAamw88iqWe1XC155PaM0WA+LL/I+ni3a1wDA5OlgSyFyeBRnn33FbK/FYNEP8EhvwVxEmXxwlxAErVHZHWUzpAxG5Gm8A86vMvEHIyGU4MonVdB2hD1WnAOEkTMX41nQgzCEC6UefNTs1V80bAbFTJA2hZmRHokJ6KsoyzUk45gY0qiQQgtzAb0P7J4YRmAiCJanbAKECKWigIs8h+DVMaIEXlIAP18QLa1gGqqcIscmiFt2RPdMVVlDxaC42JaND0Ago2I1DYG6DZKKfkDQ5KGSYFaFlRZwU6daX3pfdc1Ii83StwENX1mqrMDITMnemFO+sfRr7/QeftoI755LrwuMKsMnd151Po+zcm7SBAnPNaFmaX41fDG6eEE5ozXXG4JwI0w+zD68S6M11xVXl7KMw6Jz6FzyVaLrfRDg784exBGLhwa2BreYW3X7fPCrPP3NWtL+OVUdQN7hP+i8ydGYdjcP6jL+nMXQnP7mp1vgP76ljhQzxrAwAAAABJRU5ErkJggg==",textures:{donkey:"data:image/png;base64,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",markings_none:Gi,armor_none:Oi}},Sl.drowned={name:"Drowned",aliases:"zombie",behavior:Pt(),entity:Lt(),model:Xt(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:ea()},Sl.enderman={name:"Enderman",behavior:aa(),entity:oa(),model:na(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAAsVBMVEUAAAAICAgCAgIBAQEBAQEICAgTExMDAwMTExMBAQEKCgoFBQUAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAABAQESEhIGBgYDAwMAAAAAAAAAAAABAQESEhINDQ0AAAADAwMLCwsQEBAJCQkFBQUPDw8HBwcUFBSIA8fBPsSSM5NhJmFMH0wqETAqDyoeEx4RBRKmHszLRMuvLMSlOqVnB5B4G413LXdMAHJdFG4aACcOAhNbiBqQAAAAHHRSTlMAjjyOEH/vvfCeg3r7Jfnt6OSIZiHbcU5EMQsKn8CD0AAAA3JJREFUaN7t2teuVDEMBdBcLr336u740Hvn/z+MJGcAAeIJJPuB/QVL8k4mnpn2b3Lywq0LJ1uZnDx1GgROnypCmpwgxq0GaXA2nBx1inzSyfNnwQZm24BdOGA7ez6TdP7sZmtY7t0dtk3YBqmlhYYFty4gtqluW5ABKLa0kOkQGBEFgHjfJgdzQUQ2LArCZIuTCjKBzpO0Ce8cYckEgRk4ETnANjkmRu6JIGaesxIBlsFhMkHOBL0kBlDrABwDRoGYC3r06QvMdB2gyTHPBT1+9fDDiwESMsM1M84FwbN3r58ukHZEJwpBl0RQD3r+DODJC2IZoMExFvGWljNnmAXg7ZuPLwP3mZETtbwcu6rC8/cPHz3dOSHM1vJyPFscTJ8fP0H0dewFr7a8HOG6qI11QzScuXr7QcvLEcAQMaqsCgUK3myJWSBGJ+ZAYxcmvtMyc6Tdeb2IeCRo5kLLygIRDZAQBkO3BTpuWVmg2EEKcAD5UUvL6pDKAolNEBpJOggWyGg2CSUf5PEN5FwCZA5mC4RGiI7ZIFgX0ACtDikWAJEIwAHUOX1kays7gEp0KATgABLCLukjc56eiAFC1QIdcl69DoEuHQqAzNdnmWidU2brYuQ6IEKkSvcQCIIuEEovAOpd2QA0tCNUKHVHZIcRliogYNYBoqgDcmTTEqBjOYCImCMKgPgHCJzzQUdyADkXAcEBhF4DdMyCCxTEYJIPOmKy7x3aL0bJBekE2Q6yNTLO3VwXCHSB3BcoudR9MAyRmAERQjD9lHmsmxp1dsg5H4T7sZe+So0FQAa+H/tuLOnH/vDIR1ogIq8BUrRYoAhM/7TfQdgFOkb6m/qYv4EUVqnTd3v5BVRgt68F+m1kwsVA6aWm4J9BIckgolod+gUUXgBE8gPklAy6cXGK8MfILBnULp27dk5UMWSB0r/0nDmxnrA2QcpUAcSiaKosBX6e2kHkiAMUVUDrCYsAWArkLHVAPVicKGSBTrXMLBAIDZAYypnLZ+623CxQF8SAjniiwH9PJ0hNFMAYT7QCWSObIP8P+gNIDqCIIiDCHdSxCEj6DhIvAlod6oU6xCrEpsxVQLNDNEBUBuQ2QIVGRjOmUgvkSMRWCLSnBOjeWoWu1AGNVejimRPXC4FaO9laLdDIjctzbpdandw8d+3C/fbX+Qpm9cXLHCCNAgAAAABJRU5ErkJggg==",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw1AUhU9TS0UqCu0g4pChOlkQFXGUKhbBQmkrtOpg8tI/aNKQpLg4Cq4FB38Wqw4uzro6uAqC4A+Im5uToouUeF9SaBHjhcf7OO+ew3v3AUKzylSzZwJQNctIJ+JiLr8qBl8RwCDC8CEoMVNPZhaz8Kyve+qjuovxLO++P6tfKZgM8InEc0w3LOIN4plNS+e8TxxhZUkhPiceN+iCxI9cl11+41xyWOCZESObnieOEIulLpa7mJUNlXiaOKqoGuULOZcVzluc1Wqdte/JXxgqaCsZrtMaQQJLSCIFETLqqKAKCzHaNVJMpOk87uEfdvwpcsnkqoCRYwE1qJAcP/gf/J6tWZyadJNCcSDwYtsfo0BwF2g1bPv72LZbJ4D/GbjSOv5aE5j9JL3R0aJHwMA2cHHd0eQ94HIHGHrSJUNyJD8toVgE3s/om/JA+BboW3Pn1j7H6QOQpVkt3wAHh8BYibLXPd7d2z23f3va8/sBBP1ye+2uXGsAAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRATAhAjRZexAAACMElEQVRo3t1ZS67DIAwExBm4YE/RK1Y9RBdd+QjZ5G1C5Fr+4ISW8JCqpgkQPNiewY3BaKWUVXsOADHM0agdMYQQUstIANi/8fV/aNk7oJQym42rdj95ja87PwsQdZ30u7bkmQQAPq5nbtUOVw7AHjCjsVxzhcCsu07XjcMheeNIiqWZPAAzWW7gedb16z1rPJ2HuY6jgPjwAMr1kttIiGoaAYMoAToiFHYdgHeEQ6k+x89ax1xRQ+B1JG0nrcRH+3GeQ11/JKNwFJ5oB7rTr/uSn2HJj9t7V42P2zs/w5Jf9yVrYzkgrkCleI2xJjEt5qn649SgNJ4LBTImftlYNUnHqomVRcYjL8CA0JxAEuFYAGiHs7SkvVDwnOEe8K3T1qF3tOqK1vqENV8KF2wSm2jsJCVWK+Hmjq7W7dzAJdCjGkJLxgDQ1wO4nesFKtUZXjqVGCuPdvcWFtG0PJXxEqth4NynQQ/KPeQuld7WvFxfTddgQFJv9z8aBtY4rjDbmm+4sHFVhH4pUS1jPB6mhVEFMoUQ1pPcG7kPWig7/3Zv5VRji5EtQHEMQt+VNtS7qzEAiCgeo/ScMxq7OweGBBL2oNYT7XAWoDui1RO0MVYt4ic6oCdzSMUXycU1ULTckc7q8rPavaXQYiVHro/GFGJBxDKwlLLS342czibBM/8zto6xckHcsvSeqPBirUKIdrzFBlrKjHNzLY6lCrNUhnMVRM5qee88GuV5QNF+a+0PCcMdE7elCQ4AAAAASUVORK5CYII="},animations:sa()},Sl.endermite={name:"Endermite",behavior:Aa(),entity:da(),model:ua(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANHSURBVGje7ZjrUhNBEIXnAawSERIKuSWiISEhNy1AbjGJBBG5G4go+sf3f4S2vw4dA6Wg/JBskq7qms3O7mbP6e4zPRvCla0v7stWqSXr2XNZTm1LciIn02Mv5NnT5zIXz0josnrp2Lz6qhnmYumQiGe6p8Poo7j57+y2+x7U6oVz0ReTWulIIAPgbU/KzHjqGgGrhW/ma9lmmJ/MG5i/JeC2+x4MeL2oXjiTs3jJfDN7KJx/V2xpNjRkNb0rlaUTG9XDVu446DVhLbMX9N5QzTfJoPB26fQa+O7ju+57MNM/l2r+kwF9k/5g4/LLhuy+/m7nmackmFMA0rNA7mtEFpDl+aoUEptSTFZkZeG9Rb9WaBpoflMWZMZcV93eTPPbUr/nTVPeoqgZYIJIJtRUE1S0rBw4p6IlE09mJT4yY45GJLoEMpIEANy8eN4hwQFXCqeykT0yAiAEsJOjCSMhNjItU2PzMhtbYP6Ptd/zRt3iWu8O/p8zIJK179YofTER8xFxc8DUfCV/cmcGIIoI4sbiQec5kTEizwv7SCkA3pZHjT69AeA5580R4GOPp6xH8AxYS+8ZCf6cKGWALndN8ZGo46g//YECUwJ2RMHpyvBZtksXtjr4dawiXMu8ZkDnOVHKAHthHwFtgBT4RvbAgHGMcx7wXMPSSW/APMd2jR77cyJDABHlhX30+l+9WvuJqh1nPsr+yg/rD5wAvwbgtpdQgvw5kSKAqPrY7vx2LL3JAIADlGaI9OY6COAc80ScFpn7nACeEyUC2J21lzt1hE43KeYKMigBQSMfNPImkAiendclE9FjZBWIrBGxzdxRp84pAYQNZ04jb0sbREEA4DXypvbsCyAk0gSYol8RwIg7CdSyNjuhr40ou3qb4mfaag8BkENzQ5r3MwGa2i1plL8C3uqalFYCyA4DH6nG5j4ZYMpdvDASbu7vIcLFjtrvO/sFvGWO6ltW6KaIEQIQPG16jIi+s53ypQFlE6Trv6k8QAFONmj72wGPHvS1+dfe1FQ5JCeyYeBsJX9pX235XD0znho8AvheTwZoN9gbn6z/UyNkgseoTZDt6/ndFr9m6Ps+APEDKELoHzQGqg8Y2tCGNrRBtp/8/g8zddrEyQAAAABJRU5ErkJggg=="},animations:ha()},Sl.evocation_illager={name:"Evoker",aliases:"evokation illager",behavior:_a(),entity:va(),model:wa(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAASBSURBVHja7ZtNaxRBEIaH/AklSLxkBS8eFIXgQoggXkTEQ8gvEGEhF0+5C5pLEBYDIZeAB3PJRbwloLfgIXqQXCL+lnFq2JpU11ZVd+/2zsx+DLzMR8/O9Pt0VX9sNtnS0lJm6dPhYQ7a6/crldeOjnIs0wT3fjk5KZ/zcnMzB73Z3i6F133b1dVVfnl5mcMeRc+zcbcQAKJ5AgBNcc0UAKulwVCn03GEALhxfh4D4OLiYn4BgPlmANBcZ6FfFwBuulkADUQAmkbjtaeAqgEQXydoKTYFaCrUCsDXD9CRgioFAG46aQSIrVqIG3bOWSqUZUr/YEUOiA5vXNT0pCT28lJrh0RA6P20LASAFPqpAKkAYgxL9/sg4rHUw0s5b0n6fGg0ZSGtreW3ZCgEAhVWGE1L5k9PT/Pj42NHcE3rGCUo9BqeOwC0Fl9bWyv1bne3qjQc43UrOixwFAAPc25c678kEBQAHzYlYBka00IdxnQ02z84KIXnUGalCD4b9lQUgBbWYCy0I9cgUBAcBu4zWiEtV2G7/7pb3QfHsFmfocY1CLCXct5qdSsafBBoH+EAkFoGzbzd2ck/7O3lH/f3qwgAwTUok3Kbm7VEKxPb8lYkSGEvpUQGJjQIIATwamvLEQLg99NnQTk+nx7Tcx76o7S+FQXaLBKPM6yIBgKmtBoAnO5qxkOUyrwPggQjyUwyRYWxN0/1TD5sSp2kb4SZuY3PIyb+wifPX6hjP5Qt37xhqtgyUHE8ncQpAD4/aDWA7tNnORWvWAwAbf6fEsDdO6s51cqtZa5mAUgzxLkDwKNgbgDAnIAvjuBaqwBww1A5Kl/5vYePRGE5n/2Ffk6TYDBW9QJACNR8qwDwCjx43HUUWx5qZAFgnlJgAWCRAuEAJMi0MRYAZj0FNACkDhmYGEfOtr6+noN8APC+Xq/naNSWtD7naYjJANAM+sp9RjSNAyDp1lYAhur5XuDs80Z+9nXDW1ZUWhRU1KdRPkc7NKjHyu3Va9HObnDNuSdmddgWALgqRFHD5996snkJQOzyGB5+/qMXDSf1NgSAmKsAaEPeOBHw5/dB6wFEpUBsBFgAgHxdALTQHkoBKxKMPsEEUEgs+/XzfTMAqNkBAKgLv25BGwKg0bL6gOqlCm14CVYOVEYMvHiE7+is1gRBQ8WY52ljvkCCYPa8o8zFRwEgdYS+VJA7RBsAtiaGe9WKNQLwAcE/4OK+EL+/EvhAVdNiX4hVENKYTw4Af6hJfrDpBeCsC3whRnO6jQCo+cHfHrKkOYa5kyD3JwaApkE6AGzsdIabGgGM+wXI+C8Y9LTOcDOPAOY6AnAyk8D8FAIoVK4L2gDAmORMFEA597+eyjYDwDfVnVkAfJqLZuleWw6nAlCuCXAi1CYAAUoCwJkJNgBAWsWJU3UhEpIBKIfBBgDAu/GfsPh8BFOTlvMl+NQDwJ/q4k9zYb4PEKA+uAag5VxTnwJgDH9gBcf8nzHQPBXeC0oDoFhC/vv7PWsCQP1fOrLK4joaAAwghIDg99HzVvn/D2WIPRjwQQp3AAAAAElFTkSuQmCC"},animations:ka()},Sl.fox={name:"Fox",behavior:Qa(),entity:Ia(),model:Da(),thumbnail:"data:image/png;base64,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",animations:za(),textures:{red:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAACoklEQVRo3uVZMU4DMRBMgSh5AyCeQB/xBBr+wB8oItGTJ/AFCsQr6BAFLU0+kIbqYE9MNLfatdf2cbmIk0Z2zom9O6y9s2axWq0Wx0cnHUPevd6edoLPu7MB8P7p+rx7Xt+bkDFvXuvBnMDXdjvAwnm6rmtGbyQWYmPZ+c36atCCgPeXx95htOjLmDfv7AgQY2UR/OUAECBOM0AAnLWAuaSVuXneKAEyzyQESFhayBHgOQ9480YIYOel/y8JYOydAG5bCWBHeWtY0MTADumP4XxPgF5EL2gh9ZsS1BCA9UcjwFuslICcM9460e8JOBpHJcAzytMBOWcelhcmWgjQ23D0CBDAQeRuafkglD6PwTCew3MemDUBuRCMGH5wBCA0IYg2H2+7NgX+btR5ASIHLYsntDzOLfSBtKMRkEtXLbWABS1zvTSqv6cxCQEttUCEgJSOmA0BtbVAiRKsfQ5SCieN+ZXF3raz3nukHiwBpeqzZp291gK5p1d8KuOk0nEzAVPXAjkCvLT7ZwRMXQvMkgDLGd7zDLyvrQU8gwFvS3mEjhYBXAvwHZ6uBax7wxIpjIWxlo4oK71CHXJkcmvplNnWAlhY1/elBDAJOkuV1AqT1wIcAdp5yGvvkjV1PukoqEqDml1xEBJX+tZeg/N89x8Zt2qLHAFMgnZcf64iQO/3SG5vIcDaUlECUjqlmAA8JQR45wGf+JbRGNcHGQ5TLqq4yOJDmludnYoJGITTT5jjLyV9DlP9b67UgZgjAM5Y+oIJ4BI7pUus7RAmIFWC8pgmgB2LXoTqlGuJK6u85ixg/c7SK2ECasvIKQiw0qBHQHUW2CcBWgjpWyZ9BlhCyEqDRUKolgAx6mZ5udsS0hfAYHzmcb2nvXPEumKL1Cw1SvAbN645ZRyZz+UAAAAASUVORK5CYII=",arctic:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAACzElEQVRo3uWZQU7EMAxFexr2rJC4CguuMifhGCAhcQT2iC0bpNmxmhVlXOlXn1/bTdNQdUQlq1HSSeKXxI49XXd+Tqdjz3I4HLrj12dvom2of3p9GeXt431Stj68fr0HfUIenh9/SRc8fd+vlmGS/fdpEFUUZbThDQD2NoUxcZStLep3dwBs0jZJrB4EAKAEi9Wz4irow/q077nf3QHgx7YoJFM+UpyF+2K5GABzO+DfAli7A/gbNqSeeIbY5mB1LZQfAGRK8KBszEoAZH2yrYiUVxujBroZADV6PEH1Ah4A1LGhy5TSXZStvrpR9kZNAagiPGGdhNeuK6pnGMLukd1pBAD9qxseyq0AsPsbt9d5oJvbq9/EqYw2gOOVj5SHYAyA9y5R3MbHht9NAegdIPPx6ut1288B4MuSgvP61PlgdzQDgK2JS4t35j3hb0uVx1imEJfxWwbBdQq4KYDMDa6NBTxhRSNwXK9lvDcBsCYWyAC0kM0A1MYCS26Ctc/FxgLZZOCFePzsOEZQdx0LZJOJjO7ScXYbCwBA9GSG908AbB0LzAHYfAdEsYDn870JLY0FdglAFYnSWVpfEwtgciXhcknovBqAFwtc392PAqsMa6xtS2MBDKz2hfvS3ahxii6OG7OsjQVKcn41scA4uKMIK6t1nk1KQew1FlAA3hVbbZCXHVIAk3IpgOj6izKUQ15fBe04FqXt3gpiJ2n2SHMT3t1EQVQBUJIlFncNAIXNyqoB1HyAt+rVANgFlQKILLRGdLyinPH1YgsvH+hloKLzX2UE9bxZtsdEDRFbf3iAyEXNAYC9YdCaItM/WCYZoeT8LwYA0TPFbQpAszQl6W1ezWi3qfJc5ykfhexVsUDJxyjzpEoBcJ2XY+A0mP5O/66bJEkVyN4BRNddLzMcpcnVKPIx2QSAnWccCT33c+3RxKNUm+cFsqCrFMAP1j1HfgzqFQUAAAAASUVORK5CYII="}},Sl.frog={name:"Frog",behavior:Ua(),entity:ja(),model:Oa(),thumbnail:"data:image/png;base64,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",animations:Ya(),textures:{temperate:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACq0lEQVRo3u1ZPUrEQBhN4yE8gM0W4gVcG8HKwkLstrCwdtHGC4hoaytY2FkKiyewshA8gmzjHST6BV54vJ3Jz2QmMWLgI7PJzOx78/3OJMvoWl4d5W/nu4VkY7yMACRk/O3BZv54vF2Itnsh8Hl/kUMLIeMN7MvNYSHvdydl254nA22TG2CsPEzIRFeyDgiAfzydlQIiyQgA6GSyVcrzYl6IgZ/vbBRi7TpT4NWH4FlvPtDFias0gDY/t7u+0zvea78kTqyrz1rwAUMfEMNzF3meI4kT6+qHrjYD9/VbCX1wZHZi+EdTJ3443VtZKRN7HsNsnBqAg8Jx2ZlBDA5sfetMSFfNB6it2Wg/b0gFaBZ1To0qLgBVmmRNox0lV6i5KPi2NuwyQdMk5xhudyYAU4HYxGa/bVVvdxsHYCycU7SdPD+odpqE29fpNGdxaX26vrYiUcsP5AYuLZrmCwO9nM0KGYyAOhv/Hh0BjR612vsBnl9fF2LtQQhg1V33URDgcpvtv4kGDPjXYlGSGJSA1UohBFhGR6CJefZqQiyxCPikVYz3bSs56qDcruun81Ulws4acIHnuoXLCu2j7137a4Dkok4LvOQm5FJ3zDmjEnCpu0mlyKvPGumdgNl5FwI2fnACsNu2BODogxLgjBtCoHcT8oVIrne0BtIogjaP5xMO7p+EQFXM5jDJJxh1IdR3TBk9kTEoXw7gbR9vA11bUJ1LxyY9WtTEM8rvAyjYRklglBrQ6OJyQnYoa1/uT4IPgKFpmyPaYZaej7oiER9F8glbCHiMj+LUGkV8EUQ10OXPbWw0Dfg+cFRNzuebXfws6Ue+pB/m+vjENBoCVZGH77+WgC/6aP0Tww+S2H9V9GFR8KGRKFkEagsiJBdEzwFdrtBsjCyc/V9/5PoGVJk8gNArF6wAAAAASUVORK5CYII=",cold:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACuUlEQVRo3u1Zu0oEMRTdT7CwsdDCQnBB0UqwsHNBRGxExEILOy2111oQrCzFys7CZku/wN/wM2TkDJz1cDeZncljxgEHLslmkuw9953MYCDPxeN6cXy3XNKgjw8AkELWb58uFHtXSyXZfisAbl9OCmohZD2YfX08LOn9+XzSx3g2prE5GKbkaUIgK8lZjJDxj7fLCRFINgBkdG1lraTRcLX8YzK/OZovCf1ZpqDSJ3GsNR+IceIqDbCv42jtO9vyvZ2XxYmt9FULPsY4h8A47gKve2RxYiv9UGkr4755U6GPjqxOTP+o68QPN7tTkgJhPIXZODVABwVzeAknpkMTGB0Yc2eZkJWaj6GmZmPneUMqmVayzmmjiouBKk2qptlPkiusuWDjg7uNIBvGOpcJQpOaY7QfDYCmQsLGo6thY9WjxToypqQ5xfaz5wernTrh9nNnp1ByaX19cW6KkpYfzA1aWtTNF2D66+yspM4AWGfT370DYKPHrLVgvLi/Lwn9TgBQ6q62FwC03Fb7r6MBMP49Hk9AdArg+mk/CIBS7wDUMc/WALBaTQ3AR41ivO9YqVHHBcA1z+5XlQijNeBiXusWLSvsHPvedb4mk1rU2QIvuwm51J1yz6QAXOquUymq9FUjrQOAnccAwPrOAdBumwKgo3cKQDNuCIDWTcgXIrXesTWQjSLs63q94dD5yQHY0OcLpa5rxqoQWjcYRCcyvVbx5QA99ukx0HUEtXvZtVmvFm3i6eX3AdhubwH0UgM2uriKNXWoraPfuihG09gDeyWpRez9qCsS6VWk3rCFMg9K4tQ2ivgiiAKG5GL+HGupyWwfOKo21/vNGD/L+pEv64e5Nj4x9QZAVeTR9s8C8EUfW/+k8IMs9l8VfZQs86GRKFsEaspESC5IngNiHkgxNJElycD/zx95fgDOAvoGmDs8owAAAABJRU5ErkJggg==",warm:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACnklEQVRo3u1aO04DMRDNdXKENLkEfcg50tCni0RBTYEo0xAJiRMA1+AYaNGs9NDTi+1dfxdLrDSKtbu253lm3oy9Wa3oent9HM7nh1FWPV4GAJLS/3DYD6fT3SjabgLg4/1lgBVS+puyT8/3o9gYaNv9akrb4DYZVh4uZKIrOaUIFGdLAkg1AFB0vV6PstlsBrMElN/f3oxi7SlX4NWH4F6zGMgJ4pAF0Ob79qvP9BfP9b0qQayrz1bwKYZ3MC/uu8DzGFWCWFc/dbVZcd97V9THL2kgzw1ijKNj2f0SbuO0AALUJjELWBAjoKEQAtjenXIhXTWfQrFuo+8FeTzkw1cmdCjuGwNWdPl0kVyBCTQZpfqwJjNQMwNCu0i2hqswEPzGmJ77seJwQ1e5MeWeRfIDKxbkY7o+t9uBxWV1xBxL0fKDVxwyN1+Y0l+73SiLAfD5fjcAQvw81dcUH47HUay9mAU4ITF7dAGAXQYg5lrAFP++XH5BLAoAZXYsAJbuAMxJnk1dSKvMUtnfJVEc76pTWGABBeCrXn0bG02E2RbAYFxWYyKkfzxjZVzPuR8rzcWdtpu4EICyeUvtc4sD4BWOOddht+EirTkA8/McANZ/cQAc1DEAEOiLAlBWigXQ3IV8FAmXYFrUzb8+4/58whHaNhajUeVs3UnxDoo3+rzaPu5n2i2eyHQP7OJ43g7yMaMKH6vwXpj7Vj1a5OzY5TcCLti6BNClBZhdXEGo7MG1To6lETNFahE9H9XqkdmDz3VSQHCOKRLULhZxMYgCzpmcz2OrfeAIDc77hpw4q/qRr+qHuRafmLoBEGIe/v2zALQW0s+rvmBLiYMq/q+1kK8OclFvChNVY6BYJVJyQfEckJs/UhNZs/9O/F8Nrh/BGi3RkD75dAAAAABJRU5ErkJggg=="}},Sl.ghast={name:"Ghast",behavior:qa(),entity:Va(),model:Na(),thumbnail:"data:image/png;base64,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",animations:Pa(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJ1SURBVGje3VkxbsMwDNT70ufkNRn6oz6gCNAlSPesmVrQKIMzc5RIWY6NGiAqqKZFHskTpZTy99zv9x+R2+02SQk+qidyvVwe+jpm86jDRN9VfW9OpIx6lgCgOl/n8xMAdozvMOcyMgSAVjR6AYiMEQCZF3k/nSY5Ho8z0Xl9718CgI6/HQ4zQSBeAkB0AUxJMez7eg0DgKLOW8cZEPJutlRDAKjTmRrzAPj8+HjM61j+tzsArNNZlrUlkAEAgY84jyCsUgIMjAwA6qD8jWbAEgCGZYCNOhqWAUCdFSctAAjOLjPAGhQFwNayRh8jzUCx2bYZANaYbAkwQtOIIzfYObtWDwkOBYDtAD0lwLY6ywlszc23Qc+wEQB4c7tohFr99isB2KQVXgOAzGFm88PQCAC8NtoSa+vc0aO/ylkgcx7fk77eNWTuI4q+4PXoPSncwwFMRAeNt/PoOHKD14qz0+jQGmbNDusSR3IA6ntO2zECuDmJRfS9TOgFYJYB+MHeUthSEJwsABPJRyPFImANsfu26IjYfb0FMpJZNBuyAGiwQyUg70RJTGtMHp2TxzsMeSQatcu7kkuTIKY/KwUPBHQUF7MA1HaClvO1qC/hgKkEWkjjwgoC7rHM2B4SVNDxe62yi2aAZ98TCdbSH/tva3QtQmxxpsfOBa3g1MCPjGXtEmF/Nc46yrq3aAYwXcyCCAlam7wfYGoZ7ZYA666WRL/2fa+kIt+vARUJSvEIByPEDPF6d3vDYy8wolnQyoQWB3jZEM6AmqFLox/JAm97ZEFopTqzcdYHZDvAVvR72uGeb7GgpO8T1j7P1+Z67gMiR+qM/b9HYaAZP5mjJAAAAABJRU5ErkJggg==",shooting:"data:image/png;base64,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"}},Sl.glow_squid={name:"Glow Squid",behavior:La(),entity:Xa(),model:Im(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Dm()},Sl.goat={name:"Goat",behavior:ei(),entity:ai(),model:oi(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAC9FBMVEUAAAABAQEODg3b29oDAwMJCQgmJSQaGhozMzIxMTEqKiqhoaBCQUCwrqhRUE0oKCcJCQhNRTqGhoYfHRtSUlEdHR2op6VraV80MC0uLSxCOzInJSQaGhoUFBQNDQ0yMjI4ODikpKRKSEJuY1QwLy66uroeHh5xcW0fHx8aGRni4Nh+enJMTEzAwMAvLi5CQkJVVFGnp6ecm5kWFRV7e3s2NjRsa2ksLCza2M/o6OhjY2N7eHBHR0doXU63trVeVUdiW029vbxRSDyCgXxmZWMPDw8KCgqgn59ZWVnf39+enJZ4dWvc3NzQz8zLycE9PDulpKLHx8eSj4tJSUm1tK0nJydzcGZnZFuWlpaQj47j4+OMi4X19fXa2deDgHTAv727ubLl49rIyMiUlJRzZ1br6uivqpszMzOSkZDV0spPT0/i4uKSkpGNjIfh4eFGRUWRkI89PT3d3dtpaWng4N+Tk5GQj4uTk5OOjYpdXFzHxsaMi4aFgnfu7evAvruPj4zEw8Hy8vHX1c6Jh3+BfHHf3t2OjImLiYM6OTjc29iKiIHe3d3FxcWRkI1/eW3c3NrZ2NbCwcCEgXa9u7e3tKqIhn1XV1ctLS29u7Z+fn6Gg3n09PS/vbl4eHdRRTva2dTY1tG5tq61saaEgXV0aVjZ19S1s6yainN5cGFOTU3n5d6HhHtISEhDQkLQ0NC3trF+d2pKSkpAPz41NTXo5+O5uLaYl5eqpJWEfXR8dWd6cmVkZGJTUlK8u7Sqqqqmopx3bV92a1svLy/r6uXNzcyura2dnZyem5Con41wcHBhYGDX19exrZ+amplgVkzW08u/v76tq6enp6ako6KkoJVtbWxvZ13V1NOysrK2tK6yr6WopZ+Fe2xvbGWwr6ulpaSsqaGFg4Hw7+3PysKalYelmYZ4dmxraGRYT0YgIB+6urmtqZuHh4edj3qNg3NqXk/q6ePEv7GXkoiSj4aQi4CVh3KBdWRkYFnUybXBs52LiHtMRT/PPIXaAAAAWHRSTlMAARz+BRP+WDw3WrXv7pNGD6iXYFsg3tGplpOCUEgk+c25k/vw7Z+ak4L+/fXY1tXKvK+ShX50MfPy8O/o59vRzsu0kYY+NfLx7+3q5eLi3tvPzMvKv6iWAGKd4AAADWRJREFUaN7N2XdYE2cYAPDgosNOu/fee++99+4dFy4xORKEJJcQIiGJCRAEwRCGgIqAIlihgCylZdiCiogKrVWx1Vrt3nu3//R9v7vkEmjtU3IU3+cppHHc73nX9xEV/zEmnXzljCmKgyYmnXxZQkLCQUOaSjgtrfPmXRGtOBjisIFS5EA03qY4GOKwxYs3tyKnLuE2xRknR/9L4Y6/7hC5BaNB1tQEvg7qdtlJ2EvRUQfgHDs/Jubq8SUdVgGg1O4EMRos0EtRB+BAjC/pMOtAF4LqdpYSDgR/mkKIqHDOrkTAjDMJQdYEvjShsa1i8c5G5ED1ogXOcZeffajEWRUbGztfIp0tkeQHWSxten3F4orUhFbSTNECBx6beDghTTp2cowpP1YiJSbFFhwukeTtoZ0SKLUU+6gumnAwCAk5EBIJOBD5yVIC5Z2yLt7S1tZoHRggoLoWPvq4O0KrMz/4ikAmmybD1xWx+BtEkuxj3w2Vslo3N5SW1rVaeP5BSEXBsqWmmPCYm4OcufhqRcasWRn5+CbWdFzGHkEWS2ObHkB9MclLZ82a9UYIKdEE/81HDnqWhfxqomykQ2/Er9GpXZvJ2FfsBJBFD6CWt8MfSiixSSboHfQk52SEYGUjHXp2YuI1NyIotYXvTrCsq1g8wAOojU9IQFByPikL9BJysGkylhVAxZLz8TXhJCbKSTphC/xFQEIQOBYuxCnrboQjjYCSiaEAvy6NxcCEzcrBNBFevglHbb6MpBNUabtwlO/4arMAGgiOfUufsGkwChCyjLzKgLRIvZ1MUiWRdvVFDHKr3buSYpTKVRWtAFpX2iWMfYtl3VvB5UfykrECH50kPtqUgxx8FULa0memZQCpq5bPUUL4dsJiLE0t5UtLgbNwIYIwTEvR84bowd4WIGTUQkhb3m6Pp+UBfa8UYsNXPIAsllbgICjQsslCikj15s4lpRKyF0La8JqWouQAlW8trrpEGYglX20G0DzgrNNvh5adj8Uw5UPrzMrA3s6ZG+yemOTJuAQgxGKlyAF6SlWu0xUrQ2LD4lbLPODo9dsxIeKgYyBHWtbLMrDJBRIUK4WWBzTpwiadbpkyLNKsFj3GPoGD1VpBPPlYIpOJkPDtDNI7G7b0GShKJhCSXtSlK8NjCV06D0BvJSYVEA4UCwPrZEoSk5KYk5GDB75jX7uZjg+C4rWKyOM65YhIpqhP/9RP25GRg6ClsGugWIlQJzGk1tmwXUtpaQkEfR25Z8pjSuUHc0KztIbauGfXnqHm73/7sKAgieyi5OAuTEoKklbto+kQkI2CkAF0HBDi4uIkUlz7xg+xg7e9+8vHv39YMDl5PvaPQEKISSCteo2KDwF5jPHoibxkUXenK9MBJJEKqUHd8g345Kqf2G++qcKOhtotg0HPgdLFEJLmLQpaBigiKJ5h8HV85E19CEjWAydISt9I2XS65aoV+GR3Z2Xlua/Hzl0aPDwICbKDkaKlCMgggOSZssPj4lbPnLlaJC2BRURRnQBSq9NiccNUVg434S4WSGQbbQCOFFozsOQDnQGUl2dCENIcmPnt1PtDX28CULnKsaadGm7CIhHSG7gKsVijg4BkGft7Z65eDxyRBCXbQlG1365cuakYQKqNFJUfGHGhmx3bQxmGLG0ISI6xP/qmmVK8vB5aqI/Kq6ldufJj3dZFCNIWSFsHemc7TYd4ZjNMKEiOsb9B4mCO5qSbKOpVrvdnAOnUADLQBdIihFY2h4HsISCjJ0WGsZ/yRBgIuqiJ0vZyPWz1RwTUTtPJ4iIkkzUKZAyAbLCpZRj74wSI1ETJ7ZTRX9vBsuwf/QIoUViEGuBIIK2wlfM8tACS63CNeg4b5+UQkJuiyti901o/AdJ7aar29i+wWiYcdAmkNePmIYtRZtAhoFgPw/5dsK0Hqdks2/j5NJry+rc5HF84NJpdplV9FBUGov8R5DFGBLoGCHE47OmrBZDbbPCyn3z+ed3gYDP3uipNg1FISWGO1x4AhF0eief4S0gf4w1/jlC4QdrD5O5d+Pn7g7YaAKkcI0HwfAmkNYeBbBGD7oUEKZfgAYanK4g+pGkjw9CeCm37q1wIyBYfFEkg5EggPO0jBeFSxOxgguLicF/D2mMYO43hr+X2+woJ6E07M/tvQAYawi6CtLAjIwbdAGVaIoJIgt6gaY+R8dAQuSyb+R5qEMSMAsVrCcjjZBCE68cOIK3ZGAloyuNxcR8Er9FzIEHv0cFwwdj/M4goDKS+YlMByOskb0SwFIXbhpijuJkzl8YHPU4WYptjBEiK0SCji82ODBR1tzBfOPXAgoo1SQky5roy2W2qNEc4iFRH+DYSlM1GCjpEmi9IElTsEm3Q42EYP9ezR6UCUjgIkkjmnTS13Ykg/F85QIcH2xnzBLtahRQzpAD/3uwaMvaE9CYDEz16U8cDB0H4ngTyjnkpYj8LCSJ5Wv/yRhrCQLqDYTI5BAnxhYe8bciy4cMNAVAeemDstSSnXgLKdbFjBR0rJUj4topKEU8CfFRzrwRaE3i+DVTCtd4+m7xhFH8MyjMyJQDyQGePFXT0zUqlJl25hCSIfOsLzjMFiWdZf+eeMNBsBAmhdTICyIMgW7zWxgComWWYsYNugPGa17AvDoJsobicsPu6i4x9OEi6jGkZCWQwmykKQK5eLhO+NveOEfS0Ujmo1+sbNq6GXkLSGglU4s1FT3VTGMgsXMZSzGEgCARh0yGok+PGWrLrHm4AEJD2pZNeGgxw8EJUW+tn2R9UoSBcO8JESaAS40hQLYDGGlMvPk9PouU1APlIKUjL1rM4YjWdYsUWudfg0TUalFXEOvF4NYaCzj0lktNeJFXgj8/iYWA25LFsJwfR7F601g0gtbpJOLpAiyBPAMSwCDIyBORtRlDuOZPGzpGytAo+E6YwaBJZ3l4E7VAtUqvdCHqHksLjdCKoJDsMNNvFdnDcpUcSTsSkLqjYW7CgUwzIIUvXX1vTUx4KwuSIGwFAeUVsLoKavQDK9hqyYAg6zj2FcGQg3XezcjIpl9PoCV492H6VBEoxG8TPOhCUYs5iEVTSy9XTtLe6iGEAdBVw5Ipjil/DdeshY+wRrh6uJgn0UuDGSkAMTQsguOTW250uFkDenm+hmeUDcTX1dtINeM9yliHoowUjQQZ6NAgsAMrO7DmXkxfEFWU7S3IZosJ+6MjcHQay5x0AxHb6/ZzcoBIGZsZPygYJquHeVYeCyNFlsDttCCoJBXn3+lmI8QA5O2p6aNrWD3u6GWY+DBQ4KQDkLapGUEcmAQ3797MEVJt5jswgO13D9dBZP+l8Tf213C/qEaC8wGnvYgGUW8P5AVTzzX61uho8ZXD3kBc09D4NoN7Mmnd1Po1jwes7CKi4WATZaUMIyO6s5zi/Nu/H3VVrEVSdy+TKCzqpshJA3NBnHEdAKlU5AS3XbS0PTJkEYhkGQJ1G5nX4WNTnrmbJHio7UmaQJ7eysnIUSLdgBMgmgL4dZhkC0mjIG9nZjLyg6bcWsQcC2YUeyjPT+PySTD9bxhj3ExDb2ctAyAo6+dSpJ7Js5WcwNne9QEALigMgaexnlxQ54VjJHK5msY/7vywmoJ7aTNlBUQoFgE595h2Ou0dxRBqA1uq2qgmosDAw9jYvOdyHhz5FzyfD+Ek2gqCHZAcpCGjKhbu522cojlAvSAOQrspRCKA0jaMYQUYzjSC702q1spfurWv7DD/JRlAZgF5tHh/Q8h8OUQBoLQw+gDSaVzYBSKPburukyEsDqKOMYc65xfprQ6NejyAYQgSxPVzt+IDUahGkURHQppVfqwCke4VlAfRqDedimElHXz+dB9CTPT9vgn+sXVRYhhfe2uyui2QGZXZOmXrfEQA63+cmoGIfgFaWi6ASuxMOFFd2/SS4+Z46/fn7Z/B1ZV/qoK8JaEg/7Vp5QXfVcFPgrjYVQBpHoQ9BqsJXJFA9wzRzvUXVLLmGwW+dwfOpAz8KoCHLumlyg+7kAISBIBWcGgBSLVr+sVsC+YtsJSyCSNw/nU+1WlOzq1xdrXo9gGbIDbo9DORLU8OXwrUqnwjKrjfa7GXso1ODN99TH7Jau/nuVj3EmdcCVNa4Z4bggab2adJgU7sXrC33QTOpCncDqMhbzXoZ5tbrjw69jF9/SzfPtwHnIrk5ZDcGQOryNEch/DBG1l4hLMmqLxltFougo6Q/IGZpOt+GnPELBKmhfwIgqJ6msImiCMgugSQScMY3HgGQTre7atueKgAtWlsOaSKgbBsFoP8/pu/co8Por65fAyC1OgAyUhME4ltcOwD0EX5OjSC3b6JBDVbrpf0A+qTf7XNAN6nXAMiVpbXZJwR0+lkA2tzwKdvdlgWYNAf52d6mZcpwyiYiok6/yrqZ5y16PYC26qqqEJTVyfknCoSkZwmoaz+AdLrlL+WVdHAA2nm6YqIi6rSzLFdEn9QwgO2NRweAfrVMA9DExQNRipN4vqtshwAaal04DUATGycDyGrd2/8Ku5fX6wH0gGJCAwsHIL7hU+DAFeOCMxQTHlGnXWXl+Ua8YBwMHDFLfOPBwxFJcnH+AvRB7JEmXBkCAAAAAElFTkSuQmCC",textures:{default:"data:image/png;base64,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"},animations:ni()},Sl.guardian={name:"Guardian",behavior:si(),entity:Ai(),model:di(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:ui()},Sl.happy_ghast={name:"Happy Ghast",behavior:hi(),entity:_i(),model:vi(),thumbnail:"data:image/png;base64,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",animations:wi(),textures:{default:"data:image/png;base64,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",ghastling:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEPUlEQVR42u1aPY/bMAz1P+3YoVORrUDXdi3QobihP+iAQ7sVxQG3HNLOWTOlkFEGLy8kRUpK7pI4ABFZlizy8UO0zGn6/9tut7tCm81mpin4k3mF/qzX+/nS1vpxDq7Lbf7Xxk6jfj0AyJynx8cjALiNY3jNLCEAf79+3gndv3tTJVWDGrUCEGlrAKyfn12qAfD06cNlAYAC/X54qBLPFz6K4EJDAOAFrB8KUJgTc48AwJovAv789mVm8Mfq7e7Xx/fzf6HSV+6VMTUAIqQCwFrpAQAZlXa5xwDIegIACl+oMCtAlHv4XIxVzQBoptjjAhkAEHgEQAQXEjAKCDULkLH4DARSKGQBkd0Ax4uA5T9qAewCLDwSA4D8obugBWEf3jsyYQuIDAAibBGSAUBwPAtg82fNWhYgLiIuJNfYxmt1/28BgDUp2kdNa6CwtTEAWReIRH51F2Bmsi6gmbNoHGMD91kAtAZBT9gyV1zIBEDbAVpcQNvqOCZ4u4C2DQrT3jboCV8SJHyOmgdYjI0AwOrjtXsSIUvrKDxagmvCrbtALwA9qXDNBSRVFjBOCkDmZWbUy5Dn+64LjAAg82pbIy8eac8Y9hqsMWFpKSrEuefLWUPmPGKSAVaGdmoT9uZz4sT9KHjp49xDax8F0Zf24ZHzLaG5jQBeBACWJbQCcGABnLC0uAKj6wliJUStVHsD9dpzkI9qqgZMBrjaWAxmUWvIAiDKDrmAbDfaYcZoF5iZCuYXPL8rCKL5Y1v+EQTvXK8FBFnHEt7Tek8MmF2gJgAKjYkHa2C1Wu3p+93dnmkBs/ThGJ6PeQmCMcICLPc7CoK1dBOBQEvxNGT5OM8TYUTwiBtolpJpl7UnL/qjwKx97RSpxf+1jzEIBvPFoOG19QGGwQ8lQjM6pPmo9ou5c/pZ+jJWgJbgWZe3W0R2HTPgWC8cEe2LwBgTvETG+iRXsy4vBljWELYAj9FW38/EAuucwTpU9Uxd4/EgD8hmgD2+P/JZmlLS5wmj3+etsa3zrQPb1vnDzxP444V8ocVr7OP72eNs83j7pX4sKArMfdqYiwegJmSNrtYCInQ1LtAq/E27wM0DcFUxoMcKFgBueRe4ChdYYsDiAksesLiA9wLEfTz+anYB7xVYew1+NS6QLTG9NloA0GprsThRq8G16nG9Mles2c3W9Wb4iNBBzTDX1mpk1dvyfQ8U75nZdawxFshW1elcLof1s1hP55Wccf0tV3daQuPimbpeix8PiJoV78vleqOwB0JN+NFra9agXR+UzEYfzrW2UQA0Ex+xVm19eYYGwME2mnm4VnDoMYFaiQofWcMjLzZpFpiqshYGaxriQmdB3fNlr643CwCD7lngFNV8VjPRoDpqPW9tVEYaAGas1T+jcabXBfB5WvsolT4XQy0CnBLwJhc4NTMI+rmAn86t2ddGCwC3DsA/s+q2cpd0Pe8AAAAASUVORK5CYII="}},Sl.hoglin={name:"Hoglin",behavior:ki(),entity:Qi(),model:Ii(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAMAAADlCI9NAAADAFBMVEUAAAAhHhwhLDU8OS5FS05lXENgZGV+goGVW0qlY1C7clvJgmXVlXrYtmPooHTcxHPl2pX//67///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfqLQKAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABpxJREFUaAXFwd2aFYd1BcBa+xysQXJu/P7PmAsnIoNneq90D4LI5uBAfj5Vpf5Yd5c/x+lw+eCzXwxrLMM2dao4pR888AuJTbROrTcJv/ra3Zth56ivjdnBcIgWFfHYbJAgndXUKb5hXMp2/aOZMWMYLK0giYpH5p6YlOQ+qEvjsbs3ryni79yXcRqs+4vQaNOoh3YaZFYt00qDjgfufnGp1ptf8KtPdvxmFk3VqanUI13s7GKbalqNqgfufsW/OHVdfvXF+M2OQahLiMeqwqxWMU3RiAfGZcyMXnzt2fikFadePNTFMNhGtSjqgXHZLvXAsk8+SSUuScRD799Xl62+f+8SERUP3F16EV8b/vanYYeGujSpb7nNDrMTn5Q08dDdzy4pcflFffDZjj/V76Wo1EOvZr3ZeVUqbRKP3X3w3/n4NOtNKaLt1GNbi9qRpnFK46G7f2rx/OSLuhTx2MutMtj2taOalDQeueMvXv3V13Zc5vlns4hQb0I8dEy6VFqXEN90921Dww7r1CAlxLc1g61TlIbGQ3d/wd1f/KuvbXheNDtofZJKPZQYp1m3Q6NCdTxy921Ls08f1kbXKSqqiW9ZG9QlKhWNh+40jcZXxurNzvPTNuNAqVObeCTTjMu20QSRNh65+019bfHxJ/u0ZccpdUol9Uirh0+yCRJt0njgjmoaX5vDiw+Yj3dDqUvFNyTGJyuIUxCP3G0o9dCf/obnoZZKnUKc/twSiXm9exW3u9OOLbk71N3rfbV+JhFf1L/f0fimeXpePB3MUSp1CvGbYK1TV8nQg5ttWBapNxVv6jRUt9ZDHy3z9NElF6H1pt60GBLlOLouyVbCoPWml+1ptTXWZT2w4hn7LJboxWmrqFO1HG2UBLsSp0p70KpTlYZWo+5Y39Z12ptLpU6hdSpx2VSozbyzG33HbjW02yCqaVqpaLmzWA8c4unjgdtPmx7SuhRJXepNtbZ0ty4vomwsVb+potTl7q/+mX3XNe/WHCIu9SZ88L+W/jm9+UdrDjKrJTKO1G2Nf3SkGVZFM+y/+W5Dc+z6ZJ0W41Tj0nY3xWCd1ie7R+pN260fNbQx1mWcZnccIrv12SQOsztO47JGWpe+0aW+352pMj7ZscZBWerSoBy32R073gyNaVlNrNQPGaTWZ2ONI+Hm75TkMNb4bDU4tkWRPfyA0brpYl3WOKhstT6rKIexLoutmxYh27jU97srbkePm1mXbqnbVtUXcTvKkWadhoObtmmcQkr9gLukxy21jcZwKPfd1O+1bq+kN1azDXE0NhtZIqq+392pO9tqMmxVZ1cRRbxZ2TRHZqyqzNYnaVzqh9w16TZRdaAqVjZR8SY63aROhzfhqKim3hT1A+7apG0S1qWUFE29CWna0tRp0BJtVHxSP+Qu7cRqfZGwDREVp2pGWnU5iA4rGvWbpr7fXWVj0FSkcdpqVKRNU9UdiaYqTaSqRKNRkvoB6XtfS31L6r/3H75b6o9192Peu3x0Wb/z3uWjy/p+4w82/mB3l/fBs9P64n3w7LT+TjwW/wPj/0z8T4w/2N33+tklLk8uP7t8+NklLk8uP7t88D3GP1H///LkEqf6JB/eR1OnlCimvkgJFX79BUWaukSRX32Pu/gslHgTcYlTKNOGSp3SmtYpNEKaijf1Xe7jVKlUsgnGqSFsbJI2O9E0YXakU6cGCbNJk0pav3N75xlPeMaTl8Nnd6FhEJ1QRo1m1sT9IOnNcdMkJFmTzsZUp9w43Dba+5HGm9s7z47x5PnlnRdPnrs8eTlc7snYEg0hs0JmZRin284RRtPE7TBjiSHMHMGRzCzZdPzm5Z136uUddXrhduPFJ/fUzg57s+bASG+7Zu3Ycdobr2bH7MjYnbGzQ4bbzmtzX+Z1jGOcfvJ6f62Xd3tTFnWb24u63+4+MmKwTjMSl5hhDLN2zdo7YwzDzNjZwWDH/TaH08xwW6dXx7oM3t1n7u8wLnt4xd2ws2PW2Ga2DGuHnbXNmLVjZ4c1O7PsLJbeVjOHIzNY9icfcbsddNmdNYsd9p3LT+4ObJc6Qg+nI+jSreghTY9YVnPkcDnQlFU9VA9Rp9e708u7cXqn6zI3B8aLy+v9SMVOK2idjqxkpxU29SaNrjpFtMQSlDoFLXFauqyXd2sXe3uZZYd1uj8zmNexPntmMK9j/Wa8GTvr9/7mzdhZv7cuu1hdb3bssN6s+3pgfW2cxs5i/Zd1GjuL9UV8sSzLsqz/kvpjjT/YfwKok2nyzIF6TQAAAABJRU5ErkJggg=="},animations:Di()},Sl.horse={name:"Horse",rideable:!0,behavior:zi(),entity:Ui(),model:Nt(),thumbnail:"data:image/png;base64,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",animations:ji(),textures:{base_brown:"data:image/png;base64,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",base_white:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAqeSURBVHjarVrbixdHFj6v2Yc1bELMylyceEnWiTFL1MQ4Gi/RZDQxcRNN1hivyUSjuUyyK+yLLIJC9iGBRQTxhqioE0W8gA87CCKIIBoRRBgFEUTwRfwPevurzNec3/mdqu6emR98VHV1VXd9X506dar6J1mWicbly5cDvpjVFvD1/PHSu6gzpADLNOx9XLNM12e5Rs/s9gJ/f210tuTlZ5JAnY1zOySFH7v/UorVb/xZ1swYI+IJQPJ84Xfz2rMt3S8VwDXLkLLjJKzrI8/OM68F2Dx/XAG+b+2brUWqwfd8t/BFiWLBhOELMFQLIHlrASjTFsBnrF+/XpYuXSrf5x0HSNoKTiEpQs/sseLhn4s7hy/AhQsXAuoKwProoG6zcd64UMZ2mxdMbBKAnaIAlrwWAXU2zekQi+8XThyaACdPnpQzZ87I+fPnC/J1BWBddLK3tzcDMQ2UcQroaUEBfreCieJNNw1agCXf+86LwxMABLUAHCU6NEvcjqYGiMXKHAvIcvKAfDN/QpMA/1n2SoC1gM1zXxCip6tleAJoh+QRqyMArkEWKQDzB1CGlGY/aBWFAMhDBNTjFCB5LQLuBUvKSQJ454gIAFWHKwDnOclrAYBN+fKEzg4KEKYKyOs8pwaeRWvgqBcrQH69OX/ehtltIyMAOgdlY8SqCIA8n6EFAGkNdBYvJ/FB8y/yegp4FkAx8JwRE0A7Kb0M2eXIlullKaztxvlZ8hxNvaazLdOvZrXKt2+PF6Tf5HEByCAFua/njC2udRs+h8/leyoLABVHygK0P+iZ3dEALaAWQ0d/PW91lArwj+5JoqNC+0xiY746pNAwBeikLLGrV6/KvXv3ZGBgIOD27dty7dq1ECjpJdM6P8KKsHpmu3w2o01WvNEa0lVv/r5CrOvKA5mcfFUBgA05ibC65AHQulljZW1Xu6zOn4dnpYhvyFcOcGsQgKAAIE5UEeDSpUtFBAmgLuoBKQG+zON/kEBaVwC9vFYVAHVLBdDkz507l/X392dIdX7Xrl0uPAGQ9wRY8dqzATBX5omYALaebpsSYN3MlmJqJgXQ5LUA169fDygTANZAa9ECUAQIYKNEkGA0qIGOLp/ytKx6/fmQ2naxtg0C5JxANCkAiHrkAZK/c+dOAEUg4SNHjgRUEQDwQmTGAHUFSLUFObSrLEAMIKvJI6UAJK9FAEnU45QBtACA7qhaOgsS67taZeW055oEQGfL2gKoN2IC0PQpAoWgACRJAfT00PdiApiAKHQoJQDKY20//euf5PPpo0dOgJs3b4pHHtDkNVE9HaxlEHNnTgkgEa7nWDarCICO4x7I9bw1NqwkaFNXAMYfSQsAMesDSDYmAEnrvH4mBZj+6sQAkEBndVBTJgDr2SO0MgF0FFpYADtrvb02c5Zrc7f1NXGvTUwAi/aW0aLJaZIMe2MWwN1kLOyeN2Nq8xTQRPATkaiZ69FGHQkHSlnTMunh4sWLBfkFXVOynKyLXICs7D5Eik0B65w72joa8hChQQCOvmcB1rx57VkArSDWBkskRjgnFwT4ZWNrdvTb9uzXf00OQB5lkya0ZmX3cxTW8uDBgxCt3r9/P8AK0DlpckP+o3fnC4B2gLCTJGHN2QY7+p5u4zlC3YZmj04Pkhgy9HShABTBE4D9QH7FB4sK8oUA3pJWBd6Ix+rSrKuYeJ26WgDsVawA06e+HogDyGvyQQBuaPJRFMxTbGy0eWsT1+aMuoz99cbIA+qCCEyZJq7NmyYO8H7VuuyrnsY2r3nYtEmAW7duiSbvOTiEuHUEoOOjCes8R0qbeJ26KYI275XJlStXii0uTAjwVDReHTGCnDp1qoANlvQOErCjCof275UvZFu2bMl27NgR8toJVq0bI+YJ4d1vEABEYAm4sXXr1gDPwe3Zs6eB/FAEoCn/8PGYQIjXngCpuini3urWNAWsALt37xaSJ6xzQ0BjBYg5Q732W4IkovN63lepq1ciTdortytXEMAuYyA8atSobM2aNQHIUwTP68fKKcCTJ08KAWLrPJ2avV+lrkeM17pcR7D6foMAIArS3d3dhQDMUwTtD7QAtAS9xDx69EggADDctT8GBm0kpMnpch276HhGtEIUwIMWwBPBCuCZoodU7EDLGvT84sGSi23IbJ6paDKc8x55CuAtKQBPgKwAtr4+WSo7YmM4jvceOnSoiXx///8kRsxGst4BThDAmnJMAG1elnxMAE3YptoxpaJIWgEEoAh79+4N2P3fn2Xa+NasZdQfMqSfzJmevdL2fDZ1XEu2aFpnNrl1dCh7acyz2fjnng5A3XendmZj/vhUaBM6PXj8JX19fbJz507Zvn27bNu2TfRhCGBVJGkNChA7TbIClIXfVgCSB/bt2yc/fro427r24+ynTZ+HFNdfvT8nANe8x/usw3ZRARDpeQLojvE7AcEdGeAJ4AmhBYhtpDwB9PPWLftQVn+0RD557x1ZunCufPbhYln1t/cD1i77QDasXF7U53NXLOmW5YsXiisAyFcVQIvATQngmb4nRJkA9E8UAEEYoJ9z4MABV4DBoE7Onj3bJMDAwB357bcbIrENTx0BAIioz/48k7diWAHKpkBf369y9OixJgH2798vJ06ckNOnT4eVCH/2wB8/QF77LXu8H5zgcAQg2Rs3bhQHqRREE/cEsCGzFUGfNAPHjx8vBDh48GBD3w4fPuwKgDaWvBUhdB5ASAzS7EBVC2B7CoDdJODNd28axM4SrABl5xKxPNrapZd9wb3aAmigjScALSAmgM6nDmK8gxovjUV6ur33iS8IYHdxGvZsLxbcxEY3NfJWAG+U9T0bwtrQl2U21i/1AbG5Yeenp2IZuZgAQ7EAb5NjNzuxHV/SB6QswB6EDMUCPNK6TWqO2ylgycZGXaelPsBGZvYUyM4lbQlWkDqmrzuRCoP5bm/DY3d/etQ9C0r6AGsaWgDPCsqmQJUgSE+zKgJ4I27zdo8yJB9Q1QmWjbCt5+XLAiHdB++UJ3b+55l8LR9g9/ze6Kd8QGr5sz6gbDfojXDZIajmUNsH6FXA+0bo1Y19Sk+Fw/wGac089hUq5qi9cu9wtrIPiFlAnWmQWi30v010xJeKBmPEyz6A1PIBqWlQx/ytAJ7528/qsd0gBYgRjp0K1/IBMefhfeZOOSIb4Hj3vMOQKrtBbHLYDmE6NjvqOcWm59ixYyGk19O41AekRt9bBapYgRasbHqVCQDcvXs3kOKOk9c4e8DpM4Drhw8fFvnHjx+LjSTtybak1vM6UV7KMaWiwapTqmq/Yg469o1Q6oa2eiWIRXa2TmqFYN1YPX2/ivipT2KeDxE7L6pEbrGjLd1hXeYdglgBdLknetUzxthnsdinM/HW/tQLYx1NbaIs4dj6HLOAWD9sf+0/VmL/YNH3xHr3mMnZTlgTtyuF/aO1RzxWRz+zbIMV6799T2xTJ16DKpbgzT+rutepWGzhBTtVNlFl/06zgZwVQmJrvTen7cu9UY2dIViz9Op4z4y9WwueIh1LmRfvE3ds9GzHvBFPCVo1wIr5kJSw3id7TTpWJvbDYcyMq5p27H8Dqb/W6vemREn1w/vG6Ali64h3+FA2p8oczVAxEu+ORZKxaPP/e8ijQmUEVPYAAAAASUVORK5CYII=",base_creamy:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAcqSURBVHja5VrLa51FFP98UOKrqfiIDbmJtQ9qYlrB2wjqoi0UX1gItFpBFzXQIoIlCoEgiKAEdKMLwY3b4MJ/QPBfcO3ana660vWYM/C7/HJyzpmZe2/iDV44zHwzZ76Z85vzmvlu103Q790XZtLV5x4LSXgObEGY8M7lhbTx+tkByTPapMTCMY75pY7Fo16a7+ZLvUHJpOeZyJ8IWdPmaYAIqgEHkABhogGwFli7aACghWcQJhoAWeT6+vqeBUobTIDNwgLA2n3QodAASzDPbtfW1tLq6mryAPjm+rlMh0YDRgVA+GACEJ5BkL59cYLjQLXlHSK4mIUIz3WYhrwL2oBdRwSodahNP0H2IN8BwaXkOpuApQH7ZgJwUhyGdDjSbRyWZKzl/HQoxBiMw9jW+M5j8B68F/NMnAYwgAwGZ38tAOgN0zSy4xqH89vvuSc+Kzz0AHzw8tF058oTSUquv7o4ZdK4UueDGNsEQPrnbqb/HQAi8JdvnxwAIHVpg8A3+g9lGhYAiRzIAQ5ybBMA39/uDwCQOgCA8AyCjBGQYDJCJSGQGA0DwLBjq38iDGuAACDPAABCAgA2D+6rSYha1zbK2CYAWAMACAvPgrI5aM0oJTX/1e1T0QkCBOw+hPUAgNC1AFiXITVJF99E1SZSnIUOGrFYODx2dBAU7azump8Ft8a0enedJnPaG2kTZ4Y67Q49fbb1nd9Ok6vmvNvCI7zyYyC8MTznlVfOp5Xnz5i0MDeTSv0ReNo5n5g/satuDpCFWxqg1RvPlgZAC7wxGoBvP+ylnz5eSD9vLmeSurQtnu6lUn8LAEuLy7vq5gAkPCwI1FknO9zHYyxHyGN4ThFiFGoFAOtwAbBCWg1ZO+7xQq1rVLyFtwTASv/FLLiQ1JsyQK3iNcmN9xNBRJWh4qzeUHEh9NfyYq1sxrrOcugyTIA0CKMCABXm+vb2diZW8RbeSEBdt9pcADSKteltrQaIQ/vivWfSxsZG2traynV2grW8nmAWEFa/awK3Lp/PZDm4cQAAVf7k2mwWCM8WABFvJLgV3apMYPbh+9OPm7cySV07t2EB0AJCEK6z3dfwciRioa12HbkyADqMicDT09Pp1x++ygBIHSBYXh9UA4AX5+HUdH8Nrz6Z6lCtw/eeNJ0BEEFPP3okXXr6eBZeQJC6tAEE9gctAIwa+z369Mab6euP3s/l7bcuZuI2KYXQp/s7Tn4AgBB8AJ4ZAAsEy4/UUJQ7QOMigP/6/bf0959/JJRM3AfS/R0LI0IyCCw8ALBCiuVMLK+Lk6XOLaJkqwTAL999ljVVSOogPOt2zdNpVfYAQL8VWjwAWGBdsmOKskhogQfAhVO9NDf9YJLynYsr6dz8U6l/ci69cWEpLfdmctvZ2cfTqSePZRLe1/pLafboA3lMaLe4BwC1OD7ecb5P0ACU0u8SAGLHn9+8lm1aSvYF8ow+9IMH45oB8A44NQBYQDAA3kHKAuDZ6fsSqCYMg3dq5wgvVBW7RwHAUn0LiBIAXvY5NgCiA884AbDA0AC0mEAtAMfu7dLxI10688g9A36pS5v07TsAVgTgPu8YzjfNowCghdcg7BnA6e6oANSYgXeXoAGA6lokO+nV56a6XQIzINLXDEBtFIgA4Hp0EcOpNwSzSq6LgNwuQgpBcACB9l0L1aTv9rzkxtvdaOc1AFZCxH0smJSwYRYaO4w27nd9gLVgCMm7AwD00TISzgNgGA1gwRgAS2i0aZU3fUCkAfoiZBgNsITmMd7uWyaghdW7zjuOsugDdGamb4H0MZg1QQPSovoMQJQGY262cW3rlnmwE6zyAdoEGABLC0omUJMEsZnVAKCFszy/5SCbfUCtEyztsOaz6qVECP3a+0fhUEeFoXyAPvNbux/5gCj8aR9QOg0yAFHsh3Y05QGWD+AoYH0jtHgtH6AzQCsbZA2LvkJFyU/UNpQP8DSgxQyiaIGSb4RK6XCUCZayxGofEJlBi/prACz115/VvdPgqABU+QDvPt36zG1dN1tg6MQpugypPQ3qoyw/e31VPiDafSsK1GgBA1YyrxIAOHfoi4zoGXX2ARwWBz4giuctWV70iSrKBmtNqnZdnoP2vhF2rant5tX5TF7mh37miSIEeD0+7q8BP/okZn0e63RWV9IGazFo5wVzm7Z/brf4LdBr7xi9z2Lep7NOM/OCvATH0wBGmTVBC8zzeOYSzaXBBI/+x4r3Dxbu67R391ROL0KrOAuL92ggtOAeD7+zdMDi91mRq3So66wBNZpg2R8vhMkCR/PyXDVz6p33/p2mE7k9f97yYr1l03pya1d5MZaQXPe0z5rD8xme8Pxd0SoHn9z4js9KdjxhrV2MkqdITfWcng/x5vU+2bPQXlunv69bi/EosjXL5ry/1vK8ESjROqxvjBYge/7ib10+lGyq5GiGpXHM7WWSXrb5L2+nIs40xWoNAAAAAElFTkSuQmCC",base_chestnut:"data:image/png;base64,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",base_black:"data:image/png;base64,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",base_gray:"data:image/png;base64,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",base_darkbrown:"data:image/png;base64,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",markings_none:Gi,markings_white:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACpSURBVHja7dUhEsJADEDRtTjuy1W4zBrOwA3Q1RXBBIaZMm118sR3q95mkhERo3MDAAAAAAAAAAAAAAAAAAD87xoRl6ztBNyytgBr1hZgydoCPLK2APfMGQQAAACALgBlN78JAACgFMD86XnQ5l1FgHmicgCfizUj4rXz85uqTcDZKfiCWYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBb2ziDVsqrv1lAAAAAElFTkSuQmCC",markings_whitefield:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAVkSURBVHja7ZvpTuswEIX9eH6ovhS/QSDxg32Hspd9XwsIEOtcn1Fcue44cdqU27SNdNRcxG18vniZGRtFRMrV6elpoTo4OFAnJyfq9vaW72M1NTXV0Pz8fFcEv6oXAbjmBw6Ab36gAEjmuw5gdXWVtbu7Kxo4OjrqSLEAQub/K4BardYxgI+PD/6uzc3NoNLM/zcAMD+wAKz5gQTgmh8oAL7xgQEQMj4EMAQwBDAEMAQwBFAjY0L3NYDDw8M00f39PfU1gPf3d1H7+/sQXV1d2V6gBwrAxcUFwmOq1+vcCxKpPMIDygqADADCEMCnydetostatsDS8wACXVfDsPmk5F61Y77MANiIe9+O+VIAQONQsvKFOSAvAN986QG4asd8mQHw5OdDSFOpASDq8wOg6+trSMUoZL5UAFC2doQ1X+dZ7/sNgCrCfN8DyDJfFgCErA/dPg+AGPOlAPD4+EjPz8+UpwfEmi8LAGUARA+BHOb5MgAIvcwYpTYBaNNYKiWAn58fFiDs7e3hU0lKMz82NkaTk5OQKlK2nakAjo+PW2QMxYre3t5YX19fnE4bs1oCsLa21iIAWFxcpImJCRoZGYFUUXJflAjA7hEWBQD3n5+fAFDJAUCjHgEI4+PjkCpCfk9tAeDuEEsAoLxDwJ0Pbm5ulC8BAKfiZ2dnPHdsbGxAqlNJ7WwC4J8PCAGIzA84n8AK40IwhlsgzM7O+qLt7W1CD6hWq3xvpDpR6EU1AEinQ0IAckDg767X6xqlNQwHqbIkAOAhYIdBItWJUgGEzvekAYiFkABQOzs7hCLr1tYWpHwJANTS0hItLCykLqExShuqqQecsgDEQHAAcKXZNe3+3srKiiSs/zQ3NwepdtUJAOoUQggAHu7+3vr6uiSeADsJhLIm6zQAPAsbqSzlBWAf7v+uBGB5edlKtaNMAClvlmdwGIhRCICJABvCZORWj/zflSLB6elpjgWMVF7FLNepXTvWPOQaDUkAQFkQZmZmyHxSVsIk6U8A4EswDHIC0EYVbMD4mzJSUJQsiYWbbzoqmweAHfv2/+YAwMHR6+urGxw1NSiUF3TDvHhWOAsAqkdtAuCESLhUFoQ85hFDdATAJC3KZG8iAHtuoF0ACINRbUYR5vv7OwjAhxBjGsLqVRgAX+7BCQmAvU+DYBqnEecDQmgIWP3+/ioDKRMAlsueApAGIWmovru7I2MwCgBSa9xLwqTakwBCEGxDMQT8OQDP6CsASLJS1P8AIJPNicL630sAmi6UrlDDM9JdAkAeAL7wTPfCHIGVApMl7gsAoENrMF8ITrA5gp3harUaNI9NlCRJ0lkAAvk5F0asaQyH8/NzLp0nmzMaxp+enviA1uXlJWHSNFK+cgDAPie9vLw0XjCeAbAKP4RplJ1gHCUoo6bu//Dw4MqP5JpgREDgVQDPRcKFAon5WQWNt3VJdH1jTCMbTPKAllAYu9IhAF57uc34LjwLtUbAtm1AegoAGnUzGLey5qVan6WJN+kENJR0s8xegOoQlMDmao8AgCWt/XZbPgQAlWb7dxCJaHR0lGHi3ohLbQDB+TkORYQACAYq6Mao7dlui7QZMNC9MIn6EgCw7LNiAaB+iDcaA8CHYNJqTq39v5BpBwBPZHhz6D14kxYGxqyR8lUEAFtAFQAQoksEWD4AF4IxzyoKgHLmCy5aAoYxW5EA+BDyALCnVgIACOMb49q+BIDwN166BcCqAcIY1UUAkM4tewA08gnMQ3Y1wRDExksi/ZcAGgqZjwWQdnDbmOfDm3YV8i/EFjaWkCpNPQ8g69Q60mnMMdhgwZvHJ/4Ns4hNMAwxBDAcpH2EEIB/4WvbQimDVqgAAAAASUVORK5CYII=",markings_whitedots:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAToSURBVHja7ZpZT+MwFIU97/My/24e7p9EIAFileAFIfEAltiEQGxi30qBUpa5x4ot1ziJk7ht2snDUWkaxz5f7Gv7GvH9/S2y1O12xdfXl1LevWlqtVpG7Xa755k+4feXlxdT5uPjQ3Q6HXXt+fm5R77yuB/32u3G5+fn54+2ZTbcbWxZADaEmADSykcBgIbGBKAhxAKQVb4yAG0+NgC3V9nXiwDIMl8ZgG2+HwCyFAIgz3wlAK75QQPQDXUBhJiuDMBnfhgA9MyjARQ1XwpAmvlhAUiLDX0BkGW+AdAAaAA0ABoA3S5xYaX/EQC9v79LLgidcgFqADRDoAmCDYBQoSE8hMwe/r8CgMpGAkA/UmKoaCwAlEmKavNjA8BuRBHzYwWg6JtvADQAagcAC7k/3KZfoQCo6LK3xgBgXnI7iNvwOxSATEQjCIC4XgIA1I+/WZLrJ18bovQAn/khAVBmO52OZAAGAn+ntDb0ZezHBFAUgn2IYgEQIQAopvmYAIpAqAIgqvnYAEIhDARAiPkAAIVnmloACDWfAKBk+nErJ2umidoL6gSAkmjsm4JGE0Ayr4aKXl9fZavVko+Pj8QSUJUhEAKhEoC8HV9BAOLt7Q1v3pjn71FSa1EBuA/Iqvj4+LhHp6enpsv7AMEwKtXmxx6ATqBo8RAQDw8P4vz83AZAMdLrowpALVWxOYl1xlB3AMQACACSf3dRBy0xAbgQ6gSAMANcX19LBmAgoBf0+5BlqAAgrP6wAHp6epIXFxfy5OSEWOLw8LBSINzY2BBbW1uFp+4iADIDVA6AnrKAwADw5pX5vb09BYB7RHCCFfclMJXKANA9IhWAzp4kU1fm+MwAQG4SJQGgAuDu7i4AEAMgAAhRTABZMgAwPpFEwNjFD3d3d8qglmteA7i5uTHrfhscngsAMM+i7e1teXBwgJhAdQSAgKUyKHr6CgBAfJ0AAMJz3BUjTOzv70PEEOTR0ZHke1WZvMOYQQIwmxY9FDB9MQCyAUBnZ2e2EN2NIQ3A3gvo+AAIbF7FgzzzAweg82hcqdQNb7fbavrCG7YBcES3JS8vLyVAobdAbmIVscECoOJByEZo0AB06pg0AI6W8urqSvJbJvutO+MUbzPNvDLp9ADfVpiGDsBdUSXBC4GKnC7/I1ChO6eYz1ItAahGJT1BRW8YhGlfIRtAEWN5uQC9aKkNgAhvNnjnp4PnsADo87OqDyTHfFCPsHMIwwRQ5oSIMgxWBaACcw4A97l/E5UGEPIGyfO9CMAf1zwA1LY5EaUAoKLnl7lDwMnUpo1pWaFib3l78YRzPKxKsZXGbhL5BCRVFhcXDQBn/9E3AL7dYXQAviwy9iWYhrHc1uYTAMQAaGVlxd5/VDrczSyogyJvZNyFDEUKlKrLJ1L5g9vbW0jNQthzWABoYWFB8qdkAAoCwGEd4km3B7+k1B+WlpaMGABhLb+5udmX7I3W/f098QoUMgDm5ua0aGZmRk5PT0PEUtexFHfOHEoBID0NalkAQFuura1JBhAdggNAwHwKADE1NUUTExPGPKDs7OyYg5eyQ8AQ0wshyCY/Pz8vl5eXAYFYIk0DACAYgACAyclJiNbX13s2bWWCICU7N4ltMHIBkF3x7OwsAUSW+SEBEKurqz071lKzAKIpupE27wGgPmsKQFQB8A/d2JGwfbRgAAAAAABJRU5ErkJggg==",markings_blackdots:"data:image/png;base64,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",armor_none:Oi,armor_leather:"data:image/png;base64,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",armor_iron:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAARCSURBVHja7Vo7bttAEBVsC4YNuHKlIk3gJldw6hzATQ6gUpUqNYYRqFAnpJN7w1XgLil9h1wgyAHSBD6Ag02ekCc8DWdXpCSKFMUBHkjtktqZt7Mz+2Gn00orrbTSSiuttNJKK620cojy6/vHzo+v713c3d2F+/v78Pj4OAfuUabPFGlHUSsCgC+f3mQwHA6DB32mMQR4noDeBqbT6Rz83UgPAF5fphkCYDhcHyAJjSYA4G8arzEAZd7z4fWbC2v43hFA44kUAc/Pz0HRGAJoUIoAAM8wUOI+ZnytCKBb61hXd/cI0Ge89+2wAWpLAIKal95YZrPAqmc5V1CUSUAIYQnaCYCtt1ikOs3z7PlYEGSdvqMp0xKgw6aWBFj3B1LjF7AuTsP3jgBPOQQ2pjEb6GLgMImhtgR4xtvAl5eEIthmELfeWARuGrR/ynLFJsbDs7Yl1JOdZYeydqQ3bBcGeVNgb+q7CQk6Q9yWeGnZM97r/QwBsVUgyy0BKSL+vHyOTo+3SQANscbbzKVzFU3PGQJwtQsgrfMIqHoi5xlpy9SjGQBxv2BQ5wB2WWzrbVyoeiJXBJksoBMZuExsdwh1sZngXotue1mjf/+8mUNJyLstpkEoBjzT2L1GO4226WgRhZtMgLdKtMGp1kbc3t4GRZF3+/1+yIPGEmBzszcpabQHnJ+fB6LX6y1B6wgOidFo5NbvHQEfut1A3JyeLkHrSAqMxxUEKFG83zsC3h4dBeDd8bEL1rOHYTgwGAy27gE61AoNu00IuLi4CMDl5WW4urpaAspYv4uOfHh4CN59qQSokbhXaPmuUnLUA1BQ1DhLEgPY09PTHLinsbb31Qt2RUDSA2AACtfJyXgH71pPAepEQGUesCoG4Jo3FZbmAWURkDcL6PwglQpL84CyhkBsDmDnAtrLqVS4dx6QdyZYeQwoywNQPx6P3Svb2tViqBIPoLGz2WzJWEvCQXiANX7XJFQyD7Bubq8koXIPKEtgIIxdda31WuAghDs0k8lk3iNMYcjR3X/wFjNdyeHsRQa7dVzbyw6qg7eYUh2gM96BDd5GbHJXmhHcI+Ds7CzTOIByNq6Kg4R1YwkJ5LWIDkqAbsSmSGDHRwm4PjlZeID1Am3cI6GIF+BZmyr5vx4B1Ae6QccYAXZbPnZmmCEAV48AhTZOBbT38nqC1/M6i8yrg+runQcmt+VpvCUAC5bu/zGIXiBYxsZ5XEYS8nqC1/M8g8R/KgExHaCjJSBGQgwdvmQJ4GoNYIMKNq5fj3mulxqD9vhav0qznaBQ3TwCiiBzgEECFNqgLnF1DQ/F+R8wxI4570sNAM/yPf0wgwTo0tlupBIkwEPsi/fFwYwOAYIrOAY4b5eW0GNzBctjHy2k3rOrSW9prDpa/Vd5oeoRPdRQAlJ1VnF7IhTrAS8oaSwpqsdWZZ2GPeNX9YD3ue2mehSVv7uZemxcWy9FAAAAAElFTkSuQmCC",armor_gold:"data:image/png;base64,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",armor_diamond:"data:image/png;base64,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"}},Sl.husk={name:"Husk",aliases:"zombie",behavior:Yi(),entity:qi(),model:Vi(),thumbnail:"data:image/png;base64,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",animations:Ni(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAP3SURBVGje3Zm7ahVRFIbzDhZy8IJoERQhXhDBqEUUEQURMahFQCWViKSwsbCxtbWwsrMULO2sBTvfwdcY82/45DvLOTkTDGRyAot9nTnz/2uv287S0py/T++fdl8/bnZpf3zZ6jyO3F073z24falXsrZ00P8COoB/fXvbhDFEALRPsnbgCQA0gCGCMWBvXTs7JcwvBAFoGjNgLv2FJyAgn9xfbYLWf//80MBHMIE+AhbCBAI6QEIAmg8BPhkLTQBHPURg/xCQuRDT5wghbWFMACIggUiAedQQyPyB0bC1i4YJeQGysX6j9WtI5Fk/5zWHzfSzh/dkPAov32fbTngC/sXGndZG3r1enwLhEAnASgomxBzEjYIAfxCgbccBH3mz9ax7ufmwScbYvgnLOwiZ9hf1lNHuOwFoxNoMKGwYzQMc8JwK9uUZ5wk2jz7TGg0BTmho7cgCdDKZNAE846xVB8j7sH2n0pw07xlFnCeeo017dpsAMZ6x9/gZ+w/7CvqW0SQ6JDMAYo6xT0b29e1hjTkqRhPhuci+E0DiUuN5TXCc4UFU3evTUBOjCny0tcLNyye6i2cmHe3y8vKUDHGqNS1Gsra6cmRHmff+759fNX+SNhLSccp7kngZfNqxEUBUQQCe05T+nhGAjJGAmBAnwea2J8UX2kfGaAJEIUzgv2qP0ycPN6D5cVq077naR5IWI3j5fBiOFUfq2sLPOIOkxb79vgj9gE9OwjyngWfdH3TkDej6hWN/CUi/rtdxBZIfDVBIIMFyncH++pzrEhMBGSaCE+ACzft4z1wCqkYD2iTMIgATAYTtkoyPeef/ADAB1iLrAOEUPL53dQqg84q61+NdnQAcoM2gmgcmE0l/FgHUF5l3BTiLAGuQlNvgnz9aa201iXpNn0jguUE+YBYBOQmsG7TFBJDyApiPtPZ3IoCPpugiS7XgAJG+dcr2QWHx1LFDU9q13UOAwUMG85WAgKkXKoD35UifD3CNgI27zog/4XTUktzVK2uRQQQAJn1r2wSg8eoPKgH1fwcuiW2nlQATgd8gzJkAl+dOgog4Xh9EgO3aBMTeWIMkWp8CRwEAov18gO8HDNAEcNxtCrzL4GwCJsAFm9cjg5ygAQZcwOclgMy8xXOVALSHBnB8zuAAbwKy12HQN1PWssH5QsYE+PJmLgEBGwFUQPMw5ETYV51QXyKE9klWfKWecU2ETIDjvu8pIMDg09Zq1GuDCCC8VIC8iPnsi9SrMafNkSsrR5skiriPKQTwP/vPHW9iE2lz22vWrk8AV3LUACZoVz4AYJY87LauWfryCEADsM1tAwoJNfFy4QUJnqu3UwaXvn2E7zBp5+H/A1b/DxMW9YloAAAAAElFTkSuQmCC"}},Sl.iron_golem={name:"Iron Golem",behavior:Pi(),entity:Li(),model:Xi(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:eo()},Sl.llama={name:"Llama",rideable:!0,behavior:ao(),entity:oo(),model:no(),thumbnail:"data:image/png;base64,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",animations:so(),textures:{creamy:"data:image/png;base64,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",brown:"data:image/png;base64,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",gray:"data:image/png;base64,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",white:"data:image/png;base64,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",decor_black:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKTSURBVHja7ZldS9xAFIa9qBelF0WktXa/LH6sel2KiAhquyu6IAvS//9Pxpypb3p2yLIkTi5MnouHZCYkE+Y8OfORrRDCFvQXOgEB6AQEAAQABAAEAAQABAAEAAQABAAEAAQABMjL8fZzMCYf5uHHx1lEdbnb8c9W+Xx38b/u8zweDz/Ni/qniMptvNO7EcB3mjouV6AOJqehijYEqGpnNDwJw8FxmIyn8eivWZ1QHRmgYO/L4SxXo3c3z8G4vHiI2LkEyCWBnmXPVXue66un8vx+towsHv+uXLc6O0eAzAz2p2F3Z1xyd7ssv7icAuhrtyD69tbx7etRROXh99N47O0QYCnfxul0OHhrkNTBo8F5PP76OYuBGo9OsgqgVC4BfHA3UWS84v3O4j1kgMyog8sM8DoEWLCyCVBM7ux549E0pnLLOvrCfdt6l7TOC9N5AXyn1wlA0/vSjrYhoJyAFRknZwaw59p47oOdBtgPSVVZovMCrCyLagpg92p10FQAm3yVs/CMAuiZXgBPOhdZJ0MvhoCmY7vW83VXAZqF29FWAhYoiZhtFVAMA+tWAb5tO//ze1nO+lWnFUIvBNBY3GRJV/crqVp327llkjb3AWyiWbUvoHdIr1vZ6IUATQLZVJyqjSXVtbHjqHa0C6jdvnTo065gWkcGyJwBoOcZAMgA0KVVQNf/mLETCN0VQF/wv9nxYmV2rn8BKvvzqlm8R/8Q2vzfD5kzQBqktKxg+jJB7ZAA6UQwneBtug7vXIC6AWcJSAYgA5AByABkADqyO6sAP8vftCpo8isY2AgCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABIC38gLeyhdyeyFSPgAAAABJRU5ErkJggg==",decor_blue:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALySURBVHja7Zo/ixNBGIevsbGwFOw9/6DXnYgneoVF4OSKAxXlRGzsbP1Odn4BQZAzcGiX2s8RrMb8NvnFd5eNXiYjZHef4mF2N7szm5ln3vmT7KSUdmC4UAkIQCUgACAAIAAgACAAIAAgACAAIAAgACAAIEBZdi89S/euvUlKb14+SXtX5+ha6XKMyxO3r5zU8GdKhd/H1wYpwK/vH9L07F2ajt+n9O00Tb+8SromdL5JoaOXk/Tg6EfF/miSdC5U4aUFcDkPjycVLlvp3cM5vqd57HuJAIWxSJZKQqmi3etK9n7lO/36dimvjo3Lrq7PRDcW3vchQGH2DsfzBl+kFkCUFMB5qhFjeUpHL/6c33n8ufb5rYNP9fcbogBVD1j0UA0F7rHqIVXP2aBQVeqN+x+Xlaz8HJJLCaCxWyG/EmD2zqsaf1VqCfSeRIDCqMepEdzzJJYE0HygpADLMXwRYdyozR4fG70tMvRegGrcC+PzOmN5znPNCCABPOkqPQQoT+X/rwjQDPsx7b0AngQ5zF/04WrSFCZyF31OjR8bQfm4sUpGAOep9/tbmG+LCPH9BjEExCiwDpof5KwCPK/wsVcBopQAliAuYaPstZWB5zvh2CuEQQiQ+0XXiRhxCGhbd5dq/LaVgHn6+mfrsSaMOo/rfzMIAXJDb85zcZct7s79j42g5i5fLNO7j/Fa285h7wXQl3zyfLz2l819DnokwMHxGQJ0XQCH5BwBHEqpzI5HgJzx3PcjADuB0FUBmuvj5YZQXKeHa9WyT7+WhXubvxfU8tMzIS8qfYsjgBpIYb3ZUG7g2sMzCa4/Ok+5G0iwpQLE3a8YHfyZG9x/FsnZCIItFkC92gKogfePzqtrSmN0WBUtoOMCLPfBF2HeDa/1fgz5tchARfZnFdD8ibeNTX8/gI4tA+np7AMAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACwNbwGyFCt9rlrNTDAAAAAElFTkSuQmCC",decor_brown:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALgSURBVHja7ZpPahRBFIdzDBcSBxduzNITCBoIiZAjiLgTRHTlBYLLkJWXcJFlmFsEQtZepPVX6V/7UulBqrsL2+4v8DHdPf1npt5X71VVZq9pmj1YLzQCAtAICAAIAAgACAAIAAgACAAIAAgACAAIAAgwLd+OnzVnh5vm4uRpo21xfrTfMcX9E0dPEt/fbNKr76/30jGf13L26nE6bnzeKgXQl48BcpC8Peahuo8aVg2u7bdXB1UaWp/z8+VxF1xhEfxMvXf7/lES0tv+njpnCiHJAD2B+fnj9YMeqIBMlQH6erif6WD7nOuPBynwer3+8uKe6AhQSYDYyA5MLdHis1Lm+S1AFFD7zkjOSkLnaH+1JcBcnPypnS4LYwOjHtdX/6focQqoe3lEvTuv+Xr9tH2ZSoVS/rvt865MWAgyQI1BYNu46nlqeIlVewwQg69n+pjOcRn4uj29Gzy259TITLMTIH7Jki885ro8NU+VXfLs1TcGcIAtgIIulAkc9CjMKgSIlDZ0aeDy2lt7DJCXA9f3e7ODEHQfq/W5ZlkChtbfIb1Wz1HKjfNy98ypZgEx6C41HnfkmUef5ebD3bjE4wTPSFYzC/AgqPQGuqb0unzwV6vWdrX+cNOtAbiX+5kekHoWENcEaq1PzFIAz4NLb+BeUzRKD2k39kYdm2IwGOt8XqacZWJm8HGvGMbPtRoBVO9E6Q2GXgczE2BIKh9TOmbZGO3frv3FlwAxpAQMuQ5mJsDQOe9Uc3fg9wDwLwSI07F8sUS9O67R5yPq/JoH/19v1+Tj9TT6jDOAg74rvVsI0v9CBchnAvl+PuJf0gwAAXoWg/IR/t/eh/9cgHxRp3QfFl4C+vZVBmjIBZWAmNLTb+RCyvePJigBCxXAU7xdi0Oe2o1dPAIWggABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABYAy/AJaSG5M4H3NeAAAAAElFTkSuQmCC",decor_cyan:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAM3SURBVHja7ZrPatRQFIf7BqNjLYpIkSL6Bm7dq6AIbn0Cn8CFVazowopTKUqVFmm1UBfVjSsX4kIQ/IOIG9GNIENf4jq/mBPO3Jm0zUyCnclX+Mj/ZHrul3PPTTIRQpiA+kIQEIAgIAAgACAAIAAgACAAIAAgACAAIAAgACBAuTSu3gmiOTsfmrcWQmOuFRrX7v6js37o8+s8N+4Fu06GX6d5v5xeu2e/En7PSAqQNdDNVoKWJzvTqduLQwdl/4OVsO/+k3Bg8WmGgl6FaDq3rpeH/w15+5ABSubkxusw8+xVOLryIhxfe5kEWQIoG0i6Mhpe5zEBjq1uBl3TX9cv27z2i9F6BCgZf3dlAlSQapXWdW41oqaHlp5vmw08ylC1zgBqkCTdd4Jo3YDvDobNAM2F5YTp5Y1MAOt7y6oxhBdA2UDzU4/Wkjvfb7O7XQ2veb+NDFAyCrD1uUeW1pOgV1kDqCEPP17PGto3rk0lhGUjL4V+29gL4O86FXpFAtxvficUbBPA7sTSM8BcK6sB+l2vnwi2XyxHLQTww6AigZ5Mu4Qix/l+1oJcSQ3gMsBOlb5tO/hwtWvfWmQA328OEuQiWcMygEfBTqr2MjNAKrTd9ZJAKV5T1R22zo8QtN2PCmy+FgKc+/UlXNr6Xvif1TFFj4vvuuQ5QIUZwFf0Nr+b8X+tRgFm/SAVfdHjup6+WdczQBe0m1FAdl5ll+vzvU8I4yeAfrvqiAqK0z0pwIf25fBm60Thf1bHfGxfGesg1UIApXF1A4N0AWd/fh4LAewvb5nnAIAAgAAwTgL0rYbTsb29Ueuq2F3lnrwuTunZx72RS94npPsR9D2cAeIhnSr8d+3TIW/7mR+fwsU/37JljQb8SEIF4vnfX2n0URbgbftUrgDxQ6B4KKnRAQJQA0AdBehkimkCPGpFYFTc+YIw+5DTfxjSr+BzH3zqOH/suH9gOfIZQP2378PjPl8Fn+/zte/79oXcom/Q9wvwnwRQxb+dAHHRF78H0DY/KkAAikBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKiCvwbtcm/E97kEAAAAAElFTkSuQmCC",decor_gray:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAHKSURBVHja7dhRagIxEIBhj2XxZY8jiCDeq4+9Qq+VNtKBdEmWrU2Kdj/hx5hddmD8dzLJLqW0w3aRBAJIAgFAABAABAABQAAQAAQAAUAAEAAE6Ms0TWm/39/I45JeMWrPj7lW7Jib30OAzrx/JjV4OxzS68vLLdm94+Rn5mfnGEH+XYs/v1beT4ABFWBeBWLcO0Yt1vxtb92rAgzicrmk6/V643Q6pePxOCTR+Zn5+TlOjhHEXHyX1/Pc+Xz+Nk+AQRWgRu8eoLXer60QKsAAyvU2xqMqQG3Nj3Gs/eX1cj6uEWBwD1DSswLU3ualirDJXUCtEVoqn2u2UrWEl8ks19xYi0ckOseMtTyv6xEvj6P3CMp1v+wD8ngzFaBl/dLcPW9t6638y12AHqAhwFKCWkm79xyg7AVGnANMlT39vCeo9QHzMwM9wOCTwN9Uk3t2Gj+FACDAJpLx9Wn9JgAIAALgPx4Erd0nrzlVWzoskvQnqQDxR5Z757w3ngbt2fGAS0D82XFQ0vu0Dk/QAyjhmsCdsm8XAAKAACAACAACgAAgAAgAAoAAIAAIAAKAACAACAACgAAgAAgAAoAAIAAIAAKAACAACIAH4APHXvcwKi59cQAAAABJRU5ErkJggg==",decor_green:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJoSURBVHja7ZpBbsIwEEVzBKpKVSNVFQuE2HEH7sIKqWq77OVTHDLhM4SFHVuF+lV6CqYJEPvNeGxouq5roF7oBASgExAAEAAQABAAEAAQABAAEAAQABAAEAAQIC+L/WvXHpY94fHzz1tPaIfj3Nd/+my7QHhtff3T+657/GfQ89uvzcVzVQowdkboJOmQwNxBskFRAUp0tA7q+X7Wk8dwbrhPu8fwuNTnIgMMHW4dbKLZce7r26AaPiNo5C+aATt/aJv0CFCAcbAlykp0tKb8MbJ18J0AvTjSfvl+76l2CtB0qBE6N0p13tVB6d/nSK4Mo/O9ZgOddqZEsMG3IxmgQAbwBWC5DLC8jnpP45Dor2IK0JuMueEQTSnXWaRrVFo7RwbwqT4c++c+NtO1wYQAWjNUIYAWSrERFhvBNtBehBIZQAtMXRb6DDBOFc3lOe1hVccUkBp9Jk50ah4G/6IGGCI118D7it+KwTC4lt51KWhpP7RPy9RVPauAxe7YGbv4m0257npglkUzwHmjaX012JoNNO3r/+oQYHu88W2CAAnX6SbQ1O7b3JvSwtIi3ATQ9zQJLOqnpoh6poChAIoWIPE6qDgD3G1nDH+32tQAmWoAuNNVQMr8W8NamZ1A+L8C3Nwe9d+ayTd4ViXbUffXdUPJ9vdTNpngDzKAnwb817N+0yfXsg3uRQBX0MW24dEFcEu62DY8ugBuUye2DWQAoAaAhxXAL9V81e9/spXrBxzARhAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAMTwC37YLTYeqjNqAAAAAElFTkSuQmCC",decor_light_blue:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAK+SURBVHja7ZqxTgJBFEX5MxN/wNqP8HdMaIylnSaWlhZGKys7UKNGKxMTGqsxF7zuc1zEhV2CO8fkhBlYZmHenTvvDQ5SSgMoFyYBATAJCAAQACAAQACAAAABAAIABAAIABAAIABAAO2yP0pJDG9TOnpI6eBu1ldbrDq+xvDY4vTx/Vvb/fi8ro+fSW2/XqQAPDHm8H4WKD2KVQWwezVDY2+fzya87S+nsbfOJtN76F66j9qXLxU3rxWjt5+v6REH6CAwnlyJSv3j52oltjF+7gIOqtsSg7AQ3Zdg4vMIoKMtQJO7c1E5QBdW67ElhOg4CqraT5NKiHXo8+n1orcA2b33aa/WVYN1Mp58WaxXv4Kk8dtygLini9wBJADdP+Yesa1r5AYSCQ7QkQN45e9dd+cAGlsCsLVLZBaABWEX0KMCHgVQxBYQJ79JIIbj5d4nAXhFOtOO+3VbOUBEgXXOEYMbV36sDiQGCaaILcCTNLXg8d+/cF4lNM3OYxXQhQNIVB7biV1MAuft/37eeUIRW8Cyq2+Z9zkHEHGf1sprswqIdX3MARRgb0EWYl4NFFcF+As3HcAT1uQ9chrfT0H3Pt2FAzi/8OdUW/W+a/+44uucoJgqwFvAOhwgnsrF00BXGW0EPu7tPnmM1YHuHU/7fBop/Dn8HhxggQOoXuZcvQcOoNWwDgfY2Mn4/JvX77UAnPg0HWBZ54CCqwDg/wFgUwSgmrzu5EyZcHyt7jd1XeO2DpBiRh2vbes3BOjYAfIg5X0HPPYJao8EkCd0dX2dnM3rQ88dIC8VsfUeOkA81s0dwOfmq5aO8E8cIN/j83+SxAF6JoB8RdflAL85BPTcARblCMBBECAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAWAcfU/9gsrlGgakAAAAASUVORK5CYII=",decor_lime:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALESURBVHja7ZjBahRBEIbzVnkEX8CgJ0/evCQiHnP0JjkIQrwIehcPQQ+CsET2oggyZAnxkkuOIuQF2vyDNVYqM7tMp0d2Z77Az07N0NOZrq+rqmsrpbSFpisWAQBYBABAAIAAAAEAAgAEAAgAEAAgAEAAgAAAAUBZvZg/StLht91ar6snyd8r8X69Z9k8Jt2z5/Ge2ZMEoG3h/ALeZtKj0/v1O/T76efDZPYQoOn9fg79etkz6f2PndZrIkBhadEF1tHiXuMgvytLRRjv8GbOq+vPi/00qw7Sx/M79bX0pXpVa1Y9T/PqzbXnADAAAHKO32VDRQA/hwCQbQBECOR4QaBf3dfzyQLg86HPk5YbS6WAd9/vNs4pWQPECODn9E6XBKS343MiQGG15WNBNkQE6EoB5mSFfG//u3/Q2KMHwO/oPrs7d9zs4kHjDCu4fJFZMgLI8ZrPokxXDdC28zX2uHo5DQCs2u+zE/24Po7zzhi6BpDz5UhBZnNawWdOt5zv04GHYRIpIDe354zzKcCKtJJ9APufBKY/6pltVX7c+VYEGgTa/bInAcBi7206fTzv/bE5425EgKvj4BARQHP4PoC3/X2fivypYVJ9gMuT7XT5dbv3x2qMxubs0K5OXalOYOwGxpTVNrddT64T+Ozsd3p68qv3x2qMxtJX33AAFMYVzvu+IHfcWi7G378ue9wpICOU3yZ1oDUDwKrm3DM3i0knEG0iAMuq4a5KelmVbRV013tY9DWOALERs8o2R7OQIwEgVvTRjk2fxd6HrOYRWlMA6orenQTiySBW/JwARgZAbAbFJs+q52jDAbgZ4q/bq1IEGkMKiCF+WQrIbB6hDTkFxKNbm80pgEYQAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgD0v/UHCcB2t71fhaEAAAAASUVORK5CYII=",decor_magenta:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANYSURBVHja7Zq9axRBGIfzV1lIUAwKYpNOEBsb8S+wt9TCRgIaNUKMwa9IFI3iF4pEGxWDiLY2lukOFqtxfu/dO86tJ2Q3c5C7fYSH2ezdZDbzPvPOu7vOhBBmoLswCQjAJCAAIAAgACAAIAAgACAAIAAgACAAIAAgQFlW9l8JYv3osqHjZ3P3w/rBW6H0GHXuzS31x45j+XG6nsE5vyb9rLaTAuQB0kT4pDi7GbR36av9jmrxe9Cx2nFMdBrjwpfgY6oV+nv8M7V+Lb2LW+maJIOOyQCF0eRrcm3if1yzVhmgpAS+ei3Ab0+mgPp5lyMFfoQILj8CFEaTmwIQg6MJ3zh0d2wZoHp/ZigD6JwC+6n3IryuVsLT7evGh+0niZe95ZQlOr0F1Fs/3pUAcbV5cH5/PGvt7QNXbYWWzDIewOrbgrWrs4tppUsABT/PBI7O6TP7fpSVDFAYT8c24VvnLSh3ZpfGlwGyLcBrgEfHblqQdV6r37cFrXydswwQJdG1Tb0A+YrWqmkywW365UWgZwDPMKX+MAVbK9jH0EpW0L3w0+cK8v8ygEvRiS0gT+1N0nvbfprUjfnVfjqOGcBScsHgO2uHb/TH+Hwupf08yJu9B7bfq1U9oOOHvy5bZlj7udDPAF25C2i7r7fppz4mgAoyFYExSFqtonQG0MrPawDhdwKp6s9u/fJbQxccAQoLMFQDDG67SgY/vzbf8/22zsfLx8/x77oAnckAWomtCrrH+0Lbp3QKgoq/NtvITp4D+ErPn/75Q636E0FlJJE/BfRsMfUCWJUc92IVS42CH/upT9N+e3YyBv869y6gejVvhU/TQOr7KpzaZIFJEKALQqRA2u1Yw0Ba5ojyTEsG6PTbQD0ubVUDtOwH/H8A2AsCDL0PH1TA+TvxvHr2t2lq/3mX7q+Os9+R+o6hyocxZIBq8/TQfq79XXVB9e7U3/b5kVC/C2Aip0QAKwRj0FOAY7Ct0FPw35yIHA+SJN//859h0jNADHR9RSvAlgkkQy3YdWFg0gVQoEdU9ZYBRgR6lDAwRTXATh4EtX2EDNwGAgIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQHP+AGvUdXJkDlP4AAAAAElFTkSuQmCC",decor_none:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABJJREFUOE9jYBgFo2AUjAIIAAAEEAABTLtGVQAAAABJRU5ErkJggg==",decor_orange:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAMKSURBVHja7Zk9axRRFIbzN2xsrBcERS2CFgEhFi5aRBC0tLPQ0k6sZCGoUbMmIUZB0uc3BOxSRAiIpPZnHOfdm5O9e51ZMpO7YZl5Ai+zczN7d+ac556POwtmtoC6K4wAABgBABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAkFmHb82O98y+XjEb9Mx+Py0+r4TPq7fs3PN/uBPmGi6b7fbC7+j3NPZmORw1/v25je7l9B6K6zafhGt8XGOdBEAPL0Ou98NxbclODSvlBOD4VXBW7gcUVD+Wwu8cfJsEQOMCYP/1GID1S2FM1/j4xlUjAlxEBPAVK6fliAAOq1a6HPtrtzwCuKMFYQrA5/vF/dwEgJkBIIO78XM4vgwEOXrj8v8pwCOAh/rRPZykgMHDAMD72x1PAZ4GdPx0z+zLSjjmSAE/h5MA7BRRYO3u+eeWNvshmihtVUUAASBnxwAIFEERA7B1jQgwkwggh8jgs6wBvAgUAGVF4Paz8hpAADgYnagBtMrjlX/WCeJr4znOCkDaBchhdeaZ5nhXVRdQVgQKyLgLUAQRFK0HQJW+HlaqA8C7xXFXUOd7aRF4+KIw9IP8hlYqcADKUoAiQFoDpCmgEwD4ahYAdSdp0hbK6GrLvAYQAB+L/L96I08NoDm8DvA2UDWHHBqnAK32qgjg450pArUC/jZYhUePwuppUgM4AN4G5n5AX+nT2sB4IyhNAYNehyKASG9Ce5PvpTXAn5fjjiPXPsAwCvVlRWBZF+ApoJMRoOkOX46dQdSxCDCvxjj5qzpvNwDK/01qgKa1A5ozAOq2gKQAdgJRGwCI35y5/NVvukGUXhufp+P+zsCv8f9j9DmOAKO+t2+V4T11ojsYQ7YEgIPHkwVdWuClhaL+X3cTCM0xAGlLV/cctSAFpCF+2jl5vYURYGexRgS4TgRoFQBpji87j3O+zvUyCEOSAhAbQQgAEAAgAEAAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgAEAAgA0EXpH3uMeVj+uIEQAAAAAElFTkSuQmCC",decor_pink:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALYSURBVHja7ZrBattAEIbz9IVAKJScdMuxBHJxoIWSSy59jVJSYppDbqlIL1vveGc9GisFrVfB1n6BH8mRbIeZb/+ZHeUshHCG2hVBAACCAAAIABAAIABAAIAAAAEAAgAEAAgAEAAgAKisbh3Cx1/h9cMPOQ4Ur1X6fNH5w1D2d/E+1f+utwiAJCcFIJ5bHRqU19tNkL89BT2K5gh0TOLX31ut1lvp96ni7/rr3XW9317HASprE9hPL0GC+7n/IsfsBjVAsKs/JfEm3A1AWIX7HRCa/KSL534HQTwCQGW5gItiwip/j0BlV7KubusKFgBzb3QncahmAUjWb+uhvpbjIV8cLTcF+vl72AbZ1u0K1q+OIp9vALjqww4G/X4Pws+/w5KAA8zgAGqvej5HDxBhGnMbA4DKg2HL0/IBsMGfkojS96Wkx6Bnq7UdeYVdQO4prL1rw+eSP9oA2pLQBAAlCdCtkm7pSnoADfYMDiB/kzZ1IwnPjeBYL2DPmygBXQrI1A/RejmxBOTgaz9Q0wHsXEG3m7a+qwPY1Z7U/Qn5PPcHTQBQugo375Et3cRt4N4qm2EXkLeBus/XvsPvAPS63f/b+1pxAAlESUM3FRxd6WnfnwdMuuOoOQnU2YJO+ezUz5e+sclhK5NA6XgLHUCskrn66TtASSKLwTnGYKSft14vGwCtgyVN4MJtshkHkGFISb0t6R0Q/w+AjgEA1wn7R7/2sXCesL11fvm4lXnGPujwKRXH7QBSAkySZFhj9+ddmo8fWjbQkZYAP9SJtd2uWve6hUlZWwD4hLutoaz22PXTAC7XAQYrepNsa/kCQze8Tl1fEAB7CfZAuAdGe46AThsASa4BwDeFkmxr+TjAwkrAytV0Px72D378rgAxCEIAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAgN5B/wCYGoUPx2L+8wAAAABJRU5ErkJggg==",decor_purple:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJESURBVHja7ZkxTsNAEEUjFIEEDUUUIUoKShoKKs5AgYTo4Fp0lHQcgh6ukJssrNGPfkYOwc5aBO8rHrE3xnZ2nmd215OU0gTqhU5AADoBAQABAAEAAQABAAEAAQABAAEAAQABAAHKcj49S/O92ZLj6Tw9Ht035O0S53f8OneHNw15W/vXB1fNdj4m7+fP3KbjqhTAO6ytQ7e5qDpc51eASv84iaXg5k9d2+9BeJt+Z24jAwwQmNzBMQilRPBzSTIFWG1rmZx8Y4IiQGE88CVTf5sI/nRHAd4f3tLr6XNa3H4s2/L2y+yp+U5tlIDCJcCfLmUDp8QYwAXzUqP7/zELBMgAA2QAH3gN1dEuwrpajwBff7zOdXkC/dgu/6fA64n3gWCJDveBn64RA7+SBULdr04ABaFrCva03WWw5IHw7SHHAJru6X49C8VMEWcMVZSAviNedVTXEhDrf8knzuv/5f7Fyrl1LWUHbfv00MWoZhrYt/P7iLNuEDjUGEAlwQPsi0FxTBC/R4BfBHPbUXpJEeJ524SLbW37Q01Pd1KAvvVOncm6+j8XoG+9q2G1jBJQuATADgrQt97VUCdZCYTxCrDp3Tnv1ivKALGex0WeOE0r8WIIdlyA+J7ABaD+VyCA78eAMwUcmQBxMSgu8sSAa1WNjhyJAHExqC3gURAEqLwEMAYYkQAxwJsCTgZgIQgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAP6CT67j1Zn3kJDXAAAAAElFTkSuQmCC",decor_red:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKcSURBVHja7Zoxb9QwFID9LyhiR50KQh2Q2FCXdmDhhyJxVzFUuilLpExhyNBMHfsnTF4aHy+PHKp9Lrrgb/iUc3KJe/bn52enznvvoFxoBASgERAAEAAQABAAEAAQABAAEAAQABAAEAAQIC+3r997oXrzwfs7N372m+FSJZcz1SPPqt1THdXTMdQZ6v9x9m4s62vCZjg/+xtLFKC/vPYPH7/sG0HKupGOqbR/+9k3BukkOS+ddvQPG54RnilHXZ/+/PP8anbU19vp2MlziAB5aVVD+60bG3vs+E3GCFC731Jt3R/C6U5vVGc3S3IiQF5044aRlrXzA8MzOzOqW1VnONctnBfuL27KFSCE/DBX2ungWAFaFfr3AtSZI8DdfCpojAh21LcHRCACvEAEaE043s/bOSRQ+cShMB9GfmcikRahL0UAndTFjG793ZjEcDa61CjNugqYcgBdR2OSwXZhKloq//cC6CXP46evz/7BMjWEpdS4lHvmfSEBm42y6gVygMrNRnnzl062UaIvbQqI7cRj7rPLvzBKs0qwUTnAlAxq6fR8v5QEdsXlALvEJCzhvsV9gNrlWw3Uh3OAXi0B2+lzt7AsDOW+pAiQ8mNT7tM7bzLqv7+68GHnLncOMNaxdbNdQDnK1LUbkLr1buC3aVrTK6AyIoA02C6hA1Lvg9MSQEZxyhZv6n1QcA4AJyiAzHcpOUDqfcD/A8ApCGDfh9vXvodeCwdk9NsMW3/fvmun0U84AthNndgyrH0KsAldbBnWHwF0QhdbhrVHALupE1uGdQtgN3Viy0AOAGsWwG7qxJaBjSBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAPgX/AK33ndmL+leXgAAAABJRU5ErkJggg==",decor_silver:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANwSURBVHja7ZpNS5RRGIb9O5nmZIbkuGgRBC1ataihMrUy+hiSokUbceEIQRLSByr0ASO6cTEQutCFIOhmtoK/wT9x6n7snl4sWuSZhXotLl7fD855Oc91nue8Z+xIKXXA6YVBQAAGAQEAAQABAAEAAQABAAEAAQABAAEAAQAB8vK6cyDdvTCYnp0rpxddA2msVA5Geg+OR21fbahttaf23YeuFdF7+L77Lj6n+wIBcnXWcdDf/v5+ere0kRa+N9Pi4mLQjoGWZG6/uVAP9vb2gunp6aDRaASzS+vxPlNTU8Hj9xvp+Zdm2t3dRYDcAmhQNeBCwZmbm2vNPs3GHBnAGWZ+fj5Ynz1ge3s7UPBnZmbS5uZm4PfRNVH9sB5IVgTIFHwLsPLwZQyygqBZqcC0IwNIpomJiehHgZR43x6MB5r1CrwD7kxRFEWZQu+KAJkpCuABdwbIIUKxnjvVSwBRFEBMTk7G/WKp0Pu4VCBAG9BAj46OBp5pStm5+1EJcPuq715zqCQo6Kr1y8vLaXV1NT19uxIp3yWhmBkQIDOq+Qr+0NBQa6Zp5lf6BrN8BagtZ4B/CSB2dnbivgQQuo8AbUar68M1WGk7dz9q04s9p3xnHvWt86/D1fTx3pNUr9fj/NP9arC1tRUlQ++KAG0UQGlYAfKMzZEBlPrVjjKKZ7pTuzOPBTi8KFTNF1owCpUFBMiMAq50rM8uz0wFrR1rAC/uLIJKwtraWuuzzxnC+wR+XpJIFt1DgMx4t82rfqVqr9xzfAWoDe/meW/B6wJde9V7OSjuPvpY3CHMtTOJAIAAx2IwCptVfztHAEAAQAA4SQLc7OlP17t6053SpRY3ui8G186W4vzWuf50tbMnrmllrOeNV/C+rvaMn3cf7djsgSMKoKA46FfOdMdR57peH66mSqWS3nxupFqtlsZqP7+Vm81WYCWFgquj27EIkscCFaVg0I9JCXAgtT+uzRDLoIAqsAzeKVgDeNZqx0w/mDidM3CnaBHo+q7AU8NP6VeAgq/Uz4DxGQgIAAgACAAIAAgACPAfPCqVkxnvGgj0d/XXf+PoWHzm8DmBIwPAScgAxdmuLDByvtzKBuJ232AcdX2s53e2IHBkAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAPiDH0u6mtJUtilqAAAAAElFTkSuQmCC",decor_white:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALGSURBVHja7ZpdixMxFIb3F7pCwYtFQbzwxr9WKRTKluJFob0WvO4fkMW1UvxAWIg9mXnLaTauzkyq3ZlHeJhJpjmJkzfnnGT2IoRwAcOFl4AAeAkIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAZVksFsFYr9fxOplMIip3tb9cLsNsNou2dK8+VCeszv9Wdf63gxTAeDwO0+k0Mp/Pg5V1Nbp0evftYzDC7U0I37/Ga4mJT7GJlf3Yn93X3G1vI/E+M54fX7aH53iAwmxGo/Dh8rJif39U3tPVvre1cfb9vfrdpP1n6hBAYV6vn4U31y+CXY1X70ZHdLXvbcn+y+unR32pLNLx2HO1H2wIkNs3FA6M7iGgdrOf5YJ3JwkBZvPg3r37r+uM6Ooz4zlqhwcojIu19vJ/fro5JIMlhOCTPk24Jt8mWfE/F/s1HhOB6novAL+im6zutu00IXEy4mrbVpNV+D9nNuMkK9nbX6sVv7vnDdLxVPW7YXgAZfxy900E4HcJTXIAH4st/p4qB8jFfOvPyr4uHY//7SBCQNvY3qbdvYw8oeQuIN0N5MiNx+8WBiEAi3tGm4SuaTufhMkVnyIJVA6QOwuwUBDje12fjufwfChJ4Purq1arr007f/qnU8HVahUpdRLobeuET8mhXdPTv/S5xjeYk8Aq822u9raeA85MAJYAPX/7JLRJuNq0O8uXUf/7XZkcAA/QXwHo1K+pgRIfh4C/B4D/JYA/ffbVPj93n3um7wayUfIbApzYA2jC/rasieZF9kQAaUKXHvKkW8W2W0c4UwGkhzpNy/DIBWCrOV3hqQd4yCPAIxdAeqjTtAw9yAH8is7lAA/lCNCzXUC6dcuV2QVwEAQIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIAP41vwA6beDBsiAlTAAAAABJRU5ErkJggg==",decor_yellow:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAPESURBVHja7Zrfa9NQFMf3T+0lIL4MYTgZQygiDvw3BHGg4Kv6tH9D1OlaOqpzWsZw+CBDsBai3WPomrbDtBnXe87NTW7uHJiYjpp8B19yb34293zuOeeebEEIsQBVVxgEAIBBAAAQAIAAAAQAIAAAAQAIAEAAAAIAEACAAAAEAIrVqLkkvBdXhPfulvDeXBP+21UW7Sf98/1fO+petI3aXmNFDHeWhbezxs/WzzLP5d8gt977daXovEoCQC/uv3KUoYwBK2JQ/N494bs1MQ22xEnvIbfJMEW/HP1Wv7Mom3ti0Hsghi49oyX6vaf8zOB0P25Pg7psPxEjd0mchV/jNl0LD1Cw+sebYtBd5cGlNhmgKLhMD8OzuuOIcNJkAKhNxh30NmLj8vNjSPR+V/R/bPD5BAwAmBEAZ2FDDvp9Hmgy2Gw8AAFwwIbWxiVDKwCPeKZrABLP9Fm1GYBv1Q0BPIDtOyp2yphIMbKoEHDSrfFspDYZhmOzVKEegMKWvDcBQB5Az3pt6GDcMva7sdGnwUH8u2g/PEDBUgZYjwd90L0u/A+1wgfa37/Ls1t7ADMcUD4QjF9KD/BMwnhbtj/KfOQRewbKTSoFgDnrsszAvNfpuB+cbsUxOE4yC0gGOYEl40uoFADNVKxXM32REz8KByYASaKYhIZKAGAqS4zNc52ejZx5R+1ZeAD6TWRQDYCa3XXO/MnrUDuJ9TLx+/mYz5/8+hQB4FRnFZB3Da7jbdYkUAHQTgHg794Uw9aNwnIA5QGceNYrl94yjHsUewMNgJ71ySqgKgDIwVEvnDHOymvUwP79NeR2VbbdTpLAxsrMVgFpANw/ts2E1D6nEgDwTJDKegM2ZsbreGZSjI5m/Gj7alJwku3CKo20qpD3o3qAfg49m2BjyePD3TVe5fBWSlcPtQepTCUwnGzLzWGOl3XZlaKu/p8DwJWyHB4gr+eYy8GI/i7qlzsEdJxLywGgkq0Cyh4nUQmEyguAWcixP/van4IvOsaZtcyo6VsBZdR6TR9/P4hq/PAUc+4B7KKObTT7QxAZmJZMGMiyAGAVg6hvJnj2cSrm5EkcoTkFwF7Smf3+8ea541QEolIuBrI0SeBhqvQZTr6k/iMmGNdFONkz+s9TfajEHkD3qWBkFo/MPlSCHMCM+XaRx+4Pvi8jBygTAOeyfKvPqwLjY43+d2oMJApBEACAAAAEACAAAAEACABAAAACABAAgAAABAAgAAABAAgAQAAAAgAQAIAAAAQAIAAAAQAIAEAAAAIAEACALlO/AVzm8hvyIMv6AAAAAElFTkSuQmCC",trader_llama_decor:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAADIUlEQVR4nO3ZP0gbYRjH8W8kQ+EkkQ4KdnBRMWARVCzpJIiDFKQUHLq09s/UBgpOhXYpVNoppTS71qmbkCIOomQytI2FgBCpdbCgUKcmeOAgvB3iJTFU612iJvr7TPfm8r7vkee9J8+9ByIiIiIiIiIiIiIiIiJyMfnOY9JUNGTW0jZdPRZraRuA0QfXAAgMJqtyTblE2ADEp7YACnN19Vh09jbx4/sfOnubjh3D+U61rqkW+Y860R6+Z640BgBoae0A4Pf2OgB7uzl+Jmc8/yhPl+9iZ3cYmI3R5ofN/fznb7dHySUwlf7guUTY3Jzs43lrnKXZX7T5YWkWvt6IYNnNNKaD7NpZGtPBY8cpfidZyeXUtCMXQGmAV09hYivYzNcbEZ6MLDL3OgPA9MgigcFMxXdbYDDpS0X/mLU0tPnh1ssQ4/NDWMFm4CCw1vHBB2i08gvlIms4z8mtYDPj80NAPkX3T1QefEf/RMbX1WMBHAo+nDywJ10o9exc/gJKPW+Ns7ECnb1N5BLhitO/w6kB5g7m+GA/LpxTBig6t78Ax9vtUcaIEZ/aOpUawJmjNN5OYP+3CC5DBmgAGLr/3jgflB7/j9d+paZHFg8dVyMDBAaTvvJxSykDFPkhn9q7hyPGOT4pr/1Kjc8PMUbmVGqAVDRkNj47NUDxnDJAUQPA6kLMt7ebY283x+pC7MRB8NrPYWd3WH6xAhRrALdjHCWXCBvnOX/5xQp2dqdwThmgqPAUsD45w6exb64H8NrPzu4w8CXGuztJNvfzGzY3J/uqsgicGiA+tcXmPry7k2TgS6ywCPQUUFS4a7uHI6altYPFj89c3cle+v1rJxCq+yjozFE6tnYCj5GKhoxZwvXd57Wf1JhXVzEPA+4D6bWf1BizhElFQ64D6bWf1IbCRtCj29Dmz7gewGs/EakBvvbwvTNN39V6hyCnoHs4YpydPS9tqXPlBZ3bttSfQ28Dr7+JHLz6feapLXWufFPHbVvqXPmmjtu21DnVAJfPoRqgfFPHbVtERERERERERERERERERERERERERERERERERM7CXxvg3VtX6I8jAAAAAElFTkSuQmCC"}},Sl.magma_cube={name:"Magma Cube",aliases:"lave slime",behavior:Ao(),entity:po(),model:go(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAA3lBMVEUAAAAGAAAGAAAIAAAGAAAHAAAXAAANAAAEAAANAAALAAASAAAhAAABAAAYAAAJAAAbAAAYAAAhBQAHAAAgAAALAAAXAAAIAAAdAAAgAAAtAAAnAAATAAAkAAAPAAAbAAAZAAAcBgArCgCiMAIRAAAmCQAiAADIvFq+kjwoAAAZBgAqAAAsBgAmBQDCoUhyIQGIZCkWBQBNLRNXEwEiBACkk0bBnUSrUBUkGgwhDwQfBwCiMQKVKwKQKgK5fzGcci9/ViGuXR6tWhxWNxqiMQM7DQAYBgBtSR5MEwFLEwFLJMTmAAAAFXRSTlMASD5COza2xjK/u7G8Af7KwbzDsMZtg3lnAAAGkUlEQVRo3s3a55LTMBSG4WVZei9W5FiWtGAM2bD03nu5/xviy3F8PjuFgbGy2fdHRiwwfpBsRZ5hJ0mXTly5cuLSznEJnAwdG1LDaUg72+/EGWOqTKqMObNl0iVwpEo4CKQtLtyJm9E0xRDa4dZmCZzxeFzGGcfWZVlbDJvl2wbpEjhNpXAQSOA0HfnCnbx+fzxvUrLaCEdIJ3c2Hzm30H1ytkciR0hTSkhyR0MiZzwWjUxRK5roXNVW9yVvy6sbI5EjCUeaCkeaCEeqhIM2Szp5ddwmnDmJo1o3I+dqaDZLOnnOmFA0HM5Qp0I3I+cxQ1FIFsNzmyDtgoNAAgcpiRwkJHCQkMBBIO1uhoNiPgVoWaQPXB2qbJ53OoxXd1Nyznc4smTksEnDMahqODqME/z+xd3EHNRwhEQOmwhHqoQjeQMOSkTauzhunx1bl5MVirKYM6dFmUezmMt8rn/44t5wDgJJOEhJykEgCQcpSTkoHQmcpqlwpKJ7I2t1rcO4yBFSQdIAUF42q4GLRJ0h5WAyQt5MC67smqGdbdItRzN1+zentR0CykGacZCQ+hwEknAQSDOO5Bc50mTGscNAyDh9dMK0vXWiM21ikCrrdbjkQTNNAlCVeV44TIWToYbkOxxcM8iv/fKKyRYV04D6e64VjuT6HCQkz7kjKQ/GJAOhKvr2yrwOQa6cFno0KoKRYj3VNRxVJgXIWQXluZAq/adzycBp9kXhIJCEM0ZCGo0ICn4ACNeyLQh17mTPoRGOkPgQFsKRAjgKCn40GgQCySsoL+o49+ibqiXiPr9wOZzmhiADzkAQMoagAiThCHKRg+DgUDiGIHBSgCK2IgWhzmZTj7ue5cAhCJxUIBQIqvPo9UGf/IX0zAaCcGMnBdVFSRCmzIMjLZHIsQSh1CBISoJy63J++3dJ5KwBZVUqEDokSL5LySFpziEo9jnODQV9LxV0584hQSDVhDDhKCjY0OcMBz1897RUEEgKQoYvrRM9lliCwuyjy0kCun373dOiBUFUEiQkcKRJs+80IBbISQaakaYKwu1NEEh5OS+3Bi2ByEkIElILQnnWyeXCqUZuDQgc5tOAhKQgiEyfBM6IoGgCQX3OaJQKhNwBQXmfBI6CojEERdfnDAd9evm2BeEkcqAgVK0EmVlhNScF6NG9Dy1JAIEg4/wCCJBA0CInFegeSN8UBBJBuE4XBAZBi5x0IPTgwee3ApJ8KBXkKgX5YAnqcUxMAwpeQXfvPvj8jffM/tN6EeSNIajqc0JIA5qd7BUE0mMFvbn9HqQOCByCsAVUPU46EEif5iD0+rFX0G2QIkGGIHAIMgf7ISkIPfmooIMDkFoQSL/MEii4EUHg7Csocy4JSEgtCHmCQPpteqAQjYKEo6DMGZMMBNJzBVUECek7QTEaoyDhKMigRCCSuqC3KnrYgmKIvKoDhyBrYxKQi30SQa8efBESQTGELgieNnCSgVyfZPcVhE3gSxcUwjqQtSlBKO+TFATSy7+AlENQTAQqyh7JzUHoxYeXi6C4/5ggcAiKwZpEoKJPil5Bs6/dLigCQVBcOO8nA6mIpBaEPnkFAUEQposgzFUKkF8AsTvPFfQoGr8MMkhB+ClBw87UnqB+k6/PFRRBWgsSDkHemEEgkDoguvBDkFoQ+jcQOANBKJYEYaAg9OTjMuhHth4UTBJQnpcE0YbqHKQuSDgKimFDIFRTARJB+EL5SdBl4UjK2RSoqAkCqVZQHr1pQMaPmBGOgmxykFy+YIcEZRlIwmEZPVY46UEL4Q2WIJD6HO8JwigtyK0BgURQ1ucARANBMQUImdUgiEqCmCcIHIJCNIlAIHVAh4cKkiduDYhLRE4qEHIlQZgZBaHwTyBwEoBuKKjC7kgQSATZ/wNdvrAzoLM3CGpJjSV/9jeQM6tB4Jwd4iEJINQF5SCtBoFjCIqBIHKGkVaDkF0F6r5VC0eK5KQgrQH5LC6CMl91QIFbEDkpOnWBIJAUBElUkHA8QaF7pr5waidtZy8QBJKCkHzOPQSF7pkas5O+U6cJKkpDkHN+CTT7UNBpzk5qkoJq7N4EgdQDVTwxbohDEkEgEeQ6oCobEbRRDkkAiahaAiGeqcNGOSQpKOa2+gto4xySWpC86xPkCSLnSNq71jlMlqEBZb4DOr+3c7Ttne+cbkECp+2oOSQpCCTPtsDRhVNQQc9WOCS1oGPBmbV7rQvCf8LdfrvXCnRsOC3pGHGEdDUV5w+jhKZIQATeKwAAAABJRU5ErkJggg==",textures:{default:"data:image/png;base64,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"},animations:fo()},Sl.mooshroom={name:"Mooshroom",aliases:"mushroom cow",behavior:bo(),entity:yo(),model:Bo(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Co()},Sl.mule={name:"Mule",rideable:!0,behavior:Eo(),entity:xo(),model:Nt(),animations:ji(),thumbnail:"data:image/png;base64,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",textures:{mule:"data:image/png;base64,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",markings_none:Gi,armor_none:Oi}},Sl.npc={name:"NPC",behavior:So(),entity:Mo(),model:Ro(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Go()},Sl.ocelot={name:"Ocelot",aliases:"cat",behavior:Jo(),entity:Fo(),model:Ho(),thumbnail:"data:image/png;base64,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",animations:Ko(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALqSURBVGje7ZmrTsRAGIX7JngkrwF2PQkCidl3wPEACB6ABEUQWCwKTQgCg2RX4EjJafIlh5/ptEsvNLudZNLLzuU/579OtygSrXxZluqvN0fl6vak/HhcVp339GKDxhp0rc062qNpvo9tM75TcyHvzg9/gHcyuhCg+Z9v19VVe0yKAG30fLWoNrpY7P/S/F8tQIDVIQDryhGgceuny15k2EhYAYdtBI5u0IUAgXYS6uYhBwpBKYNaAmbqGurTAnArrjkg7iqDWIBrFabVXUjexVjgMaEpLgBeXSbtwTVnAXXAeyPg/f64EgagFZDyq9w7O6juddWzj9G9NtfcKJDmaIx+k6kqkKo7Aep6pzF0zdE7LEL3IkprOFGsSZDuTADadRAx6PgzAJ2IaBUSUiAhIkWA3otQXbE07eMgITyS7PL0YgFoksCSMrUYEJmXSm+4j2tZQnsQxEIAzFyAo2WXIWaknOu0bhQ7Md+nOpoCFEJGAlxrgI1ZQO8IbnE8saiuAPP401vkZ9O273NBCx8WQGkN7XN1AtA2GoYAtwr/zUmZJAEeB/BXhI4EeLzAdRjvKTLXOwPHLD0Fxnsf07SeBEezHrTcBbwaJKBhBRF0MZXWthZH8x7EBNKDIAT4eYNxZICmCnGyBKBBSMD3UwRAFv7tVqeuOaOBcz9HqFgptjkP4MteM7j/exyI6c+rUWLAKOBjrc0z/ulCxnK4jgDWEMiYBimSqPZivYELoIRBm2sFYXiO3wC8Vqir/b0YYhzExVJYJLCPr89vgx13c+dtbaxnXfHR1AeRJgKYS9kb3cCLKI8DHJSYPzgB5F5dPXenDjipyq8uWKLR1cNpkoBYSnuZ7ZXpaC4AaHeJCsCGhQjBzQseJ4CawE+CXgABfrQs4IDxuy6nLXzaD0JYjmcAfidIciz3Y/S/ZAGCVEyNW9siaLHvvdiVNupX1ym2mN52hgDqbw4i1AA74f+pf2zafKmd29zmNrdtad+BhmvVyshO1wAAAABJRU5ErkJggg=="}},Sl.panda={name:"Panda",behavior:To(),entity:Wo(),model:Zo(),thumbnail:"data:image/png;base64,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",animations:$o(),textures:{default:"data:image/png;base64,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",aggressive:"data:image/png;base64,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",brown:"data:image/png;base64,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",lazy:"data:image/png;base64,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",playful:"data:image/png;base64,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",sneezy:"data:image/png;base64,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",worried:"data:image/png;base64,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"}},Sl.parrot={name:"Parrot",aliases:"bird",behavior:tr(),entity:ir(),model:rr(),thumbnail:"data:image/png;base64,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",animations:mr(),textures:{blue:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJTSURBVFjD7VbJTgJBEB01RhGG4QcUQXAJbif/xSOf4UcoakyMRxU/wC1RTxoPuMXEs4p4cbkIiYmJUdP2q6GwwWZYDEw0dlLp6h5m3ptX1W8wRJ3D13tF4Q+nhRm6rvcxwqj3RqvvhghgRmhJ9h8Lc+BE+AdPhSeYEJ09M6Krd9aZAN4I8XpxKHJHe44KMAlE6fD2bVJYQ2eF3Ixu09oTWi9PAHIGIhnxcr4vsqldRwXw23IKALArvEEzAJHzGvM3AniYYRiFmnLOa7XmnKuhqoGA3CQ5gKXsKIEvPG+rEZrTE/h4aKN4v2+lIDBZR53ElQYAAdzRPV0ggBmkkH8jwG/KAVDMTKJRo+ZTYFkWRaW9HxEorSerwkAqoG4PIzCeK5K6JgIMyE3IJKLRaFE4EfCPPsmaJ+sjoAIjvMFLWtfqlN7QWvUE1KPGOUqhElGbU1u6saywRjLUtPQS0gGxRjmgiCOBwOitDTicD5yKWJoegH1cxz4RiOnVwHVYLzufL7Jlk5H7IOFIgEyGgdFweWB1n3Mn74fxAJhdj/JIquw9XyWQzAlAysY5f0ioKWXO++V8ge0WzYf6I5iMar96AvJDATD2apaSZSzd1xKQwJ7gapHjdfas5PeSzgRYOgYqlbEgZ/6aa07ouhUX3SxHcmnBHQKGMqoh8WaaNB/sTIjJ+KJs7HSTCdy12Mlju4gnl4Qx9dzcHoBLqkZln5jEFwGcWbwNHMvQjIY3Ic4ugGA0rhAACAwDM+RyhQCTwOfXRQIJ+UdyufkEfqUT/hP4EwQ+AbsOJLrS9GU1AAAAAElFTkSuQmCC",green:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAICSURBVFjD7ZVNTsMwEIVHcICeokfjdwECNkWwBDWlFRuqqkBBYtPCFSpaDkBI98AZkDiBybM9jhMcV0lVRUWMNIrtNH6fx/YriZLReiWZF1GcIZWdRpT+sjNTAHgiXXE+JhE8x4ATElsBiY0mie0W+QHkiuL8/nqR6asAQyCzcTwime0pmfbpk+o3RuQBiMt5OZsPAHH8Nq8CEGwMlXBDt01/6ADAZESJMNpcDbyz95zbdtrVQKLcSIih7NiC3c66BNhpr7kBWJwTYthHV4nnBQQhvNlMAPAEFNq/AfRKOeVqQzIQy4rCM9dqNZnzxhYCyO4nV4WFbEHXGOL+M13qQgBmK6Lk0KFfr9dT6QMYvJM4vC0LEKVPe6Bhijrl0aAAQOqqhcnVskHsw+mKuw8SPX1o5SImqo/tQEW8AH1tKN1IJSa4elMTYLyv3wEA467Ae1gvO9/Jo4LpaggvACbuWsbDwvY4t33eD+OBMLse2mfj/G/MKMhleSdk2vxHAiC0eTzPF9hucfiw/0iGse3XCYA/CoixV3MpuYzZcVdA+OAm7Xj712os70aQTQ8xFsqWkZ/8rjInrNyKUx/HMX3oVQNAViwCsboARQMuaRsVbgVuiQHAncVq4FjkiKUfQtxdCMFoKgGACAwDT5SrEgCGCMIKAXAw9voVAKykE/4D/AmAHx69d+4Sz6VbAAAAAElFTkSuQmCC",grey:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFzSURBVFjD7ZYxjoMwEEWnTcUpOEHqPdVWewFqaJBoqGki0VHQc4ccIE2KtFs6+Q5jDQY7C1hkE2UkazyO4b+ZMQRSC61pGlXXtVKn/X0sNFp6IcQB4QPAnqqqtE+SRBVFob0foL8hLtIZuuz8ZfZpkAlxCWDH6wGw7wZhWmEZhFiM5zIeAeAHIjIAmHN2DGNKjuz7CtiVYI9yY0CM5zKeBPj93hkAzAfCMw29ln2343ELRDZy7ipxKJv9FERRpMejtVUAdi/TNNWehaTg1BpM9nk2AMRxA3gWh4/jeDB8AFmWqbIsw1ZgySH8M4DMFOJt244qINddoshcPnYy9gLkea5F4GUFXOsuQ9khyuNRG0geGojAI0uIwLvWXdZ13aACiDdrAWcrX7287qpE0BbgDNhCiH0HMngLNvse+BcAt39MOh4OzwEgYWsgXhcg/Bm4fwWRuvwMsmN7fwAt4oHYBIAhng/QV2LbM/CKb8IPwFsAXAH4QC8i0nscswAAAABJRU5ErkJggg==",red_blue:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKKSURBVFjD7ZfNbtNAEMfXcZ2kDVWeIi/TZ+DCEyAOVHwdkODCCYkLqnpFQuIAQpwQF0AgPg6IZ4CQxHbsJk2bFAId9j+eQW5qG5JCLBArjdbrrD2/nY+/FUMLjp4xFFiLrO04zqKvIbPog3A6dF3aXVlhmKwRCuCgUiGzsUvuaeK5ECC2D+zXanTw/jkN3zzJBWjbfX3ZG2UA7FWrDBdIpPoSKYXKBRh5Hm8Yv3tKO68e5wLghTh5VxzMjmnHoa/dSvJbv0Y0aNCXT8nebz33OADCaXCih1s0enCbrzvWAIQQaq5xjTmQ0B6srfE+rD83Gjzj9OZsQJXLY6LAI3Nxj8z5AblXJgxhzvWzASaPtim+d4vCuzcZBCHESWMzf6kg35zzC6Mf17zeHPJ8DKAnJ5ysrrJTAH2U+SRV/tu7oNlssv3s3okAepLfWOoAa9+aOko7zLqnLZgO9dwAKLpQTNetVuuIFQHgALWr08UAAmkv5F4rHwU5z8D+xvU5ItCRgvOlpeA4FgHRaGhL5nWF/oZ92qaRrNGahQC6CRCYg1QHqOaj5z8UtKVGCyJEw1MsOL7UDxSzEAAPtsUJXtRO5R5rPxUJgOWFHcJDYZUFBwoIGC3qQoCuUOL0sZwyTKmfgkQFABTVE6Wzyudc2mflO/QTqLT8ZgLEM3nX0CE143qd76nlFSSqHk7Tyoc1S3FKfjMB9MsFh/pBUkVEBDDDECX8XpoSli7FRx624/6NzXIATGr8CsR0fT2pNcfQ5JpLh6G3ZICOfFF9j87c2bKFOVpuDaAbClPw0lY8ThPIPDv+eBEqAFqsFAA4eSEQ0IRSADBey6e4NIBn1tdb/JFYNsBfqYT/Af4JgO9WgE9hJVHQbAAAAABJRU5ErkJggg==",yellow_blue:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJXSURBVFjD7ZXNbtNAEMeXvkCkSJaSIDkqsh8DEO/Ay1E+LoCqSi2gigoBcT4AkbQC2oScKE1bjlx6oCXHYf6zu8463RiSAlELI412vF77//PM7ljRjFausSdEC53rpN5enfU1pGZ9sPL8G1VeHFN56w2VO6/8a16eaE+GFN2uU2w8F6BU1/7h4LP4xAywaHnztUAAZtzCR/tUZQeAxGsDCh8fcNaGMj8ZgNNaahG939/NBUDa4aWGXn8KgMWqq3t6ZHGISozRBwBSpRS9G3wSccSSPv5CyUqi046ULyQ36VL7WgohmeC12BNYi1FSvpSIqI2jOy0BiJwyjDLQV7R9uCfiO18GEmPOCk9rEInuNqXm0b1WZoxv1TwAPQ67SkRlNNcCwF/3p2zqU1AoFMR/NncmgFLTbMYxt0KuoG8OVuxSptbTAZijiB3uliSO44znAmwTLT7ozViCvrMXXJ/CkLHFhx9/HcAeNXcDWpC0DPXRmO2KQ/HiDlGwSfrocvYqte9yjXIgI7kAwZauPbWV9r5KY8zjftDRAEHbD4D7tvOFpvEABvOAyM9AQiPhngPRNRANI94xoB4AiI13PMSXuY+MP+PthCL2jH3DCG+Y655KfyzSF1jIB1A1/R+bD/WHWxi3/3sBwieHInayrOh4WYsjHq5w/FSd+rn4AET4fpdbbkN3PvYrfI25SSciBcDLIWYBEGO0EKGbWh7n1gnn3oozD7M111fnA6AcOwvE+QX47XsAxwhfExzdyHydtYsPAJE8iL8CYCGKX5f+QYBz2Qn/A1wIgB9cCuJWPKWjMQAAAABJRU5ErkJggg=="}},Sl.phantom={name:"Phantom",behavior:lr(),entity:cr(),model:pr(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAC8VBMVEUAAAADAwMBAQIJCQoFBQgDAwUcGx4OERIKCg4XFhgUGCY+OTE6NzAMEBgKCw6Kg3IWHiogJ0IPERhqYFMrNF11b2ElMEUdIC8kLE4YHikRExsVGiovOmYjMUUoMVZiVEsjKksPEhtKTm09Sn0tN2ATFyIfJkMlLEs6NS4xPGobIC43QnF5cGIuN14gJkAcIjpDPzcbHSwpOEwwO2hhWk5HN0YyPWdMRj5RSkFWRkFfWE0/OjJNV4OWiXhiTF8hKkBHQDg0P2w6R3hhW1R2bmAnJSSTd2eDZmAUFyiDemkjL0UkKTpvaVoZIDFYUEYgKjtBM0BhVEhAN0AVHSdxXE49Sn5JWJUyPWxAToMpOE6clIGxqJJuZFcZHCyIf26ajXsbJjQ2QW6HfGwlK0MzPm00P287SHs5Rng4RHZIVpJBT4dGVI87R3k/TIE+S39HVpE2QnMwPGd3cGEsNmA1QXGFZ2FkXFFJQjpEUowrOlQuO14qOVBDUYp+dWaon4oxPWJEkznIxa+wp5ExPWogKDVXXHmOg3I3Qm9ZVEmkm4cmMkchJjuupZCfmpAlLkwkMUUbJDJma4ZBTX+WinpESm41QmuafWoeJzmfloKckH5XWnBcW2RtV2IsO1mShndAXHBbV1xHSlEbIC9pcZKknZCpoY9ucYV3dHphYGBpYl90aVxxZVlpYFYnMFAjLEDBvalbY4pWXYBzcHlEUXd5dHBlT2IwPlBEk0KMi49WYI5pa39FUX96dnd/eHCDemw+RGZ0bF9MO0o+O0k5NUBJPDYlKzVQXZKWk5BiaIx0dodcYoKNhH1AS3mIf3hgYXKFfXB4bmlUU2ErNVteVlAhKEZTSkE1MjO1rpiakoB8d3Zsa26ZfGo5VGNUVFSAg5RcZpSbl49YYYuAfIOIgoBcX3Y7RGtPVFxBelBCgUotMkNDQ0G7tJ6lo5qYk4t9eX1iYm11aGlBaGY3QVIhNzasraaWkYaVd2iUd2dnWGVGTF81OEn0jVHcAAAAVXRSTlMABwMZEgxALiE4X5JmVzLi0YtK9du/2Xm5lH5u7ubLuq1R/vTlsKKHcfvu5+e3k4NtZvj39vDR0LKmloX8+Pf39/X04N+S/vz39fDu6eXNyLqrqsC7mz4+6AAACyNJREFUaN7t2mdUU2cYB/AwRe1yVNSqddUOV62t2tbWWrv3ColAEhKySUIICAQTokJEQUEUVARRsC5UVMS9FVFRUaBaV62zjtrW7vGp/+e9SUSqRSEIH/ifU7xyejg/3ue57/vcG3nNaU5zmtOc5rglnq0+5zWheLbqMOtDXpOJZ6v2AkFCV14TCeMIIt/rzGsScXG8eU0hHuCQp5M3LtvyGjscR47/ugwchMtuLXmNGQ8yCBQqvi5KYFTy1fL2gzx4jRfPB0ZlCARGrdbA56KMatOIbeTxwBtisbhcGxAQoNEzjpEK58trnHCcE6sCkFg9x0G6t6CV493voHdGmbaJi+36WAKFCR2cKGV/X57XgN73v3CjgoODC4o3Y2EsTKQmjo56SdltMC0Utba3fw/e/YrJtMOKip0crgEnXEkcdRh6SctkHVsSZ2AXbAJ+vPsSgKwysXjiDMn5jeFa1EuOe14YptHycedznJfbLa/IxKW74tX6owf+Z0f5ACCZOFeCLEbhVAo1n6+PRS/x+z/EcVDTYexy4JAenm7g0A8c6sO7U3ye+kCGOEgZtDnqWTMNcnHm+9Plk6+jzwa4hRN9NMaLh9yR1O8mqSgDK2Rgd1x/35ffFctM87ejgXo8ib6KHeJL/ztbJR8eu7xHzkuv5FqJE0Og2kmBWZKs+AkbhvOF4QEsq7aIT3JrRh1vUQ8e4OXj33fIg54PdX+6j5+Pf9cOD94Dye+lV/Abi6tikNewm9ROCgwMjJ8QFDRhw7cBjuz7sSeOW7UWnjB9FC5H9kXddL2BTIjrOhqpjeTVqbNPdc6y6EngvOlVu9/jqX6ByOxqpNILVEMjCAZqcr5SySdOFOOMJU5tJK83R4SGvu/vA86UoIWzwYmOnkScu4rPsw/XIJXuP1AuFUTphGEomN6iwUZekzN2boKgPUh36uCqf3ZVBbf7NB4/MmtHNPJ8a3DuNh41SKVnvtyUJFCjxR0JJxACkNkWMZc4+FvE3A6tPG9TrOfylgezLM/75+Tx6py6kYL2TsGXDUIXB3VDmEiRRIPc3Di6NJqxUjVJfp2ew3e/sy4j0K7Q0NDCKhenziRk6mq2CVA0jKOWk0FHVzbUzRyhwmVmXIRA0B6kGpzDEskMK61S1dV80aQanLoWbrXBonEtkItDMhTOnMnnolJg1hwCEuO0brc8b2z270HxgblL1q3LWx599JhI1MmrPhOSizRl8vmNAVw0FiWViwZcgzZWRQMmjU/aMJx7B7Oz12ClOrTywOrkRQcHb5uM9Y0/uQ4LlXw1JgYgOn3qT5qchTv/R5Acs6SaRHJ+OM1yWjbRaWjt1gQj2b9QL/VBscYumQ3Owq2MMytkD0D5iQDVn4RkzZgoFi/eWHOFAm6GJoM12UT65pc4uueod2bHT1yGuwucEALtTiSQe0jwICCdW7xtjpSGSR2fGy9XL126mjhIpnndN0TCwff3kgKxJDd7HQoXfXRPCIF27uRA7iFNlMmsEG05twVfGSmjaB/noVnTbkBLR5hxw9kqINpxpAD7TgXtnMnXYmIAmiZKBOgZOkHcQwLIZDpyjs5ajlSEtrqwgGplP4JvFNsVWDabDV8u3diGb1jny1G4sbNCjgE0TSQC6IXO3u58JgFoSaROw0jFdv70TTMmTwk6uwDFmn5xK2bNQ3MUKrrz5xySzJgoM1HhbFiywmMxJfki5Bl/bzc/RO4AKDJBr3Hu1pv3L6SNvAyKpPJczCxT0w2G9KnxWZLc8ksVXHuPNmfqdh3LB6cBXly8mpMdGRkhTfoPyY46JW36EpfXr+MLTj6qHtfe2Jf4SaGsd9wPWpuz1hYhlTpJehfpBzuKNX3R1yvHj1/59aLpjv7m7rjsg2iu3o9hnm8I0Jgxf2VIOVK4ljs6kooWAvLbAhQr6Pvx478PQuF0CoHNbM7Ezh2MrVunwKDStQFIvp8AxEgUhdJ5xh48g5XB0qBYixahcPEH5sgxYJJXGMbYSXOxH/RuCNLjJHrrBkhytFMCcVRUuOvjibQXxcLNJ5HgjmOccBqeDGzLpP2goUh/zDx1IwOgFSkrBMShYlG1xqNwKJb84iFs61vtjKOxkMc1z3VtENIfM2fOPFVRCVBKmk1HHCrW5jMrUbYfLsoVKsPFrWJrAQ4U7kWKce7YOOe8C5L777eWX8wswPSXmpqSUpiWvDSeOCgW/+AidselY020ZThQOJFFasbBH8c8HInn9rTtEMpSCFBaSYxpE3FUCmxGjHQ2nYpltxNHo2YHCrotAS7IRockup3zMWGSk5kJoJKS5DgdOKzBp++n/XHqgpsTuFKuJi2eBWihEgSVI9zNGe0MI109WlKSlpa2IoI4CJEwYB7YB4uQHi0dXW0zEwfqyBFu5XTD5GXOVGLyYaSrS3Il1qNpaYUpKZX0/KgVEmkR3flFfC6um8xGHIUt/x03elrIBY4dT6eIM49eB45EsjUvlECpkXJ9OJaFkTad6EkVpI3TyDi4cDwYqFLdCZJKwXEM1ZnfTeQ4FAJFSg0QEclefPinSwJX6JdQGokDz4p33AvSCR1vjCvwpGUt/tvZS4UAyaVJjFS6GAMaSLRIRsZBhLFa+k0qP3yQ17K/v4+bQKcBEhKJBnoandGrTlJqpVwqdZA2MpJdyXdGGEanCJ8q170//t7Xzz2gcVfmAeQgHaTf3sjaO41Es+b3lFYjbVlF+7QFDi1x6H7DwqotKGqvNl40hboDNO4WkpIVw5bMOCLRslNHGClCHYaHkxMAVQ90tFDwPEmcFt27+Hu7AYRA5CQh6jiUjDgA4ZAjUkRk5E8y1KwmKYzOW41+oAd+0md4Rfh0G8/6guZd5kAuki6KtuDCEBGl6hREf+ZkALTEZBUTCfsjDBq2QELqJT3Nj/7DaLod4Ff/kgmFIAHkjApdmrCCnroo03YvOzXzzzFjcrYDZJLJ6L33hX00gWg1FjVuOW6i2z4fnHatwXEHSCc9vaYaSCqv/OorFyjx/RafvjUGyVnKQHglkDX5bDqfX7b3fIZAWn4Io2TGSWuBg+PXp74v4n3a9NJJpXyHZt48gKSpAE3LZ6A9u18A+sW3SZSzAyA8gk+h438vvXQou0BvLOyHxeJ3HZyn0Uat6vvKu81IF+jncVdOMxDHyZ+2aydAHCln7drdywgUiKdJZMKZ0oCA9PNoqdKiF5/6qLUXOM4Pv3y4X7bupNddoHHrr5xOnRXCeRITGYgjASQS7e4XyJFunUiGlwcv7Unzk1HZ9zEfrwGDO/ri1O4y0LvupF4u0Pr1vzobCKBPnC2B23qt6JG2PN9Hb0tij1Baix47WZfB9CalLw7gLo+xCblPW0+ed+c6kZSnL98CeoJxXKS27I+aJGg0tBOwRwAL9ykhO3S7U818O+Lv3To9E1KnVVJKpfMur//V0dFP3P7NT00SLY42HJu2PhbDJHHYgWeUCzr6Mk7ECrzduncQ+1xIKlUK1yTW4NRGSjegfYxKmkdcHMcjp4ODPFIHEEhtRiqFwhQX5y5Jv8+R06hGQ7hKCIvBQl9V1TncZwJ1WqVeAHGcuyTFZ9FzrYoIulh6MxnLngSiiJNaTw5HeqIF/XlXpONEypIgB8oMWnS1IxY144Q4Ofct3CodxwkHUjotD6lWFaGGjcGhtATpuEzGkcroAWk1vbE8MrpxOBwJICKxFxL2YnCseYkch9c4afm4jAWSggKreFvwNcapw0fd7iaxD62iJ0261sgcF8lq2gEOQI/04DV+QLKaTOQZ2hQ4jDSMQENxuDeZPDRsaOP/m7vmNKc5zWlO3fIvbc6KDv3JadgAAAAASUVORK5CYII=",textures:{default:"data:image/png;base64,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"},animations:gr()},Sl.pig={name:"Pig",rideable:!0,behavior:fr(),entity:br(),model:yr(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALeSURBVGje7Zi/TsQwDMYLDwcTEjMbG2JlYkYMiAlYmJjgNW7kSdCNSMwMpY7O5YvzOX/u6J2gVLKaJmka/2I7TruucC3vbvuPp8cg7y/P0V3aXk9PstL99osprneR2QFQmT0ArZsNACb/FjBXC0Aos3WBPxMEl9dXYT+3+701e1Zm/VXCmDC2J8l8Li/6asmNL21DnyYADAQqxWBQxXESUwNg39D6KgAyEL48PL+dnY8gPChYL/fwDhmrtEr9w32HshaAQRbHR0Gwrh4ATnJ4Ft9VCPvdXi9XRHYoyyVtqry8EwFYTaAVQPiuvusoPcIG5bV8c3gQAbDjo8QmZwBgnTXtxNzJO7Vm6gJgEFb10gchhG8T5aVPEcC42jp5C6QUaKzC4EYjFDRLY6IUQOGdCIC6rOnTBCCCYBUuBRpsgwniVoiTxclJm51UsiAkPrFxFYpC98Z3AeCgiR9mVgP90irujY11DACFQMCW4FYBYIkP+nfwq2FQvbOBPheLeCs0Zop9ky1zTcUYKBybCdu6KQA0uxIA9uGwSzjUWV8WN5if6zOzkJzSuWw2C0DKNQC0bYzEGQCYR1hLsEHOE+xbUt47x+h7rguoFAEME0lWlWxv6wCwcSMHgIHIpfHSX+6dTVjcXF7Lpi4XZDwAuALjeI4F2ABaCwBXXZXF8jcAiOQ5//TygVYA1gRzACTDUwBSngYArDyusDXpJMdfTWJKAD9hAdrmAzBKs8QncQuwiCldwM1RGmKAB0Dbu9I2Qo+5G7hAC4BaF9CFaQEwboM23ZVor9E/WnWwCt3q5L4OAFyxxKpaXQCCs7cLZAHYq1WhTQDg6nl5vesC9q9QJQAbH7YOIAmszklPzR5dwEJIjs5OHLB+n02FtwEg8nlyhC1ZQGQF5FTK4lc1gMl/wrLjNFE+lwnWQGDbIgOzGwDkj09JSQ+O+5MUynRHW7Xv5je8UbzmB4p3JHYDY+Vf4y9tRXXRGVGwpwAAAABJRU5ErkJggg==",saddle:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAM9SURBVGje7ZivjhRBEMYHNC+APM8LoEkAAwGBIRhCQggGgUKdICRcTgEGDAqC5QlW8hBocpLkNGKYavYbvq7+qrtnYdnAMkllevrfdP26qrpmhqFxnbw4Hk/fvk7y9f277G5tn+7ersrwt19KcdxN9g4AZO8BoG5vACj5bwH7agEMZW9d4J8JgifPnqbz3J/33uxVWfWHpDlp7kiK9Tx5PHZLbX5rm/osAqBAsFIKhlScF7FtAOodqO8CYBPx4On5y4OHM4gICtfbPY0Rc7V2aXz1cmDZCMAkqxvXknBdPwBe5PRsvgsIZ4czo10Z2alsl7VBeRuTAVgvYCmA9F6MDZSeYZPyKB9duZwB8POz5CbnAHCdN+3C3MWYXjMNASgI63rrwxDSu4Xy1qcJYN5tLN4DaQUarzC50QyFzdKZqATQGJMBgMu6PosAZBC8wq1Aw220QD4KebG8OGvziyo2RMQnNS+gAHo0fwiAJy38sLIb7Jde8WhurlMAJAQBtgW3C4BKfNi/k19Nk+KuJvq2WuVHoTNT7lscmRsqpkDx3ErU0S0BsNm1AKgXp1MioK76qrih/BzPykJqStey2SoAK/cAQNsciSsAOI/wluCDXCTct6V89B2DcaELQJoApoUUuyqOt00A+LhRA6BA2LtuHpwbDy+ez8TqrL+1Dz5hCXN5lF1dLchEAHgH5vkCC/ABtBeAvcOU/Xz/QpLT4ztJ8GxtPwBQJK/5Z5QPLAWAF/cAsAwPAKzcCwC7DEWtzAIwVh5453mHvUkXOf56EUsB2Eu3bQGs6IfrB/OuQ6wOYAavtEp8Crcgi/hdAA4f3Rs/vnlexACZo0x9rK+NqQFQyjOEnwA6ztAoHd7EBXxgSkFpUiop1OkC6Kvmwr0fAO26RXtE/2zXySpw1Nl9EwC8Y5jfFLp19VK3C1jfBIGCs48BXQD8tVShXwHAp0mU10cuUPwVEgC6YsCfBlAE1uBLD2bPLuAhFJ/OLg5AeZ8H7NQCisRHfMK2LCCzAvFVqiBwHgDlZSa49Z+w6nNaKF/LBHsgAITPASDYiN0AEH98WkpGcMKfpFSWJ9q6fTe/4Z3iPT9Qok/iMDB2/jX+Dtu94fBCEpxnAAAAAElFTkSuQmCC"},animations:Br()},Sl.piglin={name:"Piglin",behavior:Cr(),entity:Er(),model:xr(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Sr()},Sl.polar_bear={name:"Polar Bear",behavior:Mr(),entity:Rr(),model:Gr(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAO7SURBVHja7Zy9btwwDMfvMTL2fYO8SedufYSOzZghQ8eMt7ZQABaMwC/JlM+S/gSEy11sny3+RFEkdbebIff7/a/Wfr/++mx/3t++vJYWvd4tSaz7tO492m67itWJReFc6QRBadq1fv74/tmyIQAADwJA6iwPgOeXZwCwowUYKR8fb2Hll2MBQAIApSMlAMrnGQrlSqWpAwBcEADuBI4EoEwd0eOtewYAiQBwCEj5GQC0Cv/uyP0CgAMO1NE24hn49GO1HuUDgEkA8CDoVf7yAFhms8y91Al8+VSv5SVTq7WRANSrEWmlAgAaPeinb0//59byWt5HfIMMACJ+Rx2F9FrttEb8h0dat1MA8B6elmHWyI8o/ygA2iokOtLr4zOUPj0A3ggoHVdGPTWaDrzRqXV+pn/SAsFo5U8LgOY88dHPAeBWoMfRynZQpSnBA2CE8qcFYPYVSsQKnDH6AQAAAAAAAHIqAHACAQAAuFLQyIsNtJ4Tzey1xgHK39HvaLnnqZXLl3q8ZeQNjoATyez1RgIj39GSZl5K+ZJpyzSXPKDkBZfqWENt8ilK6SmfHydNCdJ3WSDUxy4PQO9I9gDQQsyRe7cKRSzrxcPbVrURJMkHkBRA/5cAyDapAOCkxFF0HiXFl6b9HwBMljjSHDVvDj3DqZKmIO4TQLtBAFodI+uc2vkb6VQBgASJ1t5J2UHpPDL/2nmjAUDlbwcARwowIxBE9hgCgAcDoIVXeypzCgDaeQDgAZ69F3RpbRIgkj+gFaS0OJuefxJZrWiBoS3X9loRZq/yo5s3egE4WtxZXytzt9NlpXWERSFoVX5G3iAjwycBNXWYNwsAq+AzUoM3GwDbTAE986wHQe/oz1DcqOsAgIsDkFXkwc3/Mrn+nQDIcgLrtj0ALUtCbek3EgCvyMNbZkpFJgBgMgC0qGP9DPyzERtallwFtNTe1RBEa/CONK8qiHY10atXNbRNujg6+o8CELUCvcvA6POhDqABAOl3gHoigfVvCAGAC+cCNOVHii41COpCzB4nrbciF3UAQQCsZV49aqLKt87zKnJbqo4AQOJ0UAdCZl8TIw3c0Vl89AGAzaYDDsBMUbGjdQDbJH+sEUIOG7XyfpYNkb1xBq0YZLtRH/k5mKsDkJEAWj7/L1kAenhpixh1yAwWILMGAA7BxJYsY/8ienQzALbJ/68qvRnH7fL/q4qWcLKii1vm/1cGQNuBJIWcvcQWenQykXIUPP9Pr9pxyBJCIBAIBAKBQCAQCAQCWV3+ARxUr8ias75BAAAAAElFTkSuQmCC"},animations:Jr()},Sl.pillager={name:"Pillager",behavior:Fr(),entity:Hr(),model:Kr(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Tr()},Sl.rabbit={name:"Rabbit",aliases:"bunny",behavior:Wr(),entity:Zr(),model:$r(),thumbnail:"data:image/png;base64,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",animations:tn(),textures:{black:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJfSURBVGje3ZnPTsMwDMb3EpPGbced9wg777rX5ojgCRCCyxD3gisZfftqp86/soJk0qVtZv8SO463GYZhE5GfP/k3bLfbUfTzfr8fDofDjUhfdFxL5P2IeO+fTqfheDxOdFFd5Z48M9oVVUoNf9jtfiGIqDJofAsADDQKQA2PiDybDUC+WCFIK8KKSV8NgKgBKQAyw/y89uFKyAKAxuo1QsC2FoAop5IDAGdXDdVWAPBkhZWyZhoB6KpoAUB9VMWDkIoflrEKpQgAvoR+ie6AbpE7Lvvm5XIZjZCWAVjwWeTdSF92YOKAxwD0umRloZHn83k0XNoc4+fiyGR3K43MDEC3Rr0uiS2RwMffydINgDcgGo5tTn6BKye17zNsSzDi806gsQVBVAPwFMkJep/P78P18bUqcPJKZeM1MKrABGwm9K1lZ/ld5PnUbIl8vXyMxl+f3sbrFgBYXyuA3wBACOyPc0HHygRxW0wZn7tSesgEAPudZVgKVM7s3w0AjqSp2fXg8MyjrGIFMAjLQM/X8XPU8LsBgMFjzIwcxebup3aM0p1mUQC8rXnK/TsAc8ua7+WcyFYHwAtynr97RYlVAbBOd7wD4Fmf+1YPgIscVpLj9VklsZQbYZEjWrqK1gGLAWACxPs4H0DwOS9vmIsjUeNZn64ArGJnTh/emwMQFa/42jURKpVUgbRU+DzRDUCL6m1tVtdqnMUB6DLPLYJYADSNXhUADpp/Pc7iAND3awFggF0VgBa/BbQaZ3EAugPURujekb4rgBaKtxqnCwBOSnLyAT5F5pTKvN8LWgP4BnxBLAwNMNywAAAAAElFTkSuQmCC",brown:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJmSURBVGje1Zm/TsMwEMb7WogJdUGICVhgAyZYERNi6IzY+gjwBjwHI4InQAiWIvbQs3rV1y+2c46dto50SmInru9n359cRyPjcbS/04hcn+450fuH27Nmen+xItI2yjjkfYuE3n96vGmmk/ZclnOd98kzSZNSxe+uDpYQRHQyqHwJAAzUCkAVN8n82WQA8sMKQc4iPDFpywFgVSAG4OV52npe23AnJAFAZfUaIeA5G8AEJAXAok+2uCqqZwFgNaPW4VtpBKC7ogiAhY2qhCDE/IdP2SwA+BLaJZoDmkXquGyblydjp/z58bgFwAefRd61tCU7JnZ4DECv++wsVPL0cNcp7s4Jynf5kWKemQFoaNTrPr7F4vj4N1kGAxAaEBXHc0p+gTsnFvcZtk/QCTr/AXOVe40ExQCEJpIy9u/7dzN7/cxynLxTWXl1giIrSZCuQMgWY3ZneT62WiJ/Hz9O+dnbl7suAYDn63Pg3hQXX7A6HV8miGExpnzqThnkYABsdz7FYqBSVn9rALAnja1uCA6vPEoVO4BB+BQM2TreWxXfGgDoPGT1QhPr6o9FjL6RZq0AOKyl9lcLoGtbc1/KF1l1AEJOLmTvwaJETQB8X3ccAfBbn9uqB8BFDl+SE2rzlcSiZjSxFTpiu7I4AEyAOI7zBwg+F8obuvyIVXmez6AAfMXOlDbs6wRglFDxddBEqK/ECqR9hb8nBgMwZO6w7nE2kj1iUSQHgKbRVQFgp7npcdZ+oO3nAkAHWxWAEv8FlBpnY7WEXA+91Z7eEkJzJ15qnMFCnaUc3VVX5Jq+NbfghKq0fv8ZO+5hVm7/xgAAAABJRU5ErkJggg==",gold:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKMSURBVGje3ZnBTsMwDIb3OFx4Dc48DK/Aa3DhwAUhBCcegh1AmkBcOCChMdDYhmBiQJijuXL/xmmSpmPlYLVN29T+EjuO2zPG9ELk6e7AkIzvD63w9efoxPyMz0pCbaH9uoTeDxG1j/m1Me8XFV1YV7pnn1m2BSvFhs8ejgoIJKyMND4HAAQaDGBleIjQs9EA6MMMgY4kqBi1NQEQbIAHgPm4qjz/PesXQJMASGP5XEKQx6YA7DRdSQwAvreYXhaGFgYvpz0OVrBSrpGWAHhW5ABQ+CiLAsEXP2i0UVdXW1Jgkn4p3UG6RWy/6Jv7u9vWeHsEAC74KPRupW0xqLRFByYMeAiAz1NmljRyb2fLGk7HGOPr4gh+PzkyIwBeGvk8JbaEBD78JkprALQOpeHyGJNfyJnjW/cRtksKQ1fxo2T88vrr5bQEojEATZGYoDe9GZlJ/7FZ4MRkB4yn9vnw2JjX8yIJsgB4BDRf9PldyPO+0SJ5u322xk8GQ3ueAwDqy9c8+jKJKqW48oXQoOPKBOWy6DM+dqa0IRUA6Hcuw3ygYkZ/YwBgJPWNrgYHR15KJ2YAgnAZqPm6vA41fGMAyOBBo6cpVnfft2KkrjRrBYDLmqbcvwNQN63xXsyOrHMAtCCn+btWlOgUANfuDlcAudfHts4DwCKHK8nR2lwlMZ8bySJHaOkquA6YCkAmQLiO4wZEPqflDXVxJNR41KdVAK5iZ0ybvFcHIFS04muriVCq+AqkqYL7idYA5KjeNs3qcvWzdgA8zWOLIC4AnEZ3CgAGzb/uZ+0ApO83BSADbKcA5PgXkKuftQPgFaBphG470rcKIIfiufppBQAmJTH5AO4iY0pl2v+C3AB+AQIL0htM7eSsAAAAAElFTkSuQmCC",salt:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALvSURBVGje1ZmxTtxAEIZ5LZSShkipAAmlC0pLFykVINEjiogiTbpESgFUeYJ7AMoIdA+AEDSc6DcZ6/7L72HGt+Nd20oxsr3eXe18npmdWW+klDZyZGd7M4kc7L9tBM/z+TwtFouWSFvuvJZ8OT1MOeKN/3Z+lFhW7WefE4u0ZS8Kip98+rCCIKIByHMNAKxABIBWnvvrdtElDAADAQMKQ/kaFoAF6gV7X9YC8OvHxav+aGMoIQCiMAbiXpSdzWYtEPJcCqBlrkqRdQBkXT8vjv9BW84hALQVZS+KlWdhAHwtAvB3waIAREOAYjkWwGttWcVyzl6BiScWZTWAiAtY/imL+7i31Sh/sLtlAoAVaoHVuC6AuZb9woGJF2sBwH2JZcnc79+9aRYoV8vyLOVFdMyC6+r3kN6RGQBY8cvry9V9n9ji+TqD5yBsiQdAvw8D8BbGivM1kl/wQrv2fVYEeYgWDw5D5i20GIAoa0kk6C1uH9PzzX1R4GSX8iBwIFwBwBdg+p4Jan/r6ov+sAgdI3B9uXtqlH/+/dDc1wDguQdvhS0ADEErpu8jfVhxJEj6vsZXL5FXAKyIrIOQFxBZEA9EWY4N2CajsWJQAPAPUeTq+9dWVJdnEbzDe/i6PGMs2tjs5BnZIbtBjZS5CgDeuvB1dBtHeGvb01/VGqMtAm2TA9BRHgv1cmzvfU45Gs02RwUA//d8U0f1SD0f3Wqj44oAeHm2t/21KqzloUItAJNYgBfFrT3f6lPzS/LHGM0CvKIiV9ZVeGEABGESAF4W5UlX9piTN3hFj9evOoCowl6h4abGHSc6XUkWuyHnKYNlgn1Fg4gq7x19aWvsCrqTArDqiHW1vVdQWUEYpe9gLlAyGEfhfUrgIeYZHQCfApcC4HT5vwGga4MSkDXmGR2ALppqgBy7Qiy2AK7xS+ap9U9hdAAocUVKLWmKM4JiF8CBRymAGvMMAgBRng9BPOF+/NeYf5rmzKNjC/99rg3gD0EUyOYOT6hrAAAAAElFTkSuQmCC",toast:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALYSURBVGje3Zk9bsJAEIV9CaSko6TmCFQgwTVo+JMQ1+MWKGUUCqQoHQX1JmPlWY/xrNll1ybE0ovtsT3sfDv7m8I5V4To55A/rtfrlcJ9v993g8HgSmIL9WtJvj+dTpXk3rI1+HCXy8Wdz+fyXdjlWmzy7PcogguFwF9fXioIIhSOg88BQAoKxQBA4CGSd6MByA8DgpxFKCAkthQAApILCrjaZn07HA7LZ5vNppaZ6/W6qiQ5y7tRADhYXDMEPqcCkNqBYgDg3fl8XgWK8263q1VWcKE+3t+vUhASO/R2OFS2FABSM3ygVkMAILDValULdrFY3A+Ag0bngmAlcD7HANB9CFJzNpuVwU+n0wqA7mck07gCkI2i7XZ7dS9aLpc1WxQABI5asADgOtQvNysOcjKZlOk/Ho+9wVsAdFPQmVMb3WIBsBiAaL/fV9ehfgHM8m9J/6ZWawB8BeLA+Rzql6H5+hnd3PAblhD0aDQqpZsWbNkA+AoS0+kdj0cnSuk4dabKoTNHHZjgFY6HOF+q6x6fa8t6n+cLmDVaKgP//HK5IFgjlNWBXwFgCLo9+oL3QcC7IcEXZQKm13qKagB0u9OB6eA1KOipAPDcnsdyC4IPDgMSH+zzKTIAINDLWgH6+ga+x/chtf8nAHDnIbXn68VvPbfm41DMGuCe77IA0MOabxj8dwBupbV+pm3/CoCvk/O1dx5PnxaAtbrTIwDslu3pAXBgvkmOzya9vbWSs2yYi7P0c0t6/Z4dAC9CeBznzQ29WGGb3hprAsAQQgKHX957bAWAXs/H2HjCI4W9BSBUvs3X7AB8q7lQ8TTa2iC9V1z72H5vBUDq5qUodVaXy0/nAJDmqKUUAOIr1U/nADhNRY/20zkAbvspBUfHmuqncwB6uHy0n84BYEOzaVocCkB8pfp5CIAcBc/lpxUAelLSNCdAO+ZZIf9vDuN707Y2xBu1ba4PvgGqoEuP7iUQGgAAAABJRU5ErkJggg==",white_splotched:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAMZSURBVGje3ZnPjtowEMbzAFyRdm8cOfMInHkQXpJXWKkq3W4r7X/RVdVeUhW1p7odiy/7ZTJO4tiJ2CJ9ChjizPxsj8dD4Zwr+mi32znR9X7vhc+Hw8GVZVmTtPXt15LcDy0WCy9ug0L3r9drt1qtGrbA1uPx6E6vordRcPzh7q6CIIIx7HwOANLXcrn0igEgjuM+lh4kgIgGIA8GBLmKtGHSlgIABnY50Abg+O5D7X55/d7fVIM0CAA7i/cMga+pAMQ4cQYO9QVQfff84mcOZpB/3T42Bqu3UdZIMwDMihwAaI06Xs99AFTL4/65Yeuv9x+HA+BgxGudlwMvi9iAp9fmdrv1AOQqn62YIM+5vLioDQL053OzzT19abRFAcDDOeBpAHgfM7MAl6f6ZrPxjstV7zB65tWcPPVrBcJTLKg9PxoAByUGgK0R72Nii4wi929Ndwu6aD6fe+nnZgcQ2lbYcb7G5BdwREBYcUYvN85Din8uiPAZ9knsELHNEkvQlg0AHqwVE/R+3Hxz5dVLUuDUM1U7L+2AIqoAYAQ4ymtnsUZlhCD83pq6esRCkEQ/P333zpfXX/37HAC0vdxG2+IrAIaAoNTmPABw5/g9B6gu52NnSopms5nZ3gCgc3AGoQFYoHiLOicAIRUcuXkb09sTO8l7tzVLdH9nD0Cf9JDRaQf1FqVjhvyGt6Su0T8LAJyRyaiHDOv63srH21LWnPdlAaC3tZBx/x0AK9Oyihx8jOx7Iot1RC+xSQBY+7215mMKHykA+JmTAODkwEoeOP9mCG3H3lQAgDAJAHZWJzu8p+vqD5//9dIILSM53bF01cdKtfvWAQcDwCGEAeCEJW36mKsPJbo01hVH2Hmr9BXKKEcDwE7AcUg7ahVF9XddAELSox8qvo6aCA1VW4F0qPR5YjQAOaq3qVldrn4mB4BpHlsEsQBIX6n9TA4Ap8LYMphVF8zRz+QAsIPA+BQAHGDfFABR6n8B+l+nNwNAipEAkBKhx470owLIYTj/03x2ADgpkdFGGVqXo618QJ8iY0plnHmOeUL8CzlUCETgPL+VAAAAAElFTkSuQmCC",white:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJySURBVGje3ZnNTsMwDMf3gNyQuPKkewUkxBgDiTGYxoTgUkQFJwLp5uL9m6R2PgqlkpUuaVP7l9hJvIkxZiKR6XRqrMxns0bo92azMVVVHYitk/brEvu+RAJ9mLquO7qQrrZtf03ESpHhq+WyhWCFlOHG5wCAQKUAyHCJ2GfVAOyHCYItraBiti4FgNSAEID6/BKfNR+zRQs0CgA3lu45BF6mArDKkWgAtG3rbWvofrYYc3vfGSyxUq6R5gBoVuQAwHzUcH+WAGjd427d0fX94ioeAH+J+yV3B+4W2n7RN83pyc767xIBuOCjfN5068zDY6dOHZgw4CEAuo+ZWdzI1fFRY7gtNcb3xRH8fnRkRgC0NNJ9TGyRBD78JkoxAL4OueG81Owv+MwJrfsI2yU86tvLAeAARDIAnyKaoPe6eDbV2TYpcOJMRePbleDn2gGgEfD5YsjvJM+HRsvK2/VLY3w1f2rucwBAfV0B/AAAh4D+2Bd0XDtBviyGjNfOlBLSAYB+5zIsBEoz+n8GAEbS0Oj64ODIcxnFDEAQLgN9vs5/Sw3/MwB48LCj51Osrz20YsSuNIMCwGXNp9y/A9A3rbFNcyIbHQBfkPP5uy8pMSoArtMdrgD8rI91oweASQ7XJsdX50qJhdyIJzmkqStFHjAOAN8A4TqOBxD+nG/f0BdHpMajPkUBuJKdmjre1gdAKr7ka9GNUKyEEqSxgueJYgByZG9Td3W5+hkcAE1zbRLEBYC20aMCgEHzt/sZHAD3/VQAPMCOCkCO/wJy9TM4AFoBUiN06UhfFEAOxXP1UwQAbko0+wE8RWpSZb7/C3ID+AJqOCnCpASABAAAAABJRU5ErkJggg=="}},Sl.ravager={name:"Ravager",aliases:"illager",behavior:on(),entity:nn(),model:sn(),thumbnail:"data:image/png;base64,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",animations:An(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAWVUlEQVR4nO1db2hcV3b/yZmRJb1Filay45lVVxpiWWqN0oJS4kIWYoNsBRxnIR8LoQtht4FkC/mSksLWLSRLoOTDZqH/XLxNu/2Wppu6jW2Bs8saYhN5adHuItnejtRqJXcsVxqRNyN7bKsfns6b88679/2Z92bmjTU/MNbc/++ec88999xz7+3Y3t4Gx+TkhCPgiy+2HPELCzc6+O/jR49uA0BX2vrda3QDAPoyQ458xdVlAMCmWQYAbFWs8Iuffuoozw8dHaGSR8Y3v/v29lJ+URv/8PoNz/wzP/5xpAbXu/5UTa1i2P94t03UXqMb6b5+9PQYrnR9mSGUSiZ6YTFBV7rKLI0malgM50YwMTbuCJtbmIcXYVql/j1RC0j39aPX6LaJqSI+ABiGYcdR+nRff9TqG4KJsXE8PZJzhT0K9UdmAAA2Ib0Iappm4LRJxOxi/pGsPzU2NuqY87/0pS7PDFJHeGriKQDQin6Jnh4DpdDNbKNeiEUCSBiGPyO0Cho1zzer/lgZoFSyxDyJe680HNvb29p/ScDcwrwybDg30vL1R14FECrFdaT7+lEqmdqpgIhPaVsFS/lFLOUXMZwbsUdko4hf7/o7Dh066KkDSDuAjH9q4ilUiuv2b05YYgQ+6mXasz/4oecasN5LxPf/+cNtqWGroFPCouSttQxdekpD8UEUx9gkgG0L2PlN0oBAhOc2gyTg3PnzmMtZ62wStTTKTk5Pu8KA6rp8bmEe586fd5Wpy6cKDzqSKd/E2LgvYf3i+ZQSWQL85ld/IzRRefp//Ojfm2oJ/OZ333Z8P62veSepwrzCw+STjKVDkHRSYQxSXmQG+MrAIAC4DDtc1ANwxRETfHyxuabgz372s23AX8SGEeO6slThZy98YjOEn2gHnJLg6ZEcZhfzmFuYdxiGZDm6ts8tzKMjqqZ96vjRbWkC5soeUCU+jycmaDYDvDD13DZgMfCRl18BAFz54IxvPmJgQtgpjfJnjk0BgIsJiLBAdbQOFpaVZYSte22/tU8znBuJTwfgmn9Pj4FSyXQphLRC6OkxUBQSolkYyGZxZ2UFQHV0qVYoUqIBValH+b1WNrr8pN1T3XK6WMov2oSX5XN9i/o3CKi8JcSgBPYa3ejLDMEwDNy+XfC0BlKcYRhAZghYXdambRQmX3wJgHM+Hh4/rLS/h1GuCH42+ysfnIFZWMba/iEMsv8Jg3CvrFSElmEynSrfYGE5OgNQ40zTVC77eAMpXu4LNBOqXTVad8/lRgKXo7PYBdX2h3MjSD0GGF+1/teNZlW4yq4i0/HflLZSXEcHnwNlAlmJnPcGslkATvHOK/PSAThHkggl6HYKuRiVbYmCrYq1rS3LpT5RzbWbZtn2aQBqz0/5AMB45lmYVy/7DgzVdELQ9ZtOQbcZQDaaF6breE4oKfpVIkkVLxkrTP0SnCBeIOcVXif/DlJSObzqVTFsmPwD2Sw6xw/DvHpZywS8XRRHA4cGos4gJ9vF87umAM6tVGD24BhWbi7Y4ZRm0yzbigjt8PX0GJ6bQVI66IgvPygOwsv0xAj0Hdx4le7rVzIn77ytilUGz88V4KD5K8V1TI6N49r8LzCx878Eb5fsGyKqjuhc2sr8LglADVWBZ1YRzksa8EboiE/59+3bbzMch4oJwhJfBenOtmmWlZKIvoFGnmSkWvJzz6gjL7+Caz/60M4np1CdVOH9r+pnr/wdU889t636AA7JEOTepWKETbOMgWxWqReo9AhuQyiuqte5sh3SrxBwi3Ue7xWni1e1EXAyr1f5QfMTA7z2nbfxzptv4F5uFIOFZa3hjMrz+x00f4oH6iA5zR7RqK5FN82yna5SXEcJasMPbwAnPtcZ/BQ8+cGSAFIqqAjVla6Gy2+X9W+aZcBHB4iSH3AuMSm9PZCg7mfZBj41U35gx21Pk9+WAH4aq6xMJQXkVADAU/TL0e8leWQdfAQRalECeRk6c7ZOs1dNAZyhg+TneUkBlFOIVx/Icik8aH7XMpBnVmm2VAhx152VFfvDvbRQPq9zBYmXwztR1ivbJpklrC5AHc+JIJd1UueRnVrYKLvKCpufSyLVQOSQU4mcCmvJb08B3KTJwZcN6b5+DAhCO/YBGOfzkd/TY2Dl5oJzvwBVsSYbp6qbYDMN+0A5EnXMwOOl9Og1uh1isrBRBnYIRPG8DRJR8pNr/VYF2BJMRXk54STjRcmvtAQStxIBaPTSyHVxNmDP+cQIgHM1wA+K8KmDlk+8bL6sUYlRjqDEp7iudHX+p7RbFQBshBIxeZ0qxdPRhgj5KQ+8RLeYclSKXy35bR1gIJv1NMrwwryUHi4RDMOwzb66VYNf2ap4klZhiM+hSi9HjKxXlTau/LpVhJ/UofxBrJAqbFV2JECv0e25Q6cqhEbn57/0Pprkh9/9rVHtSPdSbHqNbmwxEVsL+PzLCURiVAetFKgxv25A+VkfeT2qlQcdwNH16dYG0wHIekWiiyQCzyS1+7i2dPlSRyqTUunUIYwSyOf/U99+XZkmiJ+eRC2HNz7+3vtK5gb0KzIdw8h8XoOJkKKO4HM7n/95XKW4bi//aEt3zLQ9ewAAk9/6GgBg4LpTvbhz6D4A4Npf/xQAcOr4UQBO3UBKAuJg2Q5iviijn6Bz5zp3/rzyTB7Px127VGf3ANj7/RJy99BrtHOiB5kiwyzpO16Yem6b1vWA24PXa+OB51FZyCT4MoWUS9M0HZscfDlI4IohKZbSblDrMvD4q24JQMQn4nGHUYLKiVQSOsj5vY+/977rgC2gH9UqOwTPz9NwqOILG8wOQFYnwL2TJ0WyaheQG3sKmjmQr41V+XQ2dALPw5este4H6BS3RhpiVFvRfpZFTkDAuaWsql83bWxVoN4LkJnob90Hy2WhnwQIss2sql+mjWMjSNU+2R7eLq9vrTU/73+/kczLVhmAdHXz8nj+jqnn3LuBfvCbe/0MMWHz1RN89Hkt61SGlDjyS+Lp4DWf+zGKLs2mWXa7hROuX79pu98eOnRwe2x4CP86Y902QdNGPX8vLC272qBq53B2SBUcCpyIXqJbZUiRIjxsfhWCMAQv10vp8wtXWgJ5xxMWlpaVfzfiN7VJxwRRcOrbr9d8vCvoUrHWs/1Ryg/6TU2/m6WWKYgjjjt4wpwGqjXO7xRRlPxh43hYbOcCoiKqKbZW0BKOL9nIK/jk9LQrHYHSqzyKVfn8yuNLSH7eUBcu472OmVE+HkbpH3OV2GA8OTJyGgBSj1mE39tZ5YRNs4y7FcuAlHrM+nf/YfUfAPzX4uKfRan/4OTk6eLGBq7fvInH+x/HxNg47j64Dworbmzga0eO2GEAUNzYwN0H9x1pOVRlAcDdB/exlF90lUe2hs9nZ5XhhTtr+Hx21tV2bqNQHV79fHYW12/eVJZFdSRCAqiWMTp/O77LFocEUFnpVAYcnVHHz9gj46k+Hk5/U5wqjV87ebwszyttInSAKA4VUXWAoIdDCUHuCQhyONQLUcoK2nZKlygGkE4hQVyqojKAlyGMIL2W5G9dXul0wqHSaZpRfyKmAN54lecwh1dcrbCJwaQM72TbsYWdhAKAO3AfyvCyhLrqS0D9iWAAP6KqzMdxMgIfJbqtWV27OLysgUAwC2mj66/LNXG1gm9l0t9yWkj39ccuBXjHrH1xF4CT0ei8QqW4bofz3UgKW/viru1yRuXyfwRKo9J9Gl1/03UA7pXs5YUs05BLWFQdYLcjEVOAjvgUB7ADDaZzI6WNaEgEA2yaZQwotoj5vK9aIdRDIdxtSAQDkAsaoD7WTB5BPE26r9/3uFUb/mg6A0gNX3e7mMM1zcd9vI3gaDoDkB+gSg/gUOkEbSaIjqYzgGp+V0F3Q1Yb0aB0siCHEIpL2u84oXJ+2U1QGoLq0dFRkcQ2PQoI7RRKx6n4/0BVmfO6Cp4fMJEbFvz/MFhaiXbX4G6XALF/PDFU7oR1BWr+wowynSp+z6HRwLdnL+UX8fD6jaZZAv/oj1/bBoD5OevOgwv/NtOSjFRXJXApv4hbPd04UHKu12/1dGOP4sjUw+s3kPd5B6+NeFE3BiAXpQOlMm71OJdrxBDNfo8nCvZlrG1YkgCtioYsA6UEeBSw8B/uu/xaEXVlgJXlZRzwiMsORT/U0SjQnL8vk8Xt1aonzpef6Me+TBbjE2PbAPB//2sZrP7hrPdTOElB3fwBVpb9tfMgaZIEEvtEZP43xbUaEuUQ8qjgy080/xb0oGgzQMxoJeIDbQYIjCAivhWngboygJf236orA64A0vzPw1oNdWOAIARuVSYoFArauFaTAu0pICRo1NP/t/K/dqwKWg1tBgiIn3x00Rb1D033jhXF/eSjiy0lBdoMEBBd6arZtyttjXyOX175eTOaFRltBgiBh2bFMf/fyv8aXemqTvDTi5+iK21JgVZBmwFCovNexfZFJF+Ih2YFXWnr/16ju6XOK7QZICDkTZ10pwF3TJX39bUC2gwQAqprbDbNcuCr3pKIpnsFtwp++C+fhNrdi3r5lUS9PJ/aEmCXI/X7X3/exam6M3d0KaK8CziMM6dfWlU81alSruiyawnumNo5fhgAcE88yKgK/8Hf/1NL7OPHhRRd/w5UT9/wtwIA603bpfwisOOvx9+oUUF3jZskYBBm4MS9l7OcRs2rl+0wfsW86iLq1b0GhnfS0kvhBLo7b3WvgSfrdF9aLa+aybz1vEI39asHAPYayNw1XZ1J7ttHxsYxMTaOcwA28zccRJFv8VGD+ds8HLo3/GQcz7dplrHn0Kh9z97FSzPKiyMAi5h4sBO417CvR3t6JIffHrduyvrPeYvwT4/k7IuTflUH/0QVwwPBCcr7sV5Inf7DVwEAZy98Yo3y/ezZ1/2G7bl75YMzGH7mWctr12OK8Gps0Jc8OUjS5HIjuPLBGRx5+RVkjk05HUp32jycG8HpE8/bwURcuhHr785/4ij76ZGcHUdM0pm/sS1v06A7jMOg1vcM/fowbqSok75x4nmcvfAJ7s3/wvEYxP9cmnHddccvOuYNDttwmVf1fo98GwcAVi/N4MmDowCsq1LSff3oHD+Mb5x4Xnl92tkLVcLzxx1oCqDvo7y1HFDxgtddPboHpBq1rEzR6xiAxQSn84sYhPNdwLmFeaztHwLY3NtrdDueIpMIysm6dHL+N69extr+IcwtzLs6Z3WvgdM7xJe3ZgLAyelpzC3M4+hnZ6qBt4C1P/gLzC3MO65gHRS3eMfBCPIKN933yrSNQAqo3o07lxvByelp+wVrekhq9dKM3TEuY4iYDhyvZ/m84cf/ljqB1DM2zTIGC8tYzd/AQDZrv1+c7uvHyenp6hS2gyNz5wAA4/u6MDJiTXP4DJg8YE0X126Ztvg/+tkZzN/eAgDcfOJ37DrjJL79HhOc17erXvtqJFLUUQBwBScd4p7O8slVgR/8Oi9KxzruxWMPUy7lF8G/BbCIDwCLp1/CiQMGcKCafvKAAfzVyxi8ZdppiQmCfocXiLg2QcXDTxTnN+LrzRB7gGpH8Q6U7wb5odbO4quFsDoEbyMf8RKTjPB+cfzlragSQHWPn4MpdkBX3pCUkOnqOS0oLYGrew2s7rXE6+SLL9nr57fefQ/HX30dm2YZxjPPWnoBgMyxKdzLjdr5M8em7MOfew6NYs+hahz/nTsxhcyxKbuj7+VGkTlm5VvbPwTjmWexaZZx/NXX8da77wGA3Z50X7/dzjgRZ2dzAtK/gWwWA9msa2qoFNdxZ2VFOeLrKQXsvQAuAskocn/8MC7+5fvoNbrx2nfexjtvvoGBbBaZY1Mwr15Gp1lG5tgUVi/N4GGlerp39dIMtnZ+d+Zv2H8DcPymdLkTU/Zp39X8DbtMs7CMzLEpXPvRh7i4soK33n0P3//zP8HmTr1P/vei42NUo79Z4ESTL60BsB/p1N18GuQRqDjg2gyaW5jH0o4hZfDqZftdvXfefAPHX30dcwvzyF+YsQm6emkG93Kj2AM4CKiK60rD/t3J0tER8T2HRnGP5VsDULgwg9yJKRx/8SW7DYBllyAJdH9hHhnFx83f3sL4vi5cu2Vqp4FrOzqAnP9J4Y0yDUhp4nX5NVcI+V0L9dYBOv709zLbQFUCXJk4icHCMvoyQ67HGUkZLGyUHeZgOYfrLHoUJtMQZFm9Rrddl3zevtfottu4tn8IR+bOKRU5+jYv8Dy0CuB2jlp24miPJegdx/IZPkn8WoxRQWBLAE78dF+/rWDJN/x0mzISXteUc8XPT/nrSlt1fqWv39UWWqYOFpZxZeIkwFc0EycBWDaANViSLfPx921mmL+9hdVTr2FibByDqD6rcuFv/jaWjpa3pMg3kaWI59/FGb3eSFFHAUDmrgkasCqOlVe1ed1MLeO9oLJ5b1WsNTNZAlWvl/LraDJ3TfBv4e/+ksl3dmwcnzLr3/SOHWB2MW8bi+KE3KSieV9CN983wiiUGixUT+h6EV/+rTL4BLV/60a9zMOljcpgwm8YrRTXHRbMe3dNzLH0xATyRQ2yHgLu7eIo4AzrdQuqRKMtgbHNK2E9YLj/HH8UGoBrexoI75FTK+R3yB1ODpUlz+8iS1V6nWVQ9SCkbhs+qA1F6hKJ8QgqlUyb8JwZkowgT7fKfyr4PRAhw+LcLUwMAySV6GGWgVHEd5j3g4H4mCAxDECbO/R3UqAyU8uXTeh/PseHZQbVSyjyt3z5Iw4khgF6egzH3B9m86leUI0yP8LWwgT2TmETdgcTwwDF1WXHNBBEY64nvNy36vFukQpSCawHEsEAfLSXSqbtjZRESMYk4mya5dBSiwjsJfF0/pdxIREMADhNplwfaBa8/Be9CB3n1KWTgnHqAYlhAE7wJMz/HJwJVG3jUkAVHhSqZSVngqDeVmHQdAbgncS1/1LJbPqjUConVcB//c/TeGHTLDscQTi4lZMj7mkgMWcDSeyX4J4T5UmkemK3vUOYGAaoFNdRanYjdiGaxgCOUS02doDqhpM8E9BGvGi6DiDR7Hl/tyFRDEDEb+Scv9uRCB1gqwL7lFEjTsS2UUViJIBuydVGfREbA4RZn7bSLVqPOjpemLI8YFSnWLxQz9OzKuiMLvJFcVU4x267AcQPKX5ChW/JqpwXHQ84I54DlHK/3XH2T9RNTqC8nY49g53wSnHdtZeQJB+DJCHFn2YvwepQOnNP4I6X3CctDikgH5/k9RG4Vy0nLHcgoTsNyJpI4TxdG26kqMN4Z6qIz48305HwuKYBuxyz7Hoano98zqSS+CqRz8PbTKBGCoDWFUu6Nsd9cQKgvnwRUF/+RO3gDEtpVJKBkITt5aQiVVz1frlLpwzGdYECnwIcddGOmyJPpbiOopgmaNqSXkXEIEWPN413MxJhCAoCuQVLfvc8XG4oSV0iaX4GSYCDAfhhhiC3VzQKXvvvdC/BGtzHwXR3BrVRhW0IUh0DS9LGTJBTNoB1CJQTvw1v2Awgrz5P0ugPc1nCxNi4TXx5vV0bbrh0ADm3JgE6Jug1urEm0vK7/9oSwB8pILozYyOg0gM2zTI62dW1ZqFqwLq2c+ElAHQm8HuSAlsCNOIQQhzwukuHnyfgNg15sUQbbbTRRhtttNFGG2200cbuxf8DOPuQXUyla0gAAAAASUVORK5CYII="}},Sl.salmon={name:"Salmon",aliases:"fish",behavior:dn(),entity:un(),model:hn(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAPNSURBVHja7JdfaFtVHMc/Jw33psluFzQx1UYYrCwIyjLTP7jKhLGC9UlZ33zIy0B8kMFwgvZhzNHtwQfxobBH9yas4vRBNx04hjBbAltR6R9W3TBdkzZKmixpcmdzfIjn7uYmy59W2IN+4fA799zf7/x+53fO+X3vFRcHY1Re9krXD0UBWP3x2QTTQwMAMokkjKD/7DkUbn/wvqAB+s+ekwC6pgNQNst8+c07ALxy6CMAMpOnLVuXEY9KeXjCmkAensCIRyXA+GwC5XyBCrqmW62Zc+W4bJYB8Plc+Hwu/D5PnY07f+GW6OKWNdD14YTIA9MXBgAII0giGfHuohWcgakAFkOjlDc2OQL4fR4y9gBUx5byGiSRRDSduWKBXkDTdcxyuWEAv7x7wkrtTCwnQ0E3M8UDdD/hQ9/dzeTlTxn23iQd+0uGglXXLvsE47OJmgmNeFRGNJ1Fs0wYgaZXV6hkM+TyW5w8Mw/A5p8Fsr9V133yzDy5/FZ9BpyrN+JRubG8xL1/nCeRHKB99BhdDI+O8Fb0BUp7AgB47mT4fXSEQE+qPoBGzgH2e33MFQtENJ1OEAq6OX/0FNlCiV1/qIlDnH8vxtXrxzly6BMAxMXBWJ3xvecLEuCZn31iJpaTr8338vVzKd48OtXyGnYKdxIpVYrVfu//NchcscCdV4uS9YfKV68fx325m4imY7dTWVLPYQRAWwG6xgJBfqLCWCDIj2aJsUCQa8X7JMJrltJn4RWrnwivWXrK7lrxfs3zApW2MyBODEblS3Rxgy3s8lI4zdOh7poT22N0sZre5PVkqE7fKdvOwMG+fax6NJzyDXmQ1fQmhaJptdX0ZnW8gb5Ttp2Bm999K+0VTN3xfD7H4soakb6nrHfq2TB6ADAfPIBKpabqdXpIG94CBywyCkycsgYzk6eF6NtbVVhZ3vYtcLVSsJPRTuCssk0LkR3qasW0eiazr9zuwFlVH+W8rQDs9SG6zdVPDw0wPpuoCeTK1DHZdgYUGe0E00MD0ohHMXMbAKzevU3JLImOMtBv+6DINFhlM9xgi+HlJVLZdTyaB7/XECmz1PoQKuedkpF9/8dnE7z97B5S2Wpd93sNdu/dJ9u6BSr9i2Z5R1vQ//kXotcfFL3+oEhl18XG8hKR2IgUHw++WEdG9o+QZlvitNsWGYURdWSk5AIVdLfbagsOPbudmqfTmvFIMlKyx/Pw4OVKpZYk9K+RkZL5J/us1g4JdUxG31/6SjoHG32/O5EtlJq+t/98NA1ASsnjhIvHjP8D+G8HcGXqmPx7ANbR5UpEgbC7AAAAAElFTkSuQmCC"},animations:_n()},Sl.sheep={name:"Sheep",behavior:vn(),entity:wn(),model:kn(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Qn()},Sl.shulker={name:"Shulker",behavior:In(),entity:Dn(),model:zn(),thumbnail:"data:image/png;base64,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",animations:Un(),textures:{undyed:"data:image/png;base64,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",black:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAT+SURBVHja7VpLktMwEPWaOB/no0yS+QNT3I0VSw7BBTjBLKBYUMWCLQsOQHEANhRLbmDyFD9PW5YsKXGRxEmquuy29dTSa6nVUpwopZJdZDyZ51dXd1pwD7m8vNUymV7k2VhVdPl+mM3y/mBSEZ+92PI2mV88SbIrAejIYDTNh6NZPp+vtOAez5p0CMhAJ149PCQUnz1ZdlsCKAvVAgHwPDt/c/NcCzsq9ZlalroqSMDoOHoC4EXZ2evrey3U5XOpA9MfTo6fAHhREuCS29sXVgJ2tb93AnQwM6aATxgHMHqOngAzBtDTeN40/DUB4w4QwBggO+m6r02BwaQ7BEiP+zp/8jFAdSkGrFY3OslRWwRBrCCdmQKyg7bpcIhTQLVJgFznzTW/iYB9JkKqzWWQqS4Cn0yFpc6giHtMm33vBVRbQXAwnJabHQY4PDM3P4e2GWqFAHZEb2wwpNeCBEd3rtDxjp0t34/n5RT439vhCgHcz9/dvdR7dOiI7NC5x+d76igHHd7EHp868a7yZn3A295Dv79/qNVH3WXf1V6JR3noqB/4SiobeuXwhgeZB3DoK/GescFVD/DSPqeRWV/NfrHsSvsx7Zf2EzIp13IlGiPXbWXoYJd4mQy5ys8teHqC7xk0zfK29tC+ctQ/D7BfyeRsObx5NZcx24GIKw2Wz2wjKDSRopOkfXngIpdj15JcjgCdjgY03pXJYU6FNJ51osFyNygTKV/+UFtGDbyPdIln+2u5vKvzaBzfsTyCJc8EfXhZD/HLNR51uPYSrg5JvByBLE8iXW2R+ETOYdcpju00hx7kHAQJPs/J4UsPAs9AGXqq5IpBsSMY9isjAN6gVyimbpvDHAFN+KUDLz3owvjsh+ClfQZaHQPkHEYhX+IgGTfn4DZ42Cd+FYDnqsFUWsawGHw5AuSStQrsAKMuOiyXmBg8y2+LVwZeFXM6hIBaDOA6Gsog5yznMBuxjPWAmMPw6Cp2BE2qMSR0BJbtRx6wWFyVSmgDYAhDF3NINia0AbBp4qGHOgB47i3kdFhF2OdepfUDBnOz4tu8PEtH+S6y993groJO9Ppjh2TlfWp53ykCNtcs2PMdJeDpKr1v8/zBELDLoQSw0vNm55o83zECxrl7JNg9fzIE1D2fnd4IaCpzJqDLBDQFv84T4Fv+Ok1ASALUqUQo9SZA2eEmQm1mgjHSOQK2kYMk4Oi3wzzn4x+Ypni/F2DZydMV5+/8gzQYX4jGiWsInmVD2m+tgN/28m9s3ENCIj7wEhuNn8wrOFlPqP3S5nDqtd/YgEonhhEEFN8L6KtoRCyBbDj1WAIlieEEjO0VxHigNCqIiMIL4mJHAIa/xPoITLDGyo8W2ADbKODhJcqXa3NqwQvWK9d1vdPZosSnxRpPPOeubfpQn82WTjylJF8SUdyb9hOtpJvOoMBmebHrqETq/OIjFG/qxDvtjaZWvefAb9qXFXoWZD+hJ/mw6ZoK473CSBM+9dabVUaSzY5ZvqKnbvu9Bj0V9SX8TgcFeOCgdR48pIbO90X5Gj7NonSv/b4D3/fY7zvsG/Ulrt+vP4855Pffj1qof//2TsuHx9daqCdd+8nOSxJOhgCz85QzAWcCzgR0iwAz2scK8S45ymjfJgkHT8DXL2/zNuTzpzdWOZopYAp+69ell3GPn6v8j5/vrXK0BDC4mcHvZAiIne/HSsA/K9dRSVpLRfEAAAAASUVORK5CYII=",blue:"data:image/png;base64,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",brown:"data:image/png;base64,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",cyan:"data:image/png;base64,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",gray:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAVpSURBVHja7VrNctMwEPZTBLhDSZw0IS4USigt5W/gVThx5CF4AZ6AAwwHZjhw5cADMDwAF4Yjb2Dyyfnk1Vqy5ThDE7eHHWctfZL2W2l35TYZDAZJF7l1cJgvTs6M4Dfk/sMzI9mdo3w2v+3osn1/luWj8dSRpvna9vfJlaulJF0JgCHj/Vv5ZDrPD4+OjUymmXlX6nOlZ+YdyIARw729hNI0n+y7LgGUa4MNEADPwyAYdnz21AgNlfqdu4v84dkzIyQBu2PnCYAXaSyMe3D6xAiNhaBNvwNmNJ7tPgHwIoyRxnnl8XO7I7grQEDX+c+dAMQAfQS09/U7HgHsnp0noIgB83IXLD2N5+LksTWY21963wTBrAcEMAbASBoY+k0Syhgw7Q8B0uPS83L79zgGzJ1AKL2tCShjwLwfMeDo+JEtcpoygY4ByCC9OQLSSBwHHfl9u+C8j8BgowSs8rzMBKE0uC2F0GCTaZClLgIfS2GtMx3iN47Ned8FBoMNXoaaLz/Z1l2GNkIAK7riYjMzggKnMK7Q0UZjbXt2aI/A/74OOwTwPn/67IW5o0NHZIfOOz7bqaMfdHgTd3zqxIf66/GA97VDf/T8ZWU86qH5Q+uVePSHjvGBd0pZbtOwPrfnl0FM1gG6nbFBt/MJvJxf4tab39+/+swsPiGTHJR5WuZ2CdaFDPFsl3neh3fuAks8PcF2Bk0uUgbNmPnlZStm/c5tTtfw8iIj7/OylJUelClP3//1O9eD5WJDVWQojeospK/gTMmyDJd4p5AJLV4vSlZyOFPyg0go/3NMFEnyNugUUrKW8EgljQq8dJpvXtku11+p5X2eMwMuF8c29kewZBrUeJ8hHMfiH5yaMfQO0rtQO4c7Bnj5Sc72XxEZcqTEJ/IMhb7iyK85zgeNrDyDIEHvFp8XtAeBLwJlVnuHkOuRH1R86/fdQqsfZIod6OwAeINesaJ03xnmDqjFr56hM2zxHowUfYZlDKnFr35zZ9gYwDOMQdGpqXCQjOszvA5exhAssAnPrMFS2pm/Bd7uAJkiYgaAAYy6MHg9fOkxmbLWx5cxJYYA2V94JItmkMWNjAEGH7kAXx6HR2MJ0DGA64ndgXb9qAPuLU6sErsATIStizMkjYldAObUeOixDgAe8w3Tfec4xK6feBMDNv2BQV9Wmi4v128M8y5y7rfBrgIj9objgKT2983RpNLeKwKKZxrt+Z4SUD6l932e3xoCunyUAFZ6XhtX5/meETDOwzvB7/kLQ0DV8+nF2wF1fS4J6DMBdcGv9wQ0pb9eExBTAPWqEEKZW18ApdtbCG2yEmwjvSNgHdlKAnb+OszvfPwDppbG/xdg34Pyie/v/ANpNH4lBieeMXj2jVm/dwD+eRtP/obERHzgJbY1/uDQwclxYufn/yoTXzd/7QK0EfgEFUuAFOLbEqjHaEdg5pAYT8CKQZ8XuhmQtcJr70NiHDBdbn/f7g2tP7lxM81Hk5lzTtzJM2cR/JgJHCKxwY/9eN/zAPhJgUf+l3ieXd/xoX777sLOr/EUH46/9fxJMdjIGANjTXrZoz53dAwidXikGMzfv0k3mWGJr7YP1Xyuzvk4v7u+dKWnUfMn9CRf1j0Lxkd2EcDW4U2FVzOexHNcPY+LS4P48v1QjVfVi3UNDTYBg2ACCvJqsaXidewgeKILvu38cr6u60/y3C+//rzPIb//fjRC/fu3t0Y+vH9lhHponG2XWgJovCThwhCgjadcEnBJwCUB/SJAR/u2QnxIdoKAdY2PIWHrCfj65U2+Cfn86bVXduYIeDy3bE2slxMTLvKgp3/8fOeVnSWAwU0HvwtDQNvzvqsE/AO6EvOWwzwL6AAAAABJRU5ErkJggg==",green:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAWcSURBVHja7VpLjhxFEK1TNLbAHnuqZXEHmzYCZBl7BvzVTBdtwEIww1eydxyCC3ACL2yxQGLB1gsfwPIBvEEsuUFTLztfVmRkVlXWVEndXTMjhbKiKl9+XkRGRuZ0NplMsj5y69F0efd4xwiejX60Y+T2l6W+ULr4/ukX0+XH93c9aeuva/2YvHOukqwvAZjIjcPp8uZ8utx/vGvkZjE175w+V3qxqg8yMIn3r1zJKG39ybonJYByfjIEAaXlMSFM7MFPF4xwolLf+zpfPvj5PSP7j3ODgXdsPQGwoptsObn7P1w0wskaKb/pd8B88jAfAQELS4CccEQe/vKu8wh6BQjo2//6l8BRuAS09fU7xgF4z/YTgBgwr7zAWLos731fubxzf2F9BsGtJ4AxwEzSTrDu2ZFgvaDvGt4oAqTFPctL9x9tDJirQCitrQngNjiWJXDnu0s2yclbd4IgBixGFAPkJM1y0LtB4AXrXwKTIQlw+7zYCeq2wU1JhCZDboNMdRH4XCqsdG6HeMayWfdZYDJUELxxIA87qwCHd97hp9i8w9AgBDCjQ0CDS0N4LHb6opqs/r6O47BHAM/zB0/OmzM6dER2o9szvvtO/Wilw5o441Mnvq6+bg/46PdSP3waae+opf+68Qq8qX+8ah94L5Wlm9bqtqR7w4JVHpC7kt8ZGzSepcGL/rmMXHuFbHdX1ctV//XjDcqi6j8jk24vN/t07gbjDi/zaq+XuTzxLhkS+7yur78DT0vwO4OmO2CJoKnHU/Wfe8lYDB98t3jvNBfk8OIg453nRSrrHYbElhfcCah3ngcVIpGqyyKDbTT3+pcXLvII7rZkkYbL/u0+7nceu9Coy+Swpug5TcdgtokkSVpAJlIyl4hJbBuVFzLeqTNyEpV4jj/I5WOWAxiD4zfWR7DknWCAj03EtuPw3142bQQepLxQG4ceC7y8kmN9EllnSInP5Bquu8XxbnPUhQbXIEgIvCV2H2DdlxYE3gTKYtp8hhDjCfv3xx89heoLGS8GCIvSKk6UHlvD9IBGvC0D/LHqP4Lx+ldrWMawRjz7t57hYoBbw2WjqNSWOEjG9Ro+CX7V/8r9McA2PHcNPwbY8XfAOw+QW1ZKA5gAoy4mLLeYZLywmNyyuuHzCs/xJxgABMgYlLl9tJgmM8jkxluDwCcOIJZHwKKpBOgYwPGkeqAcf/b5N9VgUgeAjuC6WENyMqkDQJ8aDz3VAMCjv4/u7XrLIXX8xJsYMPQFgz6stB1ert66sOwjaz8N9hVM4vpnl6IyE88f3rkcfB8VAShntkyRURIgy1mNV+i6ayegz6UEsNLyenJNlh8VAddrCGiy/KkhQFt+dho9oKnOGQFjJqAp+I2egLbtb9QEpCRAo0qEkOY2JUCzTU6EhswEu8joCDiJbCQBW38c5j1bnaT8XiCQxdT9g7QzfuGXSfhF+vijDfC3vSj5DEmJ+MBL7EnwEifbScbb3yrjf5Rt/TcOwJvEweoKKomAg2oAchBdCeTAqXcisPBJ7EZAEbdC5wkIItBmMl4QJyXJAAsf20ZgNtvf8X60wAG4jgt/ELzMBM7s0TH8Ycg+Cdn7Knd47P8e3q7d2PKh3oh/VOE1iXzW+AzKB3sXzWQwWZTXblt97utoROqwiIefN+O1zl+MBN/t1oiJx3T2x/7l+Ga2/Vli/xktyZdNJRhj5yiBbcKjflN7Es92dT9e/Qa8e2/JcviIbsaFu4USm/F3OlCu2pdddOBhiT74rv3L/vqOP6v7e/vvsyXkn/9eGKH+6uVvRp4/+9EI9Wxsf3LykoRTQ4CePOWMgDMCzggYFwE62ncV4utkK6P9kCRsPAF///Xrcgj5848nUdmaJaAFf+VnZ2U846+u/us3v0dlawlgcNPB79QQ0HW9bysB/wPaH4wgq3k/jgAAAABJRU5ErkJggg==",light_blue:"data:image/png;base64,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",lime:"data:image/png;base64,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",magenta:"data:image/png;base64,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",orange:"data:image/png;base64,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",pink:"data:image/png;base64,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",purple:"data:image/png;base64,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",red:"data:image/png;base64,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",silver:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAWASURBVHja7VrNbtNAEPZTBHiBiidpadTQlkBVRSqqeogoRZRKRfQnVEBVVVXbQznyBBxAHJA4cOXAAyAegAviyBsYvjWfMzvetddJVBynh5G99n47O9/Mzs46iRqNRjSMbGysxUdHPSO4T9r7RjY3u3G3e99qy/dra514eXnRkiJ9Zfu75Nr1vkTDEgBDVlbuxaury/He3hMjuMezvDYEZMCIm1NTEaVIn+w7KAGUG42RENBLjT89fWWEhsr206eP4rOzQyM7O48NBtEx9gTAizQWxp2cvDBCYyF4p58B0+ncGX8C4EUYI41zyfn5URoRjAoQMKz+CiyB/cwS0N7Xz5gHED01IKCfA+hpXI+Pn6cGM/yl94FZX18dfwKYA2AkDfTdkwRGwbBruFIESI9Lz8vwr30OkIa61j/vuQ3WIgccHu6aIgdGFe0EOgdgB6nNEpBGYjnozK+joApLoDFKArjPy53Atw1WpRBqjHIbZKmLxMdSWLe5HeIey+Z/nwUajREehnjYYYJzHX6qdhgaCQE0BAkNIQ1BgYNnbOMdjeV7CJfAZR+HLQJ4nr+4ODFndLSR2ZN2L7bf99LzPNrwJs74bBPv66/HA979fj9+/frUMd5+gX7ffPv4pH/PjA+8VcqGXhne8CDrAIY+rnzP3OAbJ8H3MuPq8Vz68VzqLzN/qT8ikxwUGVsaIQ8v3OvlYYZ4eSDy9dfvgacn+J5JUxZXkhyXfkmS1pfXBt6q5HQNLw8y8jwvS1nXBxHdXx+K5DYoIyivitTSjwB7F9JHcG7JsgyX+k0O0MpdHzR8lRzWFCMn7xjMMVEkydOgLKRkLeESvY1KvHSaS698L+efqeVdngMYk+M79key5Dao8S5DOA7xL18+M2PoCNJRqJ0j8TIC2Z9E+hwp8ZFcw76vOPJrjmQQHuAaBAk6WlxeYPjSg8AzUeadIeR8fDko7xTq+iAD/VYEwBv0CkW3XWuYEZCH5zWL71n6XRgpeg3r+fvwvGdkpDmAaxiDolNR4SAZ12t4EDz0M/wxwSI8dw2W0jKHlcGnESC3rJABYACzLgyWW0wZPPsPiud85fxDHAACMjmA+2gog1yzXMOcROgEXGsYHg0lQOM5n9AIZH9TBxwcbKeN0AlAEUIXa0hOJnQC0KnxaIc6AHjoW1qat5ZD6PyJNzlg1B8Y9GGl6PAyNzcdDyP//TQ4rMCIxcVmobTbc5lntSJAXkOk1gQURUOlCBjmowSwPgKKPD8RBOR5fmII8Hl+oiLgioBJJSAv+dWegKLtr9YEhBRAtSqEUOaGlsS1JKBMCVzbUngQqSQBY38c5nc+/oCppWhA9uMY/OGUP5CG4inAyWsInn1D5u8cgD9v82ds/vwdkvGBl9iyeJAkcXKcUP1SZ5H+3AloI/AJKpQAKcSXJVCPUZZASWIwAWTQ5YXLMEASqJ0Q4oBud8UZvT790cJCM+502tY6cSmn8GMmcMjECwuz1p8eNAH6urX1wOgD/u7dVpzov2Otc9fyYXt7+2GqH/WDxFNcON5L/cBHAM/P3zLGoAOut2/PONsYRLbhEQwWitft5B8j7cz7Vmva0qfb1Ef9vvmF6I/oyVZrxnrJq3wOxqgcV2CJ1/1xRX/fuLhKPMfVejRethF9Wf3T1niudjKvaYONwCCYwGDYV/EwaTf/tWdVu2n1RwTBE338rBovv83/Cfn1NzP4RF/zH77tGb/p0W+PF8WxW378ehtDfv5+b4Ttr1/Ojbx7u2GEbd84VZdcAmi8JGFiCNDGU64IuCLgioB6EaCzfVkh3idjQcCgxoeQUHkCPn/ajUchHz9sOWVsloDDc3/fRqmXI5MuYq+nv31/45SxJYDJTSe/iSGg7HofVwL+AJn10znH4i6IAAAAAElFTkSuQmCC",white:"data:image/png;base64,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",yellow:"data:image/png;base64,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"}},Sl.silverfish={name:"Silverfish",behavior:jn(),entity:On(),model:Yn(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQYSURBVGje7Zi7TltBEIb9GnkBpDQWiIK7uImbBIoimpSUpIwA2xhjMGBz8RVsSySgdChCSkudIklFkVSpU6TIW0z8TRh0fOJjsBN8YuSRVrtnd8+B/5+df8YbCNzY6uqqxHfzsrW1JXNzczI2Niazs7MSqGH5ckoyZxmZnJyU6enpqj3PvvwMtKV1dXVJPp8X+omJCSWAvtbecO6NxBJZWVhYUBLamoCDgwMFXRmq9+l5TiaTEg6HJR6Py+bmpoKEIOZ3d3clFotJoVCQTCaj7x0eHooRYK0tDFDZbFYSiYSkUikFViwWFdje3p5sbGwoCc1824h4Hn9ZRYw9X0eeVM1b85p/UHLxIkcbHVhZWVEdGBkZkcHBQZmamhKvsOHEuOeXri4DoQ9Xv8G8f6o933b2tBf7r7SvOOEP0mzNi8QHOQkIW7a4p0ca4AMDA9Lf36960AgBWOH6YxVwvkufKyWregiCMMxIU1IqQmtjJ2n/nACAE8u5XE7je21tTXZ2dlQQj4+Pheywvr4uaAW9ATfwzjFr77591e9+/vH99h83sNF4WiK5M6F3zrPX3nWCdO9zzv0zQ7yOjo5U6EzciPvz83NJp9MqboRENBpVghrVAEKqXixDSIXkqneYa5kG4FlA4mmAb29vawjgfcQR0KFQSOcgqFECrj/1eIIwb9bSgJaLoAkhRGTPssKxIwyYo9jp7e2Vnp4ebWiDuwCqZXd53zSg8jfufWogjf/twVIigC1WeYYQwPb19SkJ3d3dMjw87FkkuU+AebneCXCHgK8nANAwTEYAvJXGpETAB4NBzQxeJ2ApeHnbbkgNLC8vq5dpgLXGPL3zBLTcyuWyFj0oP42YJyugB2QExPHk5ESLIzQBHWDf/v6+7mUd3fAi4L83lB4CAA0ggFMVWjagMQ949iCYZASAM2bdSuW2JMDKXov/SCSiPV5lTBl8cXGhWcEI4DcCeyCJ3is9vq2QYI2wsrF7zWtPywjAuwCzIogTAHCAkgIJk1KppARACuucHAoj3vMigGrOACF49QhwrlNA+XIanHcC1P9DQ0Oa8pr9nhtYLQLsbsGebeyLaRao/EMQgfKPjo7K+Pj4XxHgbJBbLwSchPlGAMePfn5+XlPfzMyMNAO6bczSGTGOuiNspDqLc9ZN7Jh7dAScnp4KDSEELOIHGWQFBJLfChBh5Nz3u05FNzGk9woP34gDPIDxOlkAlSevQwaqTxFk4J0Fz31OQijzWvcT187e1mu94+/1WMVDeG5xcdHzRriZE+DlXd+97zY8xo8g6nyvW6BGBdE5doZArXXfjRyM50iB7uvuRs2dzu468r4RgPjZzbDdAvOM+FEi2wVJ4LEa4gdQFB/x43qMtIgIQgrgWQ90rGMd61jHHp/9ArPVAQOjxm26AAAAAElFTkSuQmCC"},animations:qn()},Sl.skeleton={name:"Skeleton",behavior:Vn(),entity:Nn(),model:Pn(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAABblBMVEUAAAAzMzM+Pj5mZmZHR0d+fX5mZmYjIyNfXl8MDAxJR0dbW1tYWFhPT08+Pj55eXmIiIhMTEwsLCwUFBRTU1NxcXFXV1crKiqMjIxzc3Nvb29YV1iBgYF8fHxhYGADAwMBAQF4eHiSkpKEhIR1dHViYmJkY2RaWVotLCw2NjYnJycrKysbGxubmppkZGROTk5JSUmAgIBBQUF+fn5vb28pKSkGBgZxcXGWlpaKiYqrq6upqaljY2NoZ2iEhIRbW1tVVVWJiIl5eXlsbGyioaGdnJ1/f39vb2+Tk5N9fX11dHWGhYalpaWMjIyAgIB6eXpubW5mZmZkZGSVlJVzc3M6OjqRkJGDgoOPj4+fn5+bmpuBgYF8fHxZWVmOjo6Ih4h3dnddXV2ko6ShoKGHhodgYGCZmJioqKinp6dfXl/AwMB7entOTk5XV1eXl5dpaWm2traLiotqaWpSUlKLi4uysrJAQECtra1DQ0O8vLzkWO+8AAAAN3RSTlMAiIjBiOnqQekX/umJiGzp56BBJenUlmDv6endwcGlBgP89/XZ1regkYRmTzH04tva2cPCvUIJOJc9TgAABxBJREFUaN7N2VWP20AQwHGXmZmZGXe39q6ZGWo7zGmvzPDtO27TSlVfq2z+Osn3dj/NzDkPEf5PWzZs2CKsTls2qNDKkPafan/qt1r9AVsJ0v6TT548EeFn7LAOfxJwFgWmaZh9zot7dEqEyTxbiAyYU4sjCW7HNMefDdM0gydPxvCYAIsfCZYFp/PixYvPJsbjFsbGV+DwIz349ce/vgPSGCY0Ads7eDaJuQokYbnhZk9i0JgmsK05TOnJGzwPGk+pqh1EheWGMTZbb3A7mOM3BghyoAQga4kgChGlHEA4DOfPnjwL3r34PhFhYTCc5xPwmJFNeYDMeUhKU/z+4sX3z3BL776Cp2VOzAghHqA5nhhmXWI8eff5yZ8Cx0WID+jZxDCei29yjJvzXtSOE7QAZZKw3ERRDJ6JmLxp/yGZ0Qea2A0pySSJA0j8/PkNaYvjhtQOmtv58OED1ZGtpxIn0DujbMPTmAMJQTbSAZRQXqCv7ww8gedzw2xATXqCAJRxAI2fi9D4zS/QBEB/0iVoNhKWm2G89p+BJRChwPgbBBxZFpabaXx7+gpIiyZzNPwDmslQT1hupPz49OlT97m46FkcLzxJJkOvFWG5EUK8V09jozVeiOJYcz2EqESlZj7KskEvp4Q4bmW0cfVrcV3LsrxkTRnRjAsIoVHk4HhY4+LXLVlQQmVFst+C5+PSQQX68nREYko9HW7p4/MFKPM09LanbN++dJDDvgHklQQiuKVvhmFBVNEtLZkpH7dvf7VdWG4Yl/TLT5IH5600oDhRXuluAvfz8RWQhOV2+DzGJmpIHy1CSN2OE0qVVymiAIK2XxWW3LajOBCNn6ReQ6KUZh9fZSh9rUBXtwlLby9uPxd/k6aEZrLy6pWkz4BzFzjLb1Pto3pB+oJeygD5uPaWrr3OevcFHm0ijlPFb+AV1KLfEFKU15KN9LfI7ViXuEwIQBg74Zt2EOCSFQ0H2chXB9VUvbBRWHoAGtQY1++ZVOUY58BBH0ZJl1WdjmXvEJYegPyIlTXB48NHDmGMUHeQyonmVi4dSTxAewbx6CWpaywGRw/nGBVOmHqR5jJPHmVcQEyNuqTEuTnG+fuyQG3DmU+1auDJa3SrsPwARGzdxyUJy5yQnOWtOa60KXY5gY53Xd+WEiskhIRwStCg0KIBtuQ1fbOw/I5rHetlpmufDIeEOC8BVFCNhThaSxEP0LG4wwZkOPwkBk6NMflU4kKPAFRJfEB7GPGn5CViQYAdqw+Le18Rn5GcH8jJ3e5LZOE2djTt5uUBIQCavnc5gTZNHewi5lcY46OXNEG46HfQkMHQeIGIg7vIx6d378X3zt64KVwkqew1IJpwA8Vvu/kV4czuh4Kgnt60AEUI8QNR3dsHvx84vI2QrpUUntcBkP2Bx4txAUL7jhw6fQOf705jrUAIxb6FbMoDdMz/CaJv48povcGogJDmxcxFdsrjw/W45oaaJL9OY7dlPG810xkOXWZVrk3lg8LyO6YVw7dyr5fptu8EolNZ3lCLmKUV2YwLaG9Y+lReyyi1mf9+nuOQdF6SfkdDkrTGY2V7cfCM2Tp4It+Hz406JD7r49BCHxKJB2j33rHokGGR5+qn3HlPiFNOWY37cNQ8QNDjQ3OHuEUZ9B3TbDvvc5z3S1w3oHSrwKMNZI4t5LJOR8WmmZc5hkrC6z0ES7vQNhy3q7LpwA9DVSVAAlDECQRt23krJ5046nxCsdpEHL4gIF0mHVRMWwgREoIoXIB2CLza1e8ghDy3IGRsDqLhywGA9NlBgVe78CetQB5RcTgWVWsItnjttcwX5L21B8SYtJ+r3tDzNF1RRtxuCECh5lGaDVtGP9TlIZm6ujKzNwucAlBdxYktSd06JCmAauymH9BtgVe7nJpFCECaRtRUzrz3mNHN67cJvNpIBr9BTk5lia7bfWgdB86/oMp18Fs5S9YLfNvZ6gMokSTGHPxhpiPuIDGYs6z3C2RLKwB6Fhi18lrKGCtXA2QYk1pZSyljapisBMjEfd2mdE5Uokt6tk7g28Z+G4fITjPDaNW6JCu8Qes1Kwybb+onxjOxkHorAHLZS1mWMtx+DiBJ531DDSiW5ZRiPBl7acL9qNdrkdqVR5SGecvwaKLzXtnGbkSsBsT8fstLZzJ3EPMBNAMQe9nVpbWVAEVSRqnqv9ToioA6UpZmhHS1tyuxMuZHEtSAdLoCoIqxLnjWCHEBJEm8Qetjt+pKs9cKIX5Hpxl/kDYsilFPUXzVZ/YKgDZGQ6TLPaXHoCTlv7KNpPL0kSTLFYB0iT9o96DSPJrKd4q4AtBsBCC+Hdh3zqMnjpxFSHPp6x73f/ufpCNnBcFDmjZSevwn9DtNc+ORMqPXhBXpnDYdSLK0OqAD+3ySyieunxFWpgNX/gfnBzuafkgSufE0AAAAAElFTkSuQmCC",animations:Ln(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJSSURBVGje5VhBjsIwDOz3+BDSXrkv176A04of9ANojzyhDyk7SINGXjuN2qYNFMlKmtDUnthjJ00z8mvbdoCcv88D+1YwF0nz7j8Y2HXdcP25PlsVAhC9+xEAqMERCLsB4HK5DPf7/dkSjF0AAGNhNEFQj/h4AGAkdh1Cg9HfdQjkckBq7u0AoOt7AHipcCxDVOXilt09tvfGUvNc11tf56sDwFP293Z7cQD5AGMpECwA0dzmAMC1Na15hkP6vn+FgEoEBNfl2p5grhoANL15ho6JJctcqaLUpWBXQGDW1Q+Hw1O42/qsKZLv2rNCZHwVJKmMzZ0/nU5u/GLcm4NgnJ7gZYboAFUFAF/H40tJGqrKc8et6H/wDo3XNcdkcwCsolG6S8W8kp+uhbXHpJp6gB7AtiTnMGws/wDE1HuqYxHFin5AKsu/XwOh8XxOAVBsg8jGUVui8FKD9dkrjIrrR1ckgdnnUmlXwyB1tC6unx50vDaHOzTNRbGsRmoa5G6iz6qRfRo6R79sAOylx5xSFQYoCOjn8Ir3zRL6/VOW53xUdop+jovpTtoDD9OlHfc8wIaCjun5wraLXXnpoUbz+VRe0VMf+2PvUQdvLQ0TbRchpRTTTuEArqulsRJaxAE8gVovnKNfdmEStVM9QG+TdCzHc2waTBHhInVAFF9TAZhDgvabGkJeu+h9wNbndc+tiwNgS+C1SuJUubuqfqn4X/vCwjMqtftV3CmCtSn2dkh31t4y2fe0wOHxG3Nvca2uKYs1hdYSOqapTcnWuzVeg4MeTnd5NL9NS2UAAAAASUVORK5CYII="}},Sl.slime={name:"Slime",behavior:Xn(),entity:em(),model:am(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFUSURBVGje7VaxCsJADL1ROjn5DX6Fi5ubq2NxEAeX4iT4Lc7ORXASHB38pUoOIiFc7zzOtpe7BkJLMr2Xy3tRyhHVs6xP771O/f8q9Rdyc13Wrr76MWbzaUNTxRLlbfUFQ8FhuvriCeBAASRO3kQE7/sCj44IBIcAaeLEbX0fAoqiiJcAChgmDDVKQFs/CQ3guw01fOauvngCcKfxmdNpa/V39JPQAP7UbVrg6wK2/e+FgFCf/8edAOAhRfp8aB/BD0ZCqM93fSdE7/Oh/V1VTET7fF93QrQ+39edEK3Pd30nRO/zXd8Jg8X6smh8UqUWAOr8OOg83rc6ESz8014WBMDXRADWkyQAJ28igJKQ9AugJCABdPpJr0AWIugLNDli+E5ztee77hJHcdpAd91EAN91W91EjGixM9mdrW66G8QRwAG1rYBtNUS5Q/YiOMYYY2QdHxXvoz3tkDSDAAAAAElFTkSuQmCC"}},Sl.sniffer={name:"Sniffer",behavior:om(),entity:nm(),model:sm(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAYAAADy1PuhAAAgAElEQVR4nO29aaxt53nf93uHNe3pDPfcgZeXIqmJli2jrmQjclMYqYEWsY0Qqd04iWugjezWHyL0w23BBm2ByGjzQS6QzwWaogEStw4KJnWCBE1qJA0q22lMOZBky5JIUSQvyTucaZ+995resR/etfc55w60bN9LXkp8gAuJZ89r/dcz/P/P8yz4wD6wP4GJ9/oLfDfbc1/47FQSfsEHfvOb/d/+Ep8nvNff6WHbBwB6BPbcC89PMxeuRyGux1E1Ez4E+v4l4HO/P/1H31VA+gBAD9Ge+8LzU8Hudbmor8uum937DBFijC8hvnuA9AGAHoKd9ThU5SxMxhACctUg+h6AWBSEyQjRdsi2CzF8dwDpAwD9CWzjcer2umy7WRiPiGVx+oQIclUjuo6oNWFrClJCjIimRTbdGY/06S/x+c+/74D0AYD+GHbO42g9Q0mEsYSqJI4qEKeHVawaZNuClGwAdtY7CYHfmgay7CWv+dw3V8+8r4D0AYD+CPbcFz47FYTrsjPXRdPMYlWB98i2gxjTk4Q4BRIglytEb9JjUhKmE0TXb0LbudeUZZCr1UsY+74JbR8A6Duw5154fqqkvh5n0+tIcW9yvA5JdwOpLJADeNbeJ9clcT4ndM0p0JxPoc659TuGiHyJrcnnfj987LH2SB8A6B3suReen6qd7evRh+tqsZoRwvkwFeNpuPIetViBcylhrooUppwjjCr0bIed6VWyrGS1/wbLk1uIrS22pk/QmiX94gCxXBFDQAhBHJWE0TggeMlHPve48kgfAOg+9twXPjtVzlwX8+V1hJjFyRi5WJ56FykJswlisUIweJc8R65WxKpEFhVVMaPu5tA06SXjCZe2n0WpjG41586N30dd2GV360mqYobtG+68/CVWR3OyIqd44iKxLBF9j6ibgBAv2Z3tz32zf7xypA8AdMaee+H5qdqaXY9SX0dwPlTFiKwbRNuB1ojdXVxwyLZDtj0xeADCbEI5u8ju9CoxRlZ3XmfVHaFmO2xPrtDcucHJrTexQjC69gQ7s6v41Qn14Vs4a2lPVuSjEgDTW6pxidjZSsl3ZPBI9nPf7H/1sfBIHwCItcdx18VyeV2EOPOzKWh1/kkxIo9PEN5Tbl1k68pHWLZH5FmFRnP42peJ3hGLnNHlZ5iN9lg1hzQ3X8X3BqMUemcL2bZ0tw5w1pPtzCiVIFhH8AGdZ7TLGtvbcx+tqpJyWqGFIOQ5wpjAY8IjfU8D6LkXnp+q6eR61Pl5j+McarEiak1UEtEbYlUiug5hPSEGpNKEqiCOKoQPyJMFhICvqvRcpSB45LLGLla0ixohBXlVUFQlwXvaZYv3DuL9v59Ukmo6xrQ9UkvKUXX3GQsx8p4C6XsSQJtyfJAcotaE6RjhAzhPXCfAZ0ttIBY57arFzVfoXFNOK6RSRClhqKCakxXeB7LZhFJLhBC0qwbTnL6XEIJ8lIDUNR2m6Ygh4jqPrhRiSMyFEIy2J+hMg5RErRHG3O8nhZjrl+xs611Ptr+nALQGjghcRzCTqxrRdhuZgRCQyxrhPVFKRAiniTMgx1Oml58lExn73/oay4Nb6EwjlcR0/ca7eO9p5isA8iox033TEXxEqnTIY4gIKYghYpYW36ccCgHZSKNHevBAI9SFXWJVUGQjtquLrA5u0LqakOlzlR5KB7Fcvqui7fcEgNaSwxo467+Lrkd0PWE2SRLD2rwHpSCEpF01LUJqdj/0A5Bl1N2cabXL8tZrHN34NrY/9QpCCBCC6AO2sdjGIbVElwqzsuhKA+BalwDkI1JLZC7xnUeVimACECl2CoQQiExTXL6A3ppSFTO2xpexruVw8SZEEPXAdp/auxbavqsBdLfkECZj0BqshUwnFnmZCLxY5OADIkbCqEI2LVEIWOdAMdKc1ESlyJ/YQ1Ulomnpbx9imm7zmTHGdFKFOAegYjtHIBAqaWHBh43n0ZVifHFCNa7oux7T9MQYUVox2hpjugTQYjoijkbI3hClJOYZsm4gBMJ0QlQK2TSEUYUwFhCBqnypm6/+6qu/8uJLj+IYf1cC6H6SgzB2oz2tCcBQlcQ8SwRgCJSzixS7l1n2x0yLHfqj23TLA4hxA4y+7eibDlXkVFWB94F2URNjxDXuPGCEOAWUFJucRmlF33SYpif4AAKkVoy30mMxxs3jUimqaYWsSmKmkZ2hnO4C0NXHhCJHdj0gCOOKmOeIvk/ibYy0Nw5wR6svv/3ib/7QozjW+lG86XtlG8nB++vEMINI2NkGGETMUfImZbGRD2Rz6vptV1N5uLT9LNb35E98hMmlp7nz2pdZ3dpHSoVUEiL4zrDqzDngECHfytCFHrzHBG9Tcq3zDNP1CJJ3KscVxaikXbXYdkiwtcLvbiOMpRSCYlRijAOZrvNsvMWFDz0DCISUzELgYHEDO+4QXY+sW1iuCMbR3prT+wTaXFePzFF8VwBoE6pcvC6km3F0nEpjAayaUxVcSkKWpTxFK8L2DJxHLVfgPc3xEcdv3yQbjVEXt/B1SzSWfG+byaULdMcnp/lO5DREKUk+y3GNw/cBXYB3nnq+pBxX6ElFLEvyTBOLnADIridUJWGVwl+WZ2ihGGXbeN9Q+yW9seRPXAKtiE2LP7zD0XKJGSXvpj3YbMi5ygKLoP/6G5ijxJqXu1co8vG57oCHbe9rAN0tOZBp/GwKIaSkWIgkcq5qqBu6zmAWK4oL29hFDcD44jZ4T9Qa/eRltNYUDbjmGOc9Xd9Tf+sNsjzDW3/64SKFpXySoSuNzjN86Ygxko9KynGJ6y1d3UJnGF0riTvbEFMrB0A53kZ8ZIxbrch7xcWPfJIoAlJqJhee4tarXx0+SxDHI/yoIi5r5PEcAA8oIXA6ozlY4d68kwqA4QsW+Yje1vS2eWTn4H0JoNNyPFyPSs/ihZ3kwpcr1NH8nOAZywJflYi2o9CK7NIFZN1QzMbpzYxNz6tKyDSZKtm6egWtP86yOUQ0B/iux7y9TwiJIY4+0p8YgguUWyXTC1tIpfCTEWbZ4BdLYoSszFG7W0QlUU0HTQshUs4uMPvQh5E6JxI5al5hfvQq+9LhJwUigKpbNAYWLnlQpZJi730q2QFOVjQ3jzEnDXE8SoXB0JsEkUV9hwjER5jqvq8A9NwLz09VkNejMdeRYiZ6QywKhLWpGoEkOTQttF3icrzH+IAEpBC4tieXknjmYIeyQNYtYbmii4JD8RZZOcE7i/IGkefkW2P6TNEtG5AglAAHprH0q55yViKcJ7+0C3vbiOMFBI/wnvHeU8yevMD8rZfplweYZsHq5DY1DYUowdWMt8ZE1xMpiTICIZ32EJDLxCnFTON3twnOp+T4RvI4schTmMoyMpFRTMfUh28SrU10hFQPOKJ/cntfAOi5L3x2mh0fXY/GXxfCz5ifnD5YN+ngDXE+KoXwPvXoeA8RQmcQShKVxLU98uplZJEzHV1gXO1wvLrFqNzCLVbcfvmr9MFTjA3Be5xxVJMKtCb6kHKrANEH8lme0qw7S0zfU14ryOoG2XbEEGiWDWImyH2PtwZvU74TnKHZfwMBmHhexxDBE/OcsLMF1iHrmphl6cGTFe3r+/Qmpt8XY6q6ioIiG2Nci1I53qakXHQ9cVw90nPzWAPobKjyW9uzobUh5TiDhVF12p/jPUJpimyMXNXYdkm1dQk5v01wKfkdaY05PEZqSa2OaYopfqLxzTI9/tGn8HcO6efLVGIDq+MlSiu64w7bOVQmCS4SrGd2dZu8zFO+c3MfqzXji6mSklIiipzeNqzEHDOrQCfAxLJEmH4DjrV0IjpD1Em6INOE7S2CsXTffBN7Z55+53i0+f2ZLhiNLiFEIkJj19HXc4IP2N6QlSWIR0dIP5YAOgscBLN1CI9lgS+LoWQ9DySArBhzYfZUkiDGIHWO62ta7Qmrk5RDAFIo/GhMyBT+zjHmrRV5lQNgO0sxKjZ61FpycMaRTTJUpfBtINvNkFoSfEAgyMqcrMgJZU4sS6KxBB+QRycI76hHA6M9aGbxLgY8jCuUcwlEShLHI0Jn6F69iVn1iFV9vpoyBkJAyQzXN2TlmDKf0nYdwQf6NbnZ98j+AWrtQ7DHDkAf/YmfKOKtg1flhdmeaPtUfmfD1xxK81gW+CJH9CYBqe0IVYnJHW+9+TuomJLd4AU6g743KCmRRYYuR1z82PfT+w7jOmZPfpKjgzeYv/YKfuBj2mXKp8zK4hqHUEmzysc5209uo7TGO5fUdGOI4xIhJOXsArbKMa5DZprR1jh5EyVRiyWxyInoBCIBiDPyiVKJQa4b4rKh+fbtU4+T6ZQkG5teG+OQKEO/OgIE40tP0c338aZN5OXanMP57yEP5NpWqP164g9O0OMCPS5S/pFpZNcT8+yc5ACAEMguhTff9wlwUuBLjdjdQixTGQ/QN0v2X/lSOplK0r31bUKRMd6Z4cuOZr46PQHD/0ol2X56h3yUJ/COKuRyhWx7gotIXXHxwz+I0DlEcKbmeP77SYBSKnmaNS8FYB1qsUQdHZ+GYMALSXvc4t64fSrixog0jnyyS6THuJOUOI+q1NwWkm62ag4Rrqeve/pVnwTZPMN0dtPs9ijssQPQ2qJS2NZisoLMOzKbyu1UeeX4yRipMrYuPENna1wwjMWI1Z03CK4nViXZaARSoLemsDXFLGu6t/cRMVCOK6SStJ2hGJU46+hWLTHEzYlWhQIS14NIJ1T5yCTbpqWjnFR0y5aT27fw3iF2pwBkdU/wQ8lfpNB4tpIW1qYTLwRonXKcl9/CHpwQyxLyDGETs12MtykmO6ktpOs2Am+cjE+PVYwwPBZDROr0YTrXePfowAOPM4BGJUoX6KygNzV+XiePVCYPhA8EGei6BVvTKwitMbbl4sd+mGZ+izvf+hr2zdtD158kSolUiunuFNcZurrdJMlmCF1mZXGtQ1eaYALBhQFEycJkDOMJ1dYlprvXaOa3Wdx8hRgDqIg4OgbAKnWKl3hv+IijCl8UcDSn/eqrSXIYcjpRNzCZgFQU1YyymBFjZFHvE+wgu5yZPXPGYY2lHJV0dY8zFpU/urL9bntsAbQ9uYKNllG5zb5piDFie4+RWfJI7gSkog8H3Ll9A4oCXxVkvcVpRXHpAvrwiO54gVn35NTdRpwsxlUSQUPEriwyV6hC4lrwQ2OXKiS2cfQnhmo2Buco8wlSKpbNPvX8TSBClqUwhUieRspUgq9q5Koh+HBu4DB0hu6Vt1KOA2eqKkEx3qEY77BqD88dj+Atvulw1lFMJ5u/J7E2sry9TCz4OCOvis1F8ajtsQPQa7zG1ZM9ppcc48kOMcbk8s+Y9elfHg06lwgpic6hjjt8niMHdy6LVBmtLS8L6pMVq+Pl5m9CCJACszAgoNwq2XpiGz+EtGyUgRe0ixrlPE5r6u4ErEVam3Jh51BH89PGNEgl+JrLWdXItsPlOc3+ckMAIuUm/wGQOhuUdpFY60LiVU9jlim59g8OR0ILdK7QZYZUkmJUpt8WI677HkqiAby3zG++SjGZMt57ClG3EANRny9HbWdxJwa1t4W6mPKPjf7VtHjvaRfNaVfgqiXcVfrHGAk2kI1TF6AQIomgk4rphS1CCEglhxaLHvPmbUY7U2SMSRjNq5SXDT046nCe/j6uEJ0BJXFVlcrxuk+tHWeGD4t8gjneT79PBBbNPtPqIsSIqef0zQmxKh4oRigtUVkJnPYkCSESUw7Y1hHs9xiAkkWsaTle3kQOeYToDcI6sr3L9Ot8IEb8/hxnPGpakTuzOUFKKYqqOJfvnDUhBNko3wAkiaAVFoESqWdI5AVYm9oinrhIlmfJO7TphMXxKJXYcG7uXR3NCS7QvH2UtKosgzPeEK2R4zFlPsHEO8NPCcTgWbWHhOBS/jR0HAIEF3Cd58z6htSTHe/P8zzo7w/THmMAidTkXjeEEJFS4IxFKsVsfJEQAyv3JrYb1qfEiKt7HJApyGRMAKkKsjLHdoa+t5RVQd90KdnMNOV0RLw6wSwb7MEx3geKa1eY7l5Fy5xFe8jO6BLNwZu0/cDlVCXReaJSp9Op6zJdSlxZ0N06wcxrxKo5U5KzqcailIQYWTb73D2W4YPF9ulCyLLs9DUhEmNKtM+GvrstxogzDmct0T9aED22AIrTMTEE6HrakxXVbEzwga7uOF7eZFrukukSe5/XWhfxJ0v01gj5xMXkFYBKScR8QVw1SWYQsDw4QfeOqswo97awnUEvFrStI0zGhCxSL+5gmyWQtDWkJBb5KYmZ50hj8CHS3Flg1x6H5KHEmoEe+JvNb4yBGCOm6cmKDHmmLzu4gAiB3nmKUYm3LjWnxZiqtaZNZXuM2O60J9t1lu6kTZWkTWX9o7THFkBAutKLnHi8JJ65Sp1pmR+/gjxzbOSqIYxKyLLUnpFp3LyGukc+sUemSMsPgNHTV9Nr6obgHN2ywXhHOa5SvhShOTnG10vKyxfoVicJAEWewoqQ52SVeLJMgur+PLW/5ilUiSHHsZ1NWpwQg0dK5N/agvdAdvpjjIEYCCGkAiHG1BcdQZfDKRtyOWcc3nl875GZJLiBmlglsEUXiOZ7iEh8hmcwanlKvJ3Rf6SSqeoZZtLPXVshIJw/d+UjO7AWt2xxQB49Opfpyh1V+LKAtsMvGiKCOMgjCMievJTCB5yrptTh8abaCsbR3jjEzmuEDxSjHfr6GIiJcJxdRghB5/bx1qX5LiJ92yMR6DznHosxfYczPy6GMHQ+CoQE0xmyItvodUTwJiC1ROUqhS0TCC4m8ITvsSS62hoT1HkyLFifGrQyjW37TV4TQ6QYp1nyIp/glML5+3MgtrO4hUGhUEUBSoLWTPa2iEonLmedBM9TvhOm440etQYSh3Pal9/CnDQwGlGWU4pRYob7+jjpVEFgfU/XL+jbFiVPL4QYYtK12pZY3pXLnGGOo4+4zhJ9IEaQgybng0MIgcrSMYpEQmOhVKBSBaZLhWsjUTxw8PWh2GMJICDFeu+Rq5bo0pRCjJGszDFtj+0MKtMpTyKxyeWWYnd2Fet6ls0hng4lM1Q+pjdDw1mI+DvH+IMT1IUpmUzOLo4G/ma9eaM3CSxnPGAwNjVy3TyCYWp1XF1AZwU+OFbNAevTFYKj6eaJ74kpe44hYnuTvnOMiVGv69PfHAJiUNNdY/E2pHJcQD5OpyqGmBr4x4Bg07R/dgBy3UGgRxpf3y9LfHj2WAIoEpHLmqAk0TrMsieb5ufKUqkkUkmywfs4YzmZ7xOrgunoAruzq6wc2GbB1vgSvnKs3JsYa4mTMaLtsL3HCUHmLeqMtpS+RBJsY4RgE3Ds0WootNRmUu9UshgqpHPvkRZPESPeOpyx50XV4Tm2duRlBMVmpCf4iMzSQOJdB4c48Dqut0QXsN2p1/LGE2wkG787p/axA9BrvMaV4x2q2ZjofRrmi6QD3Rm89UQfybdK1F1hDu+x9nRMR27aJSIxejJd4mWLKqf0UiFWK1AK1/W45hby6h56ttmkSjCO5sYBpjZpyiGfUGRj+tUxPaeN6sa1dP0CgBAC0QdUkZ/3CjEipaJbdGSVJjiPCYGszFNXh9h8VVznz4miZ9+DEIm9I5IGFYOPnJs7jQ/4/4/IHjsAAfjeDQcLfJtctFlaVC5RVcQsDKNZumLXFlxAG0s4mVPnY0blFpBKZR8cR4ubyK5HCbHxSPPuW8RhJDgqhVs0uKYnI2Bu3ksAFtlkmHI4DTur9pAoh2HFpqWvO3SeoQZhdO01dT6U6XFgh11AZgqzqjeVlWl7vPP3MscRTONQWpwHpY+bqusei2Bq+z1Yxr8G/RMO188pZxVucM8ql3gb8MYk93zXrJNtHFIosmmg7uY0/QLZGoJ3HJ68iahboog4HzhavM10dAExnuC1RC5r4rhie3qF1qzolnPM/BQkQgiKbJzGlV17LlRFAin2hDMjNaRQQ6Sr13sTT9EupCBGsEN+ogq5ET83SxbuthDxJm6IQdckL0WMhD7xUzFGgvHpv0f6XfFA8g9/yntjMQTak4ZiK139qtQUW0VSyTN1zvtsXnO29O17uramXTRDB5/BzleYusP5nuPl2/jFSWK7B3PBsTW+yPb0yuZvmS6YjS5R5lOMawn1atMNuLEQEOulUEIQY6AfOCelFUKeB7su1H1n/aKPqRzP5OY18QHdhNGF03xo8EK29WkxQ4iY2t33dQ/bHlsAZZN8aOQ6s3NZDESaAN9bYox47+lWbQoNXU+3aMC5tI6u6zl7GUol8euJjbpNGtd6tNl7Vs0hdXeyaVAHUDLDhxRSm25+D6ciOpO0KpeY4nJob3W9Z7W/SgyzUgMH9J2ZLlTKfyL3UdLTrH1ohvB0nxAVI+ACobX3ffxh2mMLIGBzFYb6/IHwxmM6s6HwnbEblT06h1isaBdNYni9Ry7SXJXOM4oqxx4voDe08xV9nTyFXNZJaojnQ0hvVrT9CT7YjXxwzoawlaYg7Ob7udalBBfIy/weL/Qgi4M3UYW6Z/VFtJ7YulNtrE1VGALkKDv9jBATeB6xDgaPYw50xoKP2NoO81jDOEwEW7s0uRDiPXHeG8/q9hJZCKJLgqo3FqXVhni0XY8TAp3rQUY4taZb0J1NYmMkNDUrbweSL24YYDu8rxzkhnJcpVYKORB5/R/CAIdI6BxxookuLWk4W2ENX+DMdwGkQFY6EYdnf/vZmHiGpo+wEJH/7Z2/yB/fHmsAAUR3HiRnL0rbG0xnCMPMuuv90N8T2b18AdP02N6kZrAhF3FmGKuJEV3mGwFzwzG5pC0FHxDjCsIwoNj1dHVDURVExLn3MiatjSkHTkpqibDn3Yd3/nTUZu1BIpsLw/eBGEBW2QY80QZC62CUnXsvhEBWGaFz94QokUlQkthagOij/XH7xsGX/giH/I9kj3UIO2szF/jzx0t+9s0jnnDu9PoMiYiLPk2ABxc3ibeQAqkk5bjCO7854Wvrlg3eDvnNfEVs+9T9uFgm5hsBeZYa42264vsmldpCCMpRmXipMycx+HDuc/plj3chtbWGRPDdHc6ijYTaEHt3D8kYY8Ss2eSzVcLZ94gQ+nQMzuWMwCSo+y5VfFj2WHqgOOhBAtgi8B9knh+YL3DWs2o8/3Frud10/MvLM25LiV8Z1ChDjTSqPP1JiaSTqFxDnSqiECIxBKrpiG7V0q3aoaxOkw1CqXtDwwPSl7QbyIIAXQlM29POO1QmUYUiGyv6VQ8CTJME0nMM8bB8yhy2g/SQ4WpDnJ56oXWlFXu3CWH3NRfS1/bpornoHE+tOnIX+I0/5nn4TuzxBFDtqGTHT0rHc51h1TsOu0AuBXJgX5+0nl84WvC2lPwDK9iPyc2fSwWEICuyTXhSmaaqik0z2XpH4VkPco54G9oq1jujbe3Q5ekGseBDkhz0IHJ6T+x9chSF2oCgXw6z6pvSPOIbR+zcJl/JdwdJpga7cmSjNN4scpWed9ZC4nsIERkj23XL8bhCuMBF73m27rg0VpzEyKMu5h87AP33s/jEm8KL7+stnfNYIZgWikmuUFJgXUArkToUXWSy6PkrWnJz6fgX+ZSDSv+h/JnOs3v+Vs1GSCFTXlUPpb1NqjfGciZd2QiYa8kBBL73eBOI1hOUSONBpU5VkhTnwpbrPBHQs5zgITTmXOK7ZquTbnY+JMUwKO+DXWo6ZosGnWX8oPLI3tP7gBCKvJBI5+GMXvuw7bEC0H8K5apuv/JUpoqjPrA7zdBDc3iIcZjDE8jhoGot2J5lCAFT4GP1ijfblv9ra3zPMesXBqU0nO2eiIkbyqsCpU8PxbrRPobUERB8oDlqzucgkY2M4E3Y/A0YvFpiomPvUOMckcmNt4sxpjW+WhIahxyl9SzBnWeyz/7/pxc1NtPcHBWbhwRQhEghBT9oDSMlz7TWg9aSolBw/OgQ9NgA6IW9vakN4b/SPSME7E4SeIwJNJ0nhLTqxnsoC8moSmHl7ur1Sef42TeOuH1Q89JHL3NTKZb7y7QUatWBiGnGK6ZBQqlF+u8zFnzyEmG07hwUeOvRpUrtFRG8DeTjDNu6+9IJ6Y0GHaxUBB/xncPej/jzIdEVw8eF1iIKvZmsEESuWk8v4GkH/0oXXHKOZ5oe2Tt6IckzibwrP8q1QD1iKug9B9Cf/sIL04/9g9+4bl5547oQYiZIHsC4wKoJ53g7JSXT8b0Ham1N6+n6gBDwERwf+/bbvIbiH6uM25lOWppNfcTzG8cICbZLS8FH25M0eVEVRBdoWaT+6ELjBkFX6lS0epPClcokukp7nTdeaLBUHfphicJAArqAuHtqNJIS5PJMWA2RaFxayiAF13rDqFRMJUgZ+fTRilkGPkacEFRKkd2l3DsfkSKtwHuU9p4C6KM/8RPF0Rsvv/q15/+9vdnhgmf/2Rfh5j7GBUqr6Ewg14Isk2gtKEtJ0wbyLB0UYyOjkdoUJmp9xQoIIaKU4Cnv+LmTjluZ5v/ZGnFzHnGtw1tPPstRlb5n/EVpBULgjU/NW3fZ2aeLsyforCcaEl1Z5e+85PIB3ku6wJVVx4daw4WpTrdTIK0XKmMgzzTeR5z1m999+paR3gSq4tGzNO8pgH7+T72evfj6hcnhHxxR71xm+fPPM71zxLP/7ItMbu6nlX8qHQTnIovlQNzZND08KtMMurEpsc60YDJW5NlZLUswrhSfyAQfaxvekpJ/4ktuqvMhsDmpUyIt5bA8U2Mbt7kdwdpsk/iWeFcbRfQxkXeCBJ6hvH+QxQiucUlyuMsurlourFounMnLMp0U/Lbz7G7nCJE8rpCQ5+8dnffuTeGfsfjSp7P/5rNP/uxnLof/8y9+rLmQycjXbkeM0SztCUd/+jMsn3uGCydzwtEKO0gLTedQMlVgmRZIJVg1jt4kb5Npec/VKIbqpm48xgZ2FXzKWfJVzxs74yHUpNzg8gMAABVdSURBVF4jPYzWRB/oFw1KSzbiZW1RY02wMZXqxqMmqbE9+rgBlRwNjWTDWLHIFEJCGCo2IVMPbQwgXODqwYJVkaVhNkBYz0fnK4iRSaEJAYpCMYzAs1w5RlVS862LBA/Tid5cCNbFFL6kwAdoevc/vdzZO4/qXL6rHii+9OnMOP0zxvMrQnBNKCnGmeev/rDhFz+z5O9+/TZ/67dX1G+X2MmM3/rpn9p4pOmtfapCbTySsRFzZu2utYHiPldi13k6ExiVCp1Jbq4Mryx7jnONkBB9Yq9jBLPqyEdn5j4FqFwhRcDHIadZn8kzJvOUl/WDNxG5Ah83rRjepKb4tcgpSk10nqqzbHeGXgqWhcIqxa5xaCHItCLLJHkGq9pRDJ9RDS2uzkeci2mfw92ia4C+DzHL5KNcEQ28SwA6BxzJtfXe2WxUoKvEFusY+SsfvsFfelrx924c86vf0NS3OkxVsvz559k+POa5f/Fb6NdukevTA6mVYFQplBK0nceYwHisN+V/WSryQnGntXx9f8VJ7ZiO9bl7q6zNe89yf7HpOb7nd7jkefDx/L4fIc7Nrd0NsHvep3OoGNlp0/TphVWLKDRPt5bCBSwp9I7K5Gmcjxgb8CEyGSVvY20gPJjxuhW9/1kL//M7fpGHYI8UQOeAo+U1hBK4MzFfaeR4hsgKwuKQYioogF/aPuDnv++Iv/uNC/zq1/c2QJr/Rz/FbP+IT/6/v025f4iWkclEI0UKUc5HxqNTcMQIt1vLN+cdnQ/piuVMzhBJe4ZaC9vJ80QT8MalLWhqIAAFyWt0D7453Pr9QmMQmXqw5ABcrjue6SzGOSxJkLw2byiGvCyTqfpaFwJZJjAmveXdXlbd50IQcPs3uu6Lf3E2W+p32OjxMOyRAOhu4IjRlhBFSew74moOQiLGM0ReEk1HmO+fv2qLisnWmF8qj/n55w7vAdJv/fRPsX14zL/92/+K6fIYN8R9HyJv9Yaj1rGtNTcaQzeEEesCzt7VTzwkx5sph6FX2a8sUYQkJ0CaKFUSCj0M6g25zVo1P/Pdy95RdYbjIn9gEv2ESR4oEwJkanLLpaAsFb1JF4L1gdxIRqWizBUxeNoz7SEhQK4TH+Z93OR+Tmaxy/P/lrqObZ7/+O7BwSOd63noAPrai594YtWq/6+oToGzPpJC5zDZJv0NwmIOzmzAhHfDLQoksV1C8IyzyC99cv8uILWs3JLjn/z3uXCy5Ll//pu4xW2OgidY0A6OraN1gb73961S1lQAkIjBzuFNuKcnOcaIH0aDhZJEPCJXGz5nMzEq0tqW7z9ZcbMqOF2hEU9/f4RdY9nSAuchVxI5xHMtJJkSWCEIMRBiyt/WYcyGgA1hs2jCnMn5OhsZSUFvAgs15STfeoPjA/7hwcGSR2wPHUDNQu99rW6u7VyYiCevBbLmgIXJ+Cf/8BUAfvJnfoDtIh1QOdvh7AFGZ8R2RWyWpAz39MoeZ2EDpL/zB7v8rd9acvi1fRajC9y4cpkfuPk21kb0wFZbE4Y5q9PvJsRp+BJ3ZZeu9ff1GGEYEV6Hp3tC2MBKxyE8FlIhRfJNcWg9laVm2vTsHSy4MtJMq4xlCGxNMhaNxQ6UQJ5LmmGIIA4zaU3nN3yOj9D2qSBYm3WRk2xGJWqsUCyjpraPdpjwrD2aEBbh6GDF8eGKV1+e869/8yYnbeplfv3lQ/6T/+yTXP3IlWEF/11ldzlO3khIQn0CfQs6Q2Q5sa0Zac9nn32Dv3Al8Hf+oOJvf1kTrKdp1wdeEGxEk5LQrvOo4V5d3nsyJeh7j9cKV9sNuwzcw+38YWYbt5mMiNYjgbKUXHKep13Pb6uCWdfz7OGSdlhDI1hPSt+Vy6j7x7sQ4ulFEKHvk1dyumCaB3oX6fOCN0XJsqxo7bvTyrq2R5tER7hzaLlxLLjdlPy1//wqP/6jU9Ro9M6v6xtiW6cke3sPpCZ2qa9ZCEE+HTHWlh/JDvhd5fgKMzItU57jI7kSyCCIwznJc4m1gTJXFIXagC34SPAeOcmIYej+W+dFxkP1zjRZPJNDSRt4qjNUuUQRkER+ZLXCNZZKKZwQ+AEJIbIJTQJBpdUDycC+DxS5wvkkwoYAJwvL0fQaQXUcZlMCEh/CI5ct7mfvShkvhnvGbO1IbjQjru1spRuexMiN1+a89MU3+PGf+jjbOyWxPiE6i9y6kEJasyK2h5tYZGzk915p+DdfPaZe9HiT4xozMLWCPJOUUaAjrM7EG6UkYlj533YedUY/FVLiF/36yyZS0KQBP7++mu+WKTqHLPTGgZbe83Rn0LOMmElyCYZIqyRlqWh9mkQNPpXgqlCDSByR4rRkv5/1xiMRdLMrlPU+fVR4qdgXWzjvccEgEPjgaW2/voH0u2LvCoCkiGyXKX84XnjmR7fIhef//sev8tbrJ6yM4l//5hv82T/3Uf7Mn/146goEIG5yIWMjv/ethq++0mBtwNqQRnzqQBQZ8xPD9laqfIpMkkVYnWmPyLRACHUaDkJij8XZ0CESCSiEIrQ9rk+l/FqmyHwgCoEbJiGicZAlOWV73UUpkgredB7bRzIp0EpQKrVJtHsTKAuFcxHvUlIsBHS9J8SIVzn99CLl4iY2K9OkiS5xecVcXqbLJ7gY0IAPARc81jki0YJ4kbx+9d04r/AuAEjIVFiV4szakhh588acf/N7c26tRjz5xIhf+MUrfPiZEbFvEKMJOEtYnWA6w++9MgDHRYLziachhTNdTFHlFOMjxyeG2TTDqcgoU+dWpZzvVEzk3N0mx2lO/X65kIiRHzpe8Y3tMRHBUkqwgV1j+aQzZD5gAOMimRKYPiDFesmUxDrJSCqsC5vV0cYkIOaZTNMmQ7J+ojOQGTMEb1QXudLs01c7GJmxEAHb1hRZjvOO1vbEiAXxYhfkC0dH37rxcM7cd2aPFkARPvWZpyAf8eWX3rqvi7Y+8pFnC2SZ4WeXkNIT5gcPBs5dLK83abV/HwJ1FPzuYcP3zwo+tX3aOWZMIGpJlp2y06sHscXvkEdkQvDveMNrMuNO5/hwY9jKBVUpaUMkxJgYYi+YjDXGBnqT2kumY40ZAGJCSIp58OSZ2iTQfeJ5fqeW6ouFd79ghZgZ3/NGuYXplzhnKFT6XbY3+BitQr9oUO86cNb20AFkTA06R2qNbTr0WPGZH3uaT3/mGrI9vqcM3iothfIcLz2Lby6ZhWPmC8dXBuAQI7Y1pwLlYMEFuhMwi47gNAH4srWMheDSEALN0KOTxMVINiQsWSYRnWfaGVZlTqgN26uW5SRPc+X23iRCkCqsTMHVtme39QggzzKMCbghl+m61BO9s3Xa37Mm+nKdiPgQI20X8DGF1rKQ+JSQxwi/+OrR7a88t+f/+jfL6XUf+usgZunBSOdaBFit8hc98YX9o9feE+Cs7aH3AVgDrjGY4b4Toe8Ii0N0SHcsjvWcaE8nTXIVkCKCd/j6hOOF42vfbhN41l9SSfSoQA63xDaNxfVpyC9ES9/1KOATSvFDWUYphmVOPqYKzCUCLoRI26VSPvOBT397nx99bZ9J0/Ph20dUJgE12ICMEWEc0XgEke3ebrr+FGy0tkwLfIgIBHpouSiHhDhtY4l0azF1bRGMOZ08Sd8rROBNHeM+wDcODpa3Dt7+5Yi5Fomfh7gATCT+mlD+I/tHb/3lo6O331PwwCOcC/N9Uq69cQRjiV2NWbZp27p37Fyo+MyPPc1sJCj1kBTY+4wwCYEqMqIPqWc4npKAugwgYuJflGKmJZaIG0JE16dmq7NBaU3aCZKOtN1ZPnX7GBkjhUlepXCeHzpYUPWOrVXH99045BOrjlwNybGLaC1O5QMbUQrK4b4amRL0NmAftBhhAFMpJZmUWKGxMvsvjuv6I/+0aW6efe7BwcHyYACStjx7cnLwl4+Ojt5z4Kzt4edAtcHnCttYnBSpUjrTH7MOYUpJPvNjT/OpzzzF8c2DB77d3bmPkIKs1Jgzkwku07z+g1d57lt3qDuLFCKV3wPfYkwqx5vWYwc9LC8klZRUSPqVpwZ++MYRizzj9UnJSAo+eZJuLxAAPbDBfR/QeiApTcpxlBbk2WkZnueSpvX4od3i7h09SgmqUcZJE7iV7dGqcaSI//KrHD6QQj5IssQjlyb+qPbwcyAssQn0c00+cwlIylFMkjhk2z41bmUQFodkRcWly2Ni3557n+ADvrf3JM0xxCF8rXt5BC5TNFXOt5+5yEeOFujO0XThXD7sYzxHtAkSG5xFQak1kxAY5YrSefYWNX474+jYogvFZKTpTWqniDGmm9dJQVUojuaG8UhtQtm6rcPYgCT9resDRRE2izY7WXCzuErIBS4EnLWbRQzvN3voAPrSb9ymnORcubJLPpX4TiK0gOEGM8F4XEj5RTYuiV2DH3YHquI08bx7L84aOOur2TaS6AVVjHyqqPlSE4mzkv72nLpx5DGp25CueLmePl2bGDxBJjmpU1jcnWmEkBwuzfqeyeQ6tVZUhaLt/elIzRlwrhu3QoyD+h/ZVgpDoN6wx47JVsl+tcdSjFjflswFn/498hHAR2MPPQe6fHmH4AWvvHybt15t6NuArUWaEbce21rc3X01Ma3xJcbkdQCVKXR5ukfZ9e40FMSkeSHgE2XHR1TLj9gDbN0mniWmtYF6UMmzTNzTQFbmaiAXxbkVvEomIvKsibu6/pxPifE72dFoD6VypqMMLzXz6WVeyZ5kKcf0zhFCwHhLa3qMszZ63p37Mz1ke+ge6NKlMRcuzWjanqY2HNxqyXLJbp5RhIhZKopZSoDNqkUqlTr6QiBYnxZHDbrPGkyQFkuFYSwnrb31NHM4ulMTO8eHhOB32cX0Hu8jhZYU+cD75Crd/sDfSywKUp7kfJpoVSrlN3cGaePuwNL7QBCgvTi3XP6stX3geDzmYHeXYDtcAb1zYG0iAIOnMd2GOX4vCMCHZQ8dQJMP57g6Ig5yRqOCICyLec/t13ryUjIZl2n7lujRpabv0ixlWjQ5LIzq7GZVy+ndkwXeACK1atz4ds38oKcsFBcuTdLYy8n9v9NZ79FUGReG//YiVVKTsaJuHU0b8B5UJrA+0npPFgTWyU3ZHgHvAj2prbYPnhB18ojD432UHHU1XrTE4OlsT64KlJSs+hqJtAj5vgbO2h4JE52NoXCO/kST55Irzxb0beDwLcfRYUO+kuw8kTwSpCZw17nN5vW0V9mnzaulxhtPvxA477lzc0VbG7oOLl4ac/HqDJSgXpqNsPmgbtK2zPjmUztcu3nErUnFlo1UvaPMT5lgJdMAoTGp47jpPMElYrAqJMthSZkZbnYb4HeMDR8iiktCirf3q63pK+iZ8JYQPdYZJBIXHEpmFuKLhuyFo8P3N3DW9oh4IEE2yhASdKHJRhnlSLG7O+bSU2Vq2n2t59a3e/o24HtJf6LwZ6YsiAlYtnF0teeNb5/wB185ZH5kmM4qnvvERS4/MSErI/k4onNFlmeUVbpj39o6rfBDX3OfqU1I6jJNI9UwMiQoc7mpmM7ZmRgmpSCXctPK2pnQ7bbdnwHxJRfDz114Yv7ssdq+FoifD9Et1q8L0dsY/a95wkAAfneABx6hFqYyRbHVI1VaqyK1xPUWlUmuTJJHOr5luf1aT5Y7plsFeRNx0mF7h7fhXKgSQnDx0pgLF0Z4H6hmEqEcUapNxaTztGjhjSdnZELw1HzJW1sjrs1rbm5VfGN7jIhwa1Jxe3eKur2k7TzTcfKUx63FecEknD8sMULbe8o85Wt2NGNHtIQYbpXgfuBg8ec+D4HbAN+wwC/v7e39Tciviyg+LpT/a48T+fcw7REBKLWpJhLxzIeVkWyU4U26696VZwtWB4LlSc+dm0tef63j6Y/PME3k7ddWnBydhqq9i2OUFqgsIHNBPhYEr9KN20zKS9afbDPF4c6I7a5fTxDh1GnWvCgLWmuxZ9b1Tsea/WWP85G6PfWEZamILk3GdjG1WwSpeUVfjsGF//BlFub/uM8RGIi/X36oh/UxtIdPJNY1eIXKNapQmyRYCEExTWRiEGFYRKnJ8sjFqyXWKb71tZ6vfemQt5dgg2DnwpitrVFa6ZJHVHa+b1lqSd9GmnnADhzN0d6EelLQFDlffvoSF49X3JmMOC7ST83KnDtTTVwaJjbDh5blMCuGSARmf6ZEjzFpVX0fCaOC+WSPNp/grSVI8WhnZt4H9tABpLvbL7vsyi+73l53xs30XUCCVHFJLdM/GYBAOVJ89GNXaJqe/o2GfFSmmahx+uc6t7nBiu3csIvQYztB9GdUejkseyo8Ugju7E7ZPanplUAIico0puvZOxphxhe5VbRcM7eZYhgpTas8Q78YlVZorZmrCpNVdPkkMdrvNPT+PWaP7Eh88Qt709bp6zGK6whxXyAB2Dqp67qMCJnTHQW+8XaP15F8eu9orrd+s0rFdtB3ggC2qf0/+jV/7fm9o6U8EWpxUmTbZXm60NL2Fu88xaigW7WM3hJMxZitaoxWisq3zA7fQAjJ6+UO20evsxrt0lTbBCGH1lGPIJGTtemic/xbt49f/eqjOobvB3vkl9J3CqTg0h33iPCVr68wIc2ln33cGT+w1gLXS7rOWRAvhiq88Ku3ZvudnB6N2u5nD0T2wzKGvy5IgBFCrG8NaZSWeXhlRWYlVTZhUoxSX4/OcMGjBIS+QdmGtpjgQ0BLRW8tNrhzraNe1b94+/btR7hA7vG3d80Xf6dAAvjaqy2b+b4Ipj1dqh092EZaEC82vX3hb/z6UN0880y5c0UfIcKf8jH/aQGfD12PLhXFqCC48OvWmP+RKH5dfru9LgP/A3Btu9wVSiqMs0Q8VV4iYqDpW5wPFFkOxLtaR8X7ngB8WPaubef4d//rVJV88Qt7f7N1+vo75UhSyXQ3v7WdVnI2Sl6M0r3w3/3afcriGMECuZhHH0JwIcao/oZp+r8UiC/NS/+lPVs8e3DnrSXwv+/tXf0ZF/yvtLa95qMTSihWqxXO9WiRoaR+bFpHH1d7z7LBd/JIX3+9pzXhbNiywIsyhBf+y//1AXzKM8+UO5fkP7Va/IXVb31rf/ZDH/9hZ1ua37/xOzs/+rGfO64Xv85X7g03n+bT2Zt7hz8TsL8CXAOEdakzUSA2raOPQ/ff42jveTlxPyB94y3DauW+M+CcN8E77894J8v29q7+jED8irX95Qh/X6nwwncrAfiw7D0H0NrOAukbb/myM+Hv/xGA8zAt29vb2zs4OLj5hz/1A3vs7Itf2Jv+L5/bu/pef48P7AP7wN4F+/8BbHUwAK9rsjMAAAAASUVORK5CYII=",textures:{default:"data:image/png;base64,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"},animations:Am()},Sl.snow_golem={name:"Snow Golem",behavior:dm(),entity:um(),model:hm(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:_m()},Sl.spider={name:"Spider",behavior:vm(),entity:wm(),model:Xe(),thumbnail:"data:image/png;base64,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",animations:et(),textures:{default:"data:image/png;base64,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"}},Sl.squid={name:"Squid",behavior:km(),entity:Qm(),model:Im(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAHJSURBVGje7Zg9TsQwEIV9BhZptS0NRwCJhgvQIMotaCiRtqSk5ARInDZoLE30NBr/jD3Z4CUjPSXKzjqeL479nBCMcXV7N6FuHp5myd8aFRqltuMesmjS/fPbLA0IXX98/YjCcxRdHw4AF/3y/jkLIXBnuMDT4TBRyCO30wggO6IWAyCLP339RCEEBEDxvd9HUeEoujYkAHzyCIKO8hXgQul4DGEWQyFIwwDQhr4UPNF4zkNeAuDXYDgAueI1ANrTZwDDvQItAHgEaACGGwG5OYCLRwBUnJwDcAIcbg4oLYPaKoDLIBWMR/YGwwHQjJAsXhohaYbwf6sA8L7hCla4G8B0yWoa0jisNW9fGv7nzncDIG8mb4odRNdX2gtg+z35qf64AEi5u1QH0ftrkvmlZbMn3w1A6anWdlAaIR4xlvYt+S4ASsWkCqp1gqV8uXmy5HcDaLG2u911NDEyj4J+swLoyV8FAIcGgN3dRQP4Q/lZo3R2APhVaBgAnpOaFwDDKuMDwLK9TeWnvgm2rDKG/vgAyHUy5QNSxqnX2Bjb9wPQYlVrrfOC7fsBaNms5FTa3NTkV7TvC8Ba0BL5KSVy+gBsscUW/zp+AYIqBnxKiWVbAAAAAElFTkSuQmCC"},animations:Dm()},Sl.strider={name:"Strider",rideable:!0,behavior:zm(),entity:Um(),model:jm(),thumbnail:"data:image/png;base64,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",animations:Om(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACACAYAAAC7gW9qAAAAAXNSR0IArs4c6QAACfRJREFUeJztm01sG8cVx/+kdvkpkuJaYWVFsp1IUSU5thXFcaMe5AZ1UV+MAimCBOgh9yZAg16KtECAHmy4QJtDEBQw0EsLBLBR1E3RSwoLcCygcG3DihAnluqPRLYZR1HopUhaXPFL7GH9RjPL5YfMJWWr8wMM7c7MLue9mffmzZu1C01yenKyTNfXkikAwFA0UtGuWt2lpXsAgEyxIJSHFBUAMBPrxjN3v654X0hRcTW9jH/c/crVTP/dzTzMY6wWatZ7OzrQ7w+w+3OjzwEwBbcKz5fbCU+MhrsesrfrKE2/AcDhv/wW7x15C0PRSFVFxDxe4f7g1U8AmCPJK+BOdqXmb/UHggBMBdEsaQZHZsB7R95Cvz+AiMdTs53fV7vD9YRvtM1GaFoBf+/ZiaFopK5wVF/PVNpN0wrQNI3Zcyqfh9+nIuLxNCyonf23E8ecIM+Xy2nbcjulXO/dzq7JvmvRSJuN4LgCSEg7k/D7VKGc2pISNsMHNL0KkDcn/D4VWG32rdV5ZGeAsVqoOfp2NNqO55FbBXgaFcjqC2oFO62maQVcS6agZ1cF4SMeT9WYwFgtwFgrsXpeeH56V5vqj5wJ/Og3ryKRywlli+na0zSRyyGVz9vW9QeCTEi65v85TUuWQcBcCqvFAkPRCM6NPsfih0bhl0ynaHoVuPXHjyp2eLQS2PmEi+MHhHvaC1BcT4ERv0eg62fufu1I/M/jyGaI4O2erlP5PCIeD/vLo+s6AgD6/P7151Sl7jWRKhSb7rPywYGJMl/w0a5BocHhhRvC/fAvjwAAzhw9hX5/QFj6yK6N1YIw+lSeyueh6zorj8xcwLPatqqd+yydxrPhcNX6uHEPl08eK3/y+w/hd3cAAO4YWcQNAxM277XWGWsluP60/4CggNnlZbOz498DABz84r+s7qmuMC598y0AoNu7vr31uztgrJXYNUFl1jb0GxPaNqENTyKXQ9wwEFJUxHxe5EoleDs6EFIUZIpFhBSlok+AmXe4ef8+Bjo7WRk9myuVEDcMYca5ju/ZJyiAiBsGAHN68tcvfOcJAMClb75Ft9eLRC4n/OUFtiqhGvyzJDj9Hi8YLwj9tdYDpmmQ0nhShSLzN2RSVRVgffBqepnd9weCzBnFfF42GvWgkaO/iVyOdcoK38la/QIq/QONslVJfB3hent4d7naD1kb14NGkZ/uVnjhG31nplisGPW4YeBOdoXFBjQgEVWpOgMAUWlxw4DrzcGhcjVt09SuBtko/yxvBnbw7+NHv9pyeCe7gtFwl+AH7ASzClltUKmO/rqO79lXtk4lu2lpXX8zxQJzNFYT4B0hj92soNHl8XaYz+dKpap9qWceVnjBgXVZFf4GWHd+9EP8qPCai6iKIHg1oXnsVoiQolQogL+PqIqtn7FTHAlqh53wgE0g1Of3C9PY+kP8w1rAJwQ81tDX71NZTMDX+X0qejxB9hz/G3ZTPFcqselvx9loF15Kmk6aTIVXBD9wqUJRMBHX8T37yna23AjkJH81exmuDgUfHJhgAgKoUA4p4mcXz6NcKuJ3Y89v2NESteycsFOmdRawZbCRF9rR7fUyr08zwi7s5UNiPbvKnqF1n1cCeXiClt1MsWCrLH60BzqDFY77/L0EJrZ12yqBSczbCF/Gd6g/EBQ6wJY9nwo/VPz5xs16+gIAvD44AAAwsqWKVYN8kHXrS76I73y1OMDKO+++gTNHT1XIlSoUzTiAb8y/7PORvevlMxcAiB642+uFFvAxwXkF8aNqvabRfX1wAHp2lY0Yb6cxX+VyWm/5exhqRoJno+tnb7GeHdg996nQ0W6vF/+8+xX6A0GMdZltaWrbrQr8MpjI5XD+XgJHep9sOCiSSJyn4mz9J71PCiaxOijmB/41fa6p8/hHjQr3afW+F5I6kukMACAaDrWnVzZkF86WA7teclz5jqbEWkF24WwZAFohPNCgAjZj5ElwoHXCAxDjAD5mJqzBkXVn9v6Na0117vTkZFl9QkPvK2a2eOTFCVbXSsEJYQY0Gg5bP2tphpenp00h//ahI+/bKLYHI5+P7EW31yuEqVfTyywtttkfNTgJU8BMzNwskNDnnv6u0PCdd99oY7faB1PA+FJC3OtrGhK5HCs7c/SUI5+l1ePyyWN1k7ROUuEDeKfX7fXi5v0VVgdUHlk5BQn+/Gu/bmugJSggvnccmqah7+Mps6AziPjecSwt3sb4UgKAaP9O+ILTk5PlnT8/DKD9wgOAMqW6caiwhplYN2JcxUBnEFf2TwDcUVa1z1ab4eXpaRempx1950ZwHyqsCQW6rmOgM8iueWgWOH1CWw8+KHIaZgLjSwlMJXVoUQ0ncmZWZhjAcmYZelIHzRTAnPrsrP7GtZZ0rF2RIFPAlOrG8MiYUDk/NwsAGB4Zw3JmGfjyC8c7wEeCd/96Eb2vHGDRYDsiQdePJw+WPcEwFuML0KIaqxgeHYOu65ifm2UK4NvoSdM8Ll258lhvjxUAyK+kkUxnkExnEA2HMDwyxuxfi2rm6G9RFMAcTdrxaVENmvZglB8oIb8ifvp689YtDOzc2c5+tgy3ntQxPDLG7N8TrP5FRjKdEZTVDlodGSqU7QEg+AAencsKkZm0El7oVgdHSiadEgq6Qma8z8cAJHwmnUIoHAGvtGahSJBWAGIzokLJ/yOPRVq8VRlh4BFPi7c6IwwAytvDu4WCelvcNweHhPv3m9wLWJOiADD6/YMor5kfV7Y6HH7otLhTidHNTooqAASb58//U4Uifgq3kCXKPGjPCf9YL1c1P5e3+2iCaHdOoFW4+XQ3AJYO5z+OsGOrpMbdQGXKm1LilCKnlPlWxD0a7mLfz0RU8xNW2g1SGaXCtiJuYD3lnSoUhdOgm/dXKnwAb/tbwQ8IJ0PxveMAgMDHU+j7dAbZHxxiZYTTafHNxm217yv7J1hWmKA2U2rL/o/VpuG22jdtgwc6gxVpcT6FvhWmP/DABKZUN/SkznJ/J3IGTuQMLC3exvzcrOAEr/dux/Xe7W2Z/u04J1QAoKdvF7pCXZifm8Ui1jNDsZ4diPXswNTcLKwHKK3k8slj5ZEXJ9rzgcSU6kYPVzA8MgZN0zB/dRZLi7dZ+WdPPY38Spqlw506GOEzQj/8wy9YeTuEBwDXC3v2lHv6dgEws7+xnh2scn5ulm2FKQtMCqBZ8rh/NsfOBXgoEOKTpPqDYzMq2yqpcXetBCelyCltTqMPmFtk/t5pWnkgyqMA5mhGwyHbtDhflkxnKu6dph1ZIB43pcV5YWj9pxQ5kUmnoCd14ZygWU5PTpYvnzxWNm7/u5xdOFue+8/5tgkvkUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUi2Hv8Dk1keJbQJB5oAAAAASUVORK5CYII=",saddled:"data:image/png;base64,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",suffocated_saddled:"data:image/png;base64,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",suffocated:"data:image/png;base64,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"}},Sl.tadpole={name:"Tadpole",behavior:Ym(),entity:qm(),model:Vm(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAALhJREFUOI3tkSEOwkAQRV9J14waRYKq6AEQVQiCrkBxhJ6OE2BwnACDQ9QsBjE1ayoWQbYpIQ2WEJ6ZTObPT/5MxoimrqKZoaq0bYtzjr7vOV7uGRPk40ZEhpqWnXNTuwDMxs3+cEJEhloUxWA6abBblbGpqzgX4nhwOl9foiXdW4QQAgDrZYmq4r1nu6kwM8yMrusASLrvI6uXiygiqOpwMO89IQQO59vk+xJ5EiUjeOb9dP0/P8UDt5NFZhNYePMAAAAASUVORK5CYII="},animations:Nm()},Sl.turtle={name:"Turtle",aliases:"tortoise",behavior:Pm(),entity:Lm(),model:Xm(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:es()},Sl.vex={name:"Vex",behavior:as(),entity:os(),model:ns(),thumbnail:"data:image/png;base64,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",animations:ss(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANVSURBVHja7Zk9ixYxFIXfP+sPsFGwFEHExk4rQdhWaxFs10YQsVIQbLWTbbYQXrkLZ3g83mTe2fnancmFSzLJTCbn3I9kModDj9x7+vIY+uDZWae8vnP/cVUPA6VvvLHjD5YMNEnZHQHuEbsgwEOAuhsPKHnC2AneffT8n/F0rba45j0lQ4Q+fPHmOJsHEDjLsQQQOAkgeJKSzYE6OQGa4FwECKDGIxF9BPBetc1CQI39KQigF9SUwDPw1yKgFlMxcMTVk1dvO9V1lKGl52rxyv6MAA+JILJGAOvXdnFOjJPPQJOQ0rNZ2GQkEIS8JurxHrZnoeFEjSYgm6AmRdChavfns3qJiMzt+b4a0FKumCQESjs9Bx+aLY19eaNEAMeVF9AIDAleT0ZAKQTOv/46/vj5uyMg6tHGEBhCAPvp4qyzJCk0SpYoJ9/pKe4Z+2yrhUAt/n0n6TmgRIDfN5qAmtVC6QFRsq5VoAa6NK7q2dLpwEt9ygOjtsYl66tdlhdwgs88oM+jvG/o3r+PrMPa4sumh83YjRPDLwg8e/fpanyVqxOQgeb1FATEWPKgG0mAb5amJkDW13tIwo0kgG1TEqBlelUCGJMCqdWjlgtqnkLVXkFbY3+ehKhfxMzydXgKATERgiUhmQqsllmSxr2IgDmZpT3LagTwQ0Z1J8CBBUlaZh2cg8yIcRJmOyA5lQCVNesTXGmfIdemi/vXKV3fvWVRAjgBT368j6c8JEAgSYCfCPmY/KZgiKhvkUPTbGnSNtXjlVYkCVk/7yEBGVAndFUCStnaXZWnOwSbbaXd/RlaPs7iBPCFHvPqU7uO2fitkS1hntxIgFucOUIJcrFVwIG4S/vkS3+YSAABOFgnwJMkn18kCWbnAf6ZTAAlAvynCAF7EmQIsN0JWMQDPEuXfqJ6fDtgH0dJ9PX7j1dgogw9//zt+OHL907Vp5J9oYv+PK2B8sNN/+2VuXWogBNgLJMq1d8RhL5FCNiNaJ/OY7GLyz//abTfSoA1QNKsjWeF0k1ZuQR8E4BP9QgHrnKz8V6zuDzl1sb6qdbvs/ZmSZDlBbrm7tEe928WvAioJc3Nuf6mk9tQ6+9KGvi9gm/SpEmTJk2aNGnSpEmTJk2aNGnSZF/yF+bcUS/MNQYnAAAAAElFTkSuQmCC",charging:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAATCSURBVHja7Zm9ihRBFIXnSXwGc5P1DcQnEMHABYVFVBANdAWRZUVQ0EgQJlRDEWHDXQ0UEQ1UEEwEFQwWEwOhndP2Kc6cqa6enpnt3XYquFR3VXdNn6/uvfUzg5WVlUHKLmw8KGCXbg+D6f2pizeS1tS/W1N/bsdPnEn2VxRF0ho/KCZaoSwdAPeIpQDgIaC2NB6wdX4jeACu6QnzAli7fm/Ms3jPuo3DRwt9pm4gtq7cLa7dfwJrFD2TB0A0hbNchAeocAXAawXg4fjo2Gqo2z69XkJ4eujIYgHwA1V4+WOVRyzCAygefbJv1OE6BQBtfIYw9gQAxfIDYaxfBAD1Avavo6+Q8B16TwiE0xrAWBxVbq6k4Vaw7c3hP8MHbg5DfSweY2uHunYHAMNo0nAPkLhW19eQAQR6zai9HQD9GI31EFsilqMTYGxOTo+x6TIGQ5+ncHoNPYElYeC7FAzfRb2EymwA1L0JgR2XbsbRrwCw3t93D4qV2q4urhDwG3UANAQ8V6xevjV/CCgECi3drPKCsTrLC6mlcxMAig+CR7/Ha9TzeT6nIUCPmQtAbDQxEjsffxRfvu+GqQbXqKNX6BphGgDaTkEKAYIUhIaGzjzMF5osZwIQi9Hg7pXoUG6Ot3nYpDZOqc2UJjuK1tF2SLz3maI1gNSouQeg1OsyOVrYxDZOdTNAbCWpmT9mDkA9BDYTgIllpcwEHHUKHxM/Mg+bpiWrt7Vd+7vhN+cFMGaoxGIiZt9+7gare+bmw2flmlxLXsOaBLGfs1fvDE6eW58w9gMDwOHzN2X/LPFtrTZDFK4vtAWA93kdE633TQBioh0A+qIHzQ2g7faxaWnrotWmATBt/xDP31EIBwIAcoML58cuEgBsbgBtEkbMNCYpEpmZwrmUdhgpT1HjWgHPsoyZPkcwKPcFAJfOrAMQva+DwGlWEyhdXYU5THqD97lvAFDq8tmBaAzzGpA4zbo4FxkD4xB4vy8AdMXIcIh5gIrzdYa7trq4gtbQiHlLpwD0A3z3yDM7egQ3UgqApzwKgEtcH2EC0D2Fhgjb9hyAU9c8UMY+zw8qGLq1VggltKpOofpxmOcC9xL3rM4BxGJexfMUybfWzBvc8/sS2t0fS2oH4KHQGQD+ID8+lsRYjw/HvR/CxODUAfAR1xzBBNnZLMDNTd10pKe3FO7Hbw4gHMVVGzIV6wA8SeoCqZMk6FtpjrCKJADuHmPnjzxu1x0poXkS1BDQegfQiQd4lo79iUoIemCiB5oawzqqCJvHW69KMShhO28/FS/efQ7GNpbaBussB8T+2qIoAtB/gPQ80F1Z36VwFYhpkiXbAyBp6wTANObb6lhb03t79W1TP8h1uh6L/fr9Z8JQjx1Z10LmBpASRIvV6Vkh7cPX3QMntBEARi02ynXC9blR20CttwBUREo4yz4JbZUDUiNOT0FdHYD3L1/3G0BstD2xsc2Fw9ZWz/QXAEeeousAEELlLUF8rz1Axas3pKbG6r0x0b0FQPEQpMkRsQ5z10Ydk2bvc4CPPgU7ANp/B0BjPSY2bH4idb2fBdT1FUByF5ho7/00uEyWAWQAGUAGkAFkABlABpABZAAZQAaQAWQAGUAGkAEsm/0FJ2PKpXRyvz8AAAAASUVORK5CYII="}},Sl.villager={name:"Villager",behavior:As(),entity:ds(),model:us(),thumbnail:"data:image/png;base64,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",animations:hs(),textures:{base:fs,base2:fs,base3:fs,base4:fs,base5:fs,base6:fs,desert:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARVSURBVHhe7Zq9rtRWFIWHgkgUKaKQDglFREkTCaQUNKkiOhKJKkWUhjcA8QQ0SZeC7ja8AW9ABGUaaiQaGp4gBSiVk+Xos9as2bZn7h2ubUzxXZ+zf4732scztgc2TdMM8urJvebNn783f784ad69ftYhm3wZvzRKo4P4bABNyPilURodxGu3/zr5pUXC1QDZM35plEbHG/Dy5wvN8x8+aZuAPeOXRml0ECre3r/YomasqgFc7hUZvzRKoyOR/sUHq2lAdQukAR/EXUAigF1FnD7rIn1jfs0T93tMFnTetA86+0LRle+0ZEHnzYZ7+1RkQefN5A3Qs0Uf3HbHqHL3ZfP45sVmSvRgNURVtFPlHELbAF0KQ8fvvvqsJONOcxQqZKrjzmdibZTGNVEa10RpXBOlcU2UxjVRGo/BF99/3QxRPRRV5LrHpjQeg0q0U4mtyHWPzY7h0rXLzRAZ3wdC++yV2IrMT67+9E1z49dvWzQ+NH/HUIl2Mr6Pjw342IDzaYDWknCh8aG/N4wKHoMfSRIVj9hEvioHVHjmyCaf2xA+dAV4vBhswKfXr5R4TJKFUyhQJLivihf8ZOY52FwM/qM0ALGZMNYEigZOLGEUTYEayyYfcZ4LiqmQT6+w/ntA/jjCuqB45701gN30k3vxTx/e7sYeQx7rgOcK7MqREK2nBmiO8KoBiiN+tAGI5tLyJrhoRydxEd4EjRGguY7pJ6eyO/iJJUZr8jM9MRXk7DSAHU7xVROqRlSFeiHYGWdBfXnpyzz8NFhzxkK+KufMDfAmaEyRjp8QdAmmbd/cPshBdP6jDQ1w9mqAf6tWDXAkTFQnw9fndzzWxYFsrDPUBJAtzyF2GuC7KRCcwolLvJgsSvi88iUqMoW6LQWclfbPyd2bneC+K0Axj+7e+S/8/3ihsRcPCGQnfFc4iipXIofQOY9J+wcxwNztPn5w68tGaExhKcSFJ5V4FzkENRyLTsxpqYoEGuEcIrYiBZyV0jhn1AQ90OjI94Lbxvy53tZkCYwJHPPneluTJeBiBCKrBlT+XG9rsgT0HaJ3AL48JTBtQ/5cb2syRxDi6KVHR3bXbRXafR2f/fFjF4+tPOmcQIQjsbqj0ACNV9MAxOooMWqC2zJeIFbxaoLbypPOCUSAHqT0edaRBrgt48WiG/C+KY1rojSuidK4JkrjmiiNa6I0romN7p+ghwnnn98+L8k4X2OMLGBq2v8sOEQKqGIOIQuYmq0rAHKHj7HzkAVMTfebHi8WFekj2W1VPo+iIBu5c6F91h4SL+SvRGiMnRheUrAn5M6FTgRvUlXxEie/8GT5sNNE5hoDcXpZ8fw5sCUCwWmTCN60PJk4fzPzXIcYz58DW1dAX9Hy9+2e7KAG6Ojr4WOdzJ+adhezCRSNj3EmC4/XmCakTfl9a0xJ1wCa4MgmARpnoqMYUKwEO75m5k5NdyvTxJug+T7igTjW8zV9Pi+azb/5zOjvAwqQCQAAAABJRU5ErkJggg==",jungle:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASHSURBVHhe5ZnPilxFGMVnJ5KtCAkJ/iWDJCIJonGRBBcuRCQLCYoBN8GVmwQh4saFCLp1I+YB3LiMZK8P4Iv4EldOhV9z7unv3u6emUzfoRa/qapTX9Wtc7q6e5I5GIaha0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0rxJHj74suDmNJvHL42S657XpTiSXBmA7h8/qVhjqyf4rQC+Pfxe8PDuxeH//6+3bj5xvnG1POTNaEy7WT9FFMHQK9MO7luCgWAefHplUujELI+WRMq007WT3FaAbh53QQFAAoh65M1oTLtZP0UpxmA34Kv3n19FELWJ82wDoRBDgg5n2R9kg+sanbBX23M59uAeXSvyfOsAhD0bx6+0nCNfsLcFPnAqmYX3JTaP7+/tuqnaebUMpfnWTsQ5gkgcdPbBODXUNezqtmVn7652syo1Z5u1OeoFQpFLWeBMoD7t65NBrArCoD2JALQB5uM8EnPWHv7mHr6rCkDyFeyugVek3NT6IE6GIejX9Vuy8+/fLfaRzz564/RmBByHfrGANR3g8xlTWqJDsOr7kjjVhwVhSAzmPe2CuDBw3urdi0Amfj9y49aAX03xlxVo1Zm9EA3qzH91AkAzcmDTyEj2oPbQCDSNdac6thvNgCZUAdT9LXA59Ri2jXVcXgerpY+Y7WqEZXuazi419JHp97X5Vh17AU6szMaHAU25mEVmNhUV8Ea2nz+cTn48K1XB6FPfvjhzq2G+sx7nc8TgB80Neeo866liePQAuA6g8yplUE01alVrXShvh9sjjmTc1T1nOkkWN2Ao8Kh5swx51R1wHxVnwaOSykKfrNKnd+6Uj8t+DyZIsPLIHO/0cBZagCYAox5CPoWQKOGcHK/0cB5cO/yYm+AjHgIbpKvQPqp536jgXMW3gIyRxiMZRQqLfcbDZylBIBJx0PAPGbnajXmtjBXPlTMBaC3R+rPCw7rh+bV1NhfXUxmvev+dhHNqAypTeZugDO1viL32wQHBzecYzSnMo/eAvD/XXGk6d/QeSBpWZ9jBeJj13K/TXBgSLMykZozFQBz7QbkIcXUVZemuaz3fTIQ13K/fdMMcThaGaxefdCcvxW0xsOASsu99k0z4+jQIgsT6nK9IBxMq78p1H1RiselCmabUPdBKfZEKfZEKVZ88MkLg/j40ZvD/afXG+pnnaBum9p9sybkocWNL841CEF9atR3c7lWUKe11C2F8pV1A27+10fXG1rIOuZZzxrVPf3x/dayVi0PXgrNSJrQxGcXXhy+fufcoFaf4hhypAHr1Vc9X4XeLvGboP1ws0xo/M+3h03XWKb0nS6DfL/zF1qhQPyPk1kjnb2XRPuRZoXC+O3zC6MAZMIN8soyFh4KaC37Lo32I82iAZpfbRlTX1SmuQ1LNi/aj8rsFB6CTBICpglA82cmgF3g11yM563APHO5fmmU4iYUAkFkIJinJtcujVLcFgxiVkEQis8vmVLclQziLBh/xnDwPwQxyi3EMABEAAAAAElFTkSuQmCC",plains:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASsSURBVHhe5ZhBi5tVFIbzI1y4EynSMqhgS0sLlYEquomuigsFYVwJs3JVcOkfmJ/86RN4Pt6cnCRTJ/VLvIuHe+97zrn3vMckU1xN0zQ0rTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrXgKbr559c+yP/by8af3otaemlY8BRc7gNdXj6bk0ccfbVHz9/FfDeCPtz9Mye/r7zb8/ObrzVrzKzvCpQ8A4+uXz8YegOaHHYDm2df8yur5Z59MyU+vn02/vnkxU+MZg++/utrCPIbHWh80VuuE98U3UsNYNZsDOBRnX/s5yQDyE5NGWKnxMfZoXZ3U9xMHgDG+5/ld16h7dND8vQdQHz0WrwYcgHGHAKnXOjGeg8i9xjDDADSeJs3JAajvHQCPdwYzZpyGbMq4ZJ78+OKLrdr71FHjO+zVNa+hNA8aNydjnNsBZBM+JDVuQzaYzSfGuYM9mnvPHeT4BmvuiaW5NMiemF+LfUPYGQAG/D5mAz6Iljnq5mTzQp5GyaXWjz816L5X68jJ2nrWlAbTnHol89oBgAZ9VIwdilcTkAbynAPIWs+ZYz17NPYacq1DqMYzzv5fD8C8Gs+YuWDDgO5Zc7VOrMn63OcAqsm/fvtljqWuedgZQPdfIFE3j2aSfQPIO+pAugF0dR3VwENZXV9fT7DPoLp5Nzc3W6QRTaSR/Pi63mcA5JKX9VANPJTVer2ezcHt7e10d3c3/fnu3WafMXLREpp3SLmvjQOaK2bNtRaIU5e1ea4GHspmAAmmNA81Xj8BdQBppMPBvG+dVAMPpRWBH46qyaHYh8YfNeBvfp6h/vjxg5h6vW/rkFBUNTkU+9D46w/5j540mTlPr57M+//FAHhbQzkAyJjkAKDet3VIznkA4gBS06ifhm+ffrn1yaj3bR0SLquaHIqdGkwmmtGse/Uun7g5aHluHwUSqiaHYqfmmKH8BGiw5gs5dWgrPiJAMkFWz7UZIa/WiM0kPgj1rmPk3d7PP3n9Z2/VunzyQPNCbH6AoGCOIHptiDgPkZM1+WDFx6DedwzvFY0C99mrWs3P9zm7nweQJjTCSgIXsmYzajXXei7NByredS6saBQjiUaIaVgD7h2A+axdXqU2sDSbAfh9dq3Np0FjrFnDmnX1DqkNLM38gyac0yg4APbqrF2tNUneVRtYms33WgPs33cA1rNC1klqtYGl2fwZtHkN1SHkABJ0Y3JxA0jDaejYADI/scYV0NVqA0sz/xmkuTTlWQN1ALUmV81mrlptYGnmT0BnKA3kAMwz10+MqznmW4tWG1iazW+AJnIIaaAOQDPq1nKXdZzNI+6dtYGlmX8EXR1Cmu0GgKaed1zcAGjO5nMINq+ZV58/2dFqHWg098TJZ18bWJrNj2A2bbOahToAtRwYXPwAQDPuWTHTDSBzU7NG3UGxrw0szc6fQRpVA0zXARgz19qs1zDw/+U81waWZjMAm3bvWUOYTxM1z3PqYD21fArOcgA2a/P5vbZ5kx3CvtzEXI179q5zYTZl00DT7mtBl5O1YK45nnN/HkyrvwFEKt3/bGZRxAAAAABJRU5ErkJggg==",savanna:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVKSURBVHhe5ZlNixxlFIXrD6gIQSIiQxhEGYggmlEhuDCB6EJxEQMiCCN+QHClggmKSFYBlZDsXLsIZC9uggu34sr/4V8o55Q87anTt6Z7psuugVo8qfe9H1X3nKqubjJN27azpgzOiTI4J8rgnCiDc6IMzokyOCfK4Jwog1Pz7Vc7h4c6N8RJekQZnBIJuf7Rk+1xBJ2kB8rgtnn/3ScOD/+uJUL74xqQPX7OoyiD2+TNS4+3Q0iE0N2FjLGv+kXWe48oh9omm9w9x3uqcw5RBreJhtRdWWfYdTnOOcvgthlTPKx7zjI4J8rgnCiDc6IMzokyOCfK4BgcXHq1/eXrTzt+vfV5B3vlXnn23FrkecemDI4BBvx2+7MeMuJUG3Bxb7d1ds+e6ZH1Q0ikxLpwDBnTgPeeOt8+2NtboL24/NhOR9YnS4ExDUC8M/YT8N3Of+KF9m5C1idLgbEN8KdAjP0OqAwAmZD1yVJgTAN46WECH4MxDZBIF58mZH3S3Ln5SQs//3iz4+H9uwu095rkygt7PS48s9Px9v759trFF3tPgMQrJrIPyIsPXt/v8BgiK2SGi68oDXDhlQGQ4oWG9iemEiIThNaIyj7wmkQ5F+nitSeno0O91oMGuOg/Ht7vwACOKV6kAAzwoQVPBPHsA++r1nqxuSgX5/AtQD2UBlTiMcBBtD8RetxdAB8BBkaADGCt46o+DPNegTgdJdyfAkS6eCC3ZIDffRePAW4Eot0AH97JO44IHUXVI1SDaDeAcyFEcPfzYyBObABHJw1wUgB3FKEuyNdpHH1ukta5R0zefRgygL6NDXATtB4SkgK4g5UB9AivqfoRIhBdPQnUuQFiyQAXjNCMVXnItzkvQQZOAYjLPqDH+32NEIlDuIt3EzDqSAN0JyUEkf5EeFxrngBnyAAGFm4A+3X6KlLApjT3Dt5pfzp4efFIIxgUU041qtWPGa2F1i4EES4k7z4x76sMUK3q0rwUsCkNgnTkV5v2HPn5So1M+OLyuQ6tNbx/llnn4EIxjhJLLb1CefV5r+9TwKY0iDkpaYALqcCY4/ZBCtiUMih4kWScF07GtwUvvSF46enPYqx1ZJ/n620cnawSOmTMtsi3uvbCTdCM+tOY1tRof2wDxLrxbaFrpwmIVI4bJMFaE8eQPF9v43CyjE/9BOjaIHGYwV7zCf1pzGPaV3p6G4cTrRv/v0CkI2H6TCOQfdaR8zxPC/3lRYVEqiDjik1pgK5fPd7MW9WLQQP0j5o5Qe79ZMLzQjGv9x72HkuBq6APdB03wPfEHF17SLzo/Z+aICEylnsu4HG/EDmtIQWuwnuFzsfnWXtdg31ei3xlALmGoJp9YBfhkPM+ekWV4zw6psCp6QwQGhAhLhIU8ziiXDz5zLEXOcDUdI8Yohiau+aCHMRQq7XXEvfz0JMDTE33tmd4BDCscDEJNS7Sc4pdebT/ROQAU7P4XteQ65iAMHJaZ732Eg5ekwNMzdLXIMP60A5xzKpyIg3A2BxgahZfMy4kxVx7+vmO/d1HFsIRlKgmxSsmtM4Bpqb5/Yf9Fv568NoSf/95o0dV4+e4dfXMkeQAU9Pozrx14ewC7lbGV+VW5YnnAFPTXH3juVb4kAw9lCOeOe+t6kQOMDWdARrMh1fs+scv9QQSzxz5qj/rRA4wNQ1D+tDOUI74UH6oJgeYms4ABvNBXQB7j3lOvVWN71mr9jTRM0AwvA8NVc77vMZ7WAvqTwvN93e+OTz2g1/e+LCL6ag8NdpnzMk6QXyoZ2rKIHdq1TE5ad+UlME5UQbnQ9v8A4foF7kPq81qAAAAAElFTkSuQmCC",snow:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVySURBVHhe5Zkxj9xUFIWnpEJJEwTbBG3FpgSlSEMBiHIlSoTgB6RfCdHBD0gTUkQ0SBRI9IiWkpqCH8APMRxLn3V8fO0dzwzjJ6b48t47977ne649zmh213Vd0/z5x8+d+PuvX0egZ/5aSrElMO9NcC3z11KKLYHR3397PWoCZP5aSrEl3Gz1FGT+WkqxJSrz/jRk/lpKsSUw7XgzMn8tpdgSmHXTIC3z11KKLSGTbt4b8r9ogD7P+YbXHC11Yr4HzeNzMT9LelnUObm9u+vEly++6/F1pXs8Y6llPPM0L4s6J1nQ3Jo7x92b2+Oa63Prsqhz8sHnX3Q/ff91p1FQmB5PtOrR9bjm7NPaz6tirBUrizonfmeFisKom/UmOB4jnxhnsEbzeVnUVujuyIDGjO3DfftlmLnyNE6StoS7QnFrOWR/KW4FxR/agEP2l+IlUYqXRCleEqV4SZTiKdAXjdRAsfc+ud2L3HtqSvEU6FtXaqBYZbYi956aifDwwYPOef+dN7vrh28MY+bPca4G6Cy+3wut/fzMTyZCNsDNa8z8OZYacMqPgM7yBmjtTcj8ZCJkAw59ApbeAX6H7iP3JlUDYOkmwETIBhz6BCw1QLHKbEXuTWTSzWcTMj+ZGF5Ldt7X1R2QVuUurZ05XbBviaxn0oC3Hj3qrq6uejTPODnEsoBcexO4W1Xe0tqpGpgxjQ75mlMLjBrg5ueagHliXggX8jVzX6e+Bn0s3BS65m7aP0auLzYA09fX1z2sPccbILKIXDP3deZVzMUxp9FzOJN4cm8DMCXjNzc3oyYolnneAArxOeu5uef63HOqNUZE7tOc2OoGVOaEm88czbkoxQDFenGMIvew9pxqjRliiWIiG8C+sgH67+32ydvd3Uc3A189fbfXGJXjTaAxXFCoKEaK9UI9nnt8XxXX6EaEnyt8TR57YNIAGUxkGNNVXNAkLuJFMn/y6WdDoVp7rnj87ONh7vsy5mvleS5g3pvAXvaISQPyLusLj0OcnESHqjiK4kJcXDGKdJ197PV9rmduGjiWXRrm4yCqhiQUtgSmq9ha0sCx7GQSZNofb28EcXI0qgG+/xykgWMZGuDmqsc981hzZ6rHmvlcPDUnnxjWaeBYSlHoJ+ZX3z7/dzrWpSmW+rngfSL4Cdw1mqo6gWaLPG+0cJZMbtkADAoaIM2boP8FpMm8/kqkkebkeaOFo7+ypAZbPwE0QXUI7jDmNaox/KnM9TxvtHBabgDQAMxr9O8BMq+4RvQ8b7RwlkwuNefUyFSCOQzSkLlcj+upEMTKiwo6l7q0LRugornD/sdQtCofXaO/E0Rv1M3SVR3OBSgm9dyTcXL8TM7alzTEo+zXQhOZj3mBefShARgBrTFB0alpJN/jFXN79oHiwc36ufc1QC9KHn9/ac5+1qVzATeHnk0T5JDnc+VrzD1bMxh1kWIZxT5G3Ljv0x7IPVvT/0OxiG485wJT5LNHuptnr4++pwWGiRcNvnYjmMwxteocrtcKpSj0sqBocCOYrJrga9+vN3BeZ2tKMaEZmNPcjVdrcskXeW4LlGKFNwHDvk7dNcgzW6AUl8hGaHSjuSZfY57VAv0PIvzAofGbDx8Po/jlx9c9P7x80aOYPsuYrUbQWsaF9jT5DvCCKdY1dP92JSPken5155lrj/ZmAVvTP9IqHDDCHJN8pWSkCZgkN/eRR/OygK3pv2t74Wleo36Lk3HM0wBvwlxDyNMe7c8CtmYncypQBbt5RsWUyN1jRJdJSOPoyvsvftA8Bf0/FOt3HhOeXOGN4ByNoDW5LTJMKNaNM+6DG/Yx81pjtKBw1/YFsxqPOefclOIxeCPQWqYUL4du9w8b6MORTdaqiAAAAABJRU5ErkJggg==",swamp:"data:image/png;base64,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",taiga:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQNSURBVHja7Zs/ixNBGMbzEU6QU0ghIYgklUL0/FcIhwgWV5laTrCzPMROsBMbwcZC0MLOxs9wln4JwQ8y8iw84dk378yum71kkkzxMv+XfX4z8+78SQYhhME22/nP9+Hrx7PKEGea8ab2g20HALFdygqAXQGQGuZ7PwWKD9h3H7AXIyAlci9GwKpWABQABUABUAAUAAVAPgsZpn98eRv6eGbqOaiXBQC+JEKmNT9mrGfF6jPsc7UewjIFCoALevDp8b2QKrt7Y9TKCoB1A3g4HQe18dXLNcsNwO9f3wLs75/zyl4cH1U2P5pUthcAKB72en5cg7DzAFQ8YAAADRD2AoCOgg+nj2sQGgFcOjgIq9jt69dcm9+/GZ4/urP0AsiDpdqljEKxsKF4Ow10RNg6jQCuHB6G4XBYGeKeaOSzrEmIQkCc+V0BqCiCUABazjKFlQSg4mMQKJ5lXYV0bQfHhiUsxCDEMFehWsa6MADwltY1ABQ9Ho8rYzoGAIaXhq9YFwA4NghBCPGY80gjpPeneAJg6DnFge19CJ9OpzUIOgrsKFn3CKBIAiAEOj+7DqAxv5cpoGVthNDx9TUFtPetxQCwXRQA5g1DzCXN8+qknCCmBIW/evpgYQqB00ZDbcd6aFfLk97UnrcjgfUshCUAuD2haP7QAGn+yMB6U81H/MmtaU0E0jAV7hnbWVNYXlx7U7/3diTEpsMSAAxlCEEIYdYJ8pcW6hS1jRWiALyhz7xYO/Y6e96me98MdVkHqKkQiqCQlKUApKx3APyseV8BBaFgWAYA+gnUeBsA1m9sFEBsDRCDwLQFoM4sZV3bre1AxFs2tim7aFPH5xmdnjpAXTv0AmCVI+tVzXp1uyjiF4F5+sX4LwApkZsEoL1sQVC8B4L5OwFAhzthMO2tBTSvFwDr9AE6f73hTvEKJFbX+gTkZe8EPUG67o+t/iwA6xSZP9C9sl4pcU/ddAjJ+mxrDybsIcWqAOzGJ7YZUgDeF2EBwB4x2SOl1CGkJ9YTnXreqgDsPqAtgMUUsMdHqZf2yptE27LsrsZ4YKgQrAB7CaGjRc/mYqNJn5cdAM5f9rSmeb6mALScgngNzTz6BZYrpOwA6J26vTuPfR4Jxatj7+S13iaX0I17gU0ubrK+Hmev2XCnAahYeySmfsADYn1GLrvIpBOkKM7hyWQSZrNZFb57cxa+f/5UhTAtUxgKRC8obH52ACCEoqwh/+Wzk1o8VbeNbSUA9DzCNgDGo1HSsgOAl1IICO1/8GBYRto8bdNGfJYAKAgCGVIs186Ic03NfNZXOJomRIXZ5hcbGwGgQr1Lh9TZmwJpE88OgN0heYcIujPzTmS83VYsniWAmMUapdo0WfmlaAFQAGRl/wA8Eqn8BlVX+wAAAABJRU5ErkJggg==",armorer:"data:image/png;base64,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",butcher:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEBElEQVR4Xu2aX0hTURzHf/elEAKfNMzNlVBbZLNmf0YI0SxSSiIQSoJQsBcfgvaU1ENUVhDYmw++OOrBXqxAQ190BBHLcuny4a6HZO5fuF6EQOjlxO+ss7a7s9tmenfWPffB+2e/c8/v9/l9f79zJlPA5Idi8vhBApAKMDkBWQImF4BsgrIEZAmUmcDD9jaCLtird2Q8Ca/9oNfZz/Tc1NqzezZG+252j3ZlL4GbJ0+Q6qoqWFtfB3ZGx/GaF0A2CAwAx2Xbs3seMHwnBj/3LZX5uOwAjBLgi0sXqNIQGkLA88D0jGIqAJj5R2/eKVh2qBS8Ng2AQkqTAIyqQVHnkQoQNTNG+SUVYBRpUeeRChA1M0b5JRVgFGlR55EKEDUzRvklFWAUaVHnkQoQNTNG+SUVYBRpUeeRChA1M0b5JRVgFGlR55EK0MvMba+X3B8ayoF0y3uDDA49+W/A6QbCC5YHRVR5F+PXXwB4yaBUQK7cTaaA/Ho3FQBesKYCMOYbJd09vTl9gvdM22z443yku6dHuNVD16GwGiJ2hzPH5osaIvs0z7QANjqumK692TZbAoAHqRhwmx1cMe8rCAD3AB2d56H1VFuOzVv/DJmeeA3aDVL2ZGjDG6d9VoyDW21TEADWscvdkplfob+nIoA/tHk24tMFMObLr/fnPh+5XCk9ALPf5GyGFreLAthlaQRCCCTiyxRDMBCEz6EQaDdJjNZGm+dWZ5v3fq4CcKlr7zwHtXU1NPjsIx77CqlkCqYmJqHQdwIegIpSADpbb7PAzrraTPYRgqIoUAwAbQ+4c8VF7GeuQ8UsgxgABlyDCqjfQwNnBwMQi0ShUE3zAJzue5zXUMshee2ceSWADcxqs1I7bHnY/KKRKL232Cz0Hg/2jJdVBoBg48AfJ4bD8D0ZFxMArs/oZbrHA6wmVyEWiUFnVxcNdOHDe2g+cgyS8WVYTabg0NHjaTiE0GdsbJrsn5UCQe21N9HgZ2dnoc3TSi20G6tyq0DBhoVOLIVCNLv05vdfDKjJ6aSrwXwgCEuhxRx/0/bpEXh9wHkw8w5LgwUzDn6/H1RVBed+O0QjK6DdWpcdgNYBbIAYlNXWQD/C7C9+nKPnyfFxcLld8CkQzCDSa2yqqhKHw6EMDw+T/v5+4b4HMM3mMEAAh90u2vwwcAYBg0cFDNy9l9kTBAPzuhnFHoAlkEgkwOPxVA4A3AHW1e/WVSf2hthKTMilrZSyystKeg9gpe2MLYPaF+KOEDdDekthKU6U0zYPwIOzHtLYfRUWRkegufcabJ96BT87LsK2qZfcs4j7+1KA5gFIfw9w0iaIXRvLAfsBOzD7T0dG6eqAK0el/4tcyMZUSgb/1db0AH4Be8rmUTW5vvMAAAAASUVORK5CYII=",cartographer:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAC1ElEQVR4Xu2XQUhVQRSG5xHhxozKjUIKRujCIATNRQhRi2hTaKJguRQSW1WugmzTonLjIqhFQeDKjRG0UgI3FQ9EsaAeKahUG2khbQxi4h84cJ/NTO++OzB33py3uXDnzdw5//n+f+4tiMh/hcjrFywAExC5AmyByAHgEGQLsAUiV4AtEDkAYZ4CcueyRON+r34UdefXM1GcabIPevYWT8jnh9bE2rtv4sbBIXFqfDlTDZkm+xAAz4QIpS+H1eOjFICEhxDRWSBJHbKg0PgqE8WZJvuygMvnsgAu1QxxLSYgxK653DMT4FLNENdiAkLsmss9MwEu1QxxLSYgxK653DMT4FLNENdiAkLsmss9MwEu1QxxLSbA1LX7fW3y3tKGViDbWGgUGAm4daZVTn/Y1I7bxliAwBRgAjgDDArYgu7ZldNybH6lJk4QYxHVClDtPF/RkVoAdP/Hz12R9ojEPBSZN3JSCzA7N6cKGRkcTPWOsDR+Qc3re7KQK+sYN6PzOYo//vapovV1/Vnx6OFU2Xwb/jUhwJ3JKXmyNC9ggV+9o6kECM4C6LKOAoiAsTTdJ9usFD/9M89X+NFzrX7UBR4wx+T9IWjDn6yjs02uBdBRgEKbjjaUpfn/Po5ATf37l1rb5F4AnQhJP1PxUn6V29slVU9Ly6Uysky28V08nl/xkUTo7+79UftubzqiwpCssLX1RhaLy2psYOBu2br4esR909elTyEqFiC5SRTUUHdAJK1AAvT3DwuQkKTAlBs+C68oBG0bpK523X4skO43J3oECOju7lJXoiBJTs0QQMIg3fFGSMGI+xdnHigBiIQX1ybU302vzr4pqMoCyU1Twp/rbFO3P3/fEceuX1UkUPHIjTx2P1UI2joFAkgAEgFXhGSei3cqAAKxo7lREUA/21ejb/Qzh6DpVAil804FwGJ0KtDCefX8fvIyh2BeUK52H9EL8BfNyH1Qj86JlQAAAABJRU5ErkJggg==",cleric:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADyklEQVR4Xu1azWsTQRSfmhpCwVqChfiB1rSIEFtQQYsUevAkglrEk6CHHEQ9FfSgf4AeKvSkXsxBwZOIHyCePBSKiKBCa0CkTav4EaiEWqGE2LjyG3xldjuzJduFt3FnL8lu5s2+93u/9+Zl3rSImF8tMbdfWAAsA2KOgA2BmBPAJkEbAjYEYo6ADYGYE8CuAjYEuENg+MyA49Uh17skhHDEznRCHM6/9HXSi8IhZ6byR05RnGw1mpPr/S3nwzVTqYvi5Hr5nZ0BFw8MOeXFikvxTFtatCfb5LOeE9Mif+mVVs/CjX5n6nG3HLdQWxTqPJgD9+pcXnQgww7AyT2DDimrKrirY5u8rWY/idF741o9wZ5UaYcc93H+ywrvY15cBGYkAeAOQXYGWACYEbAMYHYA++stA9hdwKyAZQCzA9hfbxnA7gJmBSwDmB3A/nrLAHYXMCtgGcDsAPbXWwawu4BZAcsAkwNow/H6+H0XSFcGTjt+G5XMDm349UYGAIDPbxPi4fsx1xjs4m7fVzfu1DasAbOAEYDCSL8z9aRb6BjQc3xa5C/r9+qZ7Wn49RYAmwMMCMQmB+h6c2hLIdOj7WRaBfCbrh2FBEm/UXsL42hOU5ur4eANScC35wbFdauAnzHEHOinAoD7KK4eRgCwBJLS1IAEK9TnOm+qDUuvk6JYP2gBQFhAeW/bmgyiruvN149WyKNQotDwMgD33pAKicmBp9ECACPQO9eBoLacdcYQADB2Q3qjnONX5afMF00FABQnELzwUr/dBADGk/EkCxBwNQUDrh274JDCXhDUwwZ+DICx+7M5afSbUlF+Ng0DAICqtMoAim8Yd/Xprf8zB6wVAALMmwybJgRoFZhdKEtbutoz8lO9RyiYQgDxTwwiMMAYhFXkcsCdkYOuY2pd6XXGJWX233E0dQw9IyEcP+uc79MCMNcxEbm/0dplcK0hQAxQ64DIMkDnbgKgulQTfZuyriETP0oi1ZqUGV6XBLFhotYAqjDCwltaB65gQhI0VoK03MFgNQcQIFgedZUgAKAlkPIAwKLvTQEA6vnah87lUpiqPyqNcZ/cPaeNZ1SCagWoFkWRTII6JtH5XYDgPWUJz+899U2etTX9GYLc1sxm19Rfy9+NoIXE5kDT+G6K4oDxuwdblo2BEUPnyuLZWML3+Crknt9Nuf4O468wrqbYDyAowQQyBs/OD9d8jVfljg7Wxe3RpHx05GzVyJhAbgtRaNXGCECAMbj8PO/VieRQJ5jCJUQ7Ak+1KgCYmXJCo/QNKhfYmgCCfwG0VRJLJCiE+wAAAABJRU5ErkJggg==",farmer:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEuklEQVR4Xu1bTW8bVRS9buz4M3Yc48TQJs2HA1GrqohWBMGCdoEACSGEWCLYdlcJ+AewQgiJH8ACxBJVLJCQYEFYIBrUIlBU1BInAUzAxLUTO/6Ok0HnmjdMktp1eqdyeJm3efLMu89zzj33vhnpXhcd8vHpe2eNeNxHvoEC1TYj5ozHzmZr9MpbP7kkEETGkj/u1vabj2aNnb4NXj6UGKN85neeN1aLfO3p1+dFGETG3YKQrPv6k0cMBT7gd/NWlWqT51oxTbMv3xRhEBlLgHVrO39lxvCFRwng3d6HqVn/hU3zf6/wfCQIYAWMTDBgkFDc+PloKQDg4fHhsWcZPNRwZBSw+O3zBsBaFWANgyMRAncCr3LI9FNfiPKYyLjbRNZpnTrncabjvMfYe+Y/lBwyQwDexymAYxDX/0zl970bqH2wZ65Yplg4uO8R1PVDQQCeDg+tSMA8Olmn9LLXnNX96UeHafHHtbb31ToAtA6QoEBb554T8O6b40a22U9xd4MmH4zQfLpKLzwWpc9/WDevLf9VoEjQTTNTMZOkm0s5ShWOUTKywx5Wawrl1jsCBvZlct0NtlcDa/Abc88JeHF2jF904kG/+YADfs8u7w0GvPw75O0zr5fq27RRqd8xujarW7uuZ8vV/0gp1VqkhFrh1nMC7Mgjkj0cAiTs6WDrKEAHL0owOAqQsKeDraMAHbwoweAoQMKeDraOAnTwogSDowAJezrYOgrQwYsSDI4CJOzpYOsoQAcvSjA4CpCwp4OtowAdvCjB4ChAwp4Oto4CdPCiBIOjAAl7Otg6CtDBixIMjgIk7Olg6yjgMHgRtYKxRKt46dj2IM8og0epPGZVS4iy+VzGJ+4RsGLuuQIUeH+oj4o5D0WirfrAdkWTihBpo4QioacE7AXvdfuoUGjQyImqSYIqmrR2i0AJF1+9Zcuz27LJvYYRmiHg+XphgLeoN2vk8dZY5qriU+2NEEF4oIy2UjFsC4WeEwBQ3sgmVUvbDBAez+R3l7kmhoJMCDxvXW+HCmwn4I1nnjDOTQ2z464vrdH7X11t+x9Icgp8bWeHymuBfeCVAhQJWA/FQAnSUnns7XrtzDiXqmI8kEiYao7+W7q6bikzbSf125mMeWt6aoImEy1JL2c2aXGp1dqixscLv5qEIAeEo0QjJ4e5+nvhVq5jNIEEFFFjICdIG6aYgHuN33Z2UMCNiTN8+/TKQkcFYM2XH541wrEt9qoWBLz90kUjGnLTeqnJ3rd6fC9p6nwfPB7uSgHnH+/nXIG2ue/m3HTpHVmzxH1TgAqfuxGAB0BLDJoeENvXvm/cNQTQL4DeQSTDQxkCBwkpHIMAgs6PXPY3+iPl6ZgETyS3WAHq6PzfE4BTAPLHQCcYlNDpGIRK/KHjtnWN3pcQkCggFj/JSkBCrLjyFDCGeI6GPQwco1pa5ft29A33nAAkQcQ0RnjwFM9oikInGHJDailFyakkuVx+KlfwsrRKIEkpxY7vAduPwYMoAGtBwrkLF7ghMhgYoOSTV1wr1y6b7ybbjTT19Y/SxPkPXFc/O2XY6f2eK0CRhWQ4Onma0ss3aHzmObo+N0fq8xi/AR6kYFafyAclut36fwDH1E69qHJmoAAAAABJRU5ErkJggg==",fisherman:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFRUlEQVR4Xu1ba2hURxQ+6zNrou76ihsStRYf6P6oCqam/imhFAv1RVvQtIivP4K/RFFofYNi8WdBqFQC1tKHSCuFQskvY6KhJmKjtYZGJMa4iCRq1o0vrnyTnuvsZO69W9l07s3e+XP3zpk7d8433zlz5u6cCHmUfZ8utNCkIjEyq2VH1zNxv+dkc8SrDz/LPQcPAKA8FK5eEKUbd5+L31xXEABAcRQoP3vqCBuEgmDAN9srLZ59mcrMhCHPgPqj71g88zIL+PeGLy96mlGgfQAAUBVgQOpaMkPfCeoAACBQHo6wIBnAysM3BN4HwMkxxeHh2bZx5XunOp1PcLJ3jhtYznGFaQZFdIEOr/OqMrp6OSZwC5h0wPjBhCKb30sOcHKmvHZ56Si6nXpKuDKYHHfIbFSXYzU2AbCok00V/aLwO7gP40vY8sppYgImF/cHWyhjo9lhd2zMaFFfMnq43ab3yQvqefxEO1ePMv1hOpd76cyr37194vfkkiJxNQ6AKbb5hgEhAIYRCE3A8AQYf33IAONTYHgAIQMMT4Dx14cM8JqCRWXjrJ7MU4pFRxGu/3T3DSnQPJV5M15ksfK4Xrrz0PMZL1D9JPdUJmRAoTPAT3QdjLF4msBgvNRPfYYA+Gk2TIwlZIAJ1P30TsEArPXl8WKaMzVujy31KEM96T6KFReJ6+3u9JALgsRH0XWL3xjwWRwKo0DpZPlE7YSVjo0SQKptuhloM4qsmJ+w5FlGvC+XZFlcsACFgZHlP1/tCjYAiPVlhRDvwxyYASogKh2CvjmKwP5ZKSiO2WZ6y6aANgwMM6b1Tnfgd4c2ALJyOrrDH8gg8H3Qd4eO9rujep51pO6aVu4m89MSl8tYQgCcUAoZEJpA6AMKwwnC1p38gNsq4OZhg7R6RHTOjkHxAkCV5/KcU5+5LFmD0UYLADZIiAbdANBthACA2wYJ/fpt8yR2g+qgeIfoNFgneS7PBQIA3iG6AYB9groTBAC6eqYu+vXb7lFsh9VBoQ6DdhqskzyX50IANN8P+LSq01lAZhAOaaPk83TpAAbsP/yF1XLpsnhRqvM+NTQ0ZO0X3OSvywAAoB7TVT2+LM8rAKs+/tA68+NZW0n5vqqqylIBcJMzOHJ/siKQ7955YMAGjE+kcxKGbrnj05+QLd12Pm9foSJQctbzLvudbSMShHssg/WZGC2N9mSNh+uw3HFbbvBwelKwRu5PfhhyHTiclKEeqFaBYBDyCgDTVoc6fwtUZbpvg7kGKTonaBQAzgni4+s8C80tXVRcs5HiiVKaUndC6Ic2vRWfUEnHDzT+7Y/owYWf7CvkqGs98x3FF9eINmjb3fSt/ayTAzMOgDx745edpKtXmuj647+E8l+t30rVmz+jfXPbRbPmkattAGbOnCXqWk4dElcAgNLZOcwG4M+zJ7JOf+scmG8AwOzjWHn63ZVCeS7XG5qoJnZDHEFPzVgpqqH8L0f3C1YsWLtL1OEeJblqjQABJRAAqM7n73kf2Mqnbt6itsY/aO+ycTYAoD6eWb5tt80Avm9vbxOmgQITCAQAjZfTgqbJDd+LgZ++UCuu9adO06ZNn1PHr4doyVv9/xUw1WHrYMuWIwftemYB+wrYPydAuKXIGF0GkTIjZ2ncr1hDk0rL6Pjxg/R+oj9BAeDIucPy7DPtuQ/QH4UBkrM/UK/zAUYDIU6Z4YFikFeokiakztnKZ03xvze62Qf9UX47VmunpqhpMLosM6OhsAoA59bISsvgoF7Nv2G5zCSnfvyWZve/J019/Xtr3sJYHTP/a91Ln1Kd5RqicrgAAAAASUVORK5CYII=",fletcher:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADoklEQVR4Xu2a30tUQRTHzyVobU1XN4M1rJY2WX0QgkBR6sk2glDqD8j0IVq2lyIowodegjAJ6sU2CtR6DSojCDZ9CRQFIRDUbdncyl9grr9SNIiJM8vcvSveO3fJhtGdedkfd+758TnfOTMPowFnNAVOEDYlP89Bv66ub+hvvYh81ng2ZH7ODZ4BYMnnLABMfCsIOaeAPMdeWN/4rS8DBSAXe4CxD+SEAtjaR/njyMklcMBVkLGbzS+t0N87XgHGfd5qvzYDkM0eL+ockUwm6dmlp6cHmpubLbd67WJtpX7QMUumYL+DboGbl8DKr/SBiAcCbRgHe/f1wBj3LMKzbXw+NTVFIpEI/auxsRHcbve/A0BjDAJrgNkkb5XAdgIYHR0lQ0NDUF1dDS6XC1pbW6Grq8sawKnKo1wFYALHyooz8vg6uZBNYUznVh33mD4rKkr3nfsvP2YkcufSGT3uxcVUP8Ix+3MZ7j1/Be3t7bBvfowbo2YXAFo6WOSkBucW17iG7U5gNs3me0oK6SOEwSBg8ixpTHjzcPlrYCk6aCuEbV1/tjxKNkkBkKwgwsNRChCOXDKHSgGSFUR4OEoBwpFL5lApQLKCCA9HKUA4cskcKgVIVhDh4SgFCEcumUOlAMkKIjwcpQDhyCVzqBQgWUGEh6MUIBy5ZA6VAiQriPBwlAKEI5fMoVKAZAURHo5SgHDkkjlUCpCsIMLDUQqwQp5IJIjX69XYp/DyCHBoqQBMfHp6moZRV1e3K9VimVR/fz/51N0Cpy937l4AN2tSFyUfDn7bEkbbVT+5/TTKrT6z09DWDeXl5fD+2vkMAUdnUhcrzfwIUPuWLrSWKg9xO9P3eAsde/SJpe5CGIjPQq3PAz+qGuj/h0fewUwyfTlxeeOPPt95tgmCwSDEYjH48ug6+G88homJCRh5cheSa6l7xZ0js1yYImFQAHYckpPn6DRt+IPp9LILV6C+vp4qAC8sBwIBCIfDMPnmmf6OdAB4yVccySfj31ctq8ZUhArw+XwQj8cpiN7eXvobr6zjEkEV7DgAdnsAg+AvLYaKQyU617fDMWnlTxVtpQBCCHkQrIBb4XHQNI27drHK2EOwd7CBPUTGtc/i4wKIRqPQ19cHoVAoawDYLLFJytb5jUXnJtXR0UHsJI9GjQ0VdxZZO39WAHhN0vgcAXiLnfoSQAUkFtaka3zCAODhR8bO/18BoPTZYQrXf04B2NwHZO7+TAV/AYmVa+5Rmtj7AAAAAElFTkSuQmCC",leatherworker:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADOUlEQVR4Xu2Yz2sTQRTHJ/SgEpHYViFgD5ZKRQqBUsQexGJzqzehIIRc/AP8AwTBg3+AB0FEQUJAKPQgtLe0VDxUpBQCRSyWeqgQ0LYGMaiHsvIdeMvs7O82upPOm0ubyWZ33ud9v+/NbE5YPnKWxy8YACvAcgJsAcsFwEWQLcAWsJwAW8ByAXAXYAuwBSwnwBawXADcBdgCbAHLCbAFLBcAdwG2AFvAcgJsAcsFwF2ALcAWsJwAW8ByAXAXCLXAvfJlB+r4st/xiORCf15+ftz4mIl9bo8PObQGWh991tcapO759R3PukODmB4ddMaGBiUA+hE9fGNnVyxt7hoLQAWiw0oFoJA/5QZPNAGh3fnVMwDGR4ri6/4PuXw1mRRPpAJ6FQCCpoHgz/efkR/Xt1q+hBoPAIrTvZy2BkRd37MA1KySzMOK4KEAUBfQqz3mg7ykZkmv1GH+S7IHCVIASbxYyIvFtS0xMzEiWu2OlHjQOBSA188eOs3mZ7G3+c5teQj+5uwdgfkHT15GdgEVQhywKBBhABA8RnO7JUrDxe4CwENLk9OiVLooNhqLbhWF7A7OXZHztafPfQUlSUZNuyYwi5Q9IqsuGuRB/ShZNQlCLICgxaYFAKD6BsQUCJEAIHnyGi0YxQa9NY0C7l6/5Lx4+ymTnWMc6FAA+KFaPdUbUbtJmtVqterUajUzAVDBQ7XH+PnnQP4dLp4VY+UZWQTVQXPbre9y+vSJPjEwek12C3XQfWgO12FkdYgKU0KOADRXl3zXoBPo80nmopSTVDVx0u3W9z5Z4hRIN8dZoJA/6XlWu/Nb4DBEI8mpsF6vO5VKxUwL6CRp44HAIVvactKJCtdjLk0hNLoG6ABIAcg+tpxqF0AHwEDweCeAkUQB3ZLrv7hPoAXwIoQyTw8lEDqEYwcAFlAzj4D1vQCg0OHDtKKWViU+BTyaveoWQbS8vbUVGSwGQAxMTMnWiP8xf3/uvZHFLSkI3+LpGEyFjqygnr7oOxP7etLA6bpAABQ0FLA898rTCbDp6fv2wS2Gpm1sjgwg7LUzbX/j3rKmXUDW10duhG6Ub4k3jQXPGvW5Y9cFss7I/37+X+mq4dSjlXMZAAAAAElFTkSuQmCC",librarian:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADt0lEQVR4Xu1bTWgTQRSeFdpDj5qDjWITAt700h7UWrDQk4gVJSiIoiAeRE9aKx4UvdXqSfEggqIISvCgiHgoVGirgi2I4kUISSUGD4nHFFow8g2+ZXYym0nc1N2dzl72572dne973/tJoQ6L+HEvk6mLWywtLXl2fL1cdoJACPRykA+3+m756yUPAfTexxef+OXo5TeBMAR6uVUQQfxkBchqMF4BlgCpBlgFCAygIBqfArYI+qQAtcPYKwBFbt/LLHu1P+dpFqpnfvNA/9nt7PmND573D13cwRbufNY2oNDboI6A2WqVnXp2l02dvMDBjDy4ybb1rWNfFn97ziqksg/u7x8+w12xJq5DJ+BKMllHBOVo0bNircY3fGR5mZ+fdnc3YEW0VQqQn9E6pd5eBmJxhE6AVqN/HV739PCJcG+tFmjPUNzpfN5dI9BirW6+E34gICh41T5iQ0AnSLQEKBiIhQKmKys8/4cTXXy/8n0QdcSCgCAAde9aAnQMmW63CjA9wjp8VgE6hky3WwWYHmEdPqsAHUOm260CTI+wDp9VgI4h0+1WAaZHWIfPKkDHkOl2qwDTI6zDZxWgY0i2/yzn+Z+oNyYzRpDXNghLgFWATQFbA9ZsEczlHtaHBofcxlAofmelH4v8vlgs8POxo8f5OS5doq0uIBIA8LNzb9nY2DW+Bmw4E0FGEvD+3XQ9ndrCZPAkCZCweVMfg49xBBA4gIXss9kTDeoBQbBBBSBp567hthTW7lDWCf+WNkjyRnRbIYD8jCKApE2Fb35+gU1M3HYJHB8/Vz8wepAThNqwe3CPGQqQixsRgKpfqfzyqBAEIP9n5mbcrkBFshNyXY01mqYA5TRFHxsAOLHtEQmJxHoedRBAfiAptgQAPOU7tTY5+gCdSqVdQkAAjjiR0KAA+rVHYOXoi9IfGOhnsCPncYAM0V9WTBTV4JwfSde/VVfc9Nq6oUuZavAhm3itcm623q2pQkudZzXyXbWmMzl51f2vLJIzHMVI0uCDfCfZy10B9+JYLKvBb3j6X0D9vuNQoaNZ3k/GZBcLnVjsKP9BAlokDkoR8eNRmw0cynkVQ2LRg10GT1GVbY+fPHJbpKgY+EWOAJrvZQJE8FCF3AmoFaKw0RBE1R82FQl4rhqhw0wDR5zxqe2JfZ5SAtKmNIBdruggAc9pGMK1qm1GrRPw6EGm1MZk8BQdAt8MAJFARNC7RB6KqDg+hxl5+rZnlvfb0L9sWuwuKsVEATz2EKmeHAYpa56AP29NNAreqdoeAAAAAElFTkSuQmCC",nitwit:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADl0lEQVR4Xu1ZMWsUQRSeLZLgGcKBCClEsLNPGyubFEIaK8HOytqfYW2VLmBlE0iRJpW29naCiASCcoTzJElx4Vv8jm+fs9ndu0VmdmabZGdmZ/d97/vevPeucIlfReL2uwxAZkDiCGQJJE6AHASzBLIEEkcgSyBxAuRTIEsgSyBxBLIEEidAPgWyBLIEIkfg+eu9uZpwfXVd3l7OrtzGaN0dHZzeyvLoJWABmE5+u+nFzG1ujdIFAAyA93ElyQAaDxmcvP84LAnsv3o6X1tfK70LusNY3mMMMaBuHnOWEdHFAAAAz0LnuKh1/A/DNQiW8+O7ixg5CAD2Xjwpoz48//Ns4u5tj/9hAADiRQBgvE8S0TEAAKjG1cOUhQZBK4/oJaAAkPbUPqUBWdSB8OHdScXp0TEAMUATHethpT9loIEyegDIAGZ6ygKVgI8BgwmC8Cg9zXgAJtwZbbiLyXSRBluJ+BKj6CTQd+mSAegb0dj2ywyo8xjLTHts1I3/L89r+Xv27dxtP7xfeTVTYa0HkCxxvHUiFCoATIXLI+9v3c+c39YBdo2vQVIrgVABwHehCrTGEQTOkRYKEsZseRwlADQOEkDaq/UAAWB+wIKJ2WN0AOw+26n0/FD9McHRfgDpD4P10moRazDPuIH74BngA4ABjiWulrw+AAgInrOgFbapqOghtTx8e1QB6eWb/fmf2eXSQd+eKk0bWQDgPXwXLqS99CjHvn75XtkS622nWAEpYJA+AeO4GcZ9AHA9gdD1mKsb9+3XFYBHjx8sHsF7eBQ2AQDvYy0lwdZZBQDfhwNlnp0oRbfGm5Vvvs1YCybuuzKgCaBV53sDAB9imUA2cDxYAOgpeJuNRS0vlQEMQDAKz2nmRUPPf/wqe3ZgizIkWACs4WoUoibPTjYjNArzfFWDbaTVrk1wEsApwIDAD6dR1JcCwDFtTGJM204WQObiACI4ANhnp0E0nikk/n46/lwehTiSkHnZ9JKg6HlskxXeBwsAvcjOKozmGawAYJ3OsQOLcXqa/TrGE+3fNf1Wt2pU7/p8QQbwQfV4m83ICgXQJxP28Zp+q2vzzj7XFCwvfZRv8yKVBZIMbUvbOIH9ggSAXocxpHsb47mGUqEcNEZoBzdIANToZQFQIAACvKzSwDxBCY4BqxqtTNGgqaxYlWFd2Nh1bempZWhf9yK7X9/7dzWwaX3uCjchNPT5zIChe7jJvuQZcAMpgsBTWQ1iIgAAAABJRU5ErkJggg==",shepherd:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEhElEQVR4Xu1bQWgTQRSdgBdtg1RLm6KipoUiWkGi0KsFbwX15EEQvIqgeBAR9KKIJ8GD1wqC4FGhN0GvBS2CVaTQRkWlsVSDJDUXYeVN+9af6cymoRPMNLuXbLKzf/9/783/f8NMRjU4rpwYjTCkXFlWhaGcHj09V1I92S59fu/5VKaRjXa+3tB5AkAQGDiD6ggAerq26niLpSWVz/XGhJaXa5tfAbdOHV+ZAss1VRjsU+VqTRW/VxRBufH0ZUMVBT0FCABBYOAMquMAyPdnVbn6Jya1YwDgFNBVYH6x86ZAT/cWzTw+9XRYVUHwCpBlDoGZc5xadwFgJjgoxXWgl9DPWO0h2qGPyJgAuECQAMgcIINNCp7jAELbAyCDkopAgKZC1hN0HUgGADZVmAriM/ks87tNcbRrXvv5u6Z2bFvpa3BYFZAkYbMTbLbGmwpwOWpOFbbiUB8aMulHko2gAYjzz2rOaAY8FzFrFNAsg5ttfNBtrA8yUgB8oBiyjVQBIbPnw/dUAT5QDNlGqoCQ2fPhe6oAHyiGbCNVQMjs+fA9VYAPFEO2kSogZPZ8+J4qwAeKIdtIFRAyez58TxXgA8WQbaQKcLH37dOraNe+Y1aAkq6FpganAjoegOnpF1GhMGYFKOlaqoDAEHBOgSSW0xyQkCADE4DKgE04XfpR0b7ndmb1J767cgDvsd2H37b39qlfS4sxFvK7q7L8L+AyNqnjNwBhAwHX6KwJEO9DwDgAgnne3b23rXoPpzPV6ueILJI1BDg8PKgDczGJ+2xsEozgAACDdBrSJ6OuQAicTQUAJigAyCSdluy6AmF+kPNegtF2OcCVfGzBrgcAmQcge+QR5BMCEhwAcr5LebsUQACarSy+qsDJw0MR1gFyGR1XluETK8SevZ2ry3uJ7wIma5A3GEUidAEwOfkoGhjYrVl/8+6D4jnLrKu0+gAAwR/N74lNYWGlXFqHBZavi1/qQEjsBM1SCHYXFr6qI4cOOKsAAIAHCBxj5Tl+axUAMvik1asmCE4AyCSCGB8/p8fJ4FyBYO0xdpbgwLL6sUsX6silLR+MSxvnR0cibOexLadF0BIUqOLh1IyOKYMbaUguP13PelzeJ5eqwol8bqWbLJYqelmrPPhg3wAAeAbqWt8sQeBmL90JUupwiue2lliOtY3D/Y+vXVfv94/o+A5+nFFn796ps9mqKkAiQWISAAQpBoClzda2IojZ2fl43rITdLEHGxOXr+pNFVzUfPvJRFwCZVPVCgVgO4/c0IVnyBXuPJe73TJJnZut5WU3SMAkcHjgzdNnYgYg/4sP7sd9AK63qhOU+x4aKQB+xTlAtrfs/Vn+XC9DbGzIogSD5c6cTq1uhDAFXDlMJkGcrwGAtR1y58sOOzhzzpqtruvNDwDIa/ie9Iq90SnBMtioBOI5shfQ/wdIAGTyw2DbK6+NXYAnlWEDs5UAwCfZC3BzF3KC3Oq3phHi+72sBGQj6U9RyZhZRch2MzY3qgDeDxAG+/9t75V2Zf3n723154QvEJqx0/EA/AWvjT+9rp5EOAAAAABJRU5ErkJggg==",stonemason:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADf0lEQVR4Xu1aPWwTMRR2UBtSCKGMyYiUIiFSlVRULEWiMwsUIcTCSAExsDIxsTIgoIxI/CyMzEWiCypKqBqERCMxJmPaEKkhrQj6XF704tohZw7k3tnLufZ7rr/P33vv6l5CxLwlYo5feAK8AmLOgA+BmAvAJ0EfAj4EYs6AD4GYC8BXAR8CPgRizoAPgZgLwFcBHwI+BCLCwPLym+63tXVx/fa9QKoOZOwyV88fP+gWz02KQuFCIEyBjF0mAHurVN52Y0sAQmB8PBVPBZD8oQJVAVAFxsvv17T5ITIhYFIACNjYaIvZ2ctarJEhACo4PjmxB+ifqkNkCIDMQYJaBnVjPJl7Alwvbf96f5FSgA1ZngAb1qLk4xUQpdO0weIVYGLt7MyZ7oeVj1qCBs3ZnEJQn3w+L9/v0Vqtlkin07JfrVblfrPZbG+er12v1/fgMSpgPxNABHFyOEFDvQl6AvZxCEABuVxO1Go1gSeUgFYqleIRAmpOGZQzIpkDQiHg5sKN7qdyWaiVALnhdLEoni4+05I3VTglM/Bq5XPfvGk8aAWAPU40k8lI12azKdDHk6pAKAQAKBbSEaAbp1/6PwiYnp6We0P543Gui3EizFQ2jSFgC8TWz0YJYfh4Akws2p6krV8Yp2mzhlYBuEd7uPhKrnd34VrfdTIBVMcH5QC+npocbTYdpk8Ct6ZYEP9XQ8PNKtqdW/fl89GT3SfmMaeO8znYcOJoLT7uHAHI9j93tkVne6dHbGpsTLS3tuTPw/RhlxwdEQdGRgWtZfJzngACwmXGyeDjnLhh/Ux/YYYp6yBrJWaKU11++gBCbf7KVXE0kxGbzaZ4/fJF37pkx31JCWSozmHcSQWojOFkIeeLl+bFZqMhp5feLYnCwbao/EjJn8lmGLZhS22lvOrUJUyC3vgIFJ44OcQwGgc9d35OEoGGsIANBwfSqPFxGsO8kyFAoLmsAe5Y5oj2gBvN770kST4cPMjhoUTrOxkCyAF8g7Lf6YhkMtlTgcoCAJINnwNointTjnAuB9CLTS9xdTqyCwLUzE6yBkgQQHbkawLNSXKWAALUA5NM7gL8Xd8pR9AJq/bpw4f6hKKrAE6GwMkTE9obVPV0OToVvDZRGAa/fF13qwrQJyT4ioJed7F36uO7GzTMoz/Ijs+ZbIN+xhaEXBtbp07DBsDf+sSegF9mxW1fTFE1xgAAAABJRU5ErkJggg==",toolsmith:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEgElEQVR4Xu1YTW8bVRQ9Axk7sWOT0KZyasVVWyWkgiYLJEtVUkBBols2IASrlgU/gG6RWLFnj1SJBRJS1wghiEAkCvIGJS12ZFDSxLh1adokHn/UH+Shc8djxfa4aoQQ08x7m7Fm3hvPPfecc+97Bnw+DJ/HDw2AZoDPEdAS8DkBtAlqCWgJ+BwBLQGfE0BXAS0BLQGfI6Al4HMC6CqgJaAl4HMEtAR8TgBdBbQEtAR8joCWgM8JoKuAloCWgM8R0BLwOQF0FegrgfkLZxSgsJTZ7pgzN51QpWoDq1v3joV8+gZxNnZSRQIDWNsudMwhMPndMjYLO8cfgGjQ7Mn0TCKmrHrTHwBEgibWuqg+e2ZcFWsNnwDgIgEbADLggT8lQACsWhMbxx0Auj17hOX1ziowP51Q1hOqAJ9zods6vm+p633/dx/yxDJYrNQRDZmshmDHwMhYAiOhAJYyW65r5y8kFOd3B0pgnhkASPNIyMTExSRyt1JtABhYYjaJ7bUUipVGj0EywH79gwBDBnT1FZ5kwExiXDHz0+fGsLdfwd/KwPOGfD9GXghhfXMHVqXu2gz1y/QzBQAZMDxkYvxEuJ2gwyAUHlVQLNd6miRhQB+qCzOU8r4HMPvkfDQUQKwFALPOQTZwEAAyQCnl2ik6gX75xefiB7LjUMBW/j4++fQzT5XPjo9xqE+Xp+HFTw0jfiraIdP8X0XkH5TEEQlSsdrpBU4V+Oj6dWzlCiACBhEwgEwmi6++vuktAJygnUQxIEmYUjAMAzTDSDgoIFilGlgZeF8coQUCDDsmsoLS4fMr736A9HrWST729/dkzjfffu8tAKh3OxYF9viRgIl3rl3FzRs35J4MQ3IowwHG+S3Bt8DiPbbJnO00Sm9dmpCX/LH5WNjgtU2UwV2fw/G5hTexvLiIuYUFLC/+AO4GJdutAAUQw0Cp1pRgOLjmpcnzQvF0Jovcakp+R0JBhAcHZE6p2kSpUpP7niuD1Gx+zza3px3x0ZCYGr3i4txruPPriixNzCSxvZrCcCiIoUETJ0aG2q+kgd57WO7pEJ/2P/+recKA6dOjyO+UED853L6u392V/+SzeMw2wnyhCN6nTFrKEACmJs8JU9LpbLtxIj+i4h0GiuXHjlK8BwBNkIFb1RoiQ8H2lYBY9QYuvf4Gdn9flYBHJ2ex8tOPIAPYCVq1Bnhm4FYOnYy9d+Ws2vjTQuo3bx6gGARgamIEhUdlxF4Mt6/Z3B6iYVNAOTwIlJhdpWG3yLZH9j0iu/r2lMrfr+K7lZyn3N+JqQcABp585TRSt+/CAeYwAASJg4ARAJZFju6jM2fNxx9eVrfSd7wLgH32ZwrdhdrlhmSewwm224DYGdLUCALn2wC4H5ISgJ9/yXhXAu8vXFYr6UyPyb56fkw2Pv2GAPCwbDPAMFx3hlybfNkus571ACdAHnYeDNh6f65ZhzKDqCtgLHgAq8IzAJodnX1QGh+a5MFAoI3P7Q3384G+CHrkQYcxHW6KjvJ9XuvujvLtnnTmowTwb+f+Ay9ZNl9FvKgMAAAAAElFTkSuQmCC",unskilled:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAhElEQVR4Xu3VAREAMAwCseLfdIV85qAcGbv4W/z+E4AGxBNAIF4AnyACCMQTQCBeACuAAALxBBCIF8AKIIBAPAEE4gWwAgggEE8AgXgBrAACCMQTQCBeACuAAALxBBCIF8AKIIBAPAEE4gWwAgggEE8AgXgBrAACCMQTQCBeACuAQJ3AA2jYAEGs/2CBAAAAAElFTkSuQmCC",weaponsmith:"data:image/png;base64,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",level_diamond:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADHSURBVHhe5c+xDQIxEEXB64eQlgnpg4AeaICEGAkZXz4uwHrBSKv3oz3GGGmMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCuv8R2332ee3nfEuHI+f30/5+l9R4wr5/OXx32e3nfEWMJYwljCWMJYwljC2DGOP+qN1Dfu22NgAAAAAElFTkSuQmCC",level_emerald:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAhklEQVR42u3UMRGAMBQFwbiICUxgJVpQQ4MSFDBRQEnNPHzwtzgDW1xL0irXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAswJU7x3umLMD6bOlz1AXoc6TtSzwAAAAAAAAA+EUfFinRRoswk58AAAAASUVORK5CYII=",level_gold:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADESURBVHhe5c+xDQJBEATBT4LYyIS8SIYccDDw0fLv1wVwaqOkVY+1x8ykMZYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCufec3j/PUtifGlev5z+t+nt53xLhyPf9+3s7T+44YSxhLGEsYSxhLGEsYO+b4A2rT1Icf5ZDNAAAAAElFTkSuQmCC",level_iron:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADKSURBVHhe5c+xDcJAEEVBd0sTUAUBGaFTOkCiC4qgh+Ocjws4vWCk1fvRbmOMNMYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGM7/PPr6v+zy9r4jxzPH8+3Gdp/cVMZ45nn/eLvP0viLGEsYSxhLGEsYSxhLGjrH9Abro0nm1ZydBAAAAAElFTkSuQmCC",level_stone:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAATUlEQVR42u3SQQ2AQBAEwfO2SsYGCQ8UkQsClx8i2CoHPZm1AAAAAAAAAAAAAAAAABgqSSfpsfHPvvs6j5kjJPniq2rmC6pqbjwAP/QCF28aJUIjE8AAAAAASUVORK5CYII="}},Sl.vindicator={name:"Vindicator",aliases:"illager",behavior:bs(),entity:ys(),model:Bs(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Cs()},Sl.wandering_trader={name:"Wandering Trader",aliases:"villager",behavior:Es(),entity:xs(),model:us(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:hs()},Sl.warden={name:"Warden",behavior:Ss(),entity:Ms(),model:Rs(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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",bioluminescent_layer:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAACNElEQVR42u3bQU8aQRQAYH5BTVqIok3xZrxYQZt49VKNZ5Oee+mR/38sb+sjA2GB0mKW4fuSyS4zA0He22Ef7vZ6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwfh4cflwdn37Mri9X2hnV18fY8wnVLHB59HLYHz/Ohh/m0b78P25afk4EsGnVHMCRNA/nU7bxmMsEqSL7/3k6WmyronuxuBvH9guJoEE+Ofl/8t0H3MlwCEE//zy53s8RwJ0VP9i9Hh6dTM/qvPkL08Ac5vjMTeeIwEqqwAisBHopgyMiqBoTV9WA7PHvgIqrP+bYJ+Pxu3L/mgcc7r4e8B7JEC/P5xUvwpskyjKwCPgAz2yo18CSAIJsCLQuR/bcr/6pLACLAZ9eH0zibbcbwWo/OiPoMc2/+6yr+pVwFfAn6M+g/7w60fTMhnK1cAKUOGyn4GOoEewMwFyP5Og2q+DY06APPKzL4/25f0yCfxwUHESlMlQ9gk+AAAAAAAAAOymPxy1/r+9f3c3KcfXzd1mnI4FPbZNkItAz7ezvuZ6vZiTbda3/DoLr1U8lhRdC/pbQPOKmwhMeQlaJkE5b54Eb0myam6+Tjm+as5W79HVP/uz6RrEfTcRwNGPJKDn3sCdzpBrPJuu4t7AtsBsE7C/rcFrSIKq7g1cV/vOy6CWuniXGry2JDjoewM31b5ttfX/qsEPfdk/+HsD1dW7J4B7A1UB7g0EAAAAAAAAAAAAAAAAAAAAYL9+AzFrX0kqWSbMAAAAAElFTkSuQmCC",spots_1:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAvklEQVR42u3bzQ1AQBAGUIk4qcKRKujAzcnFWTUS9SlAETTgIrH+9r0S2MzON9lJEgAAAAAAACBSadNuvgIOHQAAAMjfAAD6EQAAAAAAAAAAiFa5rF78AHxHNvTK9l/V3ejnAje5+t2/PQLOmWYHBsBUDtEXnk05UgzvZQSM+xQAOGa2DgDwPXlRaeIAAIDYGW8DKOe8jl0GUMoBCMzaEiCGgftebNMbAaoHAAAAAAAAAAAAAAAAAAAAAAAAwewLzjZyVBx0lQAAAABJRU5ErkJggg==",spots_2:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAwElEQVR42u3csQ2DMBAFUKSIiilSwhSwAV0qGupME4n5GIAhYAEkiiSW8b03gn32fVknVxUAAAAAAAAAAAB85zGMu1UAAAAAyITHGgAAAAAAAACAoPrX2+AIAD/1WbQWmwgAQFL1PMUIcIJquRsRpojBFQtACs2zC32t+zsBxSP0AQAAAAAAAABA7qLP+lGIdt3OC9m4GuR8QqEEtx79FgSJV/VckJ4B9Hl9HgAAAAAAAAAAAAAAAAAAAAAAAP7qAIDaK6EL6Kr6AAAAAElFTkSuQmCC",tendrils:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABGElEQVR42u3cwQkCMRAF0AXxZBUe9WgHdmADXixJsD4LsIhowibEdRsw8x4EBW+Zn7gRJ9MEAAAQy/2R8svh+UomI5hS9ByAOohne7sKQXSb8yW13YBgO8DxlHIA7ACBCl5XfS54/xVQ3jOu3f6Y6orPY1l8J4HBi5/HV+HrQ2B/KmD81d8XWtGDBWD1twAAAAAAAAAAAAAAAP5B+wu4HsCgujZw/QCBi68JNGgA8qovXcHE3QFKc+hKixiD+7kHYA5D+UwgYpwAliFo9wR8ApCbR81ShCPg1N0J0AWh3h9gpoKFoT4Y2gWCBqDtCgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzN4sxb2nWs/fcgAAAABJRU5ErkJggg==",heart:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAvElEQVR42u3WvQ2DQAwGUBqqiIaGOiXslIaRIjFfBsgQ/Fg4oqFO4fckdBKlP9t3TQMAAAAAAAAAAHDr8ZzWdn6tKlHVe4kG0ATFQh8/3wi864cI/zgVpkj4v2+X4R9XgeIUEJO+h3+deNNfbANkE+Qv938hufIz9DjPh6DqFGqC6/r3CLQRhA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwP9siHI9IZ3/xJAAAAAASUVORK5CYII="},animations:Gs()},Sl.witch={name:"Witch",behavior:Js(),entity:Fs(),model:Hs(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,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"},animations:Ks()},Sl.wither_skeleton={name:"Wither Skeleton",behavior:Ts(),entity:Ws(),model:Zs(),thumbnail:"data:image/png;base64,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",animations:$s(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKCSURBVGje3VnLjsIwDOwXIHHgAkhIvXHnuBfOqz2s+P9v6TLVDpodOWm3NCUUycqjSWuP7dgxTTPwOxwOHWi32/Xt+XzuifN8lqLm3X8q9OVy6clB2G63zX6/7wn9tm37dhUAuODsc0wASAQCIKwCABX4dDo9WoIRWQBpNQBAWBU+sgBqHUQgVmcBFFjdAWMKr1aAdnVnALXPOQKifq/ugGerc4FUJPDwx/nqBYRgEXnoc9+PrIGUe48DWA0AyujH9dp9fn1137dbTxg7CNE69DEHUkBSeURVAIA0u1NgIk2rJfj+lDU54VkVmV6kUWozSoCo5Uj77iZDVAUAmuujdZO9L+spNeb61EGYEr6KQ1IZhTDQJJhTzYLcEtCHxrkGe7guigzqXvqsCgA2m82DSQiAvvrur6n+IX+OPRRe3zlELweAjNKvqVWPAB4ldA3J3QDvHqJq8gE9A0r6ZqqmQHBz+5THIowV/YBklvdfA6LwHOcAKKYgnsaptsTdQgXWcZQYFedPb3g0RR2XCrvqBnqxWpw/L3R4O+bs0DCX8mW+z8MgtamRh30K+gx/owHwosfUVJUCKAgMrUO5f/TNufkLNcgkBuFN0R9jYqpJz/OZGPl9ILIAdwWd09Ta29nu+57HT01U/KpMlyDTub3kISrIqJtoO8uhlDtp/3sGUFD0NTUmMLkzgEmWW+Ez/I1OTFLt1NCq9USdG1N+83flDsJZ8oCUf00FIHUIjgHAvxnVI7QtVhJ7xX09MuviAHgKvFRKnEt3F+Uv5/9LFywioXLar6KmqNdoFk8YRo/HY9e27SMJ4nPdw33+lxvXvcUfJxqymFNoLqFzHi6j0vmSRdMfSRlClm3qulwAAAAASUVORK5CYII="}},Sl.wolf={name:"Wolf",aliases:"dog",behavior:tl(),entity:il(),model:rl(),thumbnail:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAYAAADy1PuhAAAolElEQVR4Ae3BCZBl11ng+f93zrlvz7WqslZZtmxrlzdZ1uINGWNLXjDY0LZE0ywmYgbDxDQw09PTgCYaMD3RMEN0wwQwjdvQER22jA0GwsgGbC0lay3tUq2qRao193z7u/eec76ph51D8vyySlKVpCxH/X6W8142l1xyyTv+p1/4xT+8+uqrP3jk8OFdjUZjnu8zwnln3SUXX3zNrbfcets1b3/7h8xJnOS9z++6++4vfPH22z975OiRvXyfEM47ay65+OJrbr3l1tuuefvbP2ROYoD3njTt5fds3/6FL3/lK589euzYXs5xwnln7NJLL7321k996tfffvXbbzYnMSAEj/ceVWVZCMFvv/feL3zpy3/+2WPHju/hHCWc95Jdduml7/hXP/mTt117zTU3A8b7QFRlkKoSgsd7zzKfZ/S6HdK0lz/48I4v/s3X7vjs8RMn9nCOEc570a64/PJrf/InfuLXr33HOz4kJ7FCiJE89wyjqjQbddJehxA8K4UQ/UM7dnzha3d847ePHD26m3OEcN4LduUVV1z76Z/52duuu+66m0TE+DzH+5xlPgRCCKjyPdrtJvOzM3S7bUSEYrFIoVBERDDGUKmOUKmOEGPM79l+z+1fuP32zx4+fHg3a5xw3mldcfnl7/i5n/30/3HdddfdZE5ihRgjnU4b7z2qfI92u8n87DTdbodB1lrWrd/I2PgExlhW8t7n+w/sf2T//v07nnjyyYcPHDz40JEjR/boSawhwnmruvLKK6/79E//zK9ff/31N8tJrKCqpGlKr9dDVRnUbjWZn5um2+0wyBjLyOgYo2MTGGMQEax1OGcBYVC5XKZSKdNsthpPP/P0o0899dSOJ5588oEjR448emJ6+rl4Eq8S4bzvcfnll1/3sz/907/+zhveeZM5iRVUFe893W6XEAKD0rTH4sIsjfoSqspKIkKxWGJy3QaSQpFBxlgKhQLDiAilYoFisURSSMjzHO+9NhuNmSeefPLRAwcPPPTIo489fOi55x5dXFycjifxChC+T4yOjGy45u1v+/FHHnv8L5eW6sd5CS6//PLrfupf/svb3nHNNTfJd+BcgksSUMV7j/c5qkpfjBEfAjEqadqj1ayTZyl9MUbSNCXLMkSgWCxSKBQREfqS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",animations:ml(),render_controllers:ll(),textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAU4SURBVGje7ZnNa55FFMXnbxAR4kJBVGppSiFGDH5U2oC4cCMhiIILQXHjx0KCIhSDWFwUpGArBIsNKAUrKISSXaFVbO3CRqxiNLabgm78Gx5zBn4v5z3ME/B5s8zAZeaZr3fOmXvv3Jm3FEu3b94qv1y/3v31x5+d59euXK35pYsXa06dvp984lBBDh+6v8rs/nvrfAsLC2Xu0dkx0ZhvvzrXfb5yuo4nVx1z+m8pp175+2WpIFcvf1eOLb1V81ubm2XiBAGA1w86eJVVDzGqm57eVxABh4TFxcUKWHNKVNZCGSfAKivXt5PrBPgaJEnAv3//MyJi4sQCHSRlFuH1qnMCAC+Zn58fgZZABmMF3Ilszd1qdwIcvPLBuy7RBMph3ElwFUyTYBxzQMbMzEx55dXpcveF56u8cePT8vbZ44V5Ndbnp94Jb7UnAchgE3BVc1VMVc8+TobbKQT0JZ8zwSbprfaWBgi8yoNSMp326GBdTZOkdIp9KW3czavlA7K95QNEwGATSGBKd9x5V3fu42NVVFZK8Ekci4aA+UceLOvr61WqT9j+Vu5909PnXK12JyBlsAY46wJ94s3nupUTH1VRWXWtIzCPR5ximknLnLyuz/H2mR3mk8QNJoBJHPyp4+9WcRL8WPJFef7yC0+NnSQJJIH7rieonMP7pG9Q22AnyM4DOO0RQtCEnQQ1T81CnJCUVP3slz4hiRpEgJ/d+5YOlu/Pf9Z98t5rnXIv3/z6wyLxaM8DH5fUjAx4diLBg6TUrvQ5aRK7QsBP35yuoJW3CHj4oXuaBFCWs3MgAFDI2zKDPAGyr89BHw+bldNnEAEAkYiAGxe+qKCVtwjY2toaG5MEYALE+yzOyy2n5+D8fsA4B+pzeZ9BBLz0wX1jIuBzjx+uBLg2QMCZM8+OSYKXBrhc++HKKCTmQqTQNaM4zvTl5eVRcEMYrXrNwzehL/3UNjgQEjiBvf375kh09vs3ZGAWEpVFgNI2qM5lbW2trK6uVjAQoEUr17ckTQHvLjIBK3AufQQgExGQJDh4CMAkMAsRIMAAURkwAi8SfMGe5zEHEUdnH6hg1s9/WfuSQwBEQoC3DUoCox2X2veJ2gHdIgD7hQyV2RV2UwtH9O2BEV5fdZiEk+DqjykxD/cB9dmVpF3TLmDXU1NT9W4vUTlT686vMkDYscxxhnJgY48i20BcrQGIv9D4p488Vg4c2D9WP1gDSNshrMLYbvWdF6uIABHhBDxzZK6TLC+93v146XIHAXnn90uKALn90989uhPgjjFJoCzw7gf4vV0nIDUAAgReJPj43zZ+HvPqrpqtU0BgEY4xiQjsA+6O0IFP9B6w0zucRER4MOL9+faQOp2b3xn8DpHOL6NEXo3wL5AAKXkKDNaADC3z1iWf0IrPCU64hHh7Hm0exWVY60GQX3LSOXK04p9URtSmU2ei94DcXeo0eV84Sl8noHW2J8FJQL4S+fy0E1dwvGpdAKduIg1wNXWgmtjBtszA3xVab3t5u2y9AebtDsdIG7tNCO7AKU/kA9IX8N0iAPWnjz+t5c6m5qQP6Ht5hgC+kwA5aJmD8okIWDl1cuSJKUtUVp0mzhcZbNNNIO285QRbDyOtccQHEE1kKckruGvDoOTgPWcBfgq0/rRwH5D38zxRWi/P+eLsWsa1mBA53yKSjMEvQizu142NkbCgJKDlL3Kevmd0fxnKf5xa4yBA4irvRFCnfFBiAthMG+NHPEflnPW+N8K+OKCvrztaP318Xa4BXreX9tJe+t/pPwjVz/Na1q/9AAAAAElFTkSuQmCC",angry:"data:image/png;base64,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",tame:"data:image/png;base64,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"}},Sl.zoglin={name:"Zoglin",behavior:cl(),entity:pl(),model:Ii(),thumbnail:"data:image/png;base64,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",animations:Di(),textures:{default:"data:image/png;base64,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"}},Sl.zombie_pigman={name:"Zombie Piglin",behavior:gl(),entity:fl(),model:xr(),textures:{default:"data:image/png;base64,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"},thumbnail:"data:image/png;base64,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"},Sl.zombie_villager={name:"Zombie Villager",behavior:bl(),entity:yl(),model:Bl(),thumbnail:"data:image/png;base64,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",textures:{base:kl,base2:kl,base3:kl,base4:kl,base5:kl,base6:kl,desert:"data:image/png;base64,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",jungle:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAHQ0lEQVR42uxaW1BVVRhe63DxAsIBgSN4IAQzZdQCxdHKcbKwchytiXqpZsQZfeilB9+6PDT16ksPTbepZqqxKSxzHIcgKWUqLymaCGqDEDcj5OLhJqjs9vcf/s06++xzEXDcyv5n1vxrr8s+6/vWv/611r+P1DRNzGRxiRkuDgEOAQ4BDgEOAQ4BDgEOAQ4BDgEOAQ4BDgEOAQ4BDgEOATNN5J16sXdhBgUbW9s6A34j2+uhcm9iQtj+xy423ZGxmWOgsffjrKogpQzPo/zozdUBBXs+aw4bJt69I9d446EToZueqm+lylUF2dKqPJIFeHJSo7KAQm+sVtt2U6QnDYotm7LF5+U9IfttXiPFrvdO3l8WkJl1i2BkZiXOXCf4yNok0vrszzwCPDkporOllzRM/HYlFmt+yOUSc8fGqAB5VVCu1pt9hLl9tNI2MBi+vn7Q0sG8vT0nAPSZYz7d/AU9wyfpJGhcf6UjhpYINPyE1c7nsgKyKHEOpekAur/yz2md8Xe/aBEHK1spD3387FXKn7wwAIco3t/bTuDx/GllE+k23zVRVppK+SALUIEhHw44WwKXsVVEK6PdfVP+EJk8K8YA/EftNcpf6Uij/LpCYdRVHJvwB5zn9hF9wBJPasgBmAmJRrD1TbclqGAwwznuuQFlTBTKkLcCbxCgzmTTwLC41NljLAXVF4RbIuFma4VnnlGm5icjG57dINqbbhBgpNff2CnO1w8GkbM4P4vW+rWRW5Si3gXMZFiZeadvMGSdCjRp1sQxY/OqxWT+fcOjIjtp1qQJOLC/WixaVyxa+obE86+9LH744GtRtrvMqE9bk0y6b/6EEy19qYRIKNm2MZgAgEhdnWyAR54BQrjO3IY1wGCmoQEaiWfePSc+4McwaJUgc0K/rc9tDAkeQCDx8TFE7pnaS2JoSRxpvBvWAMHsN9b0BN1DLC0AIMpWpkhvkd80kWewKHsmLU2yZtDIQ3uuu2Wrb4RM0Tfi32Yww3jm/KMFOcbMQ9R2rJkY9Kut/s0gkIllko9XHKXyqh+rRYY3Q6ItBBqg6883il/3Nkj1EoZ+TXUXKF/+bVXkuwAL9s5Igr2Vz/Y8aCvhpQCywrWzEpgu+rDmtT0ZsbwLfLmvTUt3J4muPp9lp5aEBJEzOCjQZkwmiu7eDspDupU+6kDNjpBnPVS9GXCoetSBcPMFayoSGydnU+bVF7zGSysO+7SHl6XIsw292lO61l2LQL5waZysuJqgdf3tB37zQf1Gd7o/5ODVMtWs1XbhPPTttJl0QOTxpQumdDhp7h8LAGg1WCuzDwdKNXlz+6nMvtUSCOkDEFcY9wPmH9TGz9dSOV/fE2J1GHOCoqEqqk5a3q01fwBiBhBQUpw6sy0glERzPrhvCKhr7yKzj3J53JOCI5oGQFYm754XzySI5QvTDVL8bW/p/kAahFj117cc+fFbxRprlB06oUlbEYDwUcl4bC3gxtfSK4qXJpLJMwlwgJlZqUYszvAXptjcV/saDULw/M6OtVpde48t/YoLg8YM4QEDN5u5DtqYMQ4pgRT04/YMnmcXQBm46lTNJNuCAHU9f/dTIwHYtqtSwvwZMJu/bhES4BGBwQEJoAAcSX0PO0rVcuwInggAUA4wqlbQ1z8atFY5wAgi2EpQhpnn9/CXGURrmSCcGvHMv2ErAhgMa33QUpl1qUZSvUnJRhlm+YaWIrt8CdSeNc88iAIxHJJGmdrGTrvAtIufmOAyu26DhuhblaJjeMYDxKosQtDElsCN2+D6wvho25JHd+fOF3nL/SGvy3VDwjUQHKHpuXpOQztIpLa2uw3qA9eKtmRTQh5JzHYh+Z1jc7c4/XO7Aa5n4Lw2lthhbHe5a/vQ13gfgFO/f3uJGFueBM0zCwFI94IUGjjJ9TFRWrKcsg/kz5d7PjziB6MTgzbuBUJDfwDGc+n6ArQT/zR2i/KDddS3vKrOlkvAmF0ABohfvmmRoj9Ry82YI5r/GxZrHvOIFflzCZAqAMdSXlNP/T2uZMNX8IdJ1tgJ7qYztIoIuV7ZvFIe/X2Y0oHvO2TBWIrctC5fAPzKZR5qdPFUrzzXOERnBIDG3g6prpVECtLu7euxxgk4g8fhB1sgNJ7tuBOEvA0C/F8NnSBCqt6/tyvOOCGCURxwmBB8gQVgDpqgHGU4ANntEhSRgANHmsn82QrGj7USWj8lEnAWfJdnEvCJGjMOk0cCeDsegCISsHVDrkSCFTz5RG7AFRkyftIzQONYzH9RARl8D7gX4gF08DE7h/b+EXHq9BXKF/mPxlK1BN0KtPQkEDHRB0T4L0rJ1F7PgyGJ8rstoWKZseZToCqrijKDypiIw2dqdWvIo+UAq+jsaiP9SXmD3Fm6TNO1ePHpfMNibHsSvJ3G+AMi/ngIDXA6aG38HaQfysvT2DpAlE4SPdfUjtoGsPmfopP+LoAZVwgkffHyZaMOFiLu4F9xp0v+F2AAznzS9BDvgH4AAAAASUVORK5CYII=",plains:"data:image/png;base64,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",savanna:"data:image/png;base64,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",snow:"data:image/png;base64,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",swamp:"data:image/png;base64,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",taiga:"data:image/png;base64,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"}},Sl.zombie={name:"Zombie",behavior:Ql(),entity:Il(),model:Dl(),thumbnail:"data:image/png;base64,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",textures:{default:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAOMSURBVGje5VhNaxNRFJ3fkZ0LSzbiB1ikgtlpW4ILFxEaNymILUGkQinaRZfiKm66KEh3Qnf9I/lPz5zXOeOZkzeZBINMxsLh3bx7M80579773pssq/l7cfwgPD98GDiqrWMK8GWb/kcyeydPCwFoK9EU4GuFAK/Pt0ukaasoz95slcD51ggAqACArn5rBeBKMws0I7QEUgK0ogRSqw4BvBG2VgCtd61/EvdS0AYIXyt6QNXWx1LQctBdYyME0K1Nu73v76ltzle/6hm+Y1AgxDZmn3fS/IFK4PjbIMK3RG+I+hzdPVJjozLACVCEDz8G4ePlMHz5+T6czMZPl+/iXGo7XHRo4naqfaVxNa5pjBErfnC+G4kTnMOoW6I3SB1dLGZII/d5/ljMgWin04kgeX6GT8XSrNEsoM8baKNKwLu37vmsfcbys5Je1AvUpzGNKQECB5jUau2ePon2/szez+cx5+mM7+IZvntoZmimNa4J+uqkzvq0fc/3DKo6GPlzG3cuGOxNg6Lb7ZZQ+4DpNGwf3E8CvkfdzwtR+/zb2/iciJntmdUIAfxeQKxFAJLPsfZtddME8BPmf1cCf3338B+w8/h7eLnzqwDmtu4NC6gPyC4u/mA4DNn1dchubuZOl5iLPo0HMJd/J5IDYGv81dUdYJsAtf51CgA7KcDR0R1gk8jsxxedHkRITuMBkqVfRUgJ5nF1/lUFcIK1AigZFSAXYW51NZ4CkLCS5/ivBMDKVwkAnwqAz8yUmPYkA9vJ6Opjvipe49T2eKQ6swZ2nX8ZAUhokQD0c6Rd/GPCVzAlgMczUzxzpMkRPIYT7sf9RFErAFdSBdAV1r6g87RLZLymVQDaKhjsGgH0YoZ+wgsZRlzJ9RYLYI5A3FICKCnPAJ1L+ecIefqrGADjmbZVQuXxfrwGMV7PMXKedxj4356+iuRhr00AjVtqF0jVP7u6NkEXy8Tw6zRXlwLQxwxhaTBupSZYJYDXvWJOgKpmxs9VgnnpmABMc5JnKeiLWQqwUgn0er0AVBHkPOPG43EJBSE92OhKOrGUAH4WkDl90wSyJE8h/DZK4ktnQL/fL8iR4GQyCV/PzqKtPsS6ADwncHQBi0whwRlpPVfM+XPhOK+XHb6fZPrD1ldv9KMHLJ0BIKUAKZIH3D8ajUpQAVLbqJYSiC2KZ4yWor5u4ys6fS+pPYJvrtkEMdbx/w1lxzkXWEm9iwAAAABJRU5ErkJggg=="},animations:Ni()};const zl=Sl;var Ml=a(8569),Ul=a.n(Ml);const Rl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAABVklEQVR4nOyZu0pDQRRFjxBFMTcxPhpFEMTCRkhnb+MPiKBgbav4B2lF/0FQkLQp8gmCoBALCxECQRsfMSSipEp3SWAPYSBhM8Ne1bA5HO6Cw7mvTJLLWchkLHAkwGZAoHV3YD40v15gXljYsHH2yW/fpGeNEBsJsJEAm7gEXPt457gD84dyEeauPi7c/W0oGiE2EmAjATZxCTTuJ2FRpYQ9ffe96/m+UnqCea1at2FohNhIgI0E2AQvMNH/bbQwtwyLjsq3MD/pntoouJy6gPnV3j7Mmz/v6VkjxEYCbCTAJq77wPrqJiz6brdg/ni9YqOgePgG8/kkD/PXxnN61gixkQAbCbCJS8C17137+O/jH+YzS9Ne9a7+ruvpRyPERgJsJMAmrveB6tkWLJrNZs2HxbU2zD/rifnw28H/j3fPa+lZI8RGAmwkwCau+0CIaITYBC/QAwAA//9Cy7DYAAAABklEQVQDAKP4R80IhpgiAAAAAElFTkSuQmCC";function jl(e){let t="",i="";Blockbench.isNewerThan("4.99")?(t=SystemInfo.home_directory,i=SystemInfo.appdata_directory):(t=a(857).homedir(),i=electron.process.env.APPDATA);let o=null;switch(Blockbench.platform){case"win32":let a=Ol();"edu"==e?(o=PathModule.join(i,"Minecraft Education Edition"),a.existsSync(o)||(o=PathModule.join(i,"../local/","Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState"))):"preview"==e?(o=PathModule.join(i,"Minecraft Bedrock Preview/Users/Shared/"),a.existsSync(o)||(o=PathModule.join(i,"../local/","Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState"))):(o=PathModule.join(i,"Minecraft Bedrock/Users/Shared/"),a.existsSync(o)||(o=PathModule.join(i,"../local/","Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState")));break;case"linux":o=PathModule.join(t,".local/share/mcpelauncher");break;case"darwin":o=PathModule.join(t,"Library/Application Support/mcpelauncher");break;case"android":o=PathModule.join(t,"storage/shared/");break;default:return""}return PathModule.join(o,"games/com.mojang")}let Gl;function Ol(){if(isApp)return Gl||(Blockbench.isNewerThan("4.99")?(Gl=requireNativeModule("fs",{message:"Enable file system access so that the wizard can export a pack into your Minecraft folder"}),Gl):isApp?a(9896):void 0)}var Jl=function(){var e=this,t=e._self._c;return t("div",[e._m(0),e._v(" "),t("section",[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.spawn_egg_mode,expression:"form.spawn_egg_mode"}],attrs:{type:"radio",id:"entity_wizard_egg_color",value:"colors"},domProps:{checked:e._q(e.form.spawn_egg_mode,"colors")},on:{change:function(t){return e.$set(e.form,"spawn_egg_mode","colors")}}}),t("label",{attrs:{for:"entity_wizard_egg_color"}},[e._v("Colors")]),e._v(" "),t("p",[e._v("Select the default spawn egg icon and pick the base color and an overlay color")]),e._v(" "),t("div",{directives:[{name:"show",rawName:"v-show",value:"colors"==e.form.spawn_egg_mode,expression:"form.spawn_egg_mode == 'colors'"}],attrs:{id:"entity_wizard_egg_color_bar"}},[t("colored-spawn-egg",{attrs:{base:e.form.spawn_egg_base,overlay:e.form.spawn_egg_overlay}}),e._v(" "),t("div",{staticStyle:{"line-height":"38px"}},[t("input",{ref:"spawn_egg_base"}),e._v(" "),t("label",[e._v("Base Color")]),e._v(" "),t("br"),e._v(" "),t("input",{ref:"spawn_egg_overlay"}),e._v(" "),t("label",[e._v("Overlay Color")])])],1)]),e._v(" "),t("section",[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.spawn_egg_mode,expression:"form.spawn_egg_mode"}],attrs:{type:"radio",id:"entity_wizard_egg_texture",value:"texture"},domProps:{checked:e._q(e.form.spawn_egg_mode,"texture")},on:{change:function(t){return e.$set(e.form,"spawn_egg_mode","texture")}}}),t("label",{attrs:{for:"entity_wizard_egg_texture"}},[e._v("Custom Texture")]),e._v(" "),t("p",[e._v("Load a custom texture for your spawn egg item")]),e._v(" "),"texture"==e.form.spawn_egg_mode?t("icon-picker",{model:{value:e.form.spawn_egg_image,callback:function(t){e.$set(e.form,"spawn_egg_image",t)},expression:"form.spawn_egg_image"}}):e._e()],1),e._v(" "),t("section",[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.spawn_egg_mode,expression:"form.spawn_egg_mode"}],attrs:{type:"radio",id:"entity_wizard_egg_none",value:"none"},domProps:{checked:e._q(e.form.spawn_egg_mode,"none")},on:{change:function(t){return e.$set(e.form,"spawn_egg_mode","none")}}}),t("label",{attrs:{for:"entity_wizard_egg_none"}},[e._v("None")]),e._v(" "),t("p",[e._v("Do not generate a spawn egg. With this option, you will only be able to spawn the entity using commands.")])])])};Jl._withStripped=!0;var Yl=function(){var e=this._self._c;return e("div",{attrs:{id:"entity_wizard_egg_color_preview"}},[e("canvas",{ref:"canvas"})])};Yl._withStripped=!0;const Fl=new Image(16,16);Fl.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA1UlEQVQ4y6WTzQmEMBCFbW+r8CDe7MEmbGA7sAgPmhYk+AOiXlQ85DrLGxiRdZPNuoGHePi+mTxI8HhmgeTWuQ36CNI0pSRJ6GcpQERrTUopkn9vuK5rDgTzPLOkqiq/bUSwbRtn33fq+95PcIaNMQwvy0Jd17HgqwQCTFvXlQX4juN4XMkpkNIAyPrTNB2wCKwSEQzDwDBWb5rmAiNxHJP1/m3bsgDtf5qOhGFIzhJtk5EoitwlFkVxgSR5nrsFOCgIOYNlWTL4DjvfESQC2ab+9YIlLxpxdMvXu3+1AAAAAElFTkSuQmCC";const ql=new Image(16,16);function Hl(e,t,a,i,o,r,n,m){var s,l="function"==typeof e?e.options:e;if(t&&(l.render=t,l.staticRenderFns=a,l._compiled=!0),i&&(l.functional=!0),r&&(l._scopeId="data-v-"+r),n?(s=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(n)},l._ssrRegister=s):o&&(s=m?function(){o.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:o),s)if(l.functional){l._injectStyles=s;var A=l.render;l.render=function(e,t){return s.call(t),A(e,t)}}else{var c=l.beforeCreate;l.beforeCreate=c?[].concat(c,s):[s]}return{exports:e,options:l}}ql.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVQ4y62UMUvDUBSF729y0NHJIag4OPgbXJIp1EqbZMqYqWJBRUqhjSIGp1DEqEHEEBIQba1tjTWVloL/4frug0ipNK3FB4e35Hznnct7AaFUgERzrbmNswDWxG1Y3tr8O1TTNCQVm0+g3N9wkKIoOLO5XC5jtVrFIAjwPI44xDAMzGaz0yGqqmKlUkHbttHzPLwd9qHUeQHLsnBqHTpqofEIYRii7/voMrPd78FxuwG7dw5XKoQAlFYb9ODhawiXzHza7QBV0nUdUwFk3m8+w0m3DZQeRRGefbxBkZ3IcZwfwERIPp/nwzOjFsRxjDWWfvBa55VIiZm0tLH6G5DL5XjKUasOV4NPuIjfwXVdHAfQkBeElck19tjHhwximiaOdqedJEkSpg5RvrZ5UmKme5EAZFlGURTT7wINiDTaeYdpcV2AcXPqOyIIJWYyGSTzvz7E0V/AN87bB/pr+VlTAAAAAElFTkSuQmCC";const Vl=Hl({name:"colored-spawn-egg",props:{base:String,overlay:String},methods:{updateCanvas(){this.ctx.globalCompositeOperation="source-over",this.ctx.clearRect(0,0,16,16),this.ctx.drawImage(Fl,0,0),this.ctx.globalCompositeOperation="multiply",this.ctx.fillStyle=this.base,this.ctx.fillRect(0,0,16,16),this.ctx.globalCompositeOperation="destination-in",this.ctx.drawImage(Fl,0,0),this.ctx2.globalCompositeOperation="source-over",this.ctx2.clearRect(0,0,16,16),this.ctx2.drawImage(ql,0,0),this.ctx2.globalCompositeOperation="multiply",this.ctx2.fillStyle=this.overlay,this.ctx2.fillRect(0,0,16,16),this.ctx2.globalCompositeOperation="destination-in",this.ctx2.drawImage(ql,0,0),this.ctx.globalCompositeOperation="source-over",this.ctx.drawImage(this.canvas2,0,0)}},watch:{base(){this.updateCanvas()},overlay(){this.updateCanvas()}},mounted(){this.canvas=this.$refs.canvas,this.canvas.width=16,this.canvas.height=16,this.ctx=this.canvas.getContext("2d"),this.canvas2=document.createElement("canvas"),this.canvas2.width=16,this.canvas2.height=16,this.ctx2=this.canvas2.getContext("2d"),this.updateCanvas()}},Yl,[],!1,(function(e){var t=a(2694);t.__inject__&&t.__inject__(e)}),null,"1ebfb222").exports;var Kl=function(){var e=this,t=e._self._c;return t("div",{staticClass:"entity_wizard_icon_picker"},[t("div",{staticClass:"icon_picker_left"},[e.value?t("img",{attrs:{src:e.value,width:"64px",height:"64px"}}):e._e()]),e._v(" "),t("div",{staticClass:"icon_picker_right",on:{click:e.pickImage}},[t("i",{staticClass:"material-icons icon"},[e._v("folder")]),e._v(" "),t("label",[e._v(e._s(e.imageName))])])])};Kl._withStripped=!0;const Nl=Hl({name:"icon-picker",props:{value:String},methods:{pickImage(){Blockbench.import({readtype:"image",type:"Image",extensions:["png"]},(e=>{this.value=e[0].content||e[0].path,this.$emit("input",this.value)}))}},computed:{imageName(){if(!this.value)return"Select Image...";let e=this.value.split(osfs);return e.length>2?e.last():""}}},Kl,[],!1,(function(e){var t=a(4769);t.__inject__&&t.__inject__(e)}),null,"5f161121").exports,Tl=Hl({name:"spawn-egg",components:{ColoredSpawnEgg:Vl,IconPicker:Nl},props:{form:Object},methods:{loadImage(){}},mounted(){$(this.$refs.spawn_egg_base).spectrum({preferredFormat:"hex",color:this.form.spawn_egg_base,showAlpha:!1,showInput:!0,move:e=>{this.form.spawn_egg_base=e.toHexString()},change:e=>{this.form.spawn_egg_base=e.toHexString()}}),$(this.$refs.spawn_egg_overlay).spectrum({preferredFormat:"hex",color:this.form.spawn_egg_overlay,showAlpha:!1,showInput:!0,move:e=>{this.form.spawn_egg_overlay=e.toHexString()},change:e=>{this.form.spawn_egg_overlay=e.toHexString()}})}},Jl,[function(){var e=this._self._c;return e("section",[e("p",[this._v("Design the item that the mob will be spawned with.")])])}],!1,(function(e){var t=a(4737);t.__inject__&&t.__inject__(e)}),null,"049dbc44").exports;var Pl=function(){var e=this,t=e._self._c;return t("div",[e._m(0),e._v(" "),t("section",[t("input",{attrs:{type:"radio",id:"entity_wizard_loot_same",value:"default"},domProps:{checked:"default"==e.form.loot_type},on:{change:function(t){e.form.loot_type="default"}}}),e._v(" "),t("label",{attrs:{for:"entity_wizard_loot_same"}},[e._v("Default Loot")]),e._v(" "),t("p",{staticClass:"description"},[e._v(e._s(e.getSameLootText()))])]),e._v(" "),t("section",[t("input",{attrs:{type:"radio",id:"entity_wizard_loot_none",value:"none"},domProps:{checked:"none"==e.form.loot_type},on:{change:function(t){e.form.loot_type="none"}}}),e._v(" "),t("label",{attrs:{for:"entity_wizard_loot_none"}},[e._v("No Loot")])]),e._v(" "),t("section",[t("input",{attrs:{type:"radio",id:"entity_wizard_loot_custom",value:"texture"},domProps:{checked:"custom"==e.form.loot_type},on:{change:function(t){e.form.loot_type="custom"}}}),e._v(" "),t("label",{attrs:{for:"entity_wizard_loot_custom"}},[e._v("Custom Loot")]),e._v(" "),"custom"==e.form.loot_type?[t("p",{staticClass:"description"},[e._v("From each pool, one entry will be selected randomly.")]),e._v(" "),t("ul",{attrs:{id:"entity_wizard_loot_list"}},e._l(e.form.custom_loot,(function(a){return t("li",{key:a.uuid},[t("p",{staticClass:"description"},[e._v("Randomly pick one of these entries:")]),e._v(" "),t("ul",{attrs:{id:"entity_wizard_loot_item_list"}},e._l(a.entries,(function(i){return t("li",{key:i.uuid},[t("select-input",{attrs:{options:e.item_ids},model:{value:i.type,callback:function(t){e.$set(i,"type",t)},expression:"item.type"}}),e._v(" "),"custom"==i.type?t("input",{directives:[{name:"model",rawName:"v-model",value:i.custom_id,expression:"item.custom_id"}],attrs:{type:"text",title:"Enter a custom item identifier"},domProps:{value:i.custom_id},on:{input:function(t){t.target.composing||e.$set(i,"custom_id",t.target.value)}}}):e._e(),e._v(" "),"empty"!=i.type?[t("label",[e._v("Count Min:")]),e._v(" "),t("numeric-input",{attrs:{min:0,max:i.count_max,title:"Set the minimum possible count for this item"},model:{value:i.count_min,callback:function(t){e.$set(i,"count_min",t)},expression:"item.count_min"}}),e._v(" "),t("label",[e._v("Max:")]),e._v(" "),t("numeric-input",{attrs:{min:i.count_min,max:64,title:"Set the maximum possible count for this item"},model:{value:i.count_max,callback:function(t){e.$set(i,"count_max",t)},expression:"item.count_max"}})]:e._e(),e._v(" "),a.entries.length>1?[t("label",[e._v("Probability:")]),e._v(" "),t("numeric-input",{attrs:{min:0,title:"Increase the probability to make an item more likely to drop"},model:{value:i.weight,callback:function(t){e.$set(i,"weight",t)},expression:"item.weight"}}),e._v(" "),t("div",{staticClass:"tool",on:{click:function(e){return a.entries.remove(i)}}},[t("i",{staticClass:"material-icons"},[e._v("clear")])])]:e._e()],2)})),0),e._v(" "),t("button",{on:{click:function(t){return e.addItem(a)}}},[e._v("Add Item")]),e._v(" "),t("button",{on:{click:function(t){return e.form.custom_loot.remove(a)}}},[e._v("Remove Pool")])])})),0),e._v(" "),t("button",{on:{click:function(t){return e.addPool()}}},[e._v("Add Pool")])]:e._e()],2)])};Pl._withStripped=!0;let Wl={empty:"Empty",custom:"Custom ID",acacia_boat:"Acacia Boat",acacia_button:"Acacia Button",acacia_chest_boat:"Acacia Chest Boat",acacia_door:"Acacia Door",acacia_fence:"Acacia Fence",acacia_fence_gate:"Acacia Fence Gate",acacia_hanging_sign:"Acacia Hanging Sign",acacia_log:"Acacia Log",acacia_pressure_plate:"Acacia Pressure Plate",acacia_sign:"Acacia Sign",acacia_stairs:"Acacia Stairs",acacia_trapdoor:"Acacia Trapdoor",activator_rail:"Activator Rail",allay_spawn_egg:"Allay Spawn Egg",amethyst_block:"Block of Amethyst",amethyst_cluster:"Amethyst Cluster",amethyst_shard:"Amethyst Shard",ancient_debris:"Ancient Debris",andesite_stairs:"Andesite Stairs",angler_pottery_sherd:"Angler Pottery Sherd",anvil:"Anvil",apple:"Apple",archer_pottery_sherd:"Archer Pottery Sherd",armor_stand:"Armor Stand",arms_up_pottery_sherd:"Arms Up Pottery Sherd",arrow:"Arrow",axolotl_bucket:"Axolotl Bucket",axolotl_spawn_egg:"Axolotl Spawn Egg",azalea:"Azalea",azalea_leaves:"Azalea Leaves",azalea_leaves_flowered:"Flowering Azalea Leaves",baked_potato:"Baked Potato",bamboo:"Bamboo",bamboo_block:"Block of Bamboo",bamboo_button:"Bamboo Button",bamboo_chest_raft:"Bamboo Chest Raft",bamboo_door:"Bamboo Door",bamboo_double_slab:"Bamboo Double Slab",bamboo_fence:"Bamboo Fence",bamboo_fence_gate:"Bamboo Fence Gate",bamboo_hanging_sign:"Bamboo Hanging Sign",bamboo_mosaic:"Bamboo Mosaic",bamboo_mosaic_double_slab:"Bamboo Mosaic Double Slab",bamboo_mosaic_slab:"Bamboo Mosaic Slab",bamboo_mosaic_stairs:"Bamboo Mosaic Stairs",bamboo_planks:"Bamboo Planks",bamboo_pressure_plate:"Bamboo Pressure Plate",bamboo_raft:"Bamboo Raft",bamboo_sapling:"Bamboo Sapling",bamboo_sign:"Bamboo Sign",bamboo_slab:"Bamboo Slab",bamboo_stairs:"Bamboo Stairs",bamboo_trapdoor:"Bamboo Trapdoor",banner:"Banner",banner_pattern:"Banner Pattern",barrel:"Barrel",barrier:"Barrier",basalt:"Basalt",bat_spawn_egg:"Bat Spawn Egg",beacon:"Beacon",bed:"Bed",bedrock:"Bedrock",bee_nest:"Bee Nest",bee_spawn_egg:"Bee Spawn Egg",beef:"Raw Beef",beehive:"Beehive",beetroot:"Beetroot",beetroot_seeds:"Beetroot Seeds",beetroot_soup:"Beetroot Soup",bell:"Bell",big_dripleaf:"Big Dripleaf",birch_boat:"Birch Boat",birch_button:"Birch Button",birch_chest_boat:"Birch Chest Boat",birch_door:"Birch Door",birch_fence:"Birch Fence",birch_fence_gate:"Birch Fence Gate",birch_hanging_sign:"Birch Hanging Sign",birch_log:"Birch Log",birch_pressure_plate:"Birch Pressure Plate",birch_sign:"Birch Sign",birch_stairs:"Birch Stairs",birch_trapdoor:"Birch Trapdoor",black_candle:"Black Candle",black_candle_cake:"Cake with Black Candle",black_carpet:"Black Carpet",black_concrete:"Black Concrete",black_dye:"Black Dye",black_glazed_terracotta:"Black Glazed Terracotta",black_shulker_box:"Black Shulker Box",black_wool:"Black Wool",blackstone:"Blackstone",blackstone_double_slab:"Blackstone Double Slab",blackstone_slab:"Blackstone Slab",blackstone_stairs:"Blackstone Stairs",blackstone_wall:"Blackstone Wall",blade_pottery_sherd:"Blade Pottery Sherd",blast_furnace:"Blast Furnace",blaze_powder:"Blaze Powder",blaze_rod:"Blaze Rod",blaze_spawn_egg:"Blaze Spawn Egg",bleach:"Bleach",blue_candle:"Blue Candle",blue_candle_cake:"Cake with Blue Candle",blue_carpet:"Blue Carpet",blue_concrete:"Blue Concrete",blue_dye:"Blue Dye",blue_glazed_terracotta:"Blue Glazed Terracotta",blue_ice:"Blue Ice",blue_shulker_box:"Blue Shulker Box",blue_wool:"Blue Wool",boat:"Boat",bone:"Bone",bone_block:"Bone Block",bone_meal:"Bone Meal",book:"Book",bookshelf:"Bookshelf",border_block:"Border",bordure_indented_banner_pattern:"Bordure Indented Banner Pattern",bow:"Bow",bowl:"Bowl",brain_coral:"Brain Coral",bread:"Bread",brewer_pottery_sherd:"Brewer Pottery Sherd",brewing_stand:"Brewing Stand",brick:"Brick",brick_block:"Brick Block",brick_stairs:"Brick Stairs",brown_candle:"Brown Candle",brown_candle_cake:"Cake with Brown Candle",brown_carpet:"Brown Carpet",brown_concrete:"Brown Concrete",brown_dye:"Brown Dye",brown_glazed_terracotta:"Brown Glazed Terracotta",brown_mushroom:"Brown Mushroom",brown_mushroom_block:"Brown Mushroom Block",brown_shulker_box:"Brown Shulker Box",brown_wool:"Brown Wool",brush:"Brush",bubble_coral:"Bubble Coral",bucket:"Bucket",budding_amethyst:"Budding Amethyst",burn_pottery_sherd:"Burn Pottery Sherd",cactus:"Cactus",cake:"Cake",calcite:"Calcite",calibrated_sculk_sensor:"Calibrated Sculk Sensor",camel_spawn_egg:"Camel Spawn Egg",camera:"Camera",campfire:"Campfire",candle:"Candle",candle_cake:"Cake with Candle",carpet:"Carpet",carrot:"Carrot",carrot_on_a_stick:"Carrot On A Stick",carrots:"Carrots",cartography_table:"Cartography Table",carved_pumpkin:"Carved Pumpkin",cat_spawn_egg:"Cat Spawn Egg",cauldron:"Cauldron",cave_spider_spawn_egg:"Cave Spider Spawn Egg",cave_vines:"Cave Vines",cave_vines_body_with_berries:"Cave Vines",cave_vines_head_with_berries:"Cave Vines",chain:"Chain",chain_command_block:"Chain Command Block",chainmail_boots:"Chain Boots",chainmail_chestplate:"Chain Chestplate",chainmail_helmet:"Chain Helmet",chainmail_leggings:"Chain Leggings",charcoal:"Charcoal",chemical_heat:"Chemical Heat",chemistry_table:"Chemistry Table",cherry_boat:"Cherry Boat",cherry_button:"Cherry Button",cherry_chest_boat:"Cherry Chest Boat",cherry_door:"Cherry Door",cherry_double_slab:"Cherry Double Slab",cherry_fence:"Cherry Fence",cherry_fence_gate:"Cherry Fence Gate",cherry_hanging_sign:"Cherry Hanging Sign",cherry_leaves:"Cherry Leaves",cherry_log:"Cherry Log",cherry_planks:"Cherry Planks",cherry_pressure_plate:"Cherry Pressure Plate",cherry_sapling:"Cherry Sapling",cherry_sign:"Cherry Sign",cherry_slab:"Cherry Slab",cherry_stairs:"Cherry Stairs",cherry_trapdoor:"Cherry Trapdoor",cherry_wood:"Cherry Wood",chest:"Chest",chest_boat:"Chest Boat",chest_minecart:"Minecart with Chest",chicken:"Raw Chicken",chicken_spawn_egg:"Chicken Spawn Egg",chiseled_bookshelf:"Chiseled Bookshelf",chiseled_deepslate:"Chiseled Deepslate",chiseled_nether_bricks:"Chiseled Nether Bricks",chiseled_polished_blackstone:"Chiseled Polished Blackstone",chorus_flower:"Chorus Flower",chorus_fruit:"Chorus Fruit",chorus_plant:"Chorus Plant",clay:"Clay Block",clay_ball:"Clay",client_request_placeholder_block:"Client Request Placeholder Block",clock:"Clock",coal:"Coal",coal_block:"Block of Coal",coal_ore:"Coal Ore",coast_armor_trim_smithing_template:"Coast Armor Trim Smithing Template",cobbled_deepslate:"Cobbled Deepslate",cobbled_deepslate_double_slab:"Cobbled Deepslate Double Slab",cobbled_deepslate_slab:"Cobbled Deepslate Slab",cobbled_deepslate_stairs:"Cobbled Deepslate Stairs",cobbled_deepslate_wall:"Cobbled Deepslate Wall",cobblestone:"Cobblestone",cobblestone_wall:"Cobblestone Wall",cocoa:"Cocoa",cocoa_beans:"Cocoa Beans",cod:"Cod",cod_bucket:"Cod Bucket",cod_spawn_egg:"Cod Spawn Egg",colored_torch_bp:"Colored Torch Bp",colored_torch_rg:"Colored Torch Rg",command_block:"Command Block",command_block_minecart:"Minecart with Command Block",comparator:"Redstone Comparator",compass:"Compass",composter:"Composter",compound:"Compound",concrete:"Concrete",concrete_powder:"Concrete Powder",conduit:"Conduit",cooked_beef:"Cooked Beef",cooked_chicken:"Cooked Chicken",cooked_cod:"Cooked Cod",cooked_mutton:"Cooked Mutton",cooked_porkchop:"Cooked Porkchop",cooked_rabbit:"Cooked Rabbit",cooked_salmon:"Cooked Salmon",cookie:"Cookie",copper_block:"Block of Copper",copper_ingot:"Copper Ingot",copper_ore:"Copper Ore",coral:"Coral",coral_block:"Coral Block",coral_fan:"Coral Fan",coral_fan_dead:"Coral Fan Dead",coral_fan_hang:"Coral Fan Hang",cow_spawn_egg:"Cow Spawn Egg",cracked_deepslate_bricks:"Cracked Deepslate Bricks",cracked_deepslate_tiles:"Cracked Deepslate Tiles",cracked_nether_bricks:"Cracked Nether Bricks",cracked_polished_blackstone_bricks:"Cracked Polished Blackstone Bricks",crafting_table:"Crafting Table",creeper_banner_pattern:"Creeper Banner Pattern",creeper_spawn_egg:"Creeper Spawn Egg",crimson_button:"Crimson Button",crimson_door:"Crimson Door",crimson_double_slab:"Crimson Slab",crimson_fence:"Crimson Fence",crimson_fence_gate:"Crimson Fence Gate",crimson_fungus:"Crimson Fungus",crimson_hanging_sign:"Crimson Hanging Sign",crimson_hyphae:"Crimson Hyphae",crimson_nylium:"Crimson Nylium",crimson_planks:"Crimson Planks",crimson_pressure_plate:"Crimson Pressure Plate",crimson_roots:"Crimson Roots",crimson_sign:"Crimson Sign",crimson_slab:"Crimson Slab",crimson_stairs:"Crimson Stairs",crimson_stem:"Crimson Stem",crimson_trapdoor:"Crimson Trapdoor",crossbow:"Crossbow",crying_obsidian:"Crying Obsidian",cut_copper:"Cut Copper",cut_copper_slab:"Cut Copper Slab",cut_copper_stairs:"Cut Copper Stairs",cyan_candle:"Cyan Candle",cyan_candle_cake:"Cake with Cyan Candle",cyan_carpet:"Cyan Carpet",cyan_concrete:"Cyan Concrete",cyan_dye:"Cyan Dye",cyan_glazed_terracotta:"Cyan Glazed Terracotta",cyan_shulker_box:"Cyan Shulker Box",cyan_wool:"Cyan Wool",danger_pottery_sherd:"Danger Pottery Sherd",dark_oak_boat:"Dark Oak Boat",dark_oak_button:"Dark Oak Button",dark_oak_chest_boat:"Dark Oak Chest Boat",dark_oak_door:"Dark Oak Door",dark_oak_fence:"Dark Oak Fence",dark_oak_fence_gate:"Dark Oak Fence Gate",dark_oak_hanging_sign:"Dark Oak Hanging Sign",dark_oak_log:"Dark Oak Log",dark_oak_pressure_plate:"Dark Oak Pressure Plate",dark_oak_sign:"Dark Oak Sign",dark_oak_stairs:"Dark Oak Stairs",dark_oak_trapdoor:"Dark Oak Trapdoor",dark_prismarine_stairs:"Dark Prismarine Stairs",daylight_detector:"Daylight Sensor",daylight_detector_inverted:"Daylight Detector Inverted",dead_brain_coral:"Dead Brain Coral",dead_bubble_coral:"Dead Bubble Coral",dead_fire_coral:"Dead Fire Coral",dead_horn_coral:"Dead Horn Coral",dead_tube_coral:"Dead Tube Coral",deadbush:"Dead Bush",debug_stick:"Debug Stick",decorated_pot:"Decorated Pot",deepslate:"Deepslate",deepslate_brick_double_slab:"Deepslate Brick Double Slab",deepslate_brick_slab:"Deepslate Brick Slab",deepslate_brick_stairs:"Deepslate Brick Stairs",deepslate_brick_wall:"Deepslate Brick Wall",deepslate_bricks:"Deepslate Bricks",deepslate_coal_ore:"Deepslate Coal Ore",deepslate_copper_ore:"Deepslate Copper Ore",deepslate_diamond_ore:"Deepslate Diamond Ore",deepslate_emerald_ore:"Deepslate Emerald Ore",deepslate_gold_ore:"Deepslate Gold Ore",deepslate_iron_ore:"Deepslate Iron Ore",deepslate_lapis_ore:"Deepslate Lapis Lazuli Ore",deepslate_redstone_ore:"Deepslate Redstone Ore",deepslate_tile_double_slab:"Deepslate Tile Double Slab",deepslate_tile_slab:"Deepslate Tile Slab",deepslate_tile_stairs:"Deepslate Tile Stairs",deepslate_tile_wall:"Deepslate Tile Wall",deepslate_tiles:"Deepslate Tiles",deny:"Deny",detector_rail:"Detector Rail",diamond:"Diamond",diamond_axe:"Diamond Axe",diamond_block:"Block of Diamond",diamond_boots:"Diamond Boots",diamond_chestplate:"Diamond Chestplate",diamond_helmet:"Diamond Helmet",diamond_hoe:"Diamond Hoe",diamond_horse_armor:"Diamond Horse Armor",diamond_leggings:"Diamond Leggings",diamond_ore:"Diamond Ore",diamond_pickaxe:"Diamond Pickaxe",diamond_shovel:"Diamond Shovel",diamond_sword:"Diamond Sword",diorite_stairs:"Diorite Stairs",dirt:"Dirt",dirt_with_roots:"Rooted Dirt",disc_fragment_5:"Disc Fragment 5",dispenser:"Dispenser",dolphin_spawn_egg:"Dolphin Spawn Egg",donkey_spawn_egg:"Donkey Spawn Egg",double_cut_copper_slab:"Double Cut Copper Slab",double_plant:"Plant",double_stone_block_slab:"Double Stone Block Slab",double_wooden_slab:"Double Wooden Slab",dragon_breath:"Dragon's Breath",dragon_egg:"Dragon Egg",dried_kelp:"Dried Kelp",dried_kelp_block:"Dried Kelp Block",dripstone_block:"Dripstone Block",dropper:"Dropper",drowned_spawn_egg:"Drowned Spawn Egg",dune_armor_trim_smithing_template:"Dune Armor Trim Smithing Template",dye:"Dye",echo_shard:"Echo Shard",egg:"Egg",elder_guardian_spawn_egg:"Elder Guardian Spawn Egg",elytra:"Elytra",emerald:"Emerald",emerald_block:"Block of Emerald",emerald_ore:"Emerald Ore",empty_map:"Empty Map",enchanted_book:"Enchanted Book",enchanted_golden_apple:"Enchanted Golden Apple",enchanting_table:"Enchantment Table",end_brick_stairs:"End Stone Brick Stairs",end_bricks:"End Stone Bricks",end_crystal:"End Crystal",end_gateway:"End Gateway",end_portal:"End Portal",end_portal_frame:"End Portal Frame",end_rod:"End Rod",end_stone:"End Stone",ender_chest:"Ender Chest",ender_dragon_spawn_egg:"Ender Dragon Spawn Egg",ender_eye:"Eye of Ender",ender_pearl:"Ender Pearl",enderman_spawn_egg:"Enderman Spawn Egg",endermite_spawn_egg:"Endermite Spawn Egg",evoker_spawn_egg:"Evoker Spawn Egg",experience_bottle:"Bottle o' Enchanting",explorer_pottery_sherd:"Explorer Pottery Sherd",exposed_copper:"Exposed Copper",exposed_cut_copper:"Exposed Cut Copper",exposed_cut_copper_slab:"Exposed Cut Copper Slab",exposed_cut_copper_stairs:"Exposed Cut Copper Stairs",exposed_double_cut_copper_slab:"Exposed Double Cut Copper Slab",eye_armor_trim_smithing_template:"Eye Armor Trim Smithing Template",farmland:"Farmland",feather:"Feather",fence:"Oak Fence",fence_gate:"Oak Fence Gate",fermented_spider_eye:"Fermented Spider Eye",field_masoned_banner_pattern:"Field Masoned Banner Pattern",filled_map:"Filled Map",fire:"Fire",fire_charge:"Fire Charge",fire_coral:"Fire Coral",firework_rocket:"Firework Rocket",firework_star:"Firework Star",fishing_rod:"Fishing Rod",fletching_table:"Fletching Table",flint:"Flint",flint_and_steel:"Flint and Steel",flower_banner_pattern:"Flower Banner Pattern",flower_pot:"Flower Pot",flowering_azalea:"Flowering Azalea",flowing_lava:"Lava",flowing_water:"Water",fox_spawn_egg:"Fox Spawn Egg",frame:"Item Frame",friend_pottery_sherd:"Friend Pottery Sherd",frog_spawn:"Frogspawn",frog_spawn_egg:"Frog Spawn Egg",frosted_ice:"Frosted Ice",furnace:"Furnace",ghast_spawn_egg:"Ghast Spawn Egg",ghast_tear:"Ghast Tear",gilded_blackstone:"Gilded Blackstone",glass:"Glass",glass_bottle:"Glass Bottle",glass_pane:"Glass Pane",glistering_melon_slice:"Glistering Melon Slice",globe_banner_pattern:"Globe Banner Pattern",glow_frame:"Glow Item Frame",glow_ink_sac:"Glow Ink Sac",glow_lichen:"Glow Lichen",glow_squid_spawn_egg:"Glow Squid Spawn Egg",glow_stick:"Glow Stick",glowingobsidian:"Glowingobsidian",glowstone:"Glowstone",glowstone_dust:"Glowstone Dust",goat_horn:"Goat Horn",goat_spawn_egg:"Goat Spawn Egg",gold_block:"Block of Gold",gold_ingot:"Gold Ingot",gold_nugget:"Gold Nugget",gold_ore:"Gold Ore",golden_apple:"Golden Apple",golden_axe:"Golden Axe",golden_boots:"Golden Boots",golden_carrot:"Golden Carrot",golden_chestplate:"Golden Chestplate",golden_helmet:"Golden Helmet",golden_hoe:"Golden Hoe",golden_horse_armor:"Golden Horse Armor",golden_leggings:"Golden Leggings",golden_pickaxe:"Golden Pickaxe",golden_rail:"Powered Rail",golden_shovel:"Golden Shovel",golden_sword:"Golden Sword",granite_stairs:"Granite Stairs",grass:"Grass Block",grass_path:"Dirt Path",gravel:"Gravel",gray_candle:"Gray Candle",gray_candle_cake:"Cake with Gray Candle",gray_carpet:"Gray Carpet",gray_concrete:"Gray Concrete",gray_dye:"Gray Dye",gray_glazed_terracotta:"Gray Glazed Terracotta",gray_shulker_box:"Gray Shulker Box",gray_wool:"Gray Wool",green_candle:"Green Candle",green_candle_cake:"Cake with Green Candle",green_carpet:"Green Carpet",green_concrete:"Green Concrete",green_dye:"Green Dye",green_glazed_terracotta:"Green Glazed Terracotta",green_shulker_box:"Green Shulker Box",green_wool:"Green Wool",grindstone:"Grindstone",guardian_spawn_egg:"Guardian Spawn Egg",gunpowder:"Gunpowder",hanging_roots:"Hanging Roots",hard_glass:"Hard Glass",hard_glass_pane:"Hard Glass Pane",hard_stained_glass:"Hard Stained Glass",hard_stained_glass_pane:"Hard Stained Glass Pane",hardened_clay:"Terracotta",hay_block:"Hay Bale",heart_of_the_sea:"Heart of the Sea",heart_pottery_sherd:"Heart Pottery Sherd",heartbreak_pottery_sherd:"Heartbreak Pottery Sherd",heavy_weighted_pressure_plate:"Weighted Pressure Plate (Heavy)",hoglin_spawn_egg:"Hoglin Spawn Egg",honey_block:"Honey Block",honey_bottle:"Honey Bottle",honeycomb:"Honeycomb",honeycomb_block:"Honeycomb Block",hopper:"Hopper",hopper_minecart:"Minecart with Hopper",horn_coral:"Horn Coral",horse_spawn_egg:"Horse Spawn Egg",host_armor_trim_smithing_template:"Host Armor Trim Smithing Template",howl_pottery_sherd:"Howl Pottery Sherd",husk_spawn_egg:"Husk Spawn Egg",ice:"Ice",ice_bomb:"Ice Bomb",infested_deepslate:"Infested Deepslate",ink_sac:"Ink Sac",iron_axe:"Iron Axe",iron_bars:"Iron Bars",iron_block:"Block of Iron",iron_boots:"Iron Boots",iron_chestplate:"Iron Chestplate",iron_door:"Iron Door",iron_golem_spawn_egg:"Iron Golem Spawn Egg",iron_helmet:"Iron Helmet",iron_hoe:"Iron Hoe",iron_horse_armor:"Iron Horse Armor",iron_ingot:"Iron Ingot",iron_leggings:"Iron Leggings",iron_nugget:"Iron Nugget",iron_ore:"Iron Ore",iron_pickaxe:"Iron Pickaxe",iron_shovel:"Iron Shovel",iron_sword:"Iron Sword",iron_trapdoor:"Iron Trapdoor",jigsaw:"Jigsaw Block",jukebox:"Jukebox",jungle_boat:"Jungle Boat",jungle_button:"Jungle Button",jungle_chest_boat:"Jungle Chest Boat",jungle_door:"Jungle Door",jungle_fence:"Jungle Fence",jungle_fence_gate:"Jungle Fence Gate",jungle_hanging_sign:"Jungle Hanging Sign",jungle_log:"Jungle Log",jungle_pressure_plate:"Jungle Pressure Plate",jungle_sign:"Jungle Sign",jungle_stairs:"Jungle Stairs",jungle_trapdoor:"Jungle Trapdoor",kelp:"Kelp",ladder:"Ladder",lantern:"Lantern",lapis_block:"Block of Lapis Lazuli",lapis_lazuli:"Lapis Lazuli",lapis_ore:"Lapis Lazuli Ore",large_amethyst_bud:"Large Amethyst Bud",lava:"Lava",lava_bucket:"Lava Bucket",lead:"Lead",leather:"Leather",leather_boots:"Leather Boots",leather_chestplate:"Leather Tunic",leather_helmet:"Leather Cap",leather_horse_armor:"Leather Horse Armor",leather_leggings:"Leather Pants",leaves:"Leaves",lectern:"Lectern",lever:"Lever",light_block:"Light Block",light_blue_candle:"Light Blue Candle",light_blue_candle_cake:"Cake with Light Blue Candle",light_blue_carpet:"Light Blue Carpet",light_blue_concrete:"Light Blue Concrete",light_blue_dye:"Light Blue Dye",light_blue_glazed_terracotta:"Light Blue Glazed Terracotta",light_blue_shulker_box:"Light Blue Shulker Box",light_blue_wool:"Light Blue Wool",light_gray_candle:"Light Gray Candle",light_gray_candle_cake:"Cake with Light Gray Candle",light_gray_carpet:"Light Gray Carpet",light_gray_concrete:"Light Gray Concrete",light_gray_dye:"Light Gray Dye",light_gray_shulker_box:"Light Gray Shulker Box",light_gray_wool:"Light Gray Wool",light_weighted_pressure_plate:"Weighted Pressure Plate (Light)",lightning_rod:"Lightning Rod",lime_candle:"Lime Candle",lime_candle_cake:"Cake with Lime Candle",lime_carpet:"Lime Carpet",lime_concrete:"Lime Concrete",lime_dye:"Lime Dye",lime_glazed_terracotta:"Lime Glazed Terracotta",lime_shulker_box:"Lime Shulker Box",lime_wool:"Lime Wool",lingering_potion:"Lingering Potion",lit_blast_furnace:"Lit Blast Furnace",lit_deepslate_redstone_ore:"Lit Deepslate Redstone Ore",lit_furnace:"Lit Furnace",lit_pumpkin:"Jack o'Lantern",lit_redstone_lamp:"Lit Redstone Lamp",lit_redstone_ore:"Lit Redstone Ore",lit_smoker:"Lit Smoker",llama_spawn_egg:"Llama Spawn Egg",lodestone:"Lodestone",lodestone_compass:"Lodestone Compass",log:"Log",loom:"Loom",magenta_candle:"Magenta Candle",magenta_candle_cake:"Cake with Magenta Candle",magenta_carpet:"Magenta Carpet",magenta_concrete:"Magenta Concrete",magenta_dye:"Magenta Dye",magenta_glazed_terracotta:"Magenta Glazed Terracotta",magenta_shulker_box:"Magenta Shulker Box",magenta_wool:"Magenta Wool",magma:"Magma Block",magma_cream:"Magma Cream",magma_cube_spawn_egg:"Magma Cube Spawn Egg",mangrove_boat:"Mangrove Boat",mangrove_button:"Mangrove Button",mangrove_chest_boat:"Mangrove Chest Boat",mangrove_door:"Mangrove Door",mangrove_double_slab:"Mangrove Double Slab",mangrove_fence:"Mangrove Fence",mangrove_fence_gate:"Mangrove Fence Gate",mangrove_hanging_sign:"Mangrove Hanging Sign",mangrove_leaves:"Mangrove Leaves",mangrove_log:"Mangrove Log",mangrove_planks:"Mangrove Planks",mangrove_pressure_plate:"Mangrove Pressure Plate",mangrove_propagule:"Mangrove Propagule",mangrove_roots:"Mangrove Roots",mangrove_sign:"Mangrove Sign",mangrove_slab:"Mangrove Slab",mangrove_stairs:"Mangrove Stairs",mangrove_trapdoor:"Mangrove Trapdoor",mangrove_wood:"Mangrove Wood",medicine:"Medicine",medium_amethyst_bud:"Medium Amethyst Bud",melon_block:"Melon",melon_seeds:"Melon Seeds",melon_slice:"Melon Slice",melon_stem:"Melon Stem",milk_bucket:"Milk Bucket",minecart:"Minecart",miner_pottery_sherd:"Miner Pottery Sherd",mob_spawner:"Monster Spawner",mojang_banner_pattern:"Mojang Banner Pattern",monster_egg:"Infested Stone",mooshroom_spawn_egg:"Mooshroom Spawn Egg",moss_block:"Moss Block",moss_carpet:"Moss Carpet",mossy_cobblestone:"Mossy Cobblestone",mossy_cobblestone_stairs:"Mossy Cobblestone Stairs",mossy_stone_brick_stairs:"Mossy Stone Brick Stairs",mourner_pottery_sherd:"Mourner Pottery Sherd",moving_block:"Moving Block",mud:"Mud",mud_brick_double_slab:"Mud Brick Double Slab",mud_brick_slab:"Mud Brick Slab",mud_brick_stairs:"Mud Brick Stairs",mud_brick_wall:"Mud Brick Wall",mud_bricks:"Mud Bricks",muddy_mangrove_roots:"Muddy Mangrove Roots",mule_spawn_egg:"Mule Spawn Egg",mushroom_stew:"Mushroom Stew",music_disc_11:"Music Disc 11",music_disc_13:"Music Disc 13",music_disc_5:"Music Disc 5",music_disc_blocks:"Music Disc Blocks",music_disc_cat:"Music Disc Cat",music_disc_chirp:"Music Disc Chirp",music_disc_far:"Music Disc Far",music_disc_mall:"Music Disc Mall",music_disc_mellohi:"Music Disc Mellohi",music_disc_otherside:"Music Disc Otherside",music_disc_pigstep:"Music Disc Pigstep",music_disc_relic:"Music Disc Relic",music_disc_stal:"Music Disc Stal",music_disc_strad:"Music Disc Strad",music_disc_wait:"Music Disc Wait",music_disc_ward:"Music Disc Ward",mutton:"Mutton",mycelium:"Mycelium",name_tag:"Name Tag",nautilus_shell:"Nautilus Shell",nether_brick:"Nether Brick Block",nether_brick_fence:"Nether Brick Fence",nether_brick_stairs:"Nether Brick Stairs",nether_gold_ore:"Nether Gold Ore",nether_sprouts:"Nether Sprouts",nether_star:"Nether Star",nether_wart:"Nether Wart",nether_wart_block:"Nether Wart Block",netherbrick:"Nether Brick",netherite_axe:"Netherite Axe",netherite_block:"Block of Netherite",netherite_boots:"Netherite Boots",netherite_chestplate:"Netherite Chestplate",netherite_helmet:"Netherite Helmet",netherite_hoe:"Netherite Hoe",netherite_ingot:"Netherite Ingot",netherite_leggings:"Netherite Leggings",netherite_pickaxe:"Netherite Pickaxe",netherite_scrap:"Netherite Scrap",netherite_shovel:"Netherite Shovel",netherite_sword:"Netherite Sword",netherite_upgrade_smithing_template:"Netherite Upgrade Smithing Template",netherrack:"Netherrack",netherreactor:"Nether Reactor Core",normal_stone_stairs:"Stone Stairs",noteblock:"Note Block",npc_spawn_egg:"Npc Spawn Egg",oak_boat:"Oak Boat",oak_chest_boat:"Oak Chest Boat",oak_fence:"Oak Fence",oak_hanging_sign:"Oak Hanging Sign",oak_log:"Oak Log",oak_sign:"Oak Sign",oak_stairs:"Oak Stairs",observer:"Observer",obsidian:"Obsidian",ocelot_spawn_egg:"Ocelot Spawn Egg",ochre_froglight:"Ochre Froglight",orange_candle:"Orange Candle",orange_candle_cake:"Cake with Orange Candle",orange_carpet:"Orange Carpet",orange_concrete:"Orange Concrete",orange_dye:"Orange Dye",orange_glazed_terracotta:"Orange Glazed Terracotta",orange_shulker_box:"Orange Shulker Box",orange_wool:"Orange Wool",oxidized_copper:"Oxidized Copper",oxidized_cut_copper:"Oxidized Cut Copper",oxidized_cut_copper_slab:"Oxidized Cut Copper Slab",oxidized_cut_copper_stairs:"Oxidized Cut Copper Stairs",oxidized_double_cut_copper_slab:"Oxidized Double Cut Copper Slab",packed_ice:"Packed Ice",packed_mud:"Packed Mud",painting:"Painting",panda_spawn_egg:"Panda Spawn Egg",paper:"Paper",parrot_spawn_egg:"Parrot Spawn Egg",pearlescent_froglight:"Pearlescent Froglight",phantom_membrane:"Phantom Membrane",phantom_spawn_egg:"Phantom Spawn Egg",pig_spawn_egg:"Pig Spawn Egg",piglin_banner_pattern:"Piglin Banner Pattern",piglin_brute_spawn_egg:"Piglin Brute Spawn Egg",piglin_spawn_egg:"Piglin Spawn Egg",pillager_spawn_egg:"Pillager Spawn Egg",pink_candle:"Pink Candle",pink_candle_cake:"Cake with Pink Candle",pink_carpet:"Pink Carpet",pink_concrete:"Pink Concrete",pink_dye:"Pink Dye",pink_glazed_terracotta:"Pink Glazed Terracotta",pink_petals:"Pink Petals",pink_shulker_box:"Pink Shulker Box",pink_wool:"Pink Wool",piston:"Piston",pitcher_crop:"Pitcher Crop",pitcher_plant:"Pitcher Plant",pitcher_pod:"Pitcher Pod",planks:"Wooden Planks",plenty_pottery_sherd:"Plenty Pottery Sherd",podzol:"Podzol",pointed_dripstone:"Pointed Dripstone",poisonous_potato:"Poisonous Potato",polar_bear_spawn_egg:"Polar Bear Spawn Egg",polished_andesite_stairs:"Polished Andesite Stairs",polished_basalt:"Polished Basalt",polished_blackstone:"Polished Blackstone",polished_blackstone_brick_double_slab:"Polished Blackstone Brick Double Slab",polished_blackstone_brick_slab:"Polished Blackstone Brick Slab",polished_blackstone_brick_stairs:"Polished Blackstone Brick Stairs",polished_blackstone_brick_wall:"Polished Blackstone Brick Wall",polished_blackstone_bricks:"Polished Blackstone Bricks",polished_blackstone_button:"Polished Blackstone Button",polished_blackstone_double_slab:"Polished Blackstone Double Slab",polished_blackstone_pressure_plate:"Polished Blackstone Pressure Plate",polished_blackstone_slab:"Polished Blackstone Slab",polished_blackstone_stairs:"Polished Blackstone Stairs",polished_blackstone_wall:"Polished Blackstone Wall",polished_deepslate:"Polished Deepslate",polished_deepslate_double_slab:"Polished Deepslate Double Slab",polished_deepslate_slab:"Polished Deepslate Slab",polished_deepslate_stairs:"Polished Deepslate Stairs",polished_deepslate_wall:"Polished Deepslate Wall",polished_diorite_stairs:"Polished Diorite Stairs",polished_granite_stairs:"Polished Granite Stairs",popped_chorus_fruit:"Popped Chorus Fruit",porkchop:"Raw Porkchop",portal:"Portal",potato:"Potato",potion:"Potion",powder_snow:"Powder Snow",powder_snow_bucket:"Powder Snow Bucket",powered_comparator:"Powered Comparator",powered_repeater:"Powered Repeater",prismarine:"Prismarine",prismarine_bricks_stairs:"Prismarine Brick Stairs",prismarine_crystals:"Prismarine Crystals",prismarine_shard:"Prismarine Shard",prismarine_stairs:"Prismarine Stairs",prize_pottery_sherd:"Prize Pottery Sherd",pufferfish:"Pufferfish",pufferfish_bucket:"Pufferfish Bucket",pufferfish_spawn_egg:"Pufferfish Spawn Egg",pumpkin:"Pumpkin",pumpkin_pie:"Pumpkin Pie",pumpkin_seeds:"Pumpkin Seeds",pumpkin_stem:"Pumpkin Stem",purple_candle:"Purple Candle",purple_candle_cake:"Cake with Purple Candle",purple_carpet:"Purple Carpet",purple_concrete:"Purple Concrete",purple_dye:"Purple Dye",purple_glazed_terracotta:"Purple Glazed Terracotta",purple_shulker_box:"Purple Shulker Box",purple_wool:"Purple Wool",purpur_block:"Purpur Block",purpur_stairs:"Purpur Stairs",quartz:"Nether Quartz",quartz_block:"Block of Quartz",quartz_bricks:"Quartz Bricks",quartz_ore:"Nether Quartz Ore",quartz_stairs:"Quartz Stairs",rabbit:"Raw Rabbit",rabbit_foot:"Rabbit's Foot",rabbit_hide:"Rabbit Hide",rabbit_spawn_egg:"Rabbit Spawn Egg",rabbit_stew:"Rabbit Stew",rail:"Rail",raiser_armor_trim_smithing_template:"Raiser Armor Trim Smithing Template",rapid_fertilizer:"Rapid Fertilizer",ravager_spawn_egg:"Ravager Spawn Egg",raw_copper:"Raw Copper",raw_copper_block:"Block of Raw Copper",raw_gold:"Raw Gold",raw_gold_block:"Block of Raw Gold",raw_iron:"Raw Iron",raw_iron_block:"Block of Raw Iron",recovery_compass:"Recovery Compass",red_candle:"Red Candle",red_candle_cake:"Cake with Red Candle",red_carpet:"Red Carpet",red_concrete:"Red Concrete",red_dye:"Red Dye",red_flower:"Flower",red_glazed_terracotta:"Red Glazed Terracotta",red_mushroom:"Red Mushroom",red_mushroom_block:"Red Mushroom Block",red_nether_brick:"Red Nether Brick",red_nether_brick_stairs:"Red Nether Brick Stairs",red_sandstone:"Red Sandstone",red_sandstone_stairs:"Red Sandstone Stairs",red_shulker_box:"Red Shulker Box",red_wool:"Red Wool",redstone:"Redstone Dust",redstone_block:"Block of Redstone",redstone_lamp:"Redstone Lamp",redstone_ore:"Redstone Ore",redstone_torch:"Redstone Torch",redstone_wire:"Redstone Dust",reinforced_deepslate:"Reinforced Deepslate",repeater:"Redstone Repeater",repeating_command_block:"Repeating Command Block",reserved6:"Reserved6",respawn_anchor:"Respawn Anchor",rib_armor_trim_smithing_template:"Rib Armor Trim Smithing Template",rotten_flesh:"Rotten Flesh",saddle:"Saddle",salmon:"Raw Salmon",salmon_bucket:"Salmon Bucket",salmon_spawn_egg:"Salmon Spawn Egg",sand:"Sand",sandstone:"Sandstone",sandstone_stairs:"Sandstone Stairs",sapling:"Sapling",scaffolding:"Scaffolding",sculk:"Sculk",sculk_catalyst:"Sculk Catalyst",sculk_sensor:"Sculk Sensor",sculk_shrieker:"Sculk Shrieker",sculk_vein:"Sculk Vein",scute:"Scute",sea_lantern:"Sea Lantern",sea_pickle:"Sea Pickle",seagrass:"Seagrass",sentry_armor_trim_smithing_template:"Sentry Armor Trim Smithing Template",shaper_armor_trim_smithing_template:"Shaper Armor Trim Smithing Template",sheaf_pottery_sherd:"Sheaf Pottery Sherd",shears:"Shears",sheep_spawn_egg:"Sheep Spawn Egg",shelter_pottery_sherd:"Shelter Pottery Sherd",shield:"Shield",shroomlight:"Shroomlight",shulker_box:"Shulker Box",shulker_shell:"Shulker Shell",shulker_spawn_egg:"Shulker Spawn Egg",silence_armor_trim_smithing_template:"Silence Armor Trim Smithing Template",silver_glazed_terracotta:"Silver Glazed Terracotta",silverfish_spawn_egg:"Silverfish Spawn Egg",skeleton_horse_spawn_egg:"Skeleton Horse Spawn Egg",skeleton_spawn_egg:"Skeleton Spawn Egg",skull:"Skull",skull_banner_pattern:"Skull Banner Pattern",skull_pottery_sherd:"Skull Pottery Sherd",slime:"Slime Block",slime_ball:"Slimeball",slime_spawn_egg:"Slime Spawn Egg",small_amethyst_bud:"Small Amethyst Bud",small_dripleaf_block:"Small Dripleaf",smithing_table:"Smithing Table",smoker:"Smoker",smooth_basalt:"Smooth Basalt",smooth_quartz_stairs:"Smooth Quartz Stairs",smooth_red_sandstone_stairs:"Smooth Red Sandstone Stairs",smooth_sandstone_stairs:"Smooth Sandstone Stairs",smooth_stone:"Smooth Stone",sniffer_egg:"Sniffer Egg",sniffer_spawn_egg:"Sniffer Spawn Egg",snort_pottery_sherd:"Snort Pottery Sherd",snout_armor_trim_smithing_template:"Snout Armor Trim Smithing Template",snow:"Snow",snow_golem_spawn_egg:"Snow Golem Spawn Egg",snow_layer:"Top Snow",snowball:"Snowball",soul_campfire:"Soul Campfire",soul_fire:"Soul Fire",soul_lantern:"Soul Lantern",soul_sand:"Soul Sand",soul_soil:"Soul Soil",soul_torch:"Soul Torch",sparkler:"Sparkler",spawn_egg:"Spawn Egg",spider_eye:"Spider Eye",spider_spawn_egg:"Spider Spawn Egg",spire_armor_trim_smithing_template:"Spire Armor Trim Smithing Template",splash_potion:"Splash Potion",sponge:"Sponge",spore_blossom:"Spore Blossom",spruce_boat:"Spruce Boat",spruce_button:"Spruce Button",spruce_chest_boat:"Spruce Chest Boat",spruce_door:"Spruce Door",spruce_fence:"Spruce Fence",spruce_fence_gate:"Spruce Fence Gate",spruce_hanging_sign:"Spruce Hanging Sign",spruce_log:"Spruce Log",spruce_pressure_plate:"Spruce Pressure Plate",spruce_sign:"Spruce Sign",spruce_stairs:"Spruce Stairs",spruce_trapdoor:"Spruce Trapdoor",spyglass:"Spyglass",squid_spawn_egg:"Squid Spawn Egg",stained_glass:"Stained Glass",stained_glass_pane:"Stained Glass Pane",stained_hardened_clay:"Terracotta",standing_banner:"Banner",standing_sign:"Sign",stick:"Stick",sticky_piston:"Sticky Piston",stone:"Stone",stone_axe:"Stone Axe",stone_block_slab:"Stone Block Slab",stone_brick_stairs:"Stone Brick Stairs",stone_button:"Stone Button",stone_hoe:"Stone Hoe",stone_pickaxe:"Stone Pickaxe",stone_pressure_plate:"Stone Pressure Plate",stone_shovel:"Stone Shovel",stone_stairs:"Cobblestone Stairs",stone_sword:"Stone Sword",stonebrick:"Stone Bricks",stonecutter:"Stonecutter",stonecutter_block:"Stonecutter",stray_spawn_egg:"Stray Spawn Egg",strider_spawn_egg:"Strider Spawn Egg",stripped_acacia_log:"Stripped Acacia Log",stripped_bamboo_block:"Block of Stripped Bamboo",stripped_birch_log:"Stripped Birch Log",stripped_cherry_log:"Stripped Cherry Log",stripped_cherry_wood:"Stripped Cherry Wood",stripped_crimson_hyphae:"Stripped Crimson Hyphae",stripped_crimson_stem:"Stripped Crimson Stem",stripped_dark_oak_log:"Stripped Dark Oak Log",stripped_jungle_log:"Stripped Jungle Log",stripped_mangrove_log:"Stripped Mangrove Log",stripped_mangrove_wood:"Stripped Mangrove Wood",stripped_oak_log:"Stripped Oak Log",stripped_spruce_log:"Stripped Spruce Log",stripped_warped_hyphae:"Stripped Warped Hyphae",stripped_warped_stem:"Stripped Warped Stem",structure_block:"Structure Block",structure_void:"Structure Void",sugar:"Sugar",sugar_cane:"Sugar Cane",suspicious_gravel:"Suspicious Gravel",suspicious_sand:"Suspicious Sand",suspicious_stew:"Suspicious Stew",sweet_berries:"Sweet Berries",sweet_berry_bush:"Sweet Berry Bush",tadpole_bucket:"Tadpole Bucket",tadpole_spawn_egg:"Tadpole Spawn Egg",tallgrass:"Grass",target:"Target",tide_armor_trim_smithing_template:"Tide Armor Trim Smithing Template",tinted_glass:"Tinted Glass",tnt:"TNT",tnt_minecart:"Minecart with TNT",torch:"Torch",torchflower:"Torchflower",torchflower_crop:"Torchflower Crop",torchflower_seeds:"Torchflower Seeds",totem_of_undying:"Totem Of Undying",trader_llama_spawn_egg:"Trader Llama Spawn Egg",trapdoor:"Oak Trapdoor",trapped_chest:"Trapped Chest",trident:"Trident",trip_wire:"Trip Wire",tripwire_hook:"Tripwire Hook",tropical_fish:"Tropical Fish",tropical_fish_bucket:"Tropical Fish Bucket",tropical_fish_spawn_egg:"Tropical Fish Spawn Egg",tube_coral:"Tube Coral",tuff:"Tuff",turtle_egg:"Sea Turtle Egg",turtle_helmet:"Turtle Shell",turtle_spawn_egg:"Turtle Spawn Egg",twisting_vines:"Twisting Vines",underwater_torch:"Underwater Torch",undyed_shulker_box:"Undyed Shulker Box",unknown:"Unknown",unlit_redstone_torch:"Redstone Torch",unpowered_comparator:"Unpowered Comparator",unpowered_repeater:"Unpowered Repeater",verdant_froglight:"Verdant Froglight",vex_armor_trim_smithing_template:"Vex Armor Trim Smithing Template",vex_spawn_egg:"Vex Spawn Egg",villager_spawn_egg:"Villager Spawn Egg",vindicator_spawn_egg:"Vindicator Spawn Egg",vine:"Vines",wall_banner:"Wall Banner",wandering_trader_spawn_egg:"Wandering Trader Spawn Egg",ward_armor_trim_smithing_template:"Ward Armor Trim Smithing Template",warden_spawn_egg:"Warden Spawn Egg",warped_button:"Warped Button",warped_door:"Warped Door",warped_double_slab:"Warped Slab",warped_fence:"Warped Fence",warped_fence_gate:"Warped Fence Gate",warped_fungus:"Warped Fungus",warped_fungus_on_a_stick:"Warped Fungus on a Stick",warped_hanging_sign:"Warped Hanging Sign",warped_hyphae:"Warped Hyphae",warped_nylium:"Warped Nylium",warped_planks:"Warped Planks",warped_pressure_plate:"Warped Pressure Plate",warped_roots:"Warped Roots",warped_sign:"Warped Sign",warped_slab:"Warped Slab",warped_stairs:"Warped Stairs",warped_stem:"Warped Stem",warped_trapdoor:"Warped Trapdoor",warped_wart_block:"Warped Wart Block",water:"Water",water_bucket:"Water Bucket",waterlily:"Lily Pad",waxed_copper:"Waxed Block of Copper",waxed_cut_copper:"Waxed Cut Copper",waxed_cut_copper_slab:"Waxed Cut Copper Slab",waxed_cut_copper_stairs:"Waxed Cut Copper Stairs",waxed_double_cut_copper_slab:"Waxed Double Cut Copper Slab",waxed_exposed_copper:"Waxed Exposed Copper",waxed_exposed_cut_copper:"Waxed Exposed Cut Copper",waxed_exposed_cut_copper_slab:"Waxed Exposed Cut Copper Slab",waxed_exposed_cut_copper_stairs:"Waxed Exposed Cut Copper Stairs",waxed_exposed_double_cut_copper_slab:"Waxed Exposed Double Cut Copper Slab",waxed_oxidized_copper:"Waxed Oxidized Copper",waxed_oxidized_cut_copper:"Waxed Oxidized Cut Copper",waxed_oxidized_cut_copper_slab:"Waxed Oxidized Cut Copper Slab",waxed_oxidized_cut_copper_stairs:"Waxed Oxidized Cut Copper Stairs",waxed_oxidized_double_cut_copper_slab:"Waxed Oxidized Double Cut Copper Slab",waxed_weathered_copper:"Waxed Weathered Copper",waxed_weathered_cut_copper:"Waxed Weathered Cut Copper",waxed_weathered_cut_copper_slab:"Waxed Weathered Cut Copper Slab",waxed_weathered_cut_copper_stairs:"Waxed Weathered Cut Copper Stairs",waxed_weathered_double_cut_copper_slab:"Waxed Weathered Double Cut Copper Slab",wayfinder_armor_trim_smithing_template:"Wayfinder Armor Trim Smithing Template",weathered_copper:"Weathered Copper",weathered_cut_copper:"Weathered Cut Copper",weathered_cut_copper_slab:"Weathered Cut Copper Slab",weathered_cut_copper_stairs:"Weathered Cut Copper Stairs",weathered_double_cut_copper_slab:"Weathered Double Cut Copper Slab",web:"Cobweb",weeping_vines:"Weeping Vines",wheat:"Wheat",wheat_seeds:"Seeds",white_candle:"White Candle",white_candle_cake:"Cake with White Candle",white_carpet:"White Carpet",white_concrete:"White Concrete",white_dye:"White Dye",white_glazed_terracotta:"White Glazed Terracotta",white_shulker_box:"White Shulker Box",white_wool:"White Wool",wild_armor_trim_smithing_template:"Wild Armor Trim Smithing Template",witch_spawn_egg:"Witch Spawn Egg",wither_rose:"Wither Rose",wither_skeleton_spawn_egg:"Wither Skeleton Spawn Egg",wither_spawn_egg:"Wither Spawn Egg",wolf_spawn_egg:"Wolf Spawn Egg",wood:"Wood",wooden_axe:"Wooden Axe",wooden_button:"Oak Button",wooden_door:"Oak Door",wooden_hoe:"Wooden Hoe",wooden_pickaxe:"Wooden Pickaxe",wooden_pressure_plate:"Oak Pressure Plate",wooden_shovel:"Wooden Shovel",wooden_slab:"Wood Slab",wooden_sword:"Wooden Sword",wool:"Wool",writable_book:"Book & Quill",written_book:"Written Book",yellow_candle:"Yellow Candle",yellow_candle_cake:"Cake with Yellow Candle",yellow_carpet:"Yellow Carpet",yellow_concrete:"Yellow Concrete",yellow_dye:"Yellow Dye",yellow_flower:"Flower",yellow_glazed_terracotta:"Yellow Glazed Terracotta",yellow_shulker_box:"Yellow Shulker Box",yellow_wool:"Yellow Wool",zoglin_spawn_egg:"Zoglin Spawn Egg",zombie_horse_spawn_egg:"Zombie Horse Spawn Egg",zombie_pigman_spawn_egg:"Zombie Pigman Spawn Egg",zombie_spawn_egg:"Zombie Spawn Egg",zombie_villager_spawn_egg:"Zombie Villager Spawn Egg"};const Ll=Hl({name:"loot-editor",props:{form:Object,mobs:Object},data:()=>({item_ids:Wl}),methods:{addPool(){this.form.custom_loot.forEachReverse((e=>{0!=e.max&&""!=e.id||this.form.custom_loot.remove(e)}));let e={uuid:guid(),rolls:1,entries:[]};this.form.custom_loot.push(e),this.addItem(e)},addItem(e){e.entries.forEachReverse((t=>{0!=t.max&&""!=t.id||e.entries.remove(t)}));let t={type:"empty",custom_id:"",uuid:guid(),count_min:0,count_max:1,weight:1};e.entries.push(t)},getSameLootText(){return`Use the default loot from the ${this.mobs[this.form.behavior].name}.`},getItemIcon(e){if(!(e=e.replace(/^minecraft:/,"")).includes(":")&&Wl[e])return`https://raw.githubusercontent.com/Mojang/bedrock-samples/main/resource_pack/textures/items/${e}.png`}}},Pl,[function(){var e=this._self._c;return e("section",[e("p",{staticClass:"description"},[this._v("Select which items the entity will drop on death")])])}],!1,(function(e){var t=a(742);t.__inject__&&t.__inject__(e)}),null,"afbd0422").exports;var Zl=function(){var e=this,t=e._self._c;return t("div",[t("p",[e._v("Export your mob as a behavior and resource pack.")]),e._v(" "),t("section",{attrs:{id:"entity_wizard_export_options"}},[e.isApp?t("div",{staticClass:"entity_wizard_export_option",class:{selected:"folder"==e.form.export_mode},staticStyle:{"border-color":"#dccb92"},on:{click:function(t){return e.setExportMode("folder")}}},[t("h3",[e._v("Export to Folder")]),e._v(" "),t("p",[e._v("Export the packs directly into the development pack folders of your Minecraft installation, and get started right away.")])]):e._e(),e._v(" "),e.isApp?t("div",{staticClass:"entity_wizard_export_option",class:{selected:"integrate"==e.form.export_mode},staticStyle:{"border-color":"#83c4ea"},on:{click:function(t){return e.setExportMode("integrate")}}},[t("h3",[e._v("Integrate into Pack")]),e._v(" "),t("p",[e._v("Integrate the entity into an existing behavior and resource pack on your computer.")])]):e._e(),e._v(" "),t("div",{staticClass:"entity_wizard_export_option",class:{selected:"mcaddon"==e.form.export_mode},staticStyle:{"border-color":"#89ca51"},on:{click:function(t){return e.setExportMode("mcaddon")}}},[t("h3",[e._v("Export as MCAddon")]),e._v(" "),t("p",[e._v("Generate an MCAddon file that you can install in one click or send to your friends.")])]),e._v(" "),t("div",{staticClass:"entity_wizard_export_option",class:{selected:"integrate_mcaddon"==e.form.export_mode},staticStyle:{"border-color":"#d2fc92"},on:{click:function(t){return e.setExportMode("integrate_mcaddon")}}},[t("h3",[e._v("Integrate into MCAddon")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Integrate the entity into an existing MCAddon file.")])])]),e._v(" "),"integrate"==e.form.export_mode?[t("section",[t("label",[e._v("Behavior Pack")]),e._v(" "),t("p",[e._v("Select the behavior pack that you want to save the new mob into")]),e._v(" "),t("ul",{attrs:{id:"entity_wizard_pack_list"}},[e._l(e.existing_packs,(function(a){return t("li",{key:a.name,class:{selected:a==e.form.integrate_pack},on:{click:function(t){e.form.integrate_pack=a}}},[a.has_icon?t("img",{attrs:{src:e.getPackIcon(a),width:"32px"},on:{error:function(e){a.has_icon=!1}}}):t("div"),e._v("\n\t\t\t\t\t"+e._s(a.name)+"\n\t\t\t\t")])})),e._v(" "),t("li",{on:{click:function(t){return e.addPacks()}}},[t("i",{staticClass:"material-icons"},[e._v("add")]),e._v("\n\t\t\t\t\tSelect packs manually...\n\t\t\t\t")])],2)])]:"integrate_mcaddon"==e.form.export_mode?[t("section",[t("label",[e._v("MCAddon File")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select the .mcaddon file to merge the new item into.")]),e._v(" "),t("div",[t("button",{staticStyle:{display:"inline-block"},on:{click:function(t){return e.selectMCAddon()}}},[t("i",{staticClass:"material-icons"},[e._v("add")]),e._v("\n\t\t\t\t\tUpload MCAddon\n\t\t\t\t")]),e._v("\n\t\t\t\t"+e._s(e.mcaddon_file_name)+"\n\t\t\t")])])]:[t("section",[t("label",{staticClass:"required"},[e._v("Pack Name")]),e._v(" "),t("p",[e._v("The name of the packs you are exporting")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.pack_name,expression:"form.pack_name"}],attrs:{type:"text",placeholder:"Red Panda Pack"},domProps:{value:e.form.pack_name},on:{input:function(t){t.target.composing||e.$set(e.form,"pack_name",t.target.value)}}})]),e._v(" "),t("section",[t("label",[e._v("Pack Author(s)")]),e._v(" "),t("p",[e._v("You can enter your name as the author of the pack. To enter multiple names, separate them with a comma.")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.pack_authors,expression:"form.pack_authors"}],attrs:{type:"text",placeholder:"Benchbot, Performance Panda"},domProps:{value:e.form.pack_authors},on:{input:function(t){t.target.composing||e.$set(e.form,"pack_authors",t.target.value)}}})]),e._v(" "),t("section",[t("label",[e._v("Pack Icon")]),e._v(" "),t("p",[e._v("The pack icon will be visible in the resource and behavior pack menu")]),e._v(" "),t("icon-picker",{model:{value:e.form.pack_icon,callback:function(t){e.$set(e.form,"pack_icon",t)},expression:"form.pack_icon"}})],1)]],2)};Zl._withStripped=!0;const Xl={components:{IconPicker:Nl},name:"export",props:{form:Object,bedrock_installed:Boolean},data:()=>({isApp,existing_packs:[],mcaddon_file_name:""}),methods:{setExportMode(e){if(this.form.export_mode=e,"integrate"==e){let e=function(e){if(!isApp)return[];let t,a=[],i=[],o=Ol();try{t=jl(e),a=o.readdirSync(PathModule.join(t,"development_resource_packs"),{withFileTypes:!0})}catch(e){return!1}let r={};a.forEach((e=>{if(e.isDirectory())try{let a=PathModule.join(t,"development_resource_packs",e.name),i=o.readFileSync(PathModule.join(a,"manifest.json"),{encoding:"utf-8"}),n=autoParseJSON(i,!1);n&&n.header&&(r[n.header.uuid]=a)}catch(e){console.error(e)}}));try{i=o.readdirSync(PathModule.join(t,"development_behavior_packs"),{withFileTypes:!0})}catch(e){return!1}let n=[];return i.forEach((e=>{if(e.isDirectory())try{let a=PathModule.join(t,"development_behavior_packs",e.name),i=o.readFileSync(PathModule.join(a,"manifest.json"),{encoding:"utf-8"}),m=autoParseJSON(i,!1);if(m&&m.dependencies&&m.dependencies[0]){let t=m.dependencies[0].uuid;r[t]&&n.push({name:e.name,bp_path:a,rp_path:r[t],has_icon:!0})}}catch(e){console.error(e)}})),n}(this.form.edition);if(e instanceof Array)this.bedrock_installed=!0,this.existing_packs.replace(e);else{let e={bedrock:"Bedrock",preview:"Bedrock Preview",edu:"Education Edition"};Blockbench.showQuickMessage(`No installation of Minecraft ${e[this.form.edition]} was found on your device`)}}},getPackIcon:e=>e.bp_path+osfs+"pack_icon.png",addPacks(){let e={name:"",bp_path:"",rp_path:"",has_icon:!0};e.bp_path=Blockbench.pickDirectory({resource_id:"bedrock_behavior_pack"}),e.bp_path&&(e.name=PathModule.basename(e.bp_path),e.rp_path=Blockbench.pickDirectory({resource_id:"bedrock_resource_pack"}),e.rp_path&&(this.existing_packs.push(e),this.form.integrate_pack=e))},selectMCAddon(){Blockbench.import({extensions:["mcaddon"],type:"MCAddon",readtype:"binary"},(async e=>{this.mcaddon_file_name=e[0].name;let t=await JSZip.loadAsync(e[0].content);window.EntityWizardProject.previous_mcaddon=t}))}}},$l=Hl(Xl,Zl,[],!1,(function(e){var t=a(1083);t.__inject__&&t.__inject__(e)}),null,"6244a4ee").exports,eA="data:image/png;base64,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",tA="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTgwIgogICBoZWlnaHQ9IjQ2MCIKICAgdmlld0JveD0iMCAwIDI1OS4yOTE2NiAxMjEuNzA4MzQiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzQ0OTEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9InN0YXJ0X3NjcmVlbi5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDg1IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ5NDk3NDc1IgogICAgIGlua3NjYXBlOmN4PSI1NTUuMDY1ODUiCiAgICAgaW5rc2NhcGU6Y3k9IjIzLjA4OTk4NiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSI0NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDg4Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzUuMjkxNjUpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDIwMjAyO2ZpbGwtb3BhY2l0eTowLjE4O3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjU5LjI1MTQ0LDIwOS42MDI4NSBjIC01MS4wNDg0OCwwIC0xMjIuMjcxODgsMTcuMzM0NTMgLTE2Ni4xMDQwNzYsMTguMTM2MzQgQyA0OS4zMTUxNjEsMjI4LjU0MSA1LjkxMTYwNDJlLTgsMjIyLjU3MjYgNS45MTE2MDQyZS04LDIyMi41NzI2IEwgLTAuMDU2MzM2OCwyNTAuODIwMDcgLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMjU5LjI5NjIzLDI5Ny4wMDI0MiBaIgogICAgICAgaWQ9InBhdGg1MDU5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjY1MjQ2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMC42OTk2NTIzNywyNTQuOTc3ODEgYyAwLDAgMzYuOTA3NDg2NjMsMTkuNjE3OTggODQuNzIzMDA3NjMsMjQuODI0MjYgNjUuOTU2ODQsNy4xODE1NCA5Ni4xMDM3NCwtNS42ODE2OCAxNDEuMzEwMDQsLTMuNjc4NTYgMjAuMTI5MTksMC44OTE5NCAyOS40ODQ1MSwzLjEwODU2IDMyLjYyNDkzLDMuNDQyNjQgbCAtMC4wNjE0LDE3LjQzNjI3IHoiCiAgICAgICBpZD0icGF0aDUwMzgtOSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzI4NmI0OTtmaWxsLW9wYWNpdHk6MC45NDExNzY0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0xLjIwNzE2NjJlLTgsMjk3LjAwMjkzIC0wLjA1NjMzNjgsMjUwLjgyMDA3IGMgMCwwIDUzLjkxNzk0MTgsMzguOTk4MzcgMTEzLjQ0OTE5NjgsMzcuNDg2NDYgNDguMDgyNjEsLTEuMjIxMTUgNzMuOTg1ODksLTIuMDczMDggOTcuNTQwNzcsMC40NDI4MiAxOC4zMTU3MiwxLjk1NjMgNDguMzYyNiw4LjI1MzA3IDQ4LjM2MjYsOC4yNTMwNyB2IDAgeiIKICAgICAgIGlkPSJwYXRoNTAzOCIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K",aA={installed:!1,initialized:!1,icon:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJub25lIj4NCjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xODEuNTM0IDI1NC4yNTJDMTg1LjU2NiAyNTUuODIzIDE5MC4xNjQgMjU1LjcyMiAxOTQuMjM0IDI1My43NjRMMjQ2Ljk0IDIyOC40MDNDMjUyLjQ3OCAyMjUuNzM4IDI1NiAyMjAuMTMyIDI1NiAyMTMuOTgzVjQyLjAxODFDMjU2IDM1Ljg2ODkgMjUyLjQ3OCAzMC4yNjM4IDI0Ni45NCAyNy41OTg4TDE5NC4yMzQgMi4yMzY4MUMxODguODkzIC0wLjMzMzEzMiAxODIuNjQyIDAuMjk2MzQ0IDE3Ny45NTUgMy43MDQxOEMxNzcuMjg1IDQuMTkxIDE3Ni42NDcgNC43MzQ1NCAxNzYuMDQ5IDUuMzMzNTRMNzUuMTQ5IDk3LjM4NjJMMzEuMTk5MiA2NC4wMjQ3QzI3LjEwNzkgNjAuOTE5MSAyMS4zODUzIDYxLjE3MzUgMTcuNTg1NSA2NC42M0wzLjQ4OTM2IDc3LjQ1MjVDLTEuMTU4NTMgODEuNjgwNSAtMS4xNjM4NiA4OC45OTI2IDMuNDc3ODUgOTMuMjI3NEw0MS41OTI2IDEyOEwzLjQ3Nzg1IDE2Mi43NzNDLTEuMTYzODYgMTY3LjAwOCAtMS4xNTg1MyAxNzQuMzIgMy40ODkzNiAxNzguNTQ4TDE3LjU4NTUgMTkxLjM3QzIxLjM4NTMgMTk0LjgyNyAyNy4xMDc5IDE5NS4wODEgMzEuMTk5MiAxOTEuOTc2TDc1LjE0OSAxNTguNjE0TDE3Ni4wNDkgMjUwLjY2N0MxNzcuNjQ1IDI1Mi4yNjQgMTc5LjUxOSAyNTMuNDY3IDE4MS41MzQgMjU0LjI1MlpNMTkyLjAzOSA2OS44ODUzTDExNS40NzkgMTI4TDE5Mi4wMzkgMTg2LjExNVY2OS44ODUzWiIgZmlsbD0id2hpdGUiLz4NCjwvbWFzaz4NCjxnIG1hc2s9InVybCgjbWFzazApIj4NCjxwYXRoIGQ9Ik0yNDYuOTQgMjcuNjM4M0wxOTQuMTkzIDIuMjQxMzhDMTg4LjA4OCAtMC42OTgzMDIgMTgwLjc5MSAwLjU0MTcyMSAxNzUuOTk5IDUuMzMzMzJMMy4zMjM3MSAxNjIuNzczQy0xLjMyMDgyIDE2Ny4wMDggLTEuMzE1NDggMTc0LjMyIDMuMzM1MjMgMTc4LjU0OEwxNy40Mzk5IDE5MS4zN0MyMS4yNDIxIDE5NC44MjcgMjYuOTY4MiAxOTUuMDgxIDMxLjA2MTkgMTkxLjk3NkwyMzkuMDAzIDM0LjIyNjlDMjQ1Ljk3OSAyOC45MzQ3IDI1NS45OTkgMzMuOTEwMyAyNTUuOTk5IDQyLjY2NjdWNDIuMDU0M0MyNTUuOTk5IDM1LjkwNzggMjUyLjQ3OCAzMC4zMDQ3IDI0Ni45NCAyNy42MzgzWiIgZmlsbD0iIzAwNjVBOSIvPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPg0KPHBhdGggZD0iTTI0Ni45NCAyMjguMzYyTDE5NC4xOTMgMjUzLjc1OUMxODguMDg4IDI1Ni42OTggMTgwLjc5MSAyNTUuNDU4IDE3NS45OTkgMjUwLjY2N0wzLjMyMzcxIDkzLjIyNzJDLTEuMzIwODIgODguOTkyNSAtMS4zMTU0OCA4MS42ODAyIDMuMzM1MjMgNzcuNDUyM0wxNy40Mzk5IDY0LjYyOThDMjEuMjQyMSA2MS4xNzMzIDI2Ljk2ODIgNjAuOTE4OCAzMS4wNjE5IDY0LjAyNDVMMjM5LjAwMyAyMjEuNzczQzI0NS45NzkgMjI3LjA2NSAyNTUuOTk5IDIyMi4wOSAyNTUuOTk5IDIxMy4zMzNWMjEzLjk0NkMyNTUuOTk5IDIyMC4wOTIgMjUyLjQ3OCAyMjUuNjk1IDI0Ni45NCAyMjguMzYyWiIgZmlsbD0iIzAwN0FDQyIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZCkiPg0KPHBhdGggZD0iTTE5NC4xOTYgMjUzLjc2M0MxODguMDg5IDI1Ni43IDE4MC43OTIgMjU1LjQ1OSAxNzYgMjUwLjY2N0MxODEuOTA0IDI1Ni41NzEgMTkyIDI1Mi4zODkgMTkyIDI0NC4wMzlWMTEuOTYwNkMxOTIgMy42MTA1NyAxODEuOTA0IC0wLjU3MTE3NSAxNzYgNS4zMzMyMUMxODAuNzkyIDAuNTQxMTY2IDE4OC4wODkgLTAuNzAwNjA3IDE5NC4xOTYgMi4yMzY0OEwyNDYuOTM0IDI3LjU5ODVDMjUyLjQ3NiAzMC4yNjM1IDI1NiAzNS44Njg2IDI1NiA0Mi4wMTc4VjIxMy45ODNDMjU2IDIyMC4xMzIgMjUyLjQ3NiAyMjUuNzM3IDI0Ni45MzQgMjI4LjQwMkwxOTQuMTk2IDI1My43NjNaIiBmaWxsPSIjMUY5Q0YwIi8+DQo8L2c+DQo8ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6b3ZlcmxheSIgb3BhY2l0eT0iMC4yNSI+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS4zNzggMjU0LjI1MkMxODUuNDEgMjU1LjgyMiAxOTAuMDA4IDI1NS43MjIgMTk0LjA3NyAyNTMuNzY0TDI0Ni43ODMgMjI4LjQwMkMyNTIuMzIyIDIyNS43MzcgMjU1Ljg0NCAyMjAuMTMyIDI1NS44NDQgMjEzLjk4M1Y0Mi4wMTc5QzI1NS44NDQgMzUuODY4NyAyNTIuMzIyIDMwLjI2MzYgMjQ2Ljc4NCAyNy41OTg2TDE5NC4wNzcgMi4yMzY2NUMxODguNzM3IC0wLjMzMzI5OSAxODIuNDg2IDAuMjk2MTc3IDE3Ny43OTggMy43MDQwMUMxNzcuMTI5IDQuMTkwODMgMTc2LjQ5MSA0LjczNDM3IDE3NS44OTIgNS4zMzMzN0w3NC45OTI3IDk3LjM4NkwzMS4wNDI5IDY0LjAyNDVDMjYuOTUxNyA2MC45MTg5IDIxLjIyOSA2MS4xNzM0IDE3LjQyOTIgNjQuNjI5OEwzLjMzMzExIDc3LjQ1MjNDLTEuMzE0NzggODEuNjgwMyAtMS4zMjAxMSA4OC45OTI1IDMuMzIxNiA5My4yMjczTDQxLjQzNjQgMTI4TDMuMzIxNiAxNjIuNzczQy0xLjMyMDExIDE2Ny4wMDggLTEuMzE0NzggMTc0LjMyIDMuMzMzMTEgMTc4LjU0OEwxNy40MjkyIDE5MS4zN0MyMS4yMjkgMTk0LjgyNyAyNi45NTE3IDE5NS4wODEgMzEuMDQyOSAxOTEuOTc2TDc0Ljk5MjcgMTU4LjYxNEwxNzUuODkyIDI1MC42NjdDMTc3LjQ4OCAyNTIuMjY0IDE3OS4zNjMgMjUzLjQ2NyAxODEuMzc4IDI1NC4yNTJaTTE5MS44ODMgNjkuODg1MUwxMTUuMzIzIDEyOEwxOTEuODgzIDE4Ni4xMTVWNjkuODg1MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4NCjwvZz4NCjwvZz4NCjxkZWZzPg0KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSItMjEuNDg5NiIgeT0iNDAuNTIyNSIgd2lkdGg9IjI5OC44MjIiIGhlaWdodD0iMjM2LjE0OSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQvPg0KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPg0KPGZlQmxlbmQgbW9kZT0ib3ZlcmxheSIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2QiIHg9IjE1NC42NjciIHk9Ii0yMC42NzM1IiB3aWR0aD0iMTIyLjY2NyIgaGVpZ2h0PSIyOTcuMzQ3IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4NCjxmZU9mZnNldC8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMC42NjY3Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+DQo8L2ZpbHRlcj4NCjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjEyNy44NDQiIHkxPSIwLjY1OTk4OCIgeDI9IjEyNy44NDQiIHkyPSIyNTUuMzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8L2RlZnM+DQo8L3N2Zz4=",async open(e,t){if(!aA.initialized){let e=a(5317);await new Promise((t=>{e.exec("code --version").on("close",(a=>{a||(aA.installed=!0,aA.launch=(t,a)=>{let i=`code -n "${t}" "${a}"`;e.exec(i)},t())}))})),aA.initialized=!0}aA.launch(e,t)},launch(){Blockbench.openLink("https://code.visualstudio.com")}};function iA(){let e="#";for(var t=0;t<6;t++)e+=Math.floor(16*Math.random()).toString(16);return e}const oA={name:"entity-wizard-dialog",components:{SpawnEgg:Tl,Export:$l,LootEditor:Ll},data(){let e=function(){if(Format.id&&Format.id.match(/^bedrock/)){let e=Project.geometry_name;Project.geometry_name="{name}";let t=Format.codec.compile();Project.geometry_name=e;let a={name:"Current Model",entity:zl.basic.entity,model:t,thumbnail:zl.basic.thumbnail,textures:{}};main_preview.screenshot({width:144,height:96},(e=>{a.thumbnail=e}));let i=Texture.getDefault();if(i){let e="data:image/png;base64,"+i.getBase64();a.textures.default=e}return a}}();return{open_page:"start",start_page_image:eA,start_page_background:tA,dialogue_designer_icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAjUlEQVQ4jWNgGGjACKX/k6ufEab5wI3XJOl00BBlYGBgYGAiR/Plq9cZUuoXMzAwMDCwoEsQAy5eeghnM5FkNRYwDAyAB+Llq9cZLl56yKCvJw+XRA4svC5w0BDFUExI85zGWAYGBiwpcfLaQ3DNMEV4ACO6wH8GBob/KfWL/8PYJJuApgmbPFGA6MwFAFZdLyWGO8YJAAAAAElFTkSuQmCC",VSCode:aA,pages:{metadata:{name:"Name"},appearance:{name:"Appearance"},behavior:{name:"Behavior"},loot:{name:"Loot"},spawn_egg:{name:"Spawn Egg"},export:{name:"Export",button:"Export"},next_steps:{name:"Next Steps",button:isApp?"Edit Model":"Continue"}},edition_options:{bedrock:"Bedrock",preview:"Bedrock Preview",edu:"Education Edition"},mobs:zl,open_project_mob:e,appearance_search_term:"",behavior_search_term:"",has_customized_id:!1,resource_pack_path:null,behavior_pack_path:null,bedrock_installed:!1,form:{edition:localStorage.getItem("minecraft_wizard.selected_edition")||"bedrock",identifier:"",display_name:"",appearance:"",behavior:"",loot_type:"default",custom_loot:[],spawn_egg_mode:"colors",spawn_egg_base:iA(),spawn_egg_overlay:iA(),spawn_egg_image:"",export_mode:isApp?"folder":"mcaddon",pack_name:"",pack_authors:"",pack_icon:"",integrate_pack:null}}},computed:{identifier_error(){let e=this.form.identifier;return e?e.match(/^minecraft:/)?"Use a different namespace than 'minecraft:'":e.match(/[A-Z]/)?"Identifiers cannot contain capital letters":e.match(/^\d/)?"Identifiers cannot start with a number":e.match(/[^a-z0-9-_.:]/)?"Identifiers cannot contain spaces or special characters":e.match(/\w:\w/)?"":"Identifiers must start with a namespace, separated by a colon":""},appearance_mobs(){let e=this.appearance_search_term.toLowerCase(),t="edu"==this.form.edition,a={};for(var i in this.open_project_mob&&(a.blockbench_model=this.open_project_mob),this.mobs){let o=this.mobs[i];o.disable_on_edu&&t||o.entity&&(o.name.toLowerCase().includes(e)||o.aliases&&o.aliases.includes(e))&&(a[i]=o)}return a},behavior_mobs(){let e=this.behavior_search_term.toLowerCase(),t="edu"==this.form.edition,a={};for(var i in this.mobs){let o=this.mobs[i];o.disable_on_edu&&t||(o.name.toLowerCase().includes(e)||o.aliases&&o.aliases.includes(e))&&(a[i]=o)}return a}},methods:{cancel(e){if(!document.querySelector("#blackout:hover")&&open_interface instanceof Dialog){let e=open_interface;e.hide(),"start"!=this.open_page&&Blockbench.showMessageBox({title:"Discard",message:"Do you want to discard your progress in the Minecraft entity wizard?",icon:"delete",buttons:["Keep","Discard"]},(t=>{1==t&&(e.delete(),delete e.object)}))}},checkPageComplete(){let{form:e}=this;if("metadata"==this.open_page){if(!e.display_name)return Blockbench.showQuickMessage("Please enter a name"),!1;if(!e.identifier||this.identifier_error)return Blockbench.showQuickMessage("Please enter a correct identifier"),!1}else if("appearance"==this.open_page){if(!e.appearance)return Blockbench.showQuickMessage("Please select a base mob"),!1}else if("behavior"==this.open_page){if(!e.behavior)return Blockbench.showQuickMessage("Please select a base mob"),!1}else if("spawn_egg"==this.open_page);else if("export"==this.open_page){if("integrate"==e.export_mode&&!e.integrate_pack)return Blockbench.showQuickMessage("Please select a behavior pack"),!1;if("integrate_mcaddon"==e.export_mode&&!window.EntityWizardProject.previous_mcaddon)return Blockbench.showQuickMessage("Please select an mcaddon file"),!1;if(0==e.export_mode.includes("integrate")&&!e.pack_name)return Blockbench.showQuickMessage("Please enter a pack name"),!1;if(0==e.export_mode.includes("integrate")&&e.pack_name.match(/[<>:"/\\|?*]/))return Blockbench.showQuickMessage("You cannot use invalid characters in the pack name: "+e.pack_name.match(/[<>:"/\\|?*]/)[0]),!1}return!0},async exportPacks(){let e=await async function(e,t){let a=Ol(),i=isApp&&jl(e.edition),o=e.identifier.replace(/^.+:/,""),r=guid(),n=Rl;if(e.pack_icon){let d=new CanvasFrame(16,16);await d.loadFromURL(e.pack_icon),n=d.canvas.toDataURL()}let m,s,l={authors:e.pack_authors?e.pack_authors.split(/,\s*/):void 0,generated_with:{blockbench_entity_wizard:["1.8.3"]}},A=function(e,t){let a=[],i=guid();a.push({name:"manifest.json",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+" Behavior Pack",uuid:i,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:"Behavior",version:[1,0,0],uuid:guid(),type:"data"}],dependencies:[{uuid:t.rp_uuid,version:[1,0,0]}]})}),a.push({name:"pack_icon.png",setup_file:!0,type:"image",content:t.pack_icon});let o=(zl[e.behavior]||zl.basic).behavior;var r;r=(r=(r=o).replace(/{name}/g,t.mob_filename)).replace(/{identifier}/g,e.identifier),o=JSON.parse(r);let{component_groups:n,description:m,components:s}=o["minecraft:entity"];if(m.identifier=e.identifier,m.is_spawnable="none"!=e.spawn_egg_mode,"custom"==e.loot_type){if(n)for(let e in n)e.includes("adult")&&n[e]["minecraft:loot"]&&(n[e]["minecraft:loot"]={table:`loot_tables/entities/${t.mob_filename}.json`});s["minecraft:loot"]={table:`loot_tables/entities/${t.mob_filename}.json`};let i=function(e){return{pools:e.custom_loot.map((e=>{let t={rolls:e.rolls,entries:[]};return e.entries.forEach((e=>{let a;a="empty"==e.type?{type:"empty",weight:e.weight}:{type:"item",name:"custom"==e.type?e.custom_id:e.type,weight:e.weight,functions:[{function:"set_count",count:e.count_min==e.count_max?e.count_min:{min:e.count_min,max:e.count_max}}]},t.entries.push(a)})),t}))}}(e);a.push({name:`loot_tables/entities/${t.mob_filename}.json`,content:compileJSON(i)})}else if("none"==e.loot_type&&(delete s["minecraft:loot"],n))for(let e in n)delete n[e]["minecraft:loot"];return a.push({name:`entities/${t.mob_filename}.behavior.json`,content:compileJSON(o)}),a}(e,{mob_filename:o,rp_uuid:r,pack_icon:n,pack_metadata:l}),c=await async function(e,t){function a(a){return a=(a=a.replace(/{name}/g,t.mob_filename)).replace(/{identifier}/g,e.identifier),JSON.parse(a)}let i=[];i.push({name:"manifest.json",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+" Resource Pack",uuid:t.rp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:e.pack_name,type:"resources",uuid:guid(),version:[1,0,0]}]})}),i.push({name:"pack_icon.png",setup_file:!0,type:"image",content:t.pack_icon});const o=zl[e.appearance]||t.open_project_mob;let r,n=a(o.entity),{description:m}=n["minecraft:client_entity"];if(m.identifier=e.identifier,"colors"==e.spawn_egg_mode)m.spawn_egg={base_color:e.spawn_egg_base,overlay_color:e.spawn_egg_overlay};else if("texture"==e.spawn_egg_mode){let a=t.mob_filename+"_spawn_egg";m.spawn_egg={texture:a},i.push({name:"textures/item_texture.json",merge:!0,content:compileJSON({texture_data:{[a]:{textures:[`textures/items/${a}`]}}})});let o=new CanvasFrame(16,16);await o.loadFromURL(e.spawn_egg_image);let r=o.canvas.toDataURL();i.push({name:`textures/items/${a}.png`,content:r,type:"image"})}else delete m.spawn_egg;window.EntityWizardProject.project&&(r=ModelProject.all.find((e=>e.uuid==window.EntityWizardProject.project)),r&&r!==Project&&r.select());let s=a(o.model);window.EntityWizardProject.model=s,r&&(s=Codecs.bedrock.compile({raw:!0})),i.push({name:`models/entity/${t.mob_filename}.geo.json`,content:compileJSON(s)}),window.EntityWizardProject.textures={};let l=Object.keys(o.textures).length;if(1==l){m.textures.default=`textures/entity/${t.mob_filename}`;let e=o.textures.default;r&&Texture.all.length&&(e="data:image/png;base64,"+Texture.getDefault().getBase64()),window.EntityWizardProject.textures.default=e,i.push({name:`textures/entity/${t.mob_filename}.png`,content:e,type:"image"})}else if(l>1)for(var A in o.textures){let e="default"==A?t.mob_filename:A;m.textures[A]=`textures/entity/${t.mob_filename}/${e}`;let a=o.textures[A];if(r&&Texture.all.length){let t=Texture.all.find((t=>t.name==e+".png"));t&&(a="data:image/png;base64,"+t.getBase64())}window.EntityWizardProject.textures[A]=a,i.push({name:`textures/entity/${t.mob_filename}/${e}.png`,content:a,type:"image"})}if(delete window.EntityWizardProject.animation,o.animations){let e=a(o.animations);r&&(e=Animator.buildFile()),window.EntityWizardProject.animation=e,i.push({name:`animations/${t.mob_filename}.animation.json`,content:compileJSON(e)})}if(o.render_controllers){let e=a(o.render_controllers);i.push({name:`render_controllers/${t.mob_filename}.render_controllers.json`,content:compileJSON(e)})}i.push({name:`entity/${t.mob_filename}.entity.json`,content:compileJSON(n)});let c=[`entity.${e.identifier}.name=${e.display_name}`];"none"!=e.spawn_egg_mode&&c.push(`item.spawn_egg.entity.${e.identifier}.name=Spawn ${e.display_name}`),o.rideable&&c.push(`action.hint.exit.${e.identifier}=Tap sneak to dismount`),i.push({name:"texts/en_US.lang",merge:!0,content:c.join("\n")});let{entity_sounds:d}=JSON.parse(Ul());return i.push({name:"sounds.json",merge:!0,content:compileJSON({entity_sounds:{entities:{[e.identifier]:d.entities[e.appearance]}}})}),i}(e,{mob_filename:o,rp_uuid:r,pack_icon:n,pack_metadata:l,open_project_mob:t.open_project_mob});if("folder"==e.export_mode){m=PathModule.join(i,"development_behavior_packs",e.pack_name);try{a.readdirSync(m)}catch(p){a.mkdirSync(m)}s=PathModule.join(i,"development_resource_packs",e.pack_name);try{a.readdirSync(s)}catch(u){a.mkdirSync(s)}}else if("integrate"==e.export_mode){function g(e){try{let t=a.readFileSync(e,{encoding:"utf-8"}),i=autoParseJSON(t,!1);i&&(i.metadata||(i.metadata={}),i.metadata.generated_with||(i.metadata.generated_with={}),i.metadata.generated_with.blockbench_entity_wizard instanceof Array==0&&(i.metadata.generated_with.blockbench_entity_wizard=[]),i.metadata.generated_with.blockbench_entity_wizard.safePush("1.8.3"),a.writeFileSync(e,compileJSON(i),{encoding:"utf-8"}))}catch(e){console.error("Unable to add generator to existing pack manifests",e)}}m=e.integrate_pack.bp_path,s=e.integrate_pack.rp_path,g(PathModule.join(m,"manifest.json")),g(PathModule.join(s,"manifest.json"))}if("folder"==e.export_mode||"integrate"==e.export_mode){function h(t,i){if(t.setup_file&&"integrate"==e.export_mode)return;let o=PathModule.join(i,t.name);if(function(e,t){let a=e.split(PathModule.sep),i=Math.max(t.split(PathModule.sep).length-1,1);for(;i{h(e,m)})),c.forEach((e=>{h(e,s)}))}if("mcaddon"==e.export_mode||"integrate_mcaddon"==e.export_mode){let f,_="integrate_mcaddon"==e.export_mode,b=e.pack_name;if(f=_&&window.EntityWizardProject.previous_mcaddon?window.EntityWizardProject.previous_mcaddon:new JSZip,_){let w=!1;f.forEach(((e,t)=>{if(w)return;let a=e.split("/");a.length>=2&&(b=a[0].replace(/\s*(BP|Behavior|RP|Resources?)$/i,""),w=!0)}))}async function v(e,t){if(e.setup_file&&_)return;let a=t+e.name;if(_&&e.merge&&f.file(a)){let t=await f.file(a).async("string");if(a.endsWith("json"))try{t=autoParseJSON(t);let a=JSON.parse(e.content);$.extend(!0,a,t),e.content=compileJSON(a)}catch(e){}else a.endsWith("png")||(e.content=t+"\n"+e.content)}e.setup_file&&_||("image"==e.type&&(e.content=e.content.split(",")[1]),f.file(a,e.content,{base64:"image"==e.type||void 0,binary:"buffer"==e.type||void 0}))}for(let B of A)await v(B,b+" Behavior/");for(let k of c)await v(k,b+" Resources/");let y=await f.generateAsync({type:"blob"});isApp?Blockbench.export({type:"Minecraft Add-on",extensions:["mcaddon"],name:b,content:y,savetype:"zip"}):Blockbench.showMessageBox({title:"Export Add-on",commands:{download:"Download File"},buttons:["dialog.cancel"]},(e=>{"download"==e&&Blockbench.export({type:"Minecraft Add-on",extensions:["mcaddon"],name:b,content:y,savetype:"zip"})}))}return{rp_path:s,bp_path:m}}(this.form,{open_project_mob:this.open_project_mob});this.resource_pack_path=e.rp_path,this.behavior_pack_path=e.bp_path,"integrate"==this.form.export_mode?Blockbench.showQuickMessage("Integrated into Resource and Behavior Pack"):(Blockbench.notification("Export Successful","Exported resource and behavior pack"),Blockbench.showQuickMessage("Exported Resource and Behavior Pack")),localStorage.setItem("minecraft_wizard.selected_edition",this.form.edition)},async switchPage(e){let t=Object.keys(this.pages),a=t.indexOf(this.open_page),i=t.indexOf(e);if(i<=a)this.open_page=e;else{let e;for(;this.open_page!=e&&this.open_page!=t[i];)e=this.open_page,await this.nextPage()}},async nextPage(){if(!this.checkPageComplete())return;if("appearance"==this.open_page&&!this.form.behavior&&zl[this.form.appearance]&&(this.form.behavior=this.form.appearance),"export"==this.open_page&&await this.exportPacks(),"next_steps"==this.open_page){let e=this.form.identifier.replace(/^.+:/,""),t=this.resource_pack_path;if(this.form.export_mode.includes("mcaddon")||!isApp){let t={no_file:!0,content:JSON.stringify(window.EntityWizardProject.model),path:e+".geo.json"};try{loadModelFile(t)}catch(e){console.error(e)}return setTimeout((()=>{for(let t in window.EntityWizardProject.textures){let a=window.EntityWizardProject.textures[t];new Texture({name:e}).fromDataURL(a).add(!1)}window.EntityWizardProject.animation&&Animator.loadFile({json:window.EntityWizardProject.animation,path:`animations/${e}.animation.json`}),window.EntityWizardProject.project=Project.uuid}),100),void(Dialog.open&&Dialog.open.close())}open_interface instanceof Dialog&&open_interface.hide(),Blockbench.read([PathModule.join(t,"models","entity",`${e}.geo.json`)],{},(e=>{loadModelFile(e[0]),setTimeout((()=>{open_interface&&"select_texture"==open_interface.id&&open_interface.onButton(1)}),100)}))}let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)+1];t&&(this.open_page=t)},previousPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)-1];t&&(this.open_page=t)},openInstallInstructions(e){!function(e){new Dialog({title:"Add-on Installation Instructions",singleButton:!0,width:660,lines:[e.includes("mcaddon")?$('

    To import the packs into Minecraft, open the downloaded .mcaddon file.

    ')[0]:"",$('

    To enable the addon, you need to add it to your Minecraft world.\n\t\t\t\tOpen your world settings and locate the Behavior Packs section.\n\t\t\t\tFind your new pack and activate it.\n\t\t\t\tEnabling the behavior pack will also automatically activate the resource pack.

    \n\t\t\t')[0],Interface.createElement("img",{src:"data:image/png;base64,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",style:"image-rendering: auto; max-width: 100%;",width:"660px"})]}).show()}(e)},inputDisplayName(){if(this.has_customized_id)return;let e=(settings.username.value||"myname")+":"+this.form.display_name;e=e.toLowerCase().replace(/[- _.]+/g,"_").replace(/[^a-z0-9_:]/g,""),this.form.identifier=e},getThumbnail:e=>`url('${e}')`,getSameBehaviorText(e){return"blockbench_model"==e?"Use the basic behavior.":"basic"==e?"Use the basic behavior as well.":`Use the behavior from the ${this.mobs[this.form.appearance].name} as well.`},copySummonCommand(){let e=`/summon ${this.form.identifier}`;Clipbench.setText(e),Blockbench.showQuickMessage("Command copied to clipboard")}}},rA=Hl(oA,e,[function(){var e=this,t=e._self._c;return t("section",[t("label",[e._v("This wizard will guide you through the process of creating a custom Minecraft entity.")]),e._v(" "),t("p",[e._v("In the process, you can select the appearance of the mob, as well as how it behaves in the world, what it is called and how it can be spawned.")])])},function(){var e=this,t=e._self._c;return t("section",[t("label",[e._v("By the end, you will have a simple Add-On containing your entity.")]),e._v(" "),t("p",[e._v("From there, you will be able to customize the entity in depth.")]),e._v(" "),t("p",[e._v("We will let you know everything you will need to get started.")])])},function(){var e=this,t=e._self._c;return t("li",{staticClass:"entity_wizard_documentation"},[t("a",{staticClass:"open-in-browser",attrs:{href:"https://aka.ms/mcentitywizard"}},[t("i",{staticClass:"material-icons"},[e._v("description")]),e._v(" "),t("span",[e._v("Documentation")])])])},function(){var e=this._self._c;return e("section",[e("p",[this._v("Select the mob that you want the appearance of your entity to be based off. You can later modify the model in Blockbench.")])])},function(){var e=this._self._c;return e("section",[e("p",[this._v("Select how you want the entity to behave and interact with the world.")])])},function(){var e=this,t=e._self._c;return t("p",[t("b",[e._v("WARNING:")]),e._v(" Combining different appearance and behavior might not work out of the box and might need additional adjustments.")])},function(){var e=this,t=e._self._c;return t("label",[t("i",{staticClass:"material-icons",staticStyle:{"vertical-align":"sub",margin:"4px"}},[e._v("info")]),e._v("You can always re-export the MCAddon via "),t("b",[e._v("File")]),e._v(" > "),t("b",[e._v("Export")]),e._v(" > "),t("b",[e._v("Export MCAddon")]),e._v(".")])},function(){var e=this,t=e._self._c;return t("section",[t("label",[e._v("To learn more about creating Minecraft addons, visit the "),t("a",{staticClass:"open-in-browser",attrs:{href:"https://wiki.bedrock.dev/guide/introduction.html",target:"blank",rel:"noopener"}},[e._v("Beginners Guide")]),e._v(" on the Bedrock Wiki!")]),e._v(" "),t("p",[e._v("(You can re-open this dialog to return to this page)")])])}],!1,(function(e){var t=a(2395);t.__inject__&&t.__inject__(e)}),null,"2f51db9c").exports,nA=[];let mA;Plugin.register("minecraft_entity_wizard",{title:"Minecraft Entity Wizard",author:"JannisX11 & Mojang Studios",icon:"icon.png",description:"Create entities for Minecraft: Bedrock Edition! Start with the looks and behavior of a vanilla entity, and turn it into your own creation!",tags:["Minecraft: Bedrock Edition"],version:"1.8.3",min_version:"4.8.0",variant:"both",has_changelog:!0,bug_tracker:"https://github.com/JannisX11/minecraft-wizards/issues/new/choose",creation_date:"2021-08-04",onload(){async function e(){0!=await MinecraftEULA.promptUser("entity_wizard")&&mA.show()}window.EntityWizardProject={},mA=new Dialog({id:"minecraft_entity_wizard",title:"Minecraft Entity Wizard",width:980,padding:!1,buttons:[],component:rA,onConfirm(){return this.content_vue.nextPage(),!1},onCancel(){return this.content_vue.cancel(),!1}});let t=new Action("new_bedrock_entity",{name:"Minecraft Entity Wizard",icon:Rl,click(){e()}});MenuBar.menus.filter.addAction(t),nA.push(t);let a=new Action("entity_wizard_export_mcaddon",{name:"Export MCAddon (Entity Wizard)",icon:Rl,condition:()=>mA.content_vue&&mA.content_vue.form.display_name&&mA.content_vue.form.export_mode.includes("mcaddon"),click(){mA.content_vue.exportPacks()}});MenuBar.menus.file.addAction(a,"export.0"),nA.push(a);let i=new ModelLoader("minecraft_entity_wizard",{name:"Minecraft Entity Wizard",description:"Create custom Entities for Minecraft: Bedrock Edition!",icon:Rl,target:"Minecraft: Bedrock Edition",format_page:{component:{template:`\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t

    In the process, you can select the appearance of the mob, as well as how it behaves in the world, what it is called and how it can be spawned.

    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t

    From there, you will be able to customize the entity in depth.

    \n\t\t\t\t\t\t\t\t\t

    We will let you know everything you will need to get started.

    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t`,methods:{async start(){await e(),mA.content_vue.open_page="metadata"}}}},onStart(){e()}});nA.push(i);let o=Blockbench.addCSS(`\n\t\t\t#start_screen #entity_wizard {cursor: pointer;}\n\t\t\t#entity_wizard .graphic {image-rendering: pixelated;}\n\t\t\t#start_screen #entity_wizard .start_screen_right {padding: 12px;}\n\t\t\t#start_screen #entity_wizard right {padding: 4px;}\n\t\t\t#minecraft_entity_wizard .dialog_content {margin: 0;}\n\t\t\t.format_entry[format=minecraft_entity_wizard] {\n\t\t\t\tcolor: #fde013;\n\t\t\t}\n\t\t\t#start_files .format_entry[format=minecraft_entity_wizard]:hover {\n\t\t\t\tcolor: #fffe6a;\n\t\t\t}\n\t\t\t#format_page_minecraft_entity_wizard {\n\t\t\t\tbackground-image: url('${tA}');\n\t\t\t\tbackground-position: bottom;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t\t#format_page_minecraft_entity_wizard p {\n\t\t\t\tcolor: var(--color-subtle_text);\n\t\t\t\tline-height: normal;\n\t\t\t}\n\t\t\t#format_page_minecraft_entity_wizard #entity_wizard_start_page section {\n\t\t\t\tmax-width: 480px;\n\t\t\t\tpadding: 0 20px;\n\t\t\t\tmargin: auto;\n\t\t\t\tpadding-top: 16px;\n\t\t\t}\n\t\t\t#format_page_minecraft_entity_wizard #entity_wizard_start_button {\n\t\t\t\tbackground-color: var(--color-accent);\n\t\t\t\tcolor: var(--color-light);\n\t\t\t\theight: 40px;\n\t\t\t\twidth: 128px;\n\t\t\t}\n\t\t\t#format_page_minecraft_entity_wizard #entity_wizard_start_page img {\n\t\t\t\tdisplay: block;\n\t\t\t\tfloat: right;\n\t\t\t\tmargin: 0;\n\t\t\t\tmargin-top: -16px;\n\t\t\t}\n\t\t`);nA.push(o)},onunload(){nA.forEach((e=>e.delete()))}})})()})(); ================================================ FILE: plugins/minecraft_item_wizard/about.md ================================================ This Item Wizard for Minecraft Bedrock Edition let's you add your own custom item to the game without any prior coding knowledge. Select from a list of presets, and customize properties and functionality of the item. You can use Blockbench's powerful editor to design a 3D model for your item! And you can design the 2D icon using Blockbench's built-in pixel art editor. The generated Add-On can be added to Minecraft, and you can use your custom items in your own world! > Developed by the creator of Blockbench, in collaboration with Mojang Studios! ================================================ FILE: plugins/minecraft_item_wizard/changelog.json ================================================ { "1.1.0": { "title": "1.1.0", "date": "2024-06-28", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added Enchantable Functionality" ] }, { "title": "Fixes", "list": [ "Fixed typo in the list of armor slots", "Made labels for armor slots more clear" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2025-02-15", "author": "JannisX11", "categories": [ { "title": "Features", "list": [ "Added option to merge into existing mcaddon file", "Added option to select game variant (normal, preview, education) inside the wizard" ] }, { "title": "Fixes", "list": [ "Fixed JSON comments causing file merging with existing packs to fail" ] } ] }, "1.2.1": { "title": "1.2.1", "date": "2025-06-08", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed an issue when importing mcaddon file for merging", "The resource pack now has the behavior pack set as a dependency" ] } ] }, "1.2.2": { "title": "1.2.2", "date": "2025-10-09", "author": "JannisX11", "categories": [ { "title": "Changes", "list": [ "Added compatibility for Blockbench 5.0", "Added compatibility for new Minecraft install location" ] } ] }, "1.2.4": { "title": "1.2.4", "date": "2025-10-25", "author": "JannisX11", "categories": [ { "title": "Fixes", "list": [ "Fixed export issue in the web app", "Fixed issue with exporting to the new Minecraft install location" ] } ] } } ================================================ FILE: plugins/minecraft_item_wizard/minecraft_item_wizard.js ================================================ (()=>{"use strict";var e={729:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(645),o=a.n(n),r=a(667),i=a.n(r),l=a(766),s=a(482),d=a(351),c=o()((function(e){return e[1]})),p=i()(l),u=i()(s),m=i()(d);c.push([e.id,'\n#item_wizard_wrapper {\n\t\tmin-height: 300px;\n\t\tposition: relative;\n\t\t--color-subtle_text: #91949C;\n}\n#item_wizard_wrapper > content {\n\t\tflex-grow: 1;\n}\n#item_wizard_navigation {\n\t\tflex: 40px 0 0;\n\t\tpadding: 8px;\n\t\tdisplay: flex;\n}\n#item_wizard_back_button {\n\t\tpadding: 5px;\n \theight: 32px;\n\t\tcursor: pointer;\n}\n#item_wizard_back_button:hover {\n\t\tcolor: var(--color-light);\n}\n#item_wizard_navigation .bar_spacer {\n\t\tflex-grow: 1;\n}\n#item_wizard_next_button {\n\t\tbackground-color: var(--color-accent);\n\t\tcolor: var(--color-light);\n\t\twidth: 112px;\n\t\tmargin-right: 4px;\n}\n#minecraft_item_wizard section {\n\t\tpadding-top: 8px;\n\t\tpadding-bottom: 8px;\n}\n#minecraft_item_wizard p.description {\n\t\tcolor: var(--color-subtle_text);\n\t\tline-height: normal;\n\t\tmargin: 0;\n\t\tmargin-bottom: 2px;\n}\n#minecraft_item_wizard p.error_message {\n\t\tline-height: normal;\n\t\tpadding: 8px;\n\t\tborder-radius: 3px;\n\t\tborder-color: var(--color-error);\n\t\tborder-width: 1px;\n\t\tborder-style: solid;\n}\n#minecraft_item_wizard input[type=text], #minecraft_item_wizard input[type=number] {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tbackground-color: var(--color-back);\n\t\tborder: 1px solid var(--color-border);\n\t\tpadding: 4px;\n\t\tpadding-right: 0;\n\t\tborder-radius: 5px;\n}\n#minecraft_item_wizard section.divided_section {\n\t\tdisplay: flex;\n\t\talign-items: center;\n}\n#minecraft_item_wizard section.divided_section > *:first-child {\n\t\twidth: 70px;\n\t\tflex-shrink: 0;\n\t\tmargin-right: 10px;\n\t\ttext-align: center;\n\t\tflex-grow: 0;\n}\n#minecraft_item_wizard section.subsection {\n\t\tmargin-left: 40px;\n\t\tpadding: 4px 0;\n}\n#minecraft_item_wizard .wizard_columns {\n\t\tdisplay: flex;\n\t\tgap: 24px;\n\t\tflex-wrap: wrap;\n}\n#minecraft_item_wizard .wizard_columns > div {\n\t\tmin-width: 300px;\n\t\tflex-shrink: 1;\n\t\tflex-grow: 1;\n\t\twidth: 0;\n}\n.item_wizard_target_selection {\n\t\tposition: absolute;\n\t\tbackground-color: var(--color-ui);\n\t\ttop: 0;\n\t\tright: 0;\n\t\tmin-width: 156px;\n}\n#item_wizard_id_error {\n\t\tposition: absolute;\n\t\tright: 28px;\n\t\tmargin-top: -28px;\n}\n#item_wizard_id_error:hover .item_wizard_tooltip {\n\t\tdisplay: block;\n \tvisibility: visible;\n\t\tmargin: 0;\n \tright: -5px;\n}\nul.item_wizard_preset_list {\n\t\tmax-height: 360px;\n\t\twidth: 100%;\n\t\toverflow-y: scroll;\n}\nul.item_wizard_preset_list > li {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tposition: relative;\n\t\tfloat: left;\n\t\twidth: 100px;\n\t\theight: 118px;\n\t\tmargin: 3px 2px;\n\t\tbackground-color: var(--color-back);\n\t\tborder-radius: 5px;\n\t\tcursor: pointer;\n\t\tbox-sizing: content-box;\n\t\tborder: 1px solid transparent;\n\t\tbackground-size: 64px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position-x: center;\n\t\tbackground-position-y: 18px;\n\t\timage-rendering: pixelated;\n}\nul.item_wizard_preset_list > li:hover {\n\t\tbackground-color: var(--color-selected);\n\t\tcolor: var(--color-light);\n}\nul.item_wizard_preset_list > li.selected {\n\t\t border-color: var(--color-accent);\n}\nul.item_wizard_preset_list > li.selected::after {\n\t\tposition: absolute;\n\t\tcontent: "\\f00c";\n\t\tfont-family: \'Font Awesome 6 Free\';\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-accent);\n\t\tbackground-color: var(--color-ui);\n\t\theight: 19px;\n\t\ttop: -7px;\n\t\tright: -4px;\n\t\tborder-bottom-left-radius: 8px;\n\t\tpadding-left: 2px;\n}\nul.item_wizard_preset_list > li label {\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t\tmargin-top: auto;\n\t\tpointer-events: none;\n}\n#item_wizard_wrapper input[type="radio"] {\n\t\tvertical-align: middle;\n\t\tmargin-top: -4px;\n\t\tmargin-right: 6px;\n}\n#item_wizard_wrapper input[type="range"] {\n\t\tflex-grow: 1;\n\t\tz-index: 20;\n}\n#item_wizard_wrapper .bar.flex label {\n\t\tpadding: 3px 6px;\n\t\tmin-width: 50px;\n}\n.item_wizard_model_option {\n\t\tdisplay: inline-block;\n\t\theight: 160px;\n\t\twidth: 240px;\n\t\tmax-width: calc(50% - 20px);\n\t\tmargin-right: 16px;\n\t\tpadding-top: 16px;\n\t\tpadding-left: 15px;\n\t\tfont-size: 1.1em;\n\t\tbackground-color: var(--color-back);\n\t\tborder: 2px solid transparent;\n\t\tcursor: pointer;\n\t\tbackground-position-x: right;\n\t\tbackground-position-y: bottom;\n\t\tbackground-repeat: no-repeat;\n}\n.item_wizard_model_option:hover {\n\t\tcolor: var(--color-light);\n}\n.item_wizard_model_option.selected {\n\t\tborder-color: var(--color-accent);\n}\n.item_wizard_model_option[background="third_person_model"] {\n\t\tbackground-image: url('+p+');\n}\n.item_wizard_model_option[background="third_person_sprite"] {\n\t\tbackground-image: url('+u+');\n}\n#item_wizard_glint_input {\n\t\tposition: relative;\n}\n#item_wizard_glint_input::after {\n\t\tcontent: "";\n\t\theight: 30px;\n\t\twidth: 30px;\n\t\tposition: absolute;\n\t\tbackground: linear-gradient(137deg, rgba(149,41,236,0.6) 12%, rgba(174,56,196,0.5) 17%, rgba(100,25,126,0.7) 26%, rgba(175,67,208,0.6) 29%, rgba(106,27,137,0.7) 32%, rgba(123,34,170,0.4) 50%, rgba(177,90,191,0.6) 59%, rgba(99,32,140,0.5) 63%, rgba(130,34,156,0.6) 71%, rgba(187,57,198,0.47) 75%);\n\t\tborder-radius: 4px;\n\t\tright: 19px;\n\t\tanimation: 2s infinite item_wizard_glint_input;\n\t\tanimation-timing-function: ease;\n\t\tmix-blend-mode: lighten;\n}\n@keyframes item_wizard_glint_input {\n0% {\n\t\t\topacity: 0.5;\n}\n50% {\n\t\t\topacity: 1.0;\n}\n100% {\n\t\t\topacity: 0.5;\n}\n}\n.item_wizard_component_list > li {\n\t\tmargin-bottom: 8px;\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n}\n.item_wizard_functionality_options {\n\t\tmargin-left: 14px;\n\t\tmargin-bottom: 32px;\n\t\tborder-left: 3px solid var(--color-back);\n\t\tpadding-left: 18px;\n\t\twidth: 100%;\n}\n.item_wizard_component_list > li > label {\n\t\tfont-size: 1.2em;\n\t\tvertical-align: top;\n\t\tflex-shrink: 0;\n}\n#minecraft_item_wizard .item_wizard_component_list > li > p.description {\n\t\tmargin-top: 5px;\n\t\tmargin-right: 10px;\n\t\tmargin-left: auto;\n}\n#item_wizard_digger_blocks {\n\t\tpadding: 8px 0;\n}\n#item_wizard_digger_blocks > li {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-top: 4px;\n\t\tgap: 5px;\n}\n#item_wizard_digger_blocks > li > bb-select {\n\t\twidth: 30%;\n}\n#item_wizard_digger_blocks > li > .numeric_input {\n\t\tmax-width: 100px;\n}\n#item_wizard_digger_blocks > li > label {\n\t\tmargin-left: auto;\n}\n.break_block_animation {\n\t\theight: 48px;\n\t\twidth: 48px;\n\t\tflex-shrink: 0;\n\t\tbackground-color: var(--color-button);\n\t\tbackground-position-y: -128px;\n\t\tbackground-size: 100%;\n\t\tbox-shadow: 1px 1px 2px #00000080;\n\t\ttransform: rotate(5deg);\n\t\tmargin-right: 5px;\n\t\tbackground-image: url('+m+');\n}\n@keyframes break_block_animation {\n0%\t{background-position-y: 0;}\n9%\t{background-position-y: -48px;}\n18%\t{background-position-y: -96px;}\n27%\t{background-position-y: -144px;}\n36%\t{background-position-y: -192px;}\n45%\t{background-position-y: -240px;}\n54%\t{background-position-y: -288px;}\n63%\t{background-position-y: -336px;}\n70%\t{background-position-y: -384px;}\n80%\t{background-position-y: -432px;}\n90%\t{background-position-y: -480px;}\n99%\t{background-position-y: -528px;}\n}\n#item_durability_markers {\n\t\twidth: calc(100% - 50px);\n\t\tposition: relative;\n\t\theight: 20px;\n\t\tmargin-left: 50px;\n}\n#item_durability_markers > li {\n\t\tposition: absolute;\n\t\ttext-align: center;\n\t\tcolor: var(--color-subtle_text);\n\t\tmargin-left: -25px;\n}\n#item_durability_markers > li::before {\n\t\tcontent: "";\n\t\tdisplay: block;\n\t\tpointer-events: none;\n\t\theight: 12px;\n\t\twidth: 3px;\n\t\tposition: absolute;\n\t\ttop: -13px;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tmargin: auto;\n\t\tbackground-color: var(--color-grid);\n}\n#item_durability_markers > li:first-child {\n\t\tleft: calc(6% + 1px);\n}\n#item_durability_markers > li:nth-child(2) {\n\t\tleft: calc(13.7% + 1px);\n\t\twidth: 50px;\n}\n#item_durability_markers > li:nth-child(3) {\n\t\tleft: calc(73.7% + 1px);\n\t\twidth: 50px;\n}\n#item_durability_markers > li:last-child {\n\t\tright: calc(3% - 10px);\n}\n#item_durability_markers > li:last-child::before {\n\t\tmargin-right: 20px;\n}\n#item_fuel_markers {\n\t\twidth: calc(100% - 50px);\n\t\tposition: relative;\n\t\theight: 20px;\n\t\tmargin-left: 50px;\n}\n#item_fuel_markers > li {\n\t\tposition: absolute;\n\t\ttext-align: center;\n\t\tcolor: var(--color-subtle_text);\n\t\tmargin-left: -25px;\n}\n#item_fuel_markers > li::before {\n\t\tcontent: "";\n\t\tdisplay: block;\n\t\tpointer-events: none;\n\t\theight: 12px;\n\t\twidth: 3px;\n\t\tposition: absolute;\n\t\ttop: -13px;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tmargin: auto;\n\t\tbackground-color: var(--color-grid);\n}\n#item_fuel_markers > li[item=planks] {\n\t\tleft: calc(2.8% + 7px);\n}\n#item_fuel_markers > li[item=coal] {\n\t\tleft: calc(10.4% + 16px);\n}\n#item_fuel_markers > li:last-child {\n\t\tright: 8px;\n}\n#item_fuel_markers > li:last-child::before {\n \t\tmargin-right: 0;\n}\n#item_wizard_wrapper code.code {\n\t\tbackground-color: var(--color-back);\n\t\tborder: 1px solid var(--color-border);\n\t\tpadding: 1px;\n}\n#item_wizard_launch_vscode img {\n\t\tvertical-align: top;\n\t\tmargin-right: 4px;\n}\n\n',""]);const g=c},338:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,"\n#item_wizard_export_options {\n\tdisplay: grid;\n\tgrid-template-columns: auto auto;\n\tgrid-gap: 10px;\n\tmin-height: 125px;\n}\n.item_wizard_export_option {\n\tdisplay: inline-block;\n\tborder: 1px solid;\n\tborder-bottom: 10px solid;\n\tpadding: 12px;\n\tbackground-color: var(--color-back);\n\tcursor: pointer;\n\tborder-radius: 5px;\n}\n.item_wizard_export_option:hover {\n\tbackground-color: var(--color-button);\n}\n.item_wizard_export_option:not(.selected) {\n\tborder-top-color: transparent !important;\n\tborder-left-color: transparent !important;\n\tborder-right-color: transparent !important;\n}\n.item_wizard_export_option > h3 {\n\tmargin: 0;\n}\n#item_wizard_pack_list li {\n\tdisplay: inline-block;\n\twidth: min(100%, 254px);\n\toverflow: hidden;\n\tpadding: 4px;\n\tcursor: pointer;\n\tborder-radius: 5px;\n}\n#item_wizard_pack_list li:hover {\n\tcolor: var(--color-light);\n}\n#item_wizard_pack_list li.selected {\n\tbackground-color: var(--color-accent);\n\tcolor: var(--color-accent_text);\n}\n#item_wizard_pack_list li img, #item_wizard_pack_list li div {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 32px;\n\tbackground-color: var(--color-back);\n\tvertical-align: middle;\n\tmargin-right: 2px;\n}\n#item_wizard_pack_list li > i {\n\tvertical-align: middle;\n\tpadding: 5px;\n\tmax-width: unset;\n}\n",""]);const r=o},423:(e,t,a)=>{a.d(t,{Z:()=>w});var n=a(645),o=a.n(n),r=a(667),i=a.n(r),l=a(566),s=a(777),d=a(364),c=a(933),p=a(730),u=a(53),m=o()((function(e){return e[1]})),g=i()(l),b=i()(s),h=i()(d),f=i()(c),v=i()(p),_=i()(u);m.push([e.id,'\n.item_wizard_slider_label {\n\tmargin-left: 10px;\n\tmargin-top: 10px;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tcolor: var(--color-subtle_text);\n}\n.item_wizard_hud_slider_range {\n\twidth: 300px;\n\tmax-width: calc(100% - 30px);\n\tmin-height: 20px;\n\taspect-ratio: 10;\n\tbackground-repeat: repeat-x;\n\tbackground-size: contain;\n\tmargin-top: 5px;\n\tdisplay: inline-block;\n\tcursor: ew-resize;\n}\n.item_wizard_hud_slider_range > div {\n\theight: 100%;\n\tbackground-repeat: repeat-x;\n\tbackground-size: contain;\n\tpointer-events: none;\n}\n.item_wizard_hud_slider_range:hover > div {\n\tfilter: saturate(0.5) brightness(1.75);\n}\n.item_wizard_hud_slider[slider_tex="health"] > .item_wizard_hud_slider_range {\n\tbackground-image: url('+g+');\n}\n.item_wizard_hud_slider[slider_tex="health"] > .item_wizard_hud_slider_range > div {\n\tbackground-image: url('+b+');\n}\n.item_wizard_hud_slider[slider_tex="armor"] > .item_wizard_hud_slider_range {\n\tbackground-image: url('+h+');\n}\n.item_wizard_hud_slider[slider_tex="armor"] > .item_wizard_hud_slider_range > div {\n\tbackground-image: url('+f+');\n}\n.item_wizard_hud_slider[slider_tex="hunger"] > .item_wizard_hud_slider_range {\n\tbackground-image: url('+v+');\n}\n.item_wizard_hud_slider[slider_tex="hunger"] > .item_wizard_hud_slider_range > div {\n\tbackground-image: url('+_+");\n}\n\n",""]);const w=m},74:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,"\n.item_wizard_icon_picker {\n\t\tdisplay: flex;\n}\n.item_wizard_icon_picker label {\n\t\tpadding: 3px;\n}\n.item_wizard_icon_picker > .icon_picker_left {\n\t\tbackground-color: var(--color-back);\n\t\tmargin-right: 8px;\n\t\theight: 64px;\n\t\twidth: 64px;\n}\n.item_wizard_icon_picker > .icon_picker_right {\n\t\theight: 24px;\n \tcursor: pointer;\n}\n.item_wizard_icon_picker > .icon_picker_right label {\n \tcursor: inherit;\n}\n.item_wizard_icon_picker > .icon_picker_right:hover {\n\t\tcolor: var(--color-light);\n}\n.item_wizard_icon_picker > .icon_picker_right i.icon {\n\t\tvertical-align: text-bottom;\n}\n",""]);const r=o},64:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,"\n.item_wizard_suggestion_id_list {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin-bottom: 20px;\n\tmargin-top: 4px;\n\tgap: 4px;\n}\n",""]);const r=o},841:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,"\nbb-select[data-v-09e61bde] {\n\tmin-width: min(180px, 50%);\n}\n",""]);const r=o},645:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var a=e(t);return t[2]?"@media ".concat(t[2]," {").concat(a,"}"):a})).join("")},t.i=function(e,a,n){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(n)for(var r=0;r{e.exports=function(e,t){return t||(t={}),"string"!=typeof(e=e&&e.__esModule?e.default:e)?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e)}},379:(e,t,a)=>{var n,o=function(){var e={};return function(t){if(void 0===e[t]){var a=document.querySelector(t);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(e){a=null}e[t]=a}return e[t]}}(),r=[];function i(e){for(var t=-1,a=0;a{a.r(t);var n=a(379),o=a.n(n),r=a(729);o()(r.Z,{insert:"head",singleton:!1}),r.Z.locals},294:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(338);o()(r.Z,{insert:"head",singleton:!1}),r.Z.locals},557:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(423);o()(r.Z,{insert:"head",singleton:!1}),r.Z.locals},257:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(74);o()(r.Z,{insert:"head",singleton:!1}),r.Z.locals},635:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(64);o()(r.Z,{insert:"head",singleton:!1}),r.Z.locals},90:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(841);o()(r.Z,{insert:"head",singleton:!1}),r.Z.locals},351:e=>{e.exports="data:image/png;base64,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"},566:e=>{e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUUqHewg4pChumhBVMRRqlgEC6Wt0KqDyaVf0KQhSXFxFFwLDn4sVh1cnHV1cBUEwQ8QVxcnRRcp8X9JoUWMB8f9eHfvcfcOEJpVppo9E4CqWUY6ERdz+VUx8IoAgghjDCGJmXoys5iF5/i6h4+vdzGe5X3uz9GvFEwG+ETiOaYbFvEG8cympXPeJ46wsqQQnxOPG3RB4keuyy6/cS45LPDMiJFNzxNHiMVSF8tdzMqGSjxNHFVUjfKFnMsK5y3OarXO2vfkLwwVtJUM12kOI4ElJJGCCBl1VFCFhRitGikm0rQf9/APOf4UuWRyVcDIsYAaVEiOH/wPfndrFqcm3aRQHOh9se2PESCwC7Qatv19bNutE8D/DFxpHX+tCcx+kt7oaNEjILwNXFx3NHkPuNwBBp90yZAcyU9TKBaB9zP6pjwwcAv0rbm9tfdx+gBkqavlG+DgEBgtUfa6x7uD3b39e6bd3w9mQHKiPEu2qwAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+cHCA81E53SsTAAAABHSURBVBjTjY/bCQAxCATHq2b7r2a7yf1E8jKQAUFk0BUGrdfeEzmUBIBt5h6ImIUK23w88CQdmfZTmYlKTKHa3CQt7984hB9I0xt4MKFNVwAAAABJRU5ErkJggg=="},777:e=>{e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUUqHewg4pChumhBVMRRqlgEC6Wt0KqDyaVf0KQhSXFxFFwLDn4sVh1cnHV1cBUEwQ8QVxcnRRcp8X9JoUWMB8f9eHfvcfcOEJpVppo9E4CqWUY6ERdz+VUx8IoAgghjDCGJmXoys5iF5/i6h4+vdzGe5X3uz9GvFEwG+ETiOaYbFvEG8cympXPeJ46wsqQQnxOPG3RB4keuyy6/cS45LPDMiJFNzxNHiMVSF8tdzMqGSjxNHFVUjfKFnMsK5y3OarXO2vfkLwwVtJUM12kOI4ElJJGCCBl1VFCFhRitGikm0rQf9/APOf4UuWRyVcDIsYAaVEiOH/wPfndrFqcm3aRQHOh9se2PESCwC7Qatv19bNutE8D/DFxpHX+tCcx+kt7oaNEjILwNXFx3NHkPuNwBBp90yZAcyU9TKBaB9zP6pjwwcAv0rbm9tfdx+gBkqavlG+DgEBgtUfa6x7uD3b39e6bd3w9mQHKiPEu2qwAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+cHCA81LVyzrJsAAABISURBVBjTnY7RCQAgCAXPVnD/MfqylZrBfirCiKgDQZ6nCC+4qruqxx4gjZCcp7wuAkgcRKRWSQDlIGy59T9G2em63YRV5IcGhCAn1Jiiu3sAAAAASUVORK5CYII="},730:e=>{e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOGylRGwuZAAAASUlEQVQY04WPwQ3AMAgDL5nG+0/DNuQDKWqTchIfdLZkePC4DyMFSQCYWf1vaQvJW5yn+gh5lUYkr2RTK3JY6JL8bzFlcS+lsAC9/Bx1Qfp7hgAAAABJRU5ErkJggg=="},53:e=>{e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOHDvt4+wWAAAAiUlEQVQY02NgQID/UIwBmGAKrmhpMWySkGDAppAJpoC7PZVBSUiIYUdLBIZCRgYGhv+bJCQYlISEGJ5E6TE8ffmaQVpclMGjZgVMnoGJgYGB0e/FC4ZeoY8Mh89eZWBgYGB4+vI1inUsMBPnH3n6P9GGgSgA8+H/R1dX/cfnY7iG/9/vEFYEUwAA9JAw4z/oGNIAAAAASUVORK5CYII="},364:e=>{e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOACsWI6EvAAAAP0lEQVQY072QMQ4AIAgDD//F63kYDgIhxMHJS1ja0qFw8LhOaQK4qgJgZldt9dcwKpBIVk+jNy8e+BySscvV3wvOE3aCVZoeAAAAAElFTkSuQmCC"},933:e=>{e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOASHv7XlwAAAAXklEQVQY042QsQ3AIAwEzyhjpU+GTUMHPRMwRNKzACkCloMoOMnN/cuWDB+1jUWdA+r9FEJMmOLPOYCcM4DKEJO6vgnvLxWtiPXS19uwcx47gDgWWCpt4/0ZMvxlmr8RIymlxyLCAAAAAABJRU5ErkJggg=="},482:e=>{e.exports="data:image/png;base64,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"},766:e=>{e.exports="data:image/png;base64,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"},81:e=>{e.exports=require("child_process")},147:e=>{e.exports=require("fs")},37:e=>{e.exports=require("os")}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var r=t[n]={id:n,exports:{}};return e[n](r,r.exports,a),r.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nc=void 0,(()=>{var e=function(){var e=this,t=e._self._c;return t("div",{attrs:{id:"item_wizard_wrapper"}},[t("h2",[e._v(e._s(e.pages[e.open_page].label))]),e._v(" "),"preset"==e.open_page?t("div",{staticClass:"item_wizard_target_selection"},[t("p",{staticClass:"description"},[e._v("Game Variant")]),e._v(" "),t("select-input",{attrs:{options:e.edition_options},model:{value:e.form.edition,callback:function(t){e.$set(e.form,"edition",t)},expression:"form.edition"}})],1):e._e(),e._v(" "),"preset"==e.open_page?t("content",[e._m(0),e._v(" "),t("section",[t("label",[e._v("Preset")]),e._v(" "),t("ul",{staticClass:"item_wizard_preset_list"},e._l(e.presets,(function(a,n){return t("li",{key:n,class:{selected:n==e.form.preset},style:{backgroundImage:e.getThumbnail(a.thumbnail)},on:{click:function(t){return e.selectPreset(n)}}},[t("label",[e._v(e._s(a.name))])])})),0)])]):e._e(),e._v(" "),"metadata"==e.open_page?t("content",[t("section",[t("label",{staticClass:"required"},[e._v("Display Name")]),e._v(" "),t("p",{staticClass:"description"},[e._v("The display name will be displayed in the UI")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.display_name,expression:"form.display_name"}],attrs:{type:"text",placeholder:"Bamboo Sword"},domProps:{value:e.form.display_name},on:{input:[function(t){t.target.composing||e.$set(e.form,"display_name",t.target.value)},function(t){return e.inputDisplayName()}]}})]),e._v(" "),t("section",[t("label",{staticClass:"required"},[e._v("Identifier")]),e._v(" "),t("p",{staticClass:"description"},[e._v("The identifier is used internally in the addon to identify this item.\n\t\t\t\tAn identifier consists of the namespace and the item name, separated by a colon.\n\t\t\t\tThe namespace should be a short and unique version of your name or the name of your addon.\n\t\t\t")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.identifier,expression:"form.identifier"}],attrs:{type:"text",placeholder:"myname:bamboo_sword"},domProps:{value:e.form.identifier},on:{input:[function(t){t.target.composing||e.$set(e.form,"identifier",t.target.value)},function(t){e.has_customized_id=!0}]}}),e._v(" "),e.identifier_error?t("div",{attrs:{id:"item_wizard_id_error"}},[t("i",{staticClass:"material-icons",staticStyle:{color:"#ff415b"}},[e._v("error")]),e._v(" "),t("div",{staticClass:"item_wizard_tooltip tooltip"},[e._v(e._s(e.identifier_error))])]):e._e()]),e._v(" "),t("section",{staticClass:"divided_section"},[t("numeric-input",{attrs:{min:1,max:64,step:1},model:{value:e.form.stack_size,callback:function(t){e.$set(e.form,"stack_size",e._n(t))},expression:"form.stack_size"}}),e._v(" "),e._m(1)],1),e._v(" "),t("section",[t("label",{staticClass:"required"},[e._v("Creative Category")]),e._v(" "),t("div",{staticClass:"wizard_columns"},[t("div",[t("p",{staticClass:"description"},[e._v("Select the item category in the creative inventory")]),e._v(" "),t("select-input",{attrs:{options:e.inventory_categories},on:{input:function(t){e.form.item_group="none"}},model:{value:e.form.category,callback:function(t){e.$set(e.form,"category",t)},expression:"form.category"}})],1),e._v(" "),t("div",["hidden"!=e.form.category?t("p",{staticClass:"description"},[e._v("Optionally select the item group within the category")]):e._e(),e._v(" "),"hidden"!=e.form.category?t("select-input",{attrs:{options:e.inventory_groups[e.form.category]},model:{value:e.form.item_group,callback:function(t){e.$set(e.form,"item_group",t)},expression:"form.item_group"}}):e._e()],1)])])]):e._e(),e._v(" "),"functionality"==e.open_page?t("content",[t("ul",{staticClass:"item_wizard_component_list"},[t("li",{class:{expanded:e.form.melee_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.melee_enabled,expression:"form.melee_enabled"}],attrs:{type:"checkbox",id:"item_wizard_melee_enabled"},domProps:{checked:Array.isArray(e.form.melee_enabled)?e._i(e.form.melee_enabled,null)>-1:e.form.melee_enabled},on:{change:function(t){var a=e.form.melee_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"melee_enabled",a.concat([null])):r>-1&&e.$set(e.form,"melee_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"melee_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_melee_enabled"}},[e._v("Melee Attack")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Use the weapon to attack mobs")]),e._v(" "),e.form.melee_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[e.form.melee_enabled?t("section",[t("section",[t("label",[e._v("Damage")]),e._v(" "),t("hud-slider",{attrs:{slider_tex:"health",getLabel:e.getMeleeDamageLabel},model:{value:e.form.melee_damage,callback:function(t){e.$set(e.form,"melee_damage",t)},expression:"form.melee_damage"}})],1)]):e._e()]):e._e()]),e._v(" "),t("li",{class:{expanded:e.form.digger_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.digger_enabled,expression:"form.digger_enabled"}],attrs:{type:"checkbox",id:"item_wizard_digger_enabled"},domProps:{checked:Array.isArray(e.form.digger_enabled)?e._i(e.form.digger_enabled,null)>-1:e.form.digger_enabled},on:{change:function(t){var a=e.form.digger_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"digger_enabled",a.concat([null])):r>-1&&e.$set(e.form,"digger_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"digger_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_digger_enabled"}},[e._v("Break Blocks")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Use the item to break specific blocks")]),e._v(" "),e.form.digger_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("ul",{attrs:{id:"item_wizard_digger_blocks"},on:{focusout:function(t){return e.clearUnsetDiggerBlocks()}}},e._l(e.form.digger_blocks,(function(a){return t("li",{key:a.uuid},[t("select-input",{attrs:{options:e.digger_block_options},model:{value:a.type,callback:function(t){e.$set(a,"type",t)},expression:"block.type"}}),e._v(" "),"custom"==a.type?t("input",{directives:[{name:"model",rawName:"v-model",value:a.id,expression:"block.id"}],staticClass:"dark_bordered",attrs:{placeholder:"gravel"},domProps:{value:a.id},on:{input:function(t){t.target.composing||e.$set(a,"id",t.target.value)}}}):e._e(),e._v(" "),t("label",[e._v("Speed:")]),e._v(" "),t("numeric-input",{attrs:{min:0,max:50,step:1},model:{value:a.speed,callback:function(t){e.$set(a,"speed",e._n(t))},expression:"block.speed"}}),e._v(" "),t("div",{staticClass:"break_block_animation",style:{animation:`break_block_animation ${Math.max(4/a.speed,.25)}s steps(1) infinite`,backgroundImage:a.speed?void 0:"none"}}),e._v(" "),t("div",{staticClass:"tool",attrs:{title:"Remove"},on:{click:function(t){return e.form.digger_blocks.remove(a)}}},[t("i",{staticClass:"material-icons"},[e._v("clear")])])],1)})),0),e._v(" "),t("button",{on:{click:function(t){e.clearUnsetDiggerBlocks(),e.addDiggerBlock()}}},[e._v("Add Block")]),e._v(" "),e.form.digger_blocks.length?t("p",{staticClass:"description"},[e._v("Speed previews are an approximation. Exact breaking speed will depend on the type of block.")]):e._e()]):e._e()]),e._v(" "),e.form.food_enabled||e.form.place_entity_enabled?e._e():t("li",{class:{expanded:e.form.wearable_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.wearable_enabled,expression:"form.wearable_enabled"}],attrs:{type:"checkbox",id:"item_wizard_wearable_enabled"},domProps:{checked:Array.isArray(e.form.wearable_enabled)?e._i(e.form.wearable_enabled,null)>-1:e.form.wearable_enabled},on:{change:function(t){var a=e.form.wearable_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"wearable_enabled",a.concat([null])):r>-1&&e.$set(e.form,"wearable_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"wearable_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_wearable_enabled"}},[e._v("Wearable")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Wear the item as armor or another wearable")]),e._v(" "),e.form.wearable_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("section",[t("label",[e._v("Slot")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select where the item can be equipped")]),e._v(" "),t("select-input",{attrs:{options:e.wearable_options},model:{value:e.form.wearable_slot,callback:function(t){e.$set(e.form,"wearable_slot",t)},expression:"form.wearable_slot"}})],1),e._v(" "),t("section",[t("label",[e._v("Protection")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Set how much protection the item provides")]),e._v(" "),t("hud-slider",{attrs:{slider_tex:"armor"},model:{value:e.form.wearable_protection,callback:function(t){e.$set(e.form,"wearable_protection",t)},expression:"form.wearable_protection"}})],1),e._v(" "),e.form.stack_size>1?t("p",{staticClass:"error_message"},[e._v("Wearable items cannot be stacked. This item will be exported as not stackable even though you entered "+e._s(e.form.stack_size)+" as Stack Size on the previous screen.")]):e._e()]):e._e()]),e._v(" "),e.form.wearable_enabled||e.form.digger_enabled||e.form.melee_enabled?t("li",{class:{expanded:e.form.durability_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.durability_enabled,expression:"form.durability_enabled"}],attrs:{type:"checkbox",id:"item_wizard_durability_enabled"},domProps:{checked:Array.isArray(e.form.durability_enabled)?e._i(e.form.durability_enabled,null)>-1:e.form.durability_enabled},on:{change:function(t){var a=e.form.durability_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"durability_enabled",a.concat([null])):r>-1&&e.$set(e.form,"durability_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"durability_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_durability_enabled"}},[e._v("Durability")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Item loses some durability every time it is used, until it breaks")]),e._v(" "),e.form.durability_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("section",[e._m(2),e._v(" "),t("div",{staticClass:"bar flex"},[t("input",{directives:[{name:"model",rawName:"v-model.number",value:e.form.durability_max,expression:"form.durability_max",modifiers:{number:!0}}],staticStyle:{"max-width":"54px"},attrs:{type:"number",min:"0",max:"2100",step:"1"},domProps:{value:e.form.durability_max},on:{input:function(t){t.target.composing||e.$set(e.form,"durability_max",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.durability_max,expression:"form.durability_max"}],attrs:{type:"range",min:"0",max:"2100",step:"1"},domProps:{value:e.form.durability_max},on:{__r:function(t){return e.$set(e.form,"durability_max",t.target.value)}}})]),e._v(" "),e._m(3)]),e._v(" "),t("section",[t("label",[e._v("Repair Item")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select a material that can be used to repair your item")]),e._v(" "),t("suggestion-id-list",{attrs:{placeholder:"diamond",data_type:"item"},model:{value:e.form.repair_items,callback:function(t){e.$set(e.form,"repair_items",t)},expression:"form.repair_items"}}),e._v(" "),e._m(4),e._v(" "),t("div",{staticClass:"bar flex"},[t("input",{directives:[{name:"model",rawName:"v-model.number",value:e.form.repair_amount,expression:"form.repair_amount",modifiers:{number:!0}}],staticStyle:{"max-width":"54px"},attrs:{type:"number",min:"0",max:"100",step:"1"},domProps:{value:e.form.repair_amount},on:{input:function(t){t.target.composing||e.$set(e.form,"repair_amount",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.repair_amount,expression:"form.repair_amount"}],attrs:{type:"range",min:"0",max:"100",step:"1"},domProps:{value:e.form.repair_amount},on:{__r:function(t){return e.$set(e.form,"repair_amount",t.target.value)}}})])],1)]):e._e()]):e._e(),e._v(" "),e.form.melee_enabled||e.form.digger_enabled||e.form.wearable_enabled?t("li",{class:{expanded:e.form.enchantable_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.enchantable_enabled,expression:"form.enchantable_enabled"}],attrs:{type:"checkbox",id:"item_wizard_enchantable_enabled"},domProps:{checked:Array.isArray(e.form.enchantable_enabled)?e._i(e.form.enchantable_enabled,null)>-1:e.form.enchantable_enabled},on:{change:function(t){var a=e.form.enchantable_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"enchantable_enabled",a.concat([null])):r>-1&&e.$set(e.form,"enchantable_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"enchantable_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_enchantable_enabled"}},[e._v("Enchantable")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Allow players to enchant the item in an enchanting table")]),e._v(" "),e.form.enchantable_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("section",[t("label",[e._v("Slot")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select which types of enchantment to allow on the item")]),e._v(" "),t("select-input",{attrs:{options:e.enchantable_slot_options},model:{value:e.form.enchantable_slot,callback:function(t){e.$set(e.form,"enchantable_slot",t)},expression:"form.enchantable_slot"}})],1),e._v(" "),t("section",[e._m(5),e._v(" "),t("div",{staticClass:"bar flex"},[t("input",{directives:[{name:"model",rawName:"v-model.number",value:e.form.enchantable_value,expression:"form.enchantable_value",modifiers:{number:!0}}],staticStyle:{"max-width":"54px"},attrs:{type:"number",min:"0",max:"50",step:"1"},domProps:{value:e.form.enchantable_value},on:{input:function(t){t.target.composing||e.$set(e.form,"enchantable_value",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.enchantable_value,expression:"form.enchantable_value"}],attrs:{type:"range",min:"0",max:"50",step:"1"},domProps:{value:e.form.enchantable_value},on:{__r:function(t){return e.$set(e.form,"enchantable_value",t.target.value)}}})])])]):e._e()]):e._e(),e._v(" "),e.form.wearable_enabled||e.form.place_entity_enabled?e._e():t("li",{class:{expanded:e.form.food_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.food_enabled,expression:"form.food_enabled"}],attrs:{type:"checkbox",id:"item_wizard_food_enabled"},domProps:{checked:Array.isArray(e.form.food_enabled)?e._i(e.form.food_enabled,null)>-1:e.form.food_enabled},on:{change:function(t){var a=e.form.food_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"food_enabled",a.concat([null])):r>-1&&e.$set(e.form,"food_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"food_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_food_enabled"}},[e._v("Food")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Allow players to eat the item")]),e._v(" "),e.form.food_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("section",[t("label",[e._v("Food Type")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select a type of food to determine the sound and animation")]),e._v(" "),t("select-input",{attrs:{options:e.food_animation_options},model:{value:e.form.food_animation,callback:function(t){e.$set(e.form,"food_animation",t)},expression:"form.food_animation"}})],1),e._v(" "),t("section",{staticClass:"divided_section"},[t("numeric-input",{attrs:{min:.1,max:1.6,step:.1},model:{value:e.form.food_duration,callback:function(t){e.$set(e.form,"food_duration",e._n(t))},expression:"form.food_duration"}}),e._v(" "),e._m(6)],1),e._v(" "),t("section",[t("label",[e._v("Nutrition")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select how much eating the item can fill up the hunger bar")]),e._v(" "),t("hud-slider",{attrs:{slider_tex:"hunger"},model:{value:e.form.food_nutrition,callback:function(t){e.$set(e.form,"food_nutrition",t)},expression:"form.food_nutrition"}})],1),e._v(" "),t("section",{staticClass:"divided_section"},[t("numeric-input",{attrs:{min:0,max:5,step:.1},model:{value:e.form.food_saturation_modifier,callback:function(t){e.$set(e.form,"food_saturation_modifier",e._n(t))},expression:"form.food_saturation_modifier"}}),e._v(" "),e._m(7)],1),e._v(" "),t("section",{staticClass:"divided_section"},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.food_always_eat,expression:"form.food_always_eat"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.food_always_eat)?e._i(e.form.food_always_eat,null)>-1:e.form.food_always_eat},on:{change:function(t){var a=e.form.food_always_eat,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"food_always_eat",a.concat([null])):r>-1&&e.$set(e.form,"food_always_eat",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"food_always_eat",o)}}}),e._v(" "),e._m(8)])]):e._e()]),e._v(" "),t("li",{class:{expanded:e.form.fuel_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.fuel_enabled,expression:"form.fuel_enabled"}],attrs:{id:"item_wizard_fuel_enabled",type:"checkbox"},domProps:{checked:Array.isArray(e.form.fuel_enabled)?e._i(e.form.fuel_enabled,null)>-1:e.form.fuel_enabled},on:{change:function(t){var a=e.form.fuel_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"fuel_enabled",a.concat([null])):r>-1&&e.$set(e.form,"fuel_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"fuel_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_fuel_enabled"}},[e._v("Furnace Fuel")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Allow the item to be used as fuel in a furnace")]),e._v(" "),e.form.fuel_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("section",[e._m(9),e._v(" "),t("div",{staticClass:"bar flex"},[t("input",{directives:[{name:"model",rawName:"v-model.number",value:e.form.fuel_duration,expression:"form.fuel_duration",modifiers:{number:!0}}],staticStyle:{"max-width":"50px"},attrs:{type:"number",min:"0",max:"80",step:"0.5"},domProps:{value:e.form.fuel_duration},on:{input:function(t){t.target.composing||e.$set(e.form,"fuel_duration",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.fuel_duration,expression:"form.fuel_duration"}],attrs:{type:"range",min:"0",max:"80",step:"0.5"},domProps:{value:e.form.fuel_duration},on:{__r:function(t){return e.$set(e.form,"fuel_duration",t.target.value)}}})]),e._v(" "),e._m(10)])]):e._e()]),e._v(" "),e.form.food_enabled||e.form.wearable_enabled?e._e():t("li",{class:{expanded:e.form.place_entity_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.place_entity_enabled,expression:"form.place_entity_enabled"}],attrs:{id:"item_wizard_place_entity_enabled",type:"checkbox"},domProps:{checked:Array.isArray(e.form.place_entity_enabled)?e._i(e.form.place_entity_enabled,null)>-1:e.form.place_entity_enabled},on:{change:function(t){var a=e.form.place_entity_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"place_entity_enabled",a.concat([null])):r>-1&&e.$set(e.form,"place_entity_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"place_entity_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_place_entity_enabled"}},[e._v("Place Entity")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Place an entity on the ground when using the item")]),e._v(" "),e.form.place_entity_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("section",[t("label",{staticClass:"required"},[e._v("Entity ID")]),e._v(" "),t("p",{staticClass:"description"}),e._v(" "),t("suggestion-id-list",{attrs:{placeholder:"zombie",data_type:"entity",multiple:!1},model:{value:e.form.place_entity_id,callback:function(t){e.$set(e.form,"place_entity_id",t)},expression:"form.place_entity_id"}})],1)]):e._e()]),e._v(" "),e.form.food_enabled?t("li",{class:{expanded:e.form.cooldown_enabled}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.cooldown_enabled,expression:"form.cooldown_enabled"}],attrs:{type:"checkbox",id:"item_wizard_cooldown_enabled"},domProps:{checked:Array.isArray(e.form.cooldown_enabled)?e._i(e.form.cooldown_enabled,null)>-1:e.form.cooldown_enabled},on:{change:function(t){var a=e.form.cooldown_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"cooldown_enabled",a.concat([null])):r>-1&&e.$set(e.form,"cooldown_enabled",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"cooldown_enabled",o)}}}),e._v(" "),t("label",{attrs:{for:"item_wizard_cooldown_enabled"}},[e._v("Cooldown")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Enable a cooldown after using the item")]),e._v(" "),e.form.cooldown_enabled?t("div",{staticClass:"item_wizard_functionality_options"},[t("section",{staticClass:"divided_section"},[t("numeric-input",{attrs:{min:0,max:60,step:.1},model:{value:e.form.cooldown_duration,callback:function(t){e.$set(e.form,"cooldown_duration",e._n(t))},expression:"form.cooldown_duration"}}),e._v(" "),e._m(11)],1),e._v(" "),t("section",[t("label",{staticClass:"required"},[e._v("Category")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Assign the cooldown to a category. You can enter your own category name, and if you have multiple items with the same category they will share the same cooldown.")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.cooldown_category,expression:"form.cooldown_category"}],attrs:{type:"text",placeholder:""},domProps:{value:e.form.cooldown_category},on:{input:function(t){t.target.composing||e.$set(e.form,"cooldown_category",t.target.value)}}})])]):e._e()]):e._e()])]):e._e(),e._v(" "),"design"==e.open_page?t("content",[t("section",[t("label",[e._v("Handheld Item Model")]),e._v(" "),e.form.wearable_enabled?t("p",{staticClass:"description"},[e._v("Not available for wearable items. Wearable items always use a 3D model when equipped, and a flat icon in hand.")]):[t("p",{staticClass:"description"},[e._v("Do you want to create a handheld model for your item, or just use the 2D icon? In the inventory and on the ground it will use the icon either way.")]),e._v(" "),t("div",{staticClass:"item_wizard_model_option",class:{selected:!e.form.attachable_model},attrs:{background:"third_person_model"},on:{click:function(t){e.form.attachable_model=!1}}},[e._v("\n\t\t\t\t\tIcon\n\t\t\t\t")]),e._v(" "),t("div",{staticClass:"item_wizard_model_option",class:{selected:e.form.attachable_model},attrs:{background:"third_person_sprite"},on:{click:function(t){e.form.attachable_model=!0}}},[e._v("\n\t\t\t\t\tIcon + 3D Model\n\t\t\t\t")])]],2),e._v(" "),e.form.attachable_model&&!e.form.wearable_enabled&&e.current_tab_model?t("section",{staticClass:"divided_section"},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.use_current_model,expression:"form.use_current_model"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.form.use_current_model)?e._i(e.form.use_current_model,null)>-1:e.form.use_current_model},on:{change:function(t){var a=e.form.use_current_model,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"use_current_model",a.concat([null])):r>-1&&e.$set(e.form,"use_current_model",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"use_current_model",o)}}}),e._v(" "),t("div",[t("label",[e._v('Use current model "'+e._s(e.current_tab_model)+'"')])])]):e._e(),e._v(" "),t("section",{staticClass:"divided_section"},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.glint,expression:"form.glint"}],attrs:{type:"checkbox",id:"item_wizard_glint_input"},domProps:{checked:Array.isArray(e.form.glint)?e._i(e.form.glint,null)>-1:e.form.glint},on:{change:function(t){var a=e.form.glint,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,"glint",a.concat([null])):r>-1&&e.$set(e.form,"glint",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,"glint",o)}}}),e._v(" "),e._m(12)])]):e._e(),e._v(" "),"export"==e.open_page?t("content",{attrs:{id:"item_wizard_export_page"}},[t("export",{attrs:{form:e.form}})],1):e._e(),e._v(" "),"next_steps"==e.open_page?t("content",[t("section",[t("label",[e._v("The add-on has now been exported to your selected destination. Enable the packs to test them.")]),e._v(" "),t("button",{staticStyle:{"margin-top":"8px","margin-bottom":"24px",display:"block"},on:{click:function(t){return e.openInstallInstructions(e.form.export_mode)}}},[t("i",{staticClass:"material-icons icon"},[e._v("help")]),e._v("How do I install packs?")]),e._v(" "),"none"==e.form.spawn_egg_mode?t("p",[e._v("Now you can give yourself the item using the command "),t("code",{staticClass:"code",on:{click:function(t){return e.copyGiveCommand()}}},[e._v("/give @s "+e._s(e.form.identifier))])]):t("p",[e._v("Now you can find the item in the creative inventory!")])]),e._v(" "),t("section",[t("label",[e._v("Let's now edit the item icon"+e._s(e.form.attachable_model?" and model":"")+"!")]),e._v(" "),t("p",{staticClass:"description"},[e._v("After you close this dialog, you will be able to edit the icon texture"+e._s(e.form.attachable_model?" and model":"")+" in Blockbench")]),e._v(" "),"mcaddon"!=e.form.export_mode&&"integrate_mcaddon"!=e.form.export_mode?t("button",{attrs:{id:"item_wizard_launch_vscode"},on:{click:function(t){return e.VSCode.open(e.behavior_pack_path,e.resource_pack_path)}}},[t("img",{attrs:{src:e.VSCode.icon,width:"22px"}}),e._v("\n\t\t\t\tOpen in VS Code\n\t\t\t")]):t("label",[t("i",{staticClass:"material-icons",staticStyle:{"vertical-align":"sub",margin:"4px"}},[e._v("info")]),e._v("You can always re-export the MCAddon via "),t("b",[e._v("File")]),e._v(" > "),t("b",[e._v("Export")]),e._v(" > "),t("b",[e._v("Export MCAddon")]),e._v(".")])]),e._v(" "),e._m(13)]):e._e()])};e._withStripped=!0;const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhElEQVQ4y9WSwQnAIBAEbcpefFmEJViNJdmNYQ82OeVUzCdkYfEgzhhinPtNYowNfQWhpRRpSqkdQbXWrqZkBy0lgJAdxDKYRcJTVxIdgmC8949glIxQzllAFLMpoMSCWL33FtDID7gC8QygwPoWKLFeV0MdOF4lJVhDCHto9hMdQZ/nAqzufev6TWmcAAAAAElFTkSuQmCC",n=JSON.parse('{"a":[{"description":{"identifier":"geometry.unknown","texture_width":16,"texture_height":16},"bones":[{"name":"root_item","pivot":[0,0,0],"binding":"q.item_slot_to_bone_name(c.item_slot)","cubes":[{"origin":[-2.5,0,-1.5],"size":[5,11,3],"uv":[0,0]}]}]}]}'),o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAq0lEQVQ4y2NgoAco1WD6T7bmOnO+/yEqnP/pa/scAfH/IAzSDLIdRBNlEEjTFmG5//+nzQXTIM0gsbviqmA+XoPgmmW0//+PywQbAscgPlAcryEoBmDBIFcgG4LTAJhCZBqGYfwQTr7/WEMbZADMEJi/YXyY64gyABkjGwTzAlYDsLkCm0E4NcMMgIUFNu+A5PAaAAIgBTBDYAmKaM3IhsDiG5wagXyiNZMKANOS2s9rfvFXAAAAAElFTkSuQmCC",r=JSON.parse('{"a":[{"description":{"identifier":"geometry.apple","texture_width":32,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root_item","pivot":[0,0,0],"binding":"q.item_slot_to_bone_name(c.item_slot)","cubes":[{"origin":[-2.5,0,-2.5],"size":[5,5,5],"uv":[0,0]},{"origin":[-2.5,5,0],"size":[5,3,0],"pivot":[0,0,0],"rotation":[0,45,0],"uv":[0,10]}]}]}]}'),i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAi0lEQVQ4y2NgIAO4uLj8h2GyNMOAhITEf7I079u3j3QDqKb5xo0bNNKMLVRBfJAmomwGKc7OzoYbQpJmZEOmTZsGVgzSBGKT5GeYASAMcg3JAYbuFZI1e5qJ/s/wkwNrhAUq0YaANHemq//XkOMGawBphBlEMPRBGGQzTDMygBlE0M8k+xfdBnINAAA+k7meeyM0+AAAAABJRU5ErkJggg==",l=JSON.parse('{"a":[{"description":{"identifier":"geometry.unknown","texture_width":32,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root_item","pivot":[0,0,0],"binding":"q.item_slot_to_bone_name(c.item_slot)","cubes":[{"origin":[-1,-1,-1],"size":[2,4,2],"uv":[0,18]},{"origin":[-1,3,-4],"size":[2,1,8],"uv":[0,8]},{"origin":[0,4,-2],"size":[0,16,4],"uv":[0,-4]}]}]}]}'),s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACCSURBVDjLY2AYtMDFxeU/OiZJMwjcuHHj/8GDB8EYxAaJe5qJ/s/wk/tPlCESEhJwDDOoM139v4Yc93+SvQSyGeYikIEkawY5G2QzzDtEGwLSjOxsmHeIMgDZZpgY0Qag24xsAEEvYLMZ2QAQwGkALpvRDSHZZpJDm2QA0ki2ZkoAAHM7haFaNxXaAAAAAElFTkSuQmCC",d=JSON.parse('{"a":[{"description":{"identifier":"geometry.unknown","texture_width":32,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root_item","pivot":[0,0,0],"binding":"q.item_slot_to_bone_name(c.item_slot)","cubes":[{"origin":[-1,-1,-1],"size":[2,20,2],"uv":[0,6]},{"origin":[0,13,-8],"size":[0,5,16],"uv":[0,-16]}]}]}]}'),c="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZElEQVQ4y+2Q0QnAMAhEXcMhnMx9HMkZso3lPg7aNBBp/0oPjkDwPUlEvhkzq1XbcERUZl7q7qWq1YLHGIXgpAD3WwkEGAY4w2xLgJ7fDgjb2wJCc18LWn/ALY8ElKyGKJE/txyvKqD/7THp6gAAAABJRU5ErkJggg==",p=JSON.parse('{"a":[{"description":{"identifier":"geometry.unknown","texture_width":32,"texture_height":32,"visible_bounds_width":2,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"root_item","pivot":[0,0,0]},{"name":"helmet","parent":"root_item","pivot":[0,0,0],"binding":"\'head\'","cubes":[{"origin":[-4,0,-4],"size":[8,8,8],"inflate":1,"uv":[0,0]}]}]}]}'),u="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACOSURBVDhPzZHRCcAgEENdwyGczH0cyRncxvI+Imq9coV+NBBQ7yWIhvALpZT67lcMG9Ra67VWs8Bk2GiASykLwJqzmbkVaIABVaLwPD8W5JwHqKvKcxAGdimIMXbMwArKMOJHwVz0FMbHoMQQyCrg+q4Cy66C04sr7CrQb5ysB9xzi6wSV1jSN+3euU90AR6gYrV/vkWqAAAAAElFTkSuQmCC",m=JSON.parse('{"a":[{"description":{"identifier":"geometry.unknown","texture_width":32,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"body","pivot":[0,14,0]},{"name":"chestplate","parent":"body","pivot":[0,0,0],"binding":"\'body\'","cubes":[{"origin":[-4,2,-2],"size":[8,12,4],"inflate":1.01,"uv":[0,0]}]},{"name":"arm_right","pivot":[-5,12,0]},{"name":"arm_plate_right","parent":"arm_right","pivot":[-5,12,0],"binding":"\'rightarm\'","cubes":[{"origin":[-8,2,-2],"size":[4,12,4],"inflate":1,"uv":[0,16]}]},{"name":"arm_left","pivot":[5,12,0]},{"name":"arm_plate_left","parent":"arm_left","pivot":[5,12,0],"binding":"\'leftarm\'","cubes":[{"origin":[4,2,-2],"size":[4,12,4],"inflate":1,"uv":[0,16],"mirror":true}]}]}]}'),g="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABzSURBVDjLzZKBCQAhCEVboyGcrH0cqRncxsODDxJ6dgcHCR/k83uV1dpxRUSaqfeu5WIRUZT1pjnnrTHGMwQAv8iLmfcACEOfARY22dG3AdjNB61/BViDmf8PAINbrxD5KWB9bwDKf4CJR4DIDwFelX9GXVFQ5+tlirbMAAAAAElFTkSuQmCC",b=JSON.parse('{"a":[{"description":{"identifier":"geometry.unknown","texture_width":32,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":3.5,"visible_bounds_offset":[0,1.25,0]},"bones":[{"name":"body","pivot":[0,24,0]},{"name":"belt","parent":"body","pivot":[0,12,0],"binding":"\'belt\'","cubes":[{"origin":[-4,12,-2],"size":[8,12,4],"inflate":0.51,"uv":[0,0]}]},{"name":"leg_right","pivot":[-1.9,12,0]},{"name":"leggings_right","parent":"leg_right","pivot":[-1.9,12,0],"binding":"\'rightleg\'","cubes":[{"origin":[-3.9,0,-2],"size":[4,12,4],"inflate":0.5,"uv":[0,16]}]},{"name":"leg_left","pivot":[1.9,12,0]},{"name":"leggings_left","parent":"leg_left","pivot":[1.9,12,0],"binding":"\'leftleg\'","cubes":[{"origin":[-0.1,0,-2],"size":[4,12,4],"inflate":0.5,"uv":[0,16],"mirror":true}]}]}]}'),h="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABuSURBVDjL3ZDBDcAgCEVdgyGYjH0YiRnchuYfSKhFq8f2Jx78Pp4Jrf0vzOxxVt10GOm9OxH5W18KAFUCdGa2JxhB9Oi2BBV4LFDVc0GGKgG66q0cFpGHAN1UEj/k4QzEfWRugoBWS8rMcpnfygVA+r/XisE2BgAAAABJRU5ErkJggg==",f=JSON.parse('{"a":[{"description":{"identifier":"geometry.unknown","texture_width":32,"texture_height":32,"visible_bounds_width":3,"visible_bounds_height":2.5,"visible_bounds_offset":[0,0.75,0]},"bones":[{"name":"leg_right","pivot":[-1.9,12,0]},{"name":"boot_right","parent":"leg_right","pivot":[-1.9,12,0],"binding":"\'rightleg\'","cubes":[{"origin":[-3.9,0,-2],"size":[4,12,4],"inflate":1,"uv":[0,0]}]},{"name":"leg_left","pivot":[1.9,12,0],"rotation":[-0.1,0,0]},{"name":"boot_left","parent":"leg_left","pivot":[1.9,12,0],"binding":"\'leftleg\'","cubes":[{"origin":[-0.1,0,-2],"size":[4,12,4],"inflate":1,"uv":[0,0],"mirror":true}]}]}]}');let v={first_person_hold:{loop:!0,bones:{root_item:{rotation:[90,56,-32],position:[9,18,5]}}},third_person_hold:{loop:!0,bones:{root_item:{rotation:[25,0,0],position:[.5,19,-2.5],scale:.85}}}};const _={};_.iron_ingot={name:"Iron Ingot",category:"items",item_group:"none",thumbnail:t,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWklEQVQ4jWNkQAI3btz4z4AGVq1ahS7EUFdXxwhjM2HIkggoNoBx/vz5cGdbWlpiKDh+/DgDPvmB98IwMIDl8ePHcA62UCZoACEFhCxgwaWYkGEwMPCBOPAAAJiRGaIDkbcPAAAAAElFTkSuQmCC",icon:t,model:n.a[0],animations:v,stack_size:64,enchantable_enabled:!0,durability_enabled:!1,durability_max:0},_.apple={name:"Apple",category:"nature",item_group:"itemGroup.name.crop",thumbnail:o,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA3ElEQVRYhWNkwALuiqv+Z2BgYBC30oOLvTx2CUOd8svbjNj0kwKYsAnCLH557BLDy2OXGLhdvSi1hzQHwMD1Pz9pZjFRDtBkYUeJBloAFmyCL49dYlCqr4Dzv+7eRjMHMH4JDP6PbDEDAwNBX2NTBxMjNWGyIGvGZgkMiFvpEaWOVIA3DdADoKQBWKoXR+MzMDAwMEB9SlCMRMB4V1z1P7oBmizsZBvq8/YRaYWTWo7Sf5tGi/+EVdIGMImJijG8ev0K7piBcsjAWj4KRsEoGAWjYBSMglEwCgYSAABKK1C75y3FWgAAAABJRU5ErkJggg==",icon:o,model:r.a[0],animations:v,stack_size:64,enchantable_enabled:!0,durability_enabled:!1,durability_max:0,food_enabled:!0,food_nutrition:4,food_saturation_modifier:.6,food_duration:1.6,food_animation:"eat"},_.sword={name:"Sword",category:"equipment",thumbnail:i,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAoklEQVRYhWNgYGBg+Pjx4/+rV6/+ZxgAwDQQlqI44OPHj3Cfb966je6hwMTAwMDw5MkTetuL6oCBBKMOGHAHsBBSEBIdg5Iz1ixdwkhNBwx4CIw6YNQBLE+ePGG49+DhgDlgwEOAET2fUwqoXU7QHMBdOyfTFCUkUqafpotPBj4NtARo4U0DNRuu0TQkWCQkuWlpPkEw4FEw4A4YBaNgFIwCAKyCJqI/12atAAAAAElFTkSuQmCC",icon:i,model:l.a[0],animations:{first_person_hold:{loop:!0,bones:{root_item:{rotation:[66,60,-60],position:[3,23,4]}}},third_person_hold:{loop:!0,bones:{root_item:{rotation:[90,0,0],position:[.5,22.5,-.5]}}}},category:"equipment",item_group:"itemGroup.name.sword",stack_size:1,melee_enabled:!0,melee_damage:7,enchantable_enabled:!0,enchantable_slot:"sword",enchantable_value:14,durability_enabled:!0,durability_max:251,repair_items:"iron_ingot",repair_amount:25},_.pickaxe={name:"Pickaxe",category:"equipment",item_group:"itemGroup.name.pickaxe",thumbnail:s,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAtElEQVRYhWNkoCL4+PHjf2LU8fPzM8LYLNS0+MmTJySp5+fnZ2QkpJgYw5AtvvfgIV71SgrycLaMjAx1QgBmsa+3F1Ee2rx1238lBXmiQwwvuHr1KlHxTm29VAPwIGsJ0EJxTc2GaxSnD2IAEz0swQcY0X2ODmgdEoyECg/kQoMWgIUqWYESBxAqOGjugJdb6gfUAQOeC0YdMOqAUQeMOmDUAaMOGHAHsLx4/nWg3TAKRjgAAJW4P1/jZu7xAAAAAElFTkSuQmCC",icon:s,model:d.a[0],animations:{first_person_hold:{loop:!0,bones:{root_item:{rotation:[66,60,-60],position:[3,23,4]}}},third_person_hold:{loop:!0,bones:{root_item:{rotation:[90,0,0],position:[.5,22.5,-.5]}}}},stack_size:1,melee_enabled:!0,melee_damage:3,digger_enabled:!0,digger_blocks:[{type:"stone",id:"",speed:7},{type:"metal",id:"",speed:7}],enchantable_enabled:!0,enchantable_slot:"pickaxe",enchantable_value:14,durability_enabled:!0,durability_max:251,repair_items:"iron_ingot",repair_amount:25},_.helmet={name:"Helmet",thumbnail:c,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABqUlEQVRYhe2Vv4qDQBCHvxxbCCuk0Mp0yXMkRSrzxJaCvkHKQEoFQYuFDCgEvOLYPfX+CV46v8odZ3Zmd+e3u+EPsizrRQQArbWzW9vlctn8NcdvqDlOcRwDUJYlAI/HA4Cqqpbknl8AQJqmBEHgxp7nLU4+qwARoSxLgiCgaRpnHxbz0gKm7HY7922PZAlvc5zsmQ/xfX/UlC8rwCbxPM9tu+/7wKcSljDrCKqqYijF/+h+yybLsh5gqnUR+XaLf7oThnHT/9P4oa8COB6PlGU5Ouu2bTHGICLEccztdqNtW7bbLQBN09B1HVproigaydL3faIoIs9z7Pzw0bR1XTvfqqpQVmZ1XTuZBUFAGIauy/M8R0TY7/cUReESd12HiHA4HL7ET1d7vV5d4fCpJgWMgpVSGGNccq01p9NpA9D3fV8Uhbt+kyTp7eRaa5RSPJ/P0X1hFzi02R0WEZTWGmMMXdcBcD6ff7zb0zQdjb97B2xRxhi01ogIdV2PdgYgDEOMMSx6SOZgHzPbJ1bC9/sdEXl9AZYkSfph9y99RVdWVlZWVlZW/o1359T3PpGTRGcAAAAASUVORK5CYII=",icon:c,model:p.a[0],category:"equipment",item_group:"itemGroup.name.helmet",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:"slot.armor.head",wearable_protection:2,enchantable_enabled:!0,enchantable_slot:"armor_head",enchantable_value:9,durability_enabled:!0,durability_max:165,repair_items:"iron_ingot",repair_amount:25},_.chestplate={name:"Chestplate",thumbnail:u,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB8ElEQVRYhe2VsY7qMBBFDygSkZLOBRLpkp4/MDV8sXt/Qjr4ACQkp0CKJVNlC974mSxseGK3WD1uQyZzmZlrT2bgjf8dM2vtAOC9B6AoCgA2m80sJQpP8C/8sS/FHEBrTV3XMVjTNDcBjDHDcrmMf7rHN8YM1trBWjsYYwatdSzyK2Tee47HIyGEqGy1WsXEANvtlsPhEP0pH4j8vu8BKMuStm0nkwNkRVHgnIvBRVXf99R1TVmWN8nHfIEkB3DO0XUdRVFMnkIGkOc58Pc+U4Xym+d59H/FB+i6jqqqOJ1O0yfgvSeEQNd1ZFmG956+72OSMcZ8UZ/yq6qKz7vd7mED3pyAUorz+RwdqaJU9ZgvBaXqAZRSzzVhURRR0eVyQew0aQiBEELsgZQ/Lk4pFd/JFU2ewPl8jslFhVLqkzLxj/nCE/VpIVO4ez/GmGGxWMQgovbRfd4bZt77yft/WIAUkdrPBPuV+KQqHcHPHuMrmN97qbWmaZqnuvjbC5BZv9/vfzw5/PkMx5BFIt/5T2JmrR3SJTTe8/fs9PnVHpnDdd02TRMTrddrtNbRFr8klx75DmRw3WbOuZhA7l/s8W5v2/ZmMr6Cufc+7neZYEopnHPRlhGb7vdnl80U4i5Ig6VbEa7NmL4b8994441fjQ97WHQdH4ICkQAAAABJRU5ErkJggg==",icon:u,model:m.a[0],category:"equipment",item_group:"itemGroup.name.chestplate",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:"slot.armor.chest",wearable_protection:6,enchantable_enabled:!0,enchantable_slot:"armor_torso",enchantable_value:9,durability_enabled:!0,durability_max:240,repair_items:"iron_ingot",repair_amount:25},_.leggings={name:"Leggings",thumbnail:g,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABg0lEQVRYhe2VsY6DMAyG/0MMkTxkz5j3oHtfu4/RIaMlJJZKWMp2N9lnOKDoqNqFbykmrv07OA5wcnJycvJhvm632zcAiAgAgIiwZhPR5Nevz32U6/X6tSWgBYCu63C/39H3PdQGAGbGOI7m3Pc9iMj8SykT//l/NN6mABGxYKqemTEMgwUEgJSSVbjXfw8tEaGUgpQSmBlEhHEcLZAPpgnV//F4AACGYVj0959icwe8chFBrdUSaIVz5u+W/H1/rPGnQXxTEhEul8tmEx2lWXrZdR1yzru28OUCfFO+g8UdeFdywA0iYH34rK0BzwfNMxoNFmO0BDFGswEgxoiUkiX3a0dpfKNpghACQgh27tUWEbO9oCO0WrGic0CfichsP+dDCDaIjtBoMK1Qq9KpqIQQTESt1UQdFqCj1QdkZuScAfw22/xkLE3Hfwkgosk9ICLIOaOUMtkRP5iY2S6nwwL0wV84Wq2/7WqtJmbvTbeHFph+b1+1RxtOTwIRveQUnHycH2QAMyShVMeWAAAAAElFTkSuQmCC",icon:g,model:b.a[0],category:"equipment",item_group:"itemGroup.name.leggings",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:"slot.armor.legs",wearable_protection:5,enchantable_enabled:!0,enchantable_slot:"armor_legs",enchantable_value:9,durability_enabled:!0,durability_max:225,repair_items:"iron_ingot",repair_amount:25},_.boots={name:"Boots",thumbnail:h,texture:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA6ElEQVRYhe2UPQ6DMAyFH6iDJXsLW0YOwAlg5sY5BysSI2PGSN7oUCWiqBKqoFP9TXmOE9v5cYUTpmnaYowAAOccuq6rztZ8Q33mQERwzt0Z87sERAREBO/9TxJ4nDksywIASCmBmX+ShGH8N1UIYQNQvlhKCUd9HO9twzBc6ow1M2McR7RtW4x7zczo+/7jfE72Cg8AmOcZqloCZp0rzTpXv9dXqVNKWNcVRFQqUlXEGEtAVQURlUXZ/w5qZob3HiJSKmqa5q33ExFEBMDrhLL/HVdQhRC2Tw/wuPnRdtcjNAzDMAzDeAJ4RWqZHRgaOQAAAABJRU5ErkJggg==",icon:h,model:f.a[0],category:"equipment",item_group:"itemGroup.name.boots",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:"slot.armor.feet",wearable_protection:2,enchantable_enabled:!0,enchantable_slot:"armor_feet",enchantable_value:9,durability_enabled:!0,durability_max:195,repair_items:"iron_ingot",repair_amount:25};const w=_,A="data:image/png;base64,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";function k(e){let t="",n="";Blockbench.isNewerThan("4.99")?(t=SystemInfo.home_directory,n=SystemInfo.appdata_directory):(t=a(37).homedir(),n=electron.process.env.APPDATA);let o=null;switch(Blockbench.platform){case"win32":let a=x();"edu"==e?(o=PathModule.join(n,"Minecraft Education Edition"),a.existsSync(o)||(o=PathModule.join(n,"../local/","Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState"))):"preview"==e?(o=PathModule.join(n,"Minecraft Bedrock Preview/Users/Shared/"),a.existsSync(o)||(o=PathModule.join(n,"../local/","Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState"))):(o=PathModule.join(n,"Minecraft Bedrock/Users/Shared/"),a.existsSync(o)||(o=PathModule.join(n,"../local/","Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState")));break;case"linux":o=PathModule.join(t,".local/share/mcpelauncher");break;case"darwin":o=PathModule.join(t,"Library/Application Support/mcpelauncher");break;case"android":o=PathModule.join(t,"storage/shared/");break;default:return""}return PathModule.join(o,"games/com.mojang")}let y;function x(){if(isApp)return y||(Blockbench.isNewerThan("4.99")?(y=requireNativeModule("fs",{message:"Enable file system access so that the wizard can export a pack into your Minecraft folder"}),y):isApp?a(147):void 0)}const z={preset:{label:"Preset",icon:"view_list"},metadata:{label:"Naming",icon:"description"},functionality:{label:"Functionality",icon:"build"},design:{label:"Design",icon:"visibility"},export:{label:"Export",icon:"file_download"},next_steps:{label:"Next Steps",icon:"queue_play_next"}};var M=function(){var e=this,t=e._self._c;return t("div",[t("p",{staticClass:"description"},[e._v("Export your item as a behavior and resource pack.")]),e._v(" "),t("section",{attrs:{id:"item_wizard_export_options"}},[e.isApp?t("div",{staticClass:"item_wizard_export_option",class:{selected:"folder"==e.form.export_mode},staticStyle:{"border-color":"#dccb92"},on:{click:function(t){return e.setExportMode("folder")}}},[t("h3",[e._v("Export to Folder")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Export the packs directly into the development pack folders of your Minecraft installation, and get started right away.")])]):e._e(),e._v(" "),e.isApp?t("div",{staticClass:"item_wizard_export_option",class:{selected:"integrate"==e.form.export_mode},staticStyle:{"border-color":"#83c4ea"},on:{click:function(t){return e.setExportMode("integrate")}}},[t("h3",[e._v("Integrate into Pack")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Integrate the item into an existing behavior and resource pack on your computer.")])]):e._e(),e._v(" "),t("div",{staticClass:"item_wizard_export_option",class:{selected:"mcaddon"==e.form.export_mode},staticStyle:{"border-color":"#89ca51"},on:{click:function(t){return e.setExportMode("mcaddon")}}},[t("h3",[e._v("Export as MCAddon")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Generate an MCAddon file that you can install in one click or send to your friends.")])]),e._v(" "),t("div",{staticClass:"item_wizard_export_option",class:{selected:"integrate_mcaddon"==e.form.export_mode},staticStyle:{"border-color":"#d2fc92"},on:{click:function(t){return e.setExportMode("integrate_mcaddon")}}},[t("h3",[e._v("Integrate into MCAddon")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Integrate the item into an existing MCAddon file.")])])]),e._v(" "),"integrate"==e.form.export_mode?[t("section",[t("label",[e._v("Behavior Pack")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select the behavior pack that you want to save the new item into")]),e._v(" "),t("ul",{attrs:{id:"item_wizard_pack_list"}},[e._l(e.existing_packs,(function(a){return t("li",{key:a.name,class:{selected:a==e.form.integrate_pack},on:{click:function(t){e.form.integrate_pack=a}}},[a.has_icon?t("img",{attrs:{src:e.getPackIcon(a),width:"32px"},on:{error:function(e){a.has_icon=!1}}}):t("div"),e._v("\n\t\t\t\t\t"+e._s(a.name)+"\n\t\t\t\t")])})),e._v(" "),t("li",{on:{click:function(t){return e.addPacks()}}},[t("i",{staticClass:"material-icons"},[e._v("add")]),e._v("\n\t\t\t\t\tSelect packs manually...\n\t\t\t\t")])],2)])]:"integrate_mcaddon"==e.form.export_mode?[t("section",[t("label",[e._v("MCAddon File")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select the .mcaddon file to merge the new item into.")]),e._v(" "),t("div",[t("button",{staticStyle:{display:"inline-block"},on:{click:function(t){return e.selectMCAddon()}}},[t("i",{staticClass:"material-icons"},[e._v("add")]),e._v("\n\t\t\t\t\tUpload MCAddon\n\t\t\t\t")]),e._v("\n\t\t\t\t"+e._s(e.mcaddon_file_name)+"\n\t\t\t")])])]:[t("section",[t("label",{staticClass:"required"},[e._v("Pack Name")]),e._v(" "),t("p",{staticClass:"description"},[e._v("The name of the packs you are exporting")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.pack_name,expression:"form.pack_name"}],attrs:{type:"text",placeholder:"Item Pack"},domProps:{value:e.form.pack_name},on:{input:function(t){t.target.composing||e.$set(e.form,"pack_name",t.target.value)}}})]),e._v(" "),t("section",[t("label",[e._v("Pack Author(s)")]),e._v(" "),t("p",{staticClass:"description"},[e._v("You can enter your name as the author of the pack. To enter multiple names, separate them with a comma.")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.form.pack_authors,expression:"form.pack_authors"}],attrs:{type:"text",placeholder:"Benchbot, Benchamin"},domProps:{value:e.form.pack_authors},on:{input:function(t){t.target.composing||e.$set(e.form,"pack_authors",t.target.value)}}})]),e._v(" "),t("section",[t("label",[e._v("Pack Icon")]),e._v(" "),t("p",{staticClass:"description"},[e._v("The pack icon will be visible in the resource and behavior pack menu")]),e._v(" "),t("icon-picker",{model:{value:e.form.pack_icon,callback:function(t){e.$set(e.form,"pack_icon",t)},expression:"form.pack_icon"}})],1)]],2)};M._withStripped=!0;var C=function(){var e=this,t=e._self._c;return t("div",{staticClass:"item_wizard_icon_picker"},[t("div",{staticClass:"icon_picker_left"},[e.value?t("img",{attrs:{src:e.value,width:"64px",height:"64px"}}):e._e()]),e._v(" "),t("div",{staticClass:"icon_picker_right",on:{click:e.pickImage}},[t("i",{staticClass:"material-icons icon"},[e._v("folder")]),e._v(" "),t("label",[e._v(e._s(e.imageName))])])])};function D(e,t,a,n,o,r,i,l){var s,d="function"==typeof e?e.options:e;if(t&&(d.render=t,d.staticRenderFns=a,d._compiled=!0),n&&(d.functional=!0),r&&(d._scopeId="data-v-"+r),i?(s=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(i)},d._ssrRegister=s):o&&(s=l?function(){o.call(this,(d.functional?this.parent:this).$root.$options.shadowRoot)}:o),s)if(d.functional){d._injectStyles=s;var c=d.render;d.render=function(e,t){return s.call(t),c(e,t)}}else{var p=d.beforeCreate;d.beforeCreate=p?[].concat(p,s):[s]}return{exports:e,options:d}}C._withStripped=!0;var S=D({name:"icon-picker",props:{value:String},methods:{pickImage(){Blockbench.import({readtype:"image",type:"Image",extensions:["png"]},(e=>{this.value=e[0].content||e[0].path,this.$emit("input",this.value)}))}},computed:{imageName(){if(!this.value)return"Select Image...";let e=this.value.split(osfs);return e.length>2?e.last():""}}},C,[],!1,(function(e){var t=a(257);t.__inject__&&t.__inject__(e)}),null,"67c6ca01");const P=D({components:{IconPicker:S.exports},name:"export",props:{form:Object,bedrock_installed:Boolean},data:()=>({isApp,existing_packs:[],mcaddon_file_name:""}),methods:{setExportMode(e){if(this.form.export_mode=e,"integrate"==e){let e=function(e,t){if(!isApp)return[];let a,n=[],o=[];try{a=k(e),n=x().readdirSync(PathModule.join(a,"development_resource_packs"),{withFileTypes:!0})}catch(e){return!1}let r={};n.forEach((e=>{if(e.isDirectory())try{let t=PathModule.join(a,"development_resource_packs",e.name),n=x().readFileSync(PathModule.join(t,"manifest.json"),{encoding:"utf-8"}),o=autoParseJSON(n,!1);o&&o.header&&(r[o.header.uuid]=t)}catch(e){console.error(e)}}));try{o=x().readdirSync(PathModule.join(a,"development_behavior_packs"),{withFileTypes:!0})}catch(e){return!1}let i=[];return o.forEach((e=>{if(e.isDirectory())try{let t=PathModule.join(a,"development_behavior_packs",e.name),n=x().readFileSync(PathModule.join(t,"manifest.json"),{encoding:"utf-8"}),o=autoParseJSON(n,!1);if(o&&o.dependencies&&o.dependencies[0]){let a=o.dependencies[0].uuid;r[a]&&i.push({name:e.name,bp_path:t,rp_path:r[a],has_icon:!0})}}catch(e){console.error(e)}})),i}(this.form.edition);if(e instanceof Array)this.bedrock_installed=!0,this.existing_packs.replace(e);else{let e={bedrock:"Bedrock",preview:"Bedrock Preview",edu:"Education Edition"};Blockbench.showQuickMessage(`No installation of Minecraft ${e[this.form.edition]} was found on your device`)}}},getPackIcon:e=>e.bp_path+osfs+"pack_icon.png",addPacks(){let e={name:"",bp_path:"",rp_path:"",has_icon:!0};e.bp_path=Blockbench.pickDirectory({resource_id:"bedrock_behavior_pack"}),e.bp_path&&(e.name=PathModule.basename(e.bp_path),e.rp_path=Blockbench.pickDirectory({resource_id:"bedrock_resource_pack"}),e.rp_path&&(this.existing_packs.push(e),this.form.integrate_pack=e))},selectMCAddon(){Blockbench.import({extensions:["mcaddon"],type:"MCAddon",readtype:"binary"},(async e=>{this.mcaddon_file_name=e[0].name;let t=await JSZip.loadAsync(e[0].content);window.ItemWizardProject.previous_mcaddon=t}))}}},M,[],!1,(function(e){var t=a(294);t.__inject__&&t.__inject__(e)}),null,"02f4cdce").exports;var O=function(){var e=this._self._c;return e("div",[e("input",{ref:"color_picker"})])};O._withStripped=!0;const N=D({name:"color-picker",props:{value:String},mounted(){$(this.$refs.color_picker).spectrum({preferredFormat:"hex",color:this.value,showAlpha:!1,showInput:!0,move:e=>{this.$emit("input",e.toHexString())},change:e=>{this.$emit("input",e.toHexString())}})}},O,[],!1,(function(e){}),null,"cdd660b2").exports;var B=function(){var e=this,t=e._self._c;return t("div",{staticClass:"item_wizard_hud_slider"},[t("div",{staticClass:"item_wizard_hud_slider_range",on:{mousedown:function(t){return e.slide(t,!0)},mousemove:function(t){return e.slide(t,!0)},touchmove:function(t){return e.slideTouch(t,!0)},touchstart:function(t){return e.slideTouch(t,!0)}}},[t("div",{style:{width:5*e.value+"%",backgroundSize:e.value<2?"cover":"contain"}})]),e._v(" "),t("div",{staticClass:"item_wizard_slider_label"},[e._v(e._s(e.getLabel(e.value)))])])};B._withStripped=!0;const j=D({name:"hud-slider",props:{value:Number,getLabel:{type:Function,default:e=>e}},methods:{slide(e){0!=e.buttons&&(this.value=Math.clamp(Math.round(e.offsetX/e.target.clientWidth*20),0,20),this.$emit("input",this.value))},slideTouch(e){convertTouchEvent(e),this.value=Math.clamp(Math.round(e.offsetX/e.target.clientWidth*20),0,20),this.$emit("input",this.value)}}},B,[],!1,(function(e){var t=a(557);t.__inject__&&t.__inject__(e)}),null,"22d2328e").exports;var T=function(){var e=this,t=e._self._c;return t("div",{staticClass:"item_wizard_suggestion_id_list"},[t("select-input",{attrs:{options:e.options},on:{input:function(t){e.value="custom"==e.select_value?e.value:e.select_value,e.$emit("input",e.value)}},model:{value:e.select_value,callback:function(t){e.select_value=t},expression:"select_value"}}),e._v(" "),"custom"==e.select_value?t("input",{directives:[{name:"model",rawName:"v-model",value:e.value,expression:"value"}],ref:"input",attrs:{type:"text",placeholder:e.placeholder},domProps:{value:e.value},on:{input:[function(t){t.target.composing||(e.value=t.target.value)},function(t){return e.$emit("input",e.value)}]}}):e._e()],1)};T._withStripped=!0;let H={entity:{allay:"Allay",armor_stand:"Armor Stand",arrow:"Arrow",axolotl:"Axolotl",bat:"Bat",bee:"Bee",blaze:"Blaze",boat:"Boat",camel:"Camel",cat:"Cat",cave_spider:"Cave Spider",chest_boat:"Chest Boat",chest_minecart:"Chest Minecart",chicken:"Chicken",cod:"Cod",command_block_minecart:"Command Block Minecart",cow:"Cow",creeper:"Creeper",dolphin:"Dolphin",donkey:"Donkey",dragon_fireball:"Dragon Fireball",drowned:"Drowned",egg:"Egg",elder_guardian:"Elder Guardian",ender_crystal:"Ender Crystal",ender_dragon:"Ender Dragon",ender_pearl:"Ender Pearl",enderman:"Enderman",endermite:"Endermite",evocation_fang:"Evocation Fang",evocation_illager:"Evocation Illager",eye_of_ender_signal:"Eye Of Ender Signal",fireball:"Fireball",fireworks_rocket:"Fireworks Rocket",fox:"Fox",frog:"Frog",ghast:"Ghast",glow_squid:"Glow Squid",goat:"Goat",guardian:"Guardian",hoglin:"Hoglin",hopper_minecart:"Hopper Minecart",horse:"Horse",husk:"Husk",iron_golem:"Iron Golem",lightning_bolt:"Lightning Bolt",llama:"Llama",llama_spit:"Llama Spit",magma_cube:"Magma Cube",minecart:"Minecart",mooshroom:"Mooshroom",mule:"Mule",npc:"NPC",ocelot:"Ocelot",painting:"Painting",panda:"Panda",parrot:"Parrot",phantom:"Phantom",pig:"Pig",piglin:"Piglin",piglin_brute:"Piglin Brute",pillager:"Pillager",player:"Player",polar_bear:"Polar Bear",pufferfish:"Pufferfish",rabbit:"Rabbit",ravager:"Ravager",salmon:"Salmon",sheep:"Sheep",shulker:"Shulker",shulker_bullet:"Shulker Bullet",silverfish:"Silverfish",skeleton:"Skeleton",skeleton_horse:"Skeleton Horse",slime:"Slime",small_fireball:"Small Fireball",sniffer:"Sniffer",snow_golem:"Snow Golem",spider:"Spider",squid:"Squid",stray:"Stray",strider:"Strider",tadpole:"Tadpole",thrown_trident:"Thrown Trident",tnt:"TNT",tnt_minecart:"TNT Minecart",trader_llama:"Trader Llama",tropicalfish:"Tropicalfish",turtle:"Turtle",vex:"Vex",villager:"Villager",vindicator:"Vindicator",wandering_trader:"Wandering Trader",warden:"Warden",witch:"Witch",wither:"Wither",wither_skeleton:"Wither Skeleton",wolf:"Wolf",zoglin:"Zoglin",zombie:"Zombie",zombie_horse:"Zombie Horse",zombie_pigman:"Zombie Pigman",zombie_villager:"Zombie Villager"},item:{acacia_boat:"Acacia Boat",acacia_button:"Acacia Button",acacia_chest_boat:"Acacia Chest Boat",acacia_door:"Acacia Door",acacia_fence:"Acacia Fence",acacia_fence_gate:"Acacia Fence Gate",acacia_hanging_sign:"Acacia Hanging Sign",acacia_log:"Acacia Log",acacia_pressure_plate:"Acacia Pressure Plate",acacia_sign:"Acacia Sign",acacia_stairs:"Acacia Stairs",acacia_standing_sign:"Acacia Sign",acacia_trapdoor:"Acacia Trapdoor",acacia_wall_sign:"Acacia Wall Sign",activator_rail:"Activator Rail",agent_spawn_egg:"Agent Spawn Egg",allay_spawn_egg:"Allay Spawn Egg",allow:"Allow",amethyst_block:"Block of Amethyst",amethyst_cluster:"Amethyst Cluster",amethyst_shard:"Amethyst Shard",ancient_debris:"Ancient Debris",andesite_stairs:"Andesite Stairs",angler_pottery_sherd:"Angler Pottery Sherd",anvil:"Anvil",apple:"Apple",archer_pottery_sherd:"Archer Pottery Sherd",armor_stand:"Armor Stand",arms_up_pottery_sherd:"Arms Up Pottery Sherd",arrow:"Arrow",axolotl_bucket:"Axolotl Bucket",axolotl_spawn_egg:"Axolotl Spawn Egg",azalea:"Azalea",azalea_leaves:"Azalea Leaves",azalea_leaves_flowered:"Flowering Azalea Leaves",baked_potato:"Baked Potato",balloon:"Balloon",bamboo:"Bamboo",bamboo_block:"Block of Bamboo",bamboo_button:"Bamboo Button",bamboo_chest_raft:"Bamboo Chest Raft",bamboo_door:"Bamboo Door",bamboo_double_slab:"Bamboo Double Slab",bamboo_fence:"Bamboo Fence",bamboo_fence_gate:"Bamboo Fence Gate",bamboo_hanging_sign:"Bamboo Hanging Sign",bamboo_mosaic:"Bamboo Mosaic",bamboo_mosaic_double_slab:"Bamboo Mosaic Double Slab",bamboo_mosaic_slab:"Bamboo Mosaic Slab",bamboo_mosaic_stairs:"Bamboo Mosaic Stairs",bamboo_planks:"Bamboo Planks",bamboo_pressure_plate:"Bamboo Pressure Plate",bamboo_raft:"Bamboo Raft",bamboo_sapling:"Bamboo Sapling",bamboo_sign:"Bamboo Sign",bamboo_slab:"Bamboo Slab",bamboo_stairs:"Bamboo Stairs",bamboo_standing_sign:"Bamboo Standing Sign",bamboo_trapdoor:"Bamboo Trapdoor",bamboo_wall_sign:"Bamboo Wall Sign",banner:"Banner",banner_pattern:"Banner Pattern",barrel:"Barrel",barrier:"Barrier",basalt:"Basalt",bat_spawn_egg:"Bat Spawn Egg",beacon:"Beacon",bed:"Bed",bedrock:"Bedrock",bee_nest:"Bee Nest",bee_spawn_egg:"Bee Spawn Egg",beef:"Raw Beef",beehive:"Beehive",beetroot:"Beetroot",beetroot_seeds:"Beetroot Seeds",beetroot_soup:"Beetroot Soup",bell:"Bell",big_dripleaf:"Big Dripleaf",birch_boat:"Birch Boat",birch_button:"Birch Button",birch_chest_boat:"Birch Chest Boat",birch_door:"Birch Door",birch_fence:"Birch Fence",birch_fence_gate:"Birch Fence Gate",birch_hanging_sign:"Birch Hanging Sign",birch_log:"Birch Log",birch_pressure_plate:"Birch Pressure Plate",birch_sign:"Birch Sign",birch_stairs:"Birch Stairs",birch_standing_sign:"Birch Sign",birch_trapdoor:"Birch Trapdoor",birch_wall_sign:"Birch Wall Sign",black_candle:"Black Candle",black_candle_cake:"Cake with Black Candle",black_carpet:"Black Carpet",black_concrete:"Black Concrete",black_dye:"Black Dye",black_glazed_terracotta:"Black Glazed Terracotta",black_shulker_box:"Black Shulker Box",black_wool:"Black Wool",blackstone:"Blackstone",blackstone_double_slab:"Blackstone Double Slab",blackstone_slab:"Blackstone Slab",blackstone_stairs:"Blackstone Stairs",blackstone_wall:"Blackstone Wall",blade_pottery_sherd:"Blade Pottery Sherd",blast_furnace:"Blast Furnace",blaze_powder:"Blaze Powder",blaze_rod:"Blaze Rod",blaze_spawn_egg:"Blaze Spawn Egg",bleach:"Bleach",blue_candle:"Blue Candle",blue_candle_cake:"Cake with Blue Candle",blue_carpet:"Blue Carpet",blue_concrete:"Blue Concrete",blue_dye:"Blue Dye",blue_glazed_terracotta:"Blue Glazed Terracotta",blue_ice:"Blue Ice",blue_shulker_box:"Blue Shulker Box",blue_wool:"Blue Wool",boat:"Boat",bone:"Bone",bone_block:"Bone Block",bone_meal:"Bone Meal",book:"Book",bookshelf:"Bookshelf",border_block:"Border",bordure_indented_banner_pattern:"Bordure Indented Banner Pattern",bow:"Bow",bowl:"Bowl",brain_coral:"Brain Coral",bread:"Bread",brewer_pottery_sherd:"Brewer Pottery Sherd",brewing_stand:"Brewing Stand",brick:"Brick",brick_block:"Brick Block",brick_stairs:"Brick Stairs",brown_candle:"Brown Candle",brown_candle_cake:"Cake with Brown Candle",brown_carpet:"Brown Carpet",brown_concrete:"Brown Concrete",brown_dye:"Brown Dye",brown_glazed_terracotta:"Brown Glazed Terracotta",brown_mushroom:"Brown Mushroom",brown_mushroom_block:"Brown Mushroom Block",brown_shulker_box:"Brown Shulker Box",brown_wool:"Brown Wool",brush:"Brush",bubble_column:"Bubble Column",bubble_coral:"Bubble Coral",bucket:"Bucket",budding_amethyst:"Budding Amethyst",burn_pottery_sherd:"Burn Pottery Sherd",cactus:"Cactus",cake:"Cake",calcite:"Calcite",calibrated_sculk_sensor:"Calibrated Sculk Sensor",camel_spawn_egg:"Camel Spawn Egg",camera:"Camera",campfire:"Campfire",candle:"Candle",candle_cake:"Cake with Candle",carpet:"Carpet",carrot:"Carrot",carrot_on_a_stick:"Carrot On A Stick",carrots:"Carrots",cartography_table:"Cartography Table",carved_pumpkin:"Carved Pumpkin",cat_spawn_egg:"Cat Spawn Egg",cauldron:"Cauldron",cave_spider_spawn_egg:"Cave Spider Spawn Egg",cave_vines:"Cave Vines",cave_vines_body_with_berries:"Cave Vines",cave_vines_head_with_berries:"Cave Vines",chain:"Chain",chain_command_block:"Chain Command Block",chainmail_boots:"Chain Boots",chainmail_chestplate:"Chain Chestplate",chainmail_helmet:"Chain Helmet",chainmail_leggings:"Chain Leggings",charcoal:"Charcoal",chemical_heat:"Chemical Heat",chemistry_table:"Chemistry Table",cherry_boat:"Cherry Boat",cherry_button:"Cherry Button",cherry_chest_boat:"Cherry Chest Boat",cherry_door:"Cherry Door",cherry_double_slab:"Cherry Double Slab",cherry_fence:"Cherry Fence",cherry_fence_gate:"Cherry Fence Gate",cherry_hanging_sign:"Cherry Hanging Sign",cherry_leaves:"Cherry Leaves",cherry_log:"Cherry Log",cherry_planks:"Cherry Planks",cherry_pressure_plate:"Cherry Pressure Plate",cherry_sapling:"Cherry Sapling",cherry_sign:"Cherry Sign",cherry_slab:"Cherry Slab",cherry_stairs:"Cherry Stairs",cherry_standing_sign:"Cherry Standing Sign",cherry_trapdoor:"Cherry Trapdoor",cherry_wall_sign:"Cherry Wall Sign",cherry_wood:"Cherry Wood",chest:"Chest",chest_boat:"Chest Boat",chest_minecart:"Minecart with Chest",chicken:"Raw Chicken",chicken_spawn_egg:"Chicken Spawn Egg",chiseled_bookshelf:"Chiseled Bookshelf",chiseled_deepslate:"Chiseled Deepslate",chiseled_nether_bricks:"Chiseled Nether Bricks",chiseled_polished_blackstone:"Chiseled Polished Blackstone",chorus_flower:"Chorus Flower",chorus_fruit:"Chorus Fruit",chorus_plant:"Chorus Plant",clay:"Clay Block",clay_ball:"Clay",client_request_placeholder_block:"Client Request Placeholder Block",clock:"Clock",coal:"Coal",coal_block:"Block of Coal",coal_ore:"Coal Ore",coast_armor_trim_smithing_template:"Coast Armor Trim Smithing Template",cobbled_deepslate:"Cobbled Deepslate",cobbled_deepslate_double_slab:"Cobbled Deepslate Double Slab",cobbled_deepslate_slab:"Cobbled Deepslate Slab",cobbled_deepslate_stairs:"Cobbled Deepslate Stairs",cobbled_deepslate_wall:"Cobbled Deepslate Wall",cobblestone:"Cobblestone",cobblestone_wall:"Cobblestone Wall",cocoa:"Cocoa",cocoa_beans:"Cocoa Beans",cod:"Cod",cod_bucket:"Cod Bucket",cod_spawn_egg:"Cod Spawn Egg",colored_torch_bp:"Colored Torch Bp",colored_torch_rg:"Colored Torch Rg",command_block:"Command Block",command_block_minecart:"Minecart with Command Block",comparator:"Redstone Comparator",compass:"Compass",composter:"Composter",compound:"Compound",concrete:"Concrete",concrete_powder:"Concrete Powder",conduit:"Conduit",cooked_beef:"Cooked Beef",cooked_chicken:"Cooked Chicken",cooked_cod:"Cooked Cod",cooked_mutton:"Cooked Mutton",cooked_porkchop:"Cooked Porkchop",cooked_rabbit:"Cooked Rabbit",cooked_salmon:"Cooked Salmon",cookie:"Cookie",copper_block:"Block of Copper",copper_ingot:"Copper Ingot",copper_ore:"Copper Ore",coral:"Coral",coral_block:"Coral Block",coral_fan:"Coral Fan",coral_fan_dead:"Coral Fan Dead",coral_fan_hang:"Coral Fan Hang",coral_fan_hang2:"Coral Fan Hang2",coral_fan_hang3:"Coral Fan Hang3",cow_spawn_egg:"Cow Spawn Egg",cracked_deepslate_bricks:"Cracked Deepslate Bricks",cracked_deepslate_tiles:"Cracked Deepslate Tiles",cracked_nether_bricks:"Cracked Nether Bricks",cracked_polished_blackstone_bricks:"Cracked Polished Blackstone Bricks",crafting_table:"Crafting Table",creeper_banner_pattern:"Creeper Banner Pattern",creeper_spawn_egg:"Creeper Spawn Egg",crimson_button:"Crimson Button",crimson_door:"Crimson Door",crimson_double_slab:"Crimson Slab",crimson_fence:"Crimson Fence",crimson_fence_gate:"Crimson Fence Gate",crimson_fungus:"Crimson Fungus",crimson_hanging_sign:"Crimson Hanging Sign",crimson_hyphae:"Crimson Hyphae",crimson_nylium:"Crimson Nylium",crimson_planks:"Crimson Planks",crimson_pressure_plate:"Crimson Pressure Plate",crimson_roots:"Crimson Roots",crimson_sign:"Crimson Sign",crimson_slab:"Crimson Slab",crimson_stairs:"Crimson Stairs",crimson_standing_sign:"Crimson Sign",crimson_stem:"Crimson Stem",crimson_trapdoor:"Crimson Trapdoor",crimson_wall_sign:"Crimson Sign",crossbow:"Crossbow",crying_obsidian:"Crying Obsidian",cut_copper:"Cut Copper",cut_copper_slab:"Cut Copper Slab",cut_copper_stairs:"Cut Copper Stairs",cyan_candle:"Cyan Candle",cyan_candle_cake:"Cake with Cyan Candle",cyan_carpet:"Cyan Carpet",cyan_concrete:"Cyan Concrete",cyan_dye:"Cyan Dye",cyan_glazed_terracotta:"Cyan Glazed Terracotta",cyan_shulker_box:"Cyan Shulker Box",cyan_wool:"Cyan Wool",danger_pottery_sherd:"Danger Pottery Sherd",dark_oak_boat:"Dark Oak Boat",dark_oak_button:"Dark Oak Button",dark_oak_chest_boat:"Dark Oak Chest Boat",dark_oak_door:"Dark Oak Door",dark_oak_fence:"Dark Oak Fence",dark_oak_fence_gate:"Dark Oak Fence Gate",dark_oak_hanging_sign:"Dark Oak Hanging Sign",dark_oak_log:"Dark Oak Log",dark_oak_pressure_plate:"Dark Oak Pressure Plate",dark_oak_sign:"Dark Oak Sign",dark_oak_stairs:"Dark Oak Stairs",dark_oak_trapdoor:"Dark Oak Trapdoor",dark_prismarine_stairs:"Dark Prismarine Stairs",darkoak_standing_sign:"Dark Oak Sign",darkoak_wall_sign:"Darkoak Wall Sign",daylight_detector:"Daylight Sensor",daylight_detector_inverted:"Daylight Detector Inverted",dead_brain_coral:"Dead Brain Coral",dead_bubble_coral:"Dead Bubble Coral",dead_fire_coral:"Dead Fire Coral",dead_horn_coral:"Dead Horn Coral",dead_tube_coral:"Dead Tube Coral",deadbush:"Dead Bush",debug_stick:"Debug Stick",decorated_pot:"Decorated Pot",deepslate:"Deepslate",deepslate_brick_double_slab:"Deepslate Brick Double Slab",deepslate_brick_slab:"Deepslate Brick Slab",deepslate_brick_stairs:"Deepslate Brick Stairs",deepslate_brick_wall:"Deepslate Brick Wall",deepslate_bricks:"Deepslate Bricks",deepslate_coal_ore:"Deepslate Coal Ore",deepslate_copper_ore:"Deepslate Copper Ore",deepslate_diamond_ore:"Deepslate Diamond Ore",deepslate_emerald_ore:"Deepslate Emerald Ore",deepslate_gold_ore:"Deepslate Gold Ore",deepslate_iron_ore:"Deepslate Iron Ore",deepslate_lapis_ore:"Deepslate Lapis Lazuli Ore",deepslate_redstone_ore:"Deepslate Redstone Ore",deepslate_tile_double_slab:"Deepslate Tile Double Slab",deepslate_tile_slab:"Deepslate Tile Slab",deepslate_tile_stairs:"Deepslate Tile Stairs",deepslate_tile_wall:"Deepslate Tile Wall",deepslate_tiles:"Deepslate Tiles",deny:"Deny",detector_rail:"Detector Rail",diamond:"Diamond",diamond_axe:"Diamond Axe",diamond_block:"Block of Diamond",diamond_boots:"Diamond Boots",diamond_chestplate:"Diamond Chestplate",diamond_helmet:"Diamond Helmet",diamond_hoe:"Diamond Hoe",diamond_horse_armor:"Diamond Horse Armor",diamond_leggings:"Diamond Leggings",diamond_ore:"Diamond Ore",diamond_pickaxe:"Diamond Pickaxe",diamond_shovel:"Diamond Shovel",diamond_sword:"Diamond Sword",diorite_stairs:"Diorite Stairs",dirt:"Dirt",dirt_with_roots:"Rooted Dirt",disc_fragment_5:"Disc Fragment 5",dispenser:"Dispenser",dolphin_spawn_egg:"Dolphin Spawn Egg",donkey_spawn_egg:"Donkey Spawn Egg",double_cut_copper_slab:"Double Cut Copper Slab",double_plant:"Plant",double_stone_block_slab:"Double Stone Block Slab",double_stone_block_slab2:"Double Stone Block Slab2",double_stone_block_slab3:"Double Stone Block Slab3",double_stone_block_slab4:"Double Stone Block Slab4",double_wooden_slab:"Double Wooden Slab",dragon_breath:"Dragon's Breath",dragon_egg:"Dragon Egg",dried_kelp:"Dried Kelp",dried_kelp_block:"Dried Kelp Block",dripstone_block:"Dripstone Block",dropper:"Dropper",drowned_spawn_egg:"Drowned Spawn Egg",dune_armor_trim_smithing_template:"Dune Armor Trim Smithing Template",dye:"Dye",echo_shard:"Echo Shard",egg:"Egg",elder_guardian_spawn_egg:"Elder Guardian Spawn Egg",elytra:"Elytra",emerald:"Emerald",emerald_block:"Block of Emerald",emerald_ore:"Emerald Ore",empty_map:"Empty Map",enchanted_book:"Enchanted Book",enchanted_golden_apple:"Enchanted Golden Apple",enchanting_table:"Enchantment Table",end_brick_stairs:"End Stone Brick Stairs",end_bricks:"End Stone Bricks",end_crystal:"End Crystal",end_gateway:"End Gateway",end_portal:"End Portal",end_portal_frame:"End Portal Frame",end_rod:"End Rod",end_stone:"End Stone",ender_chest:"Ender Chest",ender_dragon_spawn_egg:"Ender Dragon Spawn Egg",ender_eye:"Eye of Ender",ender_pearl:"Ender Pearl",enderman_spawn_egg:"Enderman Spawn Egg",endermite_spawn_egg:"Endermite Spawn Egg",evoker_spawn_egg:"Evoker Spawn Egg",experience_bottle:"Bottle o' Enchanting",explorer_pottery_sherd:"Explorer Pottery Sherd",exposed_copper:"Exposed Copper",exposed_cut_copper:"Exposed Cut Copper",exposed_cut_copper_slab:"Exposed Cut Copper Slab",exposed_cut_copper_stairs:"Exposed Cut Copper Stairs",exposed_double_cut_copper_slab:"Exposed Double Cut Copper Slab",eye_armor_trim_smithing_template:"Eye Armor Trim Smithing Template",farmland:"Farmland",feather:"Feather",fence:"Oak Fence",fence_gate:"Oak Fence Gate",fermented_spider_eye:"Fermented Spider Eye",field_masoned_banner_pattern:"Field Masoned Banner Pattern",filled_map:"Filled Map",fire:"Fire",fire_charge:"Fire Charge",fire_coral:"Fire Coral",firework_rocket:"Firework Rocket",firework_star:"Firework Star",fishing_rod:"Fishing Rod",fletching_table:"Fletching Table",flint:"Flint",flint_and_steel:"Flint and Steel",flower_banner_pattern:"Flower Banner Pattern",flower_pot:"Flower Pot",flowering_azalea:"Flowering Azalea",flowing_lava:"Lava",flowing_water:"Water",fox_spawn_egg:"Fox Spawn Egg",frame:"Item Frame",friend_pottery_sherd:"Friend Pottery Sherd",frog_spawn:"Frogspawn",frog_spawn_egg:"Frog Spawn Egg",frosted_ice:"Frosted Ice",furnace:"Furnace",ghast_spawn_egg:"Ghast Spawn Egg",ghast_tear:"Ghast Tear",gilded_blackstone:"Gilded Blackstone",glass:"Glass",glass_bottle:"Glass Bottle",glass_pane:"Glass Pane",glistering_melon_slice:"Glistering Melon Slice",globe_banner_pattern:"Globe Banner Pattern",glow_frame:"Glow Item Frame",glow_ink_sac:"Glow Ink Sac",glow_lichen:"Glow Lichen",glow_squid_spawn_egg:"Glow Squid Spawn Egg",glow_stick:"Glow Stick",glowingobsidian:"Glowingobsidian",glowstone:"Glowstone",glowstone_dust:"Glowstone Dust",goat_horn:"Goat Horn",goat_spawn_egg:"Goat Spawn Egg",gold_block:"Block of Gold",gold_ingot:"Gold Ingot",gold_nugget:"Gold Nugget",gold_ore:"Gold Ore",golden_apple:"Golden Apple",golden_axe:"Golden Axe",golden_boots:"Golden Boots",golden_carrot:"Golden Carrot",golden_chestplate:"Golden Chestplate",golden_helmet:"Golden Helmet",golden_hoe:"Golden Hoe",golden_horse_armor:"Golden Horse Armor",golden_leggings:"Golden Leggings",golden_pickaxe:"Golden Pickaxe",golden_rail:"Powered Rail",golden_shovel:"Golden Shovel",golden_sword:"Golden Sword",granite_stairs:"Granite Stairs",grass:"Grass Block",grass_path:"Dirt Path",gravel:"Gravel",gray_candle:"Gray Candle",gray_candle_cake:"Cake with Gray Candle",gray_carpet:"Gray Carpet",gray_concrete:"Gray Concrete",gray_dye:"Gray Dye",gray_glazed_terracotta:"Gray Glazed Terracotta",gray_shulker_box:"Gray Shulker Box",gray_wool:"Gray Wool",green_candle:"Green Candle",green_candle_cake:"Cake with Green Candle",green_carpet:"Green Carpet",green_concrete:"Green Concrete",green_dye:"Green Dye",green_glazed_terracotta:"Green Glazed Terracotta",green_shulker_box:"Green Shulker Box",green_wool:"Green Wool",grindstone:"Grindstone",guardian_spawn_egg:"Guardian Spawn Egg",gunpowder:"Gunpowder",hanging_roots:"Hanging Roots",hard_glass:"Hard Glass",hard_glass_pane:"Hard Glass Pane",hard_stained_glass:"Hard Stained Glass",hard_stained_glass_pane:"Hard Stained Glass Pane",hardened_clay:"Terracotta",hay_block:"Hay Bale",heart_of_the_sea:"Heart of the Sea",heart_pottery_sherd:"Heart Pottery Sherd",heartbreak_pottery_sherd:"Heartbreak Pottery Sherd",heavy_weighted_pressure_plate:"Weighted Pressure Plate (Heavy)",hoglin_spawn_egg:"Hoglin Spawn Egg",honey_block:"Honey Block",honey_bottle:"Honey Bottle",honeycomb:"Honeycomb",honeycomb_block:"Honeycomb Block",hopper:"Hopper",hopper_minecart:"Minecart with Hopper",horn_coral:"Horn Coral",horse_spawn_egg:"Horse Spawn Egg",host_armor_trim_smithing_template:"Host Armor Trim Smithing Template",howl_pottery_sherd:"Howl Pottery Sherd",husk_spawn_egg:"Husk Spawn Egg",ice:"Ice",ice_bomb:"Ice Bomb",infested_deepslate:"Infested Deepslate",ink_sac:"Ink Sac",iron_axe:"Iron Axe",iron_bars:"Iron Bars",iron_block:"Block of Iron",iron_boots:"Iron Boots",iron_chestplate:"Iron Chestplate",iron_door:"Iron Door",iron_golem_spawn_egg:"Iron Golem Spawn Egg",iron_helmet:"Iron Helmet",iron_hoe:"Iron Hoe",iron_horse_armor:"Iron Horse Armor",iron_ingot:"Iron Ingot",iron_leggings:"Iron Leggings",iron_nugget:"Iron Nugget",iron_ore:"Iron Ore",iron_pickaxe:"Iron Pickaxe",iron_shovel:"Iron Shovel",iron_sword:"Iron Sword",iron_trapdoor:"Iron Trapdoor",jigsaw:"Jigsaw Block",jukebox:"Jukebox",jungle_boat:"Jungle Boat",jungle_button:"Jungle Button",jungle_chest_boat:"Jungle Chest Boat",jungle_door:"Jungle Door",jungle_fence:"Jungle Fence",jungle_fence_gate:"Jungle Fence Gate",jungle_hanging_sign:"Jungle Hanging Sign",jungle_log:"Jungle Log",jungle_pressure_plate:"Jungle Pressure Plate",jungle_sign:"Jungle Sign",jungle_stairs:"Jungle Stairs",jungle_standing_sign:"Jungle Sign",jungle_trapdoor:"Jungle Trapdoor",jungle_wall_sign:"Jungle Wall Sign",kelp:"Kelp",ladder:"Ladder",lantern:"Lantern",lapis_block:"Block of Lapis Lazuli",lapis_lazuli:"Lapis Lazuli",lapis_ore:"Lapis Lazuli Ore",large_amethyst_bud:"Large Amethyst Bud",lava:"Lava",lava_bucket:"Lava Bucket",lead:"Lead",leather:"Leather",leather_boots:"Leather Boots",leather_chestplate:"Leather Tunic",leather_helmet:"Leather Cap",leather_horse_armor:"Leather Horse Armor",leather_leggings:"Leather Pants",leaves:"Leaves",leaves2:"Leaves2",lectern:"Lectern",lever:"Lever",light_block:"Light Block",light_blue_candle:"Light Blue Candle",light_blue_candle_cake:"Cake with Light Blue Candle",light_blue_carpet:"Light Blue Carpet",light_blue_concrete:"Light Blue Concrete",light_blue_dye:"Light Blue Dye",light_blue_glazed_terracotta:"Light Blue Glazed Terracotta",light_blue_shulker_box:"Light Blue Shulker Box",light_blue_wool:"Light Blue Wool",light_gray_candle:"Light Gray Candle",light_gray_candle_cake:"Cake with Light Gray Candle",light_gray_carpet:"Light Gray Carpet",light_gray_concrete:"Light Gray Concrete",light_gray_dye:"Light Gray Dye",light_gray_shulker_box:"Light Gray Shulker Box",light_gray_wool:"Light Gray Wool",light_weighted_pressure_plate:"Weighted Pressure Plate (Light)",lightning_rod:"Lightning Rod",lime_candle:"Lime Candle",lime_candle_cake:"Cake with Lime Candle",lime_carpet:"Lime Carpet",lime_concrete:"Lime Concrete",lime_dye:"Lime Dye",lime_glazed_terracotta:"Lime Glazed Terracotta",lime_shulker_box:"Lime Shulker Box",lime_wool:"Lime Wool",lingering_potion:"Lingering Potion",lit_blast_furnace:"Lit Blast Furnace",lit_deepslate_redstone_ore:"Lit Deepslate Redstone Ore",lit_furnace:"Lit Furnace",lit_pumpkin:"Jack o'Lantern",lit_redstone_lamp:"Lit Redstone Lamp",lit_redstone_ore:"Lit Redstone Ore",lit_smoker:"Lit Smoker",llama_spawn_egg:"Llama Spawn Egg",lodestone:"Lodestone",lodestone_compass:"Lodestone Compass",log:"Log",log2:"Log2",loom:"Loom",magenta_candle:"Magenta Candle",magenta_candle_cake:"Cake with Magenta Candle",magenta_carpet:"Magenta Carpet",magenta_concrete:"Magenta Concrete",magenta_dye:"Magenta Dye",magenta_glazed_terracotta:"Magenta Glazed Terracotta",magenta_shulker_box:"Magenta Shulker Box",magenta_wool:"Magenta Wool",magma:"Magma Block",magma_cream:"Magma Cream",magma_cube_spawn_egg:"Magma Cube Spawn Egg",mangrove_boat:"Mangrove Boat",mangrove_button:"Mangrove Button",mangrove_chest_boat:"Mangrove Chest Boat",mangrove_door:"Mangrove Door",mangrove_double_slab:"Mangrove Double Slab",mangrove_fence:"Mangrove Fence",mangrove_fence_gate:"Mangrove Fence Gate",mangrove_hanging_sign:"Mangrove Hanging Sign",mangrove_leaves:"Mangrove Leaves",mangrove_log:"Mangrove Log",mangrove_planks:"Mangrove Planks",mangrove_pressure_plate:"Mangrove Pressure Plate",mangrove_propagule:"Mangrove Propagule",mangrove_roots:"Mangrove Roots",mangrove_sign:"Mangrove Sign",mangrove_slab:"Mangrove Slab",mangrove_stairs:"Mangrove Stairs",mangrove_standing_sign:"Mangrove Standing Sign",mangrove_trapdoor:"Mangrove Trapdoor",mangrove_wall_sign:"Mangrove Wall Sign",mangrove_wood:"Mangrove Wood",medicine:"Medicine",medium_amethyst_bud:"Medium Amethyst Bud",melon_block:"Melon",melon_seeds:"Melon Seeds",melon_slice:"Melon Slice",melon_stem:"Melon Stem",milk_bucket:"Milk Bucket",minecart:"Minecart",miner_pottery_sherd:"Miner Pottery Sherd",mob_spawner:"Monster Spawner",mojang_banner_pattern:"Mojang Banner Pattern",monster_egg:"Infested Stone",mooshroom_spawn_egg:"Mooshroom Spawn Egg",moss_block:"Moss Block",moss_carpet:"Moss Carpet",mossy_cobblestone:"Mossy Cobblestone",mossy_cobblestone_stairs:"Mossy Cobblestone Stairs",mossy_stone_brick_stairs:"Mossy Stone Brick Stairs",mourner_pottery_sherd:"Mourner Pottery Sherd",moving_block:"Moving Block",mud:"Mud",mud_brick_double_slab:"Mud Brick Double Slab",mud_brick_slab:"Mud Brick Slab",mud_brick_stairs:"Mud Brick Stairs",mud_brick_wall:"Mud Brick Wall",mud_bricks:"Mud Bricks",muddy_mangrove_roots:"Muddy Mangrove Roots",mule_spawn_egg:"Mule Spawn Egg",mushroom_stew:"Mushroom Stew",music_disc_11:"Music Disc 11",music_disc_13:"Music Disc 13",music_disc_5:"Music Disc 5",music_disc_blocks:"Music Disc Blocks",music_disc_cat:"Music Disc Cat",music_disc_chirp:"Music Disc Chirp",music_disc_far:"Music Disc Far",music_disc_mall:"Music Disc Mall",music_disc_mellohi:"Music Disc Mellohi",music_disc_otherside:"Music Disc Otherside",music_disc_pigstep:"Music Disc Pigstep",music_disc_relic:"Music Disc Relic",music_disc_stal:"Music Disc Stal",music_disc_strad:"Music Disc Strad",music_disc_wait:"Music Disc Wait",music_disc_ward:"Music Disc Ward",mutton:"Mutton",mycelium:"Mycelium",name_tag:"Name Tag",nautilus_shell:"Nautilus Shell",nether_brick:"Nether Brick Block",nether_brick_fence:"Nether Brick Fence",nether_brick_stairs:"Nether Brick Stairs",nether_gold_ore:"Nether Gold Ore",nether_sprouts:"Nether Sprouts",nether_star:"Nether Star",nether_wart:"Nether Wart",nether_wart_block:"Nether Wart Block",netherbrick:"Nether Brick",netherite_axe:"Netherite Axe",netherite_block:"Block of Netherite",netherite_boots:"Netherite Boots",netherite_chestplate:"Netherite Chestplate",netherite_helmet:"Netherite Helmet",netherite_hoe:"Netherite Hoe",netherite_ingot:"Netherite Ingot",netherite_leggings:"Netherite Leggings",netherite_pickaxe:"Netherite Pickaxe",netherite_scrap:"Netherite Scrap",netherite_shovel:"Netherite Shovel",netherite_sword:"Netherite Sword",netherite_upgrade_smithing_template:"Netherite Upgrade Smithing Template",netherrack:"Netherrack",netherreactor:"Nether Reactor Core",normal_stone_stairs:"Stone Stairs",noteblock:"Note Block",npc_spawn_egg:"Npc Spawn Egg",oak_boat:"Oak Boat",oak_chest_boat:"Oak Chest Boat",oak_fence:"Oak Fence",oak_hanging_sign:"Oak Hanging Sign",oak_log:"Oak Log",oak_sign:"Oak Sign",oak_stairs:"Oak Stairs",observer:"Observer",obsidian:"Obsidian",ocelot_spawn_egg:"Ocelot Spawn Egg",ochre_froglight:"Ochre Froglight",orange_candle:"Orange Candle",orange_candle_cake:"Cake with Orange Candle",orange_carpet:"Orange Carpet",orange_concrete:"Orange Concrete",orange_dye:"Orange Dye",orange_glazed_terracotta:"Orange Glazed Terracotta",orange_shulker_box:"Orange Shulker Box",orange_wool:"Orange Wool",oxidized_copper:"Oxidized Copper",oxidized_cut_copper:"Oxidized Cut Copper",oxidized_cut_copper_slab:"Oxidized Cut Copper Slab",oxidized_cut_copper_stairs:"Oxidized Cut Copper Stairs",oxidized_double_cut_copper_slab:"Oxidized Double Cut Copper Slab",packed_ice:"Packed Ice",packed_mud:"Packed Mud",painting:"Painting",panda_spawn_egg:"Panda Spawn Egg",paper:"Paper",parrot_spawn_egg:"Parrot Spawn Egg",pearlescent_froglight:"Pearlescent Froglight",phantom_membrane:"Phantom Membrane",phantom_spawn_egg:"Phantom Spawn Egg",pig_spawn_egg:"Pig Spawn Egg",piglin_banner_pattern:"Piglin Banner Pattern",piglin_brute_spawn_egg:"Piglin Brute Spawn Egg",piglin_spawn_egg:"Piglin Spawn Egg",pillager_spawn_egg:"Pillager Spawn Egg",pink_candle:"Pink Candle",pink_candle_cake:"Cake with Pink Candle",pink_carpet:"Pink Carpet",pink_concrete:"Pink Concrete",pink_dye:"Pink Dye",pink_glazed_terracotta:"Pink Glazed Terracotta",pink_petals:"Pink Petals",pink_shulker_box:"Pink Shulker Box",pink_wool:"Pink Wool",piston:"Piston",pitcher_crop:"Pitcher Crop",pitcher_plant:"Pitcher Plant",pitcher_pod:"Pitcher Pod",planks:"Wooden Planks",plenty_pottery_sherd:"Plenty Pottery Sherd",podzol:"Podzol",pointed_dripstone:"Pointed Dripstone",poisonous_potato:"Poisonous Potato",polar_bear_spawn_egg:"Polar Bear Spawn Egg",polished_andesite_stairs:"Polished Andesite Stairs",polished_basalt:"Polished Basalt",polished_blackstone:"Polished Blackstone",polished_blackstone_brick_double_slab:"Polished Blackstone Brick Double Slab",polished_blackstone_brick_slab:"Polished Blackstone Brick Slab",polished_blackstone_brick_stairs:"Polished Blackstone Brick Stairs",polished_blackstone_brick_wall:"Polished Blackstone Brick Wall",polished_blackstone_bricks:"Polished Blackstone Bricks",polished_blackstone_button:"Polished Blackstone Button",polished_blackstone_double_slab:"Polished Blackstone Double Slab",polished_blackstone_pressure_plate:"Polished Blackstone Pressure Plate",polished_blackstone_slab:"Polished Blackstone Slab",polished_blackstone_stairs:"Polished Blackstone Stairs",polished_blackstone_wall:"Polished Blackstone Wall",polished_deepslate:"Polished Deepslate",polished_deepslate_double_slab:"Polished Deepslate Double Slab",polished_deepslate_slab:"Polished Deepslate Slab",polished_deepslate_stairs:"Polished Deepslate Stairs",polished_deepslate_wall:"Polished Deepslate Wall",polished_diorite_stairs:"Polished Diorite Stairs",polished_granite_stairs:"Polished Granite Stairs",popped_chorus_fruit:"Popped Chorus Fruit",porkchop:"Raw Porkchop",portal:"Portal",potato:"Potato",potion:"Potion",powder_snow:"Powder Snow",powder_snow_bucket:"Powder Snow Bucket",powered_comparator:"Powered Comparator",powered_repeater:"Powered Repeater",prismarine:"Prismarine",prismarine_bricks_stairs:"Prismarine Brick Stairs",prismarine_crystals:"Prismarine Crystals",prismarine_shard:"Prismarine Shard",prismarine_stairs:"Prismarine Stairs",prize_pottery_sherd:"Prize Pottery Sherd",pufferfish:"Pufferfish",pufferfish_bucket:"Pufferfish Bucket",pufferfish_spawn_egg:"Pufferfish Spawn Egg",pumpkin:"Pumpkin",pumpkin_pie:"Pumpkin Pie",pumpkin_seeds:"Pumpkin Seeds",pumpkin_stem:"Pumpkin Stem",purple_candle:"Purple Candle",purple_candle_cake:"Cake with Purple Candle",purple_carpet:"Purple Carpet",purple_concrete:"Purple Concrete",purple_dye:"Purple Dye",purple_glazed_terracotta:"Purple Glazed Terracotta",purple_shulker_box:"Purple Shulker Box",purple_wool:"Purple Wool",purpur_block:"Purpur Block",purpur_stairs:"Purpur Stairs",quartz:"Nether Quartz",quartz_block:"Block of Quartz",quartz_bricks:"Quartz Bricks",quartz_ore:"Nether Quartz Ore",quartz_stairs:"Quartz Stairs",rabbit:"Raw Rabbit",rabbit_foot:"Rabbit's Foot",rabbit_hide:"Rabbit Hide",rabbit_spawn_egg:"Rabbit Spawn Egg",rabbit_stew:"Rabbit Stew",rail:"Rail",raiser_armor_trim_smithing_template:"Raiser Armor Trim Smithing Template",rapid_fertilizer:"Rapid Fertilizer",ravager_spawn_egg:"Ravager Spawn Egg",raw_copper:"Raw Copper",raw_copper_block:"Block of Raw Copper",raw_gold:"Raw Gold",raw_gold_block:"Block of Raw Gold",raw_iron:"Raw Iron",raw_iron_block:"Block of Raw Iron",recovery_compass:"Recovery Compass",red_candle:"Red Candle",red_candle_cake:"Cake with Red Candle",red_carpet:"Red Carpet",red_concrete:"Red Concrete",red_dye:"Red Dye",red_flower:"Flower",red_glazed_terracotta:"Red Glazed Terracotta",red_mushroom:"Red Mushroom",red_mushroom_block:"Red Mushroom Block",red_nether_brick:"Red Nether Brick",red_nether_brick_stairs:"Red Nether Brick Stairs",red_sandstone:"Red Sandstone",red_sandstone_stairs:"Red Sandstone Stairs",red_shulker_box:"Red Shulker Box",red_wool:"Red Wool",redstone:"Redstone Dust",redstone_block:"Block of Redstone",redstone_lamp:"Redstone Lamp",redstone_ore:"Redstone Ore",redstone_torch:"Redstone Torch",redstone_wire:"Redstone Dust",reinforced_deepslate:"Reinforced Deepslate",repeater:"Redstone Repeater",repeating_command_block:"Repeating Command Block",reserved6:"Reserved6",respawn_anchor:"Respawn Anchor",rib_armor_trim_smithing_template:"Rib Armor Trim Smithing Template",rotten_flesh:"Rotten Flesh",saddle:"Saddle",salmon:"Raw Salmon",salmon_bucket:"Salmon Bucket",salmon_spawn_egg:"Salmon Spawn Egg",sand:"Sand",sandstone:"Sandstone",sandstone_stairs:"Sandstone Stairs",sapling:"Sapling",scaffolding:"Scaffolding",sculk:"Sculk",sculk_catalyst:"Sculk Catalyst",sculk_sensor:"Sculk Sensor",sculk_shrieker:"Sculk Shrieker",sculk_vein:"Sculk Vein",scute:"Scute",sea_lantern:"Sea Lantern",sea_pickle:"Sea Pickle",seagrass:"Seagrass",sentry_armor_trim_smithing_template:"Sentry Armor Trim Smithing Template",shaper_armor_trim_smithing_template:"Shaper Armor Trim Smithing Template",sheaf_pottery_sherd:"Sheaf Pottery Sherd",shears:"Shears",sheep_spawn_egg:"Sheep Spawn Egg",shelter_pottery_sherd:"Shelter Pottery Sherd",shield:"Shield",shroomlight:"Shroomlight",shulker_box:"Shulker Box",shulker_shell:"Shulker Shell",shulker_spawn_egg:"Shulker Spawn Egg",silence_armor_trim_smithing_template:"Silence Armor Trim Smithing Template",silver_glazed_terracotta:"Silver Glazed Terracotta",silverfish_spawn_egg:"Silverfish Spawn Egg",skeleton_horse_spawn_egg:"Skeleton Horse Spawn Egg",skeleton_spawn_egg:"Skeleton Spawn Egg",skull:"Skull",skull_banner_pattern:"Skull Banner Pattern",skull_pottery_sherd:"Skull Pottery Sherd",slime:"Slime Block",slime_ball:"Slimeball",slime_spawn_egg:"Slime Spawn Egg",small_amethyst_bud:"Small Amethyst Bud",small_dripleaf_block:"Small Dripleaf",smithing_table:"Smithing Table",smoker:"Smoker",smooth_basalt:"Smooth Basalt",smooth_quartz_stairs:"Smooth Quartz Stairs",smooth_red_sandstone_stairs:"Smooth Red Sandstone Stairs",smooth_sandstone_stairs:"Smooth Sandstone Stairs",smooth_stone:"Smooth Stone",sniffer_egg:"Sniffer Egg",sniffer_spawn_egg:"Sniffer Spawn Egg",snort_pottery_sherd:"Snort Pottery Sherd",snout_armor_trim_smithing_template:"Snout Armor Trim Smithing Template",snow:"Snow",snow_golem_spawn_egg:"Snow Golem Spawn Egg",snow_layer:"Top Snow",snowball:"Snowball",soul_campfire:"Soul Campfire",soul_fire:"Soul Fire",soul_lantern:"Soul Lantern",soul_sand:"Soul Sand",soul_soil:"Soul Soil",soul_torch:"Soul Torch",sparkler:"Sparkler",spawn_egg:"Spawn Egg",spider_eye:"Spider Eye",spider_spawn_egg:"Spider Spawn Egg",spire_armor_trim_smithing_template:"Spire Armor Trim Smithing Template",splash_potion:"Splash Potion",sponge:"Sponge",spore_blossom:"Spore Blossom",spruce_boat:"Spruce Boat",spruce_button:"Spruce Button",spruce_chest_boat:"Spruce Chest Boat",spruce_door:"Spruce Door",spruce_fence:"Spruce Fence",spruce_fence_gate:"Spruce Fence Gate",spruce_hanging_sign:"Spruce Hanging Sign",spruce_log:"Spruce Log",spruce_pressure_plate:"Spruce Pressure Plate",spruce_sign:"Spruce Sign",spruce_stairs:"Spruce Stairs",spruce_standing_sign:"Spruce Sign",spruce_trapdoor:"Spruce Trapdoor",spruce_wall_sign:"Spruce Wall Sign",spyglass:"Spyglass",squid_spawn_egg:"Squid Spawn Egg",stained_glass:"Stained Glass",stained_glass_pane:"Stained Glass Pane",stained_hardened_clay:"Terracotta",standing_banner:"Banner",standing_sign:"Sign",stick:"Stick",sticky_piston:"Sticky Piston",stone:"Stone",stone_axe:"Stone Axe",stone_block_slab:"Stone Block Slab",stone_block_slab2:"Stone Block Slab2",stone_block_slab3:"Stone Block Slab3",stone_block_slab4:"Stone Block Slab4",stone_brick_stairs:"Stone Brick Stairs",stone_button:"Stone Button",stone_hoe:"Stone Hoe",stone_pickaxe:"Stone Pickaxe",stone_pressure_plate:"Stone Pressure Plate",stone_shovel:"Stone Shovel",stone_stairs:"Cobblestone Stairs",stone_sword:"Stone Sword",stonebrick:"Stone Bricks",stonecutter:"Stonecutter",stonecutter_block:"Stonecutter",stray_spawn_egg:"Stray Spawn Egg",strider_spawn_egg:"Strider Spawn Egg",stripped_acacia_log:"Stripped Acacia Log",stripped_bamboo_block:"Block of Stripped Bamboo",stripped_birch_log:"Stripped Birch Log",stripped_cherry_log:"Stripped Cherry Log",stripped_cherry_wood:"Stripped Cherry Wood",stripped_crimson_hyphae:"Stripped Crimson Hyphae",stripped_crimson_stem:"Stripped Crimson Stem",stripped_dark_oak_log:"Stripped Dark Oak Log",stripped_jungle_log:"Stripped Jungle Log",stripped_mangrove_log:"Stripped Mangrove Log",stripped_mangrove_wood:"Stripped Mangrove Wood",stripped_oak_log:"Stripped Oak Log",stripped_spruce_log:"Stripped Spruce Log",stripped_warped_hyphae:"Stripped Warped Hyphae",stripped_warped_stem:"Stripped Warped Stem",structure_block:"Structure Block",structure_void:"Structure Void",sugar:"Sugar",sugar_cane:"Sugar Cane",suspicious_gravel:"Suspicious Gravel",suspicious_sand:"Suspicious Sand",suspicious_stew:"Suspicious Stew",sweet_berries:"Sweet Berries",sweet_berry_bush:"Sweet Berry Bush",tadpole_bucket:"Tadpole Bucket",tadpole_spawn_egg:"Tadpole Spawn Egg",tallgrass:"Grass",target:"Target",tide_armor_trim_smithing_template:"Tide Armor Trim Smithing Template",tinted_glass:"Tinted Glass",tnt:"TNT",tnt_minecart:"Minecart with TNT",torch:"Torch",torchflower:"Torchflower",torchflower_crop:"Torchflower Crop",torchflower_seeds:"Torchflower Seeds",totem_of_undying:"Totem Of Undying",trader_llama_spawn_egg:"Trader Llama Spawn Egg",trapdoor:"Oak Trapdoor",trapped_chest:"Trapped Chest",trident:"Trident",trip_wire:"Trip Wire",tripwire_hook:"Tripwire Hook",tropical_fish:"Tropical Fish",tropical_fish_bucket:"Tropical Fish Bucket",tropical_fish_spawn_egg:"Tropical Fish Spawn Egg",tube_coral:"Tube Coral",tuff:"Tuff",turtle_egg:"Sea Turtle Egg",turtle_helmet:"Turtle Shell",turtle_spawn_egg:"Turtle Spawn Egg",twisting_vines:"Twisting Vines",underwater_torch:"Underwater Torch",undyed_shulker_box:"Undyed Shulker Box",unknown:"Unknown",unlit_redstone_torch:"Redstone Torch",unpowered_comparator:"Unpowered Comparator",unpowered_repeater:"Unpowered Repeater",verdant_froglight:"Verdant Froglight",vex_armor_trim_smithing_template:"Vex Armor Trim Smithing Template",vex_spawn_egg:"Vex Spawn Egg",villager_spawn_egg:"Villager Spawn Egg",vindicator_spawn_egg:"Vindicator Spawn Egg",vine:"Vines",wall_banner:"Wall Banner",wall_sign:"Wall Sign",wandering_trader_spawn_egg:"Wandering Trader Spawn Egg",ward_armor_trim_smithing_template:"Ward Armor Trim Smithing Template",warden_spawn_egg:"Warden Spawn Egg",warped_button:"Warped Button",warped_door:"Warped Door",warped_double_slab:"Warped Slab",warped_fence:"Warped Fence",warped_fence_gate:"Warped Fence Gate",warped_fungus:"Warped Fungus",warped_fungus_on_a_stick:"Warped Fungus on a Stick",warped_hanging_sign:"Warped Hanging Sign",warped_hyphae:"Warped Hyphae",warped_nylium:"Warped Nylium",warped_planks:"Warped Planks",warped_pressure_plate:"Warped Pressure Plate",warped_roots:"Warped Roots",warped_sign:"Warped Sign",warped_slab:"Warped Slab",warped_stairs:"Warped Stairs",warped_standing_sign:"Warped Sign",warped_stem:"Warped Stem",warped_trapdoor:"Warped Trapdoor",warped_wall_sign:"Warped Sign",warped_wart_block:"Warped Wart Block",water:"Water",water_bucket:"Water Bucket",waterlily:"Lily Pad",waxed_copper:"Waxed Block of Copper",waxed_cut_copper:"Waxed Cut Copper",waxed_cut_copper_slab:"Waxed Cut Copper Slab",waxed_cut_copper_stairs:"Waxed Cut Copper Stairs",waxed_double_cut_copper_slab:"Waxed Double Cut Copper Slab",waxed_exposed_copper:"Waxed Exposed Copper",waxed_exposed_cut_copper:"Waxed Exposed Cut Copper",waxed_exposed_cut_copper_slab:"Waxed Exposed Cut Copper Slab",waxed_exposed_cut_copper_stairs:"Waxed Exposed Cut Copper Stairs",waxed_exposed_double_cut_copper_slab:"Waxed Exposed Double Cut Copper Slab",waxed_oxidized_copper:"Waxed Oxidized Copper",waxed_oxidized_cut_copper:"Waxed Oxidized Cut Copper",waxed_oxidized_cut_copper_slab:"Waxed Oxidized Cut Copper Slab",waxed_oxidized_cut_copper_stairs:"Waxed Oxidized Cut Copper Stairs",waxed_oxidized_double_cut_copper_slab:"Waxed Oxidized Double Cut Copper Slab",waxed_weathered_copper:"Waxed Weathered Copper",waxed_weathered_cut_copper:"Waxed Weathered Cut Copper",waxed_weathered_cut_copper_slab:"Waxed Weathered Cut Copper Slab",waxed_weathered_cut_copper_stairs:"Waxed Weathered Cut Copper Stairs",waxed_weathered_double_cut_copper_slab:"Waxed Weathered Double Cut Copper Slab",wayfinder_armor_trim_smithing_template:"Wayfinder Armor Trim Smithing Template",weathered_copper:"Weathered Copper",weathered_cut_copper:"Weathered Cut Copper",weathered_cut_copper_slab:"Weathered Cut Copper Slab",weathered_cut_copper_stairs:"Weathered Cut Copper Stairs",weathered_double_cut_copper_slab:"Weathered Double Cut Copper Slab",web:"Cobweb",weeping_vines:"Weeping Vines",wheat:"Wheat",wheat_seeds:"Seeds",white_candle:"White Candle",white_candle_cake:"Cake with White Candle",white_carpet:"White Carpet",white_concrete:"White Concrete",white_dye:"White Dye",white_glazed_terracotta:"White Glazed Terracotta",white_shulker_box:"White Shulker Box",white_wool:"White Wool",wild_armor_trim_smithing_template:"Wild Armor Trim Smithing Template",witch_spawn_egg:"Witch Spawn Egg",wither_rose:"Wither Rose",wither_skeleton_spawn_egg:"Wither Skeleton Spawn Egg",wither_spawn_egg:"Wither Spawn Egg",wolf_spawn_egg:"Wolf Spawn Egg",wood:"Wood",wooden_axe:"Wooden Axe",wooden_button:"Oak Button",wooden_door:"Oak Door",wooden_hoe:"Wooden Hoe",wooden_pickaxe:"Wooden Pickaxe",wooden_pressure_plate:"Oak Pressure Plate",wooden_shovel:"Wooden Shovel",wooden_slab:"Wood Slab",wooden_sword:"Wooden Sword",wool:"Wool",writable_book:"Book & Quill",written_book:"Written Book",yellow_candle:"Yellow Candle",yellow_candle_cake:"Cake with Yellow Candle",yellow_carpet:"Yellow Carpet",yellow_concrete:"Yellow Concrete",yellow_dye:"Yellow Dye",yellow_flower:"Flower",yellow_glazed_terracotta:"Yellow Glazed Terracotta",yellow_shulker_box:"Yellow Shulker Box",yellow_wool:"Yellow Wool",zoglin_spawn_egg:"Zoglin Spawn Egg",zombie_horse_spawn_egg:"Zombie Horse Spawn Egg",zombie_pigman_spawn_egg:"Zombie Pigman Spawn Egg",zombie_spawn_egg:"Zombie Spawn Egg",zombie_villager_spawn_egg:"Zombie Villager Spawn Egg"}};const I=D({name:"suggestion-id-list",props:{value:String,data_type:String,placeholder:String,multiple:{type:Boolean,default:!0}},data:()=>({}),computed:{options(){let e=H[this.data_type]||{};return Object.assign({"":"-",custom:"Custom ID"},e)},select_value(){let e=H[this.data_type]||{};return!e||e[this.value]?this.value:"custom"}},methods:{getOptions(){},openAddMenu(e){let t=[];for(let e in data)t.push({id:e,name:data[e],icon:"label",click:()=>{this.value&&0!=this.multiple?this.value+=", "+e:this.value=e,this.$emit("input",this.value)}});new Menu(t,{searchable:!0}).open(this.$refs.input)}}},T,[],!1,(function(e){var t=a(635);t.__inject__&&t.__inject__(e);var n=a(90);n.__inject__&&n.__inject__(e)}),"09e61bde","257abb12").exports,X={installed:!1,initialized:!1,icon:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJub25lIj4NCjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xODEuNTM0IDI1NC4yNTJDMTg1LjU2NiAyNTUuODIzIDE5MC4xNjQgMjU1LjcyMiAxOTQuMjM0IDI1My43NjRMMjQ2Ljk0IDIyOC40MDNDMjUyLjQ3OCAyMjUuNzM4IDI1NiAyMjAuMTMyIDI1NiAyMTMuOTgzVjQyLjAxODFDMjU2IDM1Ljg2ODkgMjUyLjQ3OCAzMC4yNjM4IDI0Ni45NCAyNy41OTg4TDE5NC4yMzQgMi4yMzY4MUMxODguODkzIC0wLjMzMzEzMiAxODIuNjQyIDAuMjk2MzQ0IDE3Ny45NTUgMy43MDQxOEMxNzcuMjg1IDQuMTkxIDE3Ni42NDcgNC43MzQ1NCAxNzYuMDQ5IDUuMzMzNTRMNzUuMTQ5IDk3LjM4NjJMMzEuMTk5MiA2NC4wMjQ3QzI3LjEwNzkgNjAuOTE5MSAyMS4zODUzIDYxLjE3MzUgMTcuNTg1NSA2NC42M0wzLjQ4OTM2IDc3LjQ1MjVDLTEuMTU4NTMgODEuNjgwNSAtMS4xNjM4NiA4OC45OTI2IDMuNDc3ODUgOTMuMjI3NEw0MS41OTI2IDEyOEwzLjQ3Nzg1IDE2Mi43NzNDLTEuMTYzODYgMTY3LjAwOCAtMS4xNTg1MyAxNzQuMzIgMy40ODkzNiAxNzguNTQ4TDE3LjU4NTUgMTkxLjM3QzIxLjM4NTMgMTk0LjgyNyAyNy4xMDc5IDE5NS4wODEgMzEuMTk5MiAxOTEuOTc2TDc1LjE0OSAxNTguNjE0TDE3Ni4wNDkgMjUwLjY2N0MxNzcuNjQ1IDI1Mi4yNjQgMTc5LjUxOSAyNTMuNDY3IDE4MS41MzQgMjU0LjI1MlpNMTkyLjAzOSA2OS44ODUzTDExNS40NzkgMTI4TDE5Mi4wMzkgMTg2LjExNVY2OS44ODUzWiIgZmlsbD0id2hpdGUiLz4NCjwvbWFzaz4NCjxnIG1hc2s9InVybCgjbWFzazApIj4NCjxwYXRoIGQ9Ik0yNDYuOTQgMjcuNjM4M0wxOTQuMTkzIDIuMjQxMzhDMTg4LjA4OCAtMC42OTgzMDIgMTgwLjc5MSAwLjU0MTcyMSAxNzUuOTk5IDUuMzMzMzJMMy4zMjM3MSAxNjIuNzczQy0xLjMyMDgyIDE2Ny4wMDggLTEuMzE1NDggMTc0LjMyIDMuMzM1MjMgMTc4LjU0OEwxNy40Mzk5IDE5MS4zN0MyMS4yNDIxIDE5NC44MjcgMjYuOTY4MiAxOTUuMDgxIDMxLjA2MTkgMTkxLjk3NkwyMzkuMDAzIDM0LjIyNjlDMjQ1Ljk3OSAyOC45MzQ3IDI1NS45OTkgMzMuOTEwMyAyNTUuOTk5IDQyLjY2NjdWNDIuMDU0M0MyNTUuOTk5IDM1LjkwNzggMjUyLjQ3OCAzMC4zMDQ3IDI0Ni45NCAyNy42MzgzWiIgZmlsbD0iIzAwNjVBOSIvPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPg0KPHBhdGggZD0iTTI0Ni45NCAyMjguMzYyTDE5NC4xOTMgMjUzLjc1OUMxODguMDg4IDI1Ni42OTggMTgwLjc5MSAyNTUuNDU4IDE3NS45OTkgMjUwLjY2N0wzLjMyMzcxIDkzLjIyNzJDLTEuMzIwODIgODguOTkyNSAtMS4zMTU0OCA4MS42ODAyIDMuMzM1MjMgNzcuNDUyM0wxNy40Mzk5IDY0LjYyOThDMjEuMjQyMSA2MS4xNzMzIDI2Ljk2ODIgNjAuOTE4OCAzMS4wNjE5IDY0LjAyNDVMMjM5LjAwMyAyMjEuNzczQzI0NS45NzkgMjI3LjA2NSAyNTUuOTk5IDIyMi4wOSAyNTUuOTk5IDIxMy4zMzNWMjEzLjk0NkMyNTUuOTk5IDIyMC4wOTIgMjUyLjQ3OCAyMjUuNjk1IDI0Ni45NCAyMjguMzYyWiIgZmlsbD0iIzAwN0FDQyIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZCkiPg0KPHBhdGggZD0iTTE5NC4xOTYgMjUzLjc2M0MxODguMDg5IDI1Ni43IDE4MC43OTIgMjU1LjQ1OSAxNzYgMjUwLjY2N0MxODEuOTA0IDI1Ni41NzEgMTkyIDI1Mi4zODkgMTkyIDI0NC4wMzlWMTEuOTYwNkMxOTIgMy42MTA1NyAxODEuOTA0IC0wLjU3MTE3NSAxNzYgNS4zMzMyMUMxODAuNzkyIDAuNTQxMTY2IDE4OC4wODkgLTAuNzAwNjA3IDE5NC4xOTYgMi4yMzY0OEwyNDYuOTM0IDI3LjU5ODVDMjUyLjQ3NiAzMC4yNjM1IDI1NiAzNS44Njg2IDI1NiA0Mi4wMTc4VjIxMy45ODNDMjU2IDIyMC4xMzIgMjUyLjQ3NiAyMjUuNzM3IDI0Ni45MzQgMjI4LjQwMkwxOTQuMTk2IDI1My43NjNaIiBmaWxsPSIjMUY5Q0YwIi8+DQo8L2c+DQo8ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6b3ZlcmxheSIgb3BhY2l0eT0iMC4yNSI+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS4zNzggMjU0LjI1MkMxODUuNDEgMjU1LjgyMiAxOTAuMDA4IDI1NS43MjIgMTk0LjA3NyAyNTMuNzY0TDI0Ni43ODMgMjI4LjQwMkMyNTIuMzIyIDIyNS43MzcgMjU1Ljg0NCAyMjAuMTMyIDI1NS44NDQgMjEzLjk4M1Y0Mi4wMTc5QzI1NS44NDQgMzUuODY4NyAyNTIuMzIyIDMwLjI2MzYgMjQ2Ljc4NCAyNy41OTg2TDE5NC4wNzcgMi4yMzY2NUMxODguNzM3IC0wLjMzMzI5OSAxODIuNDg2IDAuMjk2MTc3IDE3Ny43OTggMy43MDQwMUMxNzcuMTI5IDQuMTkwODMgMTc2LjQ5MSA0LjczNDM3IDE3NS44OTIgNS4zMzMzN0w3NC45OTI3IDk3LjM4NkwzMS4wNDI5IDY0LjAyNDVDMjYuOTUxNyA2MC45MTg5IDIxLjIyOSA2MS4xNzM0IDE3LjQyOTIgNjQuNjI5OEwzLjMzMzExIDc3LjQ1MjNDLTEuMzE0NzggODEuNjgwMyAtMS4zMjAxMSA4OC45OTI1IDMuMzIxNiA5My4yMjczTDQxLjQzNjQgMTI4TDMuMzIxNiAxNjIuNzczQy0xLjMyMDExIDE2Ny4wMDggLTEuMzE0NzggMTc0LjMyIDMuMzMzMTEgMTc4LjU0OEwxNy40MjkyIDE5MS4zN0MyMS4yMjkgMTk0LjgyNyAyNi45NTE3IDE5NS4wODEgMzEuMDQyOSAxOTEuOTc2TDc0Ljk5MjcgMTU4LjYxNEwxNzUuODkyIDI1MC42NjdDMTc3LjQ4OCAyNTIuMjY0IDE3OS4zNjMgMjUzLjQ2NyAxODEuMzc4IDI1NC4yNTJaTTE5MS44ODMgNjkuODg1MUwxMTUuMzIzIDEyOEwxOTEuODgzIDE4Ni4xMTVWNjkuODg1MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4NCjwvZz4NCjwvZz4NCjxkZWZzPg0KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSItMjEuNDg5NiIgeT0iNDAuNTIyNSIgd2lkdGg9IjI5OC44MjIiIGhlaWdodD0iMjM2LjE0OSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQvPg0KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPg0KPGZlQmxlbmQgbW9kZT0ib3ZlcmxheSIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2QiIHg9IjE1NC42NjciIHk9Ii0yMC42NzM1IiB3aWR0aD0iMTIyLjY2NyIgaGVpZ2h0PSIyOTcuMzQ3IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4NCjxmZU9mZnNldC8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMC42NjY3Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+DQo8L2ZpbHRlcj4NCjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjEyNy44NDQiIHkxPSIwLjY1OTk4OCIgeDI9IjEyNy44NDQiIHkyPSIyNTUuMzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8L2RlZnM+DQo8L3N2Zz4=",async open(e,t){if(!X.initialized){let e=a(81);await new Promise((t=>{e.exec("code --version").on("close",(a=>{a||(X.installed=!0,X.launch=(t,a)=>{let n=`code -n "${t}" "${a}"`;e.exec(n)},t())}))})),X.initialized=!0}X.launch(e,t)},launch(){Blockbench.openLink("https://code.visualstudio.com")}},L={name:"item-wizard-dialog",components:{Export:P,ColorPicker:N,"hud-slider":j,"suggestion-id-list":I,"select-input":Vue.options.components["select-input"]},data:()=>({open_page:"preset",VSCode:X,pages:z,presets:w,edition_options:{bedrock:"Bedrock",preview:"Bedrock Preview",edu:"Education Edition"},inventory_categories:{construction:"Construction",equipment:"Equipment",items:"Items",nature:"Nature"},inventory_groups:{construction:{none:"None","itemGroup.name.planks":"Planks","itemGroup.name.walls":"Walls","itemGroup.name.fence":"Fences","itemGroup.name.fenceGate":"Fence Gates","itemGroup.name.stairs":"Stairs","itemGroup.name.door":"Doors","itemGroup.name.glass":"Glass","itemGroup.name.glassPane":"Glass Panes","itemGroup.name.slab":"Slabs","itemGroup.name.stoneBrick":"Decorative Stone","itemGroup.name.sandstone":"Sandstone","itemGroup.name.wool":"Wool","itemGroup.name.woolCarpet":"Wool Carpet","itemGroup.name.concretePowder":"Concrete Powder","itemGroup.name.concrete":"Concrete","itemGroup.name.stainedClay":"Terracotta","itemGroup.name.glazedTerracotta":"Glazed Terracottas","itemGroup.name.permission":"Permission Blocks"},equipment:{none:"None","itemGroup.name.helmet":"Helmets","itemGroup.name.chestplate":"Chestplates","itemGroup.name.leggings":"Leggings","itemGroup.name.boots":"Boots","itemGroup.name.sword":"Swords","itemGroup.name.axe":"Axes","itemGroup.name.pickaxe":"Pickaxes","itemGroup.name.shovel":"Shovels","itemGroup.name.hoe":"Hoes","itemGroup.name.arrow":"Arrows","itemGroup.name.cookedFood":"Cooked Food","itemGroup.name.miscFood":"Miscellaneous Foods","itemGroup.name.goatHorn":"Goat Horns","itemGroup.name.horseArmor":"Horse Armor","itemGroup.name.potion":"Potions","itemGroup.name.splashPotion":"Splash Potions","itemGroup.name.lingeringPotion":"Lingering Potions"},items:{none:"None","itemGroup.name.bed":"Beds","itemGroup.name.candles":"Candles","itemGroup.name.anvil":"Anvils","itemGroup.name.chest":"Chests","itemGroup.name.shulkerBox":"Shulker Boxes","itemGroup.name.record":"Records","itemGroup.name.sign":"Signs","itemGroup.name.skull":"Mob Skulls","itemGroup.name.buttons":"Buttons","itemGroup.name.boat":"Boats","itemGroup.name.rail":"Rails","itemGroup.name.minecart":"Minecarts","itemGroup.name.pressurePlate":"Pressure Plates","itemGroup.name.trapdoor":"Trapdoors","itemGroup.name.enchantedBook":"Enchanted Books","itemGroup.name.banner_pattern":"Banner Patterns","itemGroup.name.banner":"Banners","itemGroup.name.firework":"Fireworks","itemGroup.name.fireworkStars":"Firework Charges","itemGroup.name.chalkboard":"Chalkboards"},nature:{none:"None","itemGroup.name.dye":"Dyes","itemGroup.name.ore":"Ores","itemGroup.name.stone":"Stone","itemGroup.name.log":"Logs","itemGroup.name.wood":"Woods","itemGroup.name.leaves":"Leaves","itemGroup.name.sapling":"Saplings","itemGroup.name.seed":"Seeds","itemGroup.name.crop":"Crops","itemGroup.name.grass":"Ground Cover","itemGroup.name.flower":"Flowers","itemGroup.name.rawFood":"Raw Food","itemGroup.name.mushroom":"Mushrooms","itemGroup.name.monsterStoneEgg":"Infested Stone","itemGroup.name.mobEgg":"Mob Eggs","itemGroup.name.coral":"Coral Blocks","itemGroup.name.coral_decorations":"Coral Decorations","itemGroup.name.sculk":"Sculk","itemGroup.name.netherWartBlock":"Nether Warts"}},digger_block_options:{unset:"Unset",wood:"Wood",stone:"Stone",metal:"Metal",dirt:"Dirt",sand:"Sand",gravel:"Gravel",grass:"Grass",snow:"Snow",custom:"Custom"},wearable_options:{"slot.armor.head":"Head","slot.armor.chest":"Torso","slot.armor.legs":"Legs","slot.armor.feet":"Feet","slot.weapon.offhand":"Offhand","slot.saddle":"Saddle","slot.armor":"Armor (Horse)","slot.chest":"Chest (Donkey)"},enchantable_slot_options:{armor_feet:"Armor Feet",armor_torso:"Armor Torso",armor_head:"Armor Head",armor_legs:"Armor Legs",axe:"Axe",bow:"Bow",cosmetic_head:"Head Cosmetic",crossbow:"Crossbow",elytra:"Elytra",fishing_rod:"Fishing Rod",flintsteel:"Flint And Steel",hoe:"Hoe",pickaxe:"Pickaxe",shears:"Shears",shield:"Shield",shovel:"Shovel",sword:"Sword",all:"All"},food_animation_options:{eat:"Food",drink:"Drink"},preset_search_term:"",has_customized_id:!1,resource_pack_path:null,behavior_pack_path:null,bedrock_installed:!1,current_tab_model:"",past_preset:!1,form:{edition:localStorage.getItem("minecraft_wizard.selected_edition")||"bedrock",identifier:"",display_name:"",category:"equipment",item_group:"none",preset:"iron_ingot",stack_size:64,attachable_model:!1,use_current_model:!1,glint:!1,melee_enabled:!1,melee_damage:1,digger_enabled:!1,digger_blocks:[],wearable_enabled:!1,wearable_slot:"slot.armor.head",wearable_protection:0,enchantable_enabled:!1,enchantable_slot:"sword",enchantable_value:1,durability_enabled:!1,durability_max:0,repair_items:"",repair_amount:25,food_enabled:!1,food_nutrition:2,food_saturation_modifier:.6,food_duration:1.6,food_animation:"eat",food_always_eat:!1,fuel_enabled:!1,fuel_duration:1,place_entity_enabled:!1,place_entity_id:"",cooldown_enabled:!1,cooldown_duration:1,cooldown_category:"",export_mode:isApp?"folder":"mcaddon",pack_name:"",pack_authors:"",pack_icon:"",integrate_pack:null}}),computed:{identifier_error(){let e=this.form.identifier;return e?e.match(/^minecraft:/)?"Use a different namespace than 'minecraft:'":e.match(/[A-Z]/)?"Identifiers cannot contain capital letters":e.match(/^\d/)?"Identifiers cannot start with a number":e.match(/[^a-z0-9-_.:]/)?"Identifiers cannot contain spaces or special characters":e.match(/\w:\w/)?"":"Identifiers must start with a namespace, separated by a colon":""}},methods:{selectPreset(e){if(this.past_preset&&!confirm("Are you sure you want to go back and apply this preset? It may override some of the values that you have set."))return;this.past_preset=!1,this.form.preset=e;let t=this.presets[e];this.form.attachable_model=!1,this.form.use_current_model=!1,this.form.glint=!1,this.form.melee_enabled=!1,this.form.melee_damage=1,this.form.digger_enabled=!1,this.form.digger_blocks=[],this.form.wearable_enabled=!1,this.form.wearable_slot="slot.armor.head",this.form.wearable_protection=0,this.form.durability_enabled=!1,this.form.durability_max=0,this.form.repair_items="",this.form.repair_amount=25,this.form.food_enabled=!1,this.form.food_nutrition=2,this.form.food_saturation_modifier=.6,this.form.food_duration=1.6,this.form.food_animation="eat",this.form.food_always_eat=!1,this.form.fuel_enabled=!1,this.form.fuel_duration=1,this.form.place_entity_enabled=!1,this.form.place_entity_id="",this.form.cooldown_enabled=!1,this.form.cooldown_duration=1,this.form.cooldown_category="";for(let e in t)null!=this.form[e]&&("digger_blocks"==e?(this.form.digger_blocks.empty(),t.digger_blocks.forEach((e=>{let t=Object.assign({uuid:guid(),id:""},e);this.form.digger_blocks.push(t)}))):this.form[e]=t[e])},addDiggerBlock(){this.form.digger_blocks.push({uuid:guid(),type:"unset",id:"",speed:8})},clearUnsetDiggerBlocks(){let e=this.form.digger_blocks.filter((e=>"unset"!=e.type));this.form.digger_blocks.replace(e)},checkPageComplete(){let{form:e}=this;if("metadata"==this.open_page){if(!e.display_name)return Blockbench.showQuickMessage("Please enter a name"),!1;if(!e.identifier||this.identifier_error)return Blockbench.showQuickMessage("Please enter a correct identifier"),!1}else if("preset"==this.open_page){if(!e.preset)return Blockbench.showQuickMessage("Please select an item preset"),!1}else if("export"==this.open_page){if("integrate"==e.export_mode&&!e.integrate_pack)return Blockbench.showQuickMessage("Please select a behavior pack"),!1;if("integrate_mcaddon"==e.export_mode&&!window.ItemWizardProject.previous_mcaddon)return Blockbench.showQuickMessage("Please select an mcaddon file"),!1;if(!e.export_mode.includes("integrate")&&!e.pack_name)return Blockbench.showQuickMessage("Please enter a pack name"),!1;if(!e.export_mode.includes("integrate")&&e.pack_name.match(/[<>:"/\\|?*]/))return Blockbench.showQuickMessage("You cannot use invalid characters in the pack name: "+e.pack_name.match(/[<>:"/\\|?*]/)[0]),!1}return!0},exportPacks(){(async function(e,t){let a=x(),n=isApp&&k(e.edition),o=e.identifier.replace(/^.+:/,""),r=guid(),i=guid(),l=A;if(e.pack_icon){let m=new CanvasFrame(16,16);await m.loadFromURL(e.pack_icon),l=m.canvas.toDataURL()}let s,d,c={authors:e.pack_authors?e.pack_authors.split(/,\s*/):void 0,generated_with:{blockbench_item_wizard:["1.2.4"]}},p=function(e,t){let a=[],n={description:{identifier:e.identifier,menu_category:"hidden"==e.category?void 0:{category:e.category,group:"none"==e.item_group?void 0:e.item_group}},components:{"minecraft:max_stack_size":parseInt(e.stack_size),"minecraft:icon":t.item_filename}};if(e.glint&&(n.components["minecraft:glint"]=!0),e.melee_enabled&&(n.components["minecraft:damage"]=e.melee_damage,e.digger_enabled||(n.components["minecraft:can_destroy_in_creative"]=!1)),e.digger_enabled&&e.digger_blocks.length){let t=[];e.digger_blocks.forEach((e=>{let a={speed:e.speed};"unset"!=e.type&&("custom"==e.type?a.block=e.id:a.block={tags:`query.any_tag('${e.type}')`},t.push(a))})),n.components["minecraft:digger"]={destroy_speeds:t}}if(!e.digger_enabled&&!e.melee_enabled||e.attachable_model&&!e.wearable_enabled||(n.components["minecraft:hand_equipped"]=!0),e.wearable_enabled&&(n.components["minecraft:max_stack_size"]=1,n.components["minecraft:wearable"]={slot:e.wearable_slot,protection:e.wearable_protection}),e.enchantable_enabled&&(n.components["minecraft:enchantable"]={slot:e.enchantable_slot,value:parseInt(e.enchantable_value)}),e.durability_enabled&&(n.components["minecraft:durability"]={max_durability:parseInt(e.durability_max)},e.repair_items)){let t=e.repair_items.split(/[, ]+/);n.components["minecraft:repairable"]={repair_items:[{items:t,repair_amount:Math.floor(e.repair_amount/100*e.durability_max)}]}}return e.food_enabled&&(n.components["minecraft:food"]={nutrition:parseFloat(e.food_nutrition),saturation_modifier:parseFloat(e.food_saturation_modifier),can_always_eat:!!e.food_always_eat||void 0},n.components["minecraft:use_modifiers"]={movement_modifier:.32,use_duration:parseFloat(e.food_duration)},n.components["minecraft:use_animation"]=e.food_animation),e.fuel_enabled&&(n.components["minecraft:fuel"]={duration:10*parseFloat(e.fuel_duration)}),e.place_entity_enabled&&e.place_entity_id&&(n.components["minecraft:entity_placer"]={entity:e.place_entity_id}),e.cooldown_enabled&&(n.components["minecraft:cooldown"]={duration:e.cooldown_duration,category:e.cooldown_category||"item_wizard"}),a.push({name:`items/${t.item_filename}.item.json`,content:compileJSON({format_version:"1.20.50","minecraft:item":n})}),a.push({name:"manifest.json",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+" Behavior Pack",uuid:t.bp_uuid||guid(),version:[1,0,0],min_engine_version:[1,20,0]},metadata:t.pack_metadata,modules:[{description:"Behavior",version:[1,0,0],uuid:guid(),type:"data"}],dependencies:[{uuid:t.rp_uuid,version:[1,0,0]}]})}),a.push({name:"pack_icon.png",setup_file:!0,type:"image",content:t.pack_icon}),a}(e,{item_filename:o,rp_uuid:r,bp_uuid:i,pack_icon:l,pack_metadata:c}),u=await async function(e,t){let a,n,o=[],r=w[e.preset]||w.iron_ingot,i=r.texture,l=r.icon;if(window.ItemWizardProject.project&&(a=ModelProject.all.find((e=>e.uuid==window.ItemWizardProject.project))),window.ItemWizardProject.icon_project&&(n=ModelProject.all.find((e=>e.uuid==window.ItemWizardProject.icon_project))),n&&(l=n.textures[0].getDataURL()),e.attachable_model||e.wearable_enabled){let n=r.model;e.use_current_model&&Project&&!a&&(n=Codecs.bedrock.compile({raw:!0})["minecraft:geometry"][0],Project.model_identifier=t.item_filename,Texture.all.length&&(i=Texture.getDefault().getDataURL())),a&&(a.select(),n=Codecs.bedrock.compile({raw:!0})["minecraft:geometry"][0],a.textures[0]&&(i=a.textures[0].getDataURL())),n.description.identifier="geometry."+t.item_filename;let l={format_version:"1.19.0","minecraft:geometry":[n]};window.ItemWizardProject.model=l,o.push({name:`models/entity/attachable/${t.item_filename}.geo.json`,model_file:!0,overwrite:!1,content:compileJSON(l)})}if(o.push({name:"textures/item_texture.json",merge:!0,content:compileJSON({texture_data:{[t.item_filename]:{textures:`textures/items/${t.item_filename}.png`}}})}),e.attachable_model||e.wearable_enabled){let n={identifier:e.identifier,render_controllers:[e.wearable_enabled?"controller.render.armor":"controller.render.item_default"],materials:{default:e.glint?"entity_alphatest_glint":"entity_alphatest",enchanted:"entity_alphatest_glint"},textures:{default:`textures/entity/attachable/${t.item_filename}`,enchanted:"textures/misc/enchanted_item_glint"},geometry:{default:"geometry."+t.item_filename},animations:r.animations?{first_person_hold:`animation.${t.item_filename}.first_person_hold`,third_person_hold:`animation.${t.item_filename}.third_person_hold`}:void 0,scripts:r.animations?{animate:[{first_person_hold:"c.is_first_person"},{third_person_hold:"!c.is_first_person"}]}:void 0};if(o.push({name:`attachables/${t.item_filename}.attachable.json`,content:compileJSON({format_version:"1.10.0","minecraft:attachable":{description:n}})}),r.animations){let e={format_version:"1.8.0",animations:{[`animation.${t.item_filename}.first_person_hold`]:r.animations.first_person_hold,[`animation.${t.item_filename}.third_person_hold`]:r.animations.third_person_hold}};a&&(e=Animator.buildFile()),o.push({name:`animations/attachables/${t.item_filename}.animation.json`,content:compileJSON(e)}),window.ItemWizardProject.animation=e}window.ItemWizardProject.texture=i,o.push({name:`textures/entity/attachable/${t.item_filename}.png`,type:"image",texture_file:!0,overwrite:!1,content:i})}window.ItemWizardProject.icon_texture=l,o.push({name:`textures/items/${t.item_filename}.png`,type:"image",texture_file:!0,overwrite:!1,content:l});let s=[`item.${e.identifier}=${e.display_name}`];return o.push({name:"texts/en_US.lang",merge:!0,content:s.join("\n")}),o.push({name:"manifest.json",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+" Resource Pack",uuid:t.rp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:e.pack_name,type:"resources",uuid:guid(),version:[1,0,0]}],dependencies:t.bp_uuid?[{uuid:t.bp_uuid,version:[1,0,0]}]:void 0})}),o.push({name:"pack_icon.png",setup_file:!0,type:"image",content:t.pack_icon}),o}(e,{item_filename:o,rp_uuid:r,bp_uuid:i,pack_icon:l,pack_metadata:c});if("folder"==e.export_mode){s=PathModule.join(n,"development_behavior_packs",e.pack_name);try{a.readdirSync(s)}catch(g){a.mkdirSync(s,{recursive:!0})}d=PathModule.join(n,"development_resource_packs",e.pack_name);try{a.readdirSync(d)}catch(b){a.mkdirSync(d,{recursive:!0})}}else if("integrate"==e.export_mode){function h(e){try{let t=a.readFileSync(e,{encoding:"utf-8"}),n=autoParseJSON(t,!1);n&&(n.metadata||(n.metadata={}),n.metadata.generated_with||(n.metadata.generated_with={}),n.metadata.generated_with.blockbench_item_wizard instanceof Array==0&&(n.metadata.generated_with.blockbench_item_wizard=[]),n.metadata.generated_with.blockbench_item_wizard.safePush("1.2.4"),a.writeFileSync(e,compileJSON(n),{encoding:"utf-8"}))}catch(e){console.error("Unable to add generator to existing pack manifests",e)}}s=e.integrate_pack.bp_path,d=e.integrate_pack.rp_path,h(PathModule.join(s,"manifest.json")),h(PathModule.join(d,"manifest.json"))}if("folder"==e.export_mode||"integrate"==e.export_mode){function f(t,n){if(t.setup_file&&"integrate"==e.export_mode)return;let o=PathModule.join(n,t.name),r=PathModule.dirname(o);if(0!=t.overwrite||!a.existsSync(o)){if(function(e,t){try{x().readdirSync(e)}catch(t){x().mkdirSync(e,{recursive:!0})}}(r),"integrate"==e.export_mode&&t.merge&&a.existsSync(o)){let e=a.readFileSync(o,"utf-8");if(o.endsWith("json"))try{e=autoParseJSON(e);let a=JSON.parse(t.content);$.extend(!0,a,e),t.content=compileJSON(a)}catch(e){}else o.endsWith("png")||(t.content=e+"\n"+t.content)}Blockbench.writeFile(o,{savetype:t.type,content:t.content}),e.use_current_model&&t.model_file&&Project&&(Project.export_path=o)}}p.forEach((e=>{f(e,s)})),u.forEach((e=>{f(e,d)}))}if("mcaddon"==e.export_mode||"integrate_mcaddon"==e.export_mode){let v,_="integrate_mcaddon"==e.export_mode,y=e.pack_name;if(v=_&&window.ItemWizardProject.previous_mcaddon?window.ItemWizardProject.previous_mcaddon:new JSZip,_){let C=!1;v.forEach(((e,t)=>{if(C)return;let a=e.split("/");a.length>=2&&(y=a[0].replace(/\s*(BP|Behavior|RP|Resources?)$/i,""),C=!0)}))}async function z(e,t){if(e.setup_file&&_)return;let a=t+e.name;if(_&&e.merge&&v.file(a)){let t=await v.file(a).async("string");if(a.endsWith("json"))try{t=autoParseJSON(t);let a=JSON.parse(e.content);$.extend(!0,a,t),e.content=compileJSON(a)}catch(e){}else a.endsWith("png")||(e.content=t+"\n"+e.content)}e.setup_file&&_||("image"==e.type&&(e.content=e.content.split(",")[1]),v.file(a,e.content,{base64:"image"==e.type||void 0,binary:"buffer"==e.type||void 0}))}for(let D of p)await z(D,y+" Behavior/");for(let S of u)await z(S,y+" Resources/");let M=await v.generateAsync({type:"blob"});isApp?Blockbench.export({type:"Minecraft Add-on",extensions:["mcaddon"],name:y,content:M,savetype:"zip"}):Blockbench.showMessageBox({title:"Export Add-on",commands:{download:"Download File"},buttons:["dialog.cancel"]},(e=>{"download"==e&&Blockbench.export({type:"Minecraft Add-on",extensions:["mcaddon"],name:y,content:M,savetype:"zip"})}))}return{rp_path:d,bp_path:s}})(this.form).then((e=>{this.resource_pack_path=e.rp_path,this.behavior_pack_path=e.bp_path,"integrate"===this.form.export_mode?Blockbench.showQuickMessage("Integrated into Resource and Behavior Pack"):(Blockbench.notification("Export Successful","Exported resource and behavior pack"),Blockbench.showQuickMessage("Exported Resource and Behavior Pack"))})),localStorage.setItem("minecraft_wizard.selected_edition",this.form.edition)},openInstallInstructions(e){!function(e){new Dialog({title:"Add-on Installation Instructions",singleButton:!0,width:660,lines:[e.includes("mcaddon")?$('

    To import the packs into Minecraft, open the downloaded .mcaddon file.

    ')[0]:"",$('

    To enable the addon, you need to add it to your Minecraft world.\n\t\t\t\tOpen your world settings and locate the Behavior Packs section.\n\t\t\t\tFind your new pack and activate it.\n\t\t\t\tEnabling the behavior pack will also automatically activate the resource pack.

    \n\t\t\t')[0],Interface.createElement("img",{src:"data:image/png;base64,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",style:"image-rendering: auto; max-width: 100%;",width:"660px"})]}).show()}(e)},switchPage(e){let t=Object.keys(this.pages);if(t.indexOf(e)-t.indexOf(this.open_page)>0){"preset"==this.open_page&&(this.past_preset=!0);let a=t.indexOf(this.open_page);for(;this.open_page!=e;){if(a++,!this.checkPageComplete())return!1;"export"==t[a-1]&&this.exportPacks(),this.open_page=t[a]}}this.open_page=e},nextPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)+1];t?Dialog.open.sidebar.setPage(t):(Dialog.open.close(),function(e,t){let a=e.identifier.replace(/^.+:/,"");if(e.export_mode.includes("mcaddon")||!isApp){let e={no_file:!0,content:JSON.stringify(window.ItemWizardProject.model),path:a+".geo.json"};return loadModelFile({no_file:!0,content:ItemWizardProject.icon_texture,path:`textures/items/${a}.png`}),window.ItemWizardProject.icon_project=Project.uuid,void setTimeout((()=>{loadModelFile(e),setTimeout((()=>{new Texture({name:a}).fromDataURL(window.ItemWizardProject.texture).add(!1),window.ItemWizardProject.project=Project.uuid,window.ItemWizardProject.animation&&Animator.loadFile({path:`animations/attachables/${a}.animation.json`,json:window.ItemWizardProject.animation})}),100)}),20)}Blockbench.read([PathModule.join(t,"textures","items",`${a}.png`)],{},(e=>{loadModelFile(e[0])})),(e.attachable_model||e.wearable_enabled)&&Blockbench.read([PathModule.join(t,"models","entity","attachable",`${a}.geo.json`)],{},(async e=>{loadModelFile(e[0]),await new Promise((e=>setTimeout(e,200))),Project.updateThumbnail(),BarItems.tab_overview.click()}))}(this.form,this.resource_pack_path))},previousPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)-1];t&&Dialog.open.sidebar.setPage(t)},inputDisplayName(){if(this.has_customized_id)return;let e=(settings.username.value||"myname")+":"+this.form.display_name;e=e.toLowerCase().replace(/[- _.]+/g,"_").replace(/[^a-z0-9_:]/g,""),this.form.identifier=e},getThumbnail:e=>`url('${e}')`,getMeleeDamageLabel(e){let t={0:"No Damage",1:"Punch",2:"Wooden Shovel",3:"Wooden Pickaxe",4:"Wooden Axe",5:"Wooden Sword",6:"Stone Sword",7:"Iron Sword",8:"Diamond Sword",9:"Netherite Sword",10:"Kill Cow in one hit",11:"Sharpness II Diamond Sword",12:"Kill Cave Spider in one hit",13:"Sharpness III Netherite Sword",14:"Sharpness IV Netherite Sword",15:"Sharpness V Netherite Sword",20:"Kill Creeper in one hit"};return t[e]?e+" - Comparable to: "+t[e]:e},getProtectionLabel(e){let t={0:"No protection",1:"Leather Helmet",2:"Iron Helmet",3:"Diamond Helmet",4:"Chainmail Leggings",5:"Golden Chestplate",6:"Iron Chestplate",7:"Full Leather Armor",8:"Diamond Chestplate",9:"",10:"",11:"Full Golden Armor",12:"Full Chainmail Armor",13:"",14:"",15:"Full Iron Armor",16:"",17:"",18:"",19:"",20:"Full Diamond Armor"};return t[e]?e+" - Comparable to: "+t[e]:e},getNutritionLabel(e){let t={0:"No nutrition",1:"Potato",2:"Melon Slice",3:"Carrot",4:"Apple",5:"Bread",6:"Cooked Chicken",8:"Steak",10:"Rabbit Stew",14:"Entire Cake",20:"Full Nutrition"};return t[e]?e+" - Comparable to:"+t[e]:e},copyGiveCommand(){let e=`/give @s ${this.form.identifier}`;Clipbench.setText(e),Blockbench.showQuickMessage("Command copied to clipboard")}}},G=D(L,e,[function(){var e=this._self._c;return e("section",[e("p",{staticClass:"description"},[this._v("Select an item preset to get started!")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Stack Size")]),e._v(" "),t("p",{staticClass:"description"},[e._v("How many items can be combined into one stack")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Maximum Durability")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Select the durability that the item has when it's brand new")])])},function(){var e=this,t=e._self._c;return t("ul",{attrs:{id:"item_durability_markers"}},[t("li",[e._v("Wood")]),e._v(" "),t("li",[e._v("Iron")]),e._v(" "),t("li",[e._v("Diamond")]),e._v(" "),t("li",[e._v("Netherite")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Repair Amount")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Set how much one item will repair, in percent. In vanilla Minecraft, this is always 25%.")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Value")]),e._v(" "),t("p",{staticClass:"description"},[e._v("The enchantment value determines the amount and quality of enchantments that can be achieved. The "),t("a",{attrs:{href:"https://wiki.bedrock.dev/items/item-components.html#enchantability-value"}},[e._v("value of vanilla items")]),e._v(" ranges between 1 and 25.")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Eat Duration")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Set how long eating one item will take, in seconds.")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Saturation Modifier")]),e._v(" "),t("p",{staticClass:"description"},[e._v('Saturation is a second hidden bar that "extends" the hunger bar. Nutrition multiplied by the Saturation Modifier determines the saturation level.')])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Can Always Eat")]),e._v(" "),t("p",{staticClass:"description"},[e._v("If enabled, the player will always be able to eat the item, even when not hungry")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Fuel Duration")]),e._v(" "),t("p",{staticClass:"description"},[e._v("How many items a furnace can process with by burning one of this item")])])},function(){var e=this,t=e._self._c;return t("ul",{attrs:{id:"item_fuel_markers"}},[t("li",{attrs:{item:"planks"}},[e._v("Planks")]),e._v(" "),t("li",{attrs:{item:"coal"}},[e._v("Coal")]),e._v(" "),t("li",{attrs:{item:"coal_block"}},[e._v("Coal Block")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Cooldown Duration")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Set how long the item will need to cool down after being used, in seconds")])])},function(){var e=this,t=e._self._c;return t("div",[t("label",[e._v("Icon Glint")]),e._v(" "),t("p",{staticClass:"description"},[e._v("Display the 2D icon with a shimmery glint, like it's enchanted")])])},function(){var e=this,t=e._self._c;return t("section",[t("label",[e._v("To learn more about creating Minecraft addons, visit the "),t("a",{staticClass:"open-in-browser",attrs:{href:"https://learn.microsoft.com/en-us/minecraft/creator/",target:"blank",rel:"noopener"}},[e._v("Minecraft Bedrock Creator Portal")]),e._v("!")]),e._v(" "),t("p",{staticClass:"description"},[e._v("(You can re-open this dialog to return to this page)")])])}],!1,(function(e){var t=a(907);t.__inject__&&t.__inject__(e)}),null,"2a3db55c").exports,E="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTgwIgogICBoZWlnaHQ9IjQ2MCIKICAgdmlld0JveD0iMCAwIDI1OS4yOTE2NiAxMjEuNzA4MzQiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzQ0OTEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9InN0YXJ0X3NjcmVlbi5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDg1IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ5NDk3NDc1IgogICAgIGlua3NjYXBlOmN4PSI1NTUuMDY1ODUiCiAgICAgaW5rc2NhcGU6Y3k9IjIzLjA4OTk4NiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSI0NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDg4Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzUuMjkxNjUpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDIwMjAyO2ZpbGwtb3BhY2l0eTowLjE4O3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjU5LjI1MTQ0LDIwOS42MDI4NSBjIC01MS4wNDg0OCwwIC0xMjIuMjcxODgsMTcuMzM0NTMgLTE2Ni4xMDQwNzYsMTguMTM2MzQgQyA0OS4zMTUxNjEsMjI4LjU0MSA1LjkxMTYwNDJlLTgsMjIyLjU3MjYgNS45MTE2MDQyZS04LDIyMi41NzI2IEwgLTAuMDU2MzM2OCwyNTAuODIwMDcgLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMjU5LjI5NjIzLDI5Ny4wMDI0MiBaIgogICAgICAgaWQ9InBhdGg1MDU5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojODY0YmE3O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMC42OTk2NTIzNywyNTQuOTc3ODEgYyAwLDAgMzYuOTA3NDg2NjMsMTkuNjE3OTggODQuNzIzMDA3NjMsMjQuODI0MjYgNjUuOTU2ODQsNy4xODE1NCA5Ni4xMDM3NCwtNS42ODE2OCAxNDEuMzEwMDQsLTMuNjc4NTYgMjAuMTI5MTksMC44OTE5NCAyOS40ODQ1MSwzLjEwODU2IDMyLjYyNDkzLDMuNDQyNjQgbCAtMC4wNjE0LDE3LjQzNjI3IHoiCiAgICAgICBpZD0icGF0aDUwMzgtOSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2IzODdjMztmaWxsLW9wYWNpdHk6MC45NDExNzY0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0xLjIwNzE2NjJlLTgsMjk3LjAwMjkzIC0wLjA1NjMzNjgsMjUwLjgyMDA3IGMgMCwwIDUzLjkxNzk0MTgsMzguOTk4MzcgMTEzLjQ0OTE5NjgsMzcuNDg2NDYgNDguMDgyNjEsLTEuMjIxMTUgNzMuOTg1ODksLTIuMDczMDggOTcuNTQwNzcsMC40NDI4MiAxOC4zMTU3MiwxLjk1NjMgNDguMzYyNiw4LjI1MzA3IDQ4LjM2MjYsOC4yNTMwNyB2IDAgeiIKICAgICAgIGlkPSJwYXRoNTAzOCIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K",W="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+4AAAJhCAMAAADoqxo1AAADAFBMVEUAAAAAAAACAgICAgIDAgIDAgQCAgPHvJcEAwT08PACAgM9o9nK3u9zPhIDAwY0R1vNvdSleLucutQ5JVcDAwfb7PPFpNKXi2UqK1EXis7Tu9yIZzBkRSQ2Ki5/eGu2ob4FUZEuJi/q7fKfkH65rpDSy9gkHCnu7vC0pL4KChYFdr2reFcMi8sIYKWobDYYH0nu7PGHeVMjL2ZDO2qMazdgMBSsjE1vNRWjkrH09PbGwdBImsBTM36MPBYDOY2aYypoYm9tssoEasBdZHoBQ6NalbNOc5kuIUkJkdYEBgwCAgUBDScARq0BgNEBh9UQl9oAbsoIChQAaMQ9Ji68xte8kcsANIsEu9gAMoVfOo4xHVcAiMbGz93w6unAoldIMDi2fTkGx988KGYtKCxSUFCw1uXn4d/q5eTJwJ4+OTwwICURDSwAL34gKj4ATaGzdzKLUKynUx4jHSHd2NgASpvZ0tFZV1crQlzi29oAj8gbEzd5e4cTFh+FyNhcN4s0IF4mNU4ALHeNmrLOxsXRychZNoaWVrOqzNujQhsZJDvVzs4DJE4/NDO8s7Lh3eR0doEhFz9WNYGJla1HQkTGubd5xdY0MTTJqFpqdYtuQEBsZ2e2q6ltcH2Oy9ymt82suM0AGF8jnd3DsaoAPKE1rt8AlsvJwL8fGTdbXmuEyOQbsseFkKcqHkeKPRB8hJhwgZx7gI+QnrdyfZOFhIpZaoNqepaOjpRkX179+/yNWFUAI3J5RkdlaHZqwdQBr9LBgDVpg6mdmJpDSVbU09uAip9NVGStmZSgsMid2eUBVbhOwtwOQ3E2O00EdrKhq74BFz55cG8NMl2poqWVy9EPds68lEhOX3YAU6kBQpR2h6UZTHuYqMG3wNGokoqbioMBfr2oZiSkmHE7WX7JydKLfHoAodUFjryXTxhuirh/m75iOThLZIpjOBFKMHEfZJXJpJhlnMgWWIu9u8IYxtfIsH7fxq94pc+tsL0en8N3SJt7WyU/cqhabZvDlHKPfJx6Z4q9YJVlAAAAR3RSTlMADxwrOkpZ/m3+gv7+/phAH/39/bP9/v568v3+Zt1rSly316DOyJVJhtOl/siE8ciB/pvBl4bJtcKnov7g2LzAq8XU3eKLzbPFiRMAAOzVSURBVHja7N2xi9NQHMDxVkcDDUIGJ4sgiii4qlMHIVCq4iAOrm+sk+ggQp2KODjVRd5QKGgcFZzOwQPhoRURBUUHwUEEQdRBBB1875dLQ+21ja2GpH4/be/uH/jy++W16VUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoFz8CoD/gr/noL+lWgGw6mzsh3Z5+/fvO1Cvbd1SAbCqJPYgCKLQ2rEjrp5RD6yeeLIrFXjbwoRUL6Oe6oGVsRG7jiT3CaNRT/VAydnYdysXezSZ+++jngUfKDGJXRkdOSpQm+bOgg+Un7/n8C5vI3YtuYfZcJYHlIvE7hkpXcfT3YRZpaO+zqgHis339+72PE8W+ZjW3m+5M+qBFWAv2SV2S2vZ5B0v0OGiZNRTPVA0e2SL95SIhCz0mXLnLA8ojWSwJ3SUjHcjuS+Nz+UBxZDEnkp3eRMEvXAezvKAcvCTLT5l9OhkXmXJfYmzvK18Lg/IyWTsQlIXJvC+hfNwlgcUn79HtvgJo4M6t8zPz52zPKDo3LvsgacmmWhEBcH948fD2TjLA4pt5+Ez6WSfssxr7a7dB4NB38qvehc91QN/ib/zsEpinzbddaSV8oLg0WCwbWBti6sP8yHV1yoAlt7ilaem0zLbjbK8wHskqW9zP5zjYX7qFQB/IXaj1TQmbj3JXUKX3t2D3IGy8Pdud0HbomfkbqT2iekuzzA/O1jmgcVVD3ddzlrLrewZeIGKW096n7HMkztQJDu70rplg8+a+9h0vx1ORe5AkdRs6+4hz4Wme67L/NYKgEXVelF694vKIIine9p7rrnznyyAxdU2UtfulTH35FD+tvzuh/nZT+7A4urS+h/lbpLBnv+1+34+VwcslXtCm0yX7kEkmSfPwYzpTu5AkRy1mW8c1GW9do/Gpju5A2VxNBISfNbpPlZ7rrnvqwBYMncdOWqC2Tz3sd6/h1ORO1AkDS3LfDR3mTejZb5nG2e6A+XTGO3y2qgsgjMf3u7o95Pa871D5kAFwKKqjeSNOJWFufTm64Nh8+nVx68/PXn/vd+3Y57cgXKoNrSOMg520/38rnPxxt3rzZir/sunJ29ftI6FM3D/K1AM1UbWwd69dOTClXb72oNr7WYsrf7Z6XMvT25SPbkDBbKlZ1QW+vPHC522zX3t3q2bzUlS/WVb/YlWmCJ3oEC2PFcZ9I6861jt9pUra9fWmzOdarWOHftXc577X4HF1boZBvunC53O0OZ+xbq1NmzO9KoVS6rndnegIOblbi79sFfsw6HtfTh0uZ9/eD1L7ilyBwqitmnj8rL0t58y0jti6P56+LDdnOlsaxzfbgEURH3mFn/n4rW1dXvF7lZ5+3K5r6/Pyf1laxzfbgEUxNGprX/7xc7dgzwNxHEc920wk+DkoqIguAmODqKCky9IB3HpJumgdanVQpb4slhpAw4OGkEQNCBI5CCK3JJoBiGgBvEFRyfXDrr6v/8ljVG0XBOxwu/72BSHZ/zwvyTP3cfQcRzPI/DXXNbeJ+79hdxfgjtCq9nh3w32R47K42RK2vnBfD9LsmvG3LH/FaFV6PDvBjvnOV4FnqY7c3/wZ+4dcEdoNTv4y2O6O19fCCEcUU13X4PPFHc3W8D9FbgjtKId/PkvZb88IuyhcDiv5O7QRWa8mP+73I/z63rsf0XILHPud74+FBSPdvHDUt5XH9+XQUbeF3E/Udd+3JR72XEK3BFqr7UHK+t3vkSR4EIGz8OdnRffUsogWcT9elvcK/XgjlAr3DeX2DdfLrCHosBeeS/USy4582fub9vlXo16bHdHqFHrNuvB/ulhRAmOuYvqzp29+wV330v/zP1NM+7H/hi4I9RsQ9ydrzciTkR6uoe14V5o95zYZ+4LpvuzY3+RO/a/ItSE+53HTJ2m+4v6Wt5zNPbXvJiPrtq90Cfu/gLuZ8EdodVs08NIMPZqupP2ai2vb9rD2ahrWT2PuS/Y//qmc+IEuCO0gm0SSjmDfxHVhnsx3n0qtC1Vj7Uv4M5HWV36cO4lqW+fO/a/ItSAO2MvEqX3Sju/c4+skrvy3i9YL1R//dJJUn8M3BFajbZF8zv36FFtuLN2XWxxI0l5xN2kVx1+i9YO97fgjlAj7qI+3R3+KbnzLXxucUNJ+dKQ+wmjs6yO/5E7TrdAqPl051v3qL6WL2uNe6V+2emO7e4INehANd31Yr6+ltfXbxZ3RXO/ZsT9eo17Xb3xdD8E7gg14c69UP8EV3j3fmhmcfeZe2DI/e2f/LJ6A+7Y/4pQY+4Mvhruc+/85V8puPOLuOCBEfc3JdWF6sEdob/aWsVdaO2PBBdq68y92Ao3ZO3d25Iy5f7smEnHj4E7QlXtc2fsPN1DQeYdTmvn/MGP3FMz7peOtRj2vyLUgLuIKL5MBrkg8Y/0dNf5+jLS3PNluJ8Fd4RWo3WRLh9bT5/OHqnhrrmX050/tuYeae5njLifbOT7badzgnoL7gi1wl1Ecc96Sk1otlfaKd/Xlx5z7xF3ZzK4bcb9QyPuJzrzlHpsd0do+dZHqtlTLo+qJ3Vau/5yesV0j8d2tzsz436+4XSvBe4INdkho/rM2q28nO7VIXV8EV3WbpN1ynC6v2823cEdoba5c7HSHlbay8V82LW6vXE+63L5EaNetskd290Rasr9uZ7uvJYP58/p5mfURdPBN0fKgnsM7gj9l23jva/2nHv443SnPN/Jx73cl9TYWoZ7B9wRWo2IO9Vl7t0oVOO9tpbPr/QsqxtL1YC59xyzDXGtcsd2d4Ta4W6TdWr+XJ4a64d0wpfSl4Muc/fMuNMhVqq34I7QP+4A//WsxdynirsQPw734g2cI1Ujzf21KfeyZdTXtR/C6RYINeJOae7PRUjeK+0Vd08Nd3/K3O0Ly3LX5sEdoX8Tc38Ra+4Dnu7VWp5fuKtsX1K+3aWs6Wmz7e5tcsfpFggt39odIXnPNffPIXkX89dwr30/+pG7Q9ypUWbGvQPuCK1Ea/dkDnF/ys1CEU1G38q1fDXdR1IV9pj7oG/E/W6n3tsm3LHdHaHlW7fHzcKS+/3bg671dOxxr30q1tyHUiUK7tfMDrP5ebqDO0L/IubuXgxnrN0i63S9wsOdk7nFXZVUEGvuYzPulzr1Gu2Q2Q/uCC3d+q2u6ybfSPl0NrEY/cTjlHa/4k7lXe6K2Q6Zs20u5vevQQgtzT1z3SzJp1diIb4p7MSdrfOjOjmxuBlP94L7xIz7qU49bIhD6B+1wU28yXCYOkKExJ2ybuvhztNdc+9O5tx70yvS8DCbTj1sd0foH7UhHw9se5gkjgiv8HC3YsZOvZZyNuceSPmtZ1+NpcwMD7PBdEdoNdo+sqkxPa9ziLuKuFeP6sbVCbRB4OR+EATSPWLUeXBHaDXabttTe3rVdd3MGevpLoq/sZHUUHOPSXuZ7JtxP9eph/2vCP2jdtuqmZu5bkLclXeHtOukHDH3ngiotLgYcn9fB3sC3BH6JzH3qW1PXPKeXbH45btTaJevpW/TaB9NnIC6EHAS3BH6T9tnU5q7O+5ZNN27xZ37a0kNRjMhA0oP9nf0Zcj91bmXde7Y7o7QP2of37sTd2psk/enPdLOt+7043uyxH6Bfkg8fQy53ztKvaTAHaF/2y6bmsYZaU+GNnm3bOZeRNplcEsPd7YeyPSaMfcqQm/GvVMP290RWrq1u3i6x2oxnxJ38j5k7d6cuy59oriz+AcNuBN4s1NtTuB0C4Ta406NhEsFA3tK3oceV2jXs/0JT3fWLpOm3KuUemx3R8ig5tN95LkZc6f/DHJfa/fKtTx3Ib2QMvnAkPv1o7/jXqmnwB2hv93anTzdHZe8+4Pp4EqcuEl1ugUPdy4l6upjPN3vLuBeoedhj+3uCP2t1g3UdB9IxT2YxWn/2jXXTZR1T3ufP5ZX2pl8+9zrsXpwR+hvcKcGaZb1VaS977puWsx20j6f7uQ9YPLZmb/Kvb7EP4HTLRBqc4fM1B4m5Pya+jB3nu/lkzou5elO3s25Pztar2OWfmWP0y0QaoX7aDzx+oydtRN3KqlpJ+w83peZ7peWne7cy+r3KHBHqAn34SxMXFdhLwd8lrnZ3HvAFdgD9u4anl3VaLoz96q9axBCy7YlcVUEXWunXEp7l+WD+SeknbknSZrePGLUKXBHaDXa6LJuvYzXV7LOJZL6YSl/Oj2dKO59M+4n2+S+ZQ1C39k7d5YngigMay4iFl66NCI2opWgjUUKQTtTiz9AbDQSCNGAzYgXUFFJY6OFsKAprVKITRZSBA5ErPI77Ow8887MNyYmrln3ixt4nz07WZN0H0/Omdk9I8nLGSN6wHTQdnN3Eczf4yO0E5vfU+pOyA7jdQ+y2xO24+00TN3voZhPkd3TDN0/X7/z+f2L2Sz8e760UkfdCflPnMY8XXO6qh6LeY/s+W65OUmD7tlz9SS5fuOhtX6WFKl7/QAh5B9196b7Yl4QRoYju/+sz++wHbpvULwnSTK1UHdC/jsHzxuLSu4reQ3jZB+OP3T743RowcR9ctPp/jHfXH2q/LPutQOEkH/UHcnd5XeDvD5+1LWtMyO7Pu+L+RRk6j5foXt+WgtcZbs7IbmpQHeB7BoWY6zr/Vu+U05SN3dP/1L3GXUnpJxAdz93h/NtGXnXX+nRVd2N+o51Osc9ydB9w6W56XQT3dnuTkhuqoJb7HFZXtweFzg0u381SurX5cGkYN3dlyzUnZB9pSZGkV964ZzuProTI/Ady3R6yv7oDqL163Vn/yshuakZ+P4MN96N5XU/2h50bwtW6sAkoyFu1sqn+xrtWwuw3Z2Q/NQNCMldxDyA7q/c0Ev9wr2kQAS659qaLuNG2xrtqTshRXHILcy33bzdKKo7eGWHnojR0I8lvQnfNQrTHbQ2ge3uhOTnsFuU10EPPEw3wjIdBvzHsKJhPxXIruOb20XuVTWl7oRsiSNO9lDMKyOf2DF+MADP3MF3HdrXtqk7290JKYozcRsbv63F2N9zx2B1l7DXjazWfbbUEEfdCSknR0Nub4dN6t7Cde/7S5Vd8b8HIit0fzH3rW9ha7pidWf/KyFFcdqpDtyeFt+t5noivuE96I78Lyl0X5HNk2Tu+txvUHdCysl5V6cDV7g/guc+3pq95I7vGVmnO4D2y4/MU3dCSsHB84utcMpzzN1d9McGmscJ/pLusXiPFKs7291LTZVPNe8QB0+61O5Tt9P9lbe93/swxEcukOIllY+rNq9Zz1TZXPe79ozXCXUvJZVms1Hjo0+7QuVcKNR1hO1pz92F6/e+j4aCvB90tyN0X7ubRbb2+bP7Xe5uUT4ag8GgefEQU/xuUD0HiZ3yxjLpqevd3ssHaZi1xy/k1z0ytazX/e6flafupeLgxQFoXmCK3wWqSO4+jBGre/fxt3f39dKib+PQAO1s3TdM9q0skr0L7m6xRY43GscyFa4N9rjY4N+m9NTijtN+ZT799EX0RUOR8Gk7DL/rPm8VThKvMPiTum+P42efdjqXG5WsWj7Aon4XqGvqjhtOG98FKxo4Fop5XMrNoHtsby+AuzhBskp7wN0ttsepS087yo/Lf6rSK81B4Ik9WdSXnLov5OGyu4TtHolL8n5AQ1zRukeS9dP4hLpvCST3Sx3PlUZ1ncL1aDuL+l3gELI7hEZE3WMxv5Dfcdt9v3SPpq/M8Wx33xrHkdwDl+urf2YvBtn1QCDHNy/U+atcTg4/C8B7ZHcxMZDTbSi4EtlH3ZPVOR2v1H2LoJYPrC3qq83BIrBdQ1P8Mf6lSsgRl7bhs8fl9djnrvgXwWZ1z5Y6ZIqYtycaWSt2CXXfDqjlT3SW+b1KbyyI7sKmeI0nXLcrIz/ZO7sQGaMwjhtf4cJ3kjCJFVdKKcmFG2m4mkJWpOxmW18X42vLNDGs8jWToWljs2qKqakZs9JKc7HMrk3k40ZeM7mwLmYV4YI2Ljzn/57jeMy83jBjXJzfe96PXZ/h5/8855yXhVJnKC/TXbmu3nOX2+n6k8nk3Yd79uyqsu6Ai+20EpcwutcYXssPyxPPoXOo0vmiu3ZdPShC7Wbe7r9jIgp1DCDKdbwEB+WV7uR6LhrN9T/ccy3oW7vW5/P5/Ur3K38Q5+rKSfDnBK/lEwLzj9n8G7yYqGMMQ+gft8yO0bbjpmyni4IqAmP8f8Q8VakDZLxUHcqvOQnXO2/cONyZPN9Erv8IrD+dSPx1nmPgmYm/V8e9bbv5t6tcqGEtHyqbel+qdLc1xxMHRb2Zt/tv0C/EqSZd6a7ec6dcPyxkP9ga8K8F3Heaqzt95crRTRufu2u/V15YkrtkvKzi7ZFYSj9l86en5nh1LY8bwl1DRb0Hi+66kpfa4/gZ8xLN/4JniX6VXe2klWCHHdXwhw9Hcz0U7OWu+9kE/WPS/vbRjUx7N+A+YNnOivm90nYw0+NdUZxr/vDUDh7ucB00StV1xM/Upby0nJseUjd6MIvx/wUj55wEUnc8yC11cD0a7Uw2V3adyf6z9rs3bXS23mUWXiMLfM3+1Q2R/PriIhPwtYIvuvNanrNyJVt6Y207CDH3qSIwf0vXGbz/yt95k+ner1xv1a6zlt0Vqf1znvYuyZ9gQ54bSXS6PE986RqMRLasX79+xaQRhlqBWp5HO6/ly9feIDsnpO64hMRtpZm3qzOj9Iq72jovcj2Zi1IJnzwfD/idVRd3/ewMivxN2vqES+QzYPqmxEZS/kthMJ9vIduJrrkjDLUCtbx2ndfyHHiuinlceKbbR0idZjG+voxSXTush+7CdVp0O6hd56rDbHajz/pdEXF/ZfcmUeSr8HYigcO+oHHfSLzLFgdP5SOR9TbF1SYoGLWt5YcR4o4BL+3m4a5Ex01o3xgKmcX4ujJazcfjIOn7HV2HshgKiA7fNT6/rzL0eXwPSPvdaiI/4ZzxCRgP6yncS58HBwfzKOWBaeBrh3dKue5lnhNSdXWtWMdDdum+xMzb1QX9QpyiP9kZ7bxY0fXvgjPN6UFrLq7a9rVirJWIz4pTfp2TR55ZYevrqxe7Nz6n3p5tltXxjgdIf79XyH6Kwj2vbDcNPKP6tTwv56G3o/CA6w6/6UIo0/EhRTxhFuPrw1i9SdbJdaytayA3TOeya/i3xokD+gfjdztShYHLlwcGCtlUd2fy7qEjT49uOvqcivzdCaa8GLh9GfhItrNwNw187fAudw13rXs7HqH7W3riytuKN7bTEYLpGrMYXw/Gyv2z/bnOaPRJTzPbS8NVpyeYrgyXka4tx9CWM6C7P96fjhUu2wxA+HCqrzuXO3i3Nb7nMfX2t1HkI9MxYPtQsVgU4X4gwsIdBb35EwNqEe7D9gU0Ok/SScfpYfv27W/xgUr29rLOnbHSFPX/mnG261HperCy6ijdtemkuBqA2a2euev+wJ7+vvAApbpmgCgUstlUX5p26NLyfmu8id6/EdbTJr2N0J5410W2E/l9sJ2z3NSEVdd9+RTXiTqe7+04324XvH2LVBcXfcMp472xsTEE8+lqFuP/MRNEvw7Xzzf5+cScznTHqTio7ei6T958wYfJdLZwmSPMl76HU5Tx16M5ofz51tampgD9MEL7ozST//xRcf1HEe6qlOc0mAaeUdUNtM66izQnlOriuh0g4nnXTpqLip78xlCyk/XiybxE8w+ZT6qT62wvjU8vptPBEp3BzKahT40v/jCaygq1uy5zILstPNX04VhfX7q7M5dL9jffJefj8cBaEI8Vix+F7Pl9LTLcOV1mSy2oci3PGR4OVV6FUyDctfBkvIx0eYPlgCmPsDeL8f+KyV6vd+7shRMXLw767bTGAjlkB6R5ueo6t7nvHH98W8/hO1e7JNz3qWS6LOfhezYci6VS6e7uDirrkwfJ+CZ8J4G+j3bnnv8h3E0Dz6lVLT/MjG9sZ6or39W8POk+bbsGXbzq2cWDtl0OHDLnzWL8v2GyffOMHDV67JgxYydMnL548UnortCyO1buZV/gD57veXLp2IEdLePH5+H6ZXnV0S4OSUEKn0pZmW5EPGU80t13/WNxUNrekte6c1aYGZ/q4d1wgrnuYjwRYrU8i3hZ0ivgtzxRzIMQLmberg7AfKn9LlnQC+GhvONEHDO9qfnJhWMH2nZsJcbfGh8hzVW8/yw8KEjdiVQqlcl0pzs6OnN38b0lP1O424371siWLbbvpoGvIbyWLy/qG9mKO6vlyxFLcz8V8tJ1zNhx5UPmX7SsE1z7ICp6qvN9gsquQ/R1uw6+PitMb2lpEbJD95YiVMcgYHxF39HB0yw99fAdHbkgGvdHonEnqHGP5LdU8N1sqa0y3s9soq5SxIcq2M7DnRf1LNp1sNNFPStCZjG+zqDOHzdvcQDNPVCbZhT0qeC6008fZKxC2w4Cskvfb93aul717rx/H0ALb/sOhO4pwrLSmY6H+Ask1kW6C9n3iVLehntuttTWJNzdjEfAQ3Md7rp1Z2BpTgW8THScFRGL8eZ3sp54bEaNowm96ZT2FPYBoT6EpA+E6VapVBoa+lRoayGgukx3ivctynY+Oz+AeBejQEOkezgL4S2rL53z2aV818ePmJSPtFApX8F3s6W22rqvIN3dQFEvTHep5VnEq45d3lkhzzGL8f8FnpGekaMnTN8Z8KnXYE+T6TczGTJ96D1Gm7Ad4a51j0B2UN680yDscI9ZMVHOk/BpTMsHw9S5D+bJdpTybr43mC21f493Bmp5N06IiG9EuOta3tV4KM4FV8LzD8xifJ3BL/7ohfPOBALB4LrHlOhPn3bc7M30WhaNoU9DNOgcVKrDdbIdzbueqSuLdxXuWZqju3nTCsP3vmfiRwlc/0yFPHSPbP1uu2ngawbCHfPywxjOrus2Xm6ZRbi7Gy+E18pTzjPhGeYlmvoycvaygz1vtrUeevr0wYOO3pu9glIvyW6JOv7TJyH8ZV3JS+XRvMN0DJXuEF1N1YVpAY5sJ92z2RiV82naTRtvSkrbWSnPhDdbaquue8OMDXj71T3eT0jjEe6uptO5Zs2aaW8R8VJwN8xifJ3wTFq16snFnmev3n141/v1a6+Egp2Mt3qF7kNQfipk1+GOaj4P0eWFhTuRDVuWlYHtRBj765Ktra1nmmPKduoQEO6uvhe7lpsG/u/welfMmrVhirPm6qLuKOrPVRacP68RTNt+rp1V7o7em8X4uuAZOXfVy3v37t388q639L5Uei9dL4mjZJUEZDqN9+T7Di07hmreVdOOi34hLmYJYDuED4t4v9l8nkh/Ltq2yyV3d9/FEsAjs6X2rzdaLmqYNWPKiROOxsurfhhm8/IO4k+D7oj4c9pwV8xi/L/DM2ru/AWXrh47dbztAIlOCOGZ7zTI+U+SoTxPd9W8l8/Lo4Qn08UJ3YEl5uaTzc13m5OPnEt5UCnciQHTwFfB+IZZwnjneFcnDujuClSXbH/brlPd3Xjz30vWGKQ6/TV/9fiBA/vaxGp6W4FUp0GnbTpUp3DHOYRwJ4pSdRwQHs07n5RHrAMID9vhewfpHuumPfMHe0Qpn8esvAx3d+Hlcp9p4KsU8c7G41SDdP91044bwh3Iov53It4sxtcWj3dFgzRd0fUeSN0JobtCuE7Go3mH7VBdxfsWPU1HV8S6JvPdeCITDvd10pb5nuso5Vm4u/leVKt9soH3TGpYYVKhukW9/ECbjnQ/V1F0/rh5DQfzdlpoM29XT0Y2tJHpjFPIdlnO06CTrrp5l+hVONgum3dpOihY3HbVuINYuDuXyyUPi1LeznYsuTvAbFd7eewG/ht75xoSaRWH8cYumxXYBaJis/uF6EZs0QUqulAfulEWJE5FbU5FtMGkDQld1IosxzIhGSW7gAm7bJrlRAilk0WwTDK03TS/jB+K6LZUEl3oOc85x7/Hd2Ze55a78T7vec+M5m5R/fZ5/v9zzjuhfS7NpIYCp69CqJfi3TTr8pMuXwjmokb27dasYDG+WgqdZGCP8FZT7Gcrm+T1LbjT4eMWdsquvINyWYODuWMsW7sGnup/Z+tX6nzM4FZduEdlyd0XeO3snFDA73vO5/2phqGgVV8RixfipXiX8v1WvyzPRp1X/n27YDH+P9KpsYja+75MPC4U78bftb2ryUnzVJNbuevifV7MHbhL3b4MOy5FO9I8zscM9vQurTD3poISczdrfbpsGHvn86WmoaBVXxmLJ/GCuTTpOP2wlkX3vOJifBDq11fHREk772b9ZkjsnaCTeXF3o3lt7bwpFu/O7tl2N8pT2tv73377LTzhYlRH+Sho55J7Qa0yd9v4H9uKg/ZBq74afTup4GnvkuXFyhsPc+zdg3upfTsqWIyvuGpaDOSiLFEXe3f0sxTvIF2PsJbeaLNCcw7tZJ0C7f2fv/3WYNsY+nRdTlfel3eUC3LuDrSn51Lwe9O6C/7vqATxKbPhTt9Suz/pxZ0Mu98pLPbtgsX49RGLd7K+kvmY4L5K36209zgwd6WLdwnzFvcPVgJP5t/+/PP+7W9tXxJzB+3+Au0rTtjC0IF7Q9OQUVDAVy7UHyUOz4Epx6K7RdgQ/4P9jo/F/6AsPliMXwexeF+l5t8t7vR219w17oc2NKUiYZG1d+AuYq9OzF36dP39b38+8/b2iTHSzt2zNHd/rTxSD6kzN3Hr7UEBXzngL0zd7Hi7NOryWPlhnkX3CoX64ImWUEWL98hqvZzf3r+bm2+KN4N0RvgILjUkzTc4uLev6NR9IFkeUR64f5imucPbYxLl/XAn5pz4N0jD3OXULQv44P+MSnhA6hDP1rrc5u4S35gP8GAxfjeRKt4dhd3inUKr/ruPh7Jo68m+mjAV4STFuwWR95hlXcydjbrPocleT5/OXytX3VkuLKUs6kEBX8nzciet3D7L8Yd34c2zvA5zX7sa98y+XU39Hl1csHgXhXFHf3Z4n/t4nqBDtjlHibW7xbsFHjTaNThcUrgjykMftpN24r5mc4fIO4Fnnw5+L/YeFPAVSnzx8521d3UVyPL++h8txtffs+HE+t3gn6NUXdjssA6ATfGOJryAbs690dztoNw0H553nmGz1ZyNoWySJ+6jaXblTZRfs7mTd9MOROEufTox+HSAeyXMXUD3yfI+qmioX/8nWoZOvAc68YQ91eKPOSnmmLtC/tDf54YaUnF8CQns+hIJ6W7xLqfcexXrdv/s8iqc6su3Z0yUj8fDa4/yhnfbp0vH8ZaDt56v3CtQeTomdb5n1f2PCpq7f6jffU/G773hHgoWv3sUF0UpdGoqHmu2vr7cm8d3HIwF95WTa+1SvIu7s1cn3m6j/Ntvb11aYpsOm2eLivLUPDbvMcpnxdwt8cHu+Uo06v5xzr2q8dStP1QBdwn1hRDfnZ5oWa9p3zMtvubCaJy4WzVTnqJczr3ZV773iKdkLOy6VyeFO2FXuL/9eX8vD8KpJF9Mn06AJ+5LcSEdQy/HB8+trFSWJ/CG+aduxpNvnqx4lhfdWVyoX6dDNMzyIlj8HnSYJ3TMSYA9HosZ0EURx7cdbyfnHty9xbv+FMhV++n+QuGulEkvr8FFijN3wq54R+WealoGXRrze86//t1VtlFH2I23H3Kz0iF/vFANc9+DFuPrTJYX4k/YU/p2IVg7cI/Gos2rBdZd2jXugrrw7ineBXZoK2h3Cvd+JPnPt6aXzANsGOWLwV3yfDqbwuuqKP/x90cEvJed5Z1j7pzAugYeob4a5r6nLMafQMZd4PeMUA9rh5Cm4bHNUIxD3N2B3VbsmPkub69Oinfi3itRnqK5v4XnyrNNFyuyTyf2Pg97j/OtjvCW+e9uueWcPeRP291VzPLuaTiauxFC/Qs09+porTtsH8X47/t2NcjyXhW3NBeqW4f/QUOnHh+nosRdlKt4p48L5YXcncW7fJDEGFB3aUfprmlPgfZSojwhB+5NKf12pb3P/XLLl69fvAe2THcjHROXHXX6dnA3ob5auBe1GP+ff7xknYf04vt2desQB2oujIM10h7Lh3vEdXfy7tOr47Z5s6eOmpMwr2lHmGeU17Sjaigyys9bc2+IOyfgNfEf3HLL66+/fsW+ewUq39yNt0uWhyTUVw/44kL9oz4fL1nVLF9K3+6EIuJABYM8FaO7e4v3nI15kW/x/rGDu/V2HeWXTJSPM8qXau7xJvnS+vvYl4r216+5Iijgy1h0Tx0uz60D6/hCzN2x+B+uqp7uLMrifUJ9NbO827erW0tvf0P1K343yAO1CC5I4x6Typ2KuGneWjuvQrhHwu+Gm+wyHNXLvbN2EY5RPq1pj0qUL24RDsNGeZf3j/+kuV8DXRwU8CVKxT583oQmnhPMPY9wSu6qKqmoUI9mwg8n/weL8fV5ObfTCWvp7W/QwP9HO3XqTgJpVAS05yneCa/Le+HiPaJ/XW04NUTcjdq1uQvt27nBhrQ3l2bu89BQpMER8/x3hnbyvs9egUoRc58m/kFPo+6/DfWN/qH+UU56seCsai/Gc9G9MPH1a60HNpiKv9qhPnRMVmCnvSsV6NXVyiDvvI0c2gl87bvs1Vng55jmSTu2y0P9aZg7m/I09xIKd5q5mLsYPPt0FncE+r0ClRLmj4obHUWL56K76D8N9WtcjJcPqqzmYjw30ProxBr/egC/iRrK4hnqN1XzDynuo+PAZMI8JGHeU7sL8wK7er9K5uGWYW60IeqmeHcr914p3CMlLrlLn87l/QOhnTonKOBL0cF4fJXxA4Z6yfL5ia9uqH/y0cK9OrUwaIk/6+Tq9e3qgGph+Wf5eo25GPyvt9123saaCkN+TMjt0QE3s81FdeZbWli8u/aOyw3zkMI61jksf0Fkf50q3qUxvwJ30o4ov6sLTXmuwYVL2D2LW/p0juZMn04UrMiV6vAXWuLD6tm0frRzMb6aod5nh61GXSy+an27UN0JBfP8hro1Znnj8AZ3AL9pn1AF8/vx8ZMAPA/E0NdTgJ2KKrV0dWFrHf29kL1HuvoGFsZnoVhYJGneKd6t5tqJO70dSsPcNe3hcOnmLlFeNC99Oq1PEOiDs7ClE59Sxxlwx/GoSqPdM9Q/aWAX4Ku4GF9TX8DiTwytJm91UN/7RKfYh9Ur2l9SxG/cu2Jr7BCAr7swlYKrM8unoJZUVwpnzlu6Orta2J73rLw7Wb55NpGYTcxCHfiLeXBn8S6w41PirLvbKM8kr355LFvaItwQ+nRejWnaXzesc7rxsmODQF9yqD8bSTASBvK18aMKEy+d+qouxr+Qvy/vPGUH6d89GV9dixd+673RfVUvrp4/KAPmTlXO4pnfm3HT0Qk833VxynZkOzqAO+3d4Z1xHhLkFxKAfRK4Z/KmeRbvDbIONzc396Y2d2Xvb6aX9P4a/M7Rzr6+bHF9Og4V5eNe2od+Edo18KD9hhtuPCNYkSuPeP2fWoj3C/U/VJF472dPsS/voK7uRyG1GF89iz/BWLzr1Xt7W/mywC69fbq6wV5wh8fT4stfYxelmlKirHL3bMfwrs6WLrq7uqBYrKVrOLb8MRPL1fsAzJ32Pt5MP/fae4TFe/Zj0Zwp3v9iV57mTtg7XoO6h0uK8rUNXn3r9ukI/A1KlwUFfFlmcfbxEbOXMn7UbhDqvYvxL5BwXFbI/dCtuKt0Mp4pHaHeN8vXbZBHYcg3cEu179AObSpzSyStPbIC+FRTNqvNvUWNTtAe7ezsBO4xwN7SN/DN4myytbVTezy07O6diQSB9y3eX7asq6tX9+lg7h+S9ghiPGDXGs4WQbsx99oclfvH6NMprfB2mLvm/di9ApVl8WfH2acVi/clvqqh3u3UP8os75q76Envx0tWbYvdBm+Wd7fU8xsEXhp1ArvWxjJ7dBBhF6WyDQCeyOPq3JWKRDoHFjtaVP3estBq1K28mv5uzR3Fu8W9yxBeuHifY5hvN7j3v5NOD6snYsU6SXofLsw+vAvr1t3j8Vx9upzmTiHQBwV8mcTD4mupdyNHHX74+nfqafGS5QV2zsraRdU6Gb+3J8/XFNiWQ4uvcRt1mF/SrEuarynzQLuwLso2EHhdvEfDtdGJkdbMcEcLNGBxX5Aifrldt2jtfUC24Yj0T6s037Cc5DHG1C7afnzUM6J8Kh5uBuwi8l7UudeGXFFe9tM55m55Py0o4CsQ6muN4PG7Uah/wdCOYfSkxlygf6Eqi/H1vovujO4O8b9KmMeLk+U18JvK69FFOLQiqmHHO5rSwCviEb6jg62tIxPdw6A92mFxT0QlzVtlgDuBX8jZq9P+LrgDdiV87LM69L4VtBtnd7XLn3bx9qFIrj7djzB39ulEoF10WbAiVwGLvyCsPuYXdzh11OHr3qlHA57mLqCbIl5Y16L/n1XpxfiQf5Z3+3mM7i/9umGDdOqcRh1GOVn+VE+QN7DHopAGXll7ODs40zozMzHQ19XV0tKVMLgnu8iu4+4dCvZJxXtMPkJGcHeKd8G9XT+PFk151OwDSq+9hiEazq79IFwqZ5/ONfdP1GVxDwr4ioZ6wE6FU2sM9T9UN9SbDbTSqmPQXwk7/F/r5MotxtO6/TbQ1jhZntFdEf0rLZ7ymHvpWT50kuvsMmPh2wIfR791aWRkZGZm88RAt8Jdivc+Q2+zIB2juw+yeLff9RbvYRbvJspDY1s/BO7pbNfwa5nMRwMDPw2spL1bAr1PlCfvBfp0lnVI067uoICvrE4B8aBd3eHqh3rfD6E6TFDXNg/PF9z1i/Tsz6rgYvwJvlm+3mK9im5avHF7193L6cvXLRm8XeRJOi4oi/Pm2dERaPNM63imu7MLwGcs7lPeHXaRRZvmu/EFRh7cw/NSukNf4dMlerPdUwsL33z0kbb31Qaf9aF93pp7OGef7vW8fTpRUMBXjHjj8LtHqNcfMS8bbfQhOZHyf9Fx+9VUqS9f5/MHAqK7Qho3JhAPwwfuLvDlHOO8dHQpvloxsA57jxN5TEtwdgyE+cFM97Cy9z6L+2zMurtQ/RFhn0wkJgzsfPFum2/Qffn0HAXav2rD7tvFxYWFjwD8TybRewK9X59uvqG2KW+fzt1hQ2t3dG1QwFcy1Avx696ph8cL8dx6t9LcTZZ/bNnicTK+Glk+5PsHgmnAi8U7rEPnhcpZKbj8++/TYu2qbgfi6rYjMzk9MzODKI+XVvTqOsF7p1O8UwL0cMLY+2KMsPMW3I1QvCvcIU5jCvf+xKzwTtox3A69/zMt5iN599PJirv06dQstF933ZHBltrKhnqonFCPrF4ZicXD3N3CXbI8gMfAJCfjq5vl7/E26oi1eYF2uu5e3h6b0MUPfXnL9+mUeDt2q5scr+au8cme6elp4K40OZXp61BxflaKdyOx92jCaLYFoFtrj+Qr3tOkfa4XvPcPql+1COC/ocF7A313Ni/t1Nr6dLZy9+g66NpgS20lib/AAu+zNifPwnjSx+LL+cPgsMfMjrr8WZ7QS6ivapb3PguDWR4XRdrvuOMOh/i9yzH30z678YsHXr/lnSUDvCnZ4yrO482unsG2tskd9PfpmemRCaR5xfvUZqCu7qmYt3iftbz3kXU5RuPiHpmXxjzt/c3+wUnr7+QdwJN4TBLoC+2wmYdq4/n6dA7sHtpp7tRpwZbaaoR6El+RTn1jOeDD4tmo42X78q6325fHyjsZX+/dQOu7C0eDTuT5omjfQuD5ZVlZPnTsZZ999tmNN37x+pcAnrSDdOvumDODbRDsHUmeGs8MEPdusC7FO0WuCfSCxX0qIrDznad4B+fG3tGa3/5W/+AI7J28M9CDeCAvbXpPoG8QFe7TMctL2Z6zT/fZdUbBitz6h/o7BeFKqxGNeQJP2jEhy7sS4BnqK5Tlcx2G85q7tXfcNHfATu0sdwNtzRmfKakC9pPX4fBDRJzmnlLEZ9smR0fboEnwrjSicN+leB9Obta8J1u8T67rtrgv4pu8MGymd4t3mntahfmxXuK+zPui4l3X8Jwl1Pc15K7ccRXu04lkEY6TmLvRkcGK3HqGesoJ9RVGv1EdmyPoJP5Jh3R76QEdVtJivNe6vYfhzpP1denLO7pjyxbyTuB3lpPl62DtFB3+Gjj8X2PZlPF2jKXJSQX7OO4Z8K5xn8rsGh7u6OqcBe4EfliW4kC1Ld6TCSpqPh/aKuIp3gm7xX070vzkSCI5m5BAj5sC7Bb47l35Kvehofx9Onf/rIGcLy7t1LXBihxUtU59ZQ7KNpYe6bnDVjbQCur2BaSvBJ6hvuwNtJ7DcKb5LriLrZsZlL9vaN+iiC81y4fOENrh8J/d8IkC/vuxLHt0SPUTKsiDd6XBac37dJsq3mHvnQvEncV7bBl3G9dnkwb4PtKOIdRHLO4RFO+mLU/e24H7W22Dg+CdBm8adripn8i7uyInnPP2O/fqPNSCqDu6ztHpwYpcNYhfYfGHrznUV7hlR23Tx+akUSfIC/fk3RBfbN8udKJvlt+EBXaHeL3orpHntHMLOedEmz/zko01pfXoVgmJXju83l0zPqmMfVRN0AhwV8RPAnek+Y7OAcDOPL8Yc9yd90IymbTFuyFdenbAPbZcvNs9dRjtHyLNv6XsHcDPJmcXF0g8JAYvgT6b+xE2+fp0gruYO+U196CAr6ZOOb7ynfoSSOcEIdQzy7u809ltoBcVtxhfh5zus4H2vJcU22qYUK++dGSNHQOX1pnFP9CGPbojcTsC8F9+ectXWQT5tp5RwE5zV8RzMQ5jBPvq+pS99wF2+nuyRezdLrt1K9yTLN4N7xgWeuPuMVO8p427j40B91HFO4BP6gW5WTC/ILyzgMewK3Li7Zzy9+m+dJM8zT1vny4o4KsqWnyxfbsXrqo48Zy3bVOh/gch3TF3QZ7QM9Tvv+bF+E107UKL7hvtvlgKwKMvzy/F3AV2+8I3l2zcu+gencfeCfwXf+LU69Q4MQfvyt57TLcOQ/XqkOY7O4cTm5XAe4dCN2bTPK+uJMQ8HxXYOdTE51eb4j2dtubO1vz2URQOyuBHlh955xg8A72x+F0O0zR3n/10Ary/uVNBAS9az74dt99UtGNH1sm7eiHdwrzwTsw5UcWE+tB54JauLYvu3ixPgWwNvKR4WXS3pFvuDfFnbtoYKr5H59XvTamm8UmAjjFO5NXd0wPYp1XxPjWwq88U71RrRsFOkWx9Sga4k/jhiIjer2b+fEwV78Q9rYAH773bgftbbT3AHcDresAswkNi8NAAxkeZ+dXnXsN5zr06J+FwsyvvQzsVbKmthmjx5W2/aSynkN9mYOcL9Pzzz5N4x+Ml0XuIX1Pfro4hna6dbwPteTrI86anv8/VNrKuX953UTdvjC45l0nDd7H9yOsR4/PY+9MHHdS0/dNphfv46ChRh7mrMU0lbPGeYZiHFqOxmCaeTPNeJOy4poR1itU944Ap3tMS5tGrA+7kXfl7sjUB0d9dgx8g7N+gkbfLPRtTYD+d4O5v7qJgS62j9Q/1lTwou00N0v4G9Py2xsecOM/ba+8S6v2yPBnmBOJzZ3l6OmdqJ+gG8SRdsrxoCy8hH1V8yDfIn3bgq68eePW1ua39oIMOmn/72U8/nRxVtg7kx1G4k/eekWlupp0wxXs3Wcekineb5i3YA0kjXbwL87Z4j8nKO5fdoXaEedWbJ+/AfaQVv564z+oCnsCTd8AO2jGWCLrp0/nsp5MtNuzK+9NOXRsU8NUSQ30ZnfrG8tt1EHEX4t1enUXeVaO6Cy/Gi3Vb4L1Z3jbqOCvEd76veAfwOwm8ZHlOfGV/XnRJyK9Hd/qrWrmAPxS0px9+5dlXPn28B87OME8p4gd37JiG2KsD7yzeCfwwacckaHckKRbvArudWLzj5/EYwyHADhH2D7ejV6eq9x7j7630d08Br1iHFPDfZOZ999N5K/dlyAX6nKgHW2pzaP1DPY/NlYs6C3cMCKBzQBLq+UrkOXmIZ6g/IH+op3XjpvhudT997+W/anIAojsvBf1O25cXQxd7F7ff6LfY/iq8HQO6/upVsF/UhCD/4StKn346ooK8QZ6bbXp6RtTW+RcV7n1I8x2zFvcMyOXF4p0jRthHcHdGHHs3uEP4+UhtZIiFe3vv1q3AHcAjzqN85+q74j2RBO4m0JN4sq5RxwxlhgB1oT6dW7hjfOJTuZdZwB+8V6Dqh/pKBXpW7pZ2a/FOX16Kd4d2To35+3bK3DXxQrX7gPiN9vuS5WVPjSJ+505v0e7qzMJOVIcgTxF3OLw3yL9CPfvpMz1I8cR9lFEeY3Ba2XvPFGp3qHNqs9G4FO9WzYtI4lSmWbxd/jKBV0+wmifsvQb37WqnDXC39j6ShAC8EukG5FYW+I+W5gv06X4h7p7n0/kswpVcwNfU1Z9/wl6Bqh/qb72zHGPnBNHctbtzssS7OV5mUSMGb1mM91q39OE4kfia5c69hlws/n1IcY5JY7/pkjNXdea3yK4bnyzPHt2Bwrp+uc7Czh4dgrzFHd26ccBujF2X74MK99aJAdWrG+5A8a6VaIlRtHfD9RQW5FtXF+9hO0g7mA+Hm8Z629s17Yp39uZtnKe/J1/k5vtZXAuurMujgM937nWefTr/k3CFWF/rmdjQ3vsecNzRiampy4PwXxLxxR+bayx3FU46dZwoE+pZxlt/96rRvID3xlx9u42svjXlrs7bVBfSu3Ac1nEDdg28FOZ7b7wE8Z1DoJc3Gwv26F7NoSMlyDe8RdQpduvg7HD3Htymflf2/iK30QL3viSzPEaHoT0mvbo+hTt7bVHQHXFE3KlIbXwOtEMS5pnmwXsPYMcw/k4tKoH6RTF4XcAX2E/3paJdNtDS3Dl8onwxBXyoZp/9Tz7u6Ntvvz05NZW49+S9ApUd6tdA/FN/FF3Fb/OGefq6eLsQD6LF3jE8sOOVuCvixeLFum8TfxdZiz/4hN9+c4HXjTrIZvpz+Tvts+nMLWLtunY3784sYEJ1p0uQF4+/ToL8EIK84P6s6taNw90N6kpYjNux414U7wzzHYubjQYI+8peXTgK2LW/d9r4HuVfleKdaT7+cbvJ8sI77N36O4TfhgW8WsrnRnp1GdmW3dRSbnP/M8dm+RuKMHe/LbU09f1IOoVn+c3ee9/Rgb2XflDW3+KlZ4ePlS9paY6Y4wb9BnctefMIxiMI9e5WWm+YN5eS07ers4V7Ht12woX3/Pbbhl8JvPk5mju5xsuWFYV5zcZLSLxHmwr06I4UyHHb7rwE+d47FebCO7t1ytdx94z2jKo83zayY8eONiy8szcvxXvMKmIV4+NuWLy3dHZ0ZyYWZ5e33IQV7iQeS3FL7ZZ3hnlj76M9/T2DPcR9JqkadsnWzXpdTvwdrHPGhRX4cDzPfjqolCV3vy21NPV99z/uaKButXlxavbF++67L7D3/yLUP6X1YFFVvJTuHIjytHVBXoB/BEKnXuTt1fESi5e+3SaBnS8e8jf8Bv36008WeO6xWZHlAbwU5sriL5GttD59eR6IWWb9ek+Q/12CvIP7Mz2Kd/q7Nni8g70nprph72jND1jcE1Gyy+LdaqHV8A5UpWtnFTMKhxvae4m7G+fb3uqBcPh9BBaP3+dFtVs3qXkXd7e8A/dIOHefTliXKF9Mny7fmdjQPjR1Ry/OZhYV7YG9V79TT3O3klDvj7q8pa4C5hwaevF2XCQeoX61vTfKO6IuYt/OZHn6O6cc+lXRvuHvnyASr7bUMMabZp2nMKfFM8YL8ZfU+C22i72De2Pth5ogL5Ju3SiE4p3NeWpyx44XFe5U0u6j7TT0GtyboYFWipB6t9zwZ7kUl0qDdineiTv31rUZ3qHNLwL3zaY6MP5umP+G6qutTeXZTwe5514hv8rdf0Wu5jgC7tKemBrfDNgDe696qHdxLy3US1/eAi8S2hXw2xDqXQnuHIK86dvVOY6eD/edf//9068KeH5OzPtbCDlwV/OWLczybtm4KtRv8u3RibXbRbiL7lZB/usnXvHoU3TrWL3D3wk72/MzO+6dGGCY58q7VncsGm3p6uzLZKKM6cC9w8CuLyoRzdWrS7crf99KgXY251Wch787vEP8jci7U793Rzv6+nbl7NO5G+rKiPJuAR+ytD+nX+5VtCfHJ5I33XdfYO+VDvUpId6b5YV4f4/f5qCuBhfdtxl3F9gt8CT+eWgbqHazvKR5Vwz1lxB06/B5cP9V2TSJx/j1ti2QMne7leaSvbxi3459OtWo2yd/j05W4NTAvaJH1/DO/fc/8d5qc1f+vgP2bsP8KO+eybvuGs/oMD88sZzmF9BK44nYLrKOqSVB3B2D73BxZ/EeWWoXe5fyXf3d+sk71uPI+4uo3nWiR4tey8L+2k9yQM6znw4S4GntPvvp/Av40Mng/DlSjhvD0J649777AnuvxiMtAXwhc6eK2H4DV7d7bAq4OwbTvFYOiyfsUrzjawv8v+ydeXDdUxzFY1/SQdW+G7tQYx3DjDGYaQyxpJWpqmWIULU2hJHag5FIG2lRTWzDUNopSWisQ1tBq7SplKKK6ti1GPtW55577zvv5v5eXt5Uq3jnd383kbbjn356zvd7l1dexFW4jPoButNV4EUu0/8xD55uZH+uLB+Fem2gzdSjY3on6pi0oe5mE+R/Px8S78FinGnUtZFzmjtsftrI8dxGCzWVRxprKca7WPaO4Yt34a7i/XoV76nqfXIrCwjibv29nIFeBs+O3WIDO7QUT32Wc6/La+4q4NcF6tRAzq4p3zb+VoCet/cVdvtNNtz1UTTZvd1TD46TYecj3An8AL/aHoR5vrHFtxfJ2xOz/AvaMDPvj++Z6f+gbeNNXmRT3878wQN7CvJiHa+19hO42I4gT9wR52PeL0ideMfsjsqMGDa3iadk7Mp7qKmWYl+8h4G+Ou7VnXPq9DcaTbNOzXnybv6341i/O96rxgB4e1+W433zxQubCPtSDmhBvJ9OsJtXtp477yrg19721lsHAnW4OodR+ZwppD1v79SKD/UR7X1z+XxJxHgvS3vYmw+zvKRQP0S4Z1T50/MEe9SX/14b5hzxODYH4i+yUmGeweKV5eMe3fHBVJK2axZB3tJ+/jNJ1XtHtd1LK9yr2++Y2mRKd/A+PsJ9TqXfYfcQUVecr8pYvCvNi/fHefKduDveO4YNA/HE3QX6psqxxtU58A2etECfZT/dcvC+5VFjBt56q6/b72CgHzN+yhyT5PP2Lq2AUzTq1Mfmnn1P/aTgO1u7Uw51KTb3mHhtpM3MfL8qWHzGLE/SdQrmNJ6TBfHzDO5rZdvDidst4gMxkMydM1RMd0ePbvobNsiT9+RuXbOp3TEogj8avTpj7uB9sTjXaVgKxXt7eRrueFm8VzjalebPuRe0K81T3t8fJ+8O+I4x5N0QX45/OpouG8sbKw3pDnjwrj5dpg+JWn7eS0pnkfWBaUtwlva8vUsrooyXxcfmHt1anRV2vF7dYHfWjjfGHT9lGU/YHeqaY+KfFvFhoy68jwq4G33/PYBf548iLLLlqg29teNh5c5hz8aUcLH9pXfPH3x+sr3Xuep9Flj3fTpOaM6Pbqq39j63PNJDfvs8i/fy0N+bKkA6nqB4X8As7+xdtIN3AO94J+7lY+5gxw5qN7C/bwTeXZwn8vXq00WVO5M83ljH5agTLjes3wqP90twXHDP2/uKkEK9PjS+b4x79kM0ot136kQ8LV68J2d5FvpXDh8+nBvuklfiJPXt9p0XZ3k26lS92yOvIn7n3HDngRjld1JuiPfI38wg72G/zjzXZejWgXffrHPts+dM7Q7xiouoePd6uTy0dwCPW2vp7WHx3uLtvRG4pwEPtQa8I8/D4FHBz03Bbp6lJJ7+7gv4z7NcYbO8Bn/CuybMD7wVE9Te1maW4PL2HmlFhfqY93hdnktzSftr7IgElr3CLI9fkUi7Jd4HebxZ1O/ZwOK56B5leQmx/tx1slxUE/XoHnzwQaZ4DCtyz6nQLLYjyEvXcUrC/QK26SjDe7PZy24+Soa9up6K97HuJnoRb8/LVPjavdIX742hv2v1nXme5TvzfEe54b18bm0999d44HEFvbd4rshFfboZumr67wn0JSeUXjoM/o5hluAWL25Pb9MN5JS3d2oFhfpztgrL974x7knbbxTmE9UQmLt5uyd54G5g52RCPZ9eEN9vjO3bKctbCXrLOWd6fC6fH4Ee3YOUM3U+ZqIeMYvt77wLwIW77F1h3vLe0cb2vMMd7m5wB+3gncV7KBbvVC0cXcDb1bgam+QxXZFWvDemYG9UnIcAO2/FJPDG3TuqqgB7k267oBjoMfxTv+DF+wbPT7h8VqwvZ6Dvwu9/exbNHbRPaavytAv5gQPz9r4ihFCfRHzmbTi/XH2mMOc8iSPk3E4ydy26h3rYuzuFMt7G+cy0DxDxdxXNU6MuuHtOWV7aJpdPiCl80Muauyr3VJAPaHfEd/N2H+e5q84S31wN8myvLmPxTlVULmaaD3hvAunO3vHRFVdUMs0vgLfL3cM0T+JNpDDAd1S1z62dOwcyvHvWafD0dzderq6bXTcYuCdullcFn7PBy9yNZlx++rBpHc2tjS3VwxJoz9v7ihGJ94vxDPXJWT7cb5fV2wm8h13+Hlfu5rGDAvBQFoMfYKd+6NuZoM5Fdxk7v4jznD/XeUNYu6SinbQX9nFBnnW7WnUc8d46bp2HwB2/GHefgF6dTfMJxftcsm6m9227Pl0LeeUNHT4o3tPDfNCuY6zw9Tthx/49AS+Dt/4OvT9n1myo7nxlefM6xv+WAt7/s/Hbk0++89jElta3ZoHws0Lc8/a+wqRQv95To2jxiVme0rG5fmTddeWTgW8IK3dMKtxVukvEnQdls4nA8y7NL55eCtqxuh7eMeuun5WU5bP26AoD2h3w3GHjg/wiUC4J9+Ru3QRbQ2MyX8DdeJPm6e9x8c57qKl6ubuKd+KOyRfvlRWnYuXduzvGS5b3yfJ316/DhRdzwTrkr68T72zYoYR/eWH7LbNJu3jP2qcT7zmYO/Xbi++80zj5ibc67khx7mDP2/uKlD5Der31YPEn9c26pZ6h3sf5iPYGvg53teWTVuGGy98p0N4b4PsN6Qd3N8B//Sf+phZdcsmHjvg4y5P8bXLo0UWitxvazw6C/OAwzJs3iPKcsBjXbBzWh3nU7hN4PSXEUzJSeJVVjbV+AC/ia1P3U4P0Sl+8pzba0N8BvMFdwNPiWcK3Q5b2JN5fXlwO2El7XWdd3XWXpi3C9Uq50E51vTjxybegWd2jfN7eV6hUxoN3Ep/Z3ONjc8Q9Urq5qy8vf5e5K8mDdioL8QPcGABNmLp06R+XGH34oYB3nMvc18g9yEtuKe5HE+RbfifoeDkEPJHPtLeOtTvVDNyn+JX3qRHuvMqKqpzjaRfx9RXkHU+Fpb2SxbvSPOM8N9f5/ny1C/SOd2vvJD4M9AvnDBt+jHN2qLOu87X5hN336UqX193VpxPvv79l1MEoj8nSnrf3FS2Fekpb6jOYu0J9piSvLB+Zu+TNPSXTu++ZeDFP3vtVw5deuISSxc+TrduvB+TSo1OQpwqZ412PTkE+Ic5DYelOcfF9dDVf0yRH8V7PXfOJxXuTL94rF1raMaUW36dUpFQJEXcU76mVONXvgb+nLtgYXwXgRbw69IvbLzjGwn4LULdPZ2dZvJ8uM/VdOZi7tOSttxbJ3i3ueXtfadotkXiZexzqbwTxibKsE/XMO+oIufK8A51TZuD7gXQ+yvKQiM89yyvIi3UvsA4VuiAfGvvgkHfaewj8MyjfLzdRHi/EC2bGNzWNpb0nFO9tqZX3Juf35nGacwXd3RXvzPMs3j3uoF1H4zBAO4brE3IVsIqfLauGHU/BIsUfY2m3zo5hNZib5YX68pt79MdeB+2q3s8C7nl7XykS8aeS91NPRajvEXeF+tjaVbmHJ91Dc+/m7mC8QcBTDcnAYxD355jlJYb6M7p/FORBvdlUxx6dYHe8u0X3R0yQb/zy/MGDCTtHuPCOx4zQ2p8x/wCgW+dgB2/TynE/LIp326tLLt4pFO9knSMo3kk8WOdg8e5511oceU8ZvK8l0K8zHT8Qr4YdUvxIsJ7m7Xi9XrswS59OtOdm7lLpl0H1PjBv7ytNCvXnGN4BfLSlPmOoF+xWYaNuuMw9Kt2Fu0Nd8mtzoWTu/Za9THMPddE82rt0QG+C/IMPzpw5U6RbcSedD/IR6CHx8VZa/CeEk7DN1T5RT5gwraNqKnFPLt5rvLtfRusPq/exFnYMgI6BN1W84yXujPMp4Nt4g1YrkSfv5fwsKc/7+PazjqFs2e5jvCceBfwMR+Xy4S7aY96XsHp3ytv7SpWIP5XAnwPigXtW4G8D8CIeI9hAy9FD5e5nn+OFO5WY6n1f/o8PI9xtnpe7r9m7Ht1MyCCOR2U7cC/s44I8vD01EgI9eRfszxhvB/CI8x3VfjMtD6OOdtvmdT+lVH+Fl990VyVNVfEOZ2f1blfetddG5bvqd5fn23ghdXs5zN2qHcZ+ose9juo0g8R7f2ejbsWYu3iflYZ73t5XphTqR50KjRqFxfistP9y9dU3olEfLboTdKuM5h6swgl40U6Lj+0d6wLLlOUl16H3Fn8ns3zWxfaZfDCctIfWBXmb4zFn7tTR4WXtkMEdcf6WZruLFu4K3Kdh5R1LcbD3+viKiykp3JtAump3avEV3t6R5q1UvCvOh4H+cQzXoOfnx5nzNoR9rTX3ONHSPhy8g/VrzeiUv7/22mvvvvttb9J8bmvucQEvez8rb+8rWbL4XUD8OQB++mZ9s6T5q41uO3OIz/PxeThbuEuGZiGtRl1k7kkW7xfdoyyv/jwmR/wBWXt0xBwvzd29/kTM2QzyZYNVt3vmOYv3IM4/42gH7uzWMcnj5WGVqrn1TVx7T7riIlW83+Bb8/xCtV9W4cVGHYYv3vGQdgGvy228DO7mgptyLMCX37HH6gWrb0Bnd2ne27s3dkO74X3G32Tu4j0u4BOb8zuuXpDXSpFC/ahzDPDcb5dRMHcKFs9QH5l7YpZXkKeYAES8cFcnT5trWbpPSM7yOvduQ/2G2Q/EeNZVuLtrLQr78B6LwdD5fAR6dCTOdexEuwGecZ731pH4ZuCOg65N9dDYsTcsTC7eKRbvgp16KK1XB2HCMTmtvGs1zqZ5DPLuiG/zF9yUl98x4sSRayLXrHulBX62GTbHi/Z3zQve385Ce1fvN8x3ZeB9yR0x7tuuWZDXytb2h4yymr5V3x5wp7/T4k2jvsHTbh8uo0d7bAg8mbYT5YEX7RJwpxDkOSVn+TMkYn/QalkX22cqwAfLby7ILxpcBsQzWLtwp2jvmH2U5zD31jnemeYXNznep541LL6f0qlysbd3NefnVkCjtPJeabbND0XxLuCduWNAUyzvbZPNJdjuHxzyPuyO805ctwBaaw/yTtHffaPOODvtHbq0NFdzL87Ee0kG3i+Nu3VrF+S1EiWLJ/Gy+MQsL92Ivp2CPJTYlx8ue09chhPux/hveGDOKnOWt76eZvHb9GIfHYlXW944O8ST7fciyNPa4+6cvnF1OydQ7mG3aZ72/pY9IlNti3dLe3190x0jR3YjfgoQtnIn5gQ8i3dv787d3cq7684bb9du2ikG+HR7B+2O9/byYSM2sJ+Rs8lwy/tw8m5783wd7jT40hxpP74410D/9oBuuK9bkNc/pI0O2cVbvIgPszwlix/SQHP3U0NyllejLjb3+PzMkECJWf5D4G6V+rru6r05EEPICTvLdlq7D/Io3MvKzjdfzgf64lwi8rHIOibDu906z6PnuFEGpDcZ4MtHQiB+THjFBfWQrdsxqLh4h7jyzo+KC/bSpi6e98S3OdxdnDefJjVsExt7Vl8foDPPq35Pq96hLIE+genjoeIceZ/RGfC+62oFea18KdRPnw7cp2+1VdS3g7nHgsUTWrCeuMdGm2wc+HR3R3pM+zHK8v34Isu/nyXLU1s/vAc+XjL7PjrwrR4dxvHG2k2Qp+jvkcUntufl9M7dMQP3DtcZ573vU+udv48/ceSIkSeKeH64hFNtVWDv1A0h7hA+SXKQw52wR9ttIIO7eG+GzKe/pxrfa+9haQf2HnY70d0xjN4uzcXcyXuuBXyZD/T5Nt2qIEM8gZfFR1lekR59u2sm+Y+KEuuiXcbOyXPuM704dxqgi+z6YZgsP/b9/lGWd2neH3+/y/xDssnaqycHeQIu2CF/RVUfBnkDehmeoFXH74W82nSJ9u7j/AR7JI73SLXB26mpI0eOMMSPxDvCEv+QinfHOqTindW7cDdLcdOZ5rV1nvfaOH+fouOwbRi2encXWqXu511zk9lBbx6TFXF3WlLa6z7d8VTOgb50vuE9f3vVKiOE+ungHcI52SjLx8gj1JPdzFneS6BTyVnew06DXzZ1wccfv/nK1KIPA3Mn5g518w7k/6ZhD368ZHyxtIfdJfnC+4+nNfkgX1YWejul7+N1dwyV7pypTvOR72DN4Y7i3fbq5p4Fb8ewGmGI1/2UU/0+G62+t12hjTaUPfOOYzJGAfDEnaK9s37ncmAK9y2UczYg7FaK8/hieOfLFblczD133kuPnT/J4p5vyq8q2v6QXbbayhLfN9Hcb+TEBwN9u0kNibiHF9mI9agvr0adAZ6D5v7G0KGD3oTeeL9IuF8k2Dm2dht4IHy8ZPwpzoA89ZVH21m2+yAfCK4egR4wT4cPvd0bPLt1tHdXvLvefFO5gRzjxBH4QpfXtvmxauDx01unzK3HAVnhThncf/Kw6/Ofg8OwfrMNLs5LpXlo/7QPwV6Xh9097Z3xghwL+NLs5i7acy7gcQDvAVvA55vyq5C2PwSwpyz+lyjLE/Qg1A9pCBXR3C3IJ+FO2DnR3r/+c8HQoTeDdhK/sL/68oG+wJ+czTV9IL/Hmt0/IYbp3Sf5QneTvAvyDPEcRF1cE3rtpNWBd0i4W9TtSO2ta+ZKnF15J/BzaOsnAvejEesN8WMeuuwyuDaL9yp84stC3H5Tc1nlFe6aOi+leRbvob074tmsm4heHZFvc/ZOGeCPTE/Ma+1TJ3/3DXrK1u/UhaVZ+nTCPXfeZ/DS2/MR6NcvyGtV0ka7w+IhWrzCvHjny4e6DWV8Q9Kiu26e7qktf4z68qnLqZddP4jm7oRQrx11Uv/zhoN12jvGPqu77Lo3/0rqM6Ho7sjxxcVpQT4SMccsZazdBbxvz2Nv3TQTpdmrmzalCTK9uoVg/UTgTmO3iX5sbS2BxzEZUF9BzKVRVyQX7wQ+3GrTaOw9uosaaja0Y6B4l9bYsQ7Ai3eMFO+Wdq3IZYvy2XnvSjJ38xxbNmCDfFN+lRNCvbf4P5MNniaP1zJvdthmbtQJ9oyL7gAdD8c118Dcf/rYm7ssHrhrwR1ilqe7zza47+p7dMencOf8IF/8EP/JjvzHjYtYtJfZl16O4Zp1euMKXqQTdMt6p5l5LS1Qg71PG4Mz7754dyl+xFn4kJc5i2H7sHKKfu6V+hY/xSDu+H14leYZ5YOT79bfbfEO3hHivb8z0G8RdjPWr4vqd0s8aGeTngV8afY+Xch7cS/N3V+WdVS+cF8lpVDf92IR74ydg6TL4rE2R8nXvRqU5Pk1Q6OOA+o3ZMKfC4h7qMaPVLpzPp3ejgm8NzSs6T4hptjIcG6hJ+zG2wH8j+rIh6Kta9s85+jQe2JzXlvnr20GZ3D3qmk48+5UPoyU42Pfa+jqoUh8BZ6U6O0EnrBDV5w66l6gbuXCvK6y8ofjzMfLw9GryTvs3ejwgpD3tfcQ7PahWLwr0Gc39+y8J/TpTJTHg/motQryWhXlQv1mEIgX7HGe98TT4i3MatN5c9cXebtwhxjkDfBnLmthlg911aOPfjOlKD3Lj2BwsLjP3mc19uiK8XfS/K0k4M7c+b2zdgR5a+1lAeyOciEvlc13sAP6kPKgeufiuy3ep01FmKe914/FRRc1UC3NmkPijTWBu1cw3xN3r1PPGdSCD49qMf6ug+8eeC7FVY+DmRtZ3J2/H9l9eXLNfci6Onb+pAx559CW2mTahbtU3HtzB/DgfYt8nF9FBeI3s8CfhK4dMYdshtdwtGNw+036brrg7CuV3Jf3ZTtxj7I89fyj0KGNC1PE/4okj2EbdQ3rmx7dESkPgsN7b7ffF6NHxyBvSC8LnJ20842D/OD5l84vS52SwSsp0WOGvd/yXDM8FttoUbwDdvM62I21e9JD4JnqQ3tHWT+KxTv+CHfaLGhpIeze3jHrMOzkVgM7cDfEj7aLcS7Oh7GZK3LAXCLtlGfdBvpczJ28Zzd3ejthN+Dvl99ls8pq+0M228wC70M9EOcsb5fBA3i/Ducla/fK0Kgj8sAdWX7Q0KGxuTsdOvEjG+hPt3/YCll+tb23xCkN60E+0LseHd5HXEeepIt17bIR8Pgi2o0Ga+O8WOek5Xdj781M89OmzQHqRsjwN+Cpqa1Bkge9kblHdTxYr6CIOwTcp793fcv1LY2A3eEOzD3treMM7OQdj7tnA7Qb4FW8a0UurWEH2CXxzi12udDOQJ+tT+dloT8sv89m1dVGu4N4yBIP0O2AAnPHw6YdkHWfBqlGXZbDcKY95x6b5T+Os/ztj0qfG4vv//BwyFfu+6y24Z4lRscVQ2Yi7LB2Pj7IsznHMO8nSd4u2OHtl156KeK8Lp1Pw13Nuk7upQVwpjWvlfexcHcrizsGnpB4Tp540O6Id78buLM1b2+1MSPYbDN5HMzdPIzzzeajYR939q7iPViRmx25uzssAzl/v7BUfboI92wGX5JYuace6/CHFeS1Cmuj3Q3tCvWuKy/J3e2nO09KUe0xF/OydSd9lpQZyPL3Dk3M8hJC/UfPsi+PMD/bAL/uDkeUUADdGryCfDF3zQ66d+KiBMbLLOhyeMi37IC6HfivoHoX83icOmfPvvY5uHsHVt6BO8K8Kd1rXJqnvYekC3kMEk/cOUZV4DfbfxnOMa35lmCrDYa393Hjxo22sJvBtXdr8FHxrhU5qhNvursr1HNFLgdzD3nvSqLdSvaeb9et6tqexPtQb23dlvBinWvwTt7iHeaScrwadQQdD6dljYM+/jhTlhfw+37BZXe7jXfIYV1dXSUngHbzFw4W75bdi4n7xmYf3b1PlsnZu0d6KLqItuxSyNg74rzz9jDOQ5xTcf6YDqzEwd3HTKl3zbqHGOYh4h57O1+PPMXqHcP+GNBXsHjXYhymibroohXW7vwdwFfbxffRFIv3ONDvmr4AT8i9wbtB3rMswsXKbO7ydmfwMw7LN+tWfW20+8FpxItz6TaT5Z3g1thgqyzvlHyxhefdDGygzZLlqW/OuKj/1qc/7Pbjz0f8LOkqsX/fAL7FHaRDqY68wRxSVz7M8Zi0+O6sHSLuZbrCykkH3ynE+c7hRz9Mey/fYjtHO9K83B1Sdz6WvXyWm2/IvHV3s+Nu6HvXewXX2pi3FWkevDt/H+dOxo1jntdlAMkrcp0K9Er1dPdvl7xekou5i/cTkht1gbkftWFBXv8GbbT7SQ54E+pJvFCXuQt5T3q8DCc52CniviC5Lx9qil2Me3Yg3f3tUtNfQpY/gV9p72Dd6EcX5AF6nOLVsTOTXN7SjoczNJigK82LdZDOsc9a6+4xchpw33/NgjXMyjuBB+0YkNxdwDtnl8ODcchut3O/k8U7WnUt1t0xC3gW71BzCnjurWs13XlIxXsPK3KvdVrULegOdvGelXapONncjyuGv8vgof0K8vq3aHtH/Eku1IfuHuA+BK/xeO2hxawkL3O3pPOxG2iHZs/yRX7HzdZfTGq4j7Qb2EsJPf7iwdups22Qt76OR7CLdVEOkfoygu5gpxL2zT/D2cmsLq2+blXzBPPNagc31XMbLdzdxXlv70Q4bs67Ah6/Spnv/T8QFaNeAeyK8552vLY3P5pxHjK4t4J2o3GjRx+pzJy8Ihd36A3sYH0JxpKu3HAn7zHtJYhYXYG7H5Vfh/tXafuDU8T/8otQ57q7SHcDAvA9L7oTdIpZfsGgq56/Kou5f25hdxa/CJgjw4P2Uno7zL2Qx10LzwbsH7f8nkrwZD5JQh6TYDePs3fgbh4M7+xEHg+sfW2L1hpb2G92cq15rLz7OO9b8xkCvezdq9b9Aay8v2d4bwHsKt6Z5S3urnyHULxDfreNTsnEK3IXpA7IkXd6O4al3QH/QS60UwnmXsx/B1Cw09zN1y0K8vp3CaH+JMM7hKU5n+Rp7qEIPC0+Oh7jHV5RHjKL7q9svPHMRx+dGRCPH4Ra6FmfZ6aixb+XmhYwaO+CuZsld550Nz26QT+9wyCPlxPBxxx7PAaEHp0v28E5Zypq1ZF1++7THaztUrjXAHeKCAv4iHQ3+Js47O6cSlu8t6h89wLuLN4psP4EnnE8LNOKvTePw96TGuA6IxeuyMnel5D4JSBegV64Z/H3KMq7wp7teZr8YXlz/xdqexLPT5nDofioUadvCDE9Pl6FU5b3v+vMZY0b3/ymRfr529WoS87yQr7/NYMvnDGDtCPIA/ZC3FTXx3fkSbmRgrwkzvHS2ikaux/4vsyZO9/wNtp4m9iGc+sBvHrztRb3Sjl8mOcluXuNSwV25b2FQ3Ge/q7i3ZXv6NUZ4FvtdpuefHSNfYLjMkSdrzP4JUaWd9GeXd147/J/kAW8IT6/CPdvFUL9SQQeof5kY+63hcZOkWOnhsQsTynLt2y8cSq6F8LiE7N8o+Vcerahoe6Z+TNsl46sPzgTtDPIy9c97XxD8NF7Z3eetIt4izqJZ+0eeLsL8mslVMcs3o1uCNJ8T815/LKVc/gaX/VfMeoNE+aj7rxbeXcC66Z4nzwZsKN+h8GPPrynBa/Vdw383QLPy2kXkXYwD7lAf3yvVVwSmrt+buN8fhHu3yuEehJPi1dfXvJBnROB7/kGWp/lpZm3X5Wc5eXtRfPOKDq9ztyPOR9rcQjygL3wwUc27TN0wb0I8qzXtQJnJo7I4Em9SOeA3Be3FMeZzu6kIC8FxTuxJe4+zovuWCK+tsbpsnPuBex4WsS7gG8V7dDjVCvLdxXvyVq7MwAesKtdl7L412XuufOOsko6DnV7/gDsv1wI9ZC1eB/mQbedleU5u0wfLrpLzPLXb3xz9zb8889nyvLgfJ49+j5pUt2k+y7twl9MeLvJ8rR2bq3x1k6J9Jh2TEA7NHdn787b7ZR+u8VrGc53ceW9yYV515qXamvd6FFuCe+G2oqhb7gwj5ercZZ24e432zzXOtmleeZ55Y6sK3I+0BN6C7sP9KI91wK+OPyF0hn5Rbh/vxDqIVq8mnUg3cLOb5xk8cdkyvLvMcuH+uSDT8IfTOxWuRfdNamhrnNGSbHpyBtvfyQO8pBFP2Pt7q1dLXnO3GajXXWBFOSj4h2s09+V5gM54oF+bOycibvNBRXTTZqHwtU4rbyPJvDG36t5tU0rl99bq1W8Z12Ro7+rgHf9OooenRPw3ty7/7zrqPzhmP+AsOEuZfFfw+K9HO5+CohPzPLLJm5888aOaemD119//ZOfH5U+Euuc+/drqCsrNUG+8P5CBHmz2L7gp3e+LbNSkBfuZYz1Al49ujDN8x1sYZdsllePLgZpZ95g5Q7BeuAxRLt5STunSJW1NX7NvhLFO1EX7k62eE8txqE1z4sqW1m+V1fHxXt8Ri7eYfeubdgJ+C1zxb24JDZ3rsjtXZDXf0Is410Vb4gfku7vsRDqmeXjRt3NURv+59epD1LEf1NE0jmKzHh60n0XdpWYqh1Bnj26QdMR5GXpwRocRnxEhkFemKfbfJkL8nR4wa4gn8SRL97HPiTY8UrW2zlJlRiJxbt1dwmku5ttsPLeSnu3yLuL5yF063RKJvuKnPI8BnkH6I73D3L295LY3KG98otw/x35UN8XjXqEeu/o3uIj8CddGTXqkOVvjrO8xZ0WT+KnyNqpoi+emVGy5f2FMwuBe+GrhvaPG78U687UFeNl7MJeiGsRDg+tHYrvt9gn6jrFK+9NSvMEHk83ZezUedxh8LWjhr4H3Il8nOZbW+nvzfZpJe5oz3N7XdbGGFfkpGAFnsC7Ah6856bjuAgna+e8Q0Fe/yEx1BN4hnpSriGF2EvLGu/Bonuc5SlZ/ObaX8PR/90TSrYsLJw5cyaDPDvy6s15eeA5h+LOmmSJdqHeU5BX8e6PySjM091rQtbp7zHv3Yv39wzrcnhHOweKd69mvKDdlu+Qivferch1Qo51M7k0T95zCvRkO1692zO/CPdf00a79/XAo2+XBrw83l0nT/XrdZYX8S/qMlpCX/QYgjxgN3o+LcjzlQB6mOYFfUy7t/ay8K55yM7YNZsFIns/JXvzEKnlG6Z5TGI+uTWPP1vpt81rKU5rcQb3VvE+mWqFv8Pho1MyyWfkLkj397Q7rVz9Tp3S3eCzGH78e7bMn4T7LwqhnsDjlnosxRPu7BqA97k/X7k5Y5aX5gRXzhcVvbjlcbD25w3tZ2+6qYK87N2DjslR7vC3IuwXhqhTjnZdZMNJi+2ZxVMyzPK8wSp1ywWHcHfMJ0X5uHjHCP2dQvEu2Onu3t5BvIr3HFbkPOzcQk/YVcAvj/YsyOs/KYT6vuAduvjkMz3wgj4y9gF8uegeZ/nutP/2tD5BymyXP7RrS1g73Z3LbwzySZKZu9fTTtIjwduFupHSfNyjS95o0+QurIOCzrx4J9UcEfLszddwXMYrLoC7aOejjTZOLN7950SC+HEy1N6tyHUSeIs7Z4/7byzgl0db5hfh/rtCqAfx1uJJfGLRLtgxJkx97+ZsWR4al/rMOLOdbjJhp7m/aqyd91jI2CHCzYeT/wlH2KMj9rZHh5nWLuCV5LnYnlUbsnbHy8unKUd8d+YzqtZlea68i/fA37nyDn9v9by3TqZg7Ua64qIXK3KzHfEM9P78O9M8B1bklgf4/CLcf1vbH9yXuuniX24T7JxD8gn7gCF/zv3pu+8+z5rlYe5W/ZcuXfjiluzRPY+nz6abDl0wqPHbyNQDd/fL7/5bBfnkHp3212AQ+v165VK84sItxQW9eYizk8w9Nnhum3fFu8NdO+cxrLRt3qy8I82nPga6NSzes6/IxS07A/0SNew+6DXc+UW4/6Ec8fhsSazMhUmeg6zbaUC/P5uWLv3jw6LJh/Zo7r/1J+ufGtwrNz7ufsLuenQmyAdiya5N8/qRenQXXijgVbuLduV50q7F9qzFO+0dcvdTxotxqtzj+p1TTVC8u+a84jyQx8o7z7xjeDHMU2jW6YqLXqzIhddS68iMKvje+ntCWy+/CPd/EEK9A164hyLrcPcJP9UvXcrPflz8zqGZzX1ZKstf0r+pz90I8s8zyPfps0BBXrinYe9x1wWVZYQdI5SCfNiXx3hmR3l71uK9Hk8TcJe586W7C/eeenV+Ea+WxTvtXd15Ej8Rw2R5tevA+Usq33MomLEiJ+C1IufPzCxasmTRkkW/fVMooHMx9/wi3P9E2+9E4s/MyDppH/Bn/Vjizpze9tnPWbI8Ld7wDtgR5PsoyMeiw1NajNPy24Uy+DjIazbAd444b9sN1updLN2OuPtt83J40S7i+XKSmPqNQLzbNm9GHOYnmspdavUfC9tqNtNGfYYsZ+RUwl9++eWzLp92+axps6qmlXd0VFWNr2ofP2fuT82n5LT87vp0eXP/Hwmh/uIMsEOkfcJc4P6HUEaoT8zy6bRf8ukb4J1BfgGCfHLFri9aeccXQ7usPfgyX7CnWTueC86Dvjp9x3XXWK1XxTvX4py906QV5pXlvccLdg+5GU6+ePe0i3ik+cnpab659aW06v1xFe+9W5ED6xb5a4cNG2NUNWZMe3lVeztQX9w29afvGju+xRE5sZx1Ob44v8PmL/bOPaTOMo7jeZldyDa6UDFbhFGNgVFtGUQXCCo3ik5GBF0caDG1FVnqqAPVDGotC1Qsz4kK/7AgzDZv1QZ1bBoxMz2gNWu2NsFao+XQBNuo7/N9nuf8znPeY0e7/dF5v+/zvu+Z3aHPvt/f77mctNOF16z5sOWsZDNx1tx/n2uaVeYuKkCoT57lpzD4aP9wx6fPo0cnQd4rac2Zz94eHV8S5HmyjQO8XilfStqPHMb//YU5mYuaebcn2oBeXJRLvNi6CJhDpJ0vyBTvslMm/lBaLpuXqfc9kC3e35NdMoudkfsSFwTaSxobyzDKlKsPT0z0REB79LX+wXF13mTKBTf+Cpv01YX5auPah4eFeLF30n5W5Fib4C7EH//NO+lOvaCIb58KDX2KHp0E+XuSEi/kG2+ntZNysXgJ8uM//TQex7qmfXuVYr34SEnZFdS67BQk5dPctbvHl+9OkjcPF3cSjictnuLMu5X2dj4ozrwL8srcY8DLEReLnZHbBm//cjsob2ksqymjq09MTEQgfHH10PtjY33NI3fyi/g4RF78b/Un4dJSKy67+uON6irYddbTSabcVaOuqW6WWV7ExTRrnjr+hei45PgXpqD2wz8d+vRTftejh3Rvk16W16mKHcMiT/ZjQf6en4bCuwk5IzyR/2gbnL0YvB+Zv8LqhryslLtkGOaV6tTDG+iJOm5e0qGjqxvocWGXjJ159xxjhTTfYUi3uIu9v4fifYlathr2Pqg8XZk6EjxQJ+zR+ro50D7WP7h55KtbF128+5NwaacLL9u48eOPMfCwof4sifLQ7zD3WZi7Kyydw3rZc9+PWfywpZ2wA/rizR33fXpX98KMW2lj59tYOx9GAj6C/vi+upnRc0O1z4rQo4O3VxyBeg3s50JXrGXfLtURF/VNSm1NTbK4DiMmzbiT5kk5pT5K8b6V5i4NOy0utJHy3fbquDdOdsksYUauT5NO9Vjaw23H3usagwabS7c/oQt4PPiUl1f+JFy6CVlewa6ZZ6gn8HbinVm+bvbogSS4E/g1k92xLD8Vc/cX2tvbq4J7Gw7dt28ByCXAx/fov37EyuZ4PvlGmIe5bzoxCl3xzl6yziBP2MXczwXu1NVrF+rbZV6DeTgMEo8B1cmud1G1t1dHzFnx27JfinenOQ/g9cw7JbgDeE38ThTvS1XmVUCdsMPaNe1R0H7s0B7QTntv3rb9HmxwlTjvhf1WfxIuXbXiwqvJupUK9Y2EnebOLA9zP+rJ8hvjtsI89ZvN8i+QdWb5I5XBJ8eH7nqTm2JS9Or4yaysIen84OnX3X1397GTHxilzh0+iMNm30KQ13X7/Pz8SsHdam1e5gLFu7V3SvfsaO28BHZnOk69Ne5kHU9Oxb38rXF3erub54E7/d1N8xhYUXvT0oN09rBhHRdZp44dehe0U4Plm9/evteuoU+webeL529zTz+tWGV8XZiXUK8n3WHuSbI8jF0Pxf2ac18L2cIdzMPcp9orcCTOtp+G3mjwMI5LD9nlbjryxtgN8I63Uwcb2mZGRwE8dUWotsrAfgS4W3OP6ftzv/8eFp+sb7cKpJN4ejuhB+x6iAg7hgi4M8vT2zmgl++zad6dioO3Y09cN6I8huDO6l3d7y9fcpi/adLQPklvj0Y07VHQrtWHOL9tOwt4x+KFcn+bexpL9eWtvZN6rUcR6k1fPtr23OzRAm+jToNO7KEDFUfaQbpinUKWr6wMVo50DH12/E97dPLB9ugo06Mj9KLjc8jyDygp5nGvzAXuxcVHcmnutHZBnQO6Os8T6pdzU5wYPFT3onPKxUJr5wm6vvXTFO+ULLdRxr6vY2e3cvbubmehDWTS/FKL98wbjbNPdBJ2rTCm4AzsrN7B+8jI17dJE94O3vILfxIu7bTiQh4uJ6jzSRXsKmGWV+Z+NIm5E3f1IPFT69evrwLx9HaMqSOV1N6tb+5I2anTK2sIeSLo8oB+/qFuBqAr2K1Gp3Jp7RBYd7ydsGvgPaE+8+I42nXDzqR53mLvSabixNz5kuIdnHNAMPYOBXvHawQeQ4p3Kd9vXOJMHGjvVFcn6/ZoJNIzOTk8EY68rs3dVu+lVZixexbHT+Lyt7n7Eq3IVyle3a67U48WtJTcEoG5J8vyG7W5g3Y+jqynKnLbgTpGezFYDyLOH/zms3cTQZennYCzPTpCjtt+dHVcNeoM5mY8igJiirSvNNYu3u4IfbvE4h1D4jym4si7d22da+8xV5d2XfXL+GZILcP6vg7A3rETor93O2mesONi8b5E2mHsQL2ns6dnYnK4d9fhwy2T4UiofMzBXfM+8vmt4uXyssPf5p5+QqMuHnavHp2sb6uunvVmebq6pl3dB6rWGwWO5E5Bucjy1PaOoYVW1ZmNrgzymnBh3ruwDn/gk7aTxdz1gzMGJH4lvN0meXV7lJewbB5yZuNkJ6x337sA/6Lt1BmLx+tFXbzHvk+mAwLt3RiKd7PORnDfh5thfmnF+3mEvbMTjh7a1XJYKxSJhl6q6PPwjuV3ZkbuVn+buy/J8qQdV3Lgj+ILE7ccffSAZxaOoscrzQP0IowiRTzK+PbDlVSgsnJk65tbxdk15PKZ3ToEeSsT5Am8vS31v21tmxFz53NU/p3g7m6QT9C5WZ4jLgzreECmN8/badZJoCf05BzS1p640EYNejsG/b27W6GOu9st3gl83kmLVx5oB+kf7trVQtapXRPh4fKKimYHd/C+mbxjRk5bOR/+Nvd0l8ryulFnR6Jmq7dsqT4Bph3gAThh56WALy4SKfIrYO4W+K6hoX1Olk8UYdeYS7vOnXWn+6tGHRkX4h9ld9BEjgNrDOzq8mhthvfLJQzvBJ4z7xjene/urnft7bj55F39Mop3yztxh7o7utUA82jVqYvq3qO1U9n8Uor3ZcMffgjQIYf2+snGCqgvgffN2t+fvZOQJwvz/iRc+glZnpAvSPsJhfssjRzEO5PuMeShAwGCzieJxxUIatwDX+7c4RxbxZsvPlC1exS/XD5m9D/vQ6POrdyR5R0duMLQztrdVZ5nl4yRxZ3FO+UEefOKybbpiL0eL6rifWuM+D3a3Tve61bdum7p1knxvlMfZLX4Iy6yL2g5DM5d2lsmo51lFUrN/WOiPvIeBO+YkbvdWW/jT8KlsSTLLwT80WrgftQmd0u8rtoJvB7zinWjosAZp602+Ac17+/ONXh6dXyxIy/eruSstLHiD22jDrfVRm3tojU2zXuV5Vlow2YdZVfaSJzHtXDx7k68s3j/Jm4WrgGkg3eU7oCdYV7d8bh3YMM7xmuL3iWTWQjSrYT2SKS3GLC79t41pnDfXLWN2+cwI8csj1uo93fCpaNW5D8qRfuCWX7LCUM7nwdAPL3dODyZLw7EKZh9UmbO2as18IFKaEy6dW53XoK8kXx2y3bbqBNz59tkecnzsVadN8t7Zt45FccHF9o4y+ZxeRfTml9YW9cPfnj50xjuuBuQ5ikgD4NXYX5nLM93MMrD73F2XVfXecvyzjvvvGWpaW/x0r4LtKNNBzn23tXVxfK9tOpt8v7wHQZ2ifH+JFw6Cub+ApvsH+NaMMs/NCuw08vxoIyz41oprMPMz2ZKzDoFFr9eu/6Te4Z2HCTfzro6Z4k8ByRW75TuulHnWDuyvIBucF95Ba09VV+eR1zQ3mXmXdI8eYf4sPV8jG0+KJmCZ/FO3PnYA3vX3Trj7wAdg+p+990OgK64BO79fZHo/bsvSTUFd4lF3bbpWpjkSbvRoNAOe2ecp79zRs6S7p81ncZacVnBCxCI/9i4eyLxinZj7gpr8wZn6g2Z6bgjGvQNlYr24Cn2f9JlZ6w2wNduHUqYfMeQyXbzTOb0GnZm+bnZGadwZ5ZXwAvyK+dXauC9ykz+5RLEnYO9eVxGbTHhM4ej55xIz2XzstRGt+ZJe0cHgjzecVNx3QDy9THotdej0UPR6O7+q1KU0esM69bb1eddHw6ESbtRcb+mneqzvG8n74/cLjkew5+ES0tdmP/YC5Sqxgm819wfegh9eVlOQ8TJ3CjRJ/AHKgKBDQHclUqr43wjc9kZVVXNm0f2viZxXo6f/VrwFujNHb8Nlp/QqNt08skzr5J4yfKu5oE7gL/C6/Brvbtk6qV6h7lrf8eA+HBo9/AuE3EY8TPvuninuvnoJux0d9zQmFoE17V7N1l/p3+sv7//z602J87bNelK++vVFJxoUGinvT9TyvY8dQ8LeNkO60/CpZ9WXLqGsFM21Lu4w9yR5Qk2H8bcKRIP/JnlybrWGW7VmT8xOTY+vZdx3pFsd3V4F6fXuNuPx4dmgTsEi7f//ETasdgG/k7i1yY4fF6yIy7IurPtnSLvLvB4JHV4e6rNFjXzLgdQd+g0361oJ/DAHdArKRhxR4+BdU6bKeX86RRci4ikUwPhzkZiLvZO2l8j7rB3tuvIe2xG7lZ/J1z6asVlxtyF+MQsv0Vn+Uc5LPDx5TOBP8woX4mhlJN4ksTARO349EHEeWvr5sWTazycy1J5og4R/ulP2jZp3I3Fj0qWF3MH7lqFGVl5N1ri92MJrbiZFO/a28N6pQ2Br1fAH2tKoB3D8XeJ8U7xbu2dC22MdqpBf7fluyJy7ttD0fcN67z/rHjPNg06FeNJu/H2zjI25R17B+xi7+C9qrTS8K4PudEW729zT0cxyztal722YGN8llfmDqQpu2SWWT6e+IIK1X+37r4607O1fGD3yPi0xPl7eFNfW9blxeNsnNk4Pn5uaDO0i8WbBbQO7oZ3ZeYZy9de7WR5T/EO1bvdOlo8H0K7eSTaOp+GervnncBD7xrUIdo7aOeA9swd+nTu3S6gTtbxOtj/Z8V71kXgnHJoD3MKLsHeu+juYu/gfQNwJ/F6j5x/1nS6asWFaNS5ykb4zrshBvzRWJaXpjyzvKuVlRtQunuyvKxfa93fPzKeGOftl0cQbMEbPxKXp/TH42Gau2hmZpTG7mT5lRb3TPPPzjOhPm+hIy4kzOtnm7DuhHncuDAc5pPNvAN44k7ggTqLd0N7w9yhQ3MNmIVTuKtBd8djweI986LDSWifCEtTXtRH2B17/xLabvTwd3oazl9hk45akZ9Ie2GG9hNLPMydWZ5hPraK7oFEFa6GtVs9uSxJkRztxDefHNyB7rzAzsFN7iJ1PJXZLiP2Tssfi9SdnKj40zJfcM19XZw75l3NLO/VKm3uzk5YirxjSJbn7ZAu22TssvlvSDuBNzPv3bwxwDu6dYZ1hT1xp6/rV9+yBafgLOtI817aXRWb2l3sfZvgDo18cat/1nS6asXVibjHLDADod426kaNt1viPbhfnZl1ytlPVkqWT1RGfmv4FXyTIeO8Jd2eWYU4L6GdtPNH0pNXf+jrvkjbrAf3jdbd8eKDuGMwy0PyXyO/dot38i6wYxB2Ph251i6bYC32OOLisx3Qj3G7ZAzsEPI8Wd/aETN6Orui/eBYH96XLHTWtHi70L5mIDwM2r3qI+xi7zB3JUs7Z+Rg7/4k3P9fywqXuSR6svx1kihVDKa5P1R99ARhp5Jm+bUk6rTVmvjTknF1cThSOzKy/d25rXJ+TaxbJ+vk7VfE0dd56yT/cGVNGLNwCZo5QMrdvjwGdN2ippkydfEeln1xSsfUrSbkcMX7u/COFyl3j7hg8b6VxEPAneom8e/S1/VEPIbyd+XuBvm+vv4+XbxnZC7LcXJ2jpd2aKB+UqbgXHsXd8fc+zMa9nh/V0tq/Um4NFAheI7/uoUVaz1Z/iRHV786OzuLHSGbjp44YZp03kYdtDw2xb668skns5Me694a7tk7MsLFNlxRx9t8sIX717GDKr8m6ZD++UigarjpuYWyvDAP1jEky6dUvvTqmuxsnPTrkrg7Lo9MoH9OF+921fweC3u39XWI3q7DPNxd7WXpg7XjgrIysnJOO3t1IJAd/1u0IV3d8W26Hu6LSWrvMeEYK7F2yszI+ZNwaaCs67SDr8uyuN+wQJaXDHz16Jo1J462zm5SxJslNa65v4osL7+DINRzAa1HGRe3hneD991RxnkizzAvO+Ke4E8h8h77Wgn8/MtAoLwnSZZ/1Dvpbmv3lGvQ3eKdqAvxhN0p30G5BV5kMMft4K4adfts3f7eu3OfgvX3bK7fqb0d6lJJ/mDfYD9hr+07e3UQa46h0+J3wUnhHk/7RE3xAriX0t4N706Ul0B/pd+n+/8rLxbZC/WxbasSZ+E8CTjjhlFsiCkA8ZtIPIH3ZHm3TF4gJy4Pt0YPonzfM9cArC3rejC7G9oJPD7pFM8gj+V6wd7wc94sL5tjBPeVBL5wkWl1eTTKMC/74gh8TOLsfKorsYCXTM/ifavaH7PPGDt6c2AdPi/7ZSj26LsU54MkXWlQwU6dnSFTcLEmXYvTlO8tAe7JNSju/swGL+4jl+f4a+XTQBmFwjVDvTfLexJw9uioWiGriD+qiD+qynhaerxS/O8jcb4T9j4W3dHh+dpXePnXJB3im3GexCPIY06/tLOtyWPuniV1GnXckuVTF+9RWVinB5CXhp3TnBfSpVlnPN7seSfr9myLObK+L4Y6nybLK39Hhq+txVLXzbUost8OAnatYJZMwenV8ZAz4R4qKVa4p6jeazds0LwbV4cuPyXLd/a0UJZhWohHuHflScBruUqWwE+tAfGzIH5mxoFdsnwqshDnX9/77MjOrYjzYNwMCK+vib79cgneNHcGeWyZfydqzJ1PyfJuo460M8xL+ZtC+aBdNsZZh5eFtLyNSLvbrNMPm+cfP4QGnXH2oblDc3M4xaLDaM83+4C6FnlXe+EI+zPPPLMZzl4Uw73oFNkFt8so3tsHQDuUyt77NkDC+8iIz3oaad0LqXRdRiKhV48K74r475XHY+H6jCfLL8reWyMHwTvjPO1dXXzoAdknE/4TOshjRv/tV46hUZc8y0ugn8qdhxTvWD6wSK1SrEdVnBeHl3adZ+V8nYEesgm/ieJ2uupDarYdY+vQoaEhLJ+zzXnQ/u053xB0TsDDfnEERX8tSAfrmzcH7ZFfJs1r2tftEjlTcKTd4d1hf0xH+W0bKDbmfV9PM2WIl4tSZ3noY/AOEfgplvEgfmZGJt0X+2+QX9/auXfvSFd0x3HbqrPMW+4p8/4aHXkFO6QadTMLZnlLPU6bz110X16+GdLTnJfpOPKuh5BtQ7/+a0ThprpPt5L1uYYGLown+mzS7Xnz1Oev1VX7zlgjrZaw40rEXa9cyAHlLUK70X4cTVesFUe7U8oPCu2a922Xn5Lts55Wyn4hpbK9WV6J0+0m0eNrHleC+Nk44tcuvpy4uCk8Bt7f41pajbpN8HzLzV8+/KWCXfFuGnW4OUyWn0royyvcj+Tmznuy/KpVq5avWLEiaYkRiUbJe6LC9h3mUKrn2yYBvOwftq+6l+cU6zu7jMg6k/yb5zz4y72/qUMujpN2sXZ1bd5G3CXN56gpuARvlym4YiuhvaQk0d5rvzS0V559ms962il1li9MluWNvxuDnwLvLvGLzvLErqk1Mr53ZHvDXAMYF+Dx2X4Sf3/4rUCArD/5ZHNnEnM/4Xg71K5wV5pP+C/JfArfwRDpiaxKGjmi0WgkDOajA3xGB3hhxITiXqSRlxduq8df/PRYg5g3cAfoxH0OtJ9/73eA3UyI92nYbZjfFnDtHbsOsneJ3Cm4lzy4g/ZEez9v2eWw9Q2Vq33W01GZfyHL51naRzcCeOIOWeIR6qGZlFneXUvb9L6J80I7zd2EekH+2S9BOwTin6yJ1m3y4L5GUMdLmTsF2nMT/ktyanpDoeHOnlWZyaYnOzt7JiKRiQg0wBHFDeLJPkAn7eputd7e2tqkKGeq12LUf3FLGLNrojGkeaX39g3dd/qv5997772/2eUvGnZx982B9QlpPqswGe0TA2oKTiS0u/bef17GSVlnbPNZT1flpW7UZXmy/AOjVgSeuAvxaNXD4PNPWoKW1zeFfzJx3llMa4p30UcbikA7RvBJ1airs5BvkgW0RF00RdiphCx/SVlZTU3vcGfj6jNyEvtVmafsHn6lc7KHwJP3gUhUS6d1HGelLujxxx/f8jhXFeOEyrqmttbW+lb8Ca0Y/O1goLoetAvskD7jwtAOKXOns9c+U/vVtBCPNO/gHsgp9MAuTXmRjfKJ9n6R+q/M8HtzaavCpWf5LPle5Y/BO2p4tURdgIfyL5avXVtkd74JcX4vT7oQxg3nUsY/vJ3fTAF/V8vwGyMmy2/yZnlhvj2Ge8J/ScZFxH1yGLu/By+46Lzl2uQJxHkXlL3+ylMI+5GIZVydMb2FelxJzqONb9e1tg541fYccHekOnV7hHbY++53jLNP3/vdXh3lMYD7+njciw6naMpbWdpdez/bXxKf3spKneXzPIHggQcE+I1gHs06AV4R73C1yMn3JhXnp7t3cPJdX/IF72Zcvwyr7zXwoP3td8Julif2o9bUzURcnLmfkvDfXqZwD02G3nnnndDr0E03rrpQde6W3whDB+jqiRel19fpEA+xPG8VNanRhNE6sJ9XvFqrn+oS/QSD7wbvQ5+Sdq3doV4YO9x9+rt7750G7BgAnmkexFvcS5LRPgnaG4tdGdpde78g+yRfaa3UWd67gPbqB6B4hyfu8cCjRl6qlre2hQ/uHZ9uQJwXwE2gN88rM/Xq+6AmvrznGM3dCfMzKC0M8E6jTt0JgSMHtMPdO2t6e0OvWLKvueyySy/r6ekJhyPRY53DwyFck8OTkwRY9+nCVnGgy4eBgf37cTvUV0clyjPNYyFdw13nnEnaqd9Codpa4D4O2u/9bkTcPWi+Xo8q5vxb0ik4j0pEtk+fc5Kv9Na6lO5e6AkEAB0XaLc6QJF5jfxfcZH8JsT58enf8CXQhnIOifTjORl2wf58RRWu4TCzvBvmT+ipQZPnMXKPKEmWF11C2kOdzaXNjTB6wh9SvTsIUB+DnlK/pjpVBQ/eibzFvT7B3pXCAxA5Fz13zEnzY7D3d0H7tRZ2EN4V6nvG0E57J+3szQN3Q3tFS8opOC/tYu+nnOQr3ZWV56neUy2gNcc7S54/EMf7FJ7kasladXFTF3j/BCdd0M415bFG/fXZ8vvNxnnY9eGBumqV5WXiXWkUtAvxkPJ1jTvMzS3dyffkcFWgqrG8uLS0ubS0As/m8vJywh+tjzaW9YZ66fCv9EAkXmbgBHV1cTQB9/3G2AX6phd3xtx97Kcx4N7x5qmadrH33mee2fsFP6vq3dK+TVbRViWnvXWipmRh2oX3S/wGnS+1mxUWv4Qsf7FZGz9q8jyyPOCKV95f/J0nP3pwfPznHW9sJezqgvhkkJd5wEdXAuEr2p6rFnOXLE8Z4F9gllfEe7N8FojuBe69VYHSvvJSCqFBKxisKo+Eh4sCwdJGWD6Y5xS9Rj5i/b3VFWCHLOcEXr+ij7/f5fDeteP050m7qKt3kLRTX8HejYIBpvmFaJ8YGOhNRTtxv8hv0/my508I8akm3ZeTKmPwBneX9wLhamnKWPX+tInz0qajrl8W3zsYLVg5nzu//6FqKd0t9szy8cTnxnCXqkRK915k+bJgcLCs1ME9qHiviUTKipQCVeVlNaGnEPF7FPMRdust7vW8xeDZqzPuLg5fHZYcPwa9e9eZv9zr6ovQQdJu7B2ga3evDOgwHzicnPZIKBXt5P0Cf3erL1FmXuF1i1pAm29Pe7WJ/mPFlbqshKsla/n10+M/f/IZ4ryjK/n/qmR54D5/xYunbjl5Rpw9LstvjAMeuEuW95TuvXDt5qJgOc29uZSsg/ggBNx7iDuJDzbXvALgIRo8eZdeHcQkz8/hGOyiumNSt0N7vj3zWrTpXHX9xpexd0M7FAgUpZqCS437BctO8uULkslmWHzqBbQXx9KzCvWqdAfqGLz+TpanMq8cn/55x5sNdt6dr/MynN4BcV/5/f0fSJbnkCwvkmk4qUqkdEdhrkt3g3spaQfu6nol8kpRvIKlZbst8hZ46dOZG1PvYbKOSw+q/kX26hDjoa733zgTS2cTJd4u9g7eg3T3ohIP7DIFl4p2yG/K+0pdxnuz/CoNllg8/JS8x6Av+FtFYkbO9bD3b/YBczfIS5ZHbxCb2/af+sEWLN5z7f2E2Lp+LZzls5nleydDqnR/qZRCu78CwAehqvLOSMjBXQXq0sZ3uPiGvAvuDvN6Kk5gp6rfY93ONP/eZ0lpf/0755cs3gF7gOtoi3cljfKppuCs/Ka8rxShPvkC2vxN0gXXVbylyzr82r87V3D9zz8gzpN26dFJ3h/VuK+Z2QJVPwfinSxPuVme7p6YZnNIO0v35sbE0l1l+R5keUd02UCwvOb1pzpBu+JdUOcTly3eIwp1Af7FuS6Ihft7Sb39u92h4669E3Ylh/aWlvgpuImyRdHuN+V9LczbusI/zfKuo74K/AzxvAuEq78c6FWcN6dbIMi7ylp73Tz5RZ7/flO1Ip5fIrO0LC+lezlK97JSW7tXqBFUKkvEfX1MwdK+13vU4lrvZJy6ATmkUBfk2+rsKpudc0lp70L7/wvH3gk7cQ9UcId74jc/TnAX3CJo95vyvhYV6vO8WR64J34jG0+2sZn+hsx/4OD7m2HvgF0m2x3gcwph2lTLFQOzinicj8ksv9Fj7qCdWuf5xqVGZe89nc0s3Vm5K9ZxU7Z09/LOd2CY1bub5nFB9dHIfmysGYDE38PVr9Hc+99puOvXpLRDXc6PRmK0Bw/zix95x9EejaZsylN+U95X6rk5hHrvpHv+JoidsRjuo3pKzpK27h8JGNe8seMnBvmFfjsqzDXIz597FF81r4kfdVgn7lSSLJ+tltM0lgF3lO7NtnRnq05Kd0cCu1KZrt7d0p1b4bD8dv/+iYmEpfPVUbA+WNUY+TYZ7cdDlGPvX20IGBF0fQvtk+FFtun8pryvxS2486CbdbKGXWQm4PHQxBdk/zP54rIdHVg1+6e/HR0hzMB+5fcng/jHqzeNbnTNXbK858DpU5qbm0tKaiKhKmR54I4h83DJSvcY7Ppzc49p1rnuzoNsBiYgE+St2ub6sB62vNP1dlkxT3U5xbu29kCwhN6OCxLaB5o6/Tadr39VqxTt9HbeJssb5En8Df9UV2h5forfOBDqSTyJvgJlfPWW2aMn1sQTL5Punt+4zmh+qfmlxuFIY1FwsFGX7lWxMB+sIu4BD++iYKedixPhVwNQZBI7a6DempqyxsaSl156qbgCq3PxN2gG7dcmp91j79MbTJQvMaTjGf/tUE09fpvO17+qjIs3Gdj5IO5i73wX5P13lSJDvW29z5/7/YnZ56pBfMzjDxyh5GALUeYFgL2krBNZ/m2U7hRgV8TrMC+lu0t77N07PEkptnt7WwA2sC5Wf31RgH+CGgH8dbjwUotlSl/59swFaacOxibjHqkMaBUTdQ/tz0UWR/tFPu2+/qrjwtopducly/PJAdQKbsj7zzrBDPWs4kk1vshqFrLEz2tvxyjM8JbuqN3LerimzmT5ChPl1eWddV+UeBgF31QggIEFOgH+PUtDQ7J0VvTF7hDV24sw8JX94ZemL18ByrWcKbjn6nsXR7vfpvP1V5VP0GXQ3MXdcetm2Q38gsn/SlmngHST2ttxOKYm3vblk2f5U7jxDaV7ENNqdhqOqggqNlm6BxaLexExD+BDAAOmrn8E3oNBVX1TzYr285PTTtQb8W808p3+4fYgcS8S2p0puKa2yUU15f0DLXz9ZWUiy8c35t2vkSDwNkfD4v87X8nObc+FzEEW5jjcE8zyckidq4uAO0t3VOFVxYAd9h5r1OEm7o7+3NEBORTEU0GqXgr4YECN9dxzA9qTT7iTdKBObX6EPwTtwB2bc1i3Y7i0t7V1Lq4p76+d9fXXcc+/mJ15Ak/chXQ1mOWt/sNQv649V11KQvzGR6fw0R5s4SndgTtL9/VFVaXQS+jU6do9KAvmF0U7fR0DAu36orcDeBAbDFQFAupvvQDtBy3p+tUMe8eUu6IdCprpN0por6vzm/K+/gNlrrpYB3kiL1nevpnlRQVr/4tQn1HYTinkMQA4PhccOIBPssbGU7q/VMLSfX0AuCsVg0kSL6V7YFG0k3fizjodkK43/o6PaNwFgwr3mkjS5TXj5QI7H28/gSm4IIUpONuTF9p3fTjZtCXS6Dflff0XyliuLN7pywvyNsvHW/y6f/2Y4+z2qXYMsk5pyq21Y2t8VrLSvaSxN1qGLM+6Hf6uSMftZPmUuLNeB+YcMHJduesOHQZYLyL0ZVxe49F0KSkH5yXqxi+qtn8xXQnWNyArlLSILOykvazYXzvr6z9SpiKeJu9W7k6W/w9D/Tp1+q2IBm/Rn8dAlveW7kALpXs5cXf3umMEQxG07BNbdcmZ1/vhdZY3dbsyfACPh5rSU/cf7J1JaCxVFIYzGFFxQnSn4iyKigvHhQruoqumhSxUWqiIdksES0l8vF4EFJwqyaK1hRhxY5xAEB4kitrQCRHxpTFpEEHQCC8x4EIwCoIr//vfe3O6uqqsdkgni/N19aAiivjxn3PurVu1pQdSbcfuPUNU24/4oPrKuybZ8SqylO8e073xWHu8qHtnlb7Bol7CXWAtn2b8rSMHF/FDd8F2HniNlxWeGPEBfGctH2/dS1G57Fv3ekTdK/7UKrDR3OBSuYUC5wzqCo4qc71qJ/VmCc5kfjl9e82372KCVyYluE6iKrgff1/VLbiL7Uz3L56emSzqUF7pL4PDl171erfuEu59LOpHdj2Qm2X9OXxR+N0/d3eTd/GeRsOkdTeDed4L52Dr7mQX0m03Mc5YD6F2WOUfMN7vK6CQt0P546nba1oT+GtB2VNy1bz1vVpJZLv5/P65VzdKeqCF0n8u/R3n2Qi+ludH34p61vJxKLuxnezKgyCldS8Zs2zrjnT3N79WXDHvV91x5TmPop3p7gndRndW87hAWJ/LsJ3/MEpe4+WqeRKmL7i/M7NR0qG8cghcyfNscmt5Qe6f+V9r+ad2f4zZbmApbwv65EMuBi+HYbZ1H2XrjnLeyO732ITSuqeRKOZxAX75P8k/C+/xM8hYgpu2fUOdwV7aT/g6O/ek7Z+C7Vdhuw7llT4jJ13wyDqHhHuW7gcQ7xfvPsWX58cPHSL97SNDXa07BuG+dYfswE3q3C6bueZGpuwUOwfI7lbjxPaE7i/ZWUEgtXwtwnfEar4Ua9w/tWy0X92ulXQorxwCl0J2QuNZy9N2+5nKLQP/P7fjQRa7/mUucZ1v/rwrtqt3BEtftZq07hGUZ+tO2eVe98K/1/0+rrujog/m27Q9ya/mHxZv3knYbTvgWTYb7RnYXtIxndJ3WMv7BXg5pPIRXqnwXKv/neG7jO0Aj4C04n+Yzu2nD++37uVSqVbbb93r/iSbkFTdza+FbOPvy6dg0z1cpu1pbE2wcQjqZSLVfNdQ3oKM/95kO+iyXQ+0UA4YqeXl4/dvbLJnC3/PQdTyRnVqbj6e6lqCl5Ie3HW7Ww683KT7uGvdST30N7tL657TvGfim3nzKxznZrp0frG31tcpOd9RGUTGdoGum+uHmaVJ2qxjOqWvSC3/uBj/O8+so+oZKX/rwP/P0MX3/OhhynvVxXjhnNtR1JvWHb37fuvOeMdQ3m2YB8fRupNCQvlCvu+jF5511lnXmUW50fTNdHIanZvVeWrW+Ij7ZrvD/Yc2nhdj0TGd0mcGr/S3yvBN3QGMd/270/4g5/JyjqbYbsL9RbwT+OW5M9C6A7Tux9m6F+k7sz3gDji27oW0cC/wIy/drzM1zOlhtYKt99xMl8kv74aG+MJ7VKPp3bZvw/ZayaJjOqXPDLsiHuBT7o6zxkvGd3DPAaUOD8en8dSdZBs/MnAGdWfrXvDpXucp81x059OiCmJ44R8W8xcOmv881xmPZTNdRryjdQ9Cmh7tS5+0HV/bb3yxQduJHmih9BPW8rF4Z7iL8Mx4eUstf1AMu6IeG2kpewY4b37wcuqO1p26R5DdE5INu+r+b3v3s1hyXIhsP/4Wt9dk02JVEcj9r5A+aTt8/8Q8HUqU1qG80lcGeVucV11uhk1G/CMHWMsni3q4bi7zfjFV91vRukP20iSW4Tipq+OK6iQKuPaO1r3wHwZ1I3b6H0ZzebYj3gMzm4/oeUmyPTmU5xKc4GzXAy2UPsBT62g6X/xI3C5z8T03SUl/ULV8sqhnvMP2jGJ+xLTuWIbjuVWjZhnOyc4O3tT25aXmvNsKmzKnu6+X1h2cdsmGbK/JpPVSUKkGNtcpfNJ2YJ4FNx6zWofySj8xj5eg8Xyn3R13Cwvsm0T4iwf6AZ549aHU8+5bwIMyznKte83U8kZzMd5M6wK27g4x/R+17uD8O/7Is52HyYcBl+IIbU/R3TwdqhRHh/JK/xi6ipr7aJfWXbjYFti33ON0v6lPIyQW9bu7GT38rQOx1r1S98U8Lvyq4DKte6GDeFXPgM9r3cG1Vz+UZ7u/TyYIaybdo6xsx1B+udSFDuWV/nEeLZdHTCRr+duG9gvsWxjx9wz0DT7xil18d8TjjMrhS7gM51p36B4h343xZSy+Q3e27qAqvsfpqXW/9s6HuASXy3ewPfTr7olsZyXPJbhu9EALpV/wkEpqbqVPreWFIRT1/ajl45P626E7XrGIv33QrrpL6y5EJtzDoMbWndB5TuhlUN9b637+zVdcQNtzadXDwO2jLaXYziU4sV3QvbNKHxm61BvPoE/oflrXYRj9fNSEFPXJWn7gmljrzkLeF/OVAPnuWndBttdA9V5ad9qeO5TnG3wXwHfqLqrj8my0uQSXoKgHWih9ZZjH0vKVrOWPRBdpivrYmP4017qP29Y9YOtO323rDt3ZujPXPf9s1Z22n/mC2J4/rAvCqJzVuH/B+2ISpLTuZ+mYTjlIeCxt1lz+iICiPlbL29bdrboz3CO4TrDmDvVc6y7VfHxIJ4+CzWzdz7/2zEe/WuzR9l8Do3udtgti+zvptgMdyit9RY6lTZxad97AkYFF/a6v5YeuufwSc27VfMhlOAhvKHMZzoQ7N8w70eVsWdJr637tFY9+NdboxXXc9M7b8YJ6h+1mz6yn+c4P46m2Ax3KK/2HbXyilj9aUeOL+mGr/xkXLs8soxuv1CO/oy6yT40KwuVk6w4Kva+6G9s//21sbDFbcuHbehAy3kvStstuOmyvaS+n2k5076xyKAwO33Jb16L7UQNFvanlLaeHkyEouildxHwvhkZ417pL9x5THVdO644luLPfh+3d8X4sKT1X3QNDWPzZus5Pz3K27USH8sqhwMzsNP4oLgAPnrafgNfwGEouw/l8j1DMw7vKdtqqu0R83qr7ecb2t8dAPN53dlJivjXtsj36uXsqb3798Gp7Pm0CX/To3lnlsOCGmqNZyyfEvySoF4Miynea7hbiwgp8r7nWPX8unyr+JWJ7LN53xsaOJXWfCk2yYzXQPeK162i6GXukfKrtRMd0yuHBkvm2o1nLxxiG7lA94mwuRKpzMS40C3HSussumzjiepLwyjuvoO1kUWx39ovpuLZOQnRS6o528/rkjee3qXbCdkHHdMrhMnjeLbcdjUX3bE4PGOeBKaVjVIL91r36Lxbdw/mrr3iTtpOGD/RFsV/Y+i5kuAcT6+PvrZe88AQ/Pmm//EOtSFJtJ3qghXLoDB31//2uQZbDeOgmx1HibT5l1V321PWs++TeRV9+NSbsONsb1n6nOT+w4P5SMDExvT49Pb2ycHwl+BmqU3enffO5/ee8JmwXdCivKHmte4Rs5+3tvOWVUHb/XHfhn5xcVWufKbZLvNN2F+8i/LfTE9OAtp+Yr7uT5X3fjntem5NFT8J2QQ+0UJTc1p21fMB4Dzvwx9Qh0rtsL+Te+lpuP/wobY/H+zFvu3Tv6Ntbm8729ZXjS3M1PhNOwt3c4c5sz9Vdh/KK8recznCPgpArb66M58UT5mG6CD8q5NwfU27OetuFY2I7WPTpTtstK3Pt4yvmBNyitZ1s03ZBbE9wuQ7lFSWndbe6Sy1fDYk9pk4sl595Z07Xl2a5ma473p3tEu9bJttP+myfWmg2J8MqcBvrfgbzbfbtQrbtlQsHFEX5m9a9znivwHU3p/OwdafYfCfIXoKrnzjFzXTdiO0S77Td6f5Zu70cVEnRul7CqZntyWKcTNur1x3xVRBFOVROu4T7ZiOz3M5wZzUvrXv2s+Hoerbtb4/l0YDryPbvvOzTa+29z4ztT+BVLVnGt/2UTqDtKVRHCzqpU5RsTrdb5INQHgNpH/MsD4cjqdrn2J7HjtH912k3lV9faz53olz1VCh1aX57OUp4nWX76Oi5A4qi/G3rHkVBILpT+M7WHVeW7CnGh3O9ZftYo/Fgh+1TK83VpRqz3V70enljOU3ttD8XjgKt5hXlb1t3O5g3wle869K6i+kJ47M2081c9Obb+bIbFre+3fSl/MrSczMY09F3EortvVBhf1HQm+EUJbt1jzipY7YHEu6udR+NU+iheZ+c4Wa6fJDujRZtZ7Z/dGpvYYKy4818D4qT/8D2gn2w9FkDiqKkcwZUL/tlOHpuP6R1l7F8TyfZ1NoP59vewGVsXzw5Pb3pluD2Vk+sv0TZ769awtr8fK3YIwXKXnjlQl15V5QMroHsED6A7xDebq8hVXmuexY5m+nye/ed73y2T322t7q0PjHxLj2H9PfjY2J8smfbqzbbN1sndc+8oqQzxNY9gvLFAIRiu3+uO64M8jbT5U/qfrVTuikM5duPNWH7xEss5H0DH0TFHglHydfftr7VbbSKktm6I97xRsJHPKGOrvtVd8ieOanL3UyXTcOW8r+wkgdTa+2n/1gztsN35zoJerW9wOdT3v9kq9W6W6t5Rclq3cvmKpsvfJRNaV+R1l0kT5CzmS5vKN85pltrzv7xHm2n7jbdefU6piuY1v3+X1vg3qN+w7GiHBKXW8Mjas4PWG/OnOYJ85ljeZK5vSafBvhp08m+vrZ06tTc9IT4js7dl/M92V5l01E42QJbrRsHFEVJa91NqJO6uSJ6b26EdcfUxTWX38jSf7+9Bpe1fZONO5bgTp1YN4W8EZ7du0R8b2O6gmGzRd23NN4VJY3T6Llx3OlO8dHAx57rPprGv91ewzeX4BjtXIJ7FkN54ISn5j7igx5sL1D3Vyg7dN/SeFeUFM6A5BHreN+423FdJZAT5gFDPedWd9leky88bP/OZPsUhMcS3LPNFec6v2LpXu1hKM9/QwzlITts13hXlDQGL4flzHZgPug9dA/8w+GEvMH85J6cVZUne2PnVz+lw1D+4TZsJy/JtI5vQ1gUKpW0MR3AmO6ZFjC2a7wrSkbrTmi6i/myffRr4oT5nGK+2v74os/zZefbLMFtTjDaseA+u/fZNBzny15VSXe8Kp26V5K28waeAtbgaDu59wg9k09Rjgin0XSvPIMe0zo++dW17kLeve7zpy5687deanlZgpviEtzewtSUG8v7S9IdhKI2SAzloTp937Sya7wrSjpn0HLfs+Onv/M98CfMC7mTuhMX5e6na3TaPoXLLMF9NAXdJds5neegDheMl3ivkO7GnTfoAsS76N7SeFeULi73ue6c52g+qJhJXbJ1z/N9HKO6nMG8LMFR9vWVE6dOLa3B9ni8n2y9UvVA+FBsB922gwLZpO6O63VrnaIkWnfCXPe/A5DzcDi4nhQ+nFs9+/NebOcSHBfcF/Zmm7DdQNPxBpsP7nwLz2X3fEVsB12NO4HyiPctjXdFyWKkHKfOjTZBiHjPad298/F4/yMe7x98kHCdS3BWdt4FN9s2tk+bl0/3l6a3dnaO+Xin8KHYDjpsZyGPj2S8H9N4V5Tu1p1IB4/LpHuxq3WHUQnXY87jD228v9Zh+2WXjXXDJTg3lJ96D0twrOQJdTe0dkCL2e4301agttCR7a5zB/F4f7DRuGxAUZSOVfeAW+Q7sU+TSa66J3fZ4BLnrfL15pkS7/Bt8IYu2YFbcF9Ze+/EHpbgaDrTHfFO45/cMSxuSrqDiiC6V+0SnP20++q87TuNxg0a74rS2boHhvp4rSa75us8fjqndY/18KBwHynMd8S7WQs7r9G9weaXqZW1tc8W5pp7e499vHrcqm6xtfyvizukhXCXg6zCpO88d9YXH36rjdN9sdHQeFeUTkbskRblcUMN+EldWMxddefbBnxhX/fRjnhn7zx4fffRdAtLzT/2VmdnV/f2Xp6F7mSaF+P95LEdy+JJH+0Z8R4y2AWJd9o+pvGuKB2chSA3Q/hx4qQPQN6q+33yxXwv4Evi/TdvOzjvg1i4//TZ7Orq3kxzYWF+cnKerTtNt592KO/Zoutce0+L91CCveMH4/0YbR/TeFf+Yu/8XZsM4jCuqEVdXBxcxM1B/A9cXFunkEHhFRwSlChxiJgSTKFrYtChNEPFTUWchEIzNWDd1KB1UMkSEM1YrIMEXPzec3fv816u4XXP95M3b/wx6PLpc8/dvRclW91LEu9dum7eszfME3offBcs2rvda3PRn/Z+IXXdLMF9kLMmX9brOygOHx60Ee9eeIn33ZERnfGOAb19h7pzCc4fhM94T/qC+Sc13hUlqu4w3SuPxM/ZMB8A4eA64h3H2Vz0j6SxvUvaPt/pVKQxdIUPFXmVOTO/al+DnxlGPMdK3oh30kSHkGuKbzJNZ2zXeFeULMdKoMJoFypI/Jzqnp5vkZ5GjV/5w+revTrFnykXeezs906nI7rbaJdr7UG7/Xo5w9BM05GhjXd3BbbDdSd7YP3HgbPdXBf1G2UUxVd3IJ6Tte7tnOrOpTcf7lx8d8/BPs2m6pm+n6cztku8C6I6XmVzRB2i3dyEUaB7gnj38/Mm3ovM9oLV3V8pA9jufNcnZRTFV3dDN+O60R2zd5tS3fN0N3jblkjp84nr5w4Bxrvxb68D1rAGYGxf+7D2uN3eXLZA+P2fAftiOYVnttec40j1kN1Rv8+HcTTeFQUcOYtxe8ebLuxIdTfUt2aP5Zd4g2+4nOr4LL+5HHYGq9+g0rFAdxnLi+8m3rHTBgE/O95xQ7wDLMEJ1nhm+xUzVZc8R7hjclDjXVEy1b2I6k4qEu5xdQ9iHZfDNWc+/W5+1Tx5iLi19/4Yttt4h/BW+o3fj7a4FLfq2nsc74DF3Y3knenk49dRkhjR/Xui8a4ocXXfsdU9XnWHW4TW42/4dFza3wsLUz9XJlevjj90OvSdwu9s3fTxbhkEuk+qfrbOxTvDndWd/9Mrd8X25LmXva/xrihpde/KFWyyKWObXVTd4wdf4Xs6lE6jHTTdKhzj3SzBCUXGe+r7Bh+BXY0m55+t/3VbbSzW9qYr7bgHXJNFd7lguuOVnlKpKKjuQmdqk41Q682q7gBaw3j+jZXdfURfwXp0sAzZcYPvFL682W4/SGfmV4N476+vbC+7mTq8xPdirdlcQqj7JsH/5e4oAc/9aF7bu6K46l70Y3lyoyTkrLqL51Z3wdomirsLN1/dyfkO8bp74+vYa0OGjdT27ZUVG++tpqNkzp2tNQtcFWDIm2m6ZCQv097JKz3nQlFQ3bsZ3XdY3fOPqeMuG4O131t/7ICRxAG+e+E372Mr7ap7M963VwSJ9ztmNN9Cupuvoxa4UR4Xp+nASCbnM8JfOKQoc45ddS92y0T8kz9hdSdBtHMSPgp8X90jTmIYH8U7fO/ZeKfwDdouXGpl6nurVmjKy43iccMbJ1MmI6T7OBk3Go2+xruiZKo7wDa3smXmqvvSVHWn8Ex1uQCre068g3q9V99CvJM92P5uxbL+3uY67q2qSfdauHX2ypWPD3ff743Gjsa4kSQ/pbprvCsKWOgi3b3zFYytK/iz3A3zS4CKcxnOcPLg75UOqJTrPc/GxpMTJt6Z7wkm5eG6j3cIL7ZXzWjelHcnuni+PxiMsyTG9iQT732Nd2XOOS9eG+NJ13zRc+4J82G44+Yi3lu/cPDTd52Aulje2zCyy7V1v/0aojPeX8F2sI69Ngb3fZEFx1A0n1jGgNku/ORinJ5Sqcw3prqDIi5HzYDqPtP2rPH8jf1gdY9ZmBrN98R2AR+fPt+SJ2WAVT6RJTjyq2WH8sZ2xHsByg8nnjGxxT3x8d7XeFcUKdPFog91WE/dUd0XQ90Z43IjLtT9mJ7VnfDny1S8O9mR8dLeN5cz7G+7YJcL8Z6GO+IdC3G7k1fe9smU7gl0x+Y6oOdcKPPNAkyH47dxx6+gu6nufkM8YKwz2Wl8+MHqnhvvZjjfs7p/+oyttOTXioPx3hLbQcmU98WHY+e6XERUh+1he9dzLpT55nyp6HUnNbAh1X3RUcAFKD1BtruMd79ldc+Pd4Ax/YMXt7Z2lsmehDpZ30O2OzBb1xpMhDjcke0+3o3oGu/K3HP4dAlA+aIP+RqQ6r5IoDtdh9qkwGy3HZ7VPeJY1N6Fnqvvn2/5I+cPjPcqbbfD+b2JH8tnVbe9XeNdUcLqnprO+TpW98UY6p6lYEu9c53VnZDD5zsBZRfu4MeLm/KkDPkexvtfsZ3Umvup7EG4m5E8ot1KL/Gu7V1RForQPaBYY3WPTefuuai7U3lWd0KOhotxN3pZ39+8bQd7bS6tZLlUzVJ6n7E9Q+LC3Se8xruioLqDor/hHlZ3QtXxGeGSnavus5iO9x5kt7fHv29xK63wfXuFbA8D3VdZ3CPdKbtp77qTVlEOn02bO7kdV/fY+ch3ztLh50FQ3fO20ormzPc399++nhHv63vVkP2JI+jtIDHgw7b3voa7Mucc6TrZKXx+dWfIx8tvIK7u8ZMyAWuQ3d0+pVtpfbyzuVenWB3TdoJFOK+8TXk5t06PrFPmnIWu8bzoS3u86k6W4l/Db7KIFwire/5WWkzKe7buhfH+Ny3uq9VphnFzh+sczFsa2Erb1120yhyDVfdQ9hnVnZ7jzn3yXnGeU8dV99kcj+Ld05sZ77+WqyBq72NA263rDSK+S7zrt0soc42v7t1A9/+u7i7h8WbAg6i658Y7sE/LbN5vb8bx/kdsjxky2UcjkT1JIDtAvkN8E+86TafMN0ddda9Uul1mfH5152ge3vOQuvQzqu65W2mFuqFcLvfkSZkv01tpt79XD2SQ2j42to8bgJpb+SXe9XvelfnmH3vnEnJTFIZhn1tuYaIYyGVAlJKZlBEDZhgYIMktAwYGysxYMnBigCGFgZLbBIWU36UwUSZKMVFyGTC01rvX8lr73Z/llut+z95rX85//nP69//s9/u+tfY+oxtf3wEF5LGlve5+qY4bydyxqql7fSjtlsB5FJbn99+8VNg7y3SiuyA9WHtj7gzk0RL8vc/7xL3Xf62JEW/gnok/cMRJ3akCc/DNynyiXu4w7w+lJe9ZsPeDrStlDi/Z6enVi/uAPTTrXmTUscTEHYuG9er1/wpf9LyGuA9AfNhXSd1XFqscUouN2Dq97p697+BtrJLBP3i77XpxpQyL8mrv959mgWyp0+Udy/pCXa//WCMPpNQdqCc1ZTsvdaejZ5dnBE+HR6971d7Lat0AcXxurm8v7Z20q8JNq54CeYTyxLx5cOvpqGG9ev23GrMZAuxogDvvMI/L4Dxnp5lHtQbOTxxWl82htZP3PSB+z4O3B2NnHLXT18P7gfc27lgtq3br+jE2vf5jTWxK8Uci5/fAejD6uIe3qXNqdKzQpZbeDt4ldfevlCHxAD1pD25b95X2/uR+EGN5CpwT/2l9R1yv/1Yhdcelrzuoe8ncB+evH131ScUIG+15D1MpJ3WvXCmzY9CA3jB/9O32b7X3dU7qjgdW+tp8r/9WMXVf06Tujb9DwL38cjiJ4xPk3Nm6Lm6eYFW5UmYHGsAO3vfsiTed/2p7vwve97oC77299/qfhdQduA+yuRepO7SiJJ6dcNwucWfqXtcYgL4jEz+AuyfoLx/bIPZOteh/HHBf14l52f7Z9m7tjT/60/b6uzRxDXvdI/E0d6TuGfVUr1vZGjLP8XRCO1J3+V+tDaXdEewdxp4qdufF3qlwLbx0xnXCznXMLyb5nFG/GjTj+1nTUD30vX5S6t5c9yrdcGs+pe75y1WlLE9zV95XccB83d4T6XjA3iPsmNTe95F2Ce53ibkL97GhvRvncgfaNnz2s8Grk9wj3wv6iQPm4wTWibuk7izWoaHDxzm5fql5Jv+eCgzWhs9KoXxaNKF8I9feQXvb3p9WYcc0swaP/Tr0rGl7vnv9Ao1JA+aZtxP364J7MZQuz1wpNJH/r2wh2RgN1IO3b4TDD1CnSxG92jtpb9v7G4Bd1YdJFZKqwNkP8+jzrc9bz36vn/VtUbB3RPIDwA7cmbprpY7U82J3TIX8XnfTlVkRdpg7pmTusYW980oZGjrpp7nDwas6eXW5fBg3X9ZoxH7YhM15oaQTfQrf6+fJYurOujwdHtW7waWcuqPVdF0ukSlxH9VVWHbi+1E7cvIOix/A3ZPkShkAzq1WKH8yMf0F2q9enVTJMWpbHqWEVJ+Uv4bJwr49xrD+JNDre3rdoYGfuhfD6bjg3kKxUmdVOGjvcPU4b2zsPXl7nMNdaeOVMhRCeeH94X1QHma0Lu3jr149vNwEUMp8vr4NNUtTl8zd8j6a9S7/l4pn+7QsZ2fxM2XsdV8TcG9MnWPqjjB1l1iexTlscaNdqSs/9eQZ7qewNJQWhflwyjkQ7Z2KV8ocL+2dtDOXf5xc/SQWrr9/uBpwp73LEXHIQ8udjgTSGun2Hb2B1tftf78MjR/WGadqkMaFRHtykuCavjGfcorBNqtx8mTrqcWuNUzd2e8OsAXzzi+HnFi+69zF62fwM0kCb3Macwfx2d4xwd5bV8qQdvL+Zh1tHQtuKu0B95LlCrROki1Ho+7Y5sfxJh2C8mY95T9bVsW5GzbVz8ms7Ke8SMlnrztieUoGzK/ABK7zTJF9rdThHTPtE04v7zrftK+Ugb/vKOx9y+VLN9kZp9qXynSwdDwwKfFI3IE77k5pAjcal1qNvvxTRd3szTdvrR9S5vVn9ueDb5TWXys41480ZV5KZ3L6L3bLViW++7Z8b1TqdY+Ahce9sNDUPSNfAs5uOEhTd75hpH326RNnJnWCYnGCvSfUM+/wdmD/oLxS5tkz4T31uINy8s5dTNyjxj8e2RFImZbVSvtl4/s8GjlylahNXucjrdLnNeLguv0j1b1vTHOtDoSWcByZEs/DJ7sp/hxV64ExPz7kurNf04oxHEE7QFNe677iM9yJebZ4NljKIBu+6+SFs2+fWLt2vnW6GK+UAfGJd3CePL6xd9Le5j3cefoT5J/xnr2eAu2HX68eWqQ8VOxa7ICTHJzOLI47ddtLceq5xP9m5eae4DSbVmS45M6a7ZMzPYAqP3Gud7lWO3rtx4J5m4UsHbE8WJfU/TPgk8A10WddXlL3xh9B+9jbd+J3NU3SCoZ92hgTMacGe7Ju7dlz9NiG97d83EOZ7mQCPc30dwb4MXGHng4NLXUSYx5hThKKiOTluTH/mPnndd+DjDPV5dj2bw/QMdnyZBVm/Eiqzpuhcchyfi5NBeCi0qj14DrZAFmSF+TUPcfyA3IWdzB1V9hZni+ie0ndqbmzt97h9yzzE7aHAKTEPUX0RXE+2PtZwt7m/VVgHcpk098J/adQft3Q0NCykQXM5kKi7u4eMA0UxBlMfoMpyL6/+3l8LWWwvz+Mt+89C/j26mVAXK3bP6XhgNepqv8MwmpncO/9iOmWhpFI3XOvOzviDpSp+wo0oU2sl+K+7tTdUpnu3VpoZjuxpLk79g5Fex8b7N3B/c06cB6bOGMi7/T7a2ci7R+GoqYqq9gUQEsYTV7B/Q6Cwq3YtYagfs2Ae3XfN9ie/TXcC3MVjtVni1CSS/39Ps7qtCWsaHzxZQqsVfrorZ4q6u+zznPQON6mDhOg9wbMU2LuGszP4/1eI+0hcYekIp5ksPdZgffs7YNUnD/VzKdg76BdeH/yNHt7Aj6IwOOB5fNr1+6EMt0QtNT3ai7U3Z0nS+y5Zlq/KWfIfNhrJdpqWViO/d+U5Zu3w02yrHqWUNJMnJ0b8kbiEJTJo5lMYitd8zvp1YzMrwVyod7EAfNJKM0D9yO8TR2mIpqnoXMfEvoidc+fi7TD3gvArIxqR38K5gefdcbdAu9H38Pen1GfaL+fg/js7mjTTkby4Qtkgr3fWT0ELRshNAppxQfE7Fm/8quhvVcmt+7XmBucSyLA1q9B/6HlPOdsWEmEv62ErvGRrgjB8npOYu6VbEE8XiNDjemJh2LMhb5E3pfPjZgO3I/A1MMEypqOeKTuAF1x90N5Cql7Q/uU26A927v8z7KxWWD9QC4cbvlk7rdg75cC7Yr7fVh5EtaxlR0eawjlo+48HUqaKn8Ows2F/B/y1KmHTvycy7Lh7PwySM4FeupQ4mWbiz+Oc5fY+hBm99doJdhLZ7nUF+HRDXPBaXlKV2I10BN3988yGt5rxun/SZT6UekO8yFwZqkupvMyYD4PqaOXt+9N6fS6T148NpbpqAWaj7AZ1bh6nAY5ez91OcAevjjuyqPtby8EyqmyTMfUPfj48yK0x/wcuJ+BuadovqN0Zm2aTJ4mnVpuVQPmbnV2/V1ygMUE5O/mnJYq4bz9lnv1+Kiq3C5Oq6Qs/j63n7r+x+IB1nKAkzxjsrRZd3eJ/zu7iv1yIFbls3IvUnfYu3eHeShF85WvktHUHW/BqvymhPuZEWWqUzazMGI+NjgFxbvZgPgwx+L8oZeC+5ts7AQ8fs1rY/Josci0oywPLcNHzA9FNDfqyEp6ccQ6C/F8OOGgG6ZrisfdUoNSo/vDrpl3P4ZVTN2PYkw3TNDWTa7LLu+EK8Vbotra0tRB3F2DQsgp4xqXziBrHTPf9rNZmXawnrSmvNY9i0l6yblzawvL7zg5jKd7V9g7Po5zphw5Pbl7nEMbKL8VR9vc2BLWw4WwF9v2/ubpSdHz2MWf7D4KwF+Drh4e/8neR/EvJ9WEEmh1ZDV+q7g7D60cvfKN5W30eT249Y55LP64G16SM92h9No3VyDldxfbuqLAc1uSM3V3Ddrx4KZzpOWlmhLquK3CRrSSLOY+Yt7uIN63qknhA/86YF4tHS0lve75jSbD3unv+Hp1CVnyhs0B7hzld2MwiOijCUNpzxX2jqK8Cu9UJPKZ9jvoh0v6yNyZhdZZRVHYmwknrIhCBedZURSL4ADiDKIPTsQ++CJaRQ0+aJ3QC1aFgKJCMSJIUKlTFZQ4IeKVOGGMEw5oHECoKC0BUYsDRNR91n9OVnbW3Z4Y47DO+eebNG363bX3Puf/7+H8U9m7VNd5UWJvrBVkrvxJDbc0rZzHtXKuDiZxIy/x1f+j2rxE45WKXPXWJE3K49KaRvItxdQDrLVV9XO1aP1SNQl1Ga6IssabmsRJ5duFAuj9F1yRec/FujmxPFL3U3n3K6N2ieODUXf8+ZxAS+IPIiUaKcPeYeyQbcF9Q7zdCPuUt3cryotesj/nfLN3KFP/daZ9xNpZs9G8ZOYeUc+m/CvS1PkFs4c8qb2c5W5piq9Gjq3amICa+r8+1K5oiudU8vrFTvTXF2iqpaU5eZ0SWk7Ju65AxuZWkm57gxFvoBwhPqErJzUj1ILA1ldAacYskM+4n23HTN3djHklPUrd+b843R4zknHP9s5rAldr64J7Dugz+fD3F3+4411n798GtKeOg+zuJXHvjJhm7b3P/9Mrg979vUvLBYdu2asNxorV8Io4g1KOMwKN/oei/gc1+pawHFfR4nGsILZVbw/CW8eXJ0/jdyWOuxK6h7Ox9U1fAngxGPUGHaUL/ir8gnywY4L90oQ7dDdG5Nxj6sh7RZK6888y3reCvWdtHjmeP5CGzr27ltJ8I+y8jX7JhfaZMo9voN75ulvifn4yd2fvJXHvJHenvS8nuoVP783YC1q+QvDZ5DfguryfyJav06hfkgWtD6p4UcP6pZc6Zl16I2E4NVlAD4qT8WCbjmyK23cLtOWMnOv2aw141zN6lt0nkZoo6nnNky11B+4wdwy/JV3q7nWXQh3rdU7Bve5i7+cb7e32Hv6f2M9k2RKwJ8ixNLTn1dV2pwzsfTr1b186l7yTdmtY4ZrSTns/ttVqxQbt2dTjLr81RvRYYntnD974fWcLR1Z1Qkh4sW7vManxqBd3hdA4rtdURP96Qr/A73iRgFqoEkAkW+YpCUCdUylm3EjqHGVv0X8Pf1lfptFx9/SyfJeBEssb6oAd6/QGcIUfda97+/zUva8194/cfq69d9rt9vE98t+arWfP2eoc9UoD/CtPvzpr70b7+ee/pGU6E2gv15i4g3ZT5wzQfvoUfkwNvnUn70uK3sp7wnb8thFfUNpx0nOiJV8eCYgkpT7tRoekHE/BXPTgCwNqsQpBjz1ci+DYBJF5S/768npl1jHu4ZZ0WTI8910ksdegLvb8MHmMowgN8eWvZI2p+9kAPgf0zbnmc90FeFp8NXWfA4MbjJtsJ+1BYPQvOJC9HQswB/DW3qa9m7sb2sXCCXZj7SA+XaO3P9iYO7RNgn3dunXLW7Msk+hgh8DLm/Bc6Hmpm7Hz7VY56vp+oDVcfeqGMojm8VPU67dLq4Tnuv3rRQFfuJHpyrqncFpXc5fiuLCsth+Nq8RFtZbW16Wxy3eWKLB0/98Ja/dHuos841alIXW/wDpUgnmY+xUpdTeKWZk3oFOnJLrvmrpjw8G4hnbYu3dKNtg7MGd13jB/+xXrxnyxd0P+mwbrQjrYTrQXd4f1s0yXaYc6XxrtpmN7xGhD0PUqQ3Z3hZek8eX+26OXk/o7Y9eRGXX3wK6DTVWtOvLCH89FI2YeTT2pju33wvljOkitFaLQQOWaO1WL3xyHUjXHqludRy5Yj2N3pshBKBp9IVJ3oz3l7fT3S9O5Syx1bzg2W68H85q6z2e42PvkSLvRyXy3EhxaA3NZfwXJe2Pur7xi9r7Vz8+gTJe5Bua2wibxz4ZrXzNxB+7QNuvWTRnuJ/XxBzURYR7G1LLpruNZ2zyX0fE7aUKtECaEyJW6revl+JJgKT8dr8l+NOFbs+B45I4bz7kHU1/EToC6tfnFLuVcy2tMldEEb8nDfDzovd1Hk84u2IKz+oUDjZHnlD1b/BVQGnUH6pDtvacDcf5wfuruw5Js7yjTZXvvxRV1dzSzdxL/CgJ56yZbYyptk7g3eXqG3dFeuptfY7D/VHh/Zx20vETyoBtrRzkDfYh7gZv7FXd89Y5f5osG/C7ebiQQDN7QdYhaS1aEShBSQoM4um7/4e2k8eRzLd9F8XH8YBi9LNYdYc2lbp3a3DeSNF0aOr9MGuvc3vbJS7215h3tl+vygL1obupOnbZ6as1thnzGXBWm7qVhrg1pN3snIJrD9AN1Crxn4q+2O2WeBe0Z7mzv1nDCRH+3kyVxz9ZOe0c0T4SpzKITw3cXDLB7noV31zzvDv/gi6QiJAByXXF3uSKHEfZRlhCVyElPRL2jNPBth2CWh1i4Yo8GPPUOOP2lRTXVsM2HDN8h+L1XG53Gm08rnMWhFyR1T7gjlEe9zpqdMF3/8vUlloduu/yTTy5fPbjmttPOdHe8x6PuEI0Rd72PdNrUyLKWCzz832k/kk5rvzCtkL3fNP3Q+UVguinJzc3b0W3qPPQYvJ1qj3Q+Ae4n9bYqqrwN4Ji/Bh5LPMBftPyXYJNChtoEiXWjiJUkNa7M18P6hU9qhQR4BRodiucHa9pNekKco0KHRu4OUJ0oHcJtPWqa2sd+K18awKrn1E24792nHGNlqTvQzlG8dbh7Sd2Na/r7GqPdumnl+++dlhGPU/ctvSWimb2vIuy0dzSJoft2LaznNWBv9OgHF3/1XXb2MuCWgH8JsHPBJSbuqVE7r2s0MCeK/6tS7mn+Kpzt5iPy25bdqGjj6dd54B71ep2OjIbzy3kQjOZ3hz1+alDs+hqv5F4J1l0pVPgrl8M5bugVDHk55LZqt1r2kQtd/5voHg58xzVnUGXUvYCOoP7SS5m6U2dOfWK63JoBv3pq6DYgT+mouwhzbYbbzt4j10varynTNahjZQLzH3+89o6tJjZnZ8/2XhJ366R91twNdpp7O/Vj1mUdXuW4jrmHPZb8GvXA74XvA+hEXk1OB+hkXX+obny5+ngnvactLC3ypFYfhPPq/Qfcc6dcls54UmZMEKs4xFaQ4xYciB0TWTE/n0pyj1BT7lUkK2k7xvLG+dl5Sl1O3T3u76020hvgG00NrgHy8ag7f86ysrk2q0bbJltBx6s3ch/2ThntGzbMzBzzmJXc2qu22rZTuMYK9o6jzLqnfTKPwZH3HYA7o3kBWKN1pdajTmjzwmP91lrnE6OPWrij47k6fq+k1h8To2SHXylvOGrU8nO5JXhaUMR4HMBrUcyNkXWfHcEeIx/wWmW+Yt36cu7Icc19uEv1HPvZjY9kd7cGYdTd+vUv35lBZupupBP3tJ1a+UJO5SV1V0jAO+0dyI/swWuqLUsU//rH0+B8pL1+Alq1007rae7gGmU6Hpe9Mr/Gw27LDj+tK+r3ZQaCis6LDmQeqrvzAsVDlXf34P8IW1D0lend3UNkKXVTwr+G2eHzmSvPX5Ybyaj4QQKxuRNrhd9DrEE6LrpLCm4N3+ik28oJHujWeTb7QiWlMtWynbfZZudvP7uxmV4D6HXUnam7Q3117hbXA/l5uCN1V1ZsMG7b0TY1anNt4uC4d8X09Mwxpm0enDRNUDvtNDEJpDPWsPc8LEd3d2W6kblqt3fY4Y1PJJqvBeLxgZbxFGUc+NMqRnaSfWnRx5Wt6lM+9fY5lQb7CmYcASjkOqLGV0buLk/9dD28B8XTrxNgHFlqsDrKt8igXcZvxLG5wy2vBQXfuiov3WObRt8ds+FtkA7sEeAzdT8zp+6A/RN4/HxhiO40Sd3lTxd7N+0hdkmvXHbM5BytJ+3bPr9qkoNt2d6NdnH3l5i4O3dv72CaAeuYWBf/YymZOgavoX7uyjf3FG8XKZDnYHCvUtcTwMi8RtEx+eLwkrkrrNEDdwgxu7scP/rFYcwoW/lnizOhetOcSstLkV3re7Xmhnz9IhQODOl5v3NQQ/t608h3Mxn5K7qn7sZ5EpgH4mlD4FdPYYjOpe5dVOydvMPefehSdnoOzqDD29tzaEfirnLujj4ncSfs1j40c99h09xofov6v6Eqvlz9t9dUwb+Gh3H1FS0u6nMl7q5uLZ4egx6PummpLf7883DqevdXeOKD5wvkps4e5cyLr7WpmWs5TzK5OrqRy9AQeMTj6Bux7A2ciHsivpOQB+5dU3dYuxi7M3mk8k3qHgiDcaPtUQJ/citQz0GRt++00+hm0k1P5ymIiTudvd30HZI+l2h+yRUP0Mt5+a2KE1Rm9cp88uDxJh4wYd0DV3t+XJz6B4/aC5/LGAyUB7duK+Z/BuvCgY4ypoBwMlWFOcrm1Gf8eSn/8lATZv+z+Vcsa2ifBOwF+WO+v+aCnLrzBnek7gjj0QV6JPHYGPL3W71+y1Yoe+b8MEjPq+N7g3+PQ+bS3nG0I3EH2Ng4cSiOibsv0yFxl2j+v5NmMbrlKzSiZKs8H4VbHkh2rhKmozl6pLbi7pK2a4nR7VWmkAX5+mJbELordr4q4/ZFRFED+XxSyjWUM/YgUHTS94WSunfWz1XHqnfvfPaojrpfLmm7IA/qDfnBt/pagYq9E3hv7xbtb59/OqE9KtMRfLLPOt25HZODvZ1gf8Pad5n2wZV9rf9IQVXfutSINQvA4l+kQa3cUUbu4pJc7O/c5cXwTjddgrcCfXqUVhj8SV4NbPqvJejsSr3CRDADdcvWFX20+LW8HkTyEu5zETF1d8rFu7HnXj/Nj7ojlIe1Y62ww9wbm/9Tt8xzbUaxjHKujQm5/WHgfdk2Ee0o04Ui8rPza1yNzlaWuDf6/HTQvnLlC8t7evsH9hto/TOqxHq192hVXD/q+qRUTZvda6LZcXpW0mupBQTz/MS0uzozr0hZPny4iymOcaqj4FoU8eXRxUtGzENrX/gMLT3U/SA2ROoe4v7Tu59+MjVkYXlJ3TmlDuJwnMqAZy4s4lyb0Vl755uD0b7T0Wmn18p01ISU6Ui1qjynjg+eJezWOz8la0c4PwNrf2HlCy8cuuuNG6ZX/PcxvUlsPqjoR1G97KCrsSvqVP1ZsXTc+QAu0N312dsB5SG2/EYR4IGjC9XR6Lmeq5dl4rw6zse5p/zyErYB2TVp6g6NNCc/HxsH4PkmuFOHYO6APdu7go5TsPjVy1uUavej9mp4F3vf3m6imZhcNr9MNyFlurpkxL2dY/nOOzOw9sT7xgR7ov2F267ZMD097WP6HizuxD+iLSqHXAdmpDdfdK99CT3z4deVvqj2UbMOac+10MyzOqCArs99Zxcs80a475qNK+KaQ4mkjip8+xRLiK4CqkU3lebvdYWpO2L5z2+a+SQLg+pT+SCzjlWo1ScRG2WEg3EFeM61Ae3nH9TT48p06zVxr+ulkrj7uXTtkV/WffJGA7vhXmhfY7CbluPH7ckNBzzMB+UVOJIuy2KkVkBD4JGWgIKJ9o6T8L61UBIBSDVOIPOviT6MS7tJ3LtyQk5WxinDhxSE+NSzdPKtwyo8FSbb6JV87u+qkrqvBe4ZcUN+darUCeWBwR+b6bDuecEK9s7BuFHb7tHQsv1hgHnzHnuEtG/FxL1u7qC9mHtq7eYm958ad39j41SmfchoTzp8DqQkPouUE3zH9VLBXrf6rv9N2DSKD5nSeL3ygHf5CjlP/rvW4zQHUGx1jqBer1flYtYFYhwsya/HFddjI67H5EvKfD11N5H4wcHBKUOepbrQ4Ffbq5rUnUYJkZNi7zD3PJUWpw/LMD+mtJdQHon7gmm3+TW0dvCOe9yPQeq+6dtEui2wdujE3i5mzkbm88otcmFJ4Y/H50qLsJcuwFZH2/SwxY3yq4NtfKmQLOl3NGdWQa+32C8d+uiU8qturx4ef5Ve+5fVE6TuHZe6v1loX224ryzI27Hk6/5Miolp6Kk5ZjgYNwpvt2WPHONnmEtBPi2VxL1GO60dtOOBVW9+blX5mcEEuy3Tv07PasABXRpDeDo+T5bmLijoEvQvVn6YhqoOxqNLSF0J3YPEPnzUe1Cu1w+w07J8ULPnSTlXa+EFaDHZtDUJw7nW4fL/i3rqqTs1NWgC8UBerN3jj9SdoDf7ZN6EuTbF35G99/YY7bjLDepaplv1lxJ3ewbmDu1CO2BH4g79lOL4lYD9s1/Hx4n74fghlfYedBxJU/C5yQsatWjYt+i2p3dEKzKyHwGrxOtZx2Y8TufNXd1d/VrCELZqAq89mtbuiPcKCyMhuc7ka5f/df4ZjtZTd8rubQfwQH7lysGZTRvtOgHHwmj+2N6eTDcQ6aZs76MN77Y6ORXlCbPQbj/bwst05wL3zZafc+IsmiXu0MyMkZ40ND1uor2fmH50/OQUQe/Bmis2t0vKXSzA5qP/vyO1kpB3xQ7r2k2vinpwOf5cMl7kbnBvq9LMowrp0si9bJ14xr0yt7zPi+wB6nzxfyYfg6ZV7wkPKO4jLnV3sXyhPS3j77777tim8Rnn8GTeLDIUmMn2noN5a2bvpB1yift6018q08Hc2zt8aPaeYYfyw+ny6Jtpg7FO3JP6M+vzWI6Fi+V1PnnhIclv1p5zvvSvyd8+iaNupWmCokH1wu6D43FUn9cbY/S2HA3gsas4e/oFcQe3Wzmsua47a0yoVM1F0VjbvyOmj1Ir4zlT30lvnvHRzg/EqbvG8sA99ZsM9zds+Xzj+LddiF9OAPK6LHROK8sVewfuE3tt5ax7s6fdlelqAuznjpi5D3/YTrSb0gqJO2CHEMdDPpoXvHGYEXaElyP+JQk6sSf+DOznRfxc1wt7kT955LXph8SLDwcimWLkTvo4OvLNLnF9t1AdnQdBC6J1HRDHJZEv1+lMmbrCOh61ZOQTb0+2/CeabzEH7Nbb01p+etKbHzF5r6TujOW//xywQ5+PWVzv4/mT+glKsyYKPNzd7D2zjmXbVR5mlOoAO7x9/SqW6armbu3cSYPdekN7Q/x1mDO7MiftaxDHz7f3Fb3uZ80k85hoY9e/0r+MZ7iXdz3yaFwp9bF8lsmtQMJN7TNbgidNqL2HRX99pgY5D2/h0QyeV6rNdWixVs61freF47tkoPe4cR8yzQN3ma7C08uuunLfow845ZPTG+DfPIv1Ok3dMZUOoJP4bwE6iIfGB6dWY7Z8I6TuVcHeM+zQyOaEquO9wP6XynSbXzrX9KChjgbYoW3ePL1MmTVtKNau0TykLu/Qdtec8TO7l28jdUAt3+Ok++XW5R1KYdcRLmWSij9Ztv6ZynpTq9Cce5SLh/NgK09Y9kcqhV2OJR3/D9XjzbqIUOdN6e7Q15EOuNZ05ZVX3fruxsQ7mN95m86IjroDdutzUE/2Pp5hz+vPZ5LlG/IAnql7RWmuDXN3225OsFMs062yAbidnt92YbRPdvC5k6OG+7D14dFC+6R9ovu6AvtQgf3T+dH88p6aNMxX0fB9bY+X8mHex4FnXaL/hSq+LV5hq9/lGhfoPMO07PiTL7DhCkt1ojs3OsNAYI/kp7NJxK+Zd9n8T8bSSLWzA18t8hZfNkdf2+jiiy668oexmUL8Rzt/F6Tu6+biblr7rtPYlL0H2BUgb8QvEBjMtYG353VnHrcT226bON/q+ee3ss226xfm7Z3OJBJ3eHtajeYy3Vlm7qDdx/Eed0Tzf08tKVVQYvvl2J/xxJu4DkUCeMTmu9TQY8yDj2qruDtWXEtkrqCj+ybcK/omXvHCFe5Q4ubupOq/gF+Dd3JO1Onj3EvW4a707mvebu2ii5MuuvbWn8dnTd6Yf8Cn7qdjGM7Zu6XusHVb/Zx21ibHB/AJ+6mp/ioRvVjZlFkL50N7H9nJME+cr5qYMGQ7mxdE+2Qn8d6BsWOVqnVI3JO1v1CG2p0+ddF8X8+SSFH3WGPhrhvmw76kZT7Cq4tkOHSCZ0EL3dwNMHeYui/0rJcu5OtDaWRXjvXJ6zUG+Zro5nEeceffU094RMQZr+t5dADPNke7XWnObgtwh8zk15rJF5eXUXeiDnefgaf/DOCRugN2LGmF1B0Lm1/ZJawx18ZYLxpx5HZGjXPjdHJz1sJC+aRJ+HohHrj/cjpG32jtXs8S9wH8fNb/PbWkKOiSAZmaG8sXpUk8e+VzJyp3xij2elerd3etu8efeR0PrlnjYfj3lg31f4nKIRmILfzKMVb+XI9aejl2hpL7AQZ76gX2bPJfrf01A//pB09MTV2eP0PCV+oA9Dgof8Nao2/h6iuHbJ364Q3ijvRi6LbmyWLvIB6bSbN3gps5P9catCDaoTYwxyrb+2SydsjBrsn7icvLj2sLf3a/KepdCtK5pc1jocOrxaOLfPap927r+LuHWOXLburu8jlV1Uk0pL9+sxr3IyevFM2jKXH/CvyklF1vHfP4k17ZseZXviTszYLgH92Ye8GdFn/VLT9vnDl9Zubxl5954f6hoZWGPHCf8qk7Rt2z3kDqvnIILV22VeIldaonL1hjg53Q3gHuiE2YPzfpfPLuK3ndEvf8oKoPwXrRaLuzusTxGzeNQ092j+YP78uIY+VB52Fu/i0BwpY7i1NLFvmVL2hgPhiOi92drAajdIG7y/tI/LFu4cewsgnnDnnKv4Inq5n4v6YePaHTqnUSlgyrO8B9bcf5hMCO1B3mftEc0rFK1forb334vrF3X56+/wXIMvHVGXfS3qTu1Nops3RG80P9ALphmj2f9PsYjJurSdKecN98LtQtmt88ilF4TdxHkkaHnUY+yX+fXzdt2rSxQK7R/IrlfDPCysUjuXGDkzzDQ36Ze2tYFPSs3/uWu0pvklXi49yd0htihHJ5SfSke+U4PGKS3WXmOo8ru//JXWf+IL5fyoHuXuUzN7X33DPPjnMsKqTuwB2YY51pR0Z/x6t3/DCd2Lgf/YWhPHG21OOQujOYR+oO3DPzh/bR26vaHfZOjRRwDdlOp+BOeyfZNhbf6R7K4wb35O3UMUNNHL9xU9J40ZMw9qzG2k0SmGCL7s/xPDbY5Rdok+QG6wWDT6NnD5iXZyaxSXktcnHuBlS7XR86OM4rkXx3X6/YeTn4HyTokmPxQGCfSzM9nc3D7Wdm+bIO97juSvwBRjUrdVzjrGX0X1l4ftPjT05/ZrTfj8W0ZghMlwnzJo66f2uOPoiOVxxKFupaJvaeaW8Dd/I+H/c08wb2rrQntZ29/zS4JsXx44CduPv8/dcVA8BUSXdQ+9NcXL7ivkS5d6tA8s6tE3kq99JqhOsbUQ1S9vAUAecuEe/OOY6iMXXXdfhMH6suXv9vcg76uPU8c1/A7sq73yHxBXNKxnJM8jrRvjl1B+PUHaWAd9/YTWM3mdYW5OHxtgw1yPtR9zdS6p5Ih1Cps//gfVjQrJvs0Ku3WZK9O97bQLhjtHvcs8FzTH5ieGJiRGjnA6aHqR1Wr1ljg2+bijYyeWex7pTlsPa/JQKv6PM186kvhzWR9G5F+0D0Qd98DZ00u7V7GUS0hXs0GXuTj1WvT3nXj0Qg4nLIzT9MvA+6fWpN1h3Ds8cu6VYTliKtjtnoVC2/H/K+7JaG64sS4hcV5G3GDc7au8C7gD0j/+mzG966H8gDekN+cMpSd+tM3QfBuq0R7g8N9Il648NlB+y17cQs69neJ9uGO5J3sfdC+/Bo4n3Sl+n4oKr2XHv/9PffXr73A+OcuIuO6+/9p9TT9RxDBR3DqMtFcS65U5ENb+zxzDo9JsXhTBpI30k0nJA8nV3lCf/3YndG4jrZEZ0v4ysl0eaESRxX5l1JsY04e6gZ68XKdsJRd0MdxGMHsbydvuOOn4E69fivMPkkeP3KT8eMdmp8qAE9Z/dv9ff9Je1+mNi70d4u9o7iPKrzjXKZbiK5++jw+q7m3k6ivf9wF7SJ8mG8dVh732yDmi0jFX8Vx2yLleb6EvjbUhu9k/m3Tpoie0j1ibTkWlaS2XNtrat9i49rTS4WYXfB/T/4DMceB7vE7+zhIFnpLjEXRvN5X5oh7JKZL1i0D+tI3TmnrlndkSp1OXX/GbBTrz311FPP3rPhLSBvq/Rot18b5LF8myw9mXuD/KH9c9XndnnMU8v238tX6zqgHbgznDcRd0vch9Hm2vtsUX49cKe9n3NXozHijuidevK4fgQdXCgJSrpmJTziduFvB1oxIO3oIfLM2+guseYC5olXMU9Xi9en0Pnz6NwLXF0m1OgPq5bOFy4t6CTcg653MmiZ1FPv/VkGxR3j6tqiRVFe9kyWukMF9oR6Av5Kg52pe1qIO/TsM4jrs8cPbXh27di7edR9qMyyMe3ngB7orwr27gXcae9N8n7+bPY+0ni7LbB30p7NfX079TZpfzjh/nMUzZu1L51YrSgLG2IClVb5mfITeWuBGC0yeVTGhXMZeZc0XcfWs3iaq66D7Or3sx1XdR6ryls6DyQR4HdZHO9ck3keqcdjpQV2T78k5w7yxYk8k/AgaVy2L7DO5k7hJFL3nLgXrX3iCWPdlqR7EvJZVure8OTasbWo1yNrH0wmv/XAQtWfui0HeHsfTge0dx2Ms8Q9N2bvm1mmM9Kh0VHQnlCHbu8ezT97OIKMvtT7rHMPS95gLacWAj96s7DVwCfwRD73YIguyN4Vew3q4+mzus8MwB3IBR4Xd5cZtbqyxa8rk+H0CtdLIyHepUue7cjmCbdgH0kmdCnNOKyrb9luR+971Szus5trkbtfeceVhrtz98dBO3pGftoCe6O96Z99tmYIpCd/N+zf2nrLBWmAO7scvdW2pN0QLbT77N3s3YRHXmRvT8CPzqX9w1EL5JO7rx8dzbjfDNQftu6jeVp7f00+G0HHko/Q6tyT/aZVqKfBK+8qAq/E0wTZfM4tUsrjZ1jFoT43Le7xSpcmbwAkXtFXrH1RcvGEy1wYCZyIdPdJLn7IdMEpuNRvqHxy3v+LUNlcGu12wL4M5rGxujx4v/grcO5Sd5D+5FOUpfLT17w/a/K2rBnCKJ0xf+h2SVtjQeumLa2lVZbZ+yrSnnhn9t7MtWk4t89y/NBmx8LXmb0zcU+BQTZ2W/DNvrqLelej+VMOH6ilHnWB9xj9ILe3xi6k+18qx+oc8lL0YWDpIBDmHY8B8MHd7R52vXm++xx6nvasq9dr4A/VOSfrS2bldG0u6EJ7Kxg1E1UZ91M4mNyJaqhzELzfZB7fOPxFHHVPhfkvxsZcKI/U/UnG80T+menP1sDik4B84v3QHXfccbvUrDsBfSyi5bR3o9n0IbN3w72DYvuHScO4PtGQnokn7bgbBt4O2NeP5jLdj0E0/+SKLWvphjV0ayHrWLOFxPsCHroAL8i7cD41RT0rnk6v82nJX11BNV58X+N1HgV+LnUFuVDVPxjKR3Ni3YZdPH7h2Td9Gws7VSFeB4uK+gcskDbI9jtun33T6DuU5sujUpdj+TmpOzl3Fp9T+c/g8oA+zcRZc+COTtsBfkjop9nvXey9VNONV/JO3ME7/J3ET3QQypeJNeWzKqDhlLjborX5xtotlUjNemoKe9kSfDRFnhuf+VMa2DvYlXiaO9bpEFJ/Z94u7k4pUDRbIVksPSbe1/exK+6uW7kftsAdfIZ1zKEW9GXFzaKl9TpsGMtDrQrhHnBfS/dJnKgOeeqqHLUOGPDG3HFHgnhMmEc0/4PhbqK5P66Ue5M35AvxSQceuGNqlCCfY/y8zfZ+8bbDpN3ULv4O4Nve3RnLg/k8BFe+st2Gs5sw4h5F88+ucIUE6ybBPigvKvSEvTQFPlNe1gV6qdor8/6OG/V3mVYrAJAkB16g+ELXUL6ALuE6O/fCGTd8WfTxjhBjFT+m56WwL4J7P0VWnyjKCy6IX5C7K/d+ZnZddAw0k/f1bDpEfkuDbr+9973q2pS6I3f/eWyM9s5hOCX+njn7H3+84ZrEu7X3DkzaMS1ZgrqtJKrfe1/YO3iFGtrBe2PdJtp7gnzW4Uc7JZSHwHqjLzztNhRHnbIfagcUWM/oF88XZdjRAb1ST+grcX1qxeDV4bViR9i7Ek9/V+SJDmGDKsyrn+slHbHjgcM84F3K9UK6XtBcX8bpuCLzPF0XOfc7PmHvNtC2QOAlqift3A3CeIaEZSe3kjKKAD2Yb8L6WzGp7irMoIXWWjf5jN0Tj2bbj02vf3zN+7fd9t5lN9wA3sF5Fo081HIMxgFX2juBt2W+vTOaHyHt0GjReQ/nzB0rV5vfuAJvOpBinxY2Jb4YPLvA7gbwwjI9G1Yql8rxBntVIZ2VeVUXXw1Vt3odtm8F4/CKvYzg+ZCBKHNf+P9HpU9vxhnG7zqR2Zfk66C7aVRsMgUj9nbPPpZZD5kHu4M+IW9h/S1XXvvV565MZ7g/OQ/xZ+/JeubErBUrDk3a07QjVGxcCY/L9LuZvWdcae+M5/ExMMCd1brcRpi4J60aniiJ+602COf1ebH2Qxl34O1IwWeMD7dHF+Y96RrOY9FheO7ovF1K3+CJOrY6y4ZpJRWMtyvJiyrbhe6uZ9irUb18/HqoJXxOTU/wOf4yiu5ox2Xu1mCnp3PP5fXcyFMiQuZ93ZdmIg5P5I35I/be54O1YPzxxx9/7fHXXnvCZthkok17rtizUfeqG/EmyHkNjmyDdV4oXDV7n8+7AU9/B+70dzg7vL1N2hPr6XsU2m+9BYxLNP/pCkNdc405P/cc0eM98CzeibOD9O7Ek/Cydb+yrr6ORmNHp+gvf1aY99SzV1WHPp5oHz6ekoTrfXBCuezxBrglKsQRcYghu28mmT3zV0XKCTh3WLTzc2vo+fWanQCvIvS7LM/KIIp4Htxa5zkhWaXfJAtzbRzuH3rekb1n2jn2XhL3DzPttPfhrwz3UpR3E+tOPBTlRKgMGpJ48Xkm8570vFGBc0KurGNL2KtVusbTbRMF8Wwicj4f9r/t71y34qdOc6NFuOBQ8JXMvGL5lVxcJrqKu3MX3SEv7r441IGzBvWebsbz9ZIdrd6V7mLoiyMV5YJUFuJZtrLBEoqX6zJ7P0/snQG92Hvy91UTgD0n7qusoxntE1/davK4Yyhu/NBuRUQXmCDeIPCawZc43paoRkdr96j7XJ2gK+k09TBfl8+exKKcsPlRsoU6uD6I2m00dZdAXY78IV9EnxfxXWsx0nlyGsVj38Guzwinzwd3m1dQL3G7B90/rpm7/ilq3VH3ooOgoaN5aU5vC1Vi1wVL3yWsyw5Wob1buY7p+x+snc2uDUEURuMnIoYSiYGYIDFgQoQwcSI8gamhxzAi8QRGcqcSL+IBmIpn0b3dsnyWrSj26dO9u05wJXedb/9UVX/aeI+5Ns8rcd+saAf2zdk77u9evnr1Urg/Kl1P1DFkvUU9q3QYtfg6eU4dlLcWa+DbqTVWFkQJs74HdotBO2awQRip54jwwp11fkZ/W/0j57AeoCPiztPHuJ77ibsSx2Mg79XO+YtQ5z6aN+fk8ceQ/znziL1s1Kd7zsfZ9NPo+jFUtrwX7wV8GbSXKXGH96M3t+7cufPw4ZXtuHLv6mZv33788OXR3SomppyfnUAO5s08W5rsNofsdTXz2XFFBmQqCPfFeAfMTrAXDLjVcRvWPrqGVxfHe3e69WqcJ8hAOZAH3ZbuEPjkH9P9hHtyd7pxYl/qDvEzUwGP2dsN8XWM27mJfBnw6zug3pfv/1StewHue/L+KXmvjnvRXrfF+dN6b97NszJqcFTdu3k0Fm/PoKvjdxPnIp+aGVvaoeu4hh25of+GdJmKJDDxnBvaHQbKzVaUDKm/jtsk7BL5BcoRcc5erwrnEAvkftYvzgn8PyUdl2ugDusxbV42wzz2ZyHAF/Lifjjk9oZdwi/653b5WoTzh5tvNt5rMu034L8H8xvvn3f1f0PiXrR/O7b3IaXaRfXS6mNXYENzOQh4K+La04IFrxPkM02LzWxm6p5hZmMSUNR9yTz1FtiV5kO8Z8fwI+mxN9qIdlnYc6Vquw/NGM6L5s80sK+H9OCd9floyZVx91fwI+45pX5axYN4xH4CvvmvS/9FcCmacYeLZw5Hkb5v11GtK6uOeybuT+t1sHJDOodRH2i7c443LbkD/W7zklzmZuh59GSb3UjVcu+hX8zdAbnttuc+09PWm59N7e0pcP49fof5/S38RblfYr+O9Xacn0ZEyS79BDuX0cxFvk5g7yrevF1HMUpK3/KPx3XQ38n7+Ytnzlx8c8z7mFu3e5/qbgOdonyV50rYy85fVMogcR8/hEiXlHuNm1HnIGEPde+WubrfUo4E3s03MkztruYWnFruALka0J/QMB94rXvTcoNzHA94bD2gR+F5p87j0H73Q5kab4q5K3YBN0dUbMuP2n0Z3jS4x4V4pB6vs8EA7BMA9wZnZxB95JZq3fmbO5iPX9TGNpTnH2y2LXxnQ/m9TIey1+v1TQqCglxJuVgfsEvdW9hx6oQF9POtq2Cetc/ogJFP9lt51ypT0JzzjYuh4FoAq8KchL3bVT7VXaSvW6g7BvADeeHPmmJvFekB3CW1z4jOpbsIATlE/FTwI7Yn90SneuwBHt6n4Is3hP7y92bc40L04mGnfayF/bSH72XQDuvD6o+6sF6Hp8GRmQ+XVevjzf9Sgb3Q1z3Iq9tuY8okRwR4fX3e7ThTlIT2zLut7jsGAR2l5z4E3dRjnv3nat0/Mu9nM6YnkYf8mCsfW70zsg68ovg6SOSdv/tBJn+JfOTy444qcwt8XImHZ+CfgfPydh6R98MxpTeR9xd7ie4H3nlWTMFep0rcRxvtrDP2UaNL1rmBajroP7r94laDrz1qT/kL4LcG9fFqiI/ys1JeMSfiRbTBR9H9F8H2pO02fg4cFxk0SQjjswV915Ce9xKoe0GrtdzIr7fk8cEe5FkWSfjHBegXbPCePTs8M09ODxRBvowcfigv8n64OEA9fMe96nP1KCmeHXFU2v68Tk9J3N0459+QrmtvCrzNGBzDEE8YMDN1PbUgzpYLJGDdMk/6qF9usAl15/Q/ptoE0or2k3hTbyln2g0D3K+KvKvvIJ47VTEK/5pvg6vVMThzczsO2PHI+nPzG8vC36X2dOsin8d1Ed/sq20HLpDO5jBU7Eb2viE7GvI3R/P96PhJ7QX6mFVbY8e6Xtp+3HFP1iF92U4L/B9Dgsz4O0PuvUjGtTxX8VyqN/Ah74Le8j6nvK/Hc6T+u7+vtek5BPk2PuKyTHp504e+0YlP5MnnNZmWD+KjNZUnkwf/aNNxAH8kgeT7XKbgp++dsObT79F5CDHw9OZK3p9d2GptpdB1HI5yVyu6ciNxL2kf6v540A7y2oWmbqgXOuDooHdgMC7Hub9LfL3Ss7vFMeoT4LOEExawu2SXggqDwDqnvvek7hJ8bWhjnZfIq0q/CrsBR7lx241q9OKSpXqIZxD01yyBB/yG+ZMAnk27OfGGPeJ7pN5K7yAfKhItGIxm3LUzPyyu2eQ9d7WqMn2dN9iR9t22LGDMnMMU2k8soo7ZHtSp8bONLXL+Mk4dgl3FV2C3sqv5LmZW++7iHJnXTvWwHpX70PMakbSrSl8u+TvIr5k6cLLoZAI2rjee5Wa8Hd+rT7dq3gXH5Xz4r2MMIPTq2Jt1l/OQeMu8WVf6np04rCR5m2tzPZbRHcYGtch72fv6CtgYr77d+fOHw5Mnt1nzwkx44d9sTcXPNJtEexrgeUWnfnjmnXcWSBqj56q+rZQdUbK6/3Pf3ZPi446/FM/Kzl7zGcbjBuMg37QaVs2PZWdEj15vpuEl+dDv7Cq1vrwl0O0CeyP7g3oJCPBPLeeO5LyyNJpZBMBYxvFFYPF+KfC89abEXbwffYO8KN/30fl5xXrCnntUdBtSKcDvmSeMVwW/37EK0MFcsLsN3/fi0I7sG2PJEPAJ4jnrHhL0cN2W5xl28p4Kn98GHP/NOuDL7VlnKPJ64N9cDNj1lFc++T9qXwddPbX4lOtT35uw3q24gXhsNLh+mbxj7A3JNje7HXbasX1dzOHBjRtPbt+u9W3emcJy7nk3nn4juGUoOQU7SIdxWYTuQlxGFZ4zJjVBjNoFsH6Z+7kRwMcQgHu2fDuNtkMes7p7bt2CzIdoaww3ThHqS/0Rce4Zd01fAYC+E5aQd7YP3l6Gk7LyV2LP0fXoR2qbAs9KmhFf55ZW58q+sncmuVrDQBgUw4IVx2DBkvsfDvQrUalUtIxaBD2h9/mRxO0kDKJsd3vIj9eW0m7K2YAGxoP42UU/Is4InYJwZ91ROM+xkcjOM+m1+Ulhl9te5r0bFIiNsO9n1JJVRH5MYf3OWADPPakMzuoXIerOw7oFuwBvd573UpQIoFm3b6/1D0vK6c83vIcF/Lm+kmP6Z+HhQ3712x49yKtlf+nr1++/IP/x49tXId71rOBdxRcfdXG9EFFLjbHdP5wmeZuD9uBD/DybrsBfaYB015/HDOzkyQ7tu+J3gT70YwZ/l6EKTsmnmAPoBnzKeUJQyxhnH8E4BXXx9/pU2LGoAuCM+6jI0Z+3+mPUXhL2L96jL8a7i9SJt52ZphuOlow7AbV981lUqsyZva+ioJ7lmwaEQye8QfBZ7qyLYKNNXh47l8eE+2Hi7eGjzWK51ffibHdstJ+QTCWgVl+I5wOSd7F+Zu39/Yb5vX8e3mT2xT7rJgJUJG48L7eb93v2FjN7oBtnIx7pMUg33IB+lqImac2rtAkNyZeE+McBWNrH7dKTV37aZXr8XkzH32SlM7+m/gw8CJt0FaRF/52bIPgxUB1oJT35judhW2i1Jr+Tf+4UnZu1rgb8XTfB7D0kKGa32MYnNBUhKwxPynoH6k77XXN8DrmHiRBggGA8+BXlPM1Fioo3poJPDL6qOUE7Dg8IuKeQQOsGCFctkFh/kVaBewEd1fuXMvkVIcHdFgCaH3TQ50YOHSqzIz2/hQsetgr4WcRFSR40MegVnh5txPVT5G9w6rpD6EI8bthNc2Pz9eIzZmCvvfI+ltwd2CmU9oyjwq6TcW7vn0KH9bgg4wA/fE/LbxPurwGRe1bb+YWwQD9iKeP8pOD6yon2QySuqEP8ndykVKHKy1Phf9+Nx15H3/C7DU8v3swDeNgFeBAX9gvth+u5Ft+inydg/bZ3Ra6j//mx+6CW/gN4ZYF+ZgZh4DHuJFvNdg0SpZ5JvVUV+JpJCSWQ/+tiVaL659lqrFtOxj9CZ9S1apsrCxZMvBveBeDhmVwm2HWBnOFvquE8W76w774ws5+Ejw2TV+VAqKwGmJs4+55GAFV049vSi2yYfxk9PZiZQtnNq1FJCjpu4RDFMH7BOqS57S8i50KcCfPHUkLtFaA1p6I4yQc35pcNp6QhDwyzFJwljR67FYpgTyyiE/k9lXtY72iAPPRAzw+5Ow3xO6xc2Mgrl9pXBcEkHrweaucAXlKHpMoQ3BBGVpVIH5X9TjZyq01TNeX4RWObGnWg1d/JIw4tgEDfpxB5lx+8TmRsyRW/4Pss+XCaPOd6chxtNxEk8w6yWxlyUH+dyPvHVc25jffFUXj2MO6yhZZOfe01jp2DYyXCbb63RkyFP/fkQVdb3IEp4lWoYxWuwOyoPra2CDT1kdUcOlKJiWzsZxV1O1ft6KH+i5vzYaKNOuQrygMujEO6gSdx8AUnEQ7Bt3kahwNoAZ9735w+zsbskp9y9+g5BjFO5tBmvw2RTUHf2pL2a+qedDxC5r+sstqyR9QvjaYTryZd1W1E3xXCzPt6URysW9jrw6dVz59p3tMOq8gF68jdffflsb5J5qedtp7S/vcoxy1pFqlC4tp+iycngUbYcXrDaofFVZyDJWW8AgSo8MZVoW+vD31fu/cZhO9MHH9NtrwnSRFs604H9bh+q+j/n/qoI6ibco4w4LtIkGP6+cn+wRielpttMqyeVERV9ehB7uG2vWxvfg87j5Z9k0vRGJz3h6TKfGN4M/r+kKyeunLchBzue68AHlC9kBjINgAwBKtpDbnvwgy64x6An9JuVxJAdoXCOzGSPma2dTo9XFb+f96GvZtCw+Ke81YabeSvVODTnx94T8we2zwtr0RXqi4cF/Ar+12rLNTjhvfKYqUOXGJLXSHG+cVQ5LgnkWUT0JKZExeeAA324N/ahb+isUdkon5ZrfDAXJhcC+L1crnplwx8Du7dm3QSmdMA3l9Vgv3zfrlUDfy81wM/2TsTXCdiIApy/1ODPkvpqVQyDI4UFjtk3Ms4w1Juu+18VGLl76QiiT1N6vGinzioNCMDijjFQNXPGrf00dmXAsJMLZRi1V4qCgqaKDsBXRq8G0ZYfQJ8rvrRQXQdr9P/GrnzANfAe22Y0U0TWCn+9p137ldaM1BPl/G3s485vuj+jwtBwLZ77wJy0cAzdq0E8NLmBj4eGEYfx5Rw5boj1rkQPhTddvttmBeezwtI06ZXTSmcnseePx5D5HbdH3VZK/dat1NspOu4J6YVKNpKxyjpL/6jrThSNKr6qUAubzrCHCBI/OMbjIvxgAy3eYYREQuDxHwY1nmnYelcmFF+QiUudKYOmi5k63jnE6alSM7T8Mo6F7t2zeiPDckrIC5oHy4U+Dj+qkZDOUb3+AvX94fGScSvyv91D4b337kw6z46BOdIYx9LGzGsyK3SqZ+Hhb+CDT/FOqAJxIeot8ajCp+Lgdc4jI7/Dn7UOKIzx2gAYj06A8h1WQFW5xgoCOfiBb6SAChilZAf6xzC9heJTfCfft4b/IcFvil9lknHA2Iy7h7D9VwIEf6BLxUjIXDpeIA4V+BFGkFOiu4DLBLN1SG46uLaowJvA3t3uxRx2bV4r+nRRQmXQF9g4lYdWQv1aD2m+PUn7V5OhC+j43v3Z8WlEmdEiQNG3iQZ12el+wFWQEdl/U7tlV+UGbsUqsbeRumyWoRpxgDsK5hAE9IGBoumNvWD5A5oGBdzfMfSSM8i5U8aAN608AdIeyKV68KAtB5XCkh2An94buCxbnQfzhFkekGlATdUvs0fC/3O0uEFL1xOVLtrZ+oQ4FD+tGv1juiY3mB7LfJ/76GL/+43mKDDMbifeHizQKm5590fDtrK2q1IB2NgE2AO5s2y5TgG2Nakc3EiUKTTrBEZFyBaKJYxDFECa6BcYr2BITpRTD/qe3rlOn4UZJxw+EfHg091JtYDejMOPsvJuj0swNsOXs5D2IxAY0cD1Bh4aY8BhYL+sI/uONs/VItq88ZroV79ogg0GDAJIWmSOOsW+F2fIPPCdP5nrPQgbwwa+P7t5GuTBElGiheRmZPf1/0CnKNYqe+DzV3+846khMTYEbdJhh+LMhy/VYW9xfJT6mUaONe/mpjSVwnXijbtiMUbGY7dyTJuPjDAxS8uykC8bQaBZ3Q2Zf8NUOZgSVYxEcdcLoDecZ8Pd3OZBvO1YpzkPrKZ92igc3wlugrnJ+E+0aeJHdMQrZyBgLxePt25Scv/RRhEsY6qpiNuB/A6foVDZhRa0YX+PGjWVuc5L9OU8/JEFkmgXjs7b20fwPP6HtPoNTrUtrsGC7zwARcElkmeEtA61VBnxFd6wC9sDuLOKahqrc08HQDj355EFIV4uAT+IVBMjkUezVnP2mugYGj66RmZX9s4T9I9m9vYTalDXvgfjqcCEV4XinpZQv3ZGd2J1zjtDUGy1UYdpXKIqPgj1imF6a6rm+VElefaxPwg7oA1VPAGHN7YoeDLBwkxvJ+QHu2TSsNXUovCT+mB1Q81VGJplJ3Y1LaLbhtdhvdzre/FbAAMVK/Djx5oZRH5gh3rdIXekxvrxdx6k9jnRF8EfS5FObWtZl48y4b6+2slvW1WcMHxfg6yM2kOz1XeKMUWTxEbW55F4IMjKl/2Xm9gYFV2xoCPS5Le+TnR9DLQAdVqb7R5Xo8rAncPpurUqT7d1Hv3yt/DkyGn3bXP6aOziaY82mDdjA1IqJXhUv9OEjmiokOOFCb2B0WPIfNZtWQpnEeEHsRx3Yv/8vDkigeqSlB2Pq6P0uEB50BwlXhjzicl/FwBHQMCPYhXn7Q1yWPB5rscyWlUhH6SyhcP51pKmyCOC46bCPZEw/ifKXImYd3G4PXq3hvjlgNoDpvPC123yQDbw5HcP2kx8ir8k6px3j81ylBv4LpQgDvtkoaeRR6JJoJmL2hrEePsu+DfrJwNG+t10h/9dnZO8T/mu2vn/g0PlQtMSsd1euhjBdhoL/J6KPWihP0CPbcNSh78+tZk0Dz6jDA694FGyQcPSjExU903AwVEixW26wGeuIw2+V9npDqT5z27Jpg3L3QWfhS4eT//Q/ohMK4wWGBbyrHnfMR440UrK+au5sV8UYNXn7oPpqd/GZFlP2c9gBQjEvMm6BoiPYunMz+P9j0PRb6dScy8q0dS/q05KkGez7u8gPRHx+s8GmzUNuBmBSQV1Ueigb4XQzwGJgHsJT1Ne44YeKM1djXah1DV/JUNF0QRGbESY6wZEO2yULrPzC4g0WsNGdbxuELvzuEldeTREcVpluitJ+9Tjwb5bvF44qhs9DyH9yQ9ZvZxdNDxUA2RjwCk41a7d6iH7TnOxz8s2n7mOjAYv6VqFONdzYDZbmQxtc5cr4PHz1W7XR/MhasGIJq4ubsamLrE0Ya5sWc8ro5OCF4CewdraLwOumVLVvmxoImrI6R+//HNGvwFF5KRkmZ5M2F+eSexZvKdKVwC0OHRm/1NVYAEAeEzmppiR523Q62Rp7vSRTNi2bCfsh90gdSl853qVjWYn7YXq3iJdc2vX4z8EKuZvFMKMIKXLgA88vCf+/FeGyT0Glj1XR3d3V9NnBGjxhhU2LkgdgjY2jHcTQdX3y1TC0ASz5Sdmlyac7VmajViCZG/z3FF6uNKY/j2QqmHscopYUcmVJCxVgh5bYHUNuwgBDg4DbYrDkWecIuZDsHNHgLdey2vuz2TEK0+MzAmuvSSYAM68oPv/btpB9nWGHVvSArFv1zOtRReb9iU+K1nTIsyxuPTsxukqJ0MGq4juuMDbffgttBreiTDjgG2TfHcaTLF2rCERBvTdkg83+xcbPuPxhjXSERFWg/Acf9L/cX6mht8/OCFH2LMG+9fm0sc6nRTN/f9HYA6uC/hsI+schd8wJXS1CPjgmFlRjLjDV5x+g7HXEXvbX0eV1B66NpH6oFiTTGJJ9Z/vBn187+d5+Sv3LUTyCPhfR6t1DjU+DCDvJKNvk0SCbmeKVmhhmv+seUEdflw3u5mMaUuwmyVFCW6+sdjLMZLlTMBOAp+udiPF/7zfArznUiw7qe/jiv6x3oOO8/oQVqDRSe75cVXFBjBavTd/GQ+nytvTZXc9aZqS395rRy7f+wLfS9F9SNiRFsAeZ998G6qfSa+c33iEr4D/oBddOOLfBxNp61ZAb3EFYVHGGx44/S1RpCsWNprCGy9Ojmn+JQW9dpMNOiAAoIe0rUSKfHTjc61b1Gjcc2koKTqQrOdWupVdJ8Qg9/ri+CNEWekAQrn0wFakcctphKOFvKRK9W3Xbon+lntdix6RZqStB0SmvWBiJEmU/1a5DLWLMWoyCTmQEQvzrfStJq+sYQ/nyRrkNymR8eXml7XdKQzXnJEPZHOi9D7sDfprXS0VZjWfGSHLu7r1B+OHiQiJo+sT8gQjk7Yx+ijrcBe5Hqobz5AD5VmyCz96Z8b9PQz1k5Q3blHb3XQqYM8jzvh2r3hP3B4WmFAJnKIQMQeK5JaN1fZCy4DzJ97xXdR46M3HghQ3yvgZKXBdTGspn+zkB4E3OISObJisb9U47m6sMY/vHjK9UeYGsaOiN7USAw/SF//XoyvRUfVaURSbiI10sYhj3c980HDrCWyfBowD8sxnUPAbUwtDrceUl3JzTAqOQvt1erOiRO8z63cMQ7AIAxD0fvfmvEPTxZLpqZpoK2E4yhG3ALd+y7G2B/Lmwk6lK57Yk/S7NGk7jFmDrb0mGXEluyeucv4/FhFbJUuUyLMZXiv+kq/righs9QiZVPljA0FyX6fRxzzSwp5LaEG/MxBttsaD8VD0fC/DQj6mGRoP6s/bJxV/QMuDW8+k2OWMAAAAABJRU5ErkJggg==",Z=[];let Y,U;BBPlugin.register("minecraft_item_wizard",{title:"Minecraft Item Wizard",author:"JannisX11 & Mojang Studios",icon:"icon.png",description:"Create custom items for Minecraft: Bedrock Edition!",tags:["Minecraft: Bedrock Edition"],version:"1.2.4",min_version:"4.8.0",new_repository_format:!0,variant:"both",has_changelog:!0,bug_tracker:"https://github.com/JannisX11/minecraft-wizards/issues/new/choose",onload(){function e(){Vue.nextTick((()=>{Y.content_vue&&(Y.content_vue.current_tab_model="",Project&&"bedrock_block"==Project.format.id&&(Y.content_vue.current_tab_model=Project.name||"Block Model"))}))}async function t(t){Dialog.open||await MinecraftEULA.promptUser("item_wizard")&&(Y.content_vue&&Y.content_vue.form.display_name?Blockbench.showMessageBox({title:"Item Wizard",message:`Do you want to keep editing your current item "${Y.content_vue.form.display_name}", or do you want to start over?`,icon:"delete",buttons:["Continue","Start New Item"]},(t=>{1==t&&(Y.sidebar.setPage("metadata"),Y.delete(),delete Y.object,window.ItemWizardProject={}),Y.show(),e()})):t?U.show():(Y.show(),e()))}window.ItemWizardProject={},U=new Dialog({id:"minecraft_item_wizard_start",title:"Create an Item!",width:740,padding:!1,buttons:["Create an Item!"],lines:["

    Minecraft Item Wizard

    ","

    Create custom items and export them as an addon!

    ","

    With the Item Wizard, you can add a new item to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench

    ",``],onConfirm(){setTimeout((()=>{Y.show(),e()}),10)}}),Y=new Dialog({id:"minecraft_item_wizard",title:"Minecraft Item Wizard",width:980,padding:!1,buttons:["Next","dialog.cancel"],sidebar:{pages:z,actions:[{id:"documentation",name:"Documentation",icon:"description",click(){Blockbench.openLink("https://learn.microsoft.com/en-us/minecraft/creator/documents/minecraftitemwizard")}}],onPageSwitch(e){return this.dialog.content_vue.switchPage(e)}},component:G,onBuild(e){let t=Interface.createElement("div",{id:"item_wizard_back_button",title:"Go Back"},Blockbench.getIconNode("arrow_back"));t.onclick=()=>{Y.content_vue.previousPage()};let a=Interface.createElement("div",{class:"bar_spacer"},[Interface.createElement("div",{class:"required_message"}," = Required")]),n=e.querySelector(".button_bar");n.prepend(a),n.prepend(t)},onConfirm(){return this.content_vue.nextPage(),!1},onCancel(e){if(e&&"blackout"==e.target.id)return!1}});let a=new Action("open_minecraft_item_wizard",{name:"Minecraft Item Wizard",icon:A,click(){t(!0)}});MenuBar.menus.filter.addAction(a),Z.push(a);let n=new Action("item_wizard_export_mcaddon",{name:"Export MCAddon (Item Wizard)",icon:A,condition:()=>Y.content_vue&&Y.content_vue.form.display_name&&Y.content_vue.form.export_mode.includes("mcaddon"),click(){Y.content_vue.exportPacks()}});MenuBar.menus.file.addAction(n,"export.0"),Z.push(n);let o=new ModelLoader("minecraft_item_wizard",{name:"Minecraft Item Wizard",description:"Create custom items and export them as an addon!",icon:A,target:"Minecraft: Bedrock Edition",onStart(){t(!1)},format_page:{content:[{type:"label",text:"Custom items allow you to expand your Minecraft experience with custom tools, weapons, food, and other objects."},{type:"label",text:"With the Item Wizard, you can add a new item to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench."},{type:"image",source:W}],button_text:"Create an Item!"}});Z.push(o);let r=Blockbench.addCSS(`\n\t\t\t.format_entry[format=minecraft_item_wizard] {\n\t\t\t\tcolor: #dd88ff;\n\t\t\t}\n\t\t\t#start_files .format_entry[format=minecraft_item_wizard]:hover {\n\t\t\t\tcolor: #eec3ff;\n\t\t\t}\n\n\n\t\t\t#format_page_minecraft_item_wizard {\n\t\t\t\tbackground-image: url('${E}');\n\t\t\t\tbackground-position: bottom;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t}\n\t\t\t#format_page_minecraft_item_wizard content {\n\t\t\t\tmargin-top: -18px;\n\t\t\t}\n\t\t\t#format_page_minecraft_item_wizard content > label {\n\t\t\t\tmax-width: 404px;\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\t#format_page_minecraft_item_wizard img {\n\t\t\t\tmargin-top: -80px;\n\t\t\t\tmargin-bottom: -75px;\n\t\t\t\tmargin-left: calc(20% - -21px);\n\t\t\t\twidth: 594px;\n\t\t\t\tmax-width: 130%;\n\t\t\t}\n\t\t\t#format_page_minecraft_item_wizard .button_bar {\n\t\t\t\tjustify-content: right;\n\t\t\t}\n\n\n\t\t\t#minecraft_item_wizard_start > .dialog_wrapper {\n\t\t\t\tbackground-image: url('${E}');\n\t\t\t\tbackground-position: bottom;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t}\n\t\t\t#minecraft_item_wizard_start content {\n\t\t\t\toverflow: initial;\n\t\t\t}\n\t\t\t#minecraft_item_wizard_start content > p {\n\t\t\t\tmax-width: 454px;\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\t#minecraft_item_wizard_start img {\n\t\t\t\tmargin-top: -50px;\n\t\t\t\tmargin-bottom: -72px;\n\t\t\t\tmargin-left: calc(20% - -25px);\n\t\t\t\twidth: 635px;\n\t\t\t\tmax-width: 100%;\n\t\t\t}\n\t\t\t#minecraft_item_wizard_start .button_bar {\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t\t#minecraft_item_wizard_start .button_bar button {\n\t\t\t\twidth: 180px;\n\t\t\t\theight: 40px;\n\t\t\t\tmargin-top: 20px;\n\t\t\t}\n\n\n\t\t\tdialog#minecraft_item_wizard .dialog_sidebar_pages li {\n\t\t\t\tpadding: 8px 20px;\n\t\t\t}\n\t\t\tdialog#minecraft_item_wizard .button_bar {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\t\t\tdialog#minecraft_item_wizard .button_bar .bar_spacer {\n\t\t\t\tflex-grow: 1;\n\t\t\t\ttext-align: left;\n\t\t\t}\n\t\t\tdialog#minecraft_item_wizard .required_message {\n\t\t\t\tpadding-top: 5px;\n\t\t\t\tpadding-left: 16px;\n\t\t\t}\n\t\t\tdialog#minecraft_item_wizard .required_message::before, #item_wizard_wrapper label.required::after {\n\t\t\t\tcontent: "*";\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tline-height: 0;\n\t\t\t\tvertical-align: inherit;\n\t\t\t\tcolor: var(--color-accent);\n\t\t\t}\n\t\t`);Z.push(r)},onunload(){Z.forEach((e=>e.delete()))}})})()})(); ================================================ FILE: plugins/minecraft_title_generator/about.md ================================================

    This plugin adds a new format that allows you to create Minecraft-styled title models that you can render in high quality.

    Getting started

    To use this plugin, start by creating a new Minecraft Title project from the start screen, or go to File > New > Minecraft Title You can then use the pop-up dialog to add some text to the project. Don't forget to set the text type! You can add more text by using the Add Text button text_fields in the outliner.

    Once you are done configuring your text, you can go to the Render tab at the top right to produce a high-quality render of your title. The Position Camera button auto_mode will set the camera angle for you.

    ================================================ FILE: plugins/minecraft_title_generator/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2023-06-11", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.0.1": { "title": "1.0.1", "date": "2023-06-11", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed resetting all tabs" ] } ] }, "1.0.2": { "title": "1.0.2", "date": "2023-06-12", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added overlay opacity slider", "Added colour opacity slider" ] }, { "title": "Technical Changes", "list": [ "Checkbox containers are now labels" ] }, { "title": "Bug Fixes", "list": [ "Fixed missing pointer cursors", "Fixed debug mode duplicating textures", "Fixed plugin about action not getting removed on plugin unload", "Fixed anchor links in Blockbench webapp", "Fixed gradient overlay scaling" ] } ] }, "1.0.3": { "title": "1.0.3", "date": "2023-06-14", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed for Safari versions older than version 16.4" ] } ] }, "1.0.4": { "title": "1.0.4", "date": "2023-06-17", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the \"V\" character in the built-in font" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2023-06-21", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Tweak the \"Small\" text size" ] }, { "title": "Technical Changes", "list": [ "Fonts can now change the example text" ] } ] }, "1.1.1": { "title": "1.1.1", "date": "2023-06-23", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Optimise the models in the built-in font" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2023-08-04", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added new Minecraft Title texture preset export options" ] }, { "title": "Changes", "list": [ "The plugin now has an image icon", "The Minecraft Title angle is now automatically loaded on project creation" ] }, { "title": "Technical Changes", "list": [ "Update to new plugin repository format" ] }, { "title": "Bug Fixes", "list": [ "The built-in font and overlay will now have a working thumbnail when there is no internet connection" ] } ] }, "1.2.1": { "title": "1.2.1", "date": "2023-09-18", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Added a warning when there is no internet connection" ] }, { "title": "Technical Changes", "list": [ "Switch to jsDelivr CDN" ] }, { "title": "Bug Fixes", "list": [ "The built-in font and overlay will now have a working thumbnail when there is no internet connection" ] } ] }, "1.3.0": { "title": "1.3.0", "date": "2023-09-23", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added font variants" ] }, { "title": "Technical Changes", "list": [ "Added CDN url fallback system", "Font variants are a breaking change so the sources have been moved to a temporary dev branch" ] } ] }, "1.3.1": { "title": "1.3.1", "date": "2023-09-28", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Switch back to main branch" ] } ] }, "1.3.2": { "title": "1.3.2", "date": "2023-10-11", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Aspect ratio calculation fix" ] } ] }, "1.3.3": { "title": "1.3.3", "date": "2023-10-16", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed fonts that are flat" ] } ] }, "1.3.4": { "title": "1.3.4", "date": "2023-11-04", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Blockbench will now wait for Minecraft Title Generator to load before finishing loading" ] } ] }, "1.3.5": { "title": "1.3.5", "date": "2023-12-01", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Fonts can now list their available characters", "Font variants now have their own tab", "Added more info button on fonts", "Fonts can now have descriptions", "Increased max font list height" ] } ] }, "1.3.6": { "title": "1.3.6", "date": "2023-12-15", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Removed font \"width\" property" ] }, { "title": "Bug Fixes", "list": [ "Fixed debug mode thumbnails" ] } ] }, "1.4.0": { "title": "1.4.0", "date": "2024-02-21", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added \"Tileables\". Tileables are a texture type that tiles a texture over the faces of each character", "Added new render output Dialog with more customisation options" ] }, { "title": "Changes", "list": [ "Added required EULA agreement", "Added confirmation check for deleting presets", "Updated number sliders to use Blockbench numeric inputs", "Font and texture thumbnails now lazy load" ] }, { "title": "Bug Fixes", "list": [ "Fixed backup CDN for if a CDN goes down after you have opened Blockbench and used the plugin" ] } ] }, "1.4.1": { "title": "1.4.1", "date": "2024-02-26", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed ability to bypass EULA agreement" ] } ] }, "1.5.0": { "title": "1.5.0", "date": "2024-05-10", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Made the position camera button a main button with a new icon", "Render buttons now have tooltips" ] }, { "title": "Bug Fixes", "list": [ "Fixed render controls disappearing for some people", "Fixed render controls missing in Blockbench v4.10.0" ] } ] }, "1.5.1": { "title": "1.5.1", "date": "2024-06-02", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Added a class to the format page so it can be easily targetted by themes" ] }, { "title": "Bug Fixes", "list": [ "Fixed Vue.js warnings" ] } ] }, "1.6.0": { "title": "1.6.0", "date": "2024-06-09", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "The texture search bar can now be cleared with a button", "The texture search bar will now be automatically focused when switching tab", "Added the ability to remove the custom overlay texture" ] }, { "title": "Bug Fixes", "list": [ "Fixed resetting the font selection page", "Fixed resetting texture and overlay pages when a custom texture is loaded" ] } ] }, "1.6.1": { "title": "1.6.1", "date": "2024-07-14", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed selected items to use the select colour instead of the button colour" ] } ] }, "1.7.0": { "title": "1.7.0", "date": "2024-08-31", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Fonts now support setting a default character spacing" ] } ] }, "1.8.0": { "title": "1.8.0", "date": "2025-02-24", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Fonts now support character shifting. This adjusts the spacing between specific characters to improve readability by slightly modifying their positions when placed next to each other", "Fonts now support custom widths for the spaces between words", "Added the ability to disable the built-in overlay texture included with some fonts. These are normally only applied when using gradient or tileable textures" ] }, { "title": "Bug Fixes", "list": [ "Fixed built-in font overlay textures using the wrong blend method", "Fixed some settings possibly not loading properly when loading a preset" ] } ] }, "1.8.1": { "title": "1.8.1", "date": "2025-02-24", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed enabling line terminators causing a crash" ] } ] }, "1.9.0": { "title": "1.9.0", "date": "2025-03-08", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added \"Shapes\". Shapes are a new type of element that can be added, as an alternative to text/fonts", "\"Minecraft Title\" is now available as an angle from the \"Angles\" context menu" ] }, { "title": "Changes", "list": [ "Textures are now upscaled to the maximum size when enabling the fade edges to the border colour feature, in order to make a smoother gradient", "Fade edges to the border colour is now automatically selected when selecting the bottom text type", "Words with only one character will no longer contain a subgroup for that character", "Tileable texture resolution is now 1-4 instead of 1000-4000", "Improved the loading time of the plugin dialogs first load", "Redesigned the presets menu" ] }, { "title": "Bug Fixes", "list": [ "Fixed loading presets with font variants", "Fixed being unable to create presets when one already exists" ] } ] }, "1.9.1": { "title": "1.9.1", "date": "2025-03-08", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed presets not loading all settings properly" ] } ] }, "1.9.2": { "title": "1.9.2", "date": "2025-05-28", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed being unable to add new text when opening an existing Minecraft Title project" ] } ] }, "1.10.0": { "title": "1.10.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] } ] }, "1.10.1": { "title": "1.10.1", "date": "2025-10-15", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed custom textures failing to load" ] } ] }, "1.10.2": { "title": "1.10.2", "date": "2025-10-16", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed select menu styling" ] } ] }, "1.10.3": { "title": "1.10.3", "date": "2025-11-01", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Updated preset button styles to match the Blockbench 5.0 button design" ] }, { "title": "Bug Fixes", "list": [ "Fixed presets failing to load" ] } ] }, "1.10.4": { "title": "1.10.4", "date": "2026-04-18", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Made the repository branch easier to change in the code for testing purposes" ] }, { "title": "Bug Fixes", "list": [ "Fixed the \"Failed to load textures and fonts\" warning showing when the fallback URL loaded successfully" ] } ] } } ================================================ FILE: plugins/minecraft_title_generator/minecraft_title_generator.js ================================================ (async () => { const repo = "ewanhowell5195/MinecraftTitleGenerator" const branch = "main" const thumbnail = "data:image/webp;base64,UklGRlgAAABXRUJQVlA4TEsAAAAvX8AKEBcw//M///MfgAe2jSQp2iSPOr+nSXPHOng7ov8TUKa/ZLlkuWT5VVyOy1FKKXNFRBwtJ0mU3YktcTmu31JKKVPklPlPZXoA" const shapeThumbnail = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAsAQMAAAA+dijMAAAABlBMVEUAAAD///+l2Z/dAAAAE0lEQVQIW2NggAP7////DAcCDgA7eYDpLi6r7QAAAABJRU5ErkJggg==" const fonts = { "minecraft-ten": { name: "Minecraft Ten", type: "font", thumbnail, characters: {"0":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[0,5.4,0.448,7.4],"south":[0.448,5.4,0,7.4],"up":[0.448,5.4,0,4.3],"down":[0.448,8.5,0,7.4]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"1":[{"from":[-2,2,-3],"to":[18,42,19],"faces":{"north":[0.48,5.4,0.8,7.4],"south":[0.8,5.4,0.48,7.4],"up":[0.8,5.4,0.48,4.3],"down":[0.8,8.5,0.48,7.4]}},{"from":[12,44,21],"to":[-4,0,-5],"faces":{"north":[0.016,13.35,0,13.3],"east":[0.016,13.35,0,13.3],"south":[0.016,13.35,0,13.3],"west":[0.528,14.2,0.544,13.65],"up":[0.016,13.35,0,13.3],"down":[0.016,13.35,0,13.3]}},{"from":[20,40,21],"to":[12,28,-5],"faces":{"north":[0.016,13.35,0,13.3],"south":[0.016,13.35,0,13.3],"west":[0.016,13.35,0,13.3],"up":[0.016,13.35,0,13.3],"down":[0.016,13.35,0,13.3]}}],"2":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[0.832,5.4,1.28,7.4],"south":[1.28,5.4,0.832,7.4],"up":[1.28,5.4,0.832,4.3],"down":[1.28,8.5,0.832,7.4]}},{"from":[8,28,-5],"to":[24,32,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,12,-5],"to":[8,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.032,13.85,0,14.4],"east":[0.016,13.85,0.032,14.4],"south":[0,13.85,0.032,14.4],"west":[0,13.85,0.016,14.4],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"3":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[1.312,5.4,1.76,7.4],"south":[1.76,5.4,1.312,7.4],"up":[1.76,5.4,1.312,4.3],"down":[1.76,8.5,1.312,7.4]}},{"from":[8,28,-5],"to":[24,32,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[8,12,-5],"to":[24,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.08,13.3,0.048,13.85],"east":[0.016,13.3,0,13.35],"south":[0.048,13.3,0.08,13.85],"west":[0.064,13.3,0.048,13.85],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"4":[{"from":[-10,2,-3],"to":[26,42,19],"faces":{"north":[1.792,5.4,2.368,7.4],"south":[2.368,5.4,1.792,7.4],"up":[2.368,5.4,1.792,4.3],"down":[2.368,8.5,1.792,7.4]}},{"from":[-12,20,-5],"to":[-8,44,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-12,0,-5],"to":[-8,8,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[8,0,-5],"to":[28,8,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,20,-5],"to":[28,28,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,28,-5],"to":[24,36,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[16,36,-5],"to":[20,40,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[8,40,-5],"to":[16,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[28,44,21],"to":[-12,0,-5],"faces":{"north":[0.704,14.4,0.544,13.85],"east":[0.544,14.4,0.56,13.85],"south":[0.544,14.4,0.704,13.85],"west":[0.544,14.4,0.56,13.85],"up":[0.544,13.9,0.704,13.85],"down":[0.544,13.9,0.704,13.85]}}],"5":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[2.4,5.4,2.848,7.4],"south":[2.848,5.4,2.4,7.4],"up":[2.848,5.4,2.4,4.3],"down":[2.848,8.5,2.4,7.4]}},{"from":[8,12,-5],"to":[24,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,28,-5],"to":[8,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.85,0.032,14.4],"east":[0,13.85,0.016,14.4],"south":[0.032,13.85,0,14.4],"west":[0.016,13.85,0.032,14.4],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"6":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[2.88,5.4,3.328,7.4],"south":[3.328,5.4,2.88,7.4],"up":[3.328,5.4,2.88,4.3],"down":[3.328,8.5,2.88,7.4]}},{"from":[-8,28,-5],"to":[8,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.512,14.4,0.544,13.85],"east":[0.512,14.4,0.528,13.85],"south":[0.544,14.4,0.512,13.85],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"7":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[3.36,5.4,3.808,7.4],"south":[3.808,5.4,3.36,7.4],"up":[3.808,5.4,3.36,4.3],"down":[3.808,8.5,3.36,7.4]}},{"from":[0,0,-5],"to":[4,8,21],"faces":{"east":[0.016,13.3,0,13.35],"up":[0.016,13.3,0,13.35]}},{"from":[-4,8,-5],"to":[0,16,21],"faces":{"east":[0.016,13.3,0,13.35],"up":[0.016,13.3,0,13.35]}},{"from":[-8,16,-5],"to":[-4,24,21],"faces":{"east":[0.016,13.3,0,13.35],"up":[0.016,13.3,0,13.35]}},{"from":[8,28,-5],"to":[24,32,21],"faces":{"west":[0.016,13.3,0,13.35],"up":[0.016,13.3,0,13.35]}},{"from":[20,12,21],"to":[16,0,-5],"faces":{"west":[0.016,13.3,0,13.35],"down":[0.016,13.3,0,13.35]}},{"from":[16,20,21],"to":[12,12,-5],"faces":{"west":[0.016,13.3,0,13.35],"down":[0.016,13.3,0,13.35]}},{"from":[12,28,21],"to":[8,20,-5],"faces":{"west":[0.016,13.3,0,13.35],"down":[0.016,13.3,0,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.752,13.85,0.624,13.3],"east":[0.752,13.85,0.736,13.3],"south":[0.624,13.85,0.752,13.3],"west":[0.64,13.85,0.624,13.3],"up":[0.624,13.85,0.752,13.8],"down":[0.016,13.3,0,13.35]}}],"8":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[3.84,5.4,4.288,7.4],"south":[4.288,5.4,3.84,7.4],"up":[4.288,5.4,3.84,4.3],"down":[4.288,8.5,3.84,7.4]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"9":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[4.32,5.4,4.768,7.4],"south":[4.768,5.4,4.32,7.4],"up":[4.768,5.4,4.32,4.3],"down":[4.768,8.5,4.32,7.4]}},{"from":[8,12,-5],"to":[24,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.544,13.85,0.512,14.4],"east":[0,13.3,0.016,13.35],"south":[0.512,13.85,0.544,14.4],"west":[0.512,13.85,0.528,14.4],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"!":[{"from":[2,2,-3],"to":[14,42,19],"faces":{"north":[10.144,5.4,10.336,7.4],"south":[10.144,5.4,10.336,7.4],"up":[10.336,5.4,10.144,4.3],"down":[10.336,8.5,10.144,7.4]}},{"from":[16,44,21],"to":[0,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"#":[{"from":[-10,2,-3],"to":[26,42,19],"faces":{"north":[5.344,5.4,5.92,7.4],"south":[5.92,5.4,5.344,7.4],"up":[5.92,5.4,5.344,4.3],"down":[5.92,8.5,5.344,7.4]}},{"from":[28,36,21],"to":[24,24,-5],"faces":{"north":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[28,20,21],"to":[24,8,-5],"faces":{"north":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,20,21],"to":[-12,8,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,36,21],"to":[-12,24,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0.704,13.85,0.72,14.4],"south":[0,13.3,0.016,13.35],"west":[0.704,13.85,0.72,14.4],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"$":[{"from":[-6,-2,-3],"to":[22,42,19],"faces":{"north":[0.928,9.7,1.376,11.9],"south":[1.376,9.7,0.928,11.9],"up":[1.376,9.7,0.928,8.6],"down":[1.376,13.2,0.928,12.1]}},{"from":[24,38,21],"to":[-8,2,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0.016,13.3,0,13.35],"west":[0,13.3,0.016,13.35],"up":[1.232,14.3,1.488,14.35],"down":[1.232,14.3,1.488,14.35]}},{"from":[14,2,21],"to":[2,-4,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[14,44,21],"to":[2,38,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"%":[{"from":[-10,2,-3],"to":[26,42,19],"faces":{"north":[13.344,5.4,13.92,7.4],"south":[13.92,5.4,13.344,7.4],"up":[13.92,5.4,13.344,4.3],"down":[13.92,8.5,13.344,7.4]}},{"from":[20,16,-5],"to":[28,24,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[12,24,-5],"to":[28,28,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0.016,13.35,0.048,13.4]}},{"from":[4,36,-5],"to":[12,44,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[4,0,-5],"to":[12,8,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-12,16,-5],"to":[4,20,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0.048,13.35,0.016,13.4],"down":[0,13.3,0.016,13.35]}},{"from":[-12,20,-5],"to":[-4,28,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[28,44,21],"to":[-12,0,-5],"faces":{"north":[1.024,13.85,1.104,14.4],"east":[1.024,13.85,1.04,14.4],"south":[1.104,13.85,1.024,14.4],"west":[1.088,13.85,1.104,14.4],"up":[1.024,14.35,1.104,14.4],"down":[1.024,13.85,1.104,13.9]}}],"&":[{"from":[-8,2,-3],"to":[24,42,19],"faces":{"north":[4.8,5.4,5.312,7.4],"south":[5.312,5.4,4.8,7.4],"up":[5.312,5.4,4.8,4.3],"down":[5.312,8.5,4.8,7.4]}},{"from":[-6,24,-5],"to":[-2,28,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-6,24,21],"to":[-10,16,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-6,12,21],"to":[-10,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[26,44,21],"to":[-6,0,-5],"faces":{"north":[0.736,14.4,0.864,13.85],"east":[0.72,14.4,0.736,13.85],"south":[0.864,14.4,0.736,13.85],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"'":[{"from":[2,22,-3],"to":[14,42,19],"faces":{"north":[11.328,5.4,11.52,6.4],"south":[11.52,5.4,11.328,6.4],"up":[11.52,5.4,11.328,4.3],"down":[11.52,8.5,11.328,7.4]}},{"from":[12,20,-5],"to":[16,28,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[16,44,21],"to":[0,20,-5],"faces":{"north":[0.096,13.6,0.16,13.9],"east":[0,13.3,0.016,13.35],"south":[0.16,13.6,0.096,13.9],"west":[0.032,13.6,0.016,13.9],"up":[0.144,13.3,0.08,13.35],"down":[0,13.3,0.016,13.35]}}],"(":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[5.952,5.4,6.4,7.4],"south":[6.4,5.4,5.952,7.4],"up":[6.4,5.4,5.952,4.3],"down":[6.4,8.5,5.952,7.4]}},{"from":[16,36,-5],"to":[24,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,12,-5],"to":[0,20,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[16,0,-5],"to":[24,8,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-8,24,-5],"to":[0,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[0,20,-5],"to":[8,24,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.816,13.3,0.752,13.85],"east":[0.8,13.3,0.816,13.85],"south":[0.752,13.3,0.816,13.85],"west":[0.752,13.3,0.768,13.85],"up":[0.752,13.3,0.816,13.35],"down":[0.752,13.3,0.816,13.35]}}],")":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[6.432,5.4,6.88,7.4],"south":[6.88,5.4,6.432,7.4],"up":[6.88,5.4,6.432,4.3],"down":[6.88,8.5,6.432,7.4]}},{"from":[8,20,-5],"to":[16,24,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,36,-5],"to":[0,44,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[16,12,-5],"to":[24,20,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,0,-5],"to":[0,8,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[16,24,-5],"to":[24,32,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.752,13.3,0.816,13.85],"east":[0.752,13.3,0.768,13.85],"south":[0.816,13.3,0.752,13.85],"west":[0.8,13.3,0.816,13.85],"up":[0.816,13.3,0.752,13.35],"down":[0.816,13.3,0.752,13.35]}}],"+":[{"from":[-4,10,-3],"to":[20,34,19],"faces":{"north":[11.552,5.8,11.936,7],"south":[11.936,5.8,11.552,7],"up":[11.936,5.4,11.552,4.3],"down":[11.936,8.5,11.552,7.4]}},{"from":[14,28,-5],"to":[22,36,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-6,28,-5],"to":[2,36,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-6,8,-5],"to":[2,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[14,8,-5],"to":[22,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[22,36,21],"to":[-6,8,-5],"faces":{"north":[0.96,13.3,1.072,13.65],"east":[1.056,13.3,1.072,13.65],"south":[0.96,13.3,1.072,13.65],"west":[0.96,13.3,0.976,13.65],"up":[0.96,13.6,1.072,13.65],"down":[0.96,13.3,1.072,13.35]}}],",":[{"from":[2,-6,-3],"to":[14,14,19],"faces":{"north":[0,11.1,0.192,12.1],"south":[0.192,11.1,0,12.1],"up":[0.192,9.7,0,8.6],"down":[0.192,13.2,0,12.1]}},{"from":[12,-8,-5],"to":[16,0,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[16,16,21],"to":[0,-8,-5],"faces":{"north":[0.096,13.6,0.16,13.9],"east":[0,13.3,0.016,13.35],"south":[0.16,13.6,0.096,13.9],"west":[0.032,13.6,0.016,13.9],"up":[0.144,13.3,0.08,13.35],"down":[0,13.3,0.016,13.35]}}],"-":[{"from":[0,18,-3],"to":[16,26,19],"faces":{"north":[10.816,6.2,11.072,6.6],"south":[11.072,6.2,10.816,6.6],"up":[11.072,5.4,10.816,4.3],"down":[11.072,8.5,10.816,7.4]}},{"from":[18,28,21],"to":[-2,16,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],".":[{"from":[2,2,-3],"to":[14,14,19],"faces":{"north":[10.368,6.8,10.56,7.4],"south":[10.56,6.8,10.368,7.4],"up":[10.56,5.4,10.368,4.3],"down":[10.56,8.5,10.368,7.4]}},{"from":[16,16,21],"to":[0,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],";":[{"from":[16,36,21],"to":[0,20,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[2,-6,-3],"to":[14,34,19],"faces":{"north":[0.224,10.1,0.416,12.1],"south":[0.416,10.1,0.224,12.1],"up":[0.416,9.7,0.224,8.6],"down":[0.416,13.2,0.224,12.1]}},{"from":[12,-8,-5],"to":[16,0,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[16,16,21],"to":[0,-8,-5],"faces":{"north":[0.096,13.6,0.16,13.9],"east":[0,13.3,0.016,13.35],"south":[0.16,13.6,0.096,13.9],"west":[0.032,13.6,0.016,13.9],"up":[0.144,13.3,0.08,13.35],"down":[0,13.3,0.016,13.35]}}],"=":[{"from":[-4,10,-3],"to":[20,34,19],"faces":{"north":[11.968,5.8,12.352,7],"south":[12.352,5.8,11.968,7],"up":[12.352,5.4,11.968,4.3],"down":[12.352,8.5,11.968,7.4]}},{"from":[-6,20,-5],"to":[22,24,21],"faces":{"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[22,36,21],"to":[-6,8,-5],"faces":{"north":[0.736,13.9,0.752,14.25],"east":[0.736,13.9,0.752,14.25],"south":[0.736,13.9,0.752,14.25],"west":[0.736,13.9,0.752,14.25],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"@":[{"from":[-14,-6,-3],"to":[30,42,19],"faces":{"north":[1.408,9.7,2.112,12.1],"south":[2.112,9.7,1.408,12.1],"up":[2.112,9.7,1.408,8.6],"down":[2.112,13.2,1.408,12.1]}},{"from":[28,40,-5],"to":[32,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[0,30,-5],"to":[16,32,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[0,16,-5],"to":[4,18,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[28,-8,-5],"to":[32,-4,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-16,40,-5],"to":[-12,44,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[32,44,21],"to":[-16,4,-5],"faces":{"north":[1.68,14.3,1.296,13.3],"east":[1.68,14.3,1.664,13.3],"south":[1.296,14.3,1.68,13.3],"west":[1.312,14.3,1.296,13.3],"up":[1.632,14.3,1.44,14.35],"down":[1.68,13.35,1.296,13.3]}},{"from":[32,4,21],"to":[-4,-8,-5],"faces":{"north":[1.824,13.45,1.68,13.3],"east":[0,13.3,0.016,13.35],"south":[1.68,13.45,1.824,13.3],"west":[1.68,13.45,1.696,13.3],"up":[1.68,13.4,1.824,13.45]}}],"a":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[0.48,1.1,0.928,3.1],"south":[0.928,1.1,0.48,3.1],"up":[0.928,1.1,0.48,0],"down":[0.928,4.2,0.48,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"*":[{"from":[-4,18,-3],"to":[20,42,19],"faces":{"north":[14.304,5.4,14.688,6.6],"south":[14.688,5.4,14.304,6.6],"up":[14.688,5.4,14.304,4.3],"down":[14.688,8.5,14.304,7.4]}},{"from":[6,40,-5],"to":[10,44,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[6,16,-5],"to":[10,20,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[18,28,-5],"to":[22,32,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-6,28,-5],"to":[-2,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[22,44,21],"to":[-6,16,-5],"faces":{"north":[1.072,13.65,1.184,13.3],"east":[1.168,13.65,1.184,13.3],"south":[1.072,13.65,1.184,13.3],"west":[1.072,13.65,1.088,13.3],"up":[1.072,13.65,1.184,13.6],"down":[1.072,13.35,1.184,13.3]}}],"b":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[0.96,1.1,1.408,3.1],"south":[1.408,1.1,0.96,3.1],"up":[1.408,1.1,0.96,0],"down":[1.408,4.2,0.96,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"\\":[{"from":[-10,2,-3],"to":[26,42,19],"faces":{"north":[9.056,5.4,9.632,7.4],"south":[9.632,5.4,9.056,7.4],"up":[9.632,5.4,9.056,4.3],"down":[9.632,8.5,9.056,7.4]}},{"from":[4,36,-5],"to":[12,44,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-4,24,-5],"to":[4,36,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-12,16,-5],"to":[-4,24,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,20,-5],"to":[28,28,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[12,8,-5],"to":[20,20,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[4,0,-5],"to":[12,8,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[28,44,21],"to":[-12,0,-5],"faces":{"north":[0.96,13.85,0.88,14.4],"east":[0.944,13.85,0.96,14.4],"south":[0.88,13.85,0.96,14.4],"west":[0.88,13.85,0.896,14.4],"up":[0.88,13.85,0.96,13.9],"down":[0.88,14.35,0.96,14.4]}}],"c":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[1.44,1.1,1.888,3.1],"south":[1.888,1.1,1.44,3.1],"up":[1.888,1.1,1.44,0],"down":[1.888,4.2,1.44,3.1]}},{"from":[-8,12,-5],"to":[8,32,21],"faces":{"east":[0.016,13.3,0,13.35],"up":[0.016,13.3,0,13.35],"down":[0.016,13.3,0,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.032,13.3,0,13.85],"east":[0.032,13.3,0.016,13.85],"south":[0,13.3,0.032,13.85],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],":":[{"from":[16,36,21],"to":[0,20,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[2,2,-3],"to":[14,34,19],"faces":{"north":[10.592,5.8,10.784,7.4],"south":[10.784,5.8,10.592,7.4],"up":[10.784,5.4,10.592,4.3],"down":[10.784,8.5,10.592,7.4]}},{"from":[16,16,21],"to":[0,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"😳":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[0,1.1,0.448,3.1],"south":[0.448,1.1,0,3.1],"up":[0.448,1.1,0,0],"down":[0.448,4.2,0,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"d":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[1.92,1.1,2.368,3.1],"south":[2.368,1.1,1.92,3.1],"up":[2.368,1.1,1.92,0],"down":[2.368,4.2,1.92,3.1]}},{"from":[-4,40,21],"to":[-8,4,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-4,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0.032,13.3,0.048,13.85],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"e":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[2.4,1.1,2.848,3.1],"south":[2.848,1.1,2.4,3.1],"up":[2.848,1.1,2.4,0],"down":[2.848,4.2,2.4,3.1]}},{"from":[-8,28,-5],"to":[8,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,12,-5],"to":[8,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.048,13.3,0.08,13.85],"east":[0.064,13.3,0.048,13.85],"south":[0.08,13.3,0.048,13.85],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"┣":[{"from":[0,10,-3],"to":[16,34,19],"faces":{"north":[15.424,5.8,15.68,7],"south":[15.68,5.8,15.424,7],"up":[15.68,5.4,15.424,4.3],"down":[15.68,8.5,15.424,7.4]}},{"from":[-2,28,-5],"to":[6,36,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-2,8,-5],"to":[6,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[18,36,21],"to":[-2,8,-5],"faces":{"north":[0.96,13.3,1.04,13.65],"east":[1.056,13.3,1.072,13.65],"south":[0.992,13.3,1.072,13.65],"west":[0,13.3,0.016,13.35],"up":[0.992,13.6,1.072,13.65],"down":[0.992,13.3,1.072,13.35]}}],"f":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[2.88,1.1,3.328,3.1],"south":[3.328,1.1,2.88,3.1],"up":[3.328,1.1,2.88,0],"down":[3.328,4.2,2.88,3.1]}},{"from":[-8,28,-5],"to":[8,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,0,-5],"to":[8,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.096,13.85,0.064,13.3],"east":[0.096,13.85,0.08,13.3],"south":[0.064,13.85,0.096,13.3],"west":[0,13.3,0.016,13.35],"up":[0.016,13.35,0.048,13.4],"down":[0,13.3,0.016,13.35]}}],"/":[{"from":[-10,2,-3],"to":[26,42,19],"faces":{"north":[8.448,5.4,9.024,7.4],"south":[9.024,5.4,8.448,7.4],"up":[9.024,5.4,8.448,4.3],"down":[9.024,8.5,8.448,7.4]}},{"from":[20,16,-5],"to":[28,24,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[12,24,-5],"to":[20,36,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[4,36,-5],"to":[12,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[4,0,-5],"to":[12,8,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-4,8,-5],"to":[4,20,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-12,20,-5],"to":[-4,28,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[28,44,21],"to":[-12,0,-5],"faces":{"north":[0.88,13.85,0.96,14.4],"east":[0.88,13.85,0.896,14.4],"south":[0.96,13.85,0.88,14.4],"west":[0.944,13.85,0.96,14.4],"up":[0.88,14.35,0.96,14.4],"down":[0.88,13.85,0.96,13.9]}}],"g":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[3.36,1.1,3.808,3.1],"south":[3.808,1.1,3.36,3.1],"up":[3.808,1.1,3.36,0],"down":[3.808,4.2,3.36,3.1]}},{"from":[-8,28,-5],"to":[8,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.096,13.85,0.128,13.3],"east":[0.112,13.85,0.096,13.3],"south":[0.128,13.85,0.096,13.3],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],">":[{"from":[-6,8,-3],"to":[22,36,19],"faces":{"north":[12.864,5.7,13.312,7.1],"south":[13.312,5.7,12.864,7.1],"up":[13.312,5.4,12.864,4.3],"down":[13.312,8.5,12.864,7.4]}},{"from":[16,18,-5],"to":[24,26,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[0,34,-5],"to":[8,38,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,30,-5],"to":[0,34,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[0,6,-5],"to":[8,10,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-8,10,-5],"to":[0,14,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,38,21],"to":[-8,6,-5],"faces":{"north":[0.96,13.65,1.024,14.05],"east":[0.96,13.65,0.976,14.05],"south":[1.024,13.65,0.96,14.05],"west":[1.008,13.65,1.024,14.05],"up":[1.024,14,0.96,14.05],"down":[1.024,13.65,0.96,13.7]}}],"h":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[3.84,1.1,4.288,3.1],"south":[4.288,1.1,3.84,3.1],"up":[4.288,1.1,3.84,0],"down":[4.288,4.2,3.84,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"i":[{"from":[2,2,-3],"to":[14,42,19],"faces":{"north":[4.32,1.1,4.512,3.1],"south":[4.512,1.1,4.32,3.1],"up":[4.512,1.1,4.32,0],"down":[4.512,4.2,4.32,3.1]}},{"from":[16,44,21],"to":[0,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"j":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[4.544,1.1,4.992,3.1],"south":[4.992,1.1,4.544,3.1],"up":[4.992,1.1,4.544,0],"down":[4.992,4.2,4.544,3.1]}},{"from":[8,20,-5],"to":[24,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.112,13.85,0.144,13.3],"east":[0,13.3,0.016,13.35],"south":[0.144,13.85,0.112,13.3],"west":[0.128,13.85,0.144,13.3],"up":[0,13.3,0.016,13.35],"down":[0.032,13.35,0.064,13.4]}}],"k":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[5.024,1.1,5.472,3.1],"south":[5.472,1.1,5.024,3.1],"up":[5.472,1.1,5.024,0],"down":[5.472,4.2,5.024,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"l":[{"from":[-4,2,-3],"to":[20,42,19],"faces":{"north":[5.504,1.1,5.888,3.1],"south":[5.888,1.1,5.504,3.1],"up":[5.888,1.1,5.504,0],"down":[5.888,4.2,5.504,3.1]}},{"from":[-6,12,-5],"to":[6,44,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[22,44,21],"to":[-6,0,-5],"faces":{"north":[0.144,13.85,0.256,13.3],"east":[0.144,13.85,0.16,13.3],"south":[0.256,13.85,0.144,13.3],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0.256,13.3,0.144,13.35]}}],"<":[{"from":[-6,8,-3],"to":[22,36,19],"faces":{"north":[12.384,5.7,12.832,7.1],"south":[12.832,5.7,12.384,7.1],"up":[12.832,5.4,12.384,4.3],"down":[12.832,8.5,12.384,7.4]}},{"from":[-8,18,-5],"to":[0,26,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[8,34,-5],"to":[16,38,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[16,30,-5],"to":[24,34,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[8,6,-5],"to":[16,10,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[16,10,-5],"to":[24,14,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,38,21],"to":[-8,6,-5],"faces":{"north":[1.024,13.65,0.96,14.05],"east":[1.008,13.65,1.024,14.05],"south":[0.96,13.65,1.024,14.05],"west":[0.96,13.65,0.976,14.05],"up":[0.96,14,1.024,14.05],"down":[0.96,13.65,1.024,13.7]}}],"m":[{"from":[-12,2,-3],"to":[28,42,19],"faces":{"north":[5.92,1.1,6.56,3.1],"east":[0.032,13.4,0.048,13.3],"south":[6.56,1.1,5.92,3.1],"west":[0.032,13.4,0.048,13.3],"up":[6.56,1.1,5.92,0],"down":[6.56,4.2,5.92,3.1]}},{"from":[4,10,-3],"to":[12,10,19],"faces":{"down":[6.72,4.2,6.592,3.1]}},{"from":[2,36,-5],"to":[14,44,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"down":[0.016,13.35,0.064,13.4]}},{"from":[6,28,-5],"to":[10,36,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[2,0,-5],"to":[14,8,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[30,44,21],"to":[-14,0,-5],"faces":{"north":[0.192,13.85,0.368,13.3],"east":[0,13.3,0.016,13.35],"south":[0.192,13.85,0.368,13.3],"west":[0,13.3,0.016,13.35],"up":[0.192,13.3,0.368,13.35],"down":[0.192,13.3,0.368,13.35]}}],"n":[{"from":[-8,2,-3],"to":[24,42,19],"faces":{"north":[6.752,1.1,7.264,3.1],"south":[7.264,1.1,6.752,3.1],"up":[7.264,1.1,6.752,0],"down":[7.264,4.2,6.752,3.1]}},{"from":[6,36,-5],"to":[10,44,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[6,0,-5],"to":[10,10,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[26,44,21],"to":[-10,0,-5],"faces":{"north":[0.304,14.4,0.448,13.3],"east":[0,13.3,0.016,13.35],"south":[0.304,14.4,0.448,13.3],"west":[0,13.3,0.016,13.35],"up":[0.304,13.3,0.448,13.35],"down":[0.304,13.3,0.448,13.35]}}],"o":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[7.296,1.1,7.744,3.1],"south":[7.744,1.1,7.296,3.1],"up":[7.744,1.1,7.296,0],"down":[7.744,4.2,7.296,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"😩":[{"from":[2,22,-3],"to":[14,42,19],"faces":{"north":[11.104,5.4,11.296,6.4],"south":[11.296,5.4,11.104,6.4],"up":[11.296,5.4,11.104,4.3],"down":[11.296,8.5,11.104,7.4]}},{"from":[0,36,-5],"to":[4,44,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[16,44,21],"to":[0,20,-5],"faces":{"north":[0.16,13.9,0.096,13.6],"east":[0.032,13.9,0.016,13.6],"south":[0.096,13.9,0.16,13.6],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0.08,13.3,0.144,13.35]}}],"p":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[7.776,1.1,8.224,3.1],"south":[8.224,1.1,7.776,3.1],"up":[8.224,1.1,7.776,0],"down":[8.224,4.2,7.776,3.1]}},{"from":[-8,0,-5],"to":[8,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.288,14.4,0.32,13.85],"east":[0.288,14.4,0.304,13.85],"south":[0.32,14.4,0.288,13.85],"west":[0,13.3,0.016,13.35],"up":[0.016,13.35,0.048,13.4],"down":[0,13.3,0.016,13.35]}}],"q":[{"from":[-8,2,-3],"to":[24,42,19],"faces":{"north":[8.256,1.1,8.768,3.1],"south":[8.768,1.1,8.256,3.1],"up":[8.768,1.1,8.256,0],"down":[8.768,4.2,8.256,3.1]}},{"from":[-6,12,21],"to":[-10,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[26,44,21],"to":[-6,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0.368,14.3,0.384,13.75],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"?":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[9.664,5.4,10.112,7.4],"south":[10.112,5.4,9.664,7.4],"up":[10.112,5.4,9.664,4.3],"down":[10.112,8.5,9.664,7.4]}},{"from":[16,0,-5],"to":[24,28,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-8,0,-5],"to":[0,20,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.96,13.85,0.896,13.3],"east":[0.96,13.85,0.944,13.3],"south":[0.896,13.85,0.96,13.3],"west":[0.912,13.85,0.896,13.3],"up":[0.96,13.85,0.896,13.8],"down":[0,13.3,0.016,13.35]}}],"r":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[8.8,1.1,9.248,3.1],"south":[9.248,1.1,8.8,3.1],"up":[9.248,1.1,8.8,0],"down":[9.248,4.2,8.8,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"s":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[9.28,1.1,9.728,3.1],"south":[9.728,1.1,9.28,3.1],"up":[9.728,1.1,9.28,0],"down":[9.728,4.2,9.28,3.1]}},{"from":[8,12,-5],"to":[24,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,28,-5],"to":[8,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.85,0.032,14.4],"east":[0,13.85,0.016,14.4],"south":[0.032,13.85,0,14.4],"west":[0.016,13.85,0.032,14.4],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"┫":[{"from":[0,10,-3],"to":[16,34,19],"faces":{"north":[15.136,5.8,15.392,7],"south":[15.392,5.8,15.136,7],"up":[15.392,5.4,15.136,4.3],"down":[15.392,8.5,15.136,7.4]}},{"from":[10,28,-5],"to":[18,36,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[10,8,-5],"to":[18,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[18,36,21],"to":[-2,8,-5],"faces":{"north":[0.992,13.3,1.072,13.65],"east":[0,13.3,0.016,13.35],"south":[0.96,13.3,1.04,13.65],"west":[1.056,13.3,1.072,13.65],"up":[0.96,13.6,1.04,13.65],"down":[0.96,13.3,1.04,13.35]}}],"t":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[9.76,1.1,10.208,3.1],"south":[10.208,1.1,9.76,3.1],"up":[10.208,1.1,9.76,0],"down":[10.208,4.2,9.76,3.1]}},{"from":[16,0,-5],"to":[24,32,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-8,0,-5],"to":[0,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.032,14.4,0.096,13.85],"east":[0.032,14.4,0.048,13.85],"south":[0.032,14.4,0.096,13.85],"west":[0.032,14.4,0.048,13.85],"up":[0.032,14.4,0.096,14.35],"down":[0,13.3,0.016,13.35]}}],"u":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[10.24,1.1,10.688,3.1],"south":[10.688,1.1,10.24,3.1],"up":[10.688,1.1,10.24,0],"down":[10.688,4.2,10.24,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"v":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[10.72,1.1,11.168,3.1],"south":[11.168,1.1,10.72,3.1],"up":[11.168,1.1,10.72,0],"down":[11.168,4.2,10.72,3.1]}},{"from":[-8,8,-5],"to":[-4,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-4,0,-5],"to":[0,8,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[16,0,-5],"to":[20,8,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[20,8,-5],"to":[24,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.096,14.4,0.224,13.85],"east":[0.096,14.4,0.112,13.85],"south":[0.096,14.4,0.224,13.85],"west":[0.096,14.4,0.112,13.85],"up":[0.096,14.35,0.224,14.4],"down":[0,13.3,0.016,13.35]}}],"w":[{"from":[-12,2,-3],"to":[28,42,19],"faces":{"north":[11.2,1.1,11.84,3.1],"east":[0.032,13.3,0.048,13.4],"south":[11.84,1.1,11.2,3.1],"west":[0.032,13.3,0.048,13.4],"up":[11.84,1.1,11.2,0],"down":[11.84,4.2,11.2,3.1]}},{"from":[4,30,-3],"to":[12,30,19],"faces":{"up":[12,1.1,11.872,0]}},{"from":[2,32,-5],"to":[14,44,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[6,0,-5],"to":[10,12,21],"faces":{"east":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[26,0,-5],"to":[30,8,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-14,0,-5],"to":[-10,8,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[30,44,21],"to":[-14,0,-5],"faces":{"north":[0.448,13.85,0.624,13.3],"east":[0.448,13.85,0.464,13.3],"south":[0.448,13.85,0.624,13.3],"west":[0.448,13.85,0.464,13.3],"up":[0.448,13.85,0.624,13.8],"down":[0.448,13.35,0.624,13.3]}}],"x":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[12.032,1.1,12.48,3.1],"south":[12.48,1.1,12.032,3.1],"up":[12.48,1.1,12.032,0],"down":[12.48,4.2,12.032,3.1]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"y":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[12.512,1.1,12.96,3.1],"south":[12.96,1.1,12.512,3.1],"up":[12.96,1.1,12.512,0],"down":[12.96,4.2,12.512,3.1]}},{"from":[-8,0,-5],"to":[0,20,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[16,0,-5],"to":[24,20,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.224,14.4,0.288,13.85],"east":[0.224,14.4,0.24,13.85],"south":[0.224,14.4,0.288,13.85],"west":[0.224,14.4,0.24,13.85],"up":[0.224,14.35,0.288,14.4],"down":[0,13.3,0.016,13.35]}}],"z":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[12.992,1.1,13.44,3.1],"south":[13.44,1.1,12.992,3.1],"up":[13.44,1.1,12.992,0],"down":[13.44,4.2,12.992,3.1]}},{"from":[-8,12,-5],"to":[8,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0.048,13.35,0.016,13.4],"down":[0,13.3,0.016,13.35]}},{"from":[8,28,-5],"to":[24,32,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0.016,13.35,0.048,13.4]}},{"from":[16,24,-5],"to":[24,28,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,16,-5],"to":[0,20,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":[0.448,13.85,0.512,14.4],"east":[0.464,13.85,0.448,14.4],"south":[0.512,13.85,0.448,14.4],"west":[0.448,14.4,0.464,13.85],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"[":[{"from":[-2,2,-3],"to":[18,42,19],"faces":{"north":[6.912,5.4,7.232,7.4],"south":[7.232,5.4,6.912,7.4],"up":[7.232,5.4,6.912,4.3],"down":[7.232,8.5,6.912,7.4]}},{"from":[-4,12,-5],"to":[4,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,44,21],"to":[-4,0,-5],"faces":{"north":[0.88,13.85,0.832,14.4],"east":[0.016,13.3,0.032,13.85],"south":[0.832,13.85,0.88,14.4],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"]":[{"from":[-2,2,-3],"to":[18,42,19],"faces":{"north":[7.264,5.4,7.584,7.4],"south":[7.584,5.4,7.264,7.4],"up":[7.584,5.4,7.264,4.3],"down":[7.584,8.5,7.264,7.4]}},{"from":[12,12,-5],"to":[20,32,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,44,21],"to":[-4,0,-5],"faces":{"north":[0.832,13.85,0.88,14.4],"east":[0,13.3,0.016,13.35],"south":[0.88,13.85,0.832,14.4],"west":[0.016,13.3,0.032,13.85],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"^":[{"from":[-2,30,-3],"to":[18,42,19],"faces":{"north":[13.952,5.4,14.272,6],"south":[14.272,5.4,13.952,6],"up":[14.272,5.4,13.952,4.3],"down":[14.272,8.5,13.952,7.4]}},{"from":[16,40,-5],"to":[20,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-4,40,-5],"to":[0,44,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,44,21],"to":[-4,28,-5],"faces":{"north":[1.024,13.85,1.12,13.65],"east":[1.104,13.85,1.12,13.65],"south":[1.024,13.85,1.12,13.65],"west":[1.024,13.85,1.04,13.65],"up":[0,13.3,0.016,13.35],"down":[1.024,13.7,1.12,13.65]}}],"_":[{"from":[-6,-6,-3],"to":[22,2,19],"faces":{"north":[0.448,11.7,0.896,12.1],"south":[0.896,11.7,0.448,12.1],"up":[0.896,9.7,0.448,8.6],"down":[0.896,13.2,0.448,12.1]}},{"from":[24,4,21],"to":[-8,-8,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"{":[{"from":[-4,2,-3],"to":[20,42,19],"faces":{"north":[7.616,5.4,8,7.4],"south":[8,5.4,7.616,7.4],"up":[8,5.4,7.616,4.3],"down":[8,8.5,7.616,7.4]}},{"from":[-6,12,-5],"to":[2,20,21],"faces":{"east":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-6,24,-5],"to":[2,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[2,20,-5],"to":[6,24,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[22,28,21],"to":[18,16,-5],"faces":{"north":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[18,44,21],"to":[-6,0,-5],"faces":{"north":[0.8,13.3,0.896,13.85],"east":[0.8,13.3,0.816,13.85],"south":[0.896,13.3,0.8,13.85],"west":[0.528,13.5,0.544,14.05],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"}":[{"from":[-4,2,-3],"to":[20,42,19],"faces":{"north":[8.032,5.4,8.416,7.4],"south":[8.416,5.4,8.032,7.4],"up":[8.416,5.4,8.032,4.3],"down":[8.416,8.5,8.032,7.4]}},{"from":[14,12,-5],"to":[22,20,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[14,24,-5],"to":[22,32,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[10,20,-5],"to":[14,24,21],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-2,28,21],"to":[-6,16,-5],"rotation":{"angle":0,"axis":"y","origin":[16,0,0]},"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[22,44,21],"to":[-2,0,-5],"faces":{"north":[0.896,13.3,0.8,13.85],"east":[0.528,13.5,0.544,14.05],"south":[0.8,13.3,0.896,13.85],"west":[0.8,13.3,0.816,13.85],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}}],"~":[{"from":[-4,30,-3],"to":[20,42,19],"faces":{"north":[14.72,5.4,15.104,6],"south":[15.104,5.4,14.72,6],"up":[15.104,5.4,14.72,4.3],"down":[15.104,8.5,14.72,7.4]}},{"from":[18,40,-5],"to":[22,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-6,28,-5],"to":[-2,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[22,44,21],"to":[-6,28,-5],"faces":{"north":[1.68,13.45,1.792,13.65],"east":[1.776,13.65,1.792,13.45],"south":[1.68,13.45,1.792,13.65],"west":[1.68,13.65,1.696,13.45],"up":[1.68,13.65,1.792,13.6],"down":[1.68,13.5,1.792,13.45]}}],"£":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[13.472,1.1,13.92,3.1],"south":[13.92,1.1,13.472,3.1],"up":[13.92,1.1,13.472,0],"down":[13.92,4.2,13.472,3.1]}},{"from":[16,40,-5],"to":[20,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,28,-5],"to":[24,40,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,12,-5],"to":[24,16,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-4,28,-5],"to":[4,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-4,12,-5],"to":[4,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-4,12,21],"to":[-8,0,-5],"faces":{"north":[0,13.3,0.016,13.35],"east":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,44,21],"to":[-4,0,-5],"faces":{"north":[1.216,14.4,1.104,13.85],"east":[0.08,13.85,0.096,13.3],"south":[1.104,14.4,1.216,13.85],"west":[1.104,14.4,1.12,13.85],"up":[0,13.3,0.016,13.35],"down":[1.104,13.9,1.216,13.85]}}],"€":[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":[13.952,1.1,14.4,3.1],"south":[14.4,1.1,13.952,3.1],"up":[14.4,1.1,13.952,0],"down":[14.4,4.2,13.952,3.1]}},{"from":[16,40,-5],"to":[20,44,21],"faces":{"west":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[16,0,-5],"to":[20,4,21],"faces":{"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35]}},{"from":[-8,28,-5],"to":[4,32,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[-8,12,-5],"to":[4,16,21],"faces":{"east":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[24,28,21],"to":[20,16,-5],"faces":{"north":[0,13.3,0.016,13.35],"south":[0,13.3,0.016,13.35],"west":[0,13.3,0.016,13.35],"up":[0,13.3,0.016,13.35],"down":[0,13.3,0.016,13.35]}},{"from":[20,44,21],"to":[-8,0,-5],"faces":{"north":[1.296,13.85,1.184,13.3],"east":[1.28,13.85,1.296,13.3],"south":[1.184,13.85,1.296,13.3],"west":[1.216,14.4,1.232,13.85],"up":[1.184,13.85,1.296,13.8],"down":[1.184,13.35,1.296,13.3]}}]}, textures: { flat: { name: "Flat", thumbnail, texture: "data:image/png;base64,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" } }, overlays: { none: { name: "None", thumbnail: "data:image/webp;base64,UklGRlgAAABXRUJQVlA4TEsAAAAvX8AKEBcw//M//wMUgAe2jSQp2iSPOr+nSXPHOng7ov8TUKa/ZLlkuWT5VVyOy1FKKXNFRBwtJ0mU3YktcTmu31JKKVPklPlPZXoA" } }, faces: [ [22, 62], [108, 148], [194, 194, 234, 242] ], ends: [ [0, 22, 62, 84], [86, 108, 148, 170], [172, 194, 242, 264] ], height: 44, border: 266, terminatorSpace: true, shifts: { "//": 16, "\\\\": 16, "tj": 8, "lt": 8, "ly": 8, "yj": 6, "lv": 4, "qt": 4, "qv": 4, "{{": 4, "}}": 4, "}]": 4, "[{": 4, "l?": 4, "q?": 4, "t.": 4, "t,": 4, "t_": 4, "t-": 4, "-t": 4, "l-": 8, "/j": 8, "l\\": 8 } }, "minecraft-ten-blank": { name: "Minecraft Ten (Blank)", type: "shape", thumbnail: shapeThumbnail, characters: {a:[{"from":[-6,2,-3],"to":[22,42,19],"faces":{"north":{"uv":[0,4,16,11.27273]},"south":{"uv":[16,4,0,11.27273]},"up":{"uv":[16,4,0,0]},"down":{"uv":[16,15.27273,0,11.27273]}},"parsed":true},{"from":[24,44,21],"to":[-8,0,-5],"faces":{"north":{"uv":[0,15.63636,0.57143,15.81818]},"east":{"uv":[0,15.63636,0.57143,15.81818]},"south":{"uv":[0,15.63636,0.57143,15.81818]},"west":{"uv":[0,15.63636,0.57143,15.81818]},"up":{"uv":[0,15.63636,0.57143,15.81818]},"down":{"uv":[0,15.63636,0.57143,15.81818]}},"parsed":true}]}, textures: { flat: { name: "Flat", thumbnail: shapeThumbnail, texture: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAABYBAMAAAAU6ordAAAAD1BMVEUAAAAAAABUVFSwsLD///9xh7SGAAAAAXRSTlMAQObYZgAAACRJREFUOE9jMEYBDKNcsrkuKGCUO8qlDlcJBYxyyefiBwL4JAHoO/sVx1YEjAAAAABJRU5ErkJggg==" } }, overlays: { none: { name: "None", thumbnail: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAsAQMAAAA+dijMAAAABlBMVEUAAABMTEz/QcDZAAAAAnRSTlNNTTspwV0AAAATSURBVAhbY2CAA/v///8MBwIOADt5gOkuLqvtAAAAAElFTkSuQmCC" } }, faces: [ [22, 62] ], ends: [ [0, 22, 62, 84] ], height: 44, border: 86, textureWidth: 28, textureHeight: 88 } } const fontData = [] let tileables = { cobblestone: { texture: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEW1tbWmpqaIh4hubW1hYWFSUlLm8qFQAAAAcUlEQVR42gVAARGDMAz8MAMjh4CSLwIWIgDSIGAD/1p2iPk5pTfFOW3QLR3nGrrGQxSLTL1wp2TJ3PF6W/yaOjSV9eEB2y3a4omQPSerG4f6biMXkP0a8X2DMdpytQkuIWuY49CuziJmclhoIcsjUvgH41gVHD61kt4AAAAASUVORK5CYII=" } } const connection = { roots: [ `https://raw.githubusercontent.com/${repo}/${branch}`, `https://cdn.jsdelivr.net/gh/${repo}@${branch}` ], rootIndex: 0 } let root = connection.roots[0] const api = "https://api.wynem.com" let format, action, action2, dialog, mode, styles, preview, debug, controls const id = "minecraft_title_generator" const name = "Minecraft Title Generator" const icon = "text_fields" const description = "Create Minecraft-styled title models!" const links = { website: { text: "By Ewan Howell", link: "https://ewanhowell.com/", icon: "language", colour: "#33E38E" }, discord: { text: "Discord Server", link: "https://discord.ewanhowell.com/", icon: "fab.fa-discord", colour: "#727FFF" }, github: { text: "Submit Textures and Fonts", link: `https://github.com/${repo}/`, icon: "fab.fa-github", colour: "#6E40C9" }, tutorial: { text: "Tutorial", link: "https://youtu.be/iGaufrACVj4", icon: "fab.fa-youtube", colour: "#FF4444" } } const stopConfigs = [ [0.5], [0.4, 0.8], [1/3, 2/3], [0.3, 0.6, 0.8], [0.2, 0.6], [0.2, 0.5, 0.8], [0.2, 0.4, 0.7], [0.2, 0.4, 0.6, 0.8] ] const titleCameraAngle = { name: "Minecraft Title", id: "minecraft-title", position: [0, -170, -320], target: [0, 0, 0], default: true } const stats = [] const variables = { main: [ { font: Object.keys(fonts)[0], baseFont: Object.keys(fonts)[0], fontVariant: null, fontTab: "fonts", type: "top", row: 0 }, { texture: Object.keys(fonts["minecraft-ten"].textures)[0], variant: null, tileable: Object.keys(tileables)[0], tileableVariant: null, smoothGradient: true, gradientColour0: "#FFCF76", gradientColour1: "#FFA3A3", gradientColour2: "#F4C1A4", gradientColour3: "#E19A3E", gradientColour4: "#DA371E", gradientColour1Enabled: false, gradientColour2Enabled: false, gradientColour3Enabled: false, customTextureType: "texture", textureSource: "premade", customTexture: null }, {}, { terminators: false }, { characterSpacing: 0, rowSpacing: 0, scaleX: 1, scaleY: 1, scaleZ: 1, disableCharacterShifting: false } ], texture: [ {}, {}, { overlay: Object.keys(fonts["minecraft-ten"].overlays)[0], overlayBlend: "overlay", overlayColourBlend: "multiply", overlayColour: "#fff", overlayOpacity: 100, overlaySource: "premade", customOverlay: null }, { tileableScale: 2, tileableXOffset: 0, tileableYOffset: 0, tileableRandomRotations: false, tileableRandomMirroring: false, tileableTextureResolution: 1, disableFontOverlay: false, hue: 0, saturation: 100, brightness: 100, contrast: 100, blend: "multiply", customBorder: false, customEdge: false, colourOpacity: 100, colour: "#fff", customBorderColour: "#000", customEdgeColour: "#000", edgeBrightness: 35, fadeToBorder: false } ] } let initialLoaded const initialLoad = new Promise(fulfil => { initialLoaded = fulfil }) Plugin.register(id, { title: name, icon: "icon.png", author: "Ewan Howell", description, tags: ["Minecraft", "Title", "Logo"], version: "1.10.4", min_version: "5.0.0", variant: "both", creation_date: "2023-06-10", await_loading: true, contributes: { formats: ["minectaft_title"] }, has_changelog: true, website: "https://ewanhowell.com/plugins/minecraft-title-generator/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/minecraft-title-generator", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Minecraft Title Generator]", async onload() { styles = Blockbench.addCSS(` .minecraft-title-list { display: flex; max-height: 384px; flex-wrap: wrap; gap: 10px; overflow-x: hidden; } .minecraft-title-list.small { max-height: 256px; } .minecraft-title-item { display: flex; flex-direction: column; gap: 5px; padding: 10px 10px 5px; background-color: var(--color-back); align-items: center; cursor: pointer; flex: 1; position: relative; min-width: 150px; } .minecraft-title-item:hover { background-color: var(--color-button); } .minecraft-title-item > img { max-width: 100px; height: 50px; display: flex; object-fit: contain; } .minecraft-title-item > div:first-child { flex: 1; display: flex; align-items: center; margin-bottom: 5px; } .minecraft-title-item > div:nth-child(2) { text-align: center; flex: 1; display: flex; align-items: center; max-height: 24px; min-height: 24px; line-height: 16px; margin: -2px 0 2px; } .minecraft-title-item.selected { outline: 2px solid var(--color-accent); background-color: var(--color-selected); outline-offset: -2px; } .minecraft-title-item-has-variants { display: flex; position: absolute; bottom: 4px; right: 4px; z-index: 1; } .minecraft-title-links { display: flex; justify-content: space-around; margin: 20px 40px 0; } .minecraft-title-links > a { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 5px; text-decoration: none; flex-grow: 1; flex-basis: 0; color: var(--color-subtle_text); text-align: center; } .minecraft-title-links > a:hover { background-color: var(--color-accent); color: var(--color-light); } .minecraft-title-links > a > i { font-size: 32px; width: 100%; max-width: initial; height: 32px; text-align: center; } .minecraft-title-links > a:hover > i { color: var(--color-light) !important; } .minecraft-title-links > a > p { flex: 1; display: flex; align-items: center; } .spacer, #minecraft_title_generator .sp-preview, #minecraft_title_generator .form_inline_select > li { flex: 1; } #minecraft_title_generator .form_inline_select > li { border-radius: 0; } #minecraft_title_generator .form_inline_select > li:first-child { border-radius: 5px 0 0 5px; } #minecraft_title_generator .form_inline_select > li:last-child { border-radius: 0 5px 5px 0; } #minecraft_title_generator .form_inline_select > .disabled { cursor: not-allowed; color: inherit !important; text-decoration: line-through; opacity: 0.5; } .minecraft-title-item-buttons > i:hover, #minecraft-title-preview-container > i:hover, .minecraft-title-button:hover, #minecraft-title-custom-texture > i:hover, #minecraft-title-custom-overlay > i:hover, .text-input-row > i:hover, .minecraft-title-button:hover > svg { color: var(--color-light); } .minecraft-title-preset > *, .minecraft-title-item *, .text-input-row > i:hover, #minecraft-title-render-button-row *, .minecraft-title-links * { cursor: pointer; } #format_page_minecraft_title { padding-bottom: 0; } #format_page_minecraft_title .format_target { margin-bottom: 6px; } #format_page_minecraft_title div:nth-child(3), #format_page_minecraft_title content { overflow-y: auto; } body.minecraft-title-generator .config_dialog .form_bar_shading { display: none; } `) let shadeState settings.shading.condition = () => Project.format?.id !== format.id format = new ModelFormat({ id: "minecraft_title", name: "Minecraft Title", icon, category: "minecraft", target: ["Minecraft"], render_sides: "front", model_identifier: false, rotate_cubes: true, uv_rotation: true, bone_rig: true, centered_grid: true, per_texture_uv_size: true, onSetup: loadRenderAngle, new() { newProject(this) dialog.show() }, onActivation() { shadeState = settings.shading.value document.body.classList.add("minecraft-title-generator") settings.shading.set(false) }, onDeactivation() { settings.shading.set(shadeState) document.body.classList.remove("minecraft-title-generator") dialog.close() }, format_page: { component: { methods: { create: () => format.new() }, template: `

    ${description}

    Target : Logos Renders Thumbnails

    Good to know:

    • This format is designed to create Minecraft-styled title models.
    • New text can be added with the Add Minecraft Title Text button text_fields.
    • There are automatic presets for text positions and text angles, so make sure to check out all of the text options!
    • To render your title, you can use the Render mode found at the top right.
    • The camera can be automatically positioned in the render mode using the Position camera button auto_mode.

    ` } } }) mode = new Mode("minecraft_title_render", { name: "Render", category: "navigate", condition: { formats: [format.id] }, hide_toolbars: true, hide_status_bar: true, onSelect() { three_grid.visible = false const pivot = Canvas.scene.getObjectByName("pivot_marker") if (pivot) pivot.visible = false setTimeout(selectHandler, 0) }, onUnselect() { three_grid.visible = true const pivot = Canvas.scene.getObjectByName("pivot_marker") if (pivot) pivot.visible = true Canvas.scene.traverse(e => { if (e.type === "Line") e.visible = true }) } }) action = new Action("minecraft_title_add_text", { name: "Add Minecraft Title Text", icon, condition: () => Project.format === format, async click() { if (dialog.content_vue) { dialog.content_vue.switchToFonts() dialog.show() } else { dialog.show() await initialLoad dialog.content_vue.switchToFonts() } } }) action2 = new Action("minecraft_title_add_shape", { name: "Add Minecraft Title Shape", icon: "interests", condition: () => Project.format === format, async click() { if (dialog.content_vue) { dialog.content_vue.switchToShapes() dialog.show() } else { dialog.show() await initialLoad dialog.content_vue.switchToShapes() } } }) Toolbars.outliner.add(action2, 0) Toolbars.outliner.add(action, 0) MenuBar.menus.edit.addAction(action2, 5) MenuBar.menus.edit.addAction(action, 5) Interface.Panels.outliner.menu.addAction(action2, 0) Interface.Panels.outliner.menu.addAction(action, 0) controls = document.createElement("div") controls.id = "minecraft-title-render-controls-container" document.getElementById("center").append(controls) const controlsStyles = document.createElement("style") controlsStyles.innerHTML = ` #minecraft-title-render-controls { position: absolute; bottom: 50px; left: 50%; transform: translateX(-50%); background-color: var(--color-ui); flex-direction: column; box-shadow: 0 5px 10px #0006; align-items: center; gap: 10px; padding: 10px; display: none; z-index: 1; border-radius: 6px; } body[mode="minecraft_title_render"] { #minecraft-title-render-controls { display: flex; } #center { margin-bottom: calc(4px - var(--toolbar-height)); } } .minecraft-title-render-controls-row { display: flex; gap: 20px; align-items: center; } #minecraft-title-render-buttons { display: flex; gap: 10px; justify-content: center; > div { padding: 5px 30px; cursor: pointer; width: initial; height: initial; position: relative; &::before { content: ""; position: absolute; inset: 0; background-color: var(--color-error); border-radius: 8px; z-index: -1; transition: filter .15s; } &:first-child::before { background-color: var(--color-accent); } &:hover::before { filter: brightness(1.25) hue-rotate(5deg); } &.disabled { cursor: not-allowed; &::before { background-color: var(--color-button); filter: initial !important; } } > i { color: var(--color-light); padding: 0; } .tooltip { transform: translate(calc(11px - 50%), 10px) } } } #minecraft-title-render-resolutions { display: flex; background-color: var(--color-button); padding: 4px; border-radius: 4px; } .minecraft-title-render-resolution { width: 32px; height: 32px; cursor: pointer; border-radius: 4px; > i { font-size: 32px; max-width: 32px; } > svg { fill: var(--color-text); } &.selected { background-color: var(--color-accent); color: var(--color-accent_text); > svg { fill: var(--color-accent_text); } } } ` controls.append(controlsStyles) const vue = document.createElement("div") controls.append(vue) new Vue({ methods: { render() { if (Preview.selected.camera instanceof THREE.OrthographicCamera) return Blockbench.showMessageBox({ title: "Orthographic not supported", message: "Orthographic perspectives are not supported for render mode.\n\nIf you wish to render with an orthographic perspective, use the built-in Blockbench screenshot options.", buttons: ["Disable orthographic perspective", "dialog.close"], width: 500 }, async button => { if (button === 0) Preview.selected.setProjectionMode(false) }) if (this.rendering) return this.rendering = true const args = this const dialog = new Dialog({ id: "minecraft_title_render_result", title: "Rendering…", buttons: [], lines: [``], component: { data: { rendering: true, image: null, dimensions: null, size: null, canvas: null, tab: "normal", resolutionWidth: 1920, resolutionHeight: 1080, aspectWidth: 16, aspectHeight: 9, lastChanged: "width", linked: true, minecraftMode: "1.20", minecraftModes: { "1.20": "1.20+ Title Texture", "1.19": "1.19- Title Texture", mojang: "Mojang Studios Texture" }, backgroundColour: "#78b8ff", backgroundColour2: "#c7ecff", backgroundColourEnabled: false, backgroundColour2Enabled: false, updating: false, tabToUpdate: false, padding: 0 }, mounted() { $(this.$refs.backgroundColour).spectrum(this.colourInput("backgroundColour")), $(this.$refs.backgroundColour2).spectrum(this.colourInput("backgroundColour2")) }, methods: { async copy() { const r = await fetch(this.canvas.toDataURL()) navigator.clipboard.write([new ClipboardItem({ "image/png": await r.blob() })]) Blockbench.showQuickMessage("Copied to clipboard") }, save() { Blockbench.export({ extensions: ["png"], type: tl("data.image"), savetype: "image", name: Project.name || "minecraft_title", content: this.canvas.toDataURL() }, () => Blockbench.showQuickMessage("Saved title")) }, async tabChange(tab) { this.tab = tab let canvas, ctx if (tab === "normal") { ({ canvas, ctx } = new CanvasFrame(this.image.width, this.image.height)) ctx.drawImage(this.image, 0, 0) } else if (tab === "square") { const max = Math.max(this.image.width, this.image.height); ({ canvas, ctx } = new CanvasFrame(max, max)) ctx.drawImage(this.image, Math.floor(max / 2 - this.image.width / 2), Math.floor(max / 2 - this.image.height / 2)) } else if (tab === "custom") { ({ canvas, ctx } = new CanvasFrame(this.resolutionWidth, this.resolutionHeight)) const aspect = this.image.width / this.image.height const ratio = Math.min(canvas.width / this.image.width, canvas.height / this.image.height) const w = Math.floor(this.image.width * ratio) const h = Math.floor(this.image.height * ratio) ctx.drawImage(this.image, Math.floor(canvas.width / 2 - w / 2), Math.floor(canvas.height / 2 - h / 2), w, h) } else if (tab === "minecraft") { const aspect = this.image.width / this.image.height let w, h if (this.image.width > 1024 || this.image.height > 1024) { if (aspect > 1) { w = 1024 h = Math.floor(1024 / aspect) } else { h = 1024 w = Math.floor(1024 * aspect) } } else { w = this.image.width h = this.image.height } const capped = new CanvasFrame(w, h) if (this.image.width < 64 || this.image.height < 64) capped.ctx.imageSmoothingEnabled = false capped.ctx.drawImage(this.image, 0, 0, w, h) capped.autoCrop() if (this.minecraftMode === "1.20") { ({ canvas, ctx } = new CanvasFrame(1024, 256)) const scaleFactor = Math.min(1024 / capped.width, 176 / capped.height) const newWidth = capped.width * scaleFactor const newHeight = capped.height * scaleFactor const x = (1024 - newWidth) / 2 const y = (176 - newHeight) / 2 if (newWidth > capped.width) ctx.imageSmoothingEnabled = false ctx.drawImage(capped.canvas, x, y, newWidth, newHeight) } else if (this.minecraftMode === "1.19") { const base = await loadImage("data:image/png;base64,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") let preCanvas if (capped.width / capped.height < 137 / 22) { preCanvas = new CanvasFrame(Math.floor((capped.height / 22) * 137), capped.height) preCanvas.ctx.drawImage(capped.canvas, Math.floor((preCanvas.width - capped.width) / 2), 0) } else if (capped.width / capped.height > 137 / 22) { preCanvas = new CanvasFrame(capped.width, Math.floor((capped.width / 137) * 22)) preCanvas.ctx.drawImage(capped.canvas, 0, Math.floor((preCanvas.height - capped.height) / 2)) } else preCanvas = capped; ({ canvas, ctx } = new CanvasFrame(Math.floor((preCanvas.width / 137) * 128), Math.floor((preCanvas.width / 137) * 128), true, 1024)) ctx.imageSmoothingEnabled = false ctx.drawImage(base, 0, 0, canvas.width, canvas.height) const width = Math.floor((preCanvas.width / 274) * 155) ctx.drawImage(preCanvas.canvas, 0, 0, width, preCanvas.height, 0, 0, width, preCanvas.height) ctx.drawImage(preCanvas.canvas, width, 0, preCanvas.width - width, preCanvas.height, 0, Math.floor(preCanvas.height / 44 * 45), preCanvas.width - width, preCanvas.height) } else if (this.minecraftMode === "mojang") { let preCanvas if (capped.width < capped.height * 4) { preCanvas = new CanvasFrame(capped.height * 4 + 8, capped.height + 2) preCanvas.ctx.drawImage(capped.canvas, Math.floor((capped.height * 4 - capped.width) / 2) + 4, 1) } else if (capped.width > capped.height * 4) { preCanvas = new CanvasFrame(capped.width + 8, Math.floor(capped.width / 4) + 2) preCanvas.ctx.drawImage(capped.canvas, 4, Math.floor((preCanvas.height - capped.height) / 2)) } else { preCanvas = new CanvasFrame(capped.width + 8, capped.height + 4) preCanvas.ctx.drawImage(capped.canvas, 4, 1) } ({ canvas, ctx } = new CanvasFrame(Math.floor(preCanvas.width / 2), Math.floor(preCanvas.width / 2))) ctx.drawImage(preCanvas.canvas, 0, 0) ctx.drawImage(preCanvas.canvas, Math.floor(-preCanvas.width / 2), Math.floor(preCanvas.width / 4)) } } const padding = tab === "minecraft" ? 0 : this.padding this.canvas.width = canvas.width + padding * 2 this.canvas.height = canvas.height + padding * 2 if (this.tab !== "minecraft" && this.backgroundColourEnabled) { if (this.backgroundColour2Enabled) { const gradient = this.ctx.createLinearGradient(0, 0, 0, this.canvas.height) gradient.addColorStop(0, this.backgroundColour) gradient.addColorStop(1, this.backgroundColour2) this.ctx.fillStyle = gradient } else { this.ctx.fillStyle = this.backgroundColour } this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height) } this.ctx.drawImage(canvas, padding, padding) const size = this.canvas.toDataURL().slice(22).length * 0.75 this.dimensions = `${this.canvas.width} x ${this.canvas.height}` this.size = `${size > 1048576 ? `${Math.roundTo(size / 1048576, 2)} MB` : `${Math.round(size / 1024)} KB`}` }, changeResolution(changed) { this.lastChanged = changed if (this.linked) { if (changed === "width") { this.resolutionHeight = Math.max(1, Math.floor((this.resolutionWidth * this.aspectHeight) / this.aspectWidth)) } else { this.resolutionWidth = Math.max(1, Math.floor((this.resolutionHeight * this.aspectWidth) / this.aspectHeight)) } if (this.resolutionWidth > 4096 || this.resolutionHeight > 4096) { const aspect = this.resolutionWidth / this.resolutionHeight if (aspect > 1) { this.resolutionWidth = 4096 this.resolutionHeight = Math.floor(4096 / aspect) } else { this.resolutionHeight = 4096 this.resolutionWidth = Math.floor(4096 * aspect) } } } else { this.resolutionWidth = Math.max(1, parseInt(this.resolutionWidth)) this.resolutionHeight = Math.max(1, parseInt(this.resolutionHeight)) const [aW, aH] = getAspectRatio(this.resolutionWidth, this.resolutionHeight) this.aspectWidth = aW this.aspectHeight = aH } this.update("custom") }, changeAspect() { this.aspectWidth = Math.max(1, parseInt(this.aspectWidth)) this.aspectHeight = Math.max(1, parseInt(this.aspectHeight)) const [w, h] = getFromAspect(this.aspectWidth, this.aspectHeight, this.resolutionWidth, this.resolutionHeight, this.lastChanged === "width") this.resolutionWidth = w this.resolutionHeight = h this.update("custom") }, colourInput: v => ({ preferredFormat: "hex", color: dialog.component.data[v], showAlpha: false, showInput: true, move: c => dialog.content_vue.updateColour(v, c), change: c => dialog.content_vue.updateColour(v, c), hide: c => dialog.content_vue.updateColour(v, c) }), updateColour(v, c) { this[v] = c.toHexString() this.update(this.tab) }, async update(tab) { if (this.updating) { this.tabToUpdate = tab return } this.updating = true await this.tabChange(tab) this.updating = false if (this.tabToUpdate) { this.update(this.tabToUpdate) this.tabToUpdate = false } } }, template: `

    Rendering…

    • Normal
    • Square
    • Custom
    • Minecraft
    Resolution:
    Link width and height
    Aspect Ratio:
    :
    Background Colour:
    Second Background Colour:
    Padding:
    Texture mode:
    {{ dimensions }}
    {{ size }}
    ` }, onOpen() { setTimeout(() => Canvas.withoutGizmos(() => { let minX = Infinity let maxX = -Infinity let minY = Infinity let maxY = -Infinity const direction = Preview.selected.controls.target.clone().sub(Preview.selected.camera.position).normalize() Canvas.scene.traverseVisible(cube => { if (cube.type === "cube") { for (let i = 0; i < 72; i += 3) { const vertex = new THREE.Vector3(...cube.geometry.attributes.position.array.slice(i, i + 3)) if (direction.dot(vertex.clone().sub(Preview.selected.camera.position).normalize()) <= 0) continue const vec = vertex.applyMatrix4(cube.matrixWorld).project(Preview.selected.camera) const x = (vec.x + 1) / 2 const y = (-vec.y + 1) / 2 minX = Math.min(minX, x) maxX = Math.max(maxX, x) minY = Math.min(minY, y) maxY = Math.max(maxY, y) } } }) if (minX === Infinity) { dialog.close() Blockbench.showQuickMessage("Nothing in frame") args.rendering = false return } minX = Math.max(minX, 0) maxX = Math.min(maxX, 1) minY = Math.max(minY, 0) maxY = Math.min(maxY, 1) if (minX === maxX || minY === maxY) { dialog.close() Blockbench.showQuickMessage("Nothing in frame") args.rendering = false return } const aspect = (maxX - minX) / ((maxY - minY) * Preview.selected.height / Preview.selected.width) let outWidth, outHeight const resolution = args.antialias ? Math.min(args.resolution * 2, 4096) : args.resolution if (aspect > 1) { outWidth = resolution outHeight = resolution / aspect } else { outWidth = resolution * aspect outHeight = resolution } preview.resize(outWidth, outHeight) preview.controls.target.copy(Preview.selected.controls.target) preview.camera.position.copy(Preview.selected.camera.position) const fullWidth = outWidth / (maxX - minX) const fullHeight = outHeight / (maxY - minY) preview.camera.setViewOffset(fullWidth, fullHeight, minX * fullWidth, minY * fullHeight, outWidth, outHeight) preview.render() const img = new CanvasFrame(preview.canvas) img.autoCrop() const imageData = img.ctx.getImageData(0, 0, img.width, img.height) const data = imageData.data const length = data.length const width = img.width const height = img.height const width1 = width - 1 const height1 = height - 1 for (let i = length - 4; i >= 0; i -= 4) { const x = i / 4 % img.width const y = Math.floor(i / (4 * height)) if (data[i + 3] === 0) { if ( (x === 0 || data[i - 1] !== 0) && (x === width1 || data[i + 7] !== 0) && (y === 0 || data[i - width * 4 + 3] !== 0) && (y === height1 || data[i + width * 4 + 3] !== 0) ) { let count = 0 let sr, sg, sb, sa sr = sg = sb = sa = 0 if (x !== 0) { count++ sr += data[i - 4] sg += data[i - 3] sb += data[i - 2] sa += data[i - 1] } if (x !== width1) { count++ sr += data[i + 4] sg += data[i + 5] sb += data[i + 6] sa += data[i + 7] } if (y !== 0) { count++ sr += data[i - width * 4] sg += data[i - width * 4 + 1] sb += data[i - width * 4 + 2] sa += data[i - width * 4 + 3] } if (y !== height1) { count++ sr += data[i + width * 4] sg += data[i + width * 4 + 1] sb += data[i + width * 4 + 2] sa += data[i + width * 4 + 3] } data[i] = sr / count data[i + 1] = sg / count data[i + 2] = sb / count data[i + 3] = sa / count } else { const store = [] const queue = [i] while (store.length < 6 && queue.length !== 0) { const j = queue.shift() store.push(j) const x = j / 4 % img.width if (x !== 0 && data[j - 1] === 0 && !store.includes(j - 4)) queue.push(j - 4) if (x !== width1 && data[j + 7] === 0 && !store.includes(j + 4)) queue.push(j + 4) if (Math.floor(j / (4 * height)) !== 0 && data[j - width * 4 + 3] === 0 && !store.includes(j - width * 4)) queue.push(j - width * 4) } if (store.length >= 6) continue for (const j of store) { const x = j / 4 % img.width const y = Math.floor(j / (4 * height)) let count = 0 let sr, sg, sb, sa sr = sg = sb = sa = 0 if (x !== 0 && data[j - 1] !== 0) { count++ sr += data[j - 4] sg += data[j - 3] sb += data[j - 2] sa += data[j - 1] } if (x !== width1 && data[j + 7] !== 0) { count++ sr += data[j + 4] sg += data[j + 5] sb += data[j + 6] sa += data[j + 7] } if (y !== 0 && data[j - width * 4 + 3] !== 0) { count++ sr += data[j - width * 4] sg += data[j - width * 4 + 1] sb += data[j - width * 4 + 2] sa += data[j - width * 4 + 3] } if (y !== height1 && data[j + width * 4 + 3] !== 0) { count++ sr += data[j + width * 4] sg += data[j + width * 4 + 1] sb += data[j + width * 4 + 2] sa += data[j + width * 4 + 3] } data[j] = sr / count data[j + 1] = sg / count data[j + 2] = sb / count data[j + 3] = sa / count } } } else if ( (x === 0 || data[i - 1] === 0) && (x === width1 || data[i + 7] === 0) && (y === 0 || data[i - width * 4 + 3] === 0) && (y === height1 || data[i + width * 4 + 3] === 0) ) { data[i + 3] = 0 } else { const store = [] const queue = [i] while (store.length < 6 && queue.length !== 0) { const j = queue.shift() store.push(j) const x = j / 4 % img.width if (x !== 0 && data[j - 1] !== 0 && !store.includes(j - 4)) queue.push(j - 4) if (x !== width1 && data[j + 7] !== 0 && !store.includes(j + 4)) queue.push(j + 4) if (Math.floor(j / (4 * height)) !== 0 && data[j - width * 4 + 3] !== 0 && !store.includes(j - width * 4)) queue.push(j - width * 4) } if (store.length >= 6) continue for (const j of store) { data[j + 3] = 0 } } } img.ctx.putImageData(imageData, 0, 0) img.autoCrop() let out if (args.antialias) { const canvas = new CanvasFrame(img.width, img.height) canvas.ctx.filter = "blur(0.75px)" canvas.ctx.drawImage(img.canvas, 0, 0) out = new CanvasFrame(Math.floor(img.width / 2), Math.floor(img.height / 2)) out.ctx.drawImage(canvas.canvas, 0, 0, out.width, out.height) } else { out = img } args.rendering = false this.content_vue.rendering = false this.content_vue.image = out.canvas const size = out.canvas.toDataURL().slice(22).length * 0.75 this.content_vue.dimensions = `${out.canvas.width} x ${out.canvas.height}` this.content_vue.size = `${size > 1048576 ? `${Math.roundTo(size / 1048576, 2)} MB` : `${Math.round(size / 1024)} KB`}` dialog.object.style.width = `${Math.max(450, out.canvas.width)}px` dialog.object.querySelector(".dialog_title").textContent = "Minecraft Title Render" dialog.object.style.left = `${Math.clamp((window.innerWidth - dialog.object.clientWidth) / 2, 0, 2000)}px` dialog.object.addEventListener("keydown", e => { if (e.key === "Enter") return e.stopPropagation() }) setTimeout(() => { this.content_vue.canvas = dialog.object.querySelector("#minecraft-title-output") this.content_vue.canvas.width = this.content_vue.image.width this.content_vue.canvas.height = this.content_vue.image.height this.content_vue.ctx = this.content_vue.canvas.getContext("2d") this.content_vue.ctx.drawImage(this.content_vue.image, 0, 0) }, 0) }), 10) } }) dialog.show() }, position: loadRenderAngle, custom() { new Dialog({ id: "custom_resolution", title: "Custom Resolution", form: { resolution: { label: "Resolution", type: "number", value: this.resolution, min: 1, max: 4096 }, info: { type: "info", text: "The resolution determines the width or height of the render, depending on which one is larger. The chosen resolution may not exactly match the render size" }, info2: { type: "info", text: "If antialiasing is enabled, the render size is capped at 2048 pixels" } }, onConfirm: result => this.resolution = this.antialias ? Math.min(result.resolution, 2048) : result.resolution }).show() } }, data: { resolution: 1024, antialias: true, rendering: false }, template: `
    Position camera
    Position the camera at the correct angle for rendering a Minecraft Title
    text_rotation_angleup
    Render Minecraft Title
    Render the Minecraft Title as an image
    photo_camera
    1k
    2k
    4k
    tag
    Antialiasing:
    ` }).$mount(vue) preview = new Preview({ id: "minecraft_title_preview", antialias: false, offscreen: true }) dialog = new Dialog({ id: "new_minecraft_title_text", title: "Add Minecraft Title Text", buttons: [], lines: [``], component: { data: getDefaultDialogArgs(), mounted() { $(this.$refs.colour).spectrum(colourInput(dialog, "colour")), $(this.$refs.customBorderColour).spectrum(colourInput(dialog, "customBorderColour")), $(this.$refs.customEdgeColour).spectrum(colourInput(dialog, "customEdgeColour")), $(this.$refs.gradientColour0).spectrum(colourInput(dialog, "gradientColour0")), $(this.$refs.gradientColour1).spectrum(colourInput(dialog, "gradientColour1")), $(this.$refs.gradientColour2).spectrum(colourInput(dialog, "gradientColour2")), $(this.$refs.gradientColour3).spectrum(colourInput(dialog, "gradientColour3")), $(this.$refs.gradientColour4).spectrum(colourInput(dialog, "gradientColour4")), $(this.$refs.overlayColour).spectrum(colourInput(dialog, "overlayColour")) }, methods: { resetVariables(type, page) { if (!variables[type][page]) return for (const [k, v] of Object.entries(variables[type][page])) { this[k] = v } }, async reset(force, ignoreUpdate) { const font = fontData.find(e => e.type === fonts[this.font].type).id const beforeFont = this.font if (force) { for (let i = 0; i < variables.main.length; i++) { this.resetVariables("main", i) } } else { this.resetVariables("main", this.tab) } if (force || this.tab === 0) { this.font = font this.baseFont = font if (beforeFont !== this.font) { await this.updateFont(true) } } if (force || this.tab === 1) { this.texture = Object.keys(fonts[this.font].textures)[1] ?? Object.keys(fonts[this.font].textures)[0] this.deleteCustomTexture() $(this.$refs.gradientColour0).spectrum("set", "#FFCF76") $(this.$refs.gradientColour1).spectrum("set", "#FFA3A3") $(this.$refs.gradientColour2).spectrum("set", "#F4C1A4") $(this.$refs.gradientColour3).spectrum("set", "#E19A3E") $(this.$refs.gradientColour4).spectrum("set", "#DA371E") } this.resetTexture(force) if (!ignoreUpdate) this.buildPreview() }, resetTexture(force) { if (force) { for (let i = 0; i < variables.main.length; i++) { this.resetVariables("texture", i) } } else { this.resetVariables("texture", this.tab) } if (force || this.tab === 2) { this.deleteCustomOverlay() $(this.$refs.overlayColour).spectrum("set", "#fff") } if (force || this.tab === 3) { $(this.$refs.colour).spectrum("set", "#fff") $(this.$refs.customBorderColour).spectrum("set", "#000") $(this.$refs.customEdgeColour).spectrum("set", "#000") } }, finish: () => dialog.onConfirm(), async updateFont(ignoreUpdate) { await getFontTextures(this.font) if (!this.textures.find(e => e[0] === "flat" && e[2] === this.font)) { const textures = Object.entries(fonts[this.font].textures).map(e => e.concat([this.font])) const overlays = Object.entries(fonts[this.font].overlays).map(e => e.concat([this.font])) textures.sort((a, b) => { const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0 const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0 return statsB - statsA }) overlays.sort((a, b) => { const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0 const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0 return statsB - statsA }) this.textures.push(...textures) this.overlays.push(...overlays) } this.texture = Object.keys(fonts[this.font].textures)[1] ?? Object.keys(fonts[this.font].textures)[0] this.variant = null this.overlay = Object.keys(fonts[this.font].overlays)[0] this.characterSpacing = fonts[this.font].characterSpacing ?? 0 if (!ignoreUpdate) this.buildPreview() }, buildPreview() { let finish setTimeout(async () => { if (this.building) { this.build = true finish() return } this.building = true await this.makePreview() this.building = false if (this.build) { this.update = false await this.buildPreview() } finish() }, 0) return new Promise(fulfil => finish = fulfil) }, async makePreview() { this.scene.remove(...this.scene.children) const texture = await makeTexture(getArgs(this, true)) this.material = new THREE.MeshBasicMaterial({ map: texture, transparent: true, alphaTest: 0.5 }) await getFontCharacters(this.font) const addText = (str, args = {}) => { let width = 0 const cubes = [] const group = new THREE.Group() let lastCharacter for (const [i, char] of Array.from(str).entries()) { if (char === " " && !fonts[this.font].characters[" "]) { width += fonts[this.font].spaceWidth ?? 8 continue } if (lastCharacter && fonts[this.font].shifts?.[lastCharacter + char]) { width -= fonts[this.font].shifts[lastCharacter + char] } let min = Infinity let max = -Infinity const character = new THREE.Group() for (let cube of fonts[this.font].characters[char]) { if (!cube.parsed) { cube.parsed = true for (const [direction, uv] of Object.entries(cube.faces)) { cube.faces[direction] = { uv } } } cube = JSON.parse(JSON.stringify(cube)) min = Math.min(min, cube.from[0], cube.to[0]) max = Math.max(max, cube.from[0], cube.to[0]) if (args.type === "bottom" && !fonts[this.font].flat) { if (cube.to[2] > cube.from[2]) { cube.to[2] += 20 } else { cube.from[2] += 20 } } const geometry = new THREE.BoxGeometry(cube.to[0] - cube.from[0], cube.to[1] - cube.from[1], cube.to[2] - cube.from[2]) const mesh = new THREE.Mesh(geometry, this.material) mesh.position.fromArray([ (cube.from[0] + cube.to[0]) / 2, (cube.from[1] + cube.to[1]) / 2, (cube.from[2] + cube.to[2]) / 2 ]) const indexes = { north: 40, east: 0, south: 32, west: 8, up: 16, down: 24 } for (const key of Object.keys(indexes)) { const face = cube.faces[key] const i = indexes[key] if (face) { const uv = [ [face.uv[0] / 16, 1 - (face.uv[1] / 16)], [face.uv[2] / 16, 1 - (face.uv[1] / 16)], [face.uv[0] / 16, 1 - (face.uv[3] / 16)], [face.uv[2] / 16, 1 - (face.uv[3] / 16)] ] geometry.attributes.uv.array.set(uv[0], i + 0) geometry.attributes.uv.array.set(uv[1], i + 2) geometry.attributes.uv.array.set(uv[2], i + 4) geometry.attributes.uv.array.set(uv[3], i + 6) } else { const offset = i / 8 * 6 geometry.index.array[offset] = 0 geometry.index.array[offset + 1] = 0 geometry.index.array[offset + 2] = 0 geometry.index.array[offset + 3] = 0 geometry.index.array[offset + 4] = 0 geometry.index.array[offset + 5] = 0 } } character.add(mesh) cubes.push(mesh) } if (i) max += fonts[this.font].characterSpacing ?? 0 for (const cube of character.children) { cube.position.x -= width + max } group.add(character) width += max - min lastCharacter = char } for (const cube of cubes) { cube.position.x += width / 2 } if (fonts[this.font].autoBorder) { let minX = Infinity let minY = Infinity let minZ = Infinity let maxX = -Infinity let maxY = -Infinity let maxZ = -Infinity for (const cube of cubes) { const from = [ cube.position.x - cube.geometry.parameters.width / 2, cube.position.y - cube.geometry.parameters.height / 2, cube.position.z - cube.geometry.parameters.depth / 2 ] const to = [ from[0] + cube.geometry.parameters.width, from[1] + cube.geometry.parameters.height, from[2] + cube.geometry.parameters.depth ] minX = Math.min(minX, from[0], to[0]) minY = Math.min(minY, from[1], to[1]) minZ = Math.min(minZ, from[2], to[2]) maxX = Math.max(maxX, from[0], to[0]) maxY = Math.max(maxY, from[1], to[1]) maxZ = Math.max(maxZ, from[2], to[2]) } const geometry = new THREE.BoxGeometry(minX - maxX - 4, minY - maxY - 4, minZ - maxZ - 4) const mesh = new THREE.Mesh(geometry, this.material) mesh.position.fromArray([ (maxX + minX) / 2, (maxY + minY) / 2, (maxZ + minZ) / 2 ]) const indexes = [40, 0, 32, 8, 16, 24] for (const i of indexes) { const uv = [ [0, 1 - fonts[this.font].border / fonts[this.font].textureHeight], [1 / fonts[this.font].textureWidth, 1 - fonts[this.font].border / fonts[this.font].textureHeight], [0, 1 - (fonts[this.font].border + 1) / fonts[this.font].textureHeight], [1 / fonts[this.font].textureWidth, 1 - (fonts[this.font].border + 1) / fonts[this.font].textureHeight] ] mesh.geometry.attributes.uv.array.set(uv[0], i + 0) mesh.geometry.attributes.uv.array.set(uv[1], i + 2) mesh.geometry.attributes.uv.array.set(uv[2], i + 4) mesh.geometry.attributes.uv.array.set(uv[3], i + 6) } group.add(mesh) } if (args.type === "bottom") { group.scale.setX(0.75) group.scale.setY(1.6) group.scale.setZ(0.75) group.rotation.fromArray([Math.degToRad(-90), 0, 0]) group.position.z += fonts[this.font].height + 49 if (fonts[this.font].flat) { group.position.y -= 18 } else { group.position.y -= 25 - fonts[this.font].ends[0][1] } } this.scene.add(group) } if (fonts[this.font].type === "font") { if ((this.terminators || fonts[this.font].forcedTerminators) && fonts[this.font].terminatorSpace) { addText(`┫ ${fonts[this.font].example?.[0] ?? "ex😳mple"} ┣`) addText(`┫ ${fonts[this.font].example?.[1] ?? "text"} ┣`, { type: "bottom" }) } else if (this.terminators || fonts[this.font].forcedTerminators) { addText(`┫${fonts[this.font].example?.[0] ?? "ex😳mple"}┣`) addText(`┫${fonts[this.font].example?.[1] ?? "text"}┣`, { type: "bottom" }) } else { addText(fonts[this.font].example?.[0] ?? "ex😳mple") addText(fonts[this.font].example?.[1] ?? "text", { type: "bottom" }) } } else { addText("a") } this.renderer = new THREE.WebGLRenderer({ alpha: true, canvas: this.canvas, preserveDrawingBuffer: true }) this.renderer.render(this.scene, this.camera) }, updatePreview() { setTimeout(async () => { if (this.updating) { this.update = true return } this.updating = true const texture = await makeTexture(getArgs(this, true)) this.material.map = texture this.material.needsUpdate = true this.renderer.render(this.scene, this.camera) if (this.textureSource === "tileable" || this.textureSource === "file" && this.customTexture && this.customTextureType === "tileable") { let img if (this.textureSource === "file") img = await loadImage(this.customTexture) else img = await loadImage(await getTileable(this.tileable, this.tileableVariant)) this.tileableWidth = img.width - 1 this.tileableHeight = img.height - 1 this.tileableXOffset = Math.min(this.tileableXOffset, img.width - 1) this.tileableYOffset = Math.min(this.tileableYOffset, img.height - 1) } this.updating = false if (this.update) { this.update = false this.updatePreview() } }, 0) }, expandCanvas(e) { const canvas = new CanvasFrame(this.canvas.width, this.canvas.height) canvas.canvas.classList.add("checkerboard") canvas.ctx.drawImage(this.canvas, 0, 0) const overlay = document.createElement("div") overlay.id = "minecraft-title-expanded-preview" overlay.append(canvas.canvas) overlay.addEventListener("click", e => overlay.remove()) document.body.append(overlay) }, async selectCustomTexture() { const texture = await getTextureFromFile() if (!texture) return if (texture.width / texture.height === fonts[this.font].textureWidth / fonts[this.font].textureHeight) this.customTextureType = "texture" else this.customTextureType = "tileable" globalThis.texture = texture this.customTextureCanvas.width = texture.width this.customTextureCanvas.height = texture.height this.customTextureCanvas.getContext("2d").drawImage(texture, 0, 0, this.customTextureCanvas.width, this.customTextureCanvas.height) this.customTexture = this.customTextureCanvas.toDataURL() this.updatePreview() }, async selectCustomOverlay() { const texture = await getTextureFromFile() if (!texture) return this.customOverlayCanvas.width = texture.width this.customOverlayCanvas.height = texture.height this.customOverlayCanvas.getContext("2d").drawImage(texture, 0, 0, this.customOverlayCanvas.width, this.customOverlayCanvas.height) this.customOverlay = this.customOverlayCanvas.toDataURL() this.updatePreview() }, deleteCustomTexture() { this.customTexture = null this.customTextureCanvas.getContext("2d").clearRect(0, 0, this.customTextureCanvas.width, this.customTextureCanvas.height) this.updatePreview() }, deleteCustomOverlay() { this.customOverlay = null this.customOverlayCanvas.getContext("2d").clearRect(0, 0, this.customOverlayCanvas.width, this.customOverlayCanvas.height) this.updatePreview() }, saveTexture: async (font, type, texture, variant) => Blockbench.export({ type: "PNG Texture", extensions: ["png"], name: variant ?? texture, content: type === "tileables" ? await getTileable(texture, variant) : await getTexture(fonts[font][type], texture, variant), savetype: "image" }, () => { Blockbench.showQuickMessage("Exported texture") sendStats({ font, texture: type === "textures" ? texture : undefined, tileable: type === "tileables" ? texture : undefined, overlay: type === "overlays" ? texture : undefined }) }), async importTexture() { const textures = [] Undo.initEdit({ textures }) const args = getArgs(this) args.text = args.customTexture ? "custom" : this.textureSource === "gradient" ? "gradient" : this.texture const texture = await makeTexture(args) texture.add() textures.push(texture) Undo.finishEdit("Add Minecraft title texture") dialog.close() sendStats(args) }, scrollToVariants() { setTimeout(() => { if (this.$refs.textureVariants) { this.$refs.textureVariants.scrollIntoView({ behavior: "smooth" }) } }, 0) }, importTextureAsFile() { Blockbench.showMessageBox({ title: "Import current texture as file", message: "Are you sure you want to import the current texture as a file?\n\nAny settings applied to it will be baked into the texture and cannot be removed.\n\nThis action cannot be undone.", buttons: ["dialog.confirm", "dialog.cancel"] }, async button => { if (button === 0) { const args = getArgs(this) sendStats(args) args.canvas = true const texture = await makeTexture(args) this.customTextureCanvas.width = texture.width this.customTextureCanvas.height = texture.height this.customTextureCanvas.getContext("2d").drawImage(texture, 0, 0, this.customTextureCanvas.width, this.customTextureCanvas.height) this.customTexture = texture.toDataURL() this.resetTexture(true) this.updatePreview() } }) }, presets() { const settings = this const presetDialog = new Dialog({ id: "minecraft_title_presets", title: "Minecraft Title Presets", buttons: [], lines: [``], component: { data: { presets: JSON.parse(localStorage.getItem("minecraft_title_presets") ?? "{}") }, methods: { add() { const args = getArgs(settings) delete args.font delete args.fontTab delete args.three args.fontType = fonts[args.baseFont].type if (args.textureSource === "file" || args.overlaySource === "file") { return Blockbench.showQuickMessage("Custom textures are not supported for presets", 3000) } for (const [key, obj] of Object.entries(this.presets)) { if (areObjectsEqual(args, obj.settings)) { return Blockbench.showQuickMessage(`Current settings are already saved under the preset "${key}"`, 3000) } } new Dialog({ id: "minecraft_title_preset_name", title: "Minecraft Title Preset Name", form: { name: { label: "Preset Name", placeholder: "Minecraft Cracked" } }, onConfirm: result => { const name = result.name.trim() if (!name) return Blockbench.showQuickMessage("No name provided") if (name.length > 24) return Blockbench.showQuickMessage("Please keep names 24 characters or less", 3000) if (this.presets[name]) return Blockbench.showQuickMessage(`The name "${name}" is already in use`, 3000) this.presets[name] = { date: Date.now(), settings: args } localStorage.setItem("minecraft_title_presets", JSON.stringify(this.presets)) this.$forceUpdate() } }).show() }, deletePreset(event, name) { Blockbench.showMessageBox({ title: "Delete preset", message: `Are you sure you want to delete the preset "${name}"?\n\nThis action cannot be undone.`, buttons: ["dialog.confirm", "dialog.cancel"] }, async button => { if (button === 0) { delete this.presets[name] localStorage.setItem("minecraft_title_presets", JSON.stringify(this.presets)) this.$forceUpdate() Blockbench.showQuickMessage("Deleted preset") } }) }, async load(event, name) { if (event.target.classList.contains("material-icons")) return const args = this.presets[name].settings if (args.fontType === "shape") { if (fonts[settings.font].type !== "shape") { await settings.switchToShapes() } } else if (fonts[settings.font].type !== "font") { await settings.switchToFonts() } await settings.reset(true, true) const ignore = [ "font", "baseFont", "fontVariant", "fontTab", "texture", "variant", "tileable", "tileableVariant", "overlay", "tileableXOffset", "tileableYOffset" ] for (const k of Object.values(variables).flat().flatMap(Object.keys)) { if (!ignore.includes(k) && args[k] !== undefined) { settings[k] = args[k] } } if (fonts[args.baseFont]) { settings.font = args.baseFont settings.baseFont = args.baseFont if (args.fontVariant && fonts[args.fontVariant] && fonts[args.baseFont].variants?.some(e => e.id === args.fontVariant)) { settings.font = args.fontVariant settings.fontVariant = args.fontVariant settings.fontTab = "variants" } await settings.updateFont(true) } if (fonts[settings.font].textures[args.texture]) { settings.texture = args.texture if (args.variant && fonts[settings.font].textures[args.texture].variants?.[args.variant]) { settings.variant = args.variant } } if (fonts[settings.font].overlays[args.overlay]) { settings.overlay = args.overlay } if (args.tileable && tileables[args.tileable]) { settings.tileable = args.tileable if (args.tileableVariant && tileable[args.tileable].variants?.[args.tileableVariant]) { settings.tileableVariant = args.tileableVariant } if (args.tileableXOffset || args.tileableYOffset) { const img = await loadImage(await getTileable(args.tileable, args.tileableVariant)) if (args.tileableXOffset) settings.tileableXOffset = Math.min(img.width - 1, args.tileableXOffset) if (args.tileableYOffset) settings.tileableYOffset = Math.min(img.height - 1, args.tileableYOffset) } } for (let col of ["colour", "customBorderColour", "customEdgeColour", "overlayColour", "gradientColour0", "gradientColour1", "gradientColour2", "gradientColour3", "gradientColour4"]) { $(settings.$refs[col]).spectrum("set", settings[col]) } settings.buildPreview().then(settings.updatePreview) presetDialog.close() Blockbench.showQuickMessage(`Preset "${name}" loaded`, 3000) }, importText(name, text) { new Dialog({ id: "minecraft_title_preset_import", title: "Minecraft Title Preset Import", form: { name: { label: "Preset Name", placeholder: "Minecraft Cracked", value: name }, data: { type: "textarea", label: "Preset Data", placeholder: "{}", value: text } }, onConfirm: result => { const name = result.name.trim() if (!name) return Blockbench.showQuickMessage("No name provided") if (name.length > 24) return Blockbench.showQuickMessage("Please keep names 24 characters or less", 3000) if (this.presets[name]) return Blockbench.showQuickMessage(`The name "${name}" is already in use`, 3000) try { const data = JSON.parse(result.data.trim()) if (!data.preset || data.type !== "minecraft_title_generator_preset") { return Blockbench.showQuickMessage("Invalid preset") } for (const [key, obj] of Object.entries(this.presets)) { if (areObjectsEqual(data.preset, obj.settings)) { return Blockbench.showQuickMessage(`Current settings are already saved under the preset "${key}"`, 3000) } } this.presets[name] = { date: Date.now(), settings: data.preset } localStorage.setItem("minecraft_title_presets", JSON.stringify(this.presets)) this.$forceUpdate() } catch { Blockbench.showQuickMessage("Invalid json for preset data", 3000) } } }).show() }, importFile() { Blockbench.import({ extensions: ["json"], type: "Minecraft Title Preset", }, files => { this.importText(files[0].name.replace(/\.json$/, ""), files[0].content) }) }, exportPreset(event, name) { const dialog = new Dialog({ id: "minecraft_title_preset_export", title: "Minecraft Title Preset Export", buttons: [], lines: [``], component: { data: { preset: { type: "minecraft_title_generator_preset", preset: this.presets[name].settings } }, methods: { copy() { navigator.clipboard.writeText(JSON.stringify(this.preset)) Blockbench.showQuickMessage("Copied to clipboard") dialog.close() }, save() { Blockbench.export({ extensions: ["json"], name: `${name.replace(/\s/g, "_")}.json`, content: JSON.stringify(this.preset, null, 2) }, () => { Blockbench.showQuickMessage("Exported preset") dialog.close() }) } }, template: `
    {{ JSON.stringify(preset) }}
    ` } }).show() } }, template: `
    {{ data.settings.fontType === 'shape' ? 'interests' : 'text_fields' }}
    {{ name }}
    {{ new Date(data.date).toLocaleDateString('en-GB', { year: 'numeric', month: 'short', day: '2-digit' }) }}
    ios_share delete

    ` } }).show() }, async textInfo(font, parent) { await getFontCharacters(font) new Blockbench.Dialog({ id: "minecraft_title_info", title: `${parent && parent !== font ? `${fonts[parent].name} ` : ""}${fonts[font].name} Info`, lines: [``], component: { template: `
    ${fonts[font].description ? `

    ${fonts[font].description.replace(/`(.*?)`/g, "$1")}

    ` : ""}

    Available Characters

    ${Object.keys(fonts[font].characters).sort((a, b) => { const isALetter = /[a-zA-Z]/.test(a) const isBLetter = /[a-zA-Z]/.test(b) const isANumber = /\d/.test(a) const isBNumber = /\d/.test(b) if (isALetter) { if (!isBLetter) return -1 else if (isBLetter) return a.localeCompare(b) } else if (isANumber) { if (!isBLetter && !isBNumber) return -1 else if (isBLetter) return 1 else if (isBNumber) return a.localeCompare(b) } else { if (isBLetter || isBNumber) return 1 else return a.localeCompare(b) } }).join(" ").replace(/[😩😳]/g, "")}

    You can use an uppercase A to get the a with the creeper face.

    ` }, buttons: ["dialog.close"] }).show() }, connectionInfo() { Blockbench.showMessageBox({ title: "Failed to load textures and fonts", message: `Minecraft Title Generator was unable to load the textures and fonts. You will only be able to use the built-in texture and font.\n\nPlease make sure you are connected to the internet, and can access this fonts.json file.\n\nIf you are unable to access the fonts.json file, it may be blocked by your computer or your internet service provider. If it is not your computer blocking it, you may be able to use a VPN to bypass the block. One good example is Cloudflare WARP, which is a free program that commonly resolves this issue.` }) }, tabChange(tab) { this.tab = tab document.querySelector("#new_minecraft_title_text .dialog_content").scrollTop = 0 this.focus() }, focus() { setTimeout(() => this.$el.querySelector(".minecraft-title-contents.visible input[type='text']")?.focus(), 0) }, async switchToFonts() { if (fonts[this.font].type === "shape") { this.lastShape = this.baseFont this.lastShapeTexture = this.texture this.lastShapeTextureVariant = this.variant this.lastShapeOverlay = this.overlay this.tab = 0 if (this.lastShape) { this.font = this.lastFontVariant ?? this.lastFont this.baseFont = this.lastFont this.fontVariant = this.lastFontVariant this.fontTab = this.fontVariant ? "variants" : "fonts" } else { this.font = this.fontList.find(e => e[1].type === "font")[0] this.baseFont = this.font this.fontVariant = null this.fontTab = "fonts" } await this.updateFont(true) if (this.lastShape) { this.texture = this.lastFontTexture this.variant = this.lastFontTextureVariant this.overlay = this.lastFontOverlay } this.camera.fov = 18 this.camera.lookAt(new THREE.Vector3(0, 0, 0)) this.camera.updateProjectionMatrix() return this.buildPreview() } }, async switchToShapes() { if (fonts[this.font].type === "font") { this.lastFont = this.baseFont this.lastFontVariant = this.fontVariant this.lastFontTexture = this.texture this.lastFontTextureVariant = this.variant this.lastFontOverlay = this.overlay this.tab = 0 this.fontTab = "fonts" this.fontVariant = null if (this.lastShape) { this.font = this.lastShape this.baseFont = this.lastShape } else { this.font = this.fontList.find(e => e[1].type === "shape")[0] this.baseFont = this.font } await this.updateFont(true) if (this.lastShape) { this.texture = this.lastShapeTexture this.variant = this.lastShapeTextureVariant this.overlay = this.lastShapeOverlay } this.camera.fov = 12 this.camera.lookAt(new THREE.Vector3(0, 18, 0)) this.camera.updateProjectionMatrix() return this.buildPreview() } } }, computed: { linearGradient() { if (this.smoothGradient) return `linear-gradient(${[ [this.gradientColour0, 0], this.gradientColour1Enabled ? [this.gradientColour1, 25] : null, this.gradientColour2Enabled ? [this.gradientColour2, 50] : null, this.gradientColour3Enabled ? [this.gradientColour3, 75] : null, [this.gradientColour4, 100] ].filter(e => e).map(e => `${e[0]} ${e[1]}%`)})` const states = [ this.gradientColour1Enabled, this.gradientColour2Enabled, this.gradientColour3Enabled ] const stops = stopConfigs[states[0] << 2 | states[1] << 1 | states[2]] let prev = 0 const colourStops = [] for (let i = 0, j = 0; i < 5; i++) if (states[i-1] ?? true) { colourStops.push([this[`gradientColour${i}`], prev * 100]) colourStops.push([this[`gradientColour${i}`], (stops[j] ?? 1) * 100]) prev = stops[j] ?? 1 j++ } return `linear-gradient(${colourStops.map(e => `${e[0]} ${e[1]}%`)})` } }, template: `
    Add Minecraft Title {{ fonts[font].type === 'font' ? 'Text' : 'Shape' }}
    text_fields
    interests
    tune
    replay
    Failed to load textures and fonts
    More Info
    {{ fonts[font].type === 'font' ? 'Text' : 'Shape' }}
    Texture
    Overlay
    Style
    Settings
    open_in_full

    {{ fonts[font].type === 'font' ? 'Text' : 'Shape' }} Type / Angle

    The type of {{ fonts[font].type === 'font' ? 'text' : 'shape' }} to add


    {{ fonts[font].type === 'font' ? 'Text' : 'Shape' }} Row

    The vertical row that the {{ fonts[font].type === 'font' ? 'text' : 'shape' }} will appear on

    The texture to apply to the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}

    • Textures
    • Tileables
    • Gradient
    • File
    {{ data.category ?? data.name }}
    person save
    filter_{{ Object.keys(fonts[font].textures[id].variants).length > 8 ? '9_plus' : Object.keys(fonts[font].textures[id].variants).length + 1 }}

    Variants

    {{ fonts[font].textures[texture].name }}
    person save
    {{ data.name }}
    person save
    {{ data.category ?? data.name }}
    person save
    filter_{{ Object.keys(tileables[id].variants).length > 8 ? '9_plus' : Object.keys(tileables[id].variants).length + 1 }}

    Variants

    {{ tileables[tileable].name }}
    person save
    {{ data.name }}
    person save
    delete
    Texture Type:

    Overlay Texture

    A texture to overlay onto the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}

    • Textures
    • File
    {{ data.name }}
    person save
    delete

    The blend method to use when applying the overlay


    Overlay Colour

    A colour to apply to the overlay texture

    The blend method to use when applying the colour


    Overlay Opacity

    The opacity to apply the overlay at

    Configuration

    Configure the tileable texture

    Scale:
    X Offset:
    Y Offset:
    Texture Resolution:

    Configuration

    Configure the gradient texture


    Filters

    Apply some filters to the chosen texture

    Hue
    Saturation
    Brightness
    Contrast

    Colour

    A colour to apply to the chosen texture

    The blend method to use when applying the colour

    The opacity to apply the colour at


    Border


    Edges

    Edge brightness:

    Row Spacing

    Change the spacing between the vertical rows of {{ fonts[font].type === 'font' ? 'text' : 'shape' }}


    {{ fonts[font].type === 'font' ? 'Text' : 'Shape' }} Scale

    The scale to render the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}
    For advanced scaling, use Transform > Scale after adding the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}

    X
    Y
    Z
    ` }, onOpen() { setTimeout(async () => { this.content_vue.focus() if (!await MinecraftEULA.promptUser(id)) return dialog.close() }, 0) }, onConfirm() { let text if (fonts[this.content_vue.font].type === "font") { text = this.content_vue.text.replace(/A/g, "😳").replace(/(\s|^)'/g, "$1😩").replace(/(\s|^)"/g, "$1😩😩").replace(/"/g, "''").toLowerCase().trim() if (!text) { this.content_vue.tab = 0 Blockbench.showQuickMessage("Please provide some text") return false } } else { text = "a" } dialog.close() addText(text, getArgs(this.content_vue)) }, async onBuild() { getFontTextures("minecraft-ten-blank", true) const [fetchedStats] = await Promise.all([ fetch(`${api}/blockbench/minecrafttitlegenerator/stats`, { headers: { source: "blockbench" } }).then(e => e.json()).catch(() => []), getFontTextures("minecraft-ten", true) ]) stats.push(...fetchedStats) const ten = stats.find(e => e.id === "minecraft-ten") if (ten) ten.count = Infinity else stats.push({ id: "minecraft-ten", count: Infinity }) fontData.push(...await fetchData("fonts.json", () => [])) const shapes = await fetchData("shapes.json", () => []) const shapeModels = await fetchData("shapes/shapes.json") for (const shape of shapes) { shape.type = "shape" shape.characters = { a: shapeModels[shape.id] } fontData.push(shape) } for (let [i, font] of fontData.entries()) { font.type ??= "font" if (fonts[font.id]) { fonts[font.id] = Object.assign(fonts[font.id], font) font = fonts[font.id] fontData[i] = font } else { font.name ??= titleCase(font.id) font.characters ??= `fonts/${font.id}/characters.json` font.textures = `fonts/${font.id}/textures.json` fonts[font.id] = font } font.textureWidth ??= 1000 font.textureHeight ??= 320 font.parsed = true if (font.variants) for (const [j, v] of font.variants.entries()) { const variant = Object.assign({}, font, v) delete variant.thumbnail variant.name ??= titleCase(variant.id) variant.characters = `fonts/${variant.id}/characters.json` variant.textures = `fonts/${variant.id}/textures.json` delete variant.overlays fonts[variant.id] = variant font.variants[j] = variant if (variant.shifts) { if (v.shifts === "inherit") { variant.shifts = font.shifts } else if (!v.shifts) { delete variant.shifts } } variant.parsed = true } } for (const font of Object.entries(fonts).filter(e => !e[1].parsed)) { font[1].id = font[0] fontData.push(font[1]) } tileables = Object.assign(tileables, await fetchData("tileables.json")) for (const [id, tileable] of Object.entries(tileables)) { tileable.name ??= titleCase(id) tileable.author ??= "Mojang" tileable.path ??= "minecraft" if (tileable.variants) for (const [id, variant] of Object.entries(tileable.variants)) { variant.name ??= titleCase(id) variant.path ??= tileable.path } } this.content_vue.fontList = fontData.map(e => [e.id, e]) this.content_vue.textures = Object.entries(fonts["minecraft-ten"].textures).map(e => e.concat(["minecraft-ten"])) this.content_vue.tileablesList = Object.entries(tileables) this.content_vue.overlays = Object.entries(fonts["minecraft-ten"].overlays).map(e => e.concat(["minecraft-ten"])) if (Object.keys(fonts["minecraft-ten"].textures)[1]) this.content_vue.texture = Object.keys(fonts["minecraft-ten"].textures)[1] this.content_vue.fontList.sort((a, b) => { const statsA = stats.find(e => e.id === a[0])?.count ?? 0 const statsB = stats.find(e => e.id === b[0])?.count ?? 0 return statsB - statsA }) this.content_vue.textures.sort((a, b) => { const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0 const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0 return statsB - statsA }) this.content_vue.tileablesList.sort((a, b) => { const statsA = stats.find(e => e.id === `tileable.${a[0]}`)?.count ?? 0 const statsB = stats.find(e => e.id === `tileable.${b[0]}`)?.count ?? 0 return statsB - statsA }) this.content_vue.overlays.sort((a, b) => { const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0 const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0 return statsB - statsA }) this.content_vue.$forceUpdate() this.content_vue.canvas = dialog.content_vue.$el.querySelector("#minecraft-title-preview") this.content_vue.customTextureCanvas = dialog.content_vue.$el.querySelector("#minecraft-title-custom-texture > canvas") this.content_vue.customOverlayCanvas = dialog.content_vue.$el.querySelector("#minecraft-title-custom-overlay > canvas") this.content_vue.customTextureCanvas.getContext("2d").globalCompositeOperation = "copy" this.content_vue.customOverlayCanvas.getContext("2d").globalCompositeOperation = "copy" this.content_vue.camera = new THREE.PerspectiveCamera(18, this.content_vue.canvas.width / this.content_vue.canvas.height, 1, 1000) this.content_vue.camera.position.x = 0 this.content_vue.camera.position.y = -170 this.content_vue.camera.position.z = -320 this.content_vue.camera.lookAt(new THREE.Vector3(0, 0, 0)) this.content_vue.scene = new THREE.Scene() this.content_vue.buildPreview() initialLoaded() } }) debugDialog = new Dialog({ id: `debug_${id}`, title: "Load Debug Minecraft Title Text", component: { data: { connection, font: Object.keys(fonts)[0], fonts, texture: Object.keys(fonts["minecraft-ten"].textures)[1] ?? Object.keys(fonts["minecraft-ten"].textures)[0], variant: null, }, methods: { async selectFont(id) { await getFontTextures(id) this.font = id this.texture = Object.keys(fonts[id].textures)[0] this.variant = null } }, template: `

    Font

    {{ data.name }}

    Texture

    All
    {{ data.category ?? data.name }}
    filter_{{ Object.keys(fonts[font].textures[id].variants).length > 8 ? '9_plus' : Object.keys(fonts[font].textures[id].variants).length + 1 }}

    Texture Variants

    {{ fonts[font].textures[texture].name }}
    {{ data.name }}
    ` }, async onConfirm() { await getFontCharacters(this.content_vue.font) const str = Object.keys(fonts[this.content_vue.font].characters).sort().join("").replace(/😩|😳/g, "").replace("a", "😳a").replace("'", "😩'") if (this.content_vue.texture === "all") { const textures = [] for (const [id, data] of Object.entries(fonts[this.content_vue.font].textures)) { textures.push([id]) if (data.variants) textures.push(...Object.keys(data.variants).map(e => [id, e])) } for (const [i, texture] of textures.entries()) { await addText(str, { debug: true, font: this.content_vue.font, texture: texture[0], variant: texture[1], row: textures.length - i - 1, characterSpacing: fonts[this.content_vue.font].spaceWidth ?? 8, rowSpacing: 8, blend: "multiply", colour: "#fff", scaleX: 1, scaleY: 1, scaleZ: 1, customBorder: false, spacerWidth: 31, name: texture[1] ?? texture[0], ignoreStats: true, ignoreTextureCheck: true }) } } else { const parts = [] let part = "" let x = 0 for (const char of str) { part += char x++ if (x >= 11) { x = 0 parts.push(part) part = "" } } if (part) parts.push(part) for (const [i, part] of parts.entries()) { await addText(part, { debug: true, font: this.content_vue.font, texture: this.content_vue.texture, variant: this.content_vue.variant, row: parts.length - i - 1, characterSpacing: 8, rowSpacing: 8, blend: "multiply", colour: "#fff", scaleX: 1, scaleY: 1, scaleZ: 1, customBorder: false, spacerWidth: 31, name: this.content_vue.variant ?? this.content_vue.texture, ignoreStats: true }) } } } }) debug = new Action("load_debug_minecraft_title_text", { name: "Load Debug Minecraft Title Text", icon, condition: () => Project.format === format, click: () => debugDialog.show() }) MenuBar.addAction(debug, "help.developer.1") Blockbench.on("update_selection", selectHandler) DefaultCameraPresets.push(titleCameraAngle) }, onunload() { Blockbench.removeListener("update_selection", selectHandler) format.delete() action.delete() action2.delete() mode.delete() styles.delete() preview.delete() debug.delete() dialog.close() debugDialog.close() controls.remove() DefaultCameraPresets.splice(DefaultCameraPresets.indexOf(titleCameraAngle), 1) } }) async function fetchData(path, fallback) { const currentRoot = connection.rootIndex try { const r = await fetch(`${root}/${path}`) if (r.status !== 200) throw new Error if (r.headers.get("Content-Type")?.startsWith("text/plain") || r.headers.get("Content-Type")?.startsWith("application/json")) return r.json() return r } catch { for (let x = currentRoot + 1; x < connection.roots.length; x++) { try { const r = await fetch(`${connection.roots[x]}/${path}`) if (r.status !== 200) throw new Error root = connection.roots[x] connection.rootIndex = x if (r.headers.get("Content-Type")?.startsWith("text/plain") || r.headers.get("Content-Type")?.startsWith("application/json")) return r.json() return r } catch {} } connection.failed = true return fallback ? fallback() : {} } } function sendStats(args, font) { let chosenTexture, chosenTileable if (!args.gradientColour0 && !args.customTexture) { if (args.tileable) chosenTileable = args.tileable else chosenTexture = args.texture } const chosenOverlay = args.customOverlay || args.overlay === "none" ? undefined : args.overlay if (font || chosenTexture || chosenTileable || chosenOverlay) fetch(`${api}/blockbench/minecrafttitlegenerator/stats`, { method: "POST", headers: { source: "blockbench", "Content-Type": "application/json" }, body: JSON.stringify({ font: args.font, ignoreFont: !font, texture: chosenTexture, tileable: chosenTileable, overlay: chosenOverlay }) }).catch(() => {}) } async function getTexture(object, texture, variant, direct) { if (!direct && !object[texture] || variant && !object[texture].variants?.[variant]) { return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX7PvkAAAA/TQ/fAAAADklEQVR4XmPgh8IPEAgAEeAD/bSogK0AAAAASUVORK5CYII=" } if (!direct && ((variant && object[texture].variants[variant]?.texture.startsWith("data:image/png;base64,")) || (!variant && object[texture].texture.startsWith("data:image/png;base64,")))) return variant ? object[texture].variants[variant].texture : object[texture].texture const data = await new Promise(async fulfil => { const reader = new FileReader() reader.onload = e => fulfil(e.target.result) reader.readAsDataURL(new Blob([await fetchData(direct ?? (variant ? object[texture].variants[variant].texture : object[texture].texture)).then(e => e.arrayBuffer())], { type: "image/png" })) }).catch(() => {}) if (!direct) { if (variant) object[texture].variants[variant].texture = data else object[texture].texture = data } return data } async function addText(text, args) { args.text = text const elements = [] const textures = [] Undo.initEdit({ outliner: true, elements, textures }) let texture = await makeTexture(args) let match if (!args.ignoreTextureCheck) for (const image of Texture.all) { if (image.img.src === texture.img.src) { match = true texture = image break } } if (!match) { texture.add() textures.push(texture) } await getFontCharacters(args.font) if (!args.debug && args.characterSpacing && fonts[args.font].characters["​"]) { text = text.split("").join("​") args.spacerWidth = args.characterSpacing - 1 args.characterSpacing = 0 } if (!args.debug && (args.terminators || fonts[args.font].forcedTerminators) && fonts[args.font].terminatorSpace) { text = `┫ ${text} ┣` } else if (!args.debug && (args.terminators || fonts[args.font].forcedTerminators)) { text = `┫${text}┣` } let words if (fonts[args.font].characters[" "]) words = [text] else words = text.split(" ") let group let offset = 0 if (words.length === 1) { [group] = makeWord(text, offset, "root", { font: args.font, texture: texture.uuid, row: args.row, type: args.type, characterSpacing: args.characterSpacing, spacerWidth: args.spacerWidth, rowSpacing: args.rowSpacing, scale: [args.scaleX, args.scaleY, args.scaleZ], disableCharacterShifting: args.disableCharacterShifting, name: args.name, elements }) } else { group = new Group(args.name ?? makeName(text)).init() let lastCharacter for (const part of words) { const [word, newOffset, newLastCharacter] = makeWord(part, offset, group, { font: args.font, texture: texture.uuid, row: args.row, type: args.type, characterSpacing: args.characterSpacing, spacerWidth: args.spacerWidth, rowSpacing: args.rowSpacing, scale: [args.scaleX, args.scaleY, args.scaleZ], disableCharacterShifting: args.disableCharacterShifting, elements, lastCharacter }) offset = newOffset + ((fonts[args.font].spaceWidth ?? 8) + args.characterSpacing) * args.scaleX lastCharacter = newLastCharacter } } group.addTo().select() let min = Infinity let max = -Infinity for (const cube of Cube.selected) { min = Math.min(min, cube.from[0], cube.to[0]) max = Math.max(max, cube.from[0], cube.to[0]) } let width = (max - min) / 2 if (fonts[args.font].autoBorder) width -= 2 * (args.scaleX + args.scaleY) / 2 * (args.type === "bottom" ? 0.75 : args.type === "small" ? 0.35 : 1) for (const cube of Cube.selected) { cube.from[0] += width cube.to[0] += width } if (args.type === "bottom") { group.rotation[0] = -90 } Canvas.updateView({ elements: Cube.selected, groups: Group.multi_selected }) Undo.finishEdit("Add Minecraft title text") updateSelection() if (!args.ignoreStats) sendStats(args, true) } async function makeTexture(args) { const img = await loadImage(args.customTexture && args.customTextureType === "texture" ? args.customTexture : await getTexture(fonts[args.font].textures, args.texture, args.variant)) const res = args.tileable || args.customTexture && args.customTextureType === "tileable" ? args.tileableTextureResolution : 1 let { canvas, ctx } = new CanvasFrame(img.width * res, img.height * res) ctx.imageSmoothingEnabled = false ctx.drawImage(img, 0, 0, canvas.width, canvas.height) let m = canvas.width / fonts[args.font].textureWidth if (args.gradientColour0) { if (args.smoothGradient) { const colours = [ [args.gradientColour0, 0], args.gradientColour1Enabled ? [args.gradientColour1, 0.25] : null, args.gradientColour2Enabled ? [args.gradientColour2, 0.50] : null, args.gradientColour3Enabled ? [args.gradientColour3, 0.75] : null, [args.gradientColour4, 1] ].filter(e => e) const height = fonts[args.font].ends[fonts[args.font].ends.length - 1][3] if (canvas.width < fonts[args.font].textureWidth * 4) { const newCanvas = new CanvasFrame(fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4) newCanvas.ctx.imageSmoothingEnabled = false newCanvas.ctx.drawImage(canvas, 0, 0, fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4) canvas = newCanvas.canvas ctx = newCanvas.ctx m = canvas.width / fonts[args.font].textureWidth } ctx.globalCompositeOperation = "source-atop" const gradient = ctx.createLinearGradient(0, 0, 0, height * m) for (let i = 0; i < fonts[args.font].faces.length; i++) { const face = fonts[args.font].faces[i] const end = fonts[args.font].ends[i] gradient.addColorStop(end[0] / height, args.gradientColour0) if (face.length === 2) { gradient.addColorStop(face[0] / height, args.gradientColour0) for (const stop of colours) { gradient.addColorStop(Math.lerp(face[0], face[1], stop[1]) / height, stop[0]) } gradient.addColorStop(face[1] / height, args.gradientColour4) } else { gradient.addColorStop(face[0] / height, args.gradientColour0) gradient.addColorStop(face[1] / height, args.gradientColour0) for (const stop of colours) { gradient.addColorStop(Math.lerp(face[1], face[2], stop[1]) / height, stop[0]) } gradient.addColorStop(face[2] / height, args.gradientColour4) gradient.addColorStop(face[3] / height, args.gradientColour4) } gradient.addColorStop(end[3] / height, args.gradientColour4) } ctx.fillStyle = gradient ctx.fillRect(0, 0, canvas.width * m, height * m) } else { const charHeight = fonts[args.font].faces[0][3] ? fonts[args.font].faces[0][2] - fonts[args.font].faces[0][1] : fonts[args.font].faces[0][1] - fonts[args.font].faces[0][0] const states = [ args.gradientColour1Enabled, args.gradientColour2Enabled, args.gradientColour3Enabled ] const stops = stopConfigs[states[0] << 2 | states[1] << 1 | states[2]] for (let i = 0; i < fonts[args.font].faces.length; i++) { const face = fonts[args.font].faces[i] const end = fonts[args.font].ends[i] const offset = face[3] ? face[1] : face[0] let prev = 0 for (let i = 0, j = 0; i < 5; i++) if (states[i-1] ?? true) { const end = Math.floor((stops[j] ?? 1) * charHeight) ctx.fillStyle = args[`gradientColour${i}`] ctx.fillRect(0, offset + prev, canvas.width, end - prev) prev = end j++ } ctx.fillStyle = args.gradientColour0 ctx.fillRect(0, end[0], canvas.width, (face[3] ? face[1] : end[1]) - end[0]) ctx.fillStyle = args.gradientColour4 ctx.fillRect(0, (face[2] ?? end[2]), canvas.width, end[3] - (face[2] ?? end[2])) } } ctx.fillStyle = `rgba(0, 0, 0, ${(100 - args.edgeBrightness) / 100})` for (const end of fonts[args.font].ends) { ctx.fillRect(0, end[0] * m, canvas.width, end[1] * m - end[0] * m) ctx.fillRect(0, end[2] * m, canvas.width, end[3] * m - end[2] * m) } if (fonts[args.font].overlay && !args.disableFontOverlay) { await loadOverlay(args.font) ctx.globalCompositeOperation = "source-over" ctx.drawImage(fonts[args.font].overlay, 0, 0, canvas.width, canvas.height) } } else if (args.tileable || args.customTexture && args.customTextureType === "tileable") { let base if (args.customTexture) base = await loadImage(args.customTexture) else base = await loadImage(await getTileable(args.tileable, args.tileableVariant)) const { canvas: texture, ctx: tctx } = new CanvasFrame(base.width, base.height) tctx.drawImage(base, -args.tileableXOffset, -args.tileableYOffset) if (args.tileableXOffset) tctx.drawImage(base, base.width - args.tileableXOffset, -args.tileableYOffset) if (args.tileableYOffset) tctx.drawImage(base, -args.tileableXOffset, base.height - args.tileableYOffset) if (args.tileableXOffset && args.tileableYOffset) tctx.drawImage(base, base.width - args.tileableXOffset, base.height - args.tileableYOffset) const width = Math.max(1, Math.round(texture.width * args.tileableScale)) const height = Math.max(1, Math.round(texture.height * args.tileableScale)) ctx.globalCompositeOperation = "source-atop" const uvScaleW = canvas.width / 16 const uvScaleH = canvas.height / 16 await getFontCharacters(args.font) for (const [i, char] of Object.values(fonts[args.font].characters).entries()) { let faceUV, topUV, bottomUV for (const cube of char) { for (const face of Object.values(cube.faces)) { const mapped = (face?.uv ?? face).map((e, i) => Math.round(i % 2 ? e * uvScaleH : e * uvScaleW)) const middle = fonts[args.font].faces.find(e => mapped[1] >= e[0] * res && mapped[1] <= e[e.length - 1] * res && mapped[3] >= e[0] * res && mapped[3] <= e[e.length - 1] * res) if (middle) { if (!faceUV) { faceUV = [Math.min(mapped[0], mapped[2]), middle[0] * res, Math.max(mapped[0], mapped[2]), middle[middle.length - 1] * res, middle.length === 4 ? (middle[1] - middle[0]) * res : null] } else { faceUV[0] = Math.min(faceUV[0], mapped[0], mapped[2]) faceUV[2] = Math.max(faceUV[2], mapped[0], mapped[2]) } } else { const top = fonts[args.font].ends.find(e => mapped[1] >= e[0] * res && mapped[1] <= e[1] * res && mapped[3] >= e[0] * res && mapped[3] <= e[1] * res) if (top) { if (!topUV) { topUV = [Math.min(mapped[0], mapped[2]), top[0] * res, Math.max(mapped[0], mapped[2]), top[1] * res] } else { topUV[0] = Math.min(topUV[0], mapped[0], mapped[2]) topUV[2] = Math.max(topUV[2], mapped[0], mapped[2]) } } else { const bottom = fonts[args.font].ends.find(e => mapped[1] >= e[2] * res && mapped[1] <= e[3] * res && mapped[3] >= e[2] * res && mapped[3] <= e[3] * res) if (bottom) { if (!bottomUV) { bottomUV = [Math.min(mapped[0], mapped[2]), bottom[2] * res, Math.max(mapped[0], mapped[2]), bottom[3] * res] } else { bottomUV[0] = Math.min(bottomUV[0], mapped[0], mapped[2]) bottomUV[2] = Math.max(bottomUV[2], mapped[0], mapped[2]) } } } } } } if (faceUV) { const area = new CanvasFrame(faceUV[2] - faceUV[0], faceUV[3] - faceUV[1]) area.ctx.imageSmoothingEnabled = false const start = faceUV[4] ?? 0 for (let y = start; y < area.height; y += height) { for (let x = 0; x < area.width; x += width) { if (args.tileableRandomRotations || args.tileableRandomMirroring) { drawRotatedMirrored(area.ctx, texture, x, y, width, height, Math.floor(random(i, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring) } else { area.ctx.drawImage(texture, x, y, width, height) } } } if (start !== 0) { for (let y = start; y > 0; y -= height) { for (let x = 0; x < area.width; x += width) { if (args.tileableRandomRotations || args.tileableRandomMirroring) { drawRotatedMirrored(area.ctx, texture, x, y - height, width, height, Math.floor(random(i + 100, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring) } else { area.ctx.drawImage(texture, x, y - height, width, height) } } } } ctx.fillStyle = "#fff" ctx.fillRect(faceUV[0], faceUV[1], area.width, area.height) ctx.drawImage(area.canvas, faceUV[0], faceUV[1]) } if (topUV) { const area = new CanvasFrame(topUV[2] - topUV[0], topUV[3] - topUV[1]) area.ctx.imageSmoothingEnabled = false for (let y = area.height; y > 0; y -= height) { for (let x = 0; x < area.width; x += width) { if (args.tileableRandomRotations || args.tileableRandomMirroring) { drawRotatedMirrored(area.ctx, texture, x, y - height, width, height, Math.floor(random(i + 200, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring) } else { area.ctx.drawImage(texture, x, y - height, width, height) } } } ctx.fillStyle = "#fff" ctx.fillRect(topUV[0], topUV[1], area.width, area.height) ctx.drawImage(area.canvas, topUV[0], topUV[1]) ctx.fillStyle = `rgba(0, 0, 0, ${(100 - args.edgeBrightness) / 100})` ctx.fillRect(topUV[0], topUV[1], area.width, area.height) } if (bottomUV) { const area = new CanvasFrame(bottomUV[2] - bottomUV[0], bottomUV[3] - bottomUV[1]) area.ctx.imageSmoothingEnabled = false for (let y = 0; y < area.height; y += height) { for (let x = 0; x < area.width; x += width) { if (args.tileableRandomRotations || args.tileableRandomMirroring) { drawRotatedMirrored(area.ctx, texture, x, y, width, height, Math.floor(random(i + 300, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring) } else { area.ctx.drawImage(texture, x, y, width, height) } } } ctx.fillStyle = "#fff" ctx.fillRect(bottomUV[0], bottomUV[1], area.width, area.height) ctx.drawImage(area.canvas, bottomUV[0], bottomUV[1]) ctx.fillStyle = `rgba(0, 0, 0, ${(100 - args.edgeBrightness) / 100})` ctx.fillRect(bottomUV[0], bottomUV[1], area.width, area.height) } } if (fonts[args.font].overlay && !args.disableFontOverlay) { ctx.globalCompositeOperation = "source-over" await loadOverlay(args.font) ctx.drawImage(fonts[args.font].overlay, 0, 0, canvas.width, canvas.height) } } ctx.globalCompositeOperation = "copy" ctx.filter =`hue-rotate(${args.hue}deg) saturate(${args.saturation}%) brightness(${args.brightness}%) contrast(${args.contrast}%` ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height) ctx.filter ="hue-rotate(0deg) saturate(100%) brightness(100%) contrast(100%)" ctx.globalCompositeOperation = args.blend ctx.fillStyle = args.colour ctx.globalAlpha = args.colourOpacity / 100 ctx.fillRect(0, 0, canvas.width, canvas.height) ctx.globalAlpha = 1 ctx.globalCompositeOperation = "destination-in" ctx.drawImage(img, 0, 0, canvas.width, canvas.height) if (args.customEdge) { ctx.globalCompositeOperation = "source-atop" ctx.fillStyle = args.customEdgeColour for (const row of fonts[args.font].ends) { ctx.fillRect(0, row[0] * m, canvas.width, (row[1] - row[0]) * m) ctx.fillRect(0, row[2] * m, canvas.width, (row[3] - row[2]) * m) } } if (args.customOverlay || (args.overlay && args.overlay !== "none")) { const overlay = await loadImage(args.customOverlay ?? await getTexture(fonts[args.font].overlays, args.overlay)) const overlayCanvas = new CanvasFrame(overlay.width, overlay.height) overlayCanvas.ctx.drawImage(overlay, 0, 0) overlayCanvas.ctx.globalCompositeOperation = args.overlayColourBlend overlayCanvas.ctx.fillStyle = args.overlayColour overlayCanvas.ctx.fillRect(0, 0, overlay.width, overlay.height) overlayCanvas.ctx.globalCompositeOperation = "destination-in" overlayCanvas.ctx.drawImage(overlay, 0, 0) if (overlay.width > canvas.width) { const frame = new CanvasFrame(overlay.width, overlay.height) frame.ctx.imageSmoothingEnabled = false frame.ctx.drawImage(canvas, 0, 0, overlay.width, overlay.height) canvas = frame.canvas ctx = frame.ctx m = canvas.width / fonts[args.font].textureWidth } ctx.globalCompositeOperation = args.overlayBlend ctx.imageSmoothingEnabled = false ctx.globalAlpha = args.overlayOpacity / 100 ctx.drawImage(overlayCanvas.canvas, 0, 0, canvas.width, canvas.height) ctx.globalAlpha = 1 } if (args.customBorder) { ctx.globalCompositeOperation = "source-atop" ctx.fillStyle = args.customBorderColour ctx.fillRect(0, fonts[args.font].border * m, canvas.width, canvas.height - fonts[args.font].border * m) } if (args.fadeToBorder) { if (canvas.width < fonts[args.font].textureWidth * 4) { const newCanvas = new CanvasFrame(fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4) newCanvas.ctx.imageSmoothingEnabled = false newCanvas.ctx.drawImage(canvas, 0, 0, fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4) canvas = newCanvas.canvas ctx = newCanvas.ctx m = canvas.width / fonts[args.font].textureWidth } ctx.globalCompositeOperation = "source-atop" const height = fonts[args.font].ends[fonts[args.font].ends.length - 1][3] const border = ctx.getImageData(0, fonts[args.font].border * m, 1, 1).data const gradient = ctx.createLinearGradient(0, 0, 0, height * m) for (const stop of fonts[args.font].ends) { gradient.addColorStop(stop[0] / height, `rgb(${border[0]},${border[1]},${border[2]})`) gradient.addColorStop(stop[1] / height, `rgb(${border[0]},${border[1]},${border[2]}, 0)`) gradient.addColorStop(stop[2] / height, `rgb(${border[0]},${border[1]},${border[2]}, 0)`) gradient.addColorStop(stop[3] / height, `rgb(${border[0]},${border[1]},${border[2]})`) } ctx.fillStyle = gradient ctx.fillRect(0, 0, canvas.width * m, height * m) } if (args.canvas) return canvas if (args.three) { const texture = await new Promise(fulfil => new THREE.TextureLoader().load(canvas.toDataURL(), fulfil)) texture.colorSpace = THREE.SRGBColorSpace texture.magFilter = THREE.NearestFilter return texture } return new Texture({ name: `${args.name ?? fonts[args.font].type === "shape" ? args.font : makeName(args.text)}.png`, render_sides: "front", uv_width: fonts[args.font].textureWidth, uv_height: fonts[args.font].textureHeight }).fromDataURL(canvas.toDataURL()) } function makeWord(text, offset, parent, args) { const word = new Group(fonts[args.font].type === "shape" ? args.font : args.name ?? makeName(text)) word.addTo(parent).init() for (const char of text) { if (fonts[args.font].characters[char]) { const [character, newOffset] = makeCharacter(char, offset, word, args, text.length) offset = newOffset } } if (fonts[args.font].autoBorder) { offset += 4 let minX = Infinity let minY = Infinity let minZ = Infinity let maxX = -Infinity let maxY = -Infinity let maxZ = -Infinity for (const group of word.children) for (const cube of group.children) { minX = Math.min(minX, cube.from[0], cube.to[0]) minY = Math.min(minY, cube.from[1], cube.to[1]) minZ = Math.min(minZ, cube.from[2], cube.to[2]) maxX = Math.max(maxX, cube.from[0], cube.to[0]) maxY = Math.max(maxY, cube.from[1], cube.to[1]) maxZ = Math.max(maxZ, cube.from[2], cube.to[2]) } const size = 2 * (args.scale[0] + args.scale[1]) / 2 * (args.type === "bottom" ? 0.75 : args.type === "small" ? 0.35 : 1) const border = new Cube({ name: "border", from: [maxX + size, maxY + size, maxZ + size], to: [minX - size, minY - size, minZ - size] }) const uv = [0, fonts[args.font].border, 1, fonts[args.font].border + 1] for (const face of Object.values(border.faces)) { face.texture = args.texture face.uv = uv } border.addTo(word).init() args.elements.push(border) } return [word, offset, args.lastCharacter] } const charMap = { "┫": "open_terminator", "┣": "close_terminator", " ": "space", "​": "spacer" } function makeCharacter(char, offset, parent, args, wordLength) { if (!args.disableCharacterShifting && args.lastCharacter && fonts[args.font].shifts?.[args.lastCharacter + char]) { offset -= fonts[args.font].shifts[args.lastCharacter + char] } let minX = Infinity let maxX = -Infinity let minZ = Infinity let maxZ = -Infinity const cubes = [] for (const element of fonts[args.font].characters[char]) { if (!element.parsed) { element.parsed = true for (const [direction, uv] of Object.entries(element.faces)) { element.faces[direction] = { uv } } } const cube = new Cube(element) if (char === "​") { if (cube.to[0] > cube.from[0]) { cube.to[0] += args.spacerWidth } else { cube.from[0] += args.spacerWidth } } if (args.type === "small") { if (cube.to[2] > cube.from[2]) { cube.to[2] -= 6 } else { cube.from[2] -= 6 } } minX = Math.min(minX, cube.from[0], cube.to[0]) maxX = Math.max(maxX, cube.from[0], cube.to[0]) minZ = Math.min(minZ, cube.from[2], cube.to[2]) maxZ = Math.max(maxZ, cube.from[2], cube.to[2]) cube.autouv = 0 for (const key in cube.faces) { const readFace = element.faces[key] const newFace = cube.faces[key] if (readFace === undefined) { newFace.texture = null newFace.uv = [0, 0, 0, 0] } else { newFace.texture = args.texture newFace.uv.forEach((n, i) => { const size = i % 2 === 0 ? fonts[args.font].textureWidth : fonts[args.font].textureHeight newFace.uv[i] = readFace.uv[i] * size / 16 }) } } cubes.push(cube) } let character if (wordLength === 1) { character = parent } else { character = new Group(charMap[char] ? charMap[char] : makeName(char)) character.addTo(parent).init() } const heightOffset = fonts[args.font].height for (const cube of cubes) { cube.to[0] -= offset + maxX cube.from[0] -= offset + maxX cube.to[2] -= minZ cube.from[2] -= minZ if (args.type === "bottom") { cube.to[1] *= 2 cube.from[1] *= 2 cube.to[1] -= args.row * (heightOffset * 2 + 4) + args.rowSpacing * args.row + heightOffset * 2 + 18 cube.from[1] -= args.row * (heightOffset * 2 + 4) + args.rowSpacing * args.row + heightOffset * 2 + 18 cube.to = cube.to.map(e => e * 0.75) cube.from = cube.from.map(e => e * 0.75) cube.to[2] -= 8 cube.from[2] -= 8 if (!fonts[args.font].flat) { if (cube.to[2] > cube.from[2]) { cube.to[2] += 24 } else { cube.from[2] += 24 } } } else if (args.type === "small") { cube.to[2] -= (maxZ - minZ) cube.from[2] -= (maxZ - minZ) cube.to[0] *= 0.35 cube.from[0] *= 0.35 cube.to[1] *= 0.35 cube.from[1] *= 0.35 cube.to[2] *= 0.35 cube.from[2] *= 0.35 cube.to[1] -= args.row * (heightOffset * 0.35) + args.rowSpacing * args.row + heightOffset * 0.35 cube.from[1] -= args.row * (heightOffset * 0.35) + args.rowSpacing * args.row + heightOffset * 0.35 } else { cube.to[2] -= (maxZ - minZ) / 2 cube.from[2] -= (maxZ - minZ) / 2 cube.to[1] += args.row * (heightOffset + 4) + args.rowSpacing * args.row cube.from[1] += args.row * (heightOffset + 4) + args.rowSpacing * args.row } cube.to = cube.to.map((e, i) => e * args.scale[i]) cube.from = cube.from.map((e, i) => e * args.scale[i]) cube.addTo(character).init() args.elements.push(cube) } args.lastCharacter = char return [character, offset + (maxX - minX + args.characterSpacing * args.scale[0])] } const makeName = str => str.replace(/\s/g, "_").replace(/😳/g, "a").replace(/😩/g, "'").replace(/┫|┣|\u200b/g, "") function selectHandler() { if (Mode.selected.id === "minecraft_title_render") Canvas.scene.traverseVisible(e => { if (e.type === "Line") e.visible = false }) } async function getFontTextures(font, force) { if (typeof fonts[font].textures === "object") { if (!force) return } else { fonts[font].textures = {} } if (!fonts[font].overlays?.none) fonts[font].overlays = { none: { name: "None" } } const data = await fetchData(`${fonts[font].type}s/${font}/textures.json`, () => ({ textures: {}, overlays: {} })) for (const [id, texture] of Object.entries(data.textures)) { texture.name ??= titleCase(id) texture.texture = `${fonts[font].type}s/${font}/textures/${id}.png` if (texture.variants) for (const [id, variant] of Object.entries(texture.variants)) { variant.name ??= titleCase(id) variant.texture = `${fonts[font].type}s/${font}/textures/${id}.png` } fonts[font].textures[id] = texture } for (const [id, overlay] of Object.entries(data.overlays)) { overlay.name ??= titleCase(id) overlay.texture = `${fonts[font].type}s/${font}/overlays/${id}.png` fonts[font].overlays[id] = overlay } const flat = stats.find(e => e.id === `${font}.flat`) if (flat) flat.count = Infinity else stats.push({ id: `${font}.flat`, count: Infinity }) stats.push({ id: `${font}.none`, count: Infinity }) const mainId = Object.keys(fonts[font].textures)[1] if (mainId) { const main = stats.find(e => e.id === `${font}.${mainId}`) if (main) main.count = 999999999 else stats.push({ id: `${font}.${mainId}`, count: 999999999 }) } } async function getFontCharacters(id) { if (typeof fonts[id].characters === "object") return fonts[id].characters = await fetchData(`fonts/${id}/characters.json`) } function titleCase(str) { return str.replace(/_|-/g, " ").replace(/\w\S*/g, str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()) } function updateColour(dialog, v, c) { dialog.component.data[v] = c.toHexString() dialog.content_vue.updatePreview() } const colourInput = (dialog, v) => ({ preferredFormat: "hex", color: dialog.component.data[v], showAlpha: false, showInput: true, move: c => updateColour(dialog, v, c), change: c => updateColour(dialog, v, c), hide: c => updateColour(dialog, v, c) }) function getTextureFromFile() { return new Promise(fulfil => { Filesystem.importFile({ title: "Select Minecraft title texture", type: "PNG Texture", readtype: "buffer", extensions: ["png"] }, async files => { try { const texture = await loadImage(files[0].content) fulfil(texture) } catch { Blockbench.showQuickMessage("Unable to load texture") fulfil() } }) }).catch(() => undefined) } function getDefaultDialogArgs() { const args = Object.fromEntries(Object.values(variables).flat().flatMap(Object.entries)) args.connection = connection args.tab = 0 args.text = "" args.fonts = fonts args.fontList = [] args.types = { top: "Top", bottom: "Bottom", small: "Small" } args.textures = [] args.tileables = tileables args.tileablesList = [] args.overlays = [] args.blends = { multiply: "Multiply", color: "Colour", lighter: "Lighter", screen: "Screen", overlay: "Overlay", "soft-light": "Soft Light", hue: "Hue", saturation: "Saturation", difference: "Difference", "source-over": "Source Over" } args.building = false args.build = false args.updating = false args.update = false args.lastTextureSource = null args.textureSearch = "" args.tileableWidth = 0 args.tileableHeight = 0 return args } const getArgs = (vue, three) => { const args = Object.fromEntries(Object.values(variables).flat().flatMap(Object.entries).map(([key]) => [key, vue[key]])) args.texture = vue.textureSource === "gradient" || vue.textureSource === "tileable" || (vue.textureSource === "file" && vue.customTexture) || (!vue.customTexture && vue.textureSource === "file" && ["gradient", "tileable"].includes(vue.lastTextureSource)) ? "flat" : vue.texture args.variant = vue.textureSource === "premade" || (!vue.customTexture && vue.textureSource === "file" && vue.lastTextureSource === "premade") ? vue.variant : null args.tileable = vue.textureSource === "tileable" || (!vue.customTexture && vue.textureSource === "file" && vue.lastTextureSource === "tileable") ? vue.tileable : null args.tileableVariant = vue.textureSource === "tileable" || (!vue.customTexture && vue.textureSource === "file" && vue.lastTextureSource === "tileable") ? vue.tileableVariant : null args.customTexture = vue.textureSource === "file" ? vue.customTexture : null args.customOverlay = vue.overlaySource === "file" ? vue.customOverlay : null if (vue.textureSource === "gradient" || (!vue.customTexture && vue.textureSource === "file" && vue.lastTextureSource === "gradient")) { for (let x = 0; x < 5; x++) { args["gradientColour" + x] = vue["gradientColour" + x] } } else { for (let x = 0; x < 5; x++) { args["gradientColour" + x] = null } } args.three = three return args } function areObjectsEqual(obj1, obj2) { const keys1 = Object.keys(obj1) const keys2 = Object.keys(obj2) if (keys1.length !== keys2.length) return false for (let key of keys1) { if (!obj2.hasOwnProperty(key) || obj1[key]?.toString() !== obj2[key]?.toString()) { return false } } return true } function loadImage(b64) { const img = new Image() return new Promise((fulfil, reject) => { img.onload = () => fulfil(img) img.onerror = reject if (b64 instanceof ArrayBuffer) { img.src = URL.createObjectURL(new Blob([b64], { type: "image/png" })) } else { img.src = b64 } }) } function loadRenderAngle() { Preview.selected.loadAnglePreset(titleCameraAngle) } const gcd = (a, b) => b === 0 ? a : gcd(b, a % b) function getAspectRatio(w, h) { const divisor = gcd(w, h) return [w / divisor, h / divisor] } function getFromAspect(aW, aH, w, h, isWidth) { let width, height if (isWidth) { width = w height = Math.floor(w * aH / aW) if (height > 4096) { height = 4096 width = Math.floor(4096 * aW / aH) } } else { height = h width = Math.floor(h * aW / aH) if (width > 4096) { width = 4096 height = Math.floor(4096 * aH / aW) } } return [width, height] } async function getTileable(id, variant) { const data = variant ? tileables[id].variants[variant] : tileables[id] if (!data.texture) { data.texture = await new Promise(async fulfil => { const reader = new FileReader() reader.onload = e => fulfil(e.target.result) reader.readAsDataURL(new Blob([await fetchData(`/tileables/${data.path ? data.path + "/" : ""}${variant ?? id}.png`).then(e => e.arrayBuffer())], { type: "image/png" })) }).catch(() => {}) } return data.texture } async function loadOverlay(id) { if (typeof fonts[id].overlay === "boolean") { fonts[id].overlay = await loadImage(await getTexture(null, null, null, `fonts/${id}/textures/overlay.png`)) } } function drawRotatedMirrored(ctx, img, x, y, w, h, r, mirror) { ctx.save() ctx.translate(x + w / 2, y + h / 2) ctx.rotate(Math.degToRad(r)) if (mirror) ctx.scale(-1, 1) ctx.drawImage(img, -(w / 2), -(h / 2), w, h) ctx.restore() } const fract = n => n - Math.floor(n) function random(x, y, z) { x = fract(x * 0.1031) y = fract(y * 0.1031) z = fract(z * 0.1031) const res = x * (z + 31.32) + y * (y + 31.32) + z * (x + 31.32) return fract((x + y + res * 2) * (z + res)) } })() ================================================ FILE: plugins/missing_texture_highlighter.js ================================================ (function() { var flash_action; Plugin.register('missing_texture_highlighter', { title: 'Missing Texture Highlighter', icon: 'flash_on', author: 'JannisX11', description: 'Highlights missing textures by flashing them.', version: '0.1.1', variant: 'both', onload() { const mt_highlighter = { i: 0, start: function() { clearInterval(mt_highlighter.interval); mt_highlighter.i = 0; mt_highlighter.interval = setInterval(mt_highlighter.flash, 200); mt_highlighter.flash(); }, flash: function() { var fc = mt_highlighter.i; if (fc > 16) { x = 0; clearInterval(mt_highlighter.interval); } Canvas.emptyMaterials.forEach((m, i) => { let brightness = (fc%2) ? settings.brightness.value / 50 : 2.5; m.uniforms.BRIGHTNESS.value = brightness; }) mt_highlighter.i++; } } flash_action = new Action({ id: 'flash_missing_textures', name: 'Flash Missing Textures', category: 'textures', icon: 'flash_on', click() { mt_highlighter.start(); } }); MenuBar.addAction(flash_action, 'filter') }, onunload() { flash_action.delete(); } }); })() ================================================ FILE: plugins/mod_utils.js ================================================ /** MIT License Copyright (c) 2022 JTK222 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. **/ (function() { var mappingsKey = "mod_utils.has_mappings"; var omitVoxelShapesGroup = "mod_utils.omitVoxelShapesGroup"; function isValidVersion(){ var versions = Blockbench.version.split("."); return versions[0] >= 3 && versions [1] >= 1; } function loadZipToJson(importType){ /*Undo.initEdit({ outliner: true, uv_mode: true, elements: Outliner.elements, textures: textures });*/ Blockbench.import({ type: importType.extension + ' File', extensions: [importType.extension], readtype: 'binary' }, (files) => { let data = files[0].content; var loadedZip = new JSZip().loadAsync(data); loadedZip.then(zip => { zip.file(importType.file).async("string") .then(json => { console.log(importType); importType.import(json); }); if(importType == ImportTypeEnum.TBL){ if(zip.file(importType.texture)) zip.file(importType.texture).async("base64").then(img => { var texture = new Texture().fromDataURL('data:image/png;base64,' + img); texture.add(); }); }else{ if(zip.file(importType.texture)) zip.file(importType.texture).forEach(pr => { pr.async("base64").then(img => { var texture = new Texture().fromDataURL('data:image/png;base64,' + img); texture.add(); }); }); } }); }); //Undo.finishEdit("Model Import"); } var ImportTypeEnum = { TBL: { extension: 'tbl', file: 'model.json', texture: 'texture.png', import: loadTabulaModel }, TBL2: { extension: 'tbl', file: 'model.json', texture: 'texture.png', import: null }, TCN: { extension: 'tcn', file: 'model.xml', texture: /\.png/, import: loadTechneModel } } var AxisEnum = { X: 0, Y: 1, Z: 2, size: 3, properties: { 0: {name: "X-Axis", value: 0, code: "x"}, 1: {name: "Y-Axis", value: 1, code: "y"}, 2: {name: "Z-Axis", value: 2, code: "z"}, } } var Mappings = { mojmaps: { createCube: "Block.box", combine: "VoxelShapes.join", booleanFunction: "IBooleanFunction", key: "mod_utils.selected_mappings.mojmaps", }, mcp: { createCube: "Block.makeCuboidShape", combine: "VoxelShapes.combineAndSimplify", booleanFunction: "IBooleanFunction", key: "mod_utils.selected_mappings.mcp", }, yarn: { createCube: "Block.createCuboidShape", combine: "VoxelShapes.combineAndSimplify", booleanFunction: "BooleanBiFunction", key: "mod_utils.selected_mappings.yarn", }, parchment: { createCube: "Block.box", combine: "Shapes.join", booleanFunction: "BooleanOp", key: "mod_utils.selected_mappings.parchment", }, }; /** ---------- Help ---------- */ var helpDialog = new Dialog({ id: 'mod_utils_help_dialog', title: 'Help - Mod Utils', width: 800, lines: [ `

    In order to use the VoxelShape exporter, you first need to create a new Group, called "VoxelShapes". All cubes that you create within this group, will be added to the voxelShape trough the OR BooleanFunction. Additionally you can add sub groups with the name equaling a "$" and a BooleanFunction as shown in the image bellow (Ex: $and). The first cube in such a group represents the red cube, all other ones will be combined with an OR BooleanFunction first.

    There is an advanced settings menu for the VoxelShape exporter that allows you to disable the requirement of the "VoxelShapes" group. This option is only designed to be used for rapid prototyping and should not be used in production. For the best performance, you should be creating a representation of your VoxelShape in a separate model and use the BooleanFunctions to create the proper shape rather than ORing all of the cubes in your model together. If not using BooleanFunctions, use the "VoxelShapes" group to make sure that only the cubes you need are being used for the VoxelShape. The less cubes, the better.

    In order to import a Tabula Model, you need to create a new Modded Entity. Now the Point "Import Tabula Model (.tbl)" should be available in your import menu.

    Techne Import is only Available in Modded Entity Mode. A new Menu entry under "File > Import > Import Techne Model (.tcn)" should be available.

    ` ], singleButton: true }); var modUtilsHelp = new Action({ id: 'mod_utils.help', name: "Mod Utils", icon: 'help', description: 'Opens a Small Help window', category: 'help', condition: () => true, click: function (event) { helpDialog.show(); } }); /** ---------- Import - Techne ---------- */ var importTechne = new Action({ id: 'import_techne', name: "Import Techne Model (.tcn)", icon: 'flip_to_back', description: 'Import a Techne Model', category: 'file', condition: () => Format.id === Formats.modded_entity.id, click: function (event) { loadZipToJson(ImportTypeEnum.TCN); } }); function loadTechneModel(data) { reader = new DOMParser(); var xml = reader.parseFromString(data, "text/xml"); var model = xml.getElementsByTagName("Model")[0]; name = xml.getElementsByTagName("ProjectName")[0].childNodes[0].nodeValue; textureSizes = xml.getElementsByTagName("TextureSize")[0].childNodes[0].nodeValue; Project.name = name; Project.texture_width = textureSizes.slice(0, textureSizes.indexOf(",")); Project.texture_height = textureSizes.slice(textureSizes.indexOf(",") + 1, textureSizes.length); var shapes = model.getElementsByTagName("Geometry")[0].getElementsByTagName("Shape"); var rootGroup = new Group("root").addTo(); rootGroup.init(); for(var i = 0; i < shapes.length; i++){ var shape = shapes[i]; offset = JSON.parse("[" + shape.getElementsByTagName("Offset")[0].childNodes[0].nodeValue + "]"); position = JSON.parse("[" + shape.getElementsByTagName("Position")[0].childNodes[0].nodeValue + "]"); position[1] = 24 - position[1]; rotation = JSON.parse("[" + shape.getElementsByTagName("Rotation")[0].childNodes[0].nodeValue + "]"); size = JSON.parse("[" + shape.getElementsByTagName("Size")[0].childNodes[0].nodeValue + "]"); uv = JSON.parse("[" + shape.getElementsByTagName("TextureOffset")[0].childNodes[0].nodeValue + "]"); mirror = shape.getElementsByTagName("TextureOffset")[0].childNodes[0].nodeValue === "True"; var group = new Group( { name: shape.getAttribute("name"), origin: [position[0], position[1], position[2]], rotation: [-rotation[0], rotation[1], rotation[2]], } ).addTo(rootGroup); group.init(); var cube = new Cube( { mirror_uv: mirror, name: shape.getAttribute("name"), from: [position[0] + offset[0], position[1] - size[1] - offset[1], position[2] + offset[2]], to: [position[0] + size[0] + offset[0], position[1] - offset[1], position[2] + offset[2] + size[2]], uv_offset: [uv[0], uv[1]], } ).addTo(group); cube.init(); } Canvas.updateAll() } /** ---------- Import - Tabula ---------- */ var importTabula = new Action({ id: 'import_tabula', name: "Import Tabula Model (.tbl)", icon: 'flip_to_back', description: 'Import a Tabula Model', category: 'file', condition: () => Format.id === Formats.modded_entity.id, click: function (event) { loadZipToJson(ImportTypeEnum.TBL); } }); function loadTabulaModel(data) { Undo.initEdit({ outliner: true, bitmap: true, uv_mode: true }); var json = JSON.parse(data); var version = json.projVersion || 0; switch(version){ case 5: Project.name = json.modelName; Project.texture_width = json.texWidth; Project.texture_height = json.texHeight; json.parts.forEach(part => readTblBone(part, version, null)); Blockbench.showMessageBox({ title: "Warning", message: "You imported a version 5 Tabula Model.\nThis Format has some functions which are not supported by Blockbench, for this reason some things might have broken on import." }); break; default: Project.name = json.modelName; Project.texture_width = json.textureWidth; Project.texture_height = json.textureHeight; var rootGroup = new Group( { name: "root", origin: [0, 24, 0], rotation: [0, 0, 0], } ).addTo(); rootGroup.init(); json.cubes.forEach(cube => readTblBone(cube, version, rootGroup)); break; } Undo.finishEdit('Import Tabula Model'); Canvas.updateAll(); } function readTblBone(json, version, parentGroup){ var group; switch(version){ case 5: group = new Group({ name: json.name, origin: [(parentGroup == null ? 0 : parentGroup.origin[0]) + json.rotPX, (parentGroup == null ? + 24 : parentGroup.origin[1]) - json.rotPY, (parentGroup == null ? 0 : parentGroup.origin[2]) + json.rotPZ], rotation: [-json.rotAX, json.rotAY, -json.rotAZ] }); break; case 2: group = new Group({ name: json.name, origin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]], rotation: [-json.rotation[0], json.rotation[1], -json.rotation[2]], }); break; default: group = new Group({ name: json.name, origin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]], rotation: [-json.rotation[0], json.rotation[1], json.rotation[2]], }); break; } if(parentGroup) group.addTo(parentGroup); group.init(); switch(version){ case 5: if(json.children) json.children.forEach(bone => readTblBone(bone, version, group)); if(json.boxes) json.boxes.forEach(cube => readTblCube(cube, version, group, json)); break; default: if(json.children) json.children.forEach(bone => readTblBone(bone, version, group)); readTblCube(json, version, group); break; } } function readTblCube(json, version, parentGroup, extra){ var cube; switch(version){ case 5: var pos = [json.posX, json.posY, json.posZ]; var dim = [json.dimX, json.dimY, json.dimZ]; cube = new Cube({ mirror_uv: extra.mirror, name: json.name, from: [parentGroup.origin[0] + pos[0], parentGroup.origin[1] - pos[1] - dim[1], parentGroup.origin[2] + pos[2]], to: [parentGroup.origin[0] + pos[0] + dim[0], parentGroup.origin[1] - pos[1], parentGroup.origin[2] + pos[2] + dim[2]], uv_offset: [extra.texOffX + json.texOffX, extra.texOffY + json.texOffY] }); break; default: cube = new Cube({ mirror_uv: json.txMirror, name: json.name, from: [parentGroup.origin[0] + json.offset[0], parentGroup.origin[1] - json.offset[1] - json.dimensions[1], parentGroup.origin[2] + json.offset[2]], to: [parentGroup.origin[0] + json.offset[0] + json.dimensions[0], parentGroup.origin[1] - json.offset[1], parentGroup.origin[2] + json.offset[2] + json.dimensions[2]], uv_offset: [json.txOffset[0], json.txOffset[1]], }); break; } if(parentGroup) cube.addTo(parentGroup); cube.init(); } /** ---------- Import Tabula Model v2 --------- */ var importTabula2Obj = (function (){ function loadTabulaModel2(data) { Undo.initEdit({ outliner: true, bitmap: true, uv_mode: true, }); var json = JSON.parse(data); var version = json.projVersion || 0; if(version != 2){ Blockbench.showMessageBox({ title: "Warning", message: "You are importing an unsupported version of Tabula files, if you experience any issues, please report them and provide your model file so we can try to fix them." }); } Project.name = json.modelName; Project.texture_width = json.textureWidth; Project.texture_height = json.textureHeight; var rootGroup = new Group( { name: json.modelName, origin: [0, 24, 0], rotation: [0, 0, 0], } ).addTo(); rootGroup.init(); json.cubes.forEach(cube => parseTbl(cube, version, rootGroup)); Undo.finishEdit('Import Tabula Model', { outliner: true, bitmap: true, uv_mode: true, }); Canvas.updateAll(); } function parseTbl(json, version, parentGroup){ if((json.children && json.children.length > 1) || !parentGroup){ var group = null; switch(version){ case 2: group = new Group({ name: json.name, origin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]], rotation: [-json.rotation[0], json.rotation[1], -json.rotation[2]], }); if(parentGroup) group.addTo(parentGroup); group.init(); createCube(json, group, false); if(json.children) json.children.forEach(bone => parseTbl(bone, version, group)); break; default: break; } }else{ createCube(json, parentGroup, true); } } function createCube(json, parentGroup, useRotation){ var cubeObj = null; if(!useRotation) cubeObj = { mirror_uv: json.txMirror, name: json.name, from: [parentGroup.origin[0] + json.offset[0], parentGroup.origin[1] - json.offset[1] - json.dimensions[1], parentGroup.origin[2] + json.offset[2]], to: [parentGroup.origin[0] + json.offset[0] + json.dimensions[0], parentGroup.origin[1] - json.offset[1], parentGroup.origin[2] + json.offset[2] + json.dimensions[2]], uv_offset: [json.txOffset[0], json.txOffset[1]], origin: [parentGroup.origin[0], parentGroup.origin[1], parentGroup.origin[2]], }; else cubeObj = { mirror_uv: json.txMirror, name: json.name, from: [ parentGroup.origin[0] + json.position[0] + json.offset[0], parentGroup.origin[1] - json.position[1] - json.offset[1] - json.dimensions[1], parentGroup.origin[2] + json.position[2] + json.offset[2] ], to: [ parentGroup.origin[0] + json.position[0] + json.offset[0] + json.dimensions[0], parentGroup.origin[1] - json.position[1] - json.offset[1], parentGroup.origin[2] + json.position[2] + json.offset[2] + json.dimensions[2] ], uv_offset: [json.txOffset[0], json.txOffset[1]], origin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]], rotation: [-json.rotation[0], json.rotation[1], -json.rotation[2]], }; var cube = new Cube(cubeObj); if(parentGroup) cube.addTo(parentGroup); cube.init(); } return { act: new Action({ id: 'import_tabula_2', name: "Import Tabula Model - Better but Experimental (.tbl)", icon: 'flip_to_back', description: 'Experimental - Import a Tabula Model, may produce a better result, but does not support all tabula file format versions. If you have broken results please report those issues.', category: 'file', condition: () => Format.id === Formats.modded_entity.id, click: function (event) { loadZipToJson(ImportTypeEnum.TBL2); } }), baseFunc: loadTabulaModel2, }; })(); var importTabula2 = importTabula2Obj.act; ImportTypeEnum.TBL2.import = importTabula2Obj.baseFunc; /** ---------- Export - VoxelShape ---------- */ var exportVoxelShapeAction = new Action({ id: "export_voxelshape", name: "Export Voxelshape (1.14+ Modded Minecraft)", icon: "flip_to_back", description: "Export a VoxelShape (Block Hitbox 1.14+ Modded only)", category: "file", condition: () => Format.id === Formats.java_block.id, click: function (event) { if (event.shiftKey || !Blockbench.hasFlag(mappingsKey)) { resetFlags(); exportVoxelShapeDialog.show(); } else exportVoxelShape(undefined); }, }); var exportVoxelShapeDialog = new Dialog({ id: "export_voxelshape", title: "VoxelShape Exporter", buttons: ["Confirm", "Cancel", "Advanced Settings"], confirmIndex: 0, cancelIndex: 1, form: { mappings: { label: "Mappings", type: "select", options: { mojmaps: "MojMaps (Mojang's Official Mappings)", mcp: "MCP", yarn: "Yarn", parchment: "Parchment", }, value: "mojmaps", description: "Select the mappings being used by your development environment", }, rememberSettings: { label: "Remember settings", type: "checkbox", value: true, description: "This will remember these settings and you won't be prompted again.\nTo access this menu again, hold shift while selecting the export option.", }, }, onConfirm: function (formData) { this.hide(); if (formData.rememberSettings) { Blockbench.addFlag(mappingsKey); Blockbench.addFlag(Mappings[formData.mappings].key); } exportVoxelShape(Mappings[formData.mappings]); }, onButton(index, event) { if (index !== 2) return; var advancedSettingsDialog = new Dialog({ id: "voxelshape_advanced_settings", title: "Advanced Settings", lines: [ `

    WARNING

    Disabling this setting can and will severely harm your model's performance. This setting should only be used for basic models and/or for prototyping. For the proper way of doing this, please look at the help section.


    `, ], form: { onlyIncludeVoxelShapesGroup: { label: '"VoxelShapes" required', type: "checkbox", value: !Blockbench.hasFlag(omitVoxelShapesGroup), description: 'Only the cubes in the group named "VoxelShapes" will be used.\nIf not enabled, all cubes in the project will be used.', }, }, part_order: ["lines", "form", "component"], onConfirm(formData) { if (!formData.onlyIncludeVoxelShapesGroup) Blockbench.addFlag(omitVoxelShapesGroup); else Blockbench.removeFlag(omitVoxelShapesGroup); exportVoxelShapeDialog.show(); }, onCancel() { exportVoxelShapeDialog.show(); } }) advancedSettingsDialog.show() } }); function exportVoxelShape(mappings) { if (mappings === undefined) { if (Blockbench.hasFlag(Mappings.mojmaps.key)) { mappings = Mappings.mojmaps; } else if (Blockbench.hasFlag(Mappings.mcp.key)) { mappings = Mappings.mcp; } else if (Blockbench.hasFlag(Mappings.yarn.key)) { mappings = Mappings.yarn; } else if (Blockbench.hasFlag(Mappings.parchment.key)) { mappings = Mappings.parchment; } else { exportVoxelShapeDialog.show(); return; } } var output; if (!Blockbench.hasFlag(omitVoxelShapesGroup)) { var voxelShapeGroup = searchVoxelShapeGroup(Outliner.elements); if (voxelShapeGroup === undefined) { Blockbench.showMessageBox({ buttons: ["ok"], confirm: 0, title: "Error - VoxelShape Export", message: 'You are missing the "VoxelShapes" group,\nwhich is required to export a voxel Shape.\nCheck out the Help menu for further instructions.', }); resetFlags() return; } output = generateShape(voxelShapeGroup, mappings); } else { output = generateShape(undefined, mappings) } //code repurposed from CodeView plugin outputViewDialog = new Dialog({ title: 'VoxelShape Output', id: 'output_view', resizable: true, width: 650, singleButton: true, component: { components: {VuePrismEditor}, data: { text: '' }, methods: { copyText() { navigator.clipboard.writeText(this.text); Blockbench.showQuickMessage( "Copied!", 1000 ); }, exportFile() { var path = Blockbench.export({ extensions: ["java", "txt"], name: "VoxelShape", content: output, }); Blockbench.showQuickMessage( "The VoxelShape was successfully exported!", 1000 ); } }, template: `
    ` } }); outputViewDialog.component.data.text = output; outputViewDialog.show(); } function generateShape(group, mappings) { var elements = [] elements = group === undefined ? Outliner.elements : group.children; var operation = group.name[0] === '$' ? group.name.substring(1).toUpperCase() : "OR"; if (operation === "VOXELSHAPES" || group === undefined) { operation = "OR"; } var method = []; for (var i = 0; i < elements.length; i++) { var child = elements[i]; if (child instanceof Group) { method.push(generateShape(child, mappings)); } else { method.push( mappings.createCube + "(" + child.from[0] + ", " + child.from[1] + ", " + child.from[2] + ", " + child.to[0] + ", " + child.to[1] + ", " + child.to[2] + ")" ); } } var useStream = operation === "OR" && elements.length > 2; if (useStream) { var output = "Stream.of(\n"; for (var i = 0; i < method.length; i++) { if (i == method.length - 1) { output = output + method[i] + "\n"; } else { output = output + method[i] + ",\n"; } } output = output + ").reduce((v1, v2) -> " + mappings.combine + "(v1, v2, " + mappings.booleanFunction + "." + operation + ")).get();"; return output; } else { var output = method[method.length - 1]; for (var i = method.length - 2; i >= 0; i--) { output = mappings.combine + "(" + method[i] + ", " + output + ", " + mappings.booleanFunction + "." + operation + ")"; } return output; } } function searchVoxelShapeGroup(elements) { var rGroup; Group.all.forEach((group) => { if (group.name === "VoxelShapes") rGroup = group; }); return rGroup; } function resetFlags() { Blockbench.removeFlag(mappingsKey); Blockbench.removeFlag(Mappings.mojmaps.key); Blockbench.removeFlag(Mappings.mcp.key); Blockbench.removeFlag(Mappings.yarn.key); Blockbench.removeFlag(Mappings.parchment.key); Blockbench.removeFlag(omitVoxelShapesGroup); } // var helpMenu; Plugin.register('mod_utils', { title: 'Mod Utils', author: 'JTK222 (Maintainer), Wither (For the original Techne importer), Ocraftyone (VoxelShape improvements)', icon: 'fa-cubes', description: 'Allows importing Tabula files, and exporting VoxelShapes', tags: ["Minecraft: Java Edition"], version: '1.7.1', variant: 'desktop', onload() { if(isValidVersion){ // helpMenu = new BarMenu('help', []); // helpMenu.label.textContent = 'Help'; // MenuBar.update(); MenuBar.addAction(exportVoxelShapeAction, 'file.export'); MenuBar.addAction(importTabula2, 'file.import'); MenuBar.addAction(importTabula, 'file.import'); MenuBar.addAction(importTechne, 'file.import'); MenuBar.addAction(modUtilsHelp, 'help'); } }, onunload() { if(isValidVersion){ exportVoxelShapeAction.delete(); importTabula.delete(); importTabula2.delete(); importTechne.delete(); modUtilsHelp.delete(); // helpMenu.hide(); } }, oninstall(){}, onuninstall() {} }); })(); ================================================ FILE: plugins/modded_entity_fabric.js ================================================ // code based off the existing modded_entity.js module built into Blockbench for entity code but for Fabric Yarn mappings! // https://github.com/JannisX11/blockbench/blob/master/js/io/formats/modded_entity.js (function() { const FABRIC_OPTIONS_DEFAULT = { header: 'package com.example.mod;', entity: 'Entity', render: '', members: '', }; Object.freeze(FABRIC_OPTIONS_DEFAULT); fabricOptions = Object.assign({}, FABRIC_OPTIONS_DEFAULT); let button; const compileCallback = (e) => { if (Format.id !== "modded_entity") return; e.model.fabricOptions = fabricOptions; // console.log(`compileCallback model:`, e.model); }; const parseCallback = (e) => { // console.log(`parseCallback:`, e); if (e.model && typeof e.model.fabricOptions === 'object') { Object.assign(fabricOptions, e.model.fabricOptions); } else { fabricOptions = Object.assign({}, FABRIC_OPTIONS_DEFAULT); } setTemplate(); }; function setTemplate() { const { header, entity, render, members } = fabricOptions; Codecs.modded_entity.templates['Fabric 1.14'] = { name: 'Fabric 1.14', flip_y: true, integer_size: true, file: `// Made with Blockbench %(bb_version) // Exported for Minecraft version 1.14 // Paste this class into your mod and generate all required imports ${header} import net.minecraft.client.model.Box; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.entity.Entity; public class %(identifier) extends EntityModel { %(fields) public %(identifier)() { textureWidth = %(texture_width); textureHeight = %(texture_height); %(content) } @Override public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { ${render} %(renderers) } public void setRotationAngle(ModelPart bone, float x, float y, float z) { bone.pitch = x; bone.yaw = y; bone.roll = z; } ${members} }`, field: `private final ModelPart %(bone);`, bone: `%(bone) = new ModelPart(this); %(bone).setPivot(%(x), %(y), %(z)); ?(has_parent)%(parent).addChild(%(bone)); ?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz)); %(cubes)`, renderer: `%(bone).render(f5);`, cube: `%(bone).boxes.add(new Box(%(bone), %(uv_x), %(uv_y), %(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror)));`, }; Codecs.modded_entity.templates['Fabric 1.15+'] = { // ID used internally, will show "Fabric 1.15-1.16" in blockbench name: 'Fabric 1.15-1.16', flip_y: true, integer_size: false, file: `// Made with Blockbench %(bb_version) // Exported for Minecraft version 1.15 - 1.16 // Paste this class into your mod and generate all required imports ${header} public class %(identifier) extends EntityModel<${entity}> { %(fields) public %(identifier)() { textureWidth = %(texture_width); textureHeight = %(texture_height); %(content) } @Override public void setAngles(${entity} entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch){ //previously the render function, render code was moved to a method below } @Override public void render(MatrixStack matrixStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){ ${render} %(renderers) } public void setRotationAngle(ModelPart bone, float x, float y, float z) { bone.pitch = x; bone.yaw = y; bone.roll = z; } ${members} }`, field: `private final ModelPart %(bone);`, bone: `%(bone) = new ModelPart(this); %(bone).setPivot(%(x), %(y), %(z)); ?(has_parent)%(parent).addChild(%(bone)); ?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz)); %(cubes)`, renderer: `%(bone).render(matrixStack, buffer, packedLight, packedOverlay);`, cube: `%(bone).setTextureOffset(%(uv_x), %(uv_y)).addCuboid(%(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror));`, }; Codecs.modded_entity.templates['Fabric 1.17+'] = { name: 'Fabric 1.17+', flip_y: true, integer_size: false, file: `// Made with Blockbench %(bb_version) // Exported for Minecraft version 1.17+ for Yarn // Paste this class into your mod and generate all required imports ${header} public class %(identifier) extends EntityModel<${entity}> { %(fields) public %(identifier)(ModelPart root) { %(model_parts) } public static TexturedModelData getTexturedModelData() { ModelData modelData = new ModelData(); ModelPartData modelPartData = modelData.getRoot(); %(content) return TexturedModelData.of(modelData, %(texture_width), %(texture_height)); } @Override public void setAngles(${entity} entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { } @Override public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) { %(renderers) } }`, field: `private final ModelPart %(bone);`, model_part: `this.%(bone) = root.getChild("%(bone)");`, bone: `?(has_no_parent)ModelPartData %(bone) = modelPartData.addChild("%(bone)", ModelPartBuilder.create() ?(has_parent)ModelPartData %(bone) = %(parent).addChild("%(bone)", ModelPartBuilder.create() %(remove_n)%(cubes) ?(has_rotation)%(remove_n), ModelTransform.of(%(x), %(y), %(z), %(rx), %(ry), %(rz))); ?(has_no_rotation)%(remove_n), ModelTransform.pivot(%(x), %(y), %(z)));`, renderer: `%(bone).render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);`, cube: `.uv(%(uv_x), %(uv_y)){?(has_mirror).mirrored()}.cuboid(%(x), %(y), %(z), %(dx), %(dy), %(dz), new Dilation(%(inflate))){?(has_mirror).mirrored(false)}`, } } Plugin.register('modded_entity_fabric', { title: 'Fabric Modded Entity', icon: 'icon-format_java', author: 'Eliot Lash, SebaSphere', description: 'Plugin for exporting Modded Entities using Fabric/Yarn Sourcemap', tags: ["Minecraft: Java Edition"], min_version: '3.6.6', version: '0.4.0', variant: 'both', onload() { Codecs.project.on('compile', compileCallback); Codecs.project.on('parse', parseCallback); setTemplate(); // add a button to show the tips button = new Action('fabric_info', { name: 'Fabric Options', description: 'Stuff for Fabric support', icon: 'info', condition: () => Format.id === "modded_entity", click: function () { var dialog = new Dialog({ id: 'project', title: 'Fabric Options', width: 540, lines: [ '

    These settings allow you to customize the exported java code if desired.

    ', `

    Be sure to select your Fabric version in project settings first. Fabric format is currently ${Project.modded_entity_version.includes("Fabric") ? 'Enabled' : 'Disabled'}.

    `, '

    For help animating your models, check out GeckoLib which has native Fabric support.

    ', ], form: { entity: {label: 'Entity Type', value: fabricOptions.entity}, header: {label: 'Code Header Injection', value: fabricOptions.header}, render: {label: 'Render Code Injection', value: fabricOptions.render}, members: {label: 'Code Extra Members Injection', value: fabricOptions.members}, }, onConfirm: function(formResult) { Object.assign(fabricOptions, formResult); setTemplate(); dialog.hide() } }) dialog.show() } }); MenuBar.addAction(button, 'file.1'); }, onunload() { delete Codecs.modded_entity.templates['Fabric 1.14']; delete Codecs.modded_entity.templates['Fabric 1.15+']; // 1.15 to 1.16 delete Codecs.modded_entity.templates['Fabric 1.17+']; // 1.17 to 1.19 at time of writing // remove button when plugin is unloaded button.delete(); Codecs.project.events.compile.remove(compileCallback) Codecs.project.events.parse.remove(parseCallback) } }); })() ================================================ FILE: plugins/multi-layer.js ================================================ (function() { class RenderLayer { constructor(name, title) { this.name = name this.title = title } } const NONE = "None" const LAYERS = [ new RenderLayer("solid", "Solid"), new RenderLayer("translucent", "Translucent") ] var layerGroups = {} var useMultiLayer = false Codecs.java_block.on('compile', event => { // if we're not doing a multi-layer export, return if (!useMultiLayer) return; event.model.loader = "forge:multi-layer" event.model.layers = {} delete event.model.elements function computeCube(list, s) { if (s.export == false) return; //Create Element var element = {} if ((event.options.cube_name !== false && !settings.minifiedout.value) || event.options.cube_name === true) { if (s.name !== 'cube') { element.name = s.name } } element.from = s.from.slice(); element.to = s.to.slice(); if (s.inflate) { for (var i = 0; i < 3; i++) { element.from[i] -= s.inflate; element.to[i] += s.inflate; } } if (s.shade === false) { element.shade = false } if (!s.rotation.allEqual(0) || !s.origin.allEqual(8)) { var axis = s.rotationAxis()||'y'; element.rotation = new oneLiner({ angle: s.rotation[getAxisNumber(axis)], axis, origin: s.origin }) } if (s.rescale) { if (element.rotation) { element.rotation.rescale = true } else { element.rotation = new oneLiner({ angle: 0, axis: s.rotation_axis||'y', origin: s.origin, rescale: true }) } } if (s.rotation.positiveItems() >= 2) { element.rotated = s.rotation } var element_has_texture var e_faces = {} for (var face in s.faces) { if (s.faces.hasOwnProperty(face)) { if (s.faces[face].texture !== null) { var tag = new oneLiner() if (s.faces[face].enabled !== false) { tag.uv = s.faces[face].uv.slice(); tag.uv.forEach((n, i) => { tag.uv[i] = n * 16 / UVEditor.getResolution(i%2); }) } if (s.faces[face].rotation) { tag.rotation = s.faces[face].rotation } if (s.faces[face].texture) { var tex = s.faces[face].getTexture() if (tex) { tag.texture = '#' + tex.id // in the future we should dynamically map textures // to each layer //textures_used.safePush(tex) } element_has_texture = true } if (!tag.texture) { tag.texture = '#missing' } if (s.faces[face].cullface) { tag.cullface = s.faces[face].cullface } if (s.faces[face].tint >= 0) { tag.tintindex = s.faces[face].tint } e_faces[face] = tag } } } //Gather Textures if (!element_has_texture) { element.color = s.color } element.faces = e_faces function inVd(n) { return n < -16 || n > 32; } if (inVd(element.from[0]) || inVd(element.from[1]) || inVd(element.from[2]) || inVd(element.to[0]) || inVd(element.to[1]) || inVd(element.to[2]) ) { overflow_cubes.push(s); } if (Object.keys(element.faces).length) { list.push(element) } } function iterate(list, arr) { var i = 0; if (!arr || !arr.length) { return; } for (i = 0; i < arr.length; i++) { if (arr[i].type === 'cube') { computeCube(list, arr[i]) } else if (arr[i].type === 'group') { iterate(list, arr[i].children) } } } function createModel(layer) { if (!(layer.name in layerGroups)) { return } group = null for (var i = 0; i < Outliner.root.length; i++) { if (layerGroups[layer.name] == Outliner.root[i].name) { group = Outliner.root[i] break } } layerElements = [] iterate(layerElements, [group]) model = {} if ('parent' in event.model) { model.parent = event.model.parent } model.textures = event.model.textures model.elements = layerElements event.model.layers[layer.name] = model } LAYERS.forEach(l => createModel(l)) useMultiLayer = false }) function getDialog() { var groups = {}; groups[NONE] = "None"; Outliner.root.forEach(function(s) { if (s instanceof Group) { groups[s.name] = s.name; } }); var optionsForm = {}; LAYERS.forEach(l => { optionsForm[l.name] = { label: l.title, type: 'select', options: groups } }); return new Dialog({ id: 'multilayer-dialog', title: 'Multi-Layer JSON Model', form: optionsForm, lines: [ '

    Choose the group to apply to each render layer.

    ' ], onConfirm: function (formData) { this.hide(); LAYERS.forEach(l => { if (formData[l.name] !== NONE) { layerGroups[l.name] = formData[l.name]; } }); useMultiLayer = true Codecs.java_block.export(); } }); } Plugin.register('multi-layer', { title: 'Multi-Layer', icon: 'layers', author: 'aidancbrady', description: 'Allows exporting in Forge\'s multi-layer model format.', tags: ["Minecraft: Java Edition"], version: '1.0', variant: 'both', onload() { action = new Action({ id: 'export_multilayer', name: 'Export Multi-Layer Model', icon: 'layers', description: 'Exports a model in the Forge multi-layer format.', category: 'file', condition: _ => Format.id === 'java_block', click: () => { layerRenders = {}; getDialog().show(); } }) MenuBar.addAction(action, 'file.export'); }, onunload() { action.delete() } }) })() ================================================ FILE: plugins/no_java_limits/about.md ================================================ Are you tired of slicing your models into pieces just to fit into Minecraft's size limits? This plugin will help you! ## Usage 1. **Create** a model as large as you want - without limits, even thousands of blocks wide 2. **Export** it as usual 3. **Import** it into a Display Entity 4. **Rescale** the entity using the generated command or manually Done! No more cutting ================================================ FILE: plugins/no_java_limits/no_java_limits.js ================================================ (function () { "use strict"; const PLUGIN_ID = "no_java_limits"; const OFFSET = 8; const LIMIT_DIST = 24; let suppressDialog = false; let scaleUpAction, scaleDownAction; let originalCoordinateLimits = null; let originalLimiterTest = null; let originalLimiterMove = null; let originalLimiterClamp = null; function applyLargeLimits() { const codec = Codecs["java_block"]; if (codec && codec.format && codec.format.cube_size_limiter) { const limiter = codec.format.cube_size_limiter; originalCoordinateLimits = limiter.coordinate_limits; originalLimiterTest = limiter.test; originalLimiterMove = limiter.move; originalLimiterClamp = limiter.clamp; limiter.coordinate_limits = [-Infinity, Infinity]; limiter.test = () => false; limiter.move = () => { }; limiter.clamp = () => { }; } } function restoreOriginalLimits() { const codec = Codecs["java_block"]; if (codec && codec.format && codec.format.cube_size_limiter) { const limiter = codec.format.cube_size_limiter; if (originalCoordinateLimits) limiter.coordinate_limits = originalCoordinateLimits; if (originalLimiterTest) limiter.test = originalLimiterTest; if (originalLimiterMove) limiter.move = originalLimiterMove; if (originalLimiterClamp) limiter.clamp = originalLimiterClamp; } } function showExportDialog(scale) { if (suppressDialog) return; const command = `/data modify entity @e[limit=1,sort=nearest,type=minecraft:item_display] transformation.scale set value [${scale}f,${scale}f,${scale}f]`; let dialogForm = { info: { type: "info", text: `

    Your model was scaled down by a factor of ${scale}x.

    \nTo restore its size in-game, stand close to the item_display and run the following command:`, }, command: { type: "textarea", value: `${command}`, readonly: true, height: 82, }, dontShow: { type: "checkbox", label: "Do not show again for this session", value: false, }, }; if (settings.dialog_larger_cubes && settings.dialog_larger_cubes.value) { dialogForm.limitDialog = { type: "info", text: `
    Also, it looks like you have the "Model Too Large" dialog enabled. You may want to disable it in Settings > Dialogs.`, }; } new Dialog("no_java_limits_popup", { id: "no_java_limits_popup", title: "NoJavaLimits: Scale Applied", form: dialogForm, onConfirm: function (formData) { if (formData.dontShow) { suppressDialog = true; } this.hide(); }, }).show(); } function scaleModel(factor) { if (!Project || !Format || Format.id !== "java_block") { Blockbench.showStatusMessage( "This tool only works on Java Block/Item models.", 2000, ); return; } Undo.initEdit({ elements: Cube.all, outliner: Group.all, project: Project, }); const scaleWithOffset = (value, f) => Math.round(((value - OFFSET) * f + OFFSET) * 1e8) / 1e8; Cube.all.forEach((cube) => { cube.from = cube.from.map((v) => scaleWithOffset(v, factor)); cube.to = cube.to.map((v) => scaleWithOffset(v, factor)); cube.origin = cube.origin.map((v) => scaleWithOffset(v, factor)); if (cube.inflate !== undefined) { cube.inflate = Math.round(cube.inflate * factor * 1e8) / 1e8; } }); Group.all.forEach((group) => { group.origin = group.origin.map((v) => scaleWithOffset(v, factor)); }); Canvas.updateAll(); Undo.finishEdit(`Scale model by ${factor}x`); Blockbench.showStatusMessage(`Scaled model by ${factor}x`, 2000); } function createActions() { scaleUpAction = new Action("no_java_limits_scale_up", { name: "Scale Model ×2", icon: "zoom_in", category: "transform", condition: () => Format && Format.id === "java_block", click: () => scaleModel(2), }); scaleDownAction = new Action("no_java_limits_scale_down", { name: "Scale Model ×0.5", icon: "zoom_out", category: "transform", condition: () => Format && Format.id === "java_block", click: () => scaleModel(0.5), }); if (MenuBar.menus.transform) { MenuBar.menus.transform.addAction(scaleUpAction); MenuBar.menus.transform.addAction(scaleDownAction); } else { MenuBar.addAction(scaleUpAction, "tools"); MenuBar.addAction(scaleDownAction, "tools"); } } function removeActions() { if (scaleUpAction) scaleUpAction.delete(); if (scaleDownAction) scaleDownAction.delete(); } let originalCompile = null; let originalParse = null; function hookExport() { const codec = Codecs["java_block"]; if (!codec || originalCompile) return; // Import originalParse = codec.parse.bind(codec); codec.parse = function (data, path) { let json; let isString = typeof data === "string"; if (isString) { try { json = JSON.parse(data); } catch (e) { return originalParse(data, path); } } else { json = data; } if (json && json.no_java_limits_scale) { const scale = json.no_java_limits_scale; if (Array.isArray(json.elements)) { for (const el of json.elements) { const sc = (v) => Math.round((v - OFFSET) * scale * 1e8) / 1e8 + OFFSET; if (Array.isArray(el.from)) el.from = el.from.map(sc); if (Array.isArray(el.to)) el.to = el.to.map(sc); if (el.rotation && Array.isArray(el.rotation.origin)) { el.rotation.origin = el.rotation.origin.map(sc); } if (el.inflate) { el.inflate = Math.round(el.inflate * scale * 1e8) / 1e8; } } } delete json.no_java_limits_scale; if (isString) { data = JSON.stringify(json); } } return originalParse(data, path); }; // Export originalCompile = codec.compile.bind(codec); codec.compile = function (options) { const result = originalCompile(options); let json, wasString; if (typeof result === "string") { try { json = JSON.parse(result); wasString = true; } catch (e) { return result; } } else { json = result; wasString = false; } if (json && Array.isArray(json.elements)) { let maxDist = 0; for (const el of json.elements) { const inflate = el.inflate || 0; if (Array.isArray(el.from)) { el.from.forEach( (v) => (maxDist = Math.max(maxDist, Math.abs(v - inflate - OFFSET))), ); } if (Array.isArray(el.to)) { el.to.forEach( (v) => (maxDist = Math.max(maxDist, Math.abs(v + inflate - OFFSET))), ); } if (el.rotation && Array.isArray(el.rotation.origin)) { el.rotation.origin.forEach( (v) => (maxDist = Math.max(maxDist, Math.abs(v - OFFSET))), ); } } let power = 0; while (maxDist / Math.pow(2, power) > LIMIT_DIST + 0.0001) { power++; } if (power > 0) { const scaleFactor = Math.pow(2, -power); const inverseScale = Math.pow(2, power); for (const el of json.elements) { const sc = (v) => Math.round((v - OFFSET) * scaleFactor * 1e8) / 1e8 + OFFSET; if (Array.isArray(el.from)) el.from = el.from.map(sc); if (Array.isArray(el.to)) el.to = el.to.map(sc); if (el.rotation && Array.isArray(el.rotation.origin)) { el.rotation.origin = el.rotation.origin.map(sc); } if (el.inflate) { el.inflate = Math.round(el.inflate * scaleFactor * 1e8) / 1e8; } } let reorderedJson = {}; let scaleInjected = false; for (let key in json) { reorderedJson[key] = json[key]; if (key === "credit") { reorderedJson.no_java_limits_scale = inverseScale; scaleInjected = true; } } if (!scaleInjected) { reorderedJson.no_java_limits_scale = inverseScale; } json = reorderedJson; showExportDialog(inverseScale); } } return wasString ? JSON.stringify(json, null, "\t") : json; }; } function unhookExport() { const codec = Codecs["java_block"]; if (codec && originalCompile) { codec.compile = originalCompile; originalCompile = null; } if (codec && originalParse) { codec.parse = originalParse; originalParse = null; } } BBPlugin.register(PLUGIN_ID, { title: "No Java Limits", author: "Rajdacz", description: "Allows creating infinite-sized models for use in display entities.", icon: "zoom_out_map", tags: ["Minecraft: Java Edition", "Display Entities"], version: "1.0.0", min_version: "4.8.0", variant: "both", onload() { hookExport(); applyLargeLimits(); createActions(); suppressDialog = false; }, onunload() { unhookExport(); removeActions(); restoreOriginalLimits(); }, }); })(); ================================================ FILE: plugins/obj_animation_export.js ================================================ (function() { let export_action; BBPlugin.register('obj_animation_export', { title: 'OBJ Animation Exporter', icon: 'icon-objects', author: 'JannisX11', description: 'Exports an animation to OBJ as an OBJ file sequence', about: 'To export, right click an animation and click Export OBJ Sequence.', tags: ['Exporter'], version: '0.1.0', min_version: '4.0.0', variant: 'both', onload() { export_action = new Action('export_obj_sequence', { name: 'Export OBJ Sequence', description: 'Export animation as OBJ sequence', icon: 'icon-objects', category: 'animation', condition: () => Modes.animate && Animation.selected, click() { new Dialog({ id: 'export_obj_sequence', title: 'Export OBJ Sequence', form: { length: {label: 'Length', type: 'number', value: Animation.selected.length, min: 0, max: 10000}, fps: {label: 'FPS', type: 'number', value: Animation.selected.snapping, min: 1, max: 1000}, }, onConfirm({length, fps}) { let archive = new JSZip(); let name = (Project.name||'model'); let num_length = Math.round(length * fps).toString().length; Timeline.setTime(0); for (let frame = 0; frame <= length * fps; frame++) { Timeline.setTime(frame / fps); Animator.preview(); let obj = Codecs.obj.compile(); archive.file(`${name}_${frame.toDigitString(num_length)}.obj`, obj); } let all_files = Codecs.obj.compile({all_files: true}); archive.file('materials.mtl', all_files.mtl) for (let key in all_files.images) { let texture = all_files.images[key] if (texture && !texture.error) { archive.file(pathToName(texture.name) + '.png', texture.getBase64(), {base64: true}); } } archive.generateAsync({type: 'blob'}).then(content => { Blockbench.export({ resource_id: 'obj', type: 'Zip Archive', extensions: ['zip'], name: 'animation', content: content, savetype: 'zip' }); }) } }).show(); } }) Animation.prototype.menu.addAction(export_action, '-1'); }, onunload() { export_action.delete(); } }); })() ================================================ FILE: plugins/oc_3dm_model.js ================================================ // author: LucunJi // 2020-07-06 00:03:44 // // this plugin allows you to export a block to use in OpenComputer mod // the format of exported .3dm files follows instructions here: https://github.com/OpenPrograms/Sangar-Programs/blob/master/models/example.3dm // you need print3d.lua (https://github.com/OpenPrograms/Sangar-Programs/blob/master/print3d.lua) and a 3D printer in addition // // thanks to Gamepiaynmo's cpm_plugin(https://github.com/Gamepiaynmo/CustomModel/blob/master/plugin/cpm_model.js), I learned a lot from his code (function() { let export_action; let options = {}; Plugin.register('oc_3dm_model', { title: 'OC 3dm Model Format', icon: 'computer', author: 'Lucun_Ji', description: 'Export models of OpenComputer mod in .3dm format.', version: '0.1.0', variant: 'desktop', onload() { let codec = new Codec('oc_3dm_model', { name: 'OC .3dm Model', extension: '3dm', remember: false, compile() { function convertCube(cube) { let str = ' {'; cube.from.forEach(i => { str += i + ', '; }); cube.to.forEach(i => { str += i + ', '; }); str += 'texture = "'; for (let i = 0; i < textures.length; i++) { if (textures[i].uuid == cube.faces.north.texture) { str += textures[i].name.replace(/\.[^/.]+$/, ""); break; } } str += '"'; str += '}' return str; } function handleObj(obj) { let arr = []; if (obj instanceof Cube) { arr.push(' -- ' + obj.name + '\n'); arr.push(convertCube(obj) + ',\n'); } else if (obj instanceof Group) { arr.push('\n'); arr.push(' -- ' + obj.name + '\n'); for (let child of obj.children) { handleObj(child).forEach(i => arr.push(' ' + i)); } } return arr; } let model = '-- generated by Blockbench, with OpenComputer .3dm Model plugin\n'; model += '{\n'; model += ' label = "' + options.label + '",\n'; model += ' lightLevel = ' + options.lightLevel + ',\n'; model += ' emitRedstone = ' + options.emitRedstone + ',\n'; model += ' buttonMode = ' + options.buttonMode + ',\n'; model += ' collidable = {' + options.collidableInactive + ', ' + options.collidableActive + '},\n'; model += '\n'; model += ' shapes = {\n'; Outliner.root.forEach(obj => { handleObj(obj).forEach(i => model += i); }) model += ' }\n'; model += '}' return model; }, parse(model, path) { } }) export_action = new Action('export_oc_3dm_model', { name: 'Export OC .3dm model', description: '', icon: 'computer', category: 'file', click() { let dialog = new Dialog({ title: 'OC .3dm Model Export', id: 'oc_3dm_export', lines: [ '

    Block Name:

    ', '

    Light Level(0~8):

    ', '

    Redstone Signal Level(0~15):

    ', '

    Button Mode:

    ', '

    Collidable(inactive):

    ', '

    Collidable(active):

    ', ], draggable: true, onConfirm() { dialog.hide(); options.label = $('.dialog#oc_3dm_export input#label').val(); options.lightLevel = parseInt($('.dialog#oc_3dm_export input#lightLevel').val()); options.emitRedstone = parseInt($('.dialog#oc_3dm_export input#emitRedstone').val()); options.buttonMode = $('.dialog#oc_3dm_export input#buttonMode').is(':checked'); options.collidableInactive = $('.dialog#oc_3dm_export input#collidableInactive').is(':checked'); options.collidableActive = $('.dialog#oc_3dm_export input#collidableActive').is(':checked'); codec.export(); } }); dialog.show(); } }) MenuBar.addAction(export_action, 'file.export') }, onunload() { export_action.delete(); } }); })() ================================================ FILE: plugins/optifine_player_models/about.md ================================================ This plugin adds a new format that allows you to make you own custom OptiFine player models. ## Setup 1. Open your launcher and go to the **Installations** tab. 2. Find your installation, click the triple dot, and slect **Edit**.\ 3. Select **More Options**. 4. Inside the **JVM ARGUMENTS** field, add: `-Dplayer.models.local=true -Dplayer.models.reload=true` Note:\t**player.models.reload** reloads the model every 5 seconds in game, and can be disabled after you finish making the model. 5. Make a folder named playermodels inside your **.minecraft** folder. 6. Inside that folder, make 2 more folders named items and users. ## Usage - You need a config file for every player with a player model. This config file must be the players username, and needs to go in the **users** folder. **Example**: `.minecraft/playermodels/users/ewanhowell5195.cfg` - You can create a user config by going to **File > Export > Create OptiFine Player Model Config**. - Exported player models should go in a folder named what the player model is, inside the **items** folder, and be named `model.cfg`. **Example**: `.minecraft/playermodels/items/horns/model.cfg` - If not using **Use Player Texture**, textures must go inside a folder named `users` located next to the model file, and be named the players username. **Example**: `.minecraft/playermodels/items/horns/users/ewanhowell5195.png` ## Limitations - They are client side only. - They are not part of resource packs. - They require OptiFine, and JVM args set in the launcher. - Animations are not supported. - You can only target specific players, not all players. ## Important Enabling the player model JVM arguments **will disable any online player models**, usually being seasonal cosmetics like the Santa and Witch hats. ================================================ FILE: plugins/optifine_player_models/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2022-05-29", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2022-06-02", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Restructured plugin internals" ] } ] }, "1.1.1": { "title": "1.1.1", "date": "2022-06-04", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed missing \"playermodels\" folder in plugin about", "Fixed the format failing to load if the file path for a skin was not found" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2022-10-22", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added format page on the start screen" ] } ] }, "1.3.0": { "title": "1.3.0", "date": "2022-10-27", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added credit support" ] }, { "title": "Bug Fixes", "list": [ "Fixed the start screen format page page trying to load the wrong format" ] } ] }, "1.3.1": { "title": "1.3.1", "date": "2022-11-11", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed credit not saving to the model" ] } ] }, "1.3.2": { "title": "1.3.2", "date": "2023-02-08", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed the \"Use Player Texture\" option not working" ] } ] }, "1.4.0": { "title": "1.4.0", "date": "2025-01-22", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 4.12" ] } ] }, "1.5.0": { "title": "1.5.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] }, { "title": "Technical Changes", "list": [ "Updated to new repository format" ] } ] }, "1.5.1": { "title": "1.5.1", "date": "2025-10-15", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "The format page \"Show Information\" button will now show the plugin page instead of a unique dialog" ] }, { "title": "Bug Fixes", "list": [ "Fixed player configs failing to be created" ] } ] } } ================================================ FILE: plugins/optifine_player_models/optifine_player_models.js ================================================ (async function () { let fs, format, codec, action, config, property, setResolution, textureAdd, model, styles const id = "optifine_player_models" const name = "OptiFine Player Models" const icon = "icon-player" const description = "Adds a new format that allows you to create OptiFine player models." const links = { website: { text: "By Ewan Howell", link: "https://ewanhowell.com/", icon: "language", colour: "#33E38E" }, discord: { text: "Discord Server", link: "https://discord.ewanhowell.com/", icon: "fab.fa-discord", colour: "#727FFF" }, tutorial: { text: "Player Model Tutorial", link: "https://youtu.be/0rT-q95dpV0", icon: "fab.fa-youtube", colour: "#FF4444" } } const groups = [ { name: "head", origin: [0, 24, 0] }, { name: "body", origin: [0, 24, 0] }, { name: "leftArm", origin: [-5, 22, 0] }, { name: "rightArm", origin: [5, 22, 0] }, { name: "leftLeg", origin: [-1.95, 12, 0] }, { name: "rightLeg", origin: [1.95, 12, 0] } ] const groupNames = groups.map(e => e.name) Plugin.register(id, { title: name, icon: "icon.png", author: "Ewan Howell", description, tags: ["Minecraft: Java Edition", "OptiFine", "Player Models"], version: "1.5.1", min_version: "5.0.0", variant: "both", await_loading: true, creation_date: "2022-05-29", contributes: { formats: ["optifine_player_model"] }, website: "https://ewanhowell.com/plugins/optifine-player-models/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/optifine_player_models", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[OptiFine Player Models]", has_changelog: true, async onload() { fs = require("fs", { message: "This permission is required for exporting your model", optional: false }) if (!fs) { throw new Error("fs access denied") } addStyles() codec = new Codec("optifine_player_model_codec", { name: "OptiFine Player Model", extension: "cfg", remember: true, load_filter: { type: "json", extensions: ["cfg"], condition: file => file && file.models != undefined }, compile() { const entityModel = { type: "PlayerItem", credit: Project.credit || settings.credit.value } if (Project.use_player_texture) entityModel.usePlayerTexture = true entityModel.textureSize = [Project.texture_width, Project.texture_height] entityModel.models = [] Outliner.root.forEach(g => { if (g instanceof Group == false || !groupNames.includes(g.name)) return if (!settings.export_empty_groups.value && !g.children.find(child => child.export)) return if (!g.children.length) return //Bone const bone = { type: "ModelBox", attachTo: g.name, invertAxis: "xy", mirrorTexture: undefined, translate: g.origin.slice().V3_multiply(-1) } if (!g.rotation.allEqual(0)) bone.rotate = g.rotation.slice() if (g.mirror_uv) bone.mirrorTexture = "u" function populate(p_model, group, depth) { if (group.children.length === 0) return let mirror_sub let child_cubes = group.children.filter(obj => obj.export && obj.type === 'cube') let has_different_mirrored_children = !!child_cubes.find(obj => obj.mirror_uv !== child_cubes[0].mirror_uv) group.children.forEach(obj => { if (!obj.export) return if (obj.type === "cube") { let box if (Project.box_uv) { box = new oneLiner() } else { box = {} } const c_size = obj.size() box.coordinates = [ obj.from[0], obj.from[1], obj.from[2], c_size[0], c_size[1], c_size[2] ] if (depth === 0) { box.coordinates[0] += p_model.translate[0] box.coordinates[1] += p_model.translate[1] box.coordinates[2] += p_model.translate[2] } else { box.coordinates[0] -= p_model.translate[0] box.coordinates[1] -= p_model.translate[1] box.coordinates[2] -= p_model.translate[2] } if (Project.box_uv) { box.textureOffset = obj.uv_offset } else { for (const face in obj.faces) { if (obj.faces[face].texture !== null) { box[`uv${capitalizeFirstLetter(face)}`] = obj.faces[face].uv } } } if (obj.inflate && typeof obj.inflate === "number") { box.sizeAdd = obj.inflate } if (obj.mirror_uv !== group.mirror_uv && has_different_mirrored_children) { if (!mirror_sub) { mirror_sub = { invertAxis: "xy", mirrorTexture: "u", boxes: [] } if (!p_model.submodels) p_model.submodels = [] p_model.submodels.splice(0, 0, mirror_sub) } mirror_sub.boxes.push(box) } else { if (!p_model.boxes) p_model.boxes = [] if (obj.mirror_uv !== group.mirror_uv) p_model.mirrorTexture = obj.mirror_uv ? "u" : undefined p_model.boxes.push(box) } } else if (obj.type === "group") { const bone = { id: obj.name, invertAxis: "xy", mirrorTexture: undefined, translate: obj.origin.slice() } if (obj.mirror_uv) { bone.mirrorTexture = "u" } if (!obj.rotation.allEqual(0)) { bone.rotate = obj.rotation.slice() } populate(bone, obj, depth+1) if (depth === 0) { bone.translate[0] += p_model.translate[0] bone.translate[1] += p_model.translate[1] bone.translate[2] += p_model.translate[2] } else { bone.translate[0] -= group.origin[0] bone.translate[1] -= group.origin[1] bone.translate[2] -= group.origin[2] } if (!p_model.submodels) p_model.submodels = [] p_model.submodels.push(bone) } }) } populate(bone, g, 0) bone.translate[2] = 0 - bone.translate[2] switch (g.name) { case "head": case "body": bone.translate[0] = 0 - bone.translate[0] bone.translate[1] = -24 - bone.translate[1] break case "leftArm": bone.translate[0] = 5 - bone.translate[0] bone.translate[1] = -22 - bone.translate[1] break case "rightArm": bone.translate[0] = -5 - bone.translate[0] bone.translate[1] = -22 - bone.translate[1] break case "leftLeg": bone.translate[0] = 2 - bone.translate[0] bone.translate[1] = -12 - bone.translate[1] break case "rightLeg": bone.translate[0] = -2 - bone.translate[0] bone.translate[1] = -12 - bone.translate[1] break } entityModel.models.push(bone) }) this.dispatchEvent("compile", {entityModel}) return autoStringify(entityModel) }, parse(model, path) { this.dispatchEvent("parse", {model}) if (typeof model.credit === "string") Project.credit = model.credit if (model.textureSize) { Project.texture_width = parseInt(model.textureSize[0]) || 64 Project.texture_height = parseInt(model.textureSize[1]) || 64 } if (model.usePlayerTexture) Project.use_player_texture = true let empty_face = {uv: [0, 0, 0, 0], texture: null} if (model.models) { model.models.forEach(b => { if (typeof b !== "object" || !b.attachTo || !groupNames.includes(b.attachTo)) return let subcount = 0 //Bone const group = new Group({ name: b.attachTo, origin: [b.translate[0] ?? 0, b.translate[1] ?? 0, b.translate[2] ?? 0], rotation: b.rotate, mirror_uv: (b.mirrorTexture && b.mirrorTexture.includes("u")) }) group.origin.V3_multiply(-1) group.origin[2] = 0 - group.origin[2] switch (b.attachTo) { case "head": case "body": group.origin[0] = 0 - group.origin[0] group.origin[1] = 24 - group.origin[1] break case "leftArm": group.origin[0] = -5 - group.origin[0] group.origin[1] = 22 - group.origin[1] break case "rightArm": group.origin[0] = 5 - group.origin[0] group.origin[1] = 22 - group.origin[1] break case "leftLeg": group.origin[0] = -2 - group.origin[0] group.origin[1] = 12 - group.origin[1] break case "rightLeg": group.origin[0] = 2 - group.origin[0] group.origin[1] = 12 - group.origin[1] break } function readContent(submodel, p_group, depth) { if (submodel.boxes && submodel.boxes.length) { submodel.boxes.forEach(box => { const base_cube = new Cube({ name: box.name || p_group.name, autouv: 0, uv_offset: box.textureOffset, inflate: box.sizeAdd, mirror_uv: p_group.mirror_uv }) if (box.coordinates) { if (depth === 0) { box.coordinates[0] += p_group.origin[0] box.coordinates[1] += p_group.origin[1] box.coordinates[2] += p_group.origin[2] } base_cube.extend({ from: [ box.coordinates[0], box.coordinates[1], box.coordinates[2] ], to: [ box.coordinates[0] + box.coordinates[3], box.coordinates[1] + box.coordinates[4], box.coordinates[2] + box.coordinates[5] ] }) } if (!box.textureOffset && ( box.uvNorth || box.uvEast || box.uvSouth || box.uvWest || box.uvUp || box.uvDown )) { Project.box_uv = false base_cube.extend({faces: { north: box.uvNorth ? {uv: box.uvNorth} : empty_face, east: box.uvEast ? {uv: box.uvEast} : empty_face, south: box.uvSouth ? {uv: box.uvSouth} : empty_face, west: box.uvWest ? {uv: box.uvWest} : empty_face, up: box.uvUp ? {uv: box.uvUp} : empty_face, down: box.uvDown ? {uv: box.uvDown} : empty_face, }}) } if (p_group.parent !== "root") { for (let i = 0; i < 3; i++) { base_cube.from[i] += p_group.origin[i] base_cube.to[i] += p_group.origin[i] } } base_cube.addTo(p_group).init() }) } if (submodel.submodels && submodel.submodels.length) { submodel.submodels.forEach(subsub => { if (subsub.translate) { subsub.translate[0] += p_group.origin[0] subsub.translate[1] += p_group.origin[1] subsub.translate[2] += p_group.origin[2] } const group = new Group({ name: subsub.id || `${b.attachTo}_sub_${subcount}`, origin: subsub.translate || (depth >= 1 ? submodel.translate : undefined), rotation: subsub.rotate, mirror_uv: (subsub.mirrorTexture && subsub.mirrorTexture.includes("u")) }) subcount++ group.addTo(p_group).init() readContent(subsub, group, depth + 1) }) } } group.init().addTo() readContent(b, group, 0) }) } this.dispatchEvent("parsed", {model}) Canvas.updateAllBones() for (const group of groups) if (!Group.all.find(e => e.name === group.name)) new Group(group).init() } }) async function getTexture(path) { const texture = await new Promise(fulfill => new THREE.TextureLoader().load(path, fulfill, null, fulfill)) const canvas = document.createElement("canvas") canvas.width = 64 canvas.height = 64 const ctx = canvas.getContext("2d") ctx.drawImage(texture.image, 0, 0, 32, 16, 0, 0, 32, 16) //head ctx.drawImage(texture.image, 8, 16, 4, 4, 8, 16, 4, 4) //right leg bottom ctx.drawImage(texture.image, 0, 20, 8, 12, 0, 20, 8, 12) //right leg right front ctx.drawImage(texture.image, 12, 20, 4, 20, 12, 20, 4, 20) //right leg back ctx.drawImage(texture.image, 20, 16, 8, 4, 20, 16, 8, 4) //body top ctx.drawImage(texture.image, 20, 20, 8, 12, 20, 20, 8, 12) //body front ctx.drawImage(texture.image, 32, 20, 8, 12, 32, 20, 8, 12) //body back ctx.drawImage(texture.image, 44, 16, 8, 4, 44, 16, 8, 4) //right arm top bottom ctx.drawImage(texture.image, 40, 20, 8, 12, 40, 20, 8, 12) //right arm right front ctx.drawImage(texture.image, 52, 20, 4, 12, 52, 20, 4, 12) //right arm back ctx.drawImage(texture.image, 24, 48, 4, 4, 24, 48, 4, 4) //left leg bottom ctx.drawImage(texture.image, 20, 52, 12, 12, 20, 52, 12, 12) //left leg front left back ctx.drawImage(texture.image, 36, 48, 8, 4, 36, 48, 8, 4) //left arm bottom ctx.drawImage(texture.image, 36, 52, 12, 12, 36, 52, 12, 12) //left arm front left back const skin = new THREE.CanvasTexture(canvas) const img = new Image() img.tex = skin img.tex.magFilter = THREE.NearestFilter img.tex.minFilter = THREE.NearestFilter return skin } const greyscale = new Uint8Array(4) greyscale[0] = 64 greyscale[1] = 64 greyscale[2] = 64 greyscale[3] = 255 const material = new THREE.MeshLambertMaterial({ color: 0xffffff, map: await getTexture("assets/player_skin.png"), alphaMap: new THREE.DataTexture(greyscale, 1, 1), transparent: true }) model = new THREE.Object3D() model.name = "optifine_player_model_guide" model.position.x = 0.001 model.position.y = 0.001 model.position.z = 0.001 const cubes = [ { //Head "size": [8, 8, 8], "pos": [0, 28, 0], "origin": [0, 24, 0], "north": {"uv": [2.032, 2.032, 3.968, 3.968]}, "east": {"uv": [0.032, 2.032, 1.968, 3.968]}, "south": {"uv": [6.032, 2.032, 7.968, 3.968]}, "west": {"uv": [4.032, 2.032, 5.968, 3.968]}, "up": {"uv": [3.968, 1.968, 2.032, 0.032]}, "down": {"uv": [5.968, 0.032, 4.032, 1.968]} }, { //Body "size": [8, 12, 4], "pos": [0, 18, 0], "north": {"uv": [5.032, 5.032, 6.968, 7.968]}, "east": {"uv": [4.032, 5.032, 4.968, 7.968]}, "south": {"uv": [8.032, 5.032, 9.968, 7.968]}, "west": {"uv": [7.032, 5.032, 7.968, 7.968]}, "up": {"uv": [5.032, 4.968, 6.968, 4.032]}, "down": {"uv": [7.032, 4.032, 8.968, 4.968]} }, { //L Arm "size": [4, 12, 4], "pos": [-6, 18, 0], "origin": [-4, 22, 0], "north": {"uv": [9.032, 13.032, 9.968, 15.968]}, "east": {"uv": [8.032, 13.032, 8.968, 15.968]}, "south": {"uv": [11.032, 13.032, 11.968, 15.968]}, "west": {"uv": [10.032, 13.032, 10.968, 15.968]}, "up": {"uv": [9.968, 12.968, 9.032, 12.032]}, "down": {"uv": [10.968, 12.032, 10.032, 12.968]} }, { //R Arm "size": [4, 12, 4], "pos": [6, 18, 0], "origin": [4, 22, 0], "north": {"uv": [11.032, 5.032, 11.968, 7.968]}, "east": {"uv": [10.032, 5.032, 10.968, 7.968]}, "south": {"uv": [13.032, 5.032, 13.968, 7.968]}, "west": {"uv": [12.032, 5.032, 12.968, 7.968]}, "up": {"uv": [11.968, 4.968, 11.032, 4.032]}, "down": {"uv": [12.968, 4.032, 12.032, 4.968]} }, { //L Leg "size": [3.95, 12, 4], "pos": [-1.975, 6, 0], "origin": [0, 12, 0], "north": {"uv": [5.032, 13.032, 5.968, 15.968]}, "east": {"uv": [4.032, 13.032, 4.968, 15.968]}, "south": {"uv": [7.032, 13.032, 7.968, 15.968]}, "west": {"uv": [6.032, 13.032, 6.968, 15.968]}, "up": {"uv": [5.968, 12.968, 5.032, 12.032]}, "down": {"uv": [6.968, 12.032, 6.032, 12.968]} }, { //R Leg "size": [3.95, 12, 4], "pos": [1.975, 6, 0], "origin": [0, 12, 0], "north": {"uv": [1.032, 5.032, 1.968, 7.968]}, "east": {"uv": [0.032, 5.032, 0.968, 7.968]}, "south": {"uv": [3.032, 5.032, 3.968, 7.968]}, "west": {"uv": [2.032, 5.032, 2.968, 7.968]}, "up": {"uv": [1.968, 4.968, 1.032, 4.032]}, "down": {"uv": [2.968, 4.032, 2.032, 4.968]} } ] for (const cube of cubes) { const mesh = new THREE.Mesh(new THREE.BoxGeometry(...cube.size), material) if (cube.origin) { mesh.position.set(cube.origin[0], cube.origin[1], cube.origin[2]) mesh.geometry.translate(-cube.origin[0], -cube.origin[1], -cube.origin[2]) } mesh.geometry.translate(cube.pos[0], cube.pos[1], cube.pos[2]) for (const [key, face] of Object.entries(cube)) { if (face.uv !== undefined) { let fIndex = 0; switch(key) { case "north": fIndex = 10; break case "east": fIndex = 0; break case "south": fIndex = 8; break case "west": fIndex = 2; break case "up": fIndex = 4; break case "down": fIndex = 6; break } let uv_array = [ [face.uv[0] / 16, 1 - (face.uv[1] / 16)], [face.uv[2] / 16, 1 - (face.uv[1] / 16)], [face.uv[0] / 16, 1 - (face.uv[3] / 16)], [face.uv[2] / 16, 1 - (face.uv[3] / 16)] ] const rot = (face.rotation + 0) while (rot > 0) { let a = arr[0] arr[0] = arr[2] arr[2] = arr[3] arr[3] = arr[1] arr[1] = a rot -= 90 } mesh.geometry.attributes.uv.array.set(uv_array[0], fIndex * 4 + 0) mesh.geometry.attributes.uv.array.set(uv_array[1], fIndex * 4 + 2) mesh.geometry.attributes.uv.array.set(uv_array[2], fIndex * 4 + 4) mesh.geometry.attributes.uv.array.set(uv_array[3], fIndex * 4 + 6) mesh.geometry.attributes.uv.needsUpdate = true } } model.add(mesh) } if (settings.display_skin.value) { let val = settings.display_skin.value if (val.startsWith("username:")) { fetch(`https://api.mojang.com/users/profiles/minecraft/${val.slice(9)}`).then(async r => { const uuid = await r.json() if (uuid?.id) { fetch(`https://sessionserver.mojang.com/session/minecraft/profile/${uuid.id}`).then(async r => { const data = await r.json() model.children[0].material.map = await getTexture(JSON.parse(Buffer.from(data.properties[0].value, "base64").toString()).textures.SKIN.url) }) } }) } else { if (val.slice(1, 2) === ",") val = val.slice(2) try { model.children[0].material.map = await getTexture(val) } catch {} } } format = new ModelFormat({ id: "optifine_player_model", name: "OptiFine Player Model", description: "Player models for OptiFine", icon, category: "minecraft", show_on_start_screen: true, model_identifier: false, box_uv: true, optional_box_uv: true, single_texture: true, bone_rig: true, centered_grid: true, integer_size: true, codec, onActivation: () => Canvas.scene.add(model), onDeactivation: () => Canvas.scene.remove(model), format_page: { component: { methods: { load: () => Formats.optifine_player_model.new(), info() { Plugins.dialog.show() Plugins.dialog.content_vue.search_term = "OptiFine Player Models" Plugins.dialog.content_vue.selectPlugin(Plugins.dialog.content_vue.viewed_plugins.find(e => e.id === "optifine_player_models")) } }, template: `

    ${description}

    Target : Minecraft: Java Edition with OptiFine

    How to use:




    Limitations:

    • They are client side only.
    • They are not part of resource packs.
    • They require OptiFine, and JVM args set in the launcher.
    • Animations are not supported.
    • You can only target specific players, not all players.

    ` } } }) Object.defineProperty(format, "integer_size", {get: _ => Project.box_uv}) codec.format = format action = new Action("export_optifine_player_model", { name: "Export OptiFine Player Model", icon: "icon-optifine_file", condition: { formats: [format.id] }, click: () => codec.export() }) MenuBar.addAction(action, "file.export.0") codec.export_action = action property = new Property(ModelProject, "boolean", "use_player_texture", { default: false, label: "Use Player Texture", condition: { formats: [format.id] } }) setResolution = () => { if (Project.format === format) { Project.texture_width = Project.texture_height = 64 for (const group of groups) new Group(group).init() } } Blockbench.on("new_project", setResolution) textureAdd = e => { if (Project.format === format) { Texture.all.map(tex => tex.getMaterial()).forEach(e => e.transparent = false) } } textureAdd() Blockbench.on("add_texture", textureAdd) const addGroupOriginal = BarItems.add_group.condition const addCubeOriginal = BarItems.add_cube.condition const deleteOriginal = BarItems.delete.condition ?? (() => true) BarItems.add_group.condition = () => Project.format === format ? addGroupOriginal() && (Group.selected || Cube.selected?.length) : addGroupOriginal() BarItems.add_cube.condition = () => Project.format === format ? addCubeOriginal() && (Group.selected || Cube.selected?.length) : addCubeOriginal() BarItems.delete.condition = () => Project.format === format ? deleteOriginal() && !groupNames.includes(Group.selected?.name) : deleteOriginal() config = new Action("create_optifine_player_model_config", { name: "Create OptiFine Player Model Config", icon: "icon-optifine_file", condition: { formats: [format.id] }, click() { const dialog = new Dialog({ title: "Create OptiFine Player Model Config", id: "optifine_player_model_config", lines: [` `], component: { methods: { change() { const button = $("#optifine_player_model_config_create") if ($("#optifine_player_model_config_username").val().trim() !== "" && $("#optifine_player_model_config_item").val().trim() !== "") { button.removeClass("optifine_player_model_config_disabled") } else { button.addClass("optifine_player_model_config_disabled") } }, create() { if ($("#optifine_player_model_config_create").hasClass("optifine_player_model_config_disabled")) return const data = { items: [ { type: $("#optifine_player_model_config_item").val().trim(), active: true } ] } Blockbench.export({ extensions: ["cfg"], type: "CFG", name: $("#optifine_player_model_config_username").val().trim(), content: JSON.stringify(data, null, 2) }, file => Blockbench.showQuickMessage(`Saved as: ${file}`, 2000)) dialog.cancel() }, close: () => dialog.cancel() }, template: `

    The usernam of the player that this config applies to.


    The player model name is the name of the folder you put the model.cfg file in.


    ` }, buttons: [] }).show() } }) MenuBar.addAction(config, "file.export.1") }, onunload() { Blockbench.removeListener("new_project", setResolution) Blockbench.removeListener("add_texture", textureAdd) codec?.delete() format?.delete() action?.delete() config?.delete() styles?.delete() property?.delete() } }) function addStyles() { styles = Blockbench.addCSS(` .spacer { flex: 1; } .optifine-player-model-links { display: flex; justify-content: space-around; margin: 20px 40px 0; } .optifine-player-model-links > a { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 5px; text-decoration: none; flex-grow: 1; flex-basis: 0; color: var(--color-subtle_text); text-align: center; } .optifine-player-model-links > a:hover { background-color: var(--color-accent); color: var(--color-light); } .optifine-player-model-links > a > i { font-size: 32px; width: 100%; max-width: initial; height: 32px; text-align: center; } .optifine-player-model-links > a:hover > i { color: var(--color-light) !important; } .optifine-player-model-links > a > p { flex: 1; display: flex; align-items: center; } #format_page_optifine_player_model { padding-bottom: 0; } #format_page_optifine_player_model .format_target { margin-bottom: 6px; } #format_page_optifine_player_model div:nth-child(3), #format_page_optifine_player_model content { overflow-y: auto; } `) } })() ================================================ FILE: plugins/optimize.js ================================================ Plugin.register("optimize", { "title": "Optimize", "author": "Krozi", "icon": "border_outer", "version": "1.2.8", "description": "Hide concealed faces for better performance!", onload() { MenuBar.addAction(new Action({ id: "optimize", name: "Optimize", icon: "border_outer", category: "filter", click: function(ev) { try { var dialog = new Dialog({title:'Optimize', id:'optimize_options', lines:[ '

    Restrict to selected elements

    ', '

    Apply culling (Blockmodels only)

    ', '
    Please check if all visible cubes are still there.
    Unwanted changes can be reverted using Ctrl+Z.' ], "onConfirm": function(data) { // dialog.hide() var restrictToSelected = $("#restrict")[0].checked var applyCulling = $("#culling")[0].checked dialog.hide() var elements = Outliner.elements if (restrictToSelected) { elements = selected } aspects = {"elements": elements, "uv_only": false} Undo.initEdit(aspects) Blockbench.showMessage('Starting optimization', 'center') var axisToFace = ['west', 'down', 'north', 'east', 'up', 'south'] var epsilon = 0.00001 var removedFaces = 0 var culledFaces = 0 var invisibleCubes = [] for (i=0; i Not my problem, ignore } var rotationAxis = Math.max(rotationAxis1, rotationAxis2) var notRotationAxis = 3-y-rotationAxis var intersection = [] var [from, to] = optimize_fromToInflate(cube2) if (rotationAxis1 == rotationAxis2 && angle1 == angle2) { // Both cubes have the same orientations from = optimize_rotatePoint(optimize_rotatePoint(from, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1) to = optimize_rotatePoint(optimize_rotatePoint(to, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1) var level2 = to[y] if (faceAxis < 3) { level2 = from[y] } if (level2-epsilon <= level && level <= level2+epsilon && cube2.faces[axisToFace[faceAxis]].texture === null) {} else if (from[y]-epsilon <= level && level <= to[y]+epsilon) { intersection = [from[x], from[z], to[x], to[z]] } } else if (rotationAxis1 == rotationAxis2 || angle1 == 0 || angle2 == 0) { // Both cubes have different orientations nonRectangleIntersections.push(cube2) var corners = [] corner = from.slice(0) corners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1)) corner[(rotationAxis+1)%3] = to[(rotationAxis+1)%3] corners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1)) corner[(rotationAxis+2)%3] = to[(rotationAxis+2)%3] corners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1)) corner[(rotationAxis+1)%3] = from[(rotationAxis+1)%3] corners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1)) var intersected = [] for (var c=0; c<4; c++) { var t = (level-corners[c][y]) / (corners[(c+1)%4][y]-corners[c][y]) if (0 <= t && t < 1) { intersected.push(corners[c][notRotationAxis] + (corners[(c+1)%4][notRotationAxis] - corners[c][notRotationAxis]) * t) } } if (intersected.length == 2) { if (notRotationAxis == z) { intersection = [from[x], Math.min(intersected[0], intersected[1]), to[x], Math.max(intersected[0], intersected[1])] } else { intersection = [Math.min(intersected[0], intersected[1]), from[z], Math.max(intersected[0], intersected[1]), to[z]] } } } if (intersection.length == 4) { var newPlanes = [] for (planeNumber=0; planeNumber < planes.length; planeNumber++) { plane = planes[planeNumber] if (plane[0] < intersection[2]-epsilon && plane[2] > intersection[0]+epsilon && plane[1] < intersection[3]-epsilon && plane[3] > intersection[1]+epsilon) { // Cube intersects with plane --> Split up in 4 new planes if (intersection[0]-epsilon > plane[0]) { newPlanes.push([plane[0], plane[1], intersection[0], plane[3]]) } if (intersection[1]-epsilon > plane[1]) { newPlanes.push([Math.max(plane[0], intersection[0]), plane[1], Math.min(plane[2], intersection[2]), intersection[1]]) } if (intersection[3]+epsilon < plane[3]) { newPlanes.push([Math.max(plane[0], intersection[0]), intersection[3], Math.min(plane[2], intersection[2]), plane[3]]) } if (intersection[2]+epsilon < plane[2]) { newPlanes.push([intersection[2], plane[1], plane[2], plane[3]]) } } else { newPlanes.push(plane) } } planes = newPlanes } } } // Try to cull elements with different rotations for (j=0; j= 0; planeNumber--) { var plane = planes[planeNumber] var corners = [ [plane[0], level, plane[1]], [plane[2], level, plane[1]], [plane[0], level, plane[3]], [plane[2], level, plane[3]] ] var deletePlane = true for (k=0; k<4; k++) { var corner = [corners[k][(3-x)%3], corners[k][(4-x)%3], corners[k][(5-x)%3]] corner = optimize_rotatePoint(optimize_rotatePoint(corner, origin1, rotationAxis1, angle1), cube2.origin, rotationAxis2, -angle2) if (!( from[0] - epsilon <= corner[0] && corner[0] <= to[0] + epsilon && from[1] - epsilon <= corner[1] && corner[1] <= to[1] + epsilon && from[2] - epsilon <= corner[2] && corner[2] <= to[2] + epsilon )) { deletePlane = false break } } if (deletePlane) { planes.remove(plane) } } } } if (planes.length == 0) { cube1.faces[axisToFace[faceAxis]].texture = null removedFaces++ } else if (applyCulling) { var cullFaces = [true, true, true, true, true, true] for (var j = 0; j < planes.length; j++) { for (k = 0; k < 4; k++) { var corner = [0, 0, 0] corner[x] = planes[j][(k&1) * 2] corner[z] = planes[j][(k&2) + 1] corner[y] = level var rotatedCorner = optimize_rotatePoint(corner, origin1, rotationAxis1, angle1) for (var l = 0; l < 3; l++) { if (rotatedCorner[l] > epsilon) { cullFaces[l] = false } if (rotatedCorner[l] < 16-epsilon) { cullFaces[l+3] = false } } } } for (var j = 0; j < 6; j++) { if (cullFaces[j]) { cube1.faces[axisToFace[faceAxis]].cullface = axisToFace[j] culledFaces++ break } } } } var visible = false for (invisibleFace=0; invisibleFace<6; invisibleFace++) { if (cube1.faces[axisToFace[invisibleFace]].texture !== null) { visible = true break } } if (!visible) { invisibleCubes.push(i) } } for (i=invisibleCubes.length-1; i >= 0; i--) { elements[invisibleCubes[i]].remove() } updateSelection() Blockbench.showMessage('Faces removed: ' + removedFaces + (invisibleCubes.length > 0 && (', Cubes removed: ' + invisibleCubes.length) || '') + (culledFaces > 0 && (', Faces culled: ' + culledFaces) || ''), 'center') Undo.finishEdit("optimize", aspects) Canvas.updateAllFaces() }}) dialog.show() } catch(err) { Blockbench.showMessage(err.message + err, 'center') console.error(err) } }}), "filter") }, onunload() { MenuBar.removeAction("filter.optimize") } }) optimize_fromToInflate = function(cube) { var from = [cube.from[0] - cube.inflate, cube.from[1] - cube.inflate, cube.from[2] - cube.inflate] var to = [cube.to[0] + cube.inflate, cube.to[1] + cube.inflate, cube.to[2] + cube.inflate] return [from, to] } optimize_rotatePoint = function(position, origin, axis, angle) { if (angle == 0 || axis == -1) { return position } var sin var cos if (angle == 45) { sin = 0.7071067812 cos = 0.7071067812 } else if (angle == -45) { sin = -0.7071067812 cos = 0.7071067812 } else if (angle == 22.5) { sin = 0.3826834324 cos = 0.9238795325 } else if (angle == -22.5) { sin = -0.3826834324 cos = 0.9238795325 } else { sin = Math.sin(angle * Math.PI / 180) cos = Math.cos(angle * Math.PI / 180) } var newPosition = [0,0,0] var x = axis var y = (axis+1)%3 var z = (axis+2)%3 newPosition[x] = position[x] newPosition[y] = origin[y] + (position[y]-origin[y]) * cos - (position[z]-origin[z]) * sin newPosition[z] = origin[z] + (position[z]-origin[z]) * cos + (position[y]-origin[y]) * sin return newPosition } optimize_getAngleAxis = function(rotation) { for (axis = 0; axis < 3; axis++) { if (rotation[axis] != 0) { return [rotation[axis], axis] } } return [0, -1] } ================================================ FILE: plugins/outline_creator.js ================================================ var createOutlineAction; Plugin.register('outline_creator', { icon: 'crop_square', title: 'Outline Creator', description: 'Creates stylistic outlines for cubes and meshes using negative scale values.', about: 'Select an element you want to create an outline for, go to the `Tools` menu and click on the `Create Outline` option.', author: 'Wither', version: '1.1.0', min_version: '4.2.0', variant: 'both', onload() { createOutlineAction = new Action({ id: 'create_outline', name: 'Create Outline', icon: 'crop_square', description: 'Create an outline for selected elements', click(ev) { if (selected.length === 0) { Blockbench.showMessageBox({ title: 'No valid elements selected', icon: 'error', message: 'You must select at least one cube or mesh!', buttons: ['OK'] }); } else if (!selected.find(el => el instanceof Cube || el instanceof Mesh)) { Blockbench.showMessageBox({ title: 'Invalid elements', icon: 'error', message: 'You can only add outlines to cubes and meshes!', buttons: ['OK'] }); } else { outlineSettings.show(); } } }); MenuBar.addAction(createOutlineAction, 'tools'); }, onunload() { createOutlineAction.delete(); } }) function createOutline(outline_thickness) { Undo.initEdit({elements: Outliner.elements, outliner: true}); // Cube handling for (const element of Cube.selected) { var outline = new Cube({ name: `${element.name}_outline`, from:[element.to[0] + outline_thickness, element.to[1] + outline_thickness, element.to[2] + outline_thickness], to:[element.from[0] - outline_thickness, element.from[1] - outline_thickness, element.from[2] - outline_thickness], rotation: element.rotation, origin: element.origin, faces: { north: { uv: element.faces.south.uv, texture: element.faces.south.texture, rotation: 180, cullface: element.faces.south.cullface }, south: { uv: element.faces.north.uv, texture: element.faces.north.texture, rotation: 180, cullface: element.faces.north.cullface }, west: { uv: element.faces.east.uv, texture: element.faces.east.texture, rotation: 180, cullface: element.faces.east.cullface }, east: { uv: element.faces.west.uv, texture: element.faces.west.texture, rotation: 180, cullface: element.faces.west.cullface }, up: { uv: element.faces.down.uv, texture: element.faces.down.texture, rotation: 180, cullface: element.faces.down.cullface }, down: { uv: element.faces.up.uv, texture: element.faces.up.texture, rotation: 180, cullface: element.faces.up.cullface } } }).init(); } // Mesh handling for (const mesh of Mesh.selected) { mesh.duplicate(); mesh.oldVertices = {}; for (const key in mesh.vertices) { mesh.oldVertices[key] = mesh.vertices[key].slice(); } mesh.forAllFaces(face => { face.invert(); }) mesh.resize(outline_thickness * 2, 0, false, false, true); mesh.resize(outline_thickness, 1, false, false, true); mesh.resize(outline_thickness * 2, 2, false, false, true); mesh.name = mesh.name + "_outline"; } Canvas.updateView({ elements: selected, element_aspects: {transform: true, geometry: true}, }) Undo.finishEdit('Created outlines'); } var outlineSettings = new Dialog({ title: 'Outline Settings', id: 'outline_settings', form: { thickness: {label: 'Thickness', type: 'number', value: 0.1, min: 0, step: 0.1} }, onConfirm: function(formResult) { outlineSettings.hide(); createOutline(formResult.thickness); } }); ================================================ FILE: plugins/outliner_group_exporter/LICENSE.MD ================================================ MIT License Copyright (c) 2024 MrCrayfish 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. ================================================ FILE: plugins/outliner_group_exporter/about.md ================================================ Group Exporter is a simple plugin that allows you to export groups from the outliner as a model. Only the cubes that are contained within the group will be exported. This plugin is only for the Java Block/Item format, and supporting custom formats. ## How to use Group Exporter - **Step 1:** Select a group in the outliner - **Step 2:** Right click the group and hover the option "Export" - **Step 3:** Click the format you want to export as - **Step 4:** Follow the steps as you would normally when exporting ## License Group Exporter is available under MIT ================================================ FILE: plugins/outliner_group_exporter/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2025-03-19", "author": "MrCrayfish", "categories": [ { "title": "Features", "list": [ "Initial release" ] } ] } } ================================================ FILE: plugins/outliner_group_exporter/members.yml ================================================ maintainers: - MrCrayfish ================================================ FILE: plugins/outliner_group_exporter/outliner_group_exporter.js ================================================ (function() { var separator; var actionExportGroup; var originalExportFunction; BBPlugin.register('outliner_group_exporter', { title: 'Group Exporter', author: 'MrCrayfish', icon: 'icon.png', description: 'A simple plugin to allow you to export a group from the outliner as a model. Only cubes inside the group will be exported.', tags: ['Minecraft Java Edition'], version: '1.0.0', min_version: '4.10.1', variant: 'both', onload() { // Setup action and separator separator = new MenuSeparator('export'); actionExportGroup = { name: "Export", id: 'export_outliner_group', icon: 'insert_drive_file', category: 'export', // Only allow on java_block format or custom formats that can support it (e.g. ones that use Cubes) condition: () => Format.id === 'java_block' || Format.allowOutlinerGroupExporting, children() { return MenuBar.menus.file.structure.find(menu => menu.id === 'export')?.children; } }; // Append the separator and action to group menu Group.prototype.menu.addAction(separator); Group.prototype.menu.addAction(actionExportGroup); let restrictCubes = (restrict) => { if(!restrict) return; // Get the top parent group let group = getCurrentGroup(); // If none selected, just return if(!group) { return; } // Find children cubes in the group let selectedCubes = []; group.forEachChild(cube => { selectedCubes.push(cube); }, Cube, false); // Update export flag on all cubes Cube.all.forEach(cube => { cube.export = selectedCubes.includes(cube); }); } // Resets the export flag on all cubes let resetCubes = (restrict) => { if(!restrict) return; Cube.all.forEach(cube => { cube.export = true; }); } // Override export function originalExportFunction = Codec.prototype.export; Codec.prototype.export = async function () { // Check if the menu is open. Is this okay for web/mobile app? let restrict = Group.prototype.menu == Menu.open; restrictCubes(restrict); originalExportFunction.call(this); resetCubes(restrict); }; }, onunload() { // Clean up Codec.prototype.export = originalExportFunction; Group.prototype.menu.removeAction(separator); Group.prototype.menu.removeAction('export_outliner_group'); } }); })() ================================================ FILE: plugins/pbr_preview/LICENSE.MD ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: plugins/pbr_preview/about.md ================================================ **Create and view PBR textures in Blockbench. Exports [USDZ](https://openusd.org/release/index.html) and in formats for labPBR (Java) or RenderDragon (Bedrock) shaders** > **_PBR:_ Physically based rendering**\ > Read the > _[Intoduction to Physically Based Rendering](https://learn.microsoft.com/en-us/minecraft/creator/documents/rtxpbrintro?view=minecraft-bedrock-stable "View Minecraft Creator documentation article.")_ > article in the Minecraft Creator documentation if you are not already familiar > with creating PBR content for Bedrock Edition. Visit the > [shaderLABS wiki](https://shaderlabs.org/wiki/Main_Page) for more information > on the labPBR material standard. ## Blockbench PBR Plugin Features ### PBR Material Preview - Preview PBR textures in Edit, Paint, and Animate mode. - Infers texture channels based on naming conventions when no channel has been explicitly defined. Intended for previewing imported existing Bedrock and Java PBR textures. - Uses Blockbench's preview scenes as model environment map. - PBR materials are updated with every edit to provide a live painting preview of the material in Blockbench. ### MER Maps > _MER:_ Metallic, emissive, and roughness maps assigned to red, green, and blue > channels respectively. It is the format used in Bedrock texture sets. #### Decode MER - MERs can be inferred and decoded automatically when PBR mode is enabled. - Decoding can be _slow_ on large textures (1024x+). - Assign an albedo map prior to decoding a MER to extract the emissive color. - Channels extracted from a MER can be saved as either separate textures or into separate layers in a single texture. #### Export MER - Compiles metal, emissive and roughness channels into MER texture. - (Emissive colors will be lost upon export. Use grayscale values in emissive channels for accurate brightness levels.) ### Generate Normal Map - Calculate normal map based on the assigned or inferred height map for the currently selected material/texture. ### Generate Ambient Occlusion Map - Generate an AO map from the material's normal map. (AO available in some labPBR shaders.) ### Texture Baking - Bake a normal and emissive maps onto the base color channel. - Output multiple light positions. - Choose ambient light settings before baking. ### Export Texture Set - Create a `.texture_set.json` file for the project textures. - Dialog allows defining values which can not be inferred from project. - Exports MER and normal maps in the process. ### labPBR Specular/Normal Maps - Export `_s` and `_n` files for PBR textures created in Blockbench. - Decode existing, imported labPBR textures into PBR material channels. ### Material Brush - Paint across multiple PBR channels simultaneously for a consistent material output. - Save material brush presets to a collection. - Automatic PBR preview updates after every brush stroke. ### Export USDZ Scenes - Adds new codec for exporting in USDZ format. ### `.bbmat` Codec Reuse and share PBR materials in Blockbench with this custom file format. ## Usage ### PBR Controls This plugin adds the _PBR Controls_ panel, which controls enabling and disabling PBR materials in Blockbench previews. #### Toggle PBR - Use the _PBR Preview_ toggle to toggle or refresh the PBR preview. Also found in the _View_ menu. >
    > Usage Tip > Toggling the PBR preview off and on may solve any texture discrepancies. Allowing the scene to render again will ensure all textures are up-to-date in the preview. >
    #### Toggle Corrected Lighting - Use the _Correct Lights_ toggle to enable or disable physically-corrected lighting in the preview scene. This may improve the appearance of reflective and emissive materials in the preview scene, but will dim the albedo/base color texture. #### Tone Mapping - The _Tone Mapping_ select will apply various tone mapping techniques to the preview scene. Use the _Linear_ option to match the tone map used by most Bedrock shaders. #### Exposure - The scene exposure can be adjusted once a tone map technique is selected. Values range from -2.0 to 2.0. ### Channel Management Control which textures or texture layers are used for PBR channels using the following methods: #### Create Material Texture - Use the _Create Material Texture_ action to create a blank texture with PBR material layers initialized.\ If an existing texture is selected, it will be used as the albedo channel in the PBR material. If the project has other textures, include those textures in the selection to have them automatically assigned to the new material's PBR channels. Follow these naming conventions to ensure the textures are assigned to the appropriate channels when creating a new material: #### Channel Naming Convention The plugin will assume that textures and layers which end in an underscore and a channel name are intended to be used as that channel. For example, `texture_roughness` will be used as the roughness map unless the channel has been manually assigned a texture. ##### Supported Channels | Channel | Description | Colorspace | | ----------- | --------------------- | ----------------------------------------------------------------- | | `ao` | Ambient Occlusion | **BW** | | `albedo` | Albedo / Base Color | **RGB** | | `normal` | DirectX Normal Map | **RGB** | | `metalness` | Metallic map | **BW** | | `roughness` | Roughness map | **BW** | | `emissive` | Emissive map | Displayed in **RGB**; Exported as **BW** in MER | | `sss` | Subsurface Scattering | **BW**; Not supported by shader but exported in MER alpha channel | ###### Supported Minecraft Shader Channels RenderDragon and labPBR textures are automatically decoded and displayed when the channels can be inferred based on the existence of MER, specular, or normal maps. Some features are not supported by the Blockbench preview's shader, such as AO and POM, but can still be decoded/encoded during texture import/export #### Explicit Channel Assignment Create a Texture Layer in Blockbench to enable channel assignment in PBR previews. Each channel can be selected from a menu and applied to the current material. The menu is visible in the _PBR Controls_ panel when in Paint mode. The menu options are available in the _Image_ menu, as well as in the context menu of a texture or layer, and in the Layers panel. #### Removing Channel Assignment Channels can be disabled by hiding or deleting the layer, or un-assigning the channel in the menu. Texture layers cannot be assigned to more than one channel. Assigning a layer to a new channel will clear the layer's current channel. #### Finding Assigned Channels Select a texture with material layers assigned to reveal the _PBR Channels_ panel. This panel displays the channels currently assigned in the selected texture. Click a channel in the menu to have it selected in the Layers panel. ### Material Brush Tool Use the _Material Brush Tool_ to paint across multiple PBR channels. The controls found in the _Material Brush Panel_. - Set the metallic, roughness and height values on a scale of 0% - 100% - Use the color picker in the _Material Brush Panel_ to set the emissive color. - The current color selected in the main color picker is used as the albedo color. - Only visible layers with channels assigned will be updated by the brush. - Blockbench's paint brush size and smoothness settings control the material brush's settings as well. #### Material Brush Presets Open the _Material Brush Presets_ dialog to define and save new brush settings, or to select and apply existing presets. A material preview is generated upon saving a preset. Select a preset to populate its values in the Material Brush input controls. ### `.bbmat` Files - Import Blockbench PBR materials by dropping a `.bbmat` file into a Blockbench project. - The import option is also available in the _File_ menu. - Export existing materials from texture content menu to save its assigned channels together in one file. ================================================ FILE: plugins/pbr_preview/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2024-05-25", "author": "Jason J. Gardner", "categories": [ { "title": "PBR plugin", "list": [ "Initial release 🚀" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2024-06-10", "author": "Jason J. Gardner", "categories": [ { "title": "Java Support", "list": [ "Added labPBR export option", "Added labPBR texture decoding" ] }, { "title": "Material Brush", "list": [ "Added material brush tool", "Added material brush preset dialog" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2024-06-20", "author": "Jason J. Gardner", "categories": [ { "title": "USDZ Export", "list": [ "Added USDZ export option", "Added normal map orientation options", "Created `.bbmat` codec" ] } ] }, "1.2.1": { "title": "1.2.1", "date": "2024-11-10", "author": "Jason J. Gardner", "categories": [ { "title": "Alpha Threshold Fix", "list": [ "Fixed alpha test threshold application on models.", "Alpha test value is 1%" ] } ] } } ================================================ FILE: plugins/pbr_preview/members.yml ================================================ maintainers: - jasonjgardner developers: - jasonjgardner ================================================ FILE: plugins/pbr_preview/pbr_preview.js ================================================ "use strict";(()=>{var _=THREE,ie=Vue,le=window.JSZip;var F="1.2.2",K="1.0.0",N="_NONE_",h={albedo:{id:"albedo",label:"Albedo",description:"The color of the material",map:"map",icon:"tonality",default:new _.Color(16777215),regex:new RegExp("(s|_)*(basecolor|color|albedo)","i")},metalness:{id:"metalness",label:"Metalness",description:"The material's metalness map",map:"metalnessMap",icon:"brightness_6",default:new _.Color(0),regex:new RegExp("[ _]*metal(lic|ness)?","i")},emissive:{id:"emissive",label:"Emissive",description:"The material's emissive map",map:"emissiveMap",icon:"wb_twilight",default:new _.Color(0),regex:new RegExp("[ _]*(emissive|emission)","i")},roughness:{id:"roughness",label:"Roughness",description:"The material's roughness map",map:"roughnessMap",icon:"grain",default:new _.Color(16777215),regex:new RegExp("[ _]*rough(ness)?","i")},height:{id:"height",label:"Height",description:"The material's height map",map:"bumpMap",icon:"landscape",default:new _.Color(16777215),regex:new RegExp("[ _]*(height|bump)","i")},normal:{id:"normal",label:"Normal",description:"The material's normal map",map:"normalMap",icon:"looks",default:new _.Color("rgb(128, 128, 255)"),regex:new RegExp("[ _]*normal","i")},ao:{id:"ao",label:"Ambient Occlusion",description:"The material's ambient occlusion map",map:"aoMap",icon:"motion_mode",default:new _.Color(16777215),regex:new RegExp("[ _]*(ao|ambientocclusion|ambient occlusion)","i")}},o={},y=[],C=[];var ce=[...Object.keys(h).map(e=>h[e].id),N];y.push(()=>{o.channelProp=new Property(TextureLayer,"enum","channel",{default:N,values:ce,label:"PBR Channel",exposed:!1}),o.textureChannelProp=new Property(Texture,"enum","channel",{default:N,values:ce,label:"PBR Channel",exposed:!1}),o.materialTextureProp=new Property(Texture,"boolean","material",{default:!1,label:"Material Texture"}),o.pbrMaterialsProp=new Property(ModelProject,"object","pbr_materials",{default:{},exposed:!1,label:"PBR Materials"}),o.projectMaterialsProp=new Property(ModelProject,"object","bb_materials",{default:{},exposed:!1,label:"Project Materials"}),o.projectPbrModeProp=new Property(ModelProject,"boolean","pbr_active",{default:!1,exposed:!1,values:[],label:"PBR Mode"})});function E(){return Texture.selected?Texture.selected:TextureLayer.selected?TextureLayer.selected.texture:Project?Project.selected_texture?Project.selected_texture:Project.textures.find(e=>e.selected)??null:Texture.all.find(e=>e.selected)??Texture.getDefault()}function R(){return TextureLayer.selected?TextureLayer.selected:Texture.selected?.selected_layer?Texture.selected.selected_layer:Project.selected_texture!==null&&Project.selected_texture?.layers_enabled===!0?Project.selected_texture.layers.find(e=>e.selected)??Project.selected_texture.layers[0]:E()?.getActiveLayer()??null}function G(){return Project?Project.model_identifier.length>0?Project.model_identifier:Project.getDisplayName():pathToName(E()?.name??"texture")}function ue(e,a){let t;return function(...r){let n=()=>{t=void 0,e.apply(this,r)};clearTimeout(t),t=setTimeout(n,a)}}function z(e){let a=MediaPreview.renderer??new _.WebGLRenderer({alpha:!0,antialias:!0}),t=new _.Scene,r=new _.PerspectiveCamera(75,96/96,.1,1e3),n=new _.AmbientLight(16777215,.75);t.add(n);let i=new _.PointLight(16777215,1,100);i.position.set(5,5,5),t.add(i);let s=new _.SphereGeometry(1,32,32),l=e instanceof _.MeshStandardMaterial&&e.isMeshStandardMaterial?e:new _.MeshStandardMaterial({color:e.albedo,metalness:e.metalness??0,roughness:e.roughness??1,emissive:e.emissive,bumpScale:e.height??0,envMap:PreviewScene.active?.cubemap??null,envMapIntensity:.5}),u=new _.Mesh(s,l);t.add(u),r.position.x=0,r.position.y=0,r.position.z=2,a.setSize(96,96),a.render(t,r);let m=a.domElement.toDataURL();return l.dispose(),MediaPreview.renderer||(a.clear(),a.dispose()),m}function Y(e,a){let t=a??document.createElement("canvas"),r=t.getContext("2d");if(!r)return t.remove(),null;let n=Math.max(Project?Project.texture_width:16,16),i=Math.max(Project?Project.texture_height:16,16);t.width=n,t.height=i,r.fillStyle=`rgb(${e.r*255}, ${e.g*255}, ${e.b*255})`,r.fillRect(0,0,n,i);let s=t.toDataURL();return a||t.remove(),s}var Ve=(e=!0)=>{let a=Project?Project.textures??Texture.all:Texture.all;return e?a.filter(t=>t.layers_enabled&&t.layers.length>0).flatMap(t=>t.layers):a},D=class e{constructor(a,t){this._scope=a??Ve(),this._materialUuid=t}merToCanvas(){let a=this.getTexture(h.emissive),t=this.getTexture(h.roughness),r=this.getTexture(h.metalness);if(!a&&!t&&!r){let{metalness:n,emissive:i,roughness:s}=this.decodeMer();n&&(r=e.makePixelatedCanvas(n)),i&&(a=e.makePixelatedCanvas(i)),s&&(t=e.makePixelatedCanvas(s))}return{emissiveMap:a,roughnessMap:t,metalnessMap:r}}getMaterial(a={}){let{emissiveMap:t,roughnessMap:r,metalnessMap:n}=Format.id.startsWith("bedrock")?this.merToCanvas():{emissiveMap:this.getTexture(h.emissive),roughnessMap:this.getTexture(h.roughness),metalnessMap:this.getTexture(h.metalness)},i=this.getTexture(h.normal);return new _.MeshStandardMaterial({map:this.getTexture(h.albedo)??e.makePixelatedCanvas(TextureLayer.selected?.canvas??Texture.all.find(s=>s.selected)?.canvas??Texture.getDefault().canvas),aoMap:this.getTexture(h.ao),bumpMap:this.getTexture(h.height),normalMap:i,metalnessMap:n,metalness:n?1:0,roughnessMap:r,roughness:1,emissiveMap:t,emissiveIntensity:t?1:0,emissive:t?16777215:0,envMap:PreviewScene.active?.cubemap??null,envMapIntensity:.95,alphaTest:.01,transparent:!0,...a})}renderMaterialPreview(){return z(this.getMaterial())}saveTexture(a,t){Project&&(Project.pbr_materials||(Project.pbr_materials={}),Project.pbr_materials[this._materialUuid]||(Project.pbr_materials[this._materialUuid]={}),Project.pbr_materials[this._materialUuid][a.id]=t.uuid,t.extend({channel:a.id}))}findTexture(a,t=!0){if(!Project)return null;let r=this._scope.find(u=>u.channel&&(u.channel===a||u.channel===a.id));if(r)return r;let[n,i]=typeof a=="string"?[a,new RegExp(`_*${a}(.[^.]+)?$`,"i")]:[a.id,a.regex??new RegExp(`_*${a.id}(.[^.]+)?$`,"i")];Project.pbr_materials=Project.pbr_materials??{};let s=Project.pbr_materials[this._materialUuid];if(t&&!s?.length&&n!==N)return this._scope.find(u=>i.test(u.name))??null;let l=s?.[n];return l?this._scope.find(u=>u.uuid===l)??null:null}static makePixelatedCanvas(a){let t=new _.CanvasTexture(a,void 0,void 0,void 0,_.NearestFilter,_.NearestFilter);return t.needsUpdate=!0,t}getTexture(a){let t=this.findTexture(a);return t?e.makePixelatedCanvas(t.canvas):null}static extractChannel(a,t){let r=a.canvas,{width:n,height:i}=r,s=r.getContext("2d");if(!s||!n||!i)return null;let l=document.createElement("canvas");l.width=n,l.height=i;let u=l.getContext("2d");if(!u)return null;let m={r:0,g:1,b:2,a:3}[t],{data:d}=s.getImageData(0,0,n,i),c=new Uint8ClampedArray(n*i*4);for(let g=0;ga){x[f]=v.data[f],x[f+1]=v.data[f+1],x[f+2]=v.data[f+2],x[f+3]=255;continue}x[f]=0,x[f+1]=0,x[f+2]=0,x[f+3]=255}return m.putImageData(new ImageData(x,l.width,l.height),0,0),{metalness:r,emissive:l,emissiveLevel:n,roughness:i,sss:s}}createMer(a=!1){let t=this.findTexture(h.metalness,a),r=this.findTexture(h.emissive,a),n=this.findTexture(h.roughness,a),i=this.findTexture("sss",!1),s=Math.max(t?.img.width??0,r?.img.width??0,n?.img.width??0,Project?Project.texture_width:0,16),l=Math.max(t?.img.height??0,r?.img.height??0,n?.img.height??0,Project?Project.texture_height:0,16),u=document.createElement("canvas");u.width=s,u.height=l;let m=u.getContext("2d");if(!m)return null;let d=t?.img?e.extractChannel(t,"r"):null,c=r?.img?e.extractChannel(r,"g"):null,v=n?.img?e.extractChannel(n,"b"):null,g=i&&i?.img?e.extractChannel(i,"a"):null,x=d?.getContext("2d")?.getImageData(0,0,s,l)??new ImageData(s,l),f=c?.getContext("2d")?.getImageData(0,0,s,l)??new ImageData(s,l),p=v?.getContext("2d")?.getImageData(0,0,s,l)??new ImageData(s,l),b=g?.getContext("2d")?.getImageData(0,0,s,l)??new ImageData(new Uint8ClampedArray(s*l*4).fill(255),s,l),M=new Uint8ClampedArray(s*l*4);for(let w=0;w{n&&new Texture({name:`${a.name}_${r}`,saved:!1,particle:!1,keep_size:!1}).fromDataURL(n.toDataURL()).add()}),t}createTexturesFromNormal(a){let t=this.decodeLabPbrNormal(a);return Object.entries(t).forEach(([r,n])=>{n&&new Texture({name:`${a.name}_${r}`,saved:!1,particle:!1,keep_size:!1}).fromDataURL(n.toDataURL()).add()}),t}};var V=class{constructor({lightHeight:a=.66,ambientLight:t=[.1,.1,.1],minLightIntensity:r=0,lightDiffuse:n=[1,1,1]}={}){this.lightHeight=a,this.ambientLight=t,this.minLightIntensity=r,this.lightDiffuse=n}bake(a,t,r){let n=t instanceof HTMLCanvasElement?t:this.createCanvas(t.width,t.height),i=r instanceof HTMLCanvasElement?r:this.createCanvas(r.width,r.height),s=n.getContext("2d"),l=i.getContext("2d");s.drawImage(t,0,0),l.drawImage(r,0,0);let u=s.getImageData(0,0,t.width,t.height),m=l.getImageData(0,0,r.width,r.height),d=[],c=[];for(let g=0;g{let x=this.createCanvas(t.width,t.height),f=x.getContext("2d"),p=f.getImageData(0,0,x.width,x.height),b=[Math.cos(g),Math.sin(g),this.lightHeight];for(let M=0;M{if(!Project)return;let r=Project.selected_texture??Texture.getDefault(),n=new D(r.layers_enabled?r.layers:Project.textures,r.uuid),i=n.findTexture(h.albedo);if(!i){Blockbench.showStatusMessage("Can not bake without a base color assigned.",3e3);return}let s=n.findTexture(h.normal);if(!s){Blockbench.showStatusMessage("Can not bake without a normal map assigned.",3e3);return}let u=new V(e).bake(a,i.canvas,s.canvas),m=new Texture({name:`${i.name}_baked`,saved:!1,particle:!1,keep_size:!1,layers_enabled:!0}).fromDataURL(u[0].toDataURL()),d=t?c=>{let v=n.findTexture(h.emissive);if(!v)return c;let g=v.canvas;if(!g.getContext("2d"))return c;let f=Math.max(c.width,g.width,Project?Project.texture_width:16),p=Math.max(c.height,g.height,Project?Project.texture_height:16),b=document.createElement("canvas");b.width=f,b.height=p;let M=b.getContext("2d");return M?(M.drawImage(c,0,0),M.globalCompositeOperation="screen",M.drawImage(g,0,0),b):c}:c=>c;u.forEach((c,v)=>{new TextureLayer({name:`baked_${v+1}`,data_url:d(c).toDataURL()},m).addForEditing()}),m.add().select(),Blockbench.showQuickMessage("Textures baked \u{1F950}",2e3)};y.push(()=>{o.bakeTexturesDialog=new Dialog("bake_textures",{id:"bake_textures",title:"Bake Textures",buttons:["Bake","Cancel"],form:{ambientLight:{type:"color",label:"Ambient Light",value:"#1f1f1f"},lightDiffuse:{type:"color",label:"Light Diffuse",value:"#ffffff"},lightHeight:{type:"range",label:"Light Height",min:0,max:1,step:.01,value:.66},minLightIntensity:{type:"range",label:"Minimum Light Intensity",min:0,max:1,step:.01,value:0},directions:{type:"number",label:"Directions",value:8,min:1,max:360,step:1},blendEmissive:{type:"checkbox",label:"Blend Emissive",value:!1}},onConfirm(e){let a=new _.Color(e.ambientLight.toString()),t=new _.Color(e.lightDiffuse.toString());me({ambientLight:[a.r,a.g,a.b],lightDiffuse:[t.r,t.g,t.b],lightHeight:Number(e.lightHeight),minLightIntensity:Number(e.minLightIntensity)},e.directions??8,e.blendEmissive??!1)}}),o.bakeTexturesAction=new Action("bake_textures",{icon:"cake",name:"Bake Textures",description:"Bakes textures for the selected PBR material",click(){o.bakeTexturesDialog?.show()}}),MenuBar.addAction(o.bakeTexturesAction,"tools")});C.push(()=>{MenuBar.removeAction("tools.bake_textures")});function de(e,a){let t=e.getTexture();if(!t||!Project)return null;let r=Project.materials[t.uuid];r.isShaderMaterial&&!Project.bb_materials[t.uuid]?Project.bb_materials[t.uuid]=r:r.isMeshStandardMaterial&&r.dispose();let n=new D(t.layers_enabled?t.layers.filter(i=>i.visible)??null:Project.textures,t.uuid).getMaterial({side:Canvas.getRenderSide(t),...a,alphaTest:.01});return Project.materials[t.uuid]=_.ShaderMaterial.prototype.copy.call(n,r),t}function Qe(e){return Object.values(e).filter(a=>a?(Canvas.updateAllFaces(a),!0):!1).length>0}function Je(e,a){let t={};return e.forAllFaces(r=>{let n=de(r,a);n&&(t[n.uuid]=n)}),t}function Xe(e,a){let t={};return Object.keys(e.faces).forEach(r=>{let n=e.faces[r],i=de(n,a);i&&(t[i.uuid]=i)}),t}var B=(e={})=>{if(!Project)return;let t=Project.elements.map(r=>r instanceof Mesh&&Je(r,e)||r instanceof Cube&&Xe(r,e)).reduce((r,n)=>({...r,...n}),{});Project.pbr_active=Texture.all.length>0&&t&&Qe(t)},A=(e=100)=>ue(B,e);var te={},ee=()=>Condition({modes:["edit","paint"],selected:{texture:!0},project:!0,method(){let e=E();return e&&!e.material?!0:e?.material===!0&&R()!==null&&Modes.paint}}),he=()=>Condition({modes:["paint","edit"],selected:{texture:!0},method(){let e=E();if(e?.material&&Modes.edit)return!1;let a=R()??e;return a?.channel&&a.channel!==N}});y.push(()=>{Object.entries(h).forEach(([e,a])=>{te[e]=new Action(`assign_channel_${e}`,{icon:a.icon??"tv_options_edit_channels",name:`Assign to ${a.label.toLocaleLowerCase()} channel`,description:`Assign the selected layer to the ${a.label} channel`,category:"textures",condition:ee,click(){let t=TextureLayer.selected??(Project?Project.selected_texture:null);if(!t)return;Undo.initEdit({layers:[t]}),t.extend({channel:a.id});let r=t instanceof TextureLayer?t.texture:t;r.updateChangesAfterEdit(),Project.pbr_materials[r.uuid]||(Project.pbr_materials[r.uuid]={}),Object.entries(Project.pbr_materials[r.uuid]).forEach(([n,i])=>{i===t.uuid&&(delete Project.pbr_materials[r.uuid][n],t.channel=N)}),r.uuid===t.uuid&&(Project.pbr_materials[r.uuid]={}),Project.pbr_materials[r.uuid][e]=t.uuid,Undo.finishEdit("Change channel assignment"),Blockbench.showQuickMessage(`Assigned "${t.name}" to ${a.label} channel`,2e3),B()}})})});C.push(()=>{Object.values(te).forEach(e=>{e.delete()})});y.push(()=>{o.unassignChannel=new Action("unassign_channel",{icon:"cancel",name:"Unassign Channel",description:"Unassign the selected layer from the channel",category:"textures",condition:he,click(){let e=TextureLayer.selected??(Project?Project.selected_texture:null);if(!e)return;Undo.initEdit({layers:[e]});let a=e instanceof TextureLayer?e.texture:e,t=e.channel;Project.pbr_materials[a.uuid]={},e.channel=N,a.updateChangesAfterEdit(),Undo.finishEdit("Unassign channel"),Blockbench.showQuickMessage(`Unassigned "${e.name}" from ${t} channel`,2e3),A()}}),o.channelMenu=new Menu("channel_menu",[...Object.keys(h).map(e=>`assign_channel_${e}`),"unassign_channel"],{onOpen(){A()}}),o.openChannelMenu=new Action("pbr_channel_menu",{name:"Assign to PBR Channel",icon:"texture",condition:()=>ee()||he(),click(e){o.channelMenu?.open(e)},children:[...Object.values(te),o.unassignChannel]}),o.showChannelMenu=new Action("show_channel_menu",{icon:"texture",name:"Assign to PBR Channel",description:"Assign the selected layer to a channel",category:"textures",condition:ee,click(e){o.channelMenu?.open(e)}}),o.openChannelMenu&&(MenuBar.addAction(o.openChannelMenu,"image.0"),Texture.prototype.menu.addAction(o.openChannelMenu,"0"),TextureLayer.prototype.menu.addAction(o.openChannelMenu,"0")),Toolbars.layers.add(o.showChannelMenu,1)});C.push(()=>{MenuBar.removeAction("image.pbr_channel_menu"),Texture.prototype.menu.removeAction("pbr_channel_menu"),TextureLayer.prototype.menu.removeAction("pbr_channel_menu"),Toolbars.layers.remove(o.showChannelMenu)});function $(e,a="DirectX",t=!1){let r=e.canvas.getContext("2d");if(!r)return null;let n=Math.max(e.img.width??e.canvas.width,Project?Project.texture_width:0,16),i=Math.max(e.img.height??e.canvas.height,Project?Project.texture_height:0,16),{data:s}=r.getImageData(0,0,n,i),l=document.createElement("canvas"),u=l.getContext("2d");if(!u)return null;let m=(p,b)=>{let M=(p+b*n)*4;return s[M]/255};l.width=n,l.height=i,u.drawImage(e.img,0,0,n,i);let d=u.getImageData(0,0,n,i),c=d.data,v=p=>{let b=Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);return[p[0]/b,p[1]/b,p[2]/b]};for(let p=0;p{let f=(g+x*t)*4;return n[f]/255};i.width=t,i.height=r,s.drawImage(e.img,0,0,t,r);let u=s.getImageData(0,0,t,r),m=u.data;for(let g=0;g{let t=R()??E()??Texture.getDefault();if(!t)return;let r=$(t,a,!1);if(!r){Blockbench.showQuickMessage("Failed to generate normal map",2e3);return}r.select(e),new D(t instanceof Texture&&t.layers_enabled?t.layers:null,t.uuid).saveTexture(h.normal,r),Blockbench.showQuickMessage("Normal map generated",2e3)};y.push(()=>{o.generateDirectXNormal=new Action("generate_dx_normal",{icon:h.normal.icon??"altitude",name:"Generate DirectX Normal Map",description:"Generates a DirectX normal map from the height map",condition:()=>(R()??E())!==null,click:e=>ge(e)}),o.generateOpenGlNormal=new Action("generate_opengl_normal",{icon:h.normal.icon??"altitude",name:"Generate OpenGL Normal Map",description:"Generates an OpenGL normal map from the height map",condition:()=>(R()??E())!==null,click:e=>ge(e,"OpenGL")}),o.generateAo=new Action("generate_ao",{icon:h.ao.icon??"motion_mode",name:"Generate Ambient Occlusion Map",description:"Generates an ambient occlusion map from the height map",condition:{selected:{texture:!0},project:!0},click(){let e=R()??E()??Texture.getDefault();if(!e)return;let a=new D(e instanceof Texture&&e.layers_enabled?e.layers:null,e.uuid),t=a.findTexture(h.normal)??$(e);if(!t){Blockbench.showQuickMessage("Unable to generate ambient occlusion map without a normal map",2e3);return}let r=pe(t);if(r){a.saveTexture(h.ao,r),r.select(),Blockbench.showQuickMessage("Ambient occlusion map generated",2e3);return}Blockbench.showQuickMessage("Failed to generate ambient occlusion map",2e3)}}),o.generateNormal=new Action("generate_normal",{children:[o.generateDirectXNormal,o.generateOpenGlNormal],name:"Generate Normal Map",description:"Generates a normal map from the height map",condition:()=>(R()??E())!==null,click(){},icon:h.normal.icon??"altitude"}),MenuBar.addAction(o.generateNormal,"tools"),MenuBar.addAction(o.generateAo,"tools")});C.push(()=>{MenuBar.removeAction("tools.generate_normal"),MenuBar.removeAction("tools.generate_ao")});var Ze=(e,a="texture")=>{e.toBlob(async t=>{t&&Blockbench.export({content:await t.arrayBuffer(),type:"PNG",name:`${a}_n`,extensions:["png"],resource_id:"normal_map",savetype:"image"})})},We=(e,a="texture")=>{e.toBlob(async t=>{t&&Blockbench.export({content:await t.arrayBuffer(),type:"PNG",name:`${a}_s`,extensions:["png"],resource_id:"specular_map",savetype:"image"})})};y.push(()=>{o.generateLabPbr=new Action("generate_lab_pbr",{icon:"experiment",name:"Generate labPBR textures",description:"Generate a specular and normal map in labPBR format for Java shaders",condition:{formats:["java_block"],project:!0},async click(){let e=E();if(!e)return;let t=new D(e.layers_enabled?e.layers:[e],e.uuid).createLabPbrOutput();if(t===null)return;let r=e.name??(Project?Project.getDisplayName():"texture");await Promise.all([Ze(t.normalMap,pathToName(r)),We(t.specular,pathToName(r))]),Blockbench.showQuickMessage("Exported labPBR textures")}}),o.decodeLabPbr=new Action("decode_lab_pbr",{icon:"frame_source",name:"Decode labPBR textures",description:"Decodes the selected texture into a specular or normal map in labPBR format",condition:{formats:["java"],project:!0,selected:{texture:!0}},click(){let e=TextureLayer.selected?.texture??Texture.all.find(t=>t.selected)??Texture.getDefault(),a=new D(e.layers_enabled?e.layers:[e],e.uuid);if(pathToName(e.name).endsWith("_n")){a.createTexturesFromNormal(e);return}if(pathToName(e.name).endsWith("_s")){a.createTexturesFromSpecular(e);return}Blockbench.showQuickMessage("Failed to decode labPBR texture")}}),MenuBar.addAction(o.generateLabPbr,"file.export"),MenuBar.addAction(o.decodeLabPbr,"tools")});C.push(()=>{MenuBar.removeAction("file.export.generate_lab_pbr")});y.push(()=>{o.createMaterialTexture=new Action("create_material_texture",{icon:"deployed_code",name:"Create Material Texture",description:"Creates a new texture for a PBR material",condition:{modes:["edit","paint"],project:!0},click(){if(!Project)return;let e={...h},a=new Texture({name:"New Material",saved:!1,particle:!1});a.extend({material:!0});let t=Texture.all.filter(s=>(s.selected||s.multi_selected)&&!s.material)??Texture.all,r=E(),n=r?new D(t,r.uuid):null;try{let s=n?.findTexture(h.albedo,!0)?.canvas.toDataURL()??r?.canvas.toDataURL()??Y(new _.Color(8421504),a.canvas);if(!s)return;a.fromDataURL(s);let l=new TextureLayer({name:e.albedo.label,visible:!0,data_url:s,keep_size:!0},a);l.extend({channel:e.albedo.id}),l.addForEditing(),l.texture.updateChangesAfterEdit(),n?.saveTexture(e.albedo,l),delete e.albedo}catch(s){console.warn("Failed to create base color texture",s),Blockbench.showStatusMessage("Failed to create base color texture in new material",3e3)}let i=Object.keys(e).reverse().map(s=>{let l=h[s],u=n?.findTexture(l,!0),m=u?u.canvas.toDataURL():Y(l.default??new _.Color(0));if(!m)return;let d=new TextureLayer({name:l.label,visible:!0,data_url:m,keep_size:!0},a);return d.extend({channel:l.id}),n?.saveTexture(l,d),d}).filter(Boolean);Undo.initEdit({textures:Texture.all,layers:i}),a.add().select(),a.activateLayers(),i.map(s=>{s.addForEditing(),a.width=Math.max(a.width,s.img.width),a.height=Math.max(a.height,s.img.height)}),a.updateChangesAfterEdit(),Undo.finishEdit("Create Material Texture")}}),MenuBar.addAction(o.createMaterialTexture,"tools"),Toolbars.texturelist.add(o.createMaterialTexture,3)});C.push(()=>{MenuBar.removeAction("tools.create_material_texture"),Toolbars.texturelist.remove("create_material_texture")});var Q=(e,a)=>{let t=E()??Texture.getDefault(),r=new D(t.layers_enabled?t.layers:Project?Project.textures:null,t.uuid).createMer(!0);if(!r)throw new Error("Failed to generate MER map from selected texture.");r.toBlob(async n=>{if(!n)throw new Error("Failed to save MER map.");let[i,s]=Project?[e?`${e}_mer`:`${t.name??Project.getDisplayName()}_mer`,Project.export_path]:["mer"];Blockbench.export({content:await n.arrayBuffer(),type:"PNG",name:i,extensions:["png"],resource_id:"mer",savetype:"image",startpath:s},a)})};y.push(()=>{o.generateMer=new Action("create_mer",{icon:"lightbulb_circle",name:"Export MER",description:"Exports a texture map from the metalness, emissive, and roughness channels. (For use in Bedrock resource packs.)",condition:{formats:["bedrock","bedrock_block"],project:!0},click(){try{Q()}catch(e){console.error("Failed to export MER map:",e),Blockbench.showStatusMessage("Failed to export MER map",3e3)}}}),o.decodeMer=new Action("decode_mer",{name:"Decode MER",icon:"arrow_split",condition:{formats:["bedrock","bedrock_block"],project:!0,selected:{texture:!0}},children:[{icon:"move_item",name:"Decode MER to Textures",description:"Decodes a MER texture map into metalness, emissive, and roughness channels into separate textures",click(){let e=E()??Texture.getDefault(),a=new D([e],e.uuid),t=a.decodeMer(),r=[h.metalness,h.emissive,h.roughness];Undo.initEdit({textures:[e]}),r.forEach(n=>{let i=n.id,s=t[i];if(!s){Blockbench.showStatusMessage(`Failed to decode ${n.label} channel`,3e3);return}let l=new Texture({name:`${e?.name}_${i}`,keep_size:!1}).fromDataURL(s.toDataURL());l.add(!0),a.saveTexture(n,l)}),Undo.finishEdit("Decode MER to textures")}},{icon:"move_group",name:"Decode MER to Layers",description:"Decodes a MER texture map into metalness, emissive, and roughness channels into material layers",condition:()=>E()?.layers_enabled===!0,click(){let e=E()??Texture.getDefault(),a=new D(e.layers_enabled?e.layers:[e],e.uuid),t=a.decodeMer(),r=[h.metalness,h.emissive,h.roughness];Undo.initEdit({textures:[e]}),r.forEach(n=>{let i=n.id,s=t[i];if(!s){Blockbench.showStatusMessage(`Failed to decode ${n.label} channel`,3e3);return}let l=new TextureLayer({name:`${e?.name}_${i}`,data_url:s.toDataURL()},e);a.saveTexture(n,l),l.addForEditing()}),Undo.finishEdit("Decode MER to layers")}}],click(){}}),MenuBar.addAction(o.decodeMer,"tools"),MenuBar.addAction(o.generateMer,"file.export")});C.push(()=>{MenuBar.removeAction("file.export.create_mer"),MenuBar.removeAction("tools.decode_mer")});var qe=()=>{Project&&Project.textures.forEach(e=>{let a=new D(null,e.uuid),t=a.findTexture(h.normal,!1),r=a.findTexture(h.height,!1),n=a.findTexture(h.albedo,!1),i=a.findTexture(h.metalness,!1)?.name,s=a.findTexture(h.emissive,!1)?.name,l=a.findTexture(h.roughness,!1)?.name,u={};return n||(u.baseColor={type:"color",label:"Base Color",value:"#ff00ff"}),!i&&!s&&!l&&(u.metalness={label:"Metalness",type:"range",min:0,max:255,step:1,value:0},u.emissive={label:"Emissive",type:"range",min:0,max:255,step:1,value:0},u.roughness={label:"Roughness",type:"range",min:0,max:255,step:1,value:0}),t&&(u.depthMap={type:"checkbox",label:"Normal Map",value:"normal"}),r&&(u.depthMap={type:"checkbox",label:"Height Map",value:"heightmap"}),t&&r&&(u.depthMap={type:"radio",label:"Depth Map",options:{normal:"Normal Map",heightmap:"Height"},value:"normal"}),o.textureSetDialog=new Dialog("texture_set",{id:"texture_set",title:"Create Texture Set JSON",buttons:["Create","Cancel"],form:u,cancelIndex:1,onConfirm(m){let d=G(),c=i||s||l,v={format_version:"1.16.100","minecraft:texture_set":{color:(n?d:m.baseColor?.toHexString())??d,metalness_emissive_roughness:[m.metalness??0,m.emissive??0,m.roughness??255]}};m.depthMap==="normal"&&t||!r&&t?v["minecraft:texture_set"].normal=`${d}_normal`:(!t||m.depthMap==="heightmap")&&r&&(v["minecraft:texture_set"].heightmap=`${d}_heightmap`);let g=p=>{if(!m.depthMap)return p();let b=m.depthMap==="normal"||m.depthMap&&!r,M=b?t:r;if(!M)return p();Blockbench.export({content:M.canvas.toDataURL()??"",type:"PNG",name:`${d}_${b?"normal":"heightmap"}`,extensions:["png"],resource_id:m.depthMap,startpath:Project.export_path,savetype:"image"},w=>{v["minecraft:texture_set"][b?"normal":"heightmap"]=pathToName(w,!1),p()})},x=p=>{if(!n)return p();Blockbench.export({content:n.canvas.toDataURL(),extensions:["png"],type:"PNG",name:d,startpath:Project.export_path,savetype:"image"},b=>{v["minecraft:texture_set"].color=pathToName(b,!1),p()})},f=()=>g(()=>{x(()=>{Blockbench.export({content:JSON.stringify(v,null,2),type:"JSON",name:`${d}.texture_set`,extensions:["json"],resource_id:"texture_set",startpath:Project.export_path,savetype:"text"},()=>{Blockbench.showQuickMessage("Texture set created",2e3),o.textureSetDialog?.hide()})})});if(c){try{Q(d,p=>{v["minecraft:texture_set"].metalness_emissive_roughness=pathToName(p,!1),f()})}catch(p){console.warn("Failed to export MER map:",p),Blockbench.showStatusMessage("Failed to export MER map",3e3)}return}f()}}),o.textureSetDialog.show()})};y.push(()=>{o.createTextureSet=new Action("create_texture_set",{name:"Create Texture Set",icon:"layers",description:"Creates a texture set JSON file. Generates a MER when metalness, emissive, or roughness channels are set.",click(){qe()},condition:{formats:["bedrock","bedrock_block"],project:!0}}),MenuBar.addAction(o.createTextureSet,"file.export")});C.push(()=>{MenuBar.removeAction("file.export.create_texture_set")});y.push(()=>{o.toggleCorrectLights=new Toggle("correct_lights",{category:"preview",name:"Correct Lights",description:"Corrects the lighting in the preview",icon:"fluorescent",default:!1,onChange(e){Preview.all.forEach(a=>{a.renderer.physicallyCorrectLights=e}),Preview.selected.renderer.physicallyCorrectLights=e,Blockbench.showQuickMessage(`Physically corrected lighting is now ${e?"enabled":"disabled"}`,2e3),e&&o.togglePbr?.set(!0),B()},click(){}}),MenuBar.addAction(o.toggleCorrectLights,"preview")});C.push(()=>{MenuBar.removeAction("preview.correct_lights")});var J=()=>{!Project||!Project.bb_materials||(Project.elements.forEach(e=>{e instanceof Cube&&Object.keys(e.faces).forEach(a=>{let r=e.faces[a].getTexture();if(!r)return;let n=Project.bb_materials[r.uuid];n&&(Project.materials[r.uuid]=n)})}),Project.pbr_active=!1,Canvas.updateAll())};var fe=["undo","redo","add_texture","finish_edit","finished_edit","load_project","select_preview_scene","change_texture_path","select_project","load_undo_save","add_cube"],xe=()=>Project&&Project.pbr_active&&B(),Ke=()=>{Blockbench.on(fe.join(" "),xe)},be=()=>{fe.forEach(e=>{Blockbench.removeListener(e,xe)})};y.push(()=>{o.togglePbr=new Toggle("toggle_pbr",{name:"PBR Preview",description:"Toggle PBR Preview",icon:"panorama_photosphere",category:"view",default:!1,click(){},onChange(e){if(e){B(),Ke(),Blockbench.showQuickMessage("PBR Preview is now enabled");return}J(),be(),Blockbench.showQuickMessage("PBR Preview is now disabled")}}),MenuBar.addAction(o.togglePbr,"view")});C.push(()=>{be(),MenuBar.removeAction("view.toggle_pbr")});var ve=e=>{let a=Math.max(-2,Math.min(2,e));Preview.all.forEach(t=>{t.renderer.toneMappingExposure=a}),Preview.selected.renderer.toneMappingExposure=a};y.push(()=>{o.exposureSlider=new NumSlider("display_settings_exposure",{category:"preview",name:"Exposure",description:"Adjusts the exposure of the scene",type:"number",value:1,icon:"exposure",settings:{min:-2,max:2,step:.01,default:1},onBefore(){Number(o.tonemappingSelect?.get())===_.NoToneMapping&&o.tonemappingSelect.change(_.LinearToneMapping.toString()),o.togglePbr?.set(!0)},onChange(e){ve(Number(e))},onAfter(){A()}}),o.resetExposureButton=new Action("display_settings_reset_exposure",{category:"preview",name:"Reset Exposure",description:"Resets the exposure of the scene",icon:"exposure_plus_1",condition:()=>o.exposureSlider!==void 0&&Number(o.exposureSlider?.get())!==1,click(){ve(1),o.exposureSlider?.setValue(1,!0),A()}}),o.tonemappingSelect=new BarSelect("display_settings_tone_mapping",{category:"preview",name:"Tone Mapping",description:"Changes the tone mapping of the preview",type:"select",default_value:_.NoToneMapping,value:Preview.selected.renderer.toneMapping??_.NoToneMapping,icon:"monochrome_photos",options:{[_.NoToneMapping]:"No Tone Mapping",[_.LinearToneMapping]:"Linear",[_.ReinhardToneMapping]:"Reinhard",[_.CineonToneMapping]:"Cineon",[_.ACESFilmicToneMapping]:"ACES"},onChange({value:e}){Preview.selected.renderer.toneMapping=Number(e);let a=1;Preview.selected.renderer.toneMapping===_.NoToneMapping?o.exposureSlider?.setValue(a,!0):a=Number(o.exposureSlider?.get()??1),Preview.all.forEach(t=>{t.renderer.toneMapping=Number(e),t.renderer.toneMappingExposure=a}),Preview.selected.renderer.toneMappingExposure=a,Blockbench.showQuickMessage(`Tone mapping set to ${this.getNameFor(e)}`,2e3),o.togglePbr&&!o.togglePbr.value&&o.togglePbr.set(!0),B()}})});var ae=class{async parse(a){let t=new le,r="model.usda";t.file(r,"");let n=we(),i={},s={};a.traverseVisible(m=>{if(!m.isMesh)return;let d=m;if(!d.material.isMeshStandardMaterial){console.warn("THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)",m);return}let c=d.geometry,v=d.material,g="geometries/Geometry_"+c.id+".usd";if(!t.file(g)){let x=rt(c);t.file(g,et(x))}v.uuid in i||(i[v.uuid]=v),n+=tt(d,c,v)}),n+=lt(i,s),t.file(r,n),n=null;for(let m in s){let d=s[m],c=m.split("_")[1],v=d.format===_.RGBAFormat,g=Ye(d.image,c),f=await(await new Promise(p=>g.toBlob(b=>b&&p(b),v?"image/png":"image/jpeg",1))).arrayBuffer();t.file(`textures/Texture_${m}.${v?"png":"jpg"}`,f)}let l=0;t.forEach(async m=>{let d=34+m.length;l+=d;let c=l&63,v=await t.file(m).async("uint8array");if(c!==4){let g=64-c,x=new Uint8Array(g),f=new Uint8Array(v.length+g);f.set(v,0),f.set(x,v.length),t.file(m,f)}l+=v.length});let u=await t.generateAsync({type:"blob",compression:"STORE"});return new Uint8Array(await u.arrayBuffer())}};function Ye(e,a){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&e instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){let t=1024/Math.max(e.width,e.height),r=document.createElement("canvas");r.width=e.width*Math.min(1,t),r.height=e.height*Math.min(1,t);let n=r.getContext("2d");if(n.imageSmoothingEnabled=!1,n.drawImage(e,0,0,r.width,r.height),a!==void 0){let i=parseInt(a,16),s=(i>>16&255)/255,l=(i>>8&255)/255,u=(i&255)/255,m=n.getImageData(0,0,r.width,r.height),d=m.data;for(let c=0;c ) { matrix4d xformOp:transform = ${n} uniform token[] xformOpOrder = ["xformOp:transform"] rel material:binding = } `}function at(e){let a=e.elements;return`( ${X(a,0)}, ${X(a,4)}, ${X(a,8)}, ${X(a,12)} )`}function X(e,a){return`(${e[a+0]}, ${e[a+1]}, ${e[a+2]}, ${e[a+3]})`}function rt(e){return` def "Geometry" { ${nt(e)} } `}function nt(e){let a="Geometry",t=e.attributes,r=t.position.count;return` def Mesh "${a}" { int[] faceVertexCounts = [${st(e)}] int[] faceVertexIndices = [${ot(e)}] normal3f[] normals = [${_e(t.normal,r)}] ( interpolation = "vertex" ) point3f[] points = [${_e(t.position,r)}] float2[] primvars:st = [${it(t.uv,r)}] ( interpolation = "vertex" ) uniform token subdivisionScheme = "none" } `}function st(e){let a=e.index!==null?e.index.count:e.attributes.position.count;return Array(a/3).fill(3).join(", ")}function ot(e){let a=e.index,t=[];if(a!==null)for(let r=0;r float2 inputs:scale = ${ye(l.repeat)} float2 inputs:translation = ${ye(l.offset)} float2 outputs:result } def Shader "Texture_${l.id}_${u}" { uniform token info:id = "UsdUVTexture" asset inputs:file = @textures/Texture_${d}.${c?"png":"jpg"}@ float2 inputs:st.connect = token inputs:wrapS = "repeat" token inputs:wrapT = "repeat" float outputs:r float outputs:g float outputs:b float3 outputs:rgb }`}let s=e;if(s.map!==null?(r.push(`${t}color3f inputs:diffuseColor.connect = `),n.push(i(s.map,"diffuse",s.color))):r.push(`${t}color3f inputs:diffuseColor = ${Me(s.color)}`),s.emissiveMap!==null?(r.push(`${t}color3f inputs:emissiveColor.connect = `),n.push(i(s.emissiveMap,"emissive"))):s.emissive.getHex()>0&&r.push(`${t}color3f inputs:emissiveColor = ${Me(s.emissive)}`),s.normalMap!==null&&(r.push(`${t}normal3f inputs:normal.connect = `),n.push(i(s.normalMap,"normal"))),s.aoMap!==null&&(r.push(`${t}float inputs:occlusion.connect = `),n.push(i(s.aoMap,"occlusion"))),s.roughnessMap!==null&&s.roughness===1?(r.push(`${t}float inputs:roughness.connect = `),n.push(i(s.roughnessMap,"roughness"))):r.push(`${t}float inputs:roughness = ${s.roughness}`),s.metalnessMap!==null&&s.metalness===1?(r.push(`${t}float inputs:metallic.connect = `),n.push(i(s.metalnessMap,"metallic"))):r.push(`${t}float inputs:metallic = ${s.metalness}`),s.alphaMap!==null?(r.push(`${t}float inputs:opacity.connect = `),r.push(`${t}float inputs:opacityThreshold = 0.0001`),n.push(i(s.alphaMap,"opacity"))):r.push(`${t}float inputs:opacity = ${s.opacity}`),s.isMeshPhysicalMaterial){let l=s;r.push(`${t}float inputs:clearcoat = ${l.clearcoat}`),r.push(`${t}float inputs:clearcoatRoughness = ${l.clearcoatRoughness}`),r.push(`${t}float inputs:ior = ${l.ior}`)}return` def Material "Material_${s.id}" { def Shader "PreviewSurface" { uniform token info:id = "UsdPreviewSurface" ${r.join(` `)} int inputs:useSpecularWorkflow = 0 token outputs:surface } token outputs:surface.connect = token inputs:frame:stPrimvarName = "st" def Shader "uvReader_st" { uniform token info:id = "UsdPrimvarReader_float2" token inputs:varname.connect = float2 inputs:fallback = (0.0, 0.0) float2 outputs:result } ${n.join(` `)} } `}function Me(e){return`(${e.r}, ${e.g}, ${e.b})`}function ye(e){return`(${e.x}, ${e.y})`}var Te=ae;y.push(()=>{let e=new Codec("usdz",{extension:"usdz",name:"USDZ",remember:!0,export_options:{normal_type:{type:"select",label:"Normal Map Type",default:"opengl",options:{opengl:"OpenGL",directx:"DirectX"}}},fileName(){return G()+".usdz"},async compile(a={}){if(!Project)throw new Error("No project loaded");let t=Object.assign(this.getExportOptions(),a);Project.textures.forEach(s=>{if(!s.material)return;let l=new D(s.layers,s.uuid),u=l.findTexture("normal",!0);if(!u)return;let m=$(u,t.normal_type);m&&l.saveTexture(h.normal,m)}),B();let r=new Te,n=new _.Scene;n.name="blockbench_export",n.add(Project.model_3d);let i=await r.parse(n);return this.dispatchEvent("compile",{model:i,options:t}),Canvas.scene.add(Project.model_3d),i},async export(a={}){let t=await this.compile(a);Blockbench.export({content:t,name:this.fileName(),startpath:this.startPath(),resource_id:"usdz",type:this.name,extensions:["usdz"],savetype:"buffer"},r=>this.afterDownload(r))}});o.exportUsdz=new Action("export_usdz",{category:"file",name:"Export USDZ",description:"Exports the current model as a USDZ file",icon:"stacks",async click(){if(!e)return;let a=await e.promptExportOptions();await e.export(a)}}),o.usdz=e,MenuBar.addAction(o.exportUsdz,"file.export")});C.push(()=>{MenuBar.removeAction("file.export_usdz")});y.push(()=>{o.bbmat=new Codec("material",{name:"Blockbench Material",extension:"bbmat",remember:!1,load_filter:{extensions:["bbmat"],type:"json"},compile(){if(!Texture.selected?.material||!Texture.selected?.layers_enabled)return;let e=Texture.selected.layers.map(a=>{let t=a.channel,r=a.canvas.toDataURL();return[t,r]});return JSON.stringify({version:K,channels:Object.fromEntries(e)})},parse(e,a){return e=typeof e=="string"?JSON.parse(e):e,e.version!==K?(Blockbench.showMessageBox({title:"Invalid Blockbench Material Version",message:`The material file "${a}" is not compatible with version ${F} of the PBR plugin.`,buttons:["OK"],confirm:0,width:400,cancel:0,checkboxes:{}},()=>null),{}):e.channels},load(e,a,t){if(!Project)return;let r=this.parse(e,a.path),n=Object.keys(r);if(!n.length)throw new Error("No valid channels found in the material");let i=r[h.albedo.id]??r[n[0]];n.includes("preview")&&(i=r.preview);let s=new Texture({name:pathToName(a.name),saved:!0,particle:!1,source:i,layers_enabled:!0});s.extend({material:!0});let l=n.map(u=>{if(!(u in h))return null;let m=r[u],d=new TextureLayer({name:u,data_url:m,visible:!0},s);return d.extend({channel:u}),d}).filter(Boolean);if(!l.length)throw new Error("No valid channel layers found in the material");i||s.fromDataURL(l[0].canvas.toDataURL()),s.add().select(),l.forEach(u=>{u.addForEditing(),s.width=Math.max(s.width,u.img.width),s.height=Math.max(s.height,u.img.height)}),s.updateChangesAfterEdit()},export(){Blockbench.export({resource_id:"material",type:this.name,extensions:[this.extension],name:`${Texture.selected?.name??this.fileName??"material"}.bbmat`,startpath:this.startPath(),content:this.compile()},e=>this.afterDownload(e))}}),o.bbMatExport=new Action("export_bbmat",{icon:"stacks",name:"Save as .bbmat",category:"file",condition:{project:!0,selected:{texture:!0},method(){return Texture.selected?.material}},click(){o.bbmat?.export?.()}}),o.bbMatImport=new Action("import_bbmat",{icon:"stacks",name:"Import .bbmat",category:"file",condition:{project:!0},click(){Blockbench.import({extensions:["bbmat"],type:"json",title:"Import .bbmat",multiple:!0},e=>{o.bbmat?.load&&e.forEach(a=>{o.bbmat.load(a.content,a,!0)})})}}),o.bbmat.export_action=o.bbMatExport,Texture.prototype.menu.addAction(o.bbMatExport),MenuBar.addAction(o.bbMatImport,"file.import")});C.push(()=>{Texture.prototype.menu.removeAction("export_bbmat"),MenuBar.removeAction("file.import.import_bbmat")});var Z=class e{constructor({colors:a}){this._colors={...Object.fromEntries(Object.keys(h).map(t=>[t,h[t].default??new _.Color(4294967040)])),...a}}get colors(){return this._colors}set colors(a){this._colors={...this._colors,...a}}toString(){let a=Object.entries(this._colors).map(([t,r])=>[t,r.getHexString()]);return JSON.stringify(a)}getChannel(a){return this._colors[a]}static makeLinearColor(a){let t=Math.min(1,Math.max(0,a));return new _.Color(t,t,t).convertSRGBToLinear()}static fromSettings(){let a="#000000",t=Number(o.brushMetalnessSlider?.get()),r=Number(o.brushRoughnessSlider?.get()??1),n=(o.brushEmissiveColor?.get()??a).toString(),i=Number(o.brushHeightSlider?.get()),s=ColorPanel.get(),l={[h.albedo.id]:new _.Color(s),[h.metalness.id]:e.makeLinearColor(t),[h.roughness.id]:e.makeLinearColor(r),[h.emissive.id]:new _.Color(n??a),[h.height.id]:e.makeLinearColor(i)};return new e({colors:l})}};var Ce="materialBrushPresets",re=()=>JSON.parse(localStorage.getItem(Ce)||"{}"),ut=(e,a)=>{let t=re(),r=a??guid(),n=o.userMaterialBrushPresets?.getFormResult()??{},i={};return n.albedo&&(i.albedo=n.albedo.toString()),n.metalness&&(i.metalness=Number(n.metalness)),n.roughness&&(i.roughness=Number(n.roughness)),n.emissive&&(i.emissive=n.emissive.toString()),n.height&&(i.height=Number(n.height)),t[r]=[i,e??"New Preset",z(i)],localStorage.setItem(Ce,JSON.stringify(t)),r},Ee=({metalness:e,roughness:a,emissive:t,height:r,albedo:n})=>{e!==void 0&&o.brushMetalnessSlider?.setValue(e||0,!0),a!==void 0&&o.brushRoughnessSlider?.setValue(a??1,!0),t!==void 0&&o.brushEmissiveColor?.set(t??"#000000"),r!==void 0&&o.brushHeightSlider?.setValue(Math.max(0,Math.min(1,r??.5)),!0),n!==void 0&&ColorPanel.set(n)},W=({id:e})=>Condition({project:!0,tools:["material_brush"],method(){let a=E();return(a?.layers_enabled&&a.layers.find(({channel:t})=>t&&t===e)!==void 0)===!0}}),mt=ie.extend({name:"UserPresetsDialog",data(){return{userPresets:{},channels:h}},methods:{applyPreset(e){try{let[a,t]=this.userPresets[e],{metalness:r,roughness:n,emissive:i,height:s,albedo:l}=a;Ee({metalness:Number(r),roughness:Number(n),emissive:i.toString(),height:Number(s),albedo:l.toString()}),o.userMaterialBrushPresets?.hide(),Blockbench.showQuickMessage(`Preset "${t}" applied`,2e3)}catch{Blockbench.showQuickMessage("Failed to apply preset",2e3)}},deletePreset(e){Blockbench.showMessageBox({title:"Delete Preset",message:"Are you sure you want to delete this preset?",confirm:1,cancel:0,buttons:["Cancel","Delete"],checkboxes:{},width:400},a=>{if(a){let t=re(),r=this.userPresets[e][1]??e;delete t[e],localStorage.setItem("materialBrushPresets",JSON.stringify(t)),this.userPresets=t,Blockbench.showQuickMessage(`Preset "${r}" deleted`,2e3)}})},editPreset(e){o.userMaterialBrushPresets?.setFormValues({name:this.userPresets[e][1]??e,...this.userPresets[e][0]})},getSummary(e){return Object.entries(e).filter(([a])=>a in this.channels).map(([a,t])=>a==="albedo"||a==="emissive"?`${this.channels[a]?.label??a}: ${t}`:`${this.channels[a]?.label??a}: ${Number(t).toFixed(1)}`).join(` `)}},computed:{presets(){return Object.entries(this.userPresets)}},mounted(){this.userPresets=re()},template:`
    • {{ name }}
      {{ name }}
    `});y.push(()=>{o.materialBrushStyles=Blockbench.addCSS(` .preset_list { display: grid; grid-template-columns: repeat(auto-fill, 96px); grid-gap: 8px; justify-content: start; align-items: start; margin: 0 auto; padding: 8px; } .user_preset { display: flex; justify-content: start; align-items: center; width: 100%; padding: 8px; position: relative; } .preset_title { font-size: 1em; color: var(--color-text); } .user_preset:hover .preset_title { color: var(--color-accent); } .preset_preview { display: flex; flex-direction: column; flex-wrap: nowrap; justify-content: center; align-items: center; text-align: center; } .preset_buttons { display: flex; flex-direction: row; align-items: center; font-size: 0.8em; padding: 0 4px; } .preset_channel { display: flex; flex-direction: row; align-items: center; margin: 0 8px; font-size: 0.8em; } .delete_preset { margin-left: 8px; padding: 4px; height: 24px; width: 24px; min-width: 24px; background-color: transparent; color: var(--color-text); border: none; border-radius: 100%; position: absolute; right: -8px; top: 0; filter: drop-shadow(0 0 2px var(--color-shadow)); } .delete_preset:hover { background: transparent; color: var(--color-accent); } .delete_preset .material-icons { font-size: 0.825em; } .delete_preset:hover .material-icons { color: var(--color-accent); }`),o.brushMetalnessSlider=new NumSlider("slider_brush_metalness",{category:"paint",name:"Metalness",description:"Adjust the metalness of the brush",tool_setting:"brush_metalness",settings:{min:0,max:1,step:.01,default:0},condition:()=>W(h.metalness)}),o.brushRoughnessSlider=new NumSlider("slider_brush_roughness",{category:"paint",name:"Roughness",description:"Adjust the roughness of the brush",tool_setting:"brush_roughness",settings:{min:0,max:1,step:.01,default:1},condition:()=>W(h.roughness)}),o.brushEmissiveColor=new ColorPicker("brush_emissive_color",{category:"paint",name:"Emissive",description:"Adjust the emissive color of the brush",value:"#000000",tool_setting:"brush_emissive",condition:()=>W(h.emissive)}),o.brushHeightSlider=new NumSlider("slider_brush_height",{category:"paint",name:"Height",description:"Adjust the height of the brush",tool_setting:"brush_height",settings:{min:0,max:1,step:.01,default:.5},condition:()=>W(h.height)}),o.materialBrushTool=new Tool("material_brush",{name:"Material Brush",description:"Paints across multiple texture layers",icon:"view_in_ar",paintTool:!0,cursor:"cell",category:"tools",toolbar:"brush",condition:{project:!0,selected:{texture:!0},modes:["paint"],method(){return E()?.layers_enabled??!1}},allowed_view_modes:"textured",tool_settings:{brush_metalness:0,brush_roughness:1,brush_emissive:"#000000",brush_height:.5},brush:{blend_modes:!1,shapes:!0,size:!0,softness:!0,opacity:!0,offset_even_radius:!0,floor_coordinates:!0,changePixel(e,a,t,r,{size:n,softness:i,texture:s,x:l,y:u}){let m=Z.fromSettings(),d=Object.keys(m.colors),c=Math.floor(n-i*n/100),v=t;return s.layers.forEach(g=>{if(!g.visible||!d.includes(g.channel))return;let x=m.getChannel(g.channel);if(!x)return;let f=Math.sqrt((l-e)**2+(u-a)**2),p=Math.min(1,f/c);if(l%c<=p&&u%c<=p){let b=g.ctx.getImageData(e,a,1,1).data,M=new _.Color(`rgb(${b[0]}, ${b[1]}, ${b[2]})`);x.lerp(M,1)}g.ctx.fillStyle=x.getStyle(),g.ctx.fillRect(e,a,1,1),g.selected&&(v={r:x.r*255,g:x.g*255,b:x.b*255,a:r*255})}),v},onStrokeStart({texture:e}){return Undo.initEdit({layers:e.layers}),!0},onStrokeEnd({texture:e}){return Undo.finishEdit("Material Brush Stroke"),!0}},onCanvasClick(e){Painter.startPaintToolCanvas(e,e.event)},onSelect(){Painter.updateNslideValues(),B()},click(){A()}}),o.loadBrushPreset=new Action("load_brush_preset",{icon:"stroke_full",name:"Material Brush Presets",description:"Load or save a brush preset",category:"paint",condition:{project:!0},click(){o.userMaterialBrushPresets=new Dialog("user_brush_presets",{id:"user_brush_presets",title:"Edit Material Brush",component:mt,part_order:["lines","component","form"],form:{albedo:{type:"color",label:"Albedo",value:ColorPanel.get(),toggle_enabled:!0},metalness:{type:"number",label:"Metalness",min:0,max:1,step:.01,full_width:!1,toggle_enabled:!0},roughness:{type:"number",label:"Roughness",min:0,max:1,step:.01,toggle_enabled:!0,full_width:!1},emissive:{type:"color",label:"Emissive",value:"#000000",toggle_enabled:!0},height:{type:"number",label:"Height",min:0,max:1,step:.01,toggle_enabled:!0}},onConfirm(e){Ee({metalness:Number(e.metalness??o.brushMetalnessSlider?.get()),roughness:Number(e.roughness??o.brushRoughnessSlider?.get()),emissive:(e.emissive??o.brushEmissiveColor?.get()).toString(),height:Number(e.height??o.brushHeightSlider?.get()),albedo:(e.albedo??ColorPanel.get()).toString()})},buttons:["Close","Save","Apply"],cancelIndex:0,confirmIndex:2,onButton(e,a){o.materialBrushTool?.select(),e===1&&Blockbench.textPrompt("Save Preset","New Preset",t=>{t&&(ut(t),Blockbench.showQuickMessage(`Preset "${t}" saved`,2e3))})}}).show()}}),MenuBar.addAction(o.materialBrushTool,"tools.0")});C.push(()=>{MenuBar.removeAction("tools.material_brush")});y.push(()=>{o.materialBrushPanel=new Panel("material_brush_panel",{name:"Material Brush",id:"material_brush_panel",icon:"view_in_ar",toolbars:[new Toolbar("material_brush_toolbar",{id:"material_brush_toolbar",children:["material_brush","load_brush_preset","slider_brush_metalness","slider_brush_roughness","brush_emissive_color","slider_brush_height"],name:"Material Settings"})],condition:{modes:["paint"],project:!0},component:{},expand_button:!0,growable:!1,onFold(){},onResize(){},default_side:"right",default_position:{slot:"right_bar",float_position:[0,0],float_size:[400,300],height:300,folded:!1},insert_after:"color",insert_before:"outliner"})});y.push(()=>{o.displaySettingsPanel=new Panel("display_settings",{name:"PBR Controls",id:"display_settings_panel",icon:"display_settings",toolbars:[new Toolbar("controls_toolbar",{id:"controls_toolbar",children:["toggle_pbr","correct_lights","display_settings_tone_mapping","display_settings_exposure","display_settings_reset_exposure","show_channel_select_menu"],name:"Display Settings"})],display_condition:{modes:["edit","paint","animate"],project:!0},component:{},expand_button:!0,growable:!1,onFold(){},onResize(){},default_side:"left",default_position:{slot:"left_bar",float_position:[0,0],float_size:[400,300],height:300,folded:!1},insert_after:"textures",insert_before:"color"})});var q=e=>e.visible&&e.channel&&e.channel!==N,dt=()=>{let e=R();if(e)return e.texture.layers.filter(q);let a=E();return a?a.layers_enabled?a.layers.filter(q):Texture.all.map(t=>t.layers_enabled?[...t.layers.filter(q)]:[q(t)?t:null]).flat().filter(Boolean):[]},Pe=["select_texture","update_texture_selection","finish_edit","add_texture"],Le=()=>{Panels.channels_panel.inside_vue.textures=dt()};y.push(()=>{o.channelsPanelStyle=Blockbench.addCSS(` .texture_channel { color: var(--color-text); flex: 1; font-size: 1em; margin: 0 0 0 auto; padding: 0 8px; text-align: right; } .texture_channel + .texture_particle_icon { padding-right: 8px; } .texture_channel_description { background-color: var(--color-back); display: flex; flex-direction: row; flex-wrap: nowrap; justify-content: space-between; } .texture_channel_wrapper { align-items: center; background-color: var(--color-ui); border-left: 1px solid var(--color-border); display: flex; flex: 1; flex-direction: row; align-items: center; flex-wrap: nowrap; padding: 0 8px; } .texture_channel_wrapper:hover { background-color: var(--color-button); } .texture_channel_description .texture_name { flex-direction: column; flex-wrap: nowrap; color: var(--color-subtle_text); display: flex; flex: 1; justify-content: center; align-items: start; } .texture_parent { color: var(--color-subtle_text); font-size: 0.8em; } .texture_channel_description:hover .texture_channel { color: var(--color-accent); } #pbr_channel_list { display: flex; flex-direction: column; } #pbr_channel_list .texture { border-top: 1px solid var(--color-border); padding-right: 0; } `),o.channelsPanel=new Panel("channels_panel",{name:"PBR Channels",id:"channels_panel",icon:"gallery_thumbnail",condition:{project:!0,selected:{texture:!0},modes:["paint","edit"]},toolbars:[],component:{name:"ChannelsPanel",data(){return{channels:h,textures:[]}},methods:{openMenu(e){o.channelMenu?.open(e)},selectTexture(e){Modes.options.paint.select(),e.select(),e.scrollTo()},channelEnabled(e){return e.channel&&e.channel!==N&&e.channel in this.channels},getImgSrc(e){return e.img?.src??`data:image/png;base64,${e.canvas.toDataURL()}`}},template:`
    • {{ texture.name }}
      {{ texture.texture.name }}
      {{ channels[texture.channel].label }}
      {{ channels[texture.channel].icon }}
    `},expand_button:!0,growable:!0,onFold(){},onResize(){},default_side:"left",default_position:{slot:"left_bar",float_position:[0,0],float_size:[400,300],height:350,folded:!0},insert_after:"layers",insert_before:"color"}),Blockbench.on(Pe.join(" "),Le)});C.push(()=>{Pe.forEach(e=>{Blockbench.removeListener(e,Le)})});(()=>{let e=()=>{y.forEach(t=>t())},a=()=>{J(),C.forEach(t=>t()),Object.entries(o).forEach(([t,r])=>{try{r?.delete()}catch(n){console.warn(`Failed to delete ${t} action:`,n)}})};BBPlugin.register("pbr_preview",{version:F,title:"PBR Tools",author:"Jason J. Gardner",description:"Create and view PBR materials in Blockbench. Export USDZ scenes and textures for Java or RenderDragon shaders.",tags:["Minecraft: Java Edition","Minecraft: Bedrock Edition","PBR"],icon:"icon.png",variant:"both",await_loading:!0,repository:"https://github.com/jasonjgardner/blockbench-plugins",has_changelog:!0,min_version:"4.10.3",max_version:"4.11.9",onload:e,onunload:a})})();})(); ================================================ FILE: plugins/performance_audit.js ================================================ /// (function() { var performance_audit_action; Plugin.register('performance_audit', { title: 'Performance Audit', icon: 'network_check', author: 'JannisX11', description: 'Find performance issues and bottlenecks in your Blockbench installation.', about: 'You can run a performance audit via Help > Audit Performance.', version: '1.1.2', min_version: '3.0.0', variant: 'both', onload() { function measurePerformance(method, count = 5) { let start = Date.now(); for (let i = 0; i < count; i++) { method(); } let time = (Date.now() - start) / count; return time } async function measurePerformanceAsync(method, count = 5, delay = 20) { let start = Date.now(); for (let i = 0; i < count; i++) { method(); await new Promise(r => setTimeout(r, delay)); } let time = (Date.now() - start) / count; return time - delay; } performance_audit_action = new Action({ id: 'performance_audit', name: 'Audit Performance', icon: 'network_check', category: 'help', click: async () => { let toast = Blockbench.showToastNotification({ text: 'Auditing performance...', icon: 'network_check', }) let fps_sum = Prop.fps; await new Promise(r => setTimeout(r, 1008)); fps_sum += Prop.fps; let avg_fps = fps_sum / 2; let render_time = measurePerformance(() => { Preview.all.forEach(function(prev) { if (prev.canvas.isConnected) { prev.render() } }) }) let animate_time = measurePerformance(() => { if (Animator.open) { if (Timeline.playing) { Timeline.loop(); } else if (AnimationController.selected) { AnimationController.selected.updatePreview(); } } if (Preview.selected) { WinterskyScene.updateFacingRotation(Preview.selected.camera); } }) let dispatch_time = measurePerformance(() => { Blockbench.dispatchEvent('render_frame'); }) let animate_time_sum = render_time + animate_time + dispatch_time; let selection_update_time = measurePerformance(updateSelection); let selection_time = measurePerformance(() => { BarItems.invert_selection.click(); }, 4); let uv_editor_time = await measurePerformanceAsync(() => { Panels.uv.fold(); Panels.uv.fold(); }, 2, 20); let outliner_time = await measurePerformanceAsync(() => { Panels.outliner.fold(); Panels.outliner.fold(); }, 2, 20); let conclusion = 'Your performance is good!'; let tips = []; if (avg_fps < 46) { if (animate_time_sum > 23) { conclusion = 'Your performance is limited by CPU power...'; tips = [ 'Try and reduce the number of elements in your project, or hide elements you don\'t use' ] } else { conclusion = 'Your performance is limited by graphics rendering power...'; tips = [ 'Close or minimize other performance-intensive applications, such as games or 3D or 2D editor', 'Check if there are any updates for your graphics drivers', ] } } else if (avg_fps < 54) { conclusion = 'Your performance is below average'; } if (settings.ambient_occlusion_enabled && settings.ambient_occlusion_enabled.value) { tips.push('You are using the "Ambient Occlusion" plugin. It is recommended to uninstall or disable this plugin if you are having performance issues.') } if (avg_fps > 59) { conclusion = 'Your performance is great!'; } let faces_total = 0; let faces_selected = 0; for (let el of Outliner.elements) { if (el.faces) { let amount = 0; if (el instanceof Cube) { amount = Object.keys(el.faces).filter(fkey => el.faces[fkey].texture !== null).length; } else { amount = Object.keys(el.faces).length; } if (el.selected) faces_selected += amount; faces_total += amount; } } new Dialog('performance_audit', { title: 'Performance Audit Results', buttons: ['Close', 'Re-Run'], cancelIndex: 0, form: { conclusion: {type: 'info', text: '#### ' + conclusion}, tips: {type: 'info', text: '* ' + tips.join('\n* '), condition: tips.length > 0}, '_1': '_', fps: {type: 'info', text: Math.roundTo(avg_fps, 2).toString(), label: 'Average FPS'}, cpu_load: {type: 'info', text: Math.roundTo(animate_time_sum * 100 / (1000 / avg_fps), 1) + '%', label: 'CPU Load'}, '_2': '_', frame_time: {type: 'info', text: Math.roundTo(animate_time_sum, 2).toString(), label: 'Frame Time'}, render_time: {type: 'info', text: Math.roundTo(render_time, 2).toString(), label: 'Render Time'}, animate_time: {type: 'info', text: Math.roundTo(animate_time, 2).toString(), label: 'Animate Time'}, dispatch_time: {type: 'info', text: Math.roundTo(dispatch_time, 2).toString(), label: 'Render Event Hook'}, '_3': '_', selection_update:{type: 'info', text: Math.roundTo(selection_update_time, 2).toString(), label: 'Selection Update Time'}, selection: {type: 'info', text: Math.roundTo(selection_time, 2).toString(), label: 'Selection Change Time'}, uv_editor_time: {type: 'info', text: Math.roundTo(uv_editor_time, 2).toString(), label: 'UV Editor Impact'}, outliner_time: {type: 'info', text: Math.roundTo(outliner_time, 2).toString(), label: 'Outliner Impact'}, '_4': '_', elements: {type: 'info', text: `${Outliner.selected.length} / ${Outliner.elements.length}`, label: 'Elements'}, faces: {type: 'info', text: `${faces_selected} / ${faces_total}`, label: 'Faces'}, }, onButton(button) { if (button == 1) { performance_audit_action.click(); } } }).show(); toast.delete(); } }) MenuBar.menus.help.addAction(performance_audit_action); }, onunload() { performance_audit_action.delete() } }); })() ================================================ FILE: plugins/pie_menu.js ================================================ (function() { function getElementWidth(jqelement){ jqelement.attr('style',`width: fit-content`); $(document.body).append(jqelement); jqelement.attr('style',`width: max-content`); let width = jqelement.width(); jqelement.remove(); return width; } class PieMenu extends BarItem{ /** * @type PieMenu */ static active = null; static all = {}; static TWO_PI = 6.283185307179586; static HALF_PI = 1.5707963267948966; static QUARTER_PI = 0.7853981633974483; static mouseEvent = null; static debugMode = false; /** * Create Pie Menu * @param {{ * name: String, * id: String, * radius: Number, * structure: Array, * condition: any, * keybind: {key:Number,shift:boolean,ctrl:boolean,alt:boolean,meta:boolean}, * skipExtraName: Boolean * }} data */ constructor(id, data){ if (typeof id == 'object') { data = id; id = data.id; } if (!data.skipExtraName) { if (!data.name.endsWith(' Pie Menu')) { data.name = tl(data.name) + ' Pie Menu'; } } super(id, data); this._radius_ = data.radius !== undefined ? data.radius: -1; // negative radius means auto radius multiplied by the absoulte value this.structure = data.structure || []; this.node = $(`

    `); this.uuid = guid(); PieMenu.all[this.uuid] = this; this.setName(this.name); this.cache = { isHold: false, lastCenter: [0,0] } if (this.id) this.setId(this.id); } get radius(){ if (this._radius_ < 0) { let autoRadius = 0; let indices = [ this.actionIndexFromAngle(0,'deg'), this.actionIndexFromAngle(90,'deg'), this.actionIndexFromAngle(180,'deg'), this.actionIndexFromAngle(270,'deg'), ] for (let i = 0; i < 4; i++) { autoRadius += getElementWidth( this.buildAction( this.getActionAt(indices[i]) ) ); } return ( autoRadius/2 ) * Math.abs(this._radius_); } return this._radius_; } set radius(value){ return value; } equals(otherPieMenu) { return this.uuid == otherPieMenu.uuid; } setName(value) { this.name = value; this.setNodeTitle(value); } setNodeTitle(value){ this.node.children('h4').html(value); } setId(value){ this.id = value; this.node.attr('id', value); return this; } conditionMet(){ return Condition(this.condition); } show(x = mouse_pos.x, y = mouse_pos.y){ if (Project==0||Format==0) return; if (!this.conditionMet()) return; if (PieMenu.active && this.equals(PieMenu.active)) return; if (PieMenu.active) PieMenu.active.hide(); PieMenu.active = this; this.build(); let r = this.radius; // 30 is action heights x = Math.clamp(x, r+30, window.innerWidth - (r+30)); y = Math.clamp(y, r+30, window.innerHeight - (r+30)); this.node[0].style.left = x + 'px'; this.node[0].style.top = y + 'px'; this.node[0].style.width = `calc(${r<<1}px + calc(var(--pie-major_radius)*2))` this.node[0].style.height = `calc(${r<<1}px + calc(var(--pie-major_radius)*2))` this.cache.lastCenter = [x,y]; $(document.body).append(this.node) } hide(){ PieMenu.active = undefined; this.node.remove(); } // \ - - - / getActionAt(i){ return typeof this.structure[i] == 'string' ? BarItems[this.structure[i]]: this.structure[i]; } actionConditionMetAt(i) { let action = this.getActionAt(i); return Condition(action.condition); } actionIndexFromAngle(angle, unit = 'rad'){ if (unit == 'deg') { angle = Math.degToRad(angle); } return Math.floor( (angle / PieMenu.TWO_PI) * this.structure.length); } getActionFromAngle(angle, unit = 'rad'){ let index = this.actionIndexFromAngle(angle, unit); return this.getActionAt(index); } // \ - - - / buildAction(action, i){ // Create Action Node let actionNode = $('
    '); // Add Icon if (action.icon) { let iconParms = action.icon.split(' '); actionNode.append(Blockbench.getIconNode(iconParms[0], action.color || iconParms[1])); } // Add Text actionNode.append($('').text(tl(action.name))); // Add Keybind Label actionNode.append( $(``).text( i < 10 ?i:'' ) ); return actionNode; } build(){ let slices = this.node.children('.pieSlices'); slices.empty(); let angleStep = 360 / this.structure.length; let angle = -angleStep-90; for (let i = 0; i < this.structure.length; i++) { angle += angleStep; const action = this.getActionAt(i); if (!PieMenu.debugMode){ if (!this.actionConditionMetAt(i)) continue; } // Create Pie Slice Which Handels Rotation And Animation ( Action Container ) let slice = $(`
    `); slice.attr('style', `transform: translate(-50%,-50%) rotate(${angle}deg);`); let actionNode = this.buildAction(action, i); // Reverse Rotation actionNode.attr('style', `transform: rotate(${360-angle}deg)`); slice.append(actionNode); slices.append(slice); } return this.node; } trigger(event){ this.cache.isHold = event.repeat; if (!this.cache.isHold) { this.setNodeTitle(this.name + `
    ( IsHold: ${tl('dialog.no')})`) this.show(); } else { this.setNodeTitle(this.name + `
    ( IsHold: ${tl('dialog.yes')})`) } } unTrigger(...arg){ // is it even a word? let action; if (typeof arg[0] === 'number') { if (this.actionConditionMetAt(arg[0])) { this.hide(); action = this.getActionAt(arg[0]); } } else if (arg[0] || this.cache.isHold) { let angle = this.angleToCursor() - (Math.PI - PieMenu.QUARTER_PI/2); angle = (angle + PieMenu.TWO_PI) % PieMenu.TWO_PI; action = this.getActionFromAngle(angle); this.hide(); } if (action) { if (Condition(action.condition)) { if (action.click) { action.click(); } if (action.select) { action.select(); } if (action.children) { this.showActionMenuOf(action); } } } } showActionMenuOf(action){ if (typeof action.children == 'function') { new Menu(action.children()).show(PieMenu.mouseEvent); } else if (action.children instanceof Array && action.children.length) { new Menu(action.children).show(PieMenu.mouseEvent); } } delete() { var scope = this; this.toolbars.forEach(bar => { bar.remove(scope); }) delete BarItems[this.id]; Keybinds.actions.remove(this); delete PieMenu.all[this.uuid]; } angleToCursor(){ return new THREE.Vector2( mouse_pos.x , mouse_pos.y ).sub(new THREE.Vector2( ...this.cache.lastCenter )).angle(); } static initCSS() { let style = $('#pieMenuStyles'); if (style.length) { style.remove(); } style = $(''); style.text( // Container `:root{--pie-dir_idct_size:10%;--pie-major_radius:30px;--pie-major_thickness:22px}.pieMenu{transform:translate(-50%,-50%);width:50%;height:50%;position: fixed;}.pieCenter{position:relative;top:50%;left:50%;transform:translate(-50%,-50%);width:calc(var(--pie-major_radius) * 2);height:calc(var(--pie-major_radius) * 2)}.pieCenter>svg{height:calc(var(--pie-major_radius) * 2);width:calc(var(--pie-major_radius) * 2)}.pieCenter>svg circle{cx:var(--pie-major_radius);cy:var(--pie-major_radius);r:calc(var(--pie-major_radius) - calc(var(--pie-major_thickness) * 0.5));stroke-width:calc(var(--pie-major_thickness) * .5);fill:none;stroke:white}.pieCenter div.gradient{width:100%;height:100%;border-radius:50%;--l_o:calc(50% - var(--pie-dir_idct_size));--r_o:calc(50% + var(--pie-dir_idct_size));background:conic-gradient(from 0deg at 50% 50%,var(--color-bright_ui) var(--l_o),var(--color-accent) var(--l_o),var(--color-accent) 50%,var(--color-accent) var(--r_o),var(--color-bright_ui) var(--r_o));box-shadow: inset 0px 0px 20px 0px black;}.pieCenter>svg foreignObject{--r:calc(var(--pie-major_radius)*2);width:var(--r);height:var(--r)}` + // Actions `.pieSlice{height:100%;width:fit-content;position: absolute;left: 50%;top: 50%;animation:expandOut .1s linear}.pieSlice div{display:flex;height:30px;padding:4px;padding-left:34px;padding-right:8px;width:max-content;background-color: var(--color-bright_ui);color: var(--color-bright_ui_text);border-radius:5px;box-shadow: 0 0 6px 0px #0005;}.pieSlice div.focused{background-color:var(--color-accent)}.pieSlice div>i{margin-top:1px;margin-right:4px;margin-left:-28px;pointer-events:none}.pieSlice div>img{cursor:default;height:20px;width:20px;color:var(--color-text);white-space:nowrap;margin-bottom:-3px;margin-left:-27px;margin-right:5px;margin-top:1px}.pieSlice div>span{pointer-events:none;flex:1 0 auto}.pieSlices{width:100%;height:100%;position: absolute;}` + // Animations `@keyframes expandOut{0%{height:0%}100%{height:100%}}` + // Title `.pieMenu h4{position: absolute;left: 50%;top: calc(50% - 75px);transform: translate(-50%,-50%);width: fit-content;color: var(--color-subtle_text);text-align:center}` ) $(document.body).append(style); } static onkeyup(e){ if (!PieMenu.active) return; if (!PieMenu.active.keybind) return; if (e.which == 27) { PieMenu.active.hide(); return; }; let actionIndex = e.which - 48; if (Math.isBetween(actionIndex, 0, 9)) { PieMenu.active.unTrigger(actionIndex); return; } if (PieMenu.active.cache.isHold && e.which == PieMenu.active.keybind.key) { PieMenu.active.unTrigger(); } } static onclick(e){ if (!PieMenu.active) return; if (!PieMenu.active.cache.isHold) { PieMenu.active.unTrigger(true); } } static onmousemove(e){ PieMenu.mouseEvent = e; if (!PieMenu.active) return; let pieCenter = PieMenu.active.node.children('.pieCenter'); let angle = PieMenu.active.angleToCursor(); pieCenter.attr('style', `transform: translate(-50%, -50%) rotate(calc(${angle}rad - 90deg))`); angle -= Math.PI - PieMenu.QUARTER_PI/2; angle = (angle + PieMenu.TWO_PI) % PieMenu.TWO_PI; let index = PieMenu.active.actionIndexFromAngle(angle); PieMenu.active.node.find('.pieSlices div').removeClass('focused'); if (PieMenu.active.actionConditionMetAt(index)) { PieMenu.active.node .children('.pieSlices') .find(`label[i=${index}]`) .parent() .addClass('focused') } } fromAction(action, menu={}) { if (typeof action.children == 'function') { this.structure = action.children(); } else { this.structure = action.children; } this.condition = action.condition || menu.condition; this.structure = this.structure.filter(e=> e != '_'); return this; } fromBarSelect(barselect){ let actions = []; for (const key in barselect.options) { const option = barselect.options[key]; let name = barselect.getNameFor(key) let icon = option.icon || ''; let data = { name,icon, id: key+'_pie_action', private: true, click(){ barselect.set(key); barselect.onChange(barselect.value); }, condition: undefined }; if (option.condition) data.condition = option.condition; actions.push( new Action(data) ) } this.structure=actions; return this; } } window.PieMenu = PieMenu; document.removeEventListener('keyup', PieMenu.onkeyup) document.addEventListener('keyup', PieMenu.onkeyup); document.removeEventListener('click', PieMenu.onclick) document.addEventListener('click', PieMenu.onclick); document.removeEventListener('mousemove', PieMenu.onmousemove) document.addEventListener('mousemove', PieMenu.onmousemove); PieMenu.initCSS(); let addedPieMenus = []; Plugin.register("pie_menu", { title: "Pie Menus", icon: "fas.fa-chart-pie", author: "Malik12tree", description: "Add pie shaped menus for faster work.", about: "

    Built-in Pies

    Add Pie Keybind:

    ctrl + shift + a

    Import Pie Keybind:

    shift + q

    Export Pie Keybind:

    shift + w

    Mode Pie Keybind:

    shift + tab (web: shift + x)

    View Mode Pie Keybind:

    alt + z

    Toolbox Pie Keybind:

    shift + t

    New Pie Keybind:

    shift + n

    Preferences Pie Keybind:

    shift + o

    Rotate Pie Keybind:

    shift + r

    Flip Pie Keybind:

    shift + f

    Center Pie Keybind:

    shift + c

    Properties Pie Keybind:

    shift + p

    API

    CSS Variables

    NameDefaultDescription
    --pie-dir_idct_size10%sets the angle indicator size
    --pie-major_radius30pxsets the center pie's radius
    --pie-major_thickness22pxsets the center pie's thickness
    ", version: "1.0.0", variant: "both", tags: ["Interface"], onload() { addedPieMenus.push( new PieMenu({ name: "Add Pie Menu", // NEEDS LANG SUPPORT, id: 'add_pie_menu', radius: -0.75, keybind: {key:65,shift:true,ctrl:true}, structure: ['add_cube','add_group','add_locator','add_mesh','add_null_object','add_texture_mesh','add_animation','add_keyframe'] }), new PieMenu({ name: 'generic.import', keybind: {key:81,shift:true}, id: 'import_pie_menu', radius: -0.75, }).fromAction(MenuBar.menus.file.structure.find(e=>e.id=='import')), new PieMenu({ name: 'generic.export', keybind: {key:87,shift:true}, id: 'export_pie_menu', radius: -0.7, }).fromAction(MenuBar.menus.file.structure.find(e=>e.id=='export')), new PieMenu({ name: 'action.view_mode', id: 'view_mode_pie_menu', keybind: {key:90,alt:true}, radius: -1, }).fromBarSelect(BarItems['view_mode']), new PieMenu({ name: "Mode Pie Menu", // NEEDS LANG SUPPORT, id: 'mode_pie_menu', radius: -1.5, keybind: Blockbench.isWeb ? {key:88,shift:true}: {key:9,shift:true}, structure: (function() { let actions = []; for (const key in Modes.options) { const mode = Modes.options[key]; actions.push( new Action({ name: mode.name, condition: mode.condition, id: key+'_pie_action', private: true, click(){ mode.select() } }) ) } return actions; })() }), new PieMenu({ name: 'Tool Pie Menu', id: 'main_tools_pie_menu', radius: -1.5, keybind: {key:84,shift:true}, structure: (function() { let actions = []; let tools = Toolbox.children.filter(tool => tool instanceof Tool); tools.forEach(tool => { actions.push( new Action({ id: tool.id, name: tl(tool.name), private: true, icon: tool.icon, click(){ tool.select(); }, condition: tool.condition }) ) }); return actions; })() }), new PieMenu({ name: 'New Pie Menu', keybind: {key:78,shift:true}, id: 'new_pie_menu', radius: -1, }).fromAction(MenuBar.menus.file.structure.find(e=>e.id=='new')), new PieMenu({ name: 'Preferences Pie Menu', keybind: {key:79,shift:true}, id: 'preferences_pie_menu', radius: -1, }).fromAction(MenuBar.menus.file.structure.find(e=>e.id=="preferences")), ...(function() { let pies = []; const keybinds = [ {key:82,shift:true}, {key:70,shift:true}, {key:67,shift:true}, {key:80,shift:true} ]; const radii = [ -0.75,-1,-1,-0.75 ]; for (let i = 1; i < 5; i++) { let action = MenuBar.menus.transform.structure[i]; pies.push( new PieMenu({ keybind: keybinds[i-1], id: action.id +'_pie_menu', name: tl(action.name), radius: radii[i-1], }).fromAction(MenuBar.menus.transform.structure[i], MenuBar.menus.transform), ) } return pies; })(), ); addedPieMenus[7].structure.push(BarItems['plugins_window']); // add plugins window in the preferences pie }, onunload() { addedPieMenus.forEach(m => m.delete() ); addedPieMenus = []; } }); })() // 500. ================================================ FILE: plugins/plaster.js ================================================ /// (function() { var plaster_action; Plugin.register('plaster', { title: 'Plaster', icon: 'healing', author: 'JannisX11', description: 'Fixes texture bleeding (small white or colored lines around the edges of your model) by slightly shrinking UV maps', version: '1.1.0', min_version: '3.0.5', variant: 'both', onload() { plaster_action = new Action({ id: 'plaster', name: 'Plaster', icon: 'healing', category: 'edit', condition: () => !(Project.box_uv && !Format.optional_box_uv), click(ev) { if (selected.length === 0) { Blockbench.showMessage('No cubes selected', 'center') return; } let elements = Outliner.selected.filter(element => element.faces); new Dialog({ id: 'plaster', title: 'Plaster', icon: 'healing', form: { margin: {label: 'Margin', type: 'select', options: { s: 'Small', m: 'Medium', l: 'Large', xl: 'Extra Large', custom: 'Custom', }, default: 'm'}, custom: {label: 'Custom Margin (%)', value: 5, min: 0, max: 50, condition: result => result.margin == 'custom'} }, onConfirm(formData) { this.hide() //Margin var margin; switch (formData.margin) { case 's': margin = 0.016 break; case 'm': margin = 0.032 break; case 'l': margin = 0.06 break; case 'xl': margin = 0.1 break; case 'custom': margin = formData.custom/100 break; } let fixNumber = function(number, isSecond) { //Vars let adapted_margin = margin let x1 = number let edge = x1%1 let floor = Math.floor(x1) //Switches if (edge > 0.9 && !isSecond) { edge = 1 + adapted_margin } else if (edge < 0.1 && isSecond) { edge = -adapted_margin } else if (edge === 0 && !isSecond) { edge = adapted_margin } //Return return floor+edge } Undo.initEdit({elements, uv_only: true}) //Processing elements.forEach(element => { for (let fkey in element.faces) { let face = element.faces[fkey]; if (face.texture !== null) { if (face instanceof MeshFace) { let uv_center = [0, 0]; let vertices = face.getSortedVertices(); for (let vkey of vertices) { console.log(uv_center.slice(), face.uv[vkey].slice()) uv_center.V2_add(face.uv[vkey]); } uv_center.V2_divide(vertices.length); for (let vkey of vertices) { let diff_to_center = uv_center.slice().V2_subtract(face.uv[vkey]); let distance = Math.sqrt(Math.pow(diff_to_center[0], 2) + Math.pow(diff_to_center[1], 2)); console.log({uv_center, uv: face.uv[vkey].slice(), diff_to_center, distance, margin, vkey, face}) face.uv[vkey][0] += (diff_to_center[0] / distance) * margin; face.uv[vkey][1] += (diff_to_center[1] / distance) * margin; } } else if (face.uv instanceof Array) { face.uv.forEach(function(u, i) { let is_mirrored = face.uv[ (i>1?i-2:i) ] > face.uv[i+ (i>1?0:2) ] face.uv[i] = fixNumber(face.uv[i], i>1 !== is_mirrored) }) } } } element.preview_controller.updateUV(element); }) UVEditor.loadData() Undo.finishEdit('plaster') } }).show() } }) MenuBar.addAction(plaster_action, 'filter') }, onunload() { plaster_action.delete() } }); })() ================================================ FILE: plugins/player_statue_generator.js ================================================ var generatePlayerStatueAction; Plugin.register('player_statue_generator', { icon: 'accessibility', title: 'Player Statue Generator', description: 'Generates player shaped models.', tags: ["Minecraft: Java Edition"], author: 'Wither, dragonmaster95 and 3XH6R', version: '2.0.2', min_version: '3.0.0', variant: 'both', onload() { generatePlayerStatueAction = new Action({ id: 'generate_player_statue', name: 'Generate Player Statue', icon: 'accessibility', description: 'Generates a player shaped model', category: 'filter', condition: () => Format.id === "java_block", click: function(ev) { playerModelSettings.show() } }) MenuBar.addAction(generatePlayerStatueAction, 'filter'); }, onunload() { this.onuninstall(); }, onuninstall() { generatePlayerStatueAction.delete(); } }) var playerModelSettings = new Dialog({ title: 'Choose Model', id: 'playerModelSettings', form: { model: {label: 'Player Model', type: 'select', options: {steve: 'Steve (Classic)', alex: 'Alex (Slim)'}, default:'Steve (Classic)'}, secondLayer: {label: 'Generate Second Layer', type: 'checkbox'}, cape: {label: 'Cape', type: 'checkbox'} } }); var capeInfo = new Dialog({ title: 'Cape Texture Warning', id: 'cape_warning', lines: [ 'You might have to edit your cape texture
    to a square format(32x32) to make it work in-game!
    Click here to import the texture template.', '

    ' ] }); function setDisplay() { if(display.head === undefined) { display.head = new DisplaySlot('head', {translation: [0, -29, 0], scale: [1.6, 1.6, 1.6]}); } else { display.head.scale = [1.6, 1.6, 1.6]; display.head.translation = [0, -29, 0]; } } function generateSteve(secondLayer) { Undo.initEdit({element: Outliner.elements, outliner: true }); steveGroup = new Group('steve').init(); new Cube({name:'head',from:[4,23.5,4],to:[12,31.5,12],autouv:0,faces:{north:{uv:[2,2,4,4]},south:{uv:[6,2,8,4]},west:{uv:[4,2,6,4]},east:{uv:[0,2,2,4]},up:{uv:[4,2,2,0]},down:{uv:[6,0,4,2]}}}).addTo(steveGroup).init(); new Cube({name:'body',from:[4,11.5,6],to:[12,23.5,10],autouv:0,faces:{north:{uv:[5,5,7,7.98]},south:{uv:[8,5,10,8]},west:{uv:[7,5,8,7.98]},east:{uv:[4,5,5,8]},up:{uv:[7,5,5,4]},down:{uv:[9,4,7,5]}}}).addTo(steveGroup).init(); new Cube({name:'right_arm',from:[12,11.5,6],to:[16,23.5,10],autouv:0,faces:{north:{uv:[11,5,12,8]},south:{uv:[13,5,14,8]},west:{uv:[12,5,13,8]},east:{uv:[10,5,11,8]},up:{uv:[12,5,11,4]},down:{uv:[13,4,12,5]}}}).addTo(steveGroup).init(); new Cube({name:'left_arm',from:[0,11.5,6],to:[4,23.5,10],autouv:0,faces:{north:{uv:[9,13,10,16]},south:{uv:[11,13,12,16]},west:{uv:[10,13,11,16]},east:{uv:[8,13,9,16]},up:{uv:[10,13,9,12]},down:{uv:[11,12,10,13]}}}).addTo(steveGroup).init(); new Cube({name:'right_leg',from:[8,-0.5,6],to:[12,11.5,10],autouv:0,faces:{north:{uv:[1,5,2,8]},south:{uv:[3,5,4,8]},west:{uv:[2,5,3,8]},east:{uv:[0,5,1,8]},up:{uv:[2,5,1,4]},down:{uv:[3,4,2,5]}}}).addTo(steveGroup).init(); new Cube({name:'left_leg',from:[4,-0.5,6],to:[8,11.5,10],autouv:0,faces:{north:{uv:[5,13,6,16]},south:{uv:[7,13,8,16]},west:{uv:[6,13,7,16]},east:{uv:[4,13,5,16]},up:{uv:[6,13,5,12]},down:{uv:[7,12,6,13]}}}).addTo(steveGroup).init(); if (secondLayer) { new Cube({name:'head_2nd_layer',from:[3.5,23,3.5],to:[12.5,32,12.5],autouv:0,faces:{north:{uv:[10,2,12,4]},south:{uv:[14,2,16,4]},west:{uv:[12,2,14,4]},east:{uv:[8,2,10,4]},up:{uv:[12,2,10,0]},down:{uv:[14,0,12,2]}}}).addTo(steveGroup).init(); new Cube({name:'body_2nd_layer',from:[4,11.02,5.5],to:[12,24.03,10.5],autouv:0,faces:{north:{uv:[5,9,7,12]},south:{uv:[8,9,10,12]},west:{uv:[7,9,8,12]},east:{uv:[4,9,5,12]},up:{uv:[7,9,5,8]},down:{uv:[9,8,7,9]}}}).addTo(steveGroup).init(); new Cube({name:'right_arm_2nd_layer',from:[11.5,11,5.5],to:[16.49,24,10.5],autouv:0,faces:{north:{uv:[11,9,12,12]},south:{uv:[13,9,14,12]},west:{uv:[12,9,13,12]},east:{uv:[10,9,11,12]},up:{uv:[12,9,11,8]},down:{uv:[13,8,12,9]}}}).addTo(steveGroup).init(); new Cube({name:'left_arm_2nd_layer',from:[-0.5,11,5.5],to:[4.5,24,10.5],autouv:0,faces:{north:{uv:[13,13,14,16]},south:{uv:[15,13,16,16]},west:{uv:[14,13,15,16]},east:{uv:[12,13,13,16]},up:{uv:[14,13,13,12]},down:{uv:[15,12,14,13]}}}).addTo(steveGroup).init(); new Cube({name:'right_leg_2nd_layer',from:[7.5,-1,5.5],to:[12.5,12,10.5],autouv:0,faces:{north:{uv:[1,9,2,12]},south:{uv:[3,9,4,12]},west:{uv:[2,9,3,12]},east:{uv:[0,9,1,12]},up:{uv:[2,9,1,8]},down:{uv:[3,8,2,9]}}}).addTo(steveGroup).init(); new Cube({name:'left_leg_2nd_layer',from:[3.5,-1,5.5],to:[8.5,12,10.5],autouv:0,faces:{north:{uv:[1,13,2,16]},south:{uv:[3,13,4,16]},west:{uv:[2,13,3,16]},east:{uv:[0,13,1,16]},up:{uv:[2,12,1,11]},down:{uv:[3,12,2,13]}}}).addTo(steveGroup).init(); } setDisplay(); steveGroup.openUp().select(); playerModelSettings.hide(); Undo.finishEdit('Generated Steve Statue'); } function generateAlex(secondLayer) { Undo.initEdit({elements: Outliner.elements, outliner: true}); alexGroup = new Group('alex').init(); new Cube({name:'head',from:[4,23.5,4],to:[12,31.5,12],autouv:0,faces:{north:{uv:[2,2,4,4]},south:{uv:[6,2,8,4]},west:{uv:[4,2,6,4]},east:{uv:[0,2,2,4]},up:{uv:[4,2,2,0]},down:{uv:[6,0,4,2]}}}).addTo(alexGroup).init(); new Cube({name:'body',from:[4,11.5,6],to:[12,23.5,10],autouv:0,faces:{north:{uv:[5,5,7,8]},south:{uv:[8,5,10,8]},west:{uv:[7,5,8,8]},east:{uv:[4,5,5,8]},up:{uv:[7,5,5,4]},down:{uv:[9,4,7,5]}}}).addTo(alexGroup).init(); new Cube({name:'right_arm',from:[12,11.5,6],to:[15,23.5,10],autouv:0,faces:{north:{uv:[11,5,11.75,8]},south:{uv:[12.75,5,13.5,8]},west:{uv:[11.75,5,12.75,8]},east:{uv:[10,5,11,8]},up:{uv:[11.75,5,11,4]},down:{uv:[12.5,4,11.75,5]}}}).addTo(alexGroup).init(); new Cube({name:'left_arm',from:[1,11.5,6],to:[4,23.5,10],autouv:0,faces:{north:{uv:[9,13,9.75,16]},south:{uv:[10.75,13,11.5,16]},west:{uv:[9.75,13,10.75,16]},east:{uv:[8,13,9,16]},up:{uv:[9.75,13,9,12]},down:{uv:[10.5,12,9.75,13]}}}).addTo(alexGroup).init(); new Cube({name:'right_leg',from:[4,-0.5,6],to:[8,11.5,10],autouv:0,faces:{north:{uv:[5,13,6,16]},south:{uv:[7,13,8,16]},west:{uv:[6,13,7,16]},east:{uv:[4,13,5,16]},up:{uv:[6,13,5,12]},down:{uv:[7,12,6,13]}}}).addTo(alexGroup).init(); new Cube({name:'left_leg',from:[8,-0.5,6],to:[12,11.5,10],autouv:0,faces:{north:{uv:[1,5,2,8]},south:{uv:[3,5,4,8]},west:{uv:[2,5,3,8]},east:{uv:[0,5,1,8]},up:{uv:[2,5,1,4]},down:{uv:[3,4,2,5]}}}).addTo(alexGroup).init(); if (secondLayer) { new Cube({name:'head_2nd_layer',from:[3.5,23,3.5],to:[12.5,32,12.5],autouv:0,faces:{north:{uv:[10,2,12,4]},south:{uv:[14,2,16,4]},west:{uv:[12,2,14,4]},east:{uv:[8,2,10,4]},up:{uv:[12,2,10,0]},down:{uv:[14,0,12,2]}}}).addTo(alexGroup).init(); new Cube({name:'body_2nd_layer',from:[4,11.02,5.49],to:[12,24.03,10.49],autouv:0,faces:{north:{uv:[5,9,7,12]},south:{uv:[8,9,10,12]},west:{uv:[7,9,8,12]},east:{uv:[4,9,5,12]},up:{uv:[7,9,5,8]},down:{uv:[9,8,7,9]}}}).addTo(alexGroup).init(); new Cube({name:'right_arm_2nd_layer',from:[11.5,11,5.5],to:[15.5,24,10.5],autouv:0,faces:{north:{uv:[10.75,9,11.5,12]},south:{uv:[12.75,9,13.5,12]},west:{uv:[11.75,9,12.75,12]},east:{uv:[10,9,11,12]},up:{uv:[11.75,9,11,8]},down:{uv:[12.5,8,11.75,9]}}}).addTo(alexGroup).init(); new Cube({name:'left_arm_2nd_layer',from:[0.5,11,5.5],to:[4.5,24,10.5],autouv:0,faces:{north:{uv:[13,13,13.75,16]},south:{uv:[14.75,13,15.5,16]},west:{uv:[13.75,13,14.75,16]},east:{uv:[12,13,13,16]},up:{uv:[13.75,13,13,12]},down:{uv:[14.5,12,13.75,13]}}}).addTo(alexGroup).init(); new Cube({name:'right_leg_2nd_layer',from:[7.5,-1,5.5],to:[12.5,12,10.5],autouv:0,faces:{north:{uv:[1,9,2,12]},south:{uv:[3,9,4,12]},west:{uv:[0,9,1,12]},east:{uv:[0,9,1,12]},up:{uv:[2,9,1,8]},down:{uv:[3,8,2,9]}}}).addTo(alexGroup).init(); new Cube({name:'left_leg_2nd_layer',from:[3.5,-1,5.5],to:[8.5,12,10.5],autouv:0,faces:{north:{uv:[1,13,2,16]},south:{uv:[3,13,4,16]},west:{uv:[2,13,3,16]},east:{uv:[0,13,1,16]},up:{uv:[2,13,1,12]},down:{uv:[3,12,2,13]}}}).addTo(alexGroup).init(); } setDisplay(); alexGroup.openUp().select(); playerModelSettings.hide(); Undo.finishEdit('Generated Alex Statue'); } function generateCape(){ Undo.initEdit({elements: Outliner.elements, outliner: true}); new Cube({name:'cape',from:[2.5,6,13],to:[13.5,23,14],autouv:0,faces:{north:{uv:[0.5,0.5,6,9]},south:{uv:[6.5,0.5,12,9]},west:{uv:[6,0.5,6.5,9]},east:{uv:[0,0.5,0.5,9]},up:{uv:[6,0.5,0.5,0]},down:{uv:[11.5,0,6,0.5]}},rotation:[-22.5,0,0],origin:[7.5,14,10.5]}).init(); setDisplay(); Undo.finishEdit('Generated Cape Model'); } playerModelSettings.onConfirm = function(data) { switch(data.model) { case 'steve': generateSteve(data.secondLayer); break; case 'alex': generateAlex(data.secondLayer); break; } if (data.cape) { playerModelSettings.hide(); capeInfo.show(); document.getElementById('cape-gen-button').onclick = function() { let capeTexture = new Texture({name: 'cape_texture', res: 32, mode: 'bitmap', source: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAACRSURBVO3BoQ3CUBSG0e/dNIGEBZpgSBAMwhCMwDIUAQrVCXBMga6pK6JJBbaiqiCK5T0Skt/ccwJvt+oxkqgszqS6lodARNh2xZhXe1Jd7iey3ZNU8/Ux8EXGZJUviGm6no/ZckPM0NbEGGKGmCFmiBlihpghZogZYoaYIWaIGWKGWMak6Xp+MbQ1zjnnnPuHFz1lGpsvFTuyAAAAAElFTkSuQmCC'}); capeTexture.add(); capeTexture.load(); }; } } capeInfo.onConfirm = function() { playerModelSettings.hide(); capeInfo.hide(); generateCape(); } ================================================ FILE: plugins/pluginstats.js ================================================ ;(function () { const STORE = "store"; const MAX_WEEKS = 52; // year const URL = 'https://blckbn.ch/api/stats/plugins?weeks='; const KEY_STORAGE = 'ps-data'; /** * https://github.com/Malik12tree/LineGraph.js * @author Malik12tree */ const Graph = (function() { const xmlns = "http://www.w3.org/2000/svg"; class SVGShapeContainer { constructor(width, height) { this.node = document.createElementNS(xmlns, "svg"); this.groupNode = document.createElementNS(xmlns, "g"); this.node.append(this.groupNode); this.setSize(width, height); } setPadding(paddingInPercent) { const g = this.groupNode; if (paddingInPercent != 1) { g.setAttributeNS(null, 'transform', `scale(${paddingInPercent})`); g.setAttributeNS(null, 'transform-origin', 'center'); return this; } g.removeAttributeNS(null, 'transform'); g.removeAttributeNS(null, 'transform-origin'); return this; } setSize(width, height) { this.width = width; this.height = height; this.node.setAttributeNS(null, "viewBox", "0 0 " + width + " " + height); this.node.setAttributeNS(null, "width", width); this.node.setAttributeNS(null, "height", height); } add(...svgshapes) { svgshapes.forEach(shape => { this.groupNode.append(shape.node ?? shape); }); return this; } } class SVGShape { constructor() { let scopedPath = ''; Object.defineProperty(this, 'path',{ enumerable: true, get() { return scopedPath; }, set(value) { scopedPath = value; this.attr('d', value); } }); this.absoulteForced = false; this.node = document.createElementNS(xmlns, "path"); } forceAbsoulte(v) { this.absoulteForced = v; return this; } clear() { this.path = ''; return this; } attr(idNS, value) { this.node.setAttributeNS(null, idNS, value); return this; } stroke(color) { if (color == '0') color = 'transparent'; return this.attr('stroke', color); } strokeWidth(value) { return this.attr('stroke-width', value); } fill(color) { if (color == '0') color = 'transparent'; return this.attr('fill', color); } command(name, relative, ...params) { if (this.absoulteForced) relative = false; name = relative ? name : name.toUpperCase(); if (this.path != '') this.path += ' '; if (0 in params) { this.path += name + ' ' + params.join(' '); } else { this.path += name; } return this; } close() { return this.command('z', false); } moveTo(x, y, relative = true) { return this.command('m', relative, x, y); } lineTo(x, y, relative = true) { return this.command('l', relative, x, y); } lineToHorizontal(x, relative = true) { return this.command('h', relative, x); } lineToVertical(y, relative = true) { return this.command('v', relative, y); } // cubicBezier( startX, startY, controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, endX, endY, relative = true ) { this.moveTo(startX, startY, relative); return this.command('c', relative, controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, endX, endY); } smoothCubicBezier( startX, startY, controlPoint2X, controlPoint2Y, endX, endY, relative = true ) { this.moveTo(startX, startY, relative); return this.command('s', relative, controlPoint2X, controlPoint2Y, endX, endY); } // quadraticBezier( startX, startY, controlPointX, controlPointY, endX, endY, relative = true ) { this.moveTo(startX, startY, relative); return this.command('q', relative, controlPointX, controlPointY, endX, endY); } smoothQuadraticBezier( startX, startY, endX, endY, relative = true ) { this.moveTo(startX, startY, relative); return this.command('t', relative, endX, endY); } // ellipticalArc( radiusX, radiusY, largeArcFlag, sweepFlag, x, y, relative = true ) { return this.command('a', relative, radiusX, radiusY, largeArcFlag, sweepFlag, x, y); } circle(x,y, rx, ry, relative) { this.moveTo(x - rx, y, relative); this.ellipticalArc(rx, ry, 0, '1,1', rx*2, 0); this.ellipticalArc(rx, ry, 0, '1,1', -rx*2, 0); return this; } } const snap = (x, factor) => Math.round(x / factor) * factor; const inverseLerp = (min, max, v) => (v - min) / (max - min); return class Graph { /** @param {GraphData} data */ constructor(data) { this.datapoints = data.datapoints; this.onValue = data.onValue; this.onCancel = data.onCancel; this.minmax = data.minmax ?? []; if (!data.minmax) this.computeMinMax(); data.style = data.style ?? {}; const style = this.style = data.style; style.strokeWidth = style.strokeWidth ?? 1; style.padding = style.padding ?? 1; style.lineSize = style.lineSize ?? 1; style.lineColor = style.lineColor ?? '#ff6996'; style.strokeColor = style.strokeColor ?? '#ff6996'; style.fillColor = style.fillColor ?? '#ff699622'; this.node = document.createElement('div'); this.node.classList.add('graph'); this.node.style.width = 'fit-content'; this.svgStroke = new SVGShape().fill(0); this.svgFill = new SVGShape().fill(0); this.svgOverlay = new SVGShape(); this.svgStroke.node.classList.add('graphStroke'); this.svgFill.node.classList.add('graphFill'); this.svgOverlay.node.classList.add('graphLine'); this.svgContainer = new SVGShapeContainer(0,0) .add(this.svgStroke, this.svgFill, this.svgOverlay) this.node.append(this.svgContainer.node); let _oldIndex = -1; this.node.addEventListener('mouseenter', e => { const data = this.updateContextualLine(e); _oldIndex = data.index; this?.onValue?.(data); }); this.node.addEventListener('mousemove', e => { const data = this.updateContextualLine(e); const tempIndex = data.index; if (tempIndex == _oldIndex) return; _oldIndex = tempIndex; this?.onValue?.(data); } ); this.node.addEventListener('mouseleave', () => { this.svgOverlay.clear(); this?.onCancel?.(); }); this.setSize(data.width, data.height); this.extendStyle(style); this.update(); } setSize(width, height) { width = width ?? 200; height = height ?? 200; this.width = width; this.height = height; this.svgContainer.setSize(width, height); this.node.style.width = width + 'px'; this.node.style.height = height + 'px'; this.updateSVGOrigin(); } computeMinMax() { if (typeof this.minmax != 'object') this.minmax = []; this.minmax[0] = Infinity; this.minmax[1] = -Infinity; for (const y of this.datapoints) { this.minmax[0] = Math.min(this.minmax[0], y); this.minmax[1] = Math.max(this.minmax[1], y); } return this; } updateSVGOrigin() { const offsetX = this.width * this.style.padding * 0.5; const offsetY = this.height * this.style.padding * 0.5; this.svgContainer.groupNode.setAttributeNS(null, 'transform-origin', `${offsetX}px ${offsetY}px`); } /** @param {GraphStyleData} data */ extendStyle(data) { ['strokeWidth','padding','lineSize','lineColor','strokeColor','fillColor'] .forEach(key => { this.style[key] = data[key] ?? this.style[key]; }); this.svgContainer.setPadding(this.style.padding); this.updateSVGOrigin(); this.svgStroke.stroke(this.style.strokeColor).strokeWidth(this.style.strokeWidth); this.svgFill.fill(this.style.fillColor); this.svgOverlay.fill(this.style.lineColor); } /** @param {MouseEvent} event */ updateContextualLine(event) { const length = this.datapoints.length - 1; const factor = this.width / length; const smallOffset = 0.5 - this.style.padding/2; const sampledOffsetPercentage = (event.offsetX/this.width - smallOffset) / this.style.padding; const sampledOffset = Math.min(Math.max(sampledOffsetPercentage, 0), 1) * this.width; const x = Math.floor(snap(sampledOffset, factor)); const i = Math.round(sampledOffset / this.width * length); const y = this.yOf(i); const size = this.style.lineSize / 2; const r = 4*size; const xLeft = x - size; const xRight = x + size; const yToFirst = y - r; const yFromSec = y + r; const yToSec = this.height; this.svgOverlay .clear() .forceAbsoulte(true) .moveTo(xLeft, 0).lineTo(xRight, 0).lineTo(xRight, yToFirst).lineTo(xLeft, yToFirst) .close() .moveTo(xLeft, yFromSec).lineTo(xRight, yFromSec).lineTo(xRight, yToSec).lineTo(xLeft, yToSec) .close() .forceAbsoulte(false) .circle(x, y, r, r, false); return {value: this.datapoints[i], offset: sampledOffsetPercentage, index: i} } yOf(i) { return this.height - inverseLerp( this.minmax[0], this.minmax[1], this.datapoints[i] ) * this.height; } update() { this.svgStroke.clear(); this.svgFill.clear(); const length = this.datapoints.length - 1; for (let i = 0; i <= length; i++) { const x = i / length * this.width; const y = this.yOf(i); if (i == 0) { this.svgStroke.moveTo(x, y); this.svgFill.moveTo(x, y); } else { this.svgStroke.lineTo(x, y, false); this.svgFill.lineTo(x, y, false); } } if (1 in this.datapoints) { this.svgFill.lineTo(this.width, this.height, false).lineTo(0, this.height, false); } // 0 sized circle that keeps the the height of the container constant this.svgFill.circle(0,0, 0, 0, false); } } })(); const pluginMap = {}; Plugins.all.forEach(plugin => pluginMap[plugin.id] = plugin); let downloadData = []; async function initializeAllDownloadData() { const storageDataMaybe = sessionStorage.getItem(KEY_STORAGE); if (storageDataMaybe) { downloadData = JSON.parse(storageDataMaybe); return; } for (let i = 1; i <= MAX_WEEKS; i++) { const weeksData = await new Promise(resolve => $.getJSON(URL + i, weeksData => resolve(weeksData)) ); downloadData.push(weeksData); } sessionStorage.setItem(KEY_STORAGE, JSON.stringify(downloadData)); } function dateSinceWeeks(numberOfWeeks, exclusive) { const date = new Date(); const dayOfTheWeek = date.getDay(); let offset = date.getDate() - numberOfWeeks * 7; offset -= dayOfTheWeek; // offset date to sunday of the week offset += 4; // offset date to thursday of the week. apparently thursday is the start of the week if (exclusive) offset --; date.setDate(offset); return date.toLocaleDateString('en-GB'); } function ordinalize(number) { const lastDigit = number % 10; const secondLastDigit = Math.floor(number / 10) % 10; if (secondLastDigit == 1) return number + "th"; if (lastDigit == 1) return number + "st"; if (lastDigit == 2) return number + "nd"; if (lastDigit == 3) return number + "rd"; return number + "th"; } const format = Intl.NumberFormat('en').format; const get = selector => dialog.object.querySelector(selector); function updateHTML(id, perWeek = true) { get('#ps-graph [y]').innerText = perWeek ? 'Downloads Per Week': 'Downloads'; const plugin = pluginMap[id]; get('#ps-rank').innerText = ordinalize(Plugins.all.indexOf(plugin) + 1); const authorElement = get('#ps-author'); const versionElement = get('#ps-version'); const weeklyElement = get('#ps-weekly'); const yearlyElement = get('#ps-yearly'); authorElement.innerText = plugin.author; versionElement.innerText = plugin.version; weeklyElement.innerText = format(downloadData[1][id]); yearlyElement.innerText = format(downloadData.at(-1)[id]); const downloadDataLength = downloadData.length; graph.datapoints = []; let maximumValue = 0; let isInfant = true; let infantOffset = 0; for (let i = 0; i < downloadDataLength; i++) { const index = downloadDataLength - i - 1; const weekDownloads = downloadData[index]?.[id] ?? 0; const nextWeekDownloads = downloadData[index - 1]?.[id] ?? 0; if (isInfant && weekDownloads - nextWeekDownloads > 0) isInfant = false; if (isInfant) { infantOffset++; continue; } const realIndex = i - infantOffset; graph.datapoints[realIndex] = weekDownloads; if (perWeek) graph.datapoints[realIndex] -= nextWeekDownloads; maximumValue = Math.max(maximumValue, graph.datapoints[realIndex]); } if (graph.datapoints.length <= 1) { dialog.object.classList.add('ps-not_enough_data'); return; } dialog.object.classList.remove('ps-not_enough_data'); graph.minmax[1] = maximumValue / 0.9; graph.update(); } const dialogOptions = {} const dialog = new Dialog({ width: 600, id: 'plugin_stats', title: 'Plugin Statistics', part_order: ['form', 'lines'], buttons: ['dialog.ok'], resizable: false, form: { plugin: { label: 'Plugin', type: 'select', options: dialogOptions }, per_week: { label: 'Per Week', type: 'checkbox', value: true } }, onFormChange(data) { updateHTML(data.plugin, data.per_week); }, lines: [ ` Ranked # this week

    Author

    ??

    Version

    ??

    Weekly Downloads

    ??

    Yearly Downloads

    ??
    ?? Weeks
    ` ], }); const graph = new Graph({ datapoints: [0,0], width: 1, height: 1, minmax: [0, 17500], style: { strokeWidth: 2, lineSize: 2, padding: 0.95, }, onValue({index, value}) { const downloadsSince = format(value); const downloads = downloadsSince <= 0 ? 'unreleased': downloadsSince; const numberOfWeeks = graph.datapoints.length - index - 1; const from = dateSinceWeeks(numberOfWeeks); const to = dateSinceWeeks(numberOfWeeks - 1, true); const perWeek = get('#plugin_stats #per_week').checked; if (perWeek) { get('.ps-graph-info').innerText = `${from} to ${to} ≈ ${downloads}`; return; } get('.ps-graph-info').innerText = `since ${from} ≈ ${downloads}`; }, onCancel() { get('.ps-graph-info').innerText = ''; } }); const spinningIcon = () => { const icon_node = Blockbench.getIconNode('donut_large'); icon_node.classList.add('spinning'); return icon_node; } let action; let loadingAction; let isPluginStateDead = false; const meta = { "title": "Plugin Statistics", "icon": "trending_up", "author": "Malik12tree", "description": "View download statistics of your blockbench plugin", "version": "1.3.0", "variant": "both", "tags": ["Blockbench", "Plugins", "Development"] } BBPlugin.register('pluginstats', { ...meta, onload() { loadingAction = new Action('plugin_stat_loading', { name: 'Fetching Plugin Statistics..', icon: spinningIcon(), }); action = new Action('plugin_stat_action', { name: 'View ' + meta.title, icon: meta.icon, description: meta.description, click() { dialog.show(); graph.extendStyle({ lineColor: CustomTheme.data.colors.accent, strokeColor: CustomTheme.data.colors.accent, fillColor: CustomTheme.data.colors.accent + '22' }); get('#ps-graph').append(graph.node); updateHTML(open_interface.getFormResult().plugin ?? Plugins.all[0].id); const rect = get('content.dialog_content').getBoundingClientRect(); graph.setSize(rect.width - 30, 200); graph.update(); } }); MenuBar.addAction(loadingAction, 'tools'); initializeAllDownloadData().then(() => { if (isPluginStateDead) return; // sort if not sorted if (!Object.values(Plugins.download_stats).length) { Plugins.download_stats = downloadData[1]; Plugins.sort(); } // // setup options Plugins.all.forEach(plugin => { if (plugin.source != STORE) return; dialogOptions[plugin.id] = plugin.title; }); // loadingAction.delete(); MenuBar.addAction(action, 'tools'); }); }, onunload() { isPluginStateDead = true; action.delete(); loadingAction.delete(); } }); })(); ================================================ FILE: plugins/preview_scene_customiser/about.md ================================================

    How to use

    • Press Create New Preview Scene and create a model.
    • To export to a file, go to File > Export > Export Preview Scene.
    • To install directly to Blockbench, go to File > Export > Install Preview Scene in Blockbench, and fill in the options.

    Managing scenes

    Management options can be found under View > Preview Scene Customiser.

    • To manage installed scenes, go to Manage Preview Scenes.
    • To import scene files, go to Import Preview Scene, select a scene file, and fill in the options.
    • To download pre-made scenes, go to Download Preview Scenes.
    ================================================ FILE: plugins/preview_scene_customiser/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2022-10-14", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2023-10-03", "author": "Ewan Howell", "categories": [ { "title": "Technical Changes", "list": [ "Update to new plugin format" ] } ] }, "1.1.1": { "title": "1.1.1", "date": "2023-11-04", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed plugin loading after models have been opened" ] } ] }, "1.1.3": { "title": "1.1.2", "date": "2023-08-09", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed a crash" ] } ] }, "1.1.4": { "title": "1.1.3", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed bugs introduced with Blockbench 4.12" ] } ] }, "1.1.5": { "title": "1.1.5", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed a crash when creating a new project from the start screen" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] } ] } } ================================================ FILE: plugins/preview_scene_customiser/preview_scene_customiser.js ================================================ (async function () { let format, codec, exportAction, exportAction2, importAction, manageAction, styles, properties, ignoreChange const id = "preview_scene_customiser" const name = "Preview Scene Customiser" const icon = "nature_people" const author = "Ewan Howell" const description = "Create your very own preview scenes. Download preview scenes from the Preview Scene Store. Edit and manage existing preview scenes." const links = { website: { text: "By Ewan Howell", link: "https://ewanhowell.com/", icon: "language", colour: "#33E38E" }, discord: { text: "Discord Server", link: "https://discord.ewanhowell.com/", icon: "fab.fa-discord", colour: "#727FFF" }, github: { text: "Submit Preview Scenes", link: "https://github.com/ewanhowell5195/previewSceneCustomiser/", icon: "fab.fa-github", colour: "#6E40C9" } } const E = s => $(document.createElement(s)) function setCurrentPreviewScene(data) { localStorage.setItem("preview_scene", data.scene.id) activePreviewScene = data.scene.id } function removeCurrentPreviewScene() { if (ignoreChange) return localStorage.removeItem("preview_scene") } let activePreviewScene = PreviewScene.active?.id ?? "none" const scenes = [] Plugin.register(id, { title: name, icon: "icon.png", author, description, tags: ["Preview Scenes", "Blockbench"], version: "1.2.0", min_version: "5.0.0", variant: "both", creation_date: "2022-10-14", await_loading: true, has_changelog: true, website: "https://ewanhowell.com/plugins/preview-scene-customiser/", repository: "https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/preview-scene-customiser", bug_tracker: "https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Preview Scene Customiser]", onload() { styles = Blockbench.addCSS(` .preview-scene-links { display: flex; justify-content: space-around; margin: 20px 40px 0; } .preview-scene-links > a { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 5px; text-decoration: none; flex-grow: 1; flex-basis: 0; color: var(--color-subtle_text); text-align: center; } .preview-scene-links > a:hover { background-color: var(--color-accent); color: var(--color-light); } .preview-scene-links > a > i { font-size: 32px; width: 100%; max-width: initial; height: 32px; text-align: center; } .preview-scene-links > a:hover > i { color: var(--color-light) !important; } .preview-scene-links > a > p { flex: 1; display: flex; align-items: center; } #format_page_preview_scene_model { padding-bottom: 0; } #format_page_preview_scene_model .format_target { margin-bottom: 6px; } #format_page_preview_scene_model div:nth-child(3), #format_page_preview_scene_model content { overflow-y: auto; } `) const stored = JSON.parse(localStorage.getItem("preview_scenes") ?? "[]") for (const scene of stored) { scenes.push(scene.id) new PreviewModel(scene.id, scene.model) if (scene.category) PreviewScene.menu_categories[scene.category] ??= { _label: titleCase(scene.category) } new PreviewScene(scene.id, { category: scene.category, name: scene.name, preview_models: [scene.id] }) } codec = new Codec("preview_scene_codec", { name: "Preview Scene", extension: "bbscene", remember: true, load_filter: { type: "json", extensions: ["bbscene"] }, async export() { var scope = this const compiled = scope.compile({raw: true}) compiled.settings = { renderSide: Project.preview_scene_render_side, lightSide: Project.preview_scene_light_side, lightColour: Project.preview_scene_light_colour, tintColour: Project.preview_scene_tint_colour, shading: Project.preview_scene_shading } let [dialog, settings] = await configurePreviewSceneSettings(compiled, { export: true }) settings = await settings Project.preview_scene_render_side = settings.renderSide Project.preview_scene_light_side = settings.lightSide Project.preview_scene_light_colour = settings.lightColour Project.preview_scene_tint_colour = settings.tintColour Project.preview_scene_shading = settings.shading dialog.close() Blockbench.export({ resource_id: 'model', type: scope.name, extensions: [scope.extension], name: scope.fileName(), startpath: scope.startPath(), content: scope.compile({settings}), custom_writer: isApp ? (a, b) => scope.write(a, b) : null, }, path => scope.afterDownload(path)) }, compile(options) { options ??= {} const clear_elements = [] const element_index_lut = [] function computeCube(s) { if (s.export == false) return const element = {} element_index_lut[Cube.all.indexOf(s)] = clear_elements.length if (s.name !== "cube") element.name = s.name element.position = s.from.slice() let to = s.to.slice() if (s.inflate) for (let i = 0; i < 3; i++) { element.position[i] -= s.inflate to[i] += s.inflate } element.size = [to[0] - element.position[0], to[1] - element.position[1], to[2] - element.position[2]] if (!s.rotation.allEqual(0)) element.rotation = s.rotation if (!s.origin.allEqual(0)) element.origin = s.origin const e_faces = {} for (const face in s.faces) { if (s.faces.hasOwnProperty(face) && s.faces[face].texture !== null) { const tag = new oneLiner() if (s.faces[face].enabled !== false) { tag.uv = s.faces[face].uv.slice(); tag.uv.forEach((n, i) => tag.uv[i] = n) } e_faces[face] = tag } } element.faces = e_faces if (Object.keys(element.faces).length) { clear_elements.push(element) } } function iterate(arr) { if (!arr || !arr.length) return for (let i = 0; i < arr.length; i ++) { if (arr[i].type === "cube") computeCube(arr[i]) else if (arr[i].type === "group") iterate(arr[i].children) } } iterate(Outliner.root) function checkExport(key, condition) { key = options[key] if (key === undefined) { return condition; } else { return key } } const previewScene = {} if (checkExport("comment", Project.credit || settings.credit.value)) previewScene.credit = Project.credit || settings.credit.value if (options.settings) previewScene.settings = options.settings const texture = Texture.getDefault() if (texture) { const canvas = document.createElement("canvas") canvas.width = texture.width canvas.height = texture.height canvas.getContext("2d").drawImage(texture.img, 0, 0) previewScene.texture = canvas.toDataURL() } if (Project.texture_width !== 16 || Project.texture_height !== 16) previewScene.texture_size = [Project.texture_width, Project.texture_height] if (checkExport("elements", clear_elements.length >= 1)) previewScene.cubes = clear_elements if (checkExport("groups", (settings.export_groups.value && Group.all.length))) { groups = compileGroups(false, element_index_lut) let i = 0; while (i < groups.length) { if (typeof groups[i] === "object") i = Infinity i++ } if (i === Infinity) previewScene.groups = groups } this.dispatchEvent("compile", {model: previewScene, options}); if (options.raw) return previewScene else return autoStringify(previewScene) }, async parse(model) { if (!model.cubes) return Blockbench.showMessageBox({ translateKey: "invalid_model", icon: "error" }) this.dispatchEvent("parse", {model}) if (typeof model.credit === "string") Project.credit = model.credit if (Array.isArray(model.texture_size)) { Project.texture_width = model.texture_size[0] Project.texture_height = model.texture_size[1] } if (model.settings?.renderSide) Project.preview_scene_render_side = model.settings.renderSide if (model.settings?.lightSide) Project.preview_scene_light_side = model.settings.lightSide if (model.settings?.lightColour) Project.preview_scene_light_colour = model.settings.lightColour if (model.settings?.tintColour) Project.preview_scene_tint_colour = model.settings.tintColour if (model.settings?.shading) Project.preview_scene_shading = model.settings.shading if (model.texture) { const data = await getTexture(model.texture) if (data) new Texture({name: "texture.png"}).fromDataURL(data).add() } const cubes = [] model.cubes.forEach(obj => { const cube = new Cube(obj) if (obj.name) cube.name = obj.name cube.from = obj.position cube.to = [obj.position[0] + obj.size[0], obj.position[1] + obj.size[1], obj.position[2] + obj.size[2]] for (var key in cube.faces) { if (obj.faces[key] === undefined) { cube.faces[key].texture = null cube.faces[key].uv = [0, 0, 0, 0] } else { cube.faces[key].uv.forEach((n, i) => { cube.faces[key].uv[i] = obj.faces[key].uv[i] }) } } Outliner.root.push(cube) cube.parent = "root" cube.init() cubes.push(cube); }) if (model.groups && model.groups.length > 0) parseGroups(model.groups) updateSelection() this.dispatchEvent("parsed", {model}) } }) Language.data["format_category.blockbench"] ??= "Blockbench" format = new ModelFormat({ id: "preview_scene_model", name: "Preview Scene", description: "Create a new Preview Scene model", extension: "bbscene", icon, category: "blockbench", single_texture: true, rotate_cubes: true, model_identifier: false, optional_box_uv: true, centered_grid: true, codec, format_page: { component: { methods: { create: () => format.new() }, template: `

    ${description}

    Target : Blockbench

    How to use:

    • Press Create New Preview Scene and create a model.

    • To export to a file, go to File > Export > Export Preview Scene.

    • To install directly to Blockbench, go to File > Export > Install Preview Scene in Blockbench, and fill in the options.

    Managing scenes:

    Management options can be found under View > Preview Scene Customiser.

    • To manage installed scenes, go to Manage Preview Scenes.

    • To import scene files, go to Import Preview Scene, select a scene file, and fill in the options.

    • To download pre-made scenes, go to Download Preview Scenes.

    ` } }, onActivation() { setTimeout(() => { ignoreChange = true PreviewScene.active?.unselect() ignoreChange = false }, 0) }, onDeactivation: () => PreviewScene.scenes[activePreviewScene]?.select() }) codec.format = format BarItems.preview_scene.condition = () => Project.format !== format exportAction = new Action({ id: "export_preview_scene_model", name: "Export Preview Scene", icon, condition: { formats: [format.id] }, click: () => codec.export() }) MenuBar.addAction(exportAction, "file.export.0") exportAction2 = new Action({ id: "install_preview_scene", name: "Install Preview Scene in Blockbench", icon: "add_to_photos", condition: { formats: [format.id] }, click() { const model = JSON.parse(codec.compile()) model.settings = { renderSide: Project.preview_scene_render_side, lightSide: Project.preview_scene_light_side, lightColour: Project.preview_scene_light_colour, tintColour: Project.preview_scene_tint_colour, shading: Project.preview_scene_shading } importPreviewScene(model, {dontEnable: true}) } }) MenuBar.addAction(exportAction2, "file.export.1") codec.export_action = exportAction manageAction = new Action({ name, id, description: "Import and manage your Preview Scenes", icon, children: [ new Action({ id: "manage_preview_scene_models", name: "Manage Preview Scenes", icon: "photo_library", click: () => managePreviewScenes() }), new Action({ id: "import_preview_scene_model", name: "Import Preview Scene", icon: "add_to_photos", async click() { try { Blockbench.import({ resource_id: "model", extensions: ["bbscene"], type: "Blockbench Preview Scene", }, files => { if (files) importPreviewScene(JSON.parse(files[0].content)) }) } catch { Blockbench.showMessageBox({ translateKey: "invalid_model", icon: "error" }) } } }), new Action({ id: "download_preview_scene_models", name: "Download Preview Scenes", icon: "file_download", async click() { const sceneData = await fetch("https://raw.githubusercontent.com/ewanhowell5195/previewSceneCustomiser/main/scenes.json").then(e => e.json()).catch(() => {}) if (!sceneData) return new Dialog({ id: "download_preview_scene_models_connection_failure_dialog", title: name, lines: ['

    Connection failed

    Please check your internet connection and make sure that you can access GitHub'], buttons: ["Okay"] }).show() const dialog = new Dialog({ id: "download_preview_scene_dialog", title: "Preview Scene Customiser Store", width: 780, buttons: [], sidebar: { pages: Object.fromEntries(sceneData.map(e => [e.id, { label: titleCase(e.id), icon: e.icon }])), onPageSwitch(page) { $("dialog#download_preview_scene_dialog #scene_categories > div").addClass("hidden") $(`dialog#download_preview_scene_dialog #scene_category_${page}`).removeClass("hidden") } }, lines: [`
    `] }).show() const categories = $("dialog#download_preview_scene_dialog #scene_categories") let selected for (const category of sceneData) { categories.append(E("div").attr("id", `scene_category_${category.id}`).addClass("hidden").append( E("h2").text(titleCase(category.id)), E("div").addClass("scenes_container").append(...category.scenes.map(e => E("div").addClass("scene").attr("data-scene", e.id).append( E("img").attr("src", `https://raw.githubusercontent.com/ewanhowell5195/previewSceneCustomiser/main/scenes/${e.id}/scene.webp`), E("span").text(e.name ?? titleCase(e.id)), E("i").addClass("scene_author material-icons").attr("data-author", `By ${e.author}`).text("person") ).on("click", f => { $("dialog#download_preview_scene_dialog #scene_categories .selected").removeClass("selected") $(f.currentTarget).addClass("selected") selected = e }))) )) } $(`dialog#download_preview_scene_dialog #scene_category_${sceneData[0].id}`).removeClass("hidden") $("dialog#download_preview_scene_dialog #close").on("click", e => dialog.close()) $("dialog#download_preview_scene_dialog #download").on("click", async e => { if (!selected) return Blockbench.showQuickMessage("Please select a preview scene") const scene = await fetch(`https://raw.githubusercontent.com/ewanhowell5195/previewSceneCustomiser/main/scenes/${selected.id}/scene.bbscene`).then(e => e.json()).catch(() => {}) if (!scene) return Blockbench.showQuickMessage("Unable to load preview scene") importPreviewScene(scene, { name: selected.name ?? titleCase(selected.id), category: titleCase($("dialog#download_preview_scene_dialog #scene_categories > :not(.hidden)")[0].id.slice(15)), eula: selected.eula }) dialog.close() }) $("dialog#download_preview_scene_dialog .dialog_sidebar").append( E("div").addClass("spacer"), E("a").attr("href", links.github.link).css({ display: "flex", gap: "10px", "align-items": "center", "justify-content": "center", margin: "24px", cursor: "pointer", "text-decoration": "none" }).append( E("i").addClass("icon fab fa-github").css("font-size", "22px"), E("span").text("Submit your own").css("text-decoration", "underline") ) ) } }) ] }) MenuBar.addAction(manageAction, "view.11") const currentScene = localStorage.getItem("preview_scene") if (currentScene) setTimeout(() => { if (Project.format?.id !== format.id) PreviewScene.scenes[currentScene]?.select() else activePreviewScene = currentScene }, 0) properties = [ new Property(ModelProject, "number", "preview_scene_render_side", { exposed: false, default: 2, condition: () => Format === format }), new Property(ModelProject, "number", "preview_scene_light_side", { exposed: false, default: 0, condition: () => Format === format }), new Property(ModelProject, "string", "preview_scene_light_colour", { exposed: false, default: "#ffffff", condition: () => Format === format }), new Property(ModelProject, "string", "preview_scene_tint_colour", { exposed: false, default: "#ffffff", condition: () => Format === format }), new Property(ModelProject, "boolean", "preview_scene_shading", { exposed: false, default: true, condition: () => Format === format }) ] Blockbench.on("select_preview_scene", setCurrentPreviewScene) Blockbench.on("unselect_preview_scene", removeCurrentPreviewScene) }, onuninstall() { localStorage.removeItem("preview_scene") localStorage.removeItem("preview_scenes") }, onunload() { Blockbench.removeListener("select_preview_scene", setCurrentPreviewScene) Blockbench.removeListener("unselect_preview_scene", removeCurrentPreviewScene) format.delete() codec.delete() manageAction.children.forEach(e => e.delete()) manageAction.delete() exportAction.delete() exportAction2.delete() PreviewScene.active?.unselect() for (const scene of scenes) PreviewScene.scenes[scene].delete() styles.delete() properties.forEach(e => e.delete()) } }) async function configurePreviewSceneSettings(model, args) { if (!model.texture) return Blockbench.showMessageBox({ title: "Unable to configure preview scene settings", message: "This preview scene is missing a texture. Please add a texture to it before trying to configure its settings.", icon: "warning" }) let texture = await new Promise(fulfill => new THREE.TextureLoader().load(model.texture, fulfill, null, fulfill)) const form = { name: { label: "Preview Scene Name", type: "input", placeholder: "Example Name", value: args?.name }, category: { label: "Preview Scene Category", type: "input", placeholder: "Minecraft", value: args?.category }, renderSide: { label: "Render Side", type: "select", options: { 0: "Front Side", 1: "Back Side", 2: "Double Side" }, value: model.settings?.renderSide ?? 2 }, lightSide: { label: "Light side", type: "select", options: { 0: "Up", 1: "North", 2: "East", 3: "Down", 4: "South", 5: "West" }, value: model.settings?.lightSide ?? 0 }, lightColour: { label: "Light colour", type: "color", value: model.settings?.lightColour ?? "#ffffff" }, tintColour: { label: "Tint colour", type: "color", value: model.settings?.tintColour ?? "#ffffff" }, shading: { label: "Shading", type: "checkbox", value: model.settings?.shading ?? true } } if (args?.export) { delete form.name delete form.category } const dialog = new Dialog({ id: "preview_scene_settings_dialog", title: "Preview Scene Settings", buttons: [], part_order: ["form", "lines"], form, lines: [`
    ${texture.image.width} ⨉ ${texture.image.height}
    save
    `] }).show() $("dialog#preview_scene_settings_dialog #preview_scene_texture").on("click", async e => { let newTexture try { if (isApp) { const file = electron.dialog.showOpenDialogSync({ filters: [ { name: "PNG Texture", extensions: ["png"] } ] }) if (!file) return newTexture = await new Promise(fulfill => new THREE.TextureLoader().load(file[0], fulfill, null, fulfill)) } else { const input = document.createElement("input") let file input.type = "file" input.accept = ".png" await new Promise(fulfil => { input.onchange = () => { file = Array.from(input.files) fulfil() } input.click() }) const data = await new Promise(fulfil => { const fr = new FileReader() fr.onload = () => fulfil(fr.result) fr.readAsDataURL(file[0]) }) newTexture = await new Promise(fulfill => new THREE.TextureLoader().load(data, fulfill, null, fulfill)) } } catch { return Blockbench.showQuickMessage("Unable to load texture") } if (texture.image.width !== newTexture.image.width || texture.image.height !== newTexture.image.height) return Blockbench.showQuickMessage(`Selected texture does not match required dimentions of ${texture.image.width} ⨉ ${texture.image.height}`, 2000) texture = newTexture const canvas = document.createElement("canvas") canvas.width = texture.image.width canvas.height = texture.image.height canvas.getContext("2d").drawImage(texture.image, 0, 0) const data = canvas.toDataURL() $("dialog#preview_scene_settings_dialog #preview_scene_texture").attr("src", data) model.texture = data }) $("dialog#preview_scene_settings_dialog #save").on("click", e => Blockbench.export({ type: "PNG Texture", extensions: ["png"], name: args?.name, content: model.texture, savetype: "image" })) $("dialog#preview_scene_settings_dialog #cancel").on("click", e => dialog.close()) return [dialog, new Promise(fulfil => { $("dialog#preview_scene_settings_dialog #import").on("click", e => { fulfil({ renderSide: parseInt(dialog.form.form_data.renderSide.bar.querySelector(".bb-select").getAttribute("value")), lightSide: parseInt(dialog.form.form_data.lightSide.bar.querySelector(".bb-select").getAttribute("value")), lightColour: dialog.form.form_data.lightColour.colorpicker.value.toHexString(), tintColour: dialog.form.form_data.tintColour.colorpicker.value.toHexString(), shading: dialog.form.form_data.shading.bar.querySelector("input").checked }) }) })] } async function importPreviewScene(model, args) { let [dialog, settings] = await configurePreviewSceneSettings(model, args) $("dialog#preview_scene_settings_dialog #import").on("click", async e => { settings = await settings const name = dialog.form.form_data.name.bar.querySelector("input").value.trim() const category = dialog.form.form_data.category.bar.querySelector("input").value.trim().replace(/\s/g, "_") if (!name) return Blockbench.showQuickMessage("Invalid name") const id = name.toLowerCase().replace(/\s/g, "_") if (PreviewScene.scenes[id]?.id) return Blockbench.showQuickMessage("Preview Scene already exists, please pick a different name", 2000) model.color = settings.tintColour model.shading = settings.shading model.render_side = settings.renderSide scenes.push(id) new PreviewModel(id, model) const lightColour = tinycolor(settings.lightColour).toRgb() PreviewScene.menu_categories[category] ??= { _label: titleCase(category) } const scene = new PreviewScene(id, { category, name, preview_models: [id], light_color: { r: lightColour.r / 255, g: lightColour.g / 255, b: lightColour.b / 255 }, light_side: settings.lightSide, require_minecraft_eula: args?.eula }) if (!args?.dontEnable) PreviewScene.scenes[id].select() const stored = JSON.parse(localStorage.getItem("preview_scenes") ?? "[]") stored.push({ id, category, name, model: model }) localStorage.setItem("preview_scenes", JSON.stringify(stored)) dialog.close() }) } async function managePreviewScenes() { const dialog = new Dialog({ title: "Manage Preview Scenes", id: "manage_preview_scenes_dialog", lines: [`
    `], buttons: [] }).show() $("dialog#manage_preview_scenes_dialog #close").on("click", e => dialog.cancel()) const builtinScenes = Object.entries(PreviewScene.scenes).filter(e => !scenes.includes(e[0])) if (builtinScenes.length) { $("dialog#manage_preview_scenes_dialog #builtin_label").removeClass("hidden") const builtin = $("dialog#manage_preview_scenes_dialog #builtin_preview_scenes").removeClass("hidden") for (const scene of builtinScenes) { builtin.append(E("div").addClass("row").append( E("div").text(scene[1].name), E("span").addClass("spacer"), E("i").addClass("material-icons icon").text("edit").attr("title", "Edit preview scene").on("click", e => { editPreviewScene(scene[1]) dialog.close() }), E("i").addClass("material-icons icon").text("save").attr("title", "Save preview scene").on("click", e => savePreviewScene(scene[1])) )) } } const customScenes = Object.entries(PreviewScene.scenes).filter(e => scenes.includes(e[0])) if (customScenes.length) { $("dialog#manage_preview_scenes_dialog #custom_label").removeClass("hidden") const custom = $("dialog#manage_preview_scenes_dialog #custom_preview_scenes").removeClass("hidden") for (const scene of customScenes) { custom.append(E("div").addClass("row").append( E("span").text(scene[1].name), E("span").addClass("spacer"), E("i").addClass("material-icons icon").text("edit").attr("title", "Edit preview scene").on("click", e => { editPreviewScene(scene[1]) dialog.close() }), E("i").addClass("material-icons icon").text("save").attr("title", "Save preview scene").on("click", e => savePreviewScene(scene[1])), E("i").addClass("material-icons icon").text("delete").attr("title", "Delete preview scene").on("click", e => { $("dialog#manage_preview_scenes_dialog .dialog_wrapper").append( E("div").attr("id", "delete_warning").append( E("div").attr("id", "delete_warning_darken"), E("div").attr("id", "delete_warning_container").append( E("h2").html(`Are you sure you want to delete
    ${scene[1].name}?`), E("div").attr("id", "delete_warning_buttons").append( E("button").text("Cancel").on("click", e => $("dialog#manage_preview_scenes_dialog #delete_warning").remove()), E("button").addClass("danger-button").text("Delete").on("click", e => { PreviewScene.active?.unselect() PreviewScene.scenes[scene[1].id].delete() scenes.splice(scenes.indexOf(scene[1].id), 1) const stored = JSON.parse(localStorage.getItem("preview_scenes")) stored.splice(stored.findIndex(e => e.id === scene[1].id), 1) localStorage.setItem("preview_scenes", JSON.stringify(stored)) managePreviewScenes() dialog.close() }) ) ) ) ) }) )) } } } function getModel(model) { const data = {} if (model.texture) data.texture = model.texture if (!model.texture_size.allEqual(16)) data.texture_size = model.texture_size data.cubes = model.cubes return data } function getTexture(texture) { if (texture.startsWith("data:image/png;base64,")) return texture return new Promise(async fulfil => { const reader = new FileReader() reader.onload = e => fulfil(e.target.result) reader.readAsDataURL(new Blob([await fetch(texture).then(e => e.arrayBuffer())], { type: "image/png" })) }).catch(() => {}) } function editPreviewScene(scene) { const model = getModel(scene.preview_models[0]) codec.parse(model) Project.name = scene.id Project.preview_scene_render_side = scene.preview_models[0].render_side Project.preview_scene_light_side = scene.light_side Project.preview_scene_light_colour = tinycolor.fromRatio(scene.light_color).toHexString() Project.preview_scene_tint_colour = scene.preview_models[0].color Project.preview_scene_shading = scene.preview_models[0].shading Blockbench.setStatusBarText(scene.name) } async function savePreviewScene(scene) { for (const model of scene.preview_models) { const out = getModel(model) out.settings = { renderSide: scene.preview_models[0].render_side, lightSide: scene.light_side, lightColour: tinycolor.fromRatio(scene.light_color).toHexString(), tintColour: scene.preview_models[0].color, shading: scene.preview_models[0].shading } out.texture = await getTexture(out.texture) Blockbench.export({ type: "Blockbench Preview Scene", extensions: ["bbscene"], name: scene.id, content: autoStringify(out), savetype: "bbscene" }) } } function titleCase(str) { return str.replace(/_|-/g, " ").replace(/\w\S*/g, str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()) } })() ================================================ FILE: plugins/quick_box_uv_layout.js ================================================ (function () { let button; Plugin.register('quick_box_uv_layout', { title: 'Quick Box-UV Layout', author: 'Manuel-3', description: 'Button that changes UV of a Per-face cube into Box-UV layout.', about: 'This plugin simply adds a button that rearranges your individual Per-face UV rectangles in the same way Box-UV mode would. This is handy if you want to use the standard Box-UV format, but also have the flexibility of Per-face UV mode.', icon: 'calendar_view_month', version: '0.0.1', variant: 'both', onload() { button = new Action('quick_box_uv_layout', { name: 'Quick Box-UV Layout', description: 'Changes UV into Box-UV layout.', icon: 'calendar_view_month', click: function () { Undo.initEdit({ elements: Cube.selected }); // Horizontal and vertical offset let h = 0; let v = 0; // If box-uv then convert to per-face if (Project.box_uv) Project.box_uv = false; Cube.selected.forEach(cube => { // Get cube size const x = cube.size(0, true); const y = cube.size(1, true); const z = cube.size(2, true); // Get the required offset by looking at the top left corner of the up face h = cube.faces['up'].uv[2] - z; v = cube.faces['up'].uv[3]; // Set individual faces position and size // Note that up face is flipped on both axes and down face is flipped on the horizontal axis cube.faces['north'].uv = [h + z, v + z, h + z + x, v + z + y]; cube.faces['east'].uv = [h, v + z, h + z, v + z + y]; cube.faces['west'].uv = [h + z + x, v + z, h + z + x + z, v + z + y]; cube.faces['south'].uv = [h + z + x + z, v + z, h + z + x + z + x, v + z + y]; cube.faces['up'].uv = [h+ z + x, v + z, h + z, v]; cube.faces['down'].uv = [h + z + x + x, v, h + z + x, v + z]; }); Undo.finishEdit('convert to box-uv layout'); // Update view to make the changes show Canvas.updateView({elements: Cube.selected, element_aspects: {uv: true}}); } }); Toolbars.uv_editor.add(button); }, onunload() { button.delete(); } }); })(); ================================================ FILE: plugins/rainbow_road_game/LICENSE.MD ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: plugins/rainbow_road_game/about.md ================================================ You can start a race by clicking the Play button at the top center of the viewport. Navigate using `WASD`: `W` accelerates, `S` decelerates or drives backwards. `A` and `D` are used for steering. Only works with a physical keyboard! Stay on the road, collect points, and beat your highscore! Use the "View Rainbow Road Game Highscore" action to see your highscore. ================================================ FILE: plugins/rainbow_road_game/rainbow_road_game.js ================================================ /// (function() { class RainbowRace { constructor() { this.velocity = 0.03; this.y_velocity = 0; this.steering_angle = 0; this.steer_direction = 0; this.turn_axis = new THREE.Vector3(0, 1, 0); this.step = 4; this.path = []; this.waypoints = []; this.material = new THREE.MeshPhongMaterial({ color: 0xffffff, flatShading: true, vertexColors: true, shininess: 0, side: THREE.DoubleSide }); this.geometry = new THREE.BufferGeometry(); this.track_width = 6; this.track_length = 250; this.track_length_back = 12; this.collision_length = 64; this.ticks = 0; this.playing = false; this.on_track = true; this.score = 0; for (let i = 0; i < this.track_length; i++) { this.addPathPoint(i < this.track_length_back); } let colors = [ [128/255, 75/255, 227/255], [ 21/255, 118/255, 240/255], [ 68/255, 189/255, 96/255], [253/255, 203/255, 42/255], [252/255, 137/255, 46/255], [240/255, 40/255, 67/255], ] let bg_color = new THREE.Color(CustomTheme.data.colors.dark); let vertex_count = 4 * this.track_width * this.track_length; this.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertex_count * 3), 3)); this.geometry.setAttribute('color', new THREE.BufferAttribute( new Float32Array(vertex_count * 3), 3)); for (let i = 0; i < this.track_length * 20; i++) { for (let j = 0; j < 4; j++) { let k = 0; for (let color of colors) { let color_factor = 1; if ( (k==0 && j%2==0) || (k==5 && j%2==1) ) { color_factor = 1.5; } let fade = Math.min(Math.pow(i / (this.track_length * 0.97), 2), 1); this.geometry.attributes.color.setXYZ( (i*6 + k) * 4 + j, Math.lerp(color[0] * color_factor, bg_color.r, fade), Math.lerp(color[1] * color_factor, bg_color.g, fade), Math.lerp(color[2] * color_factor, bg_color.b, fade) ); k++; } } } this.updateGeometry(); this.coin_geometry = new THREE.OctahedronGeometry(5, 0); this.coin_geometry2 = new THREE.OctahedronGeometry(6.2, 0); this.coin_material = new THREE.MeshPhongMaterial({ color: new THREE.Color(3.3, 3.2, 0.8), flatShading: false, shininess: 1 }); this.coin_material2 = new THREE.MeshPhongMaterial({ color: 0xff9c2b, flatShading: true, shininess: 0, opacity: 0.5, transparent: true }); this.coins = []; this.scene = new THREE.Object3D(); this.world = new THREE.Object3D(); this.track = new THREE.Mesh(this.geometry, this.material); this.scene.add(this.world); this.world.add(this.track); this.position = new THREE.Vector3(); this.keys = { w: false, s: false, a: false, d: false, }; document.addEventListener('keydown', event => { if (event.key == 'w') this.keys.w = true; if (event.key == 's') this.keys.s = true; if (event.key == 'a') this.keys.a = true; if (event.key == 'd') this.keys.d = true; }) document.addEventListener('keyup', event => { if (event.key == 'w') this.keys.w = false; if (event.key == 's') this.keys.s = false; if (event.key == 'a') this.keys.a = false; if (event.key == 'd') this.keys.d = false; }) this.interval = setInterval(() => { this.tick(); }, 1000/30); } async start() { if (this.playing) this.stop(); Canvas.scene.add(this.scene); three_grid.visible = false; let model_size = 3 / calculateVisibleBox()[0]; Project.model_3d.scale.set(model_size, model_size, model_size); let path_scale = 3; this.track.scale.set(path_scale, path_scale, path_scale); this.velocity = 0; this.y_velocity = 0; this.on_track = true; this.playing = true; this.score = 0; this.steer_direction = 0; this.scene.rotation.set(0, 0, 0); this.world.position.set(0, 0, -this.track_length_back * path_scale); this.track.position.set(0, 0, 0); this.track.rotation.set(0, 0, 0); let camera_preset = { projection: 'perspective', position: [0, 32, -40], target: [0, 20, 0] }; Preview.selected.loadAnglePreset(camera_preset); this.front_right_wheel = Group.all.find(g => { let name = g.name.toLowerCase(); return name.includes('wheel') && name.includes('front') && name.includes('right') })?.mesh; this.front_left_wheel = Group.all.find(g => { let name = g.name.toLowerCase(); return name.includes('wheel') && name.includes('front') && name.includes('left') })?.mesh; let rear_wheel = Group.all.find(g => { let name = g.name.toLowerCase(); return (name.includes('wheel') || name.includes('axle') || name.includes('axis')) && (name.includes('rear') || name.includes('back')) }) this.rotation_adjustment = Math.PI; if (rear_wheel) { if (rear_wheel.origin[2] < 0) { this.rotation_adjustment = 0; Project.model_3d.position.z -= rear_wheel.origin[2] * model_size; } else { Project.model_3d.position.z += rear_wheel.origin[2] * model_size; } } return this; } stop() { Canvas.scene.remove(this.scene); three_grid.visible = true; this.playing = false; Project.model_3d.rotation.y = 0; Project.model_3d.scale.set(1, 1, 1); Project.model_3d.position.set(0, 0, 0); Blockbench.setStatusBarText(); this.coins.forEach(coin => this.world.remove(coin)); this.coins.empty(); if (this.timeout) { clearTimeout(this.timeout); delete this.timeout; } } tick() { if (!this.playing) { return; } let steering_amount = 0.2 * (1-Math.exp(0.2 * (this.velocity - 18))); if (this.keys.a) { this.steering_angle -= steering_amount * (1+Math.pow( this.steering_angle / 2, 3)); } else if (this.keys.d) { this.steering_angle += steering_amount * (1+Math.pow(-this.steering_angle / 2, 3)); } else if (this.steering_angle) { //this.steering_angle -= (this.steering_angle > 0 ? 1 : -1) * 0.14; //if (Math.abs(this.steering_angle) < 0.1) this.steering_angle = 0; this.steering_angle *= 0.8; } this.steering_angle = Math.clamp(this.steering_angle, -1.5, 1.4); if (this.keys.w) { this.velocity += 0.1 * (1-Math.exp(0.3 * (this.velocity - 7))); } else if (this.keys.s) { this.velocity -= this.velocity > 0 ? 0.15 : 0.1; } else { this.velocity -= this.velocity > 0 ? 0.1 : -0.1; if (Math.abs(this.velocity) < 0.1) this.velocity = 0; } this.velocity = Math.clamp(this.velocity, -4, 10); if (!this.on_track) { this.y_velocity = Math.clamp(this.y_velocity - 0.2, -4, 4); } let movement = new THREE.Vector3(0, -this.y_velocity, -this.velocity); this.steer_direction = this.steer_direction + this.steering_angle * Math.min(this.velocity, 1.4) * 0.02; movement.applyAxisAngle(this.turn_axis, -this.steer_direction + 0); this.scene.rotation.y = Math.lerp(this.scene.rotation.y, this.steer_direction, 0.1); Project.model_3d.rotation.y = this.rotation_adjustment + this.scene.rotation.y - this.steer_direction; this.world.position.add(movement); if (this.front_right_wheel) this.front_right_wheel.rotation.y = this.steering_angle * -0.5; if (this.front_left_wheel) this.front_left_wheel.rotation.y = this.steering_angle * -0.5; let closest_waypoint = this.getClosestWaypoint(); if (closest_waypoint) { let segments_regenerated = false; while (closest_waypoint.index > this.track_length_back) { this.generatePathStep(); segments_regenerated = true; closest_waypoint.index--; } if (segments_regenerated) this.updateGeometry(); } else if (this.on_track) { // Fall off this.fall(); } this.coins.forEach(coin => { coin.rotation.y += 0.01; coin.position.y = 10 + Math.sin(this.ticks * 0.1) * 0.8; let offset = Reusable.vec2.set(0, 0, 0); coin.localToWorld(offset); let distance = offset.length(); if (distance && distance < 34) { this.collectCoin(coin); } }); Blockbench.setStatusBarText(`Score: ${separateThousands(this.score)}`); this.ticks++; } fall() { this.on_track = false; let previous_highscore = localStorage.getItem('rainbow_game.highscore') || 0; RainbowRace.last_score = this.score; if (this.score > previous_highscore) { Blockbench.showQuickMessage(`New Highscore: ${separateThousands(this.score)}`); localStorage.setItem('rainbow_game.highscore', this.score); } else { Blockbench.showQuickMessage(`Score: ${separateThousands(this.score)}`); } this.timeout = setTimeout(() => { this.stop(); }, 1000) } createCoin(position) { let coin = new THREE.Mesh(this.coin_geometry, this.coin_material); let coin_glow = new THREE.Mesh(this.coin_geometry2, this.coin_material2); coin.add(coin_glow); coin.position.copy(position); coin.position.y = 10; coin.scale.y = 1.4; this.world.add(coin); this.coins.push(coin); if (this.coins.length > 40) { this.world.remove(this.coins.shift()); } } collectCoin(coin) { this.score += 5; setTimeout(() => { this.coins.remove(coin); }, 40); let interval = setInterval(() => { coin.position.y *= 1.1; coin.scale.multiplyScalar(0.95); }, 16) setTimeout(() => { clearInterval(interval); this.coins.remove(coin); this.world.remove(coin); }, 150); } generatePathStep() { this.track.rotation.y += this.path[0]; let offset = new THREE.Vector3(0, 0, -this.step * this.track.scale.x); offset.applyAxisAngle(this.turn_axis, this.track.rotation.y); //offset.x *= this.track.scale.x; //offset.z *= this.track.scale.x; this.track.position.sub(offset); if (Math.random() < 1/24) { // Coin let waypoint = this.waypoints[this.collision_length - 2]; let position = Reusable.vec1.copy(waypoint.position); position.applyMatrix4(this.track.matrix); this.createCoin(position); } this.path.shift(); this.addPathPoint(); this.score++; } getClosestWaypoint() { let position = new THREE.Vector3(); this.track.worldToLocal(position); let distance = new THREE.Vector3(); let waypoints_in_reach = this.waypoints.filter((waypoint, index) => { waypoint.index = index; waypoint.distance = distance.copy(position).sub(waypoint.position).length(); return waypoint.distance <= (this.track_width + 2); }); waypoints_in_reach.sort((a, b) => a.distance - b.distance); return waypoints_in_reach[0]; } updateGeometry() { let segment_width = 2; let angle = 0; let trailhead = new THREE.Vector3(0, 0, 0); let offset1 = new THREE.Vector3(0, 0, 0); let offset2 = new THREE.Vector3(0, 0, 0); let offset3 = new THREE.Vector3(0, 0, 0); let offset4 = new THREE.Vector3(0, 0, 0); let quad_index = 0; let indices = []; let positions = []; this.waypoints.empty(); let i = 0; for (let curvature of this.path) { let old_angle = angle; angle += curvature; if (i < this.collision_length) { this.waypoints.push({position: new THREE.Vector3().copy(trailhead)}); } for (let x = -3; x < 3; x++) { offset1.set(x * segment_width, 0, 0) offset1.applyAxisAngle(this.turn_axis, old_angle); offset1.add(trailhead); positions.push(offset1.x, offset1.y, offset1.z); offset2.set((x+1) * segment_width, 0, 0) offset2.applyAxisAngle(this.turn_axis, old_angle); offset2.add(trailhead); positions.push(offset2.x, offset2.y, offset2.z); offset3.set(x * segment_width, 0, this.step); offset3.applyAxisAngle(this.turn_axis, angle); offset3.add(trailhead); positions.push(offset3.x, offset3.y, offset3.z); offset4.set((x+1) * segment_width, 0, this.step); offset4.applyAxisAngle(this.turn_axis, angle); offset4.add(trailhead); positions.push(offset4.x, offset4.y, offset4.z); indices.push(quad_index*4 + 0, quad_index*4 + 3, quad_index*4 + 1, quad_index*4 + 0, quad_index*4 + 2, quad_index*4 + 3); quad_index++; } offset1.set(0, -0.005, this.step); offset1.applyAxisAngle(this.turn_axis, angle); trailhead.add(offset1); i++; } this.geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) ); this.geometry.setIndex(indices); } addPathPoint(straight) { let last_point = this.path.last() || 0; let influence = straight ? 0 : Math.pow(Math.randomab(-1, 1), 3) * 0.5; this.path.push(Math.lerp(last_point, influence, 0.075)); } } RainbowRace.start = () => { if (!RainbowRace.current_race) { RainbowRace.current_race = new RainbowRace(); } RainbowRace.current_race.start(); } RainbowRace.stop = () => { RainbowRace.current_race.stop(); } let css, controls, highscore_action; Plugin.register('rainbow_road_game', { title: "Rainbow Road Game", author: "JannisX11", icon: "icon.png", description: "The rainbow road racing minigame from April fools day 2024! Turn your model into a race car and take it for a spin!", tags: ["Minigame"], version: "0.1.1", min_version: "4.8.0", variant: "both", creation_date: "2024-04-1", onload() { let buttons = [ Interface.createElement('div', {}, Blockbench.getIconNode('play_arrow')), Interface.createElement('div', {}, Blockbench.getIconNode('pause')), ]; controls = Interface.createElement('div', {id: 'rainbow_game_controls'}, buttons); Interface.preview.append(controls); buttons[0].onclick = RainbowRace.start; buttons[1].onclick = RainbowRace.stop; let css = Blockbench.addCSS(` #rainbow_game_controls { width: 64px; height: 30px; margin: auto; left: 0; right: 0; top: 1px; background-color: var(--color-ui); display: flex; position: absolute; z-index: 10; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; } #rainbow_game_controls > div { height: 100%; cursor: pointer; padding: 4px; text-align: center; } #rainbow_game_controls > div:hover { color: var(--color-light); } `); highscore_action = new Action('rainbow_road_highscore', { name: 'View Rainbow Road Game Highscore', icon: 'looks', click() { Blockbench.showMessageBox({ title: 'Rainbow Road Game', message: `Last score: ${separateThousands(RainbowRace.last_score || 0)}\n\nHighscore: ${separateThousands(localStorage.getItem('rainbow_game.highscore') || 0)}` }) } }) }, onunload() { controls.remove(); css.delete(); highscore_action.delete(); } }); })() ================================================ FILE: plugins/reexport_on_save/LICENSE.MD ================================================ MIT License 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. ================================================ FILE: plugins/reexport_on_save/about.md ================================================ This plugin adds a toggle to automatically re-export when saving a project. The export settings can be customized per project. Other plugins that add new exporting codecs should work with this out of the box. ================================================ FILE: plugins/reexport_on_save/members.yml ================================================ maintainers: - mr0x13f developers: - mr0x13f ================================================ FILE: plugins/reexport_on_save/reexport_on_save.js ================================================ (function() { const windows = Blockbench.operating_system === 'Windows'; // Fix for Properties of type 'object' not getting read properly on project load // Thanks SnaveSutit! class DeepClonedObjectProperty extends Property { constructor(targetClass, name, options) { super(targetClass, 'object', name, options) } merge(instance, data) { if (data[this.name] == undefined) { instance[this.name] = undefined; } else if (typeof data[this.name] === 'object') { instance[this.name] = JSON.parse(JSON.stringify(data[this.name])); (JSON.stringify(instance[this.name])); // Empty object gets replaced with undefined if (Object.keys(instance[this.name]).length === 0) instance[this.name] = undefined; } } copy(instance, target) { if (instance[this.name] == undefined) { target[this.name] = undefined; } else if (typeof instance[this.name] === 'object') { target[this.name] = JSON.parse(JSON.stringify(instance[this.name])); // Empty object gets replaced with undefined if (Object.keys(target[this.name]).length === 0) target[this.name] = undefined; } } } let deferred = []; let isCurrentlyReexporting = false; let anotherReexportQueued = false; // MARK: 🟥 plugin Plugin.register('reexport_on_save', { title: 'Re-export on Save', author: '0x13F', description: 'Automatically re-export your project when saving', icon: 'output', creation_date: '2025-04-18', version: '2.0.0', variant: 'desktop', min_version: '4.12.4', has_changelog: false, tags: [ 'Exporter', 'Utility' ], repository: 'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/reexport_on_save', onload() { // Property to store re-export settings in project file let reexportSettingsProperty = deferDelete(new DeepClonedObjectProperty(ModelProject, 'reexport', { exposed: false, default: undefined, })); // Re-export settings action (for Action Control [F1]) let reexportSettingsAction = deferDelete(new Action('reexport_settings', { name: 'Re-export on Save...', icon: 'output', click() { reexportSettingsDialog.show(); }, })); // MARK: 🟩 dialog // Re-export settings dialog let reexportSettingsDialog = deferDelete(new Dialog('reexport_settings_dialog', { title: 'Re-export on Save', // Note that this form gets massively altered by buildReexportDialog() form: { ['info']: { type: 'info', text: 'Automatically re-export when saving this project.', }, ['enabled']: { type: 'checkbox', label: 'Enabled (for this project)', value: true, }, ['codec_seperator']: '_', // This will get replaced with a div later ['codec_options_dummy']: { type: 'info', text: '', }, ['path_seperator']: '_', ['path']: { type: 'text', label: 'Export location', value: '', extensions: [ 'blend' ], }, ['relative']: { type: 'checkbox', label: 'Relative to project', value: true, }, }, onOpen() { buildReexportDialog(this); }, onConfirm(result) { Project.reexport ??= {}; // Save re-export codec settings let codecResult = this.codecForm.getResult(); Project.reexport.codec = codecResult.codec; // Remove 'codec_' prefix from codec options Project.reexport.codec_options = Object.keys(codecResult) .filter(k => k !== 'codec') .map(k => [k.slice('codec_'.length), codecResult[k]]) .reduce(toMap, {}); // Store re-export codec settings in Project.export_options Project.export_options[Project.reexport.codec] = {...Project.reexport.codec_options}; // Scream at the user if the path is bad if (!isReexportPathValid(result.path)) { Blockbench.showMessageBox({ title: 'Re-export on Save', message: 'Chosen export path is not valid, please enter a different path.', icon: 'error', }, () => BarItems['reexport_settings'].trigger()); return; } // Now that we know the path is ok, store it and the new enabled state Project.reexport.path = result.path; setReexportEnabled(result.enabled); }, })); // MARK: 🟩 toggle // Re-export enabled toggle in the file menu // If re-export settings are not set, will instead open the dialog // Icon will be kept up-to-date with the enabled state let reexportEnabledToggle = { id: 'reexport_toggle', name: 'Re-export on Save', icon: 'check_box_outline_blank', searchable: false, condition: () => Project, click() { // If re-export is not set up then show dialog if (Project.reexport == undefined) { reexportSettingsDialog.show(); // Otherwise toggle enabled } else { setReexportEnabled(!Project.reexport.enabled); } }, children: [ // File -> [x] Re-export on save [...] -> Options... { name: 'menu.options', icon: 'web_asset', click() { BarItems['reexport_settings'].trigger(); }, }, ], }; // Position the toggle in the File menu right after the Export dropdown let exportDropdownIndex = MenuBar.menus.file.structure.findIndex(item => item.id === 'export'); let reexportEnabledToggleIndex = exportDropdownIndex + 1; MenuBar.menus.file.structure.splice(reexportEnabledToggleIndex, 0, reexportEnabledToggle); defer(() => MenuBar.menus.file.structure.splice(MenuBar.menus.file.structure.indexOf(reexportEnabledToggle), 1)); // Set initial state for checkbox toggle // Would only matter if plugins got reloaded while a file is open with re-export already enabled updateReexportEnabledCheckbox(); // Same for status bar updateStatusBar(); // MARK: 🟩 listeners // Update toggle and status when switching projects deferDelete(Blockbench.addListener('select_project', () => { updateReexportEnabledCheckbox(); updateStatusBar(); })); // Open listener deferDelete(Blockbench.addListener('load_project', onProjectOpen)); deferDelete(Blockbench.addListener('setup_project', onProjectOpen)); // Save listener deferDelete(Blockbench.addListener('save_project', e => { // Not an actual manual save if (e.model.meta.backup) return; // Re-export not set up or disabled if (!Project.reexport?.enabled) return; reexport(); })); }, onunload() { for (let lambda of deferred) lambda(); }, }); // MARK: 🟥 re-export // Make the actual re-export happen // We avoid using the codec's export() method, as it triggers dialogs and such // Instead we use the codec's compile() and write() methods // If a re-exporting process is already being done right now, queue up another one async function reexport() { if (isCurrentlyReexporting) { anotherReexportQueued = true; return; } let startTime = new Date(); isCurrentlyReexporting = true; updateStatusBar(); let exportPath = exportPathToAbsolute(Project.reexport.path); // Failed to resolve export path if (!PathModule.isAbsolute(exportPath)) { isCurrentlyReexporting = false; showReexportFailed('the export path is relative but this project has no save path'); return; } // Invalid export path if (!isReexportPathValid(exportPath)) { isCurrentlyReexporting = false; showReexportFailed('the export path is not valid'); return; } let exportFilename = PathModule.basename(exportPath); let codec = Codecs[Project.reexport.codec]; let codecOptions = Project.reexport.codec_options; // Bad codec if (codec == undefined || codec.export_action?.conditionMet() === false) { isCurrentlyReexporting = false; showReexportFailed(`"${Project.reexport.codec}" is not a valid export codec for this project`); return; } // Compile let content = await tryCatchAwait(() => codec.compile(codecOptions)); if (content instanceof Error) { isCurrentlyReexporting = false; showReexportFailed(content); return; } else if (content == undefined) { isCurrentlyReexporting = false; showReexportFailed(); return; } // Write let writeResult = await tryCatchAwait(() => codec.write(content, exportPath)); if (writeResult instanceof Error) { isCurrentlyReexporting = false; showReexportFailed(content); return; } // TODO: Maybe we could check here that the output file exists // maybe whether the last write time has been updated // but since we can't assume codec.write() will let us know when it's done, // it would be tricky to determine. // If someone actually runs into this we could look at it // Success :) isCurrentlyReexporting = false; updateStatusBar(`Re-exported as ${exportFilename}`, 'check', 5000); // Show the quick message at least 1 second after saving, // to allow for the saving message to disappear let endTime = new Date(); let durationMs = endTime - startTime; setTimeout(() => { Blockbench.showQuickMessage(`Re-exported as ${exportFilename}`, 1000) }, 1000 - durationMs); // If another re-export was queued, start it now if (anotherReexportQueued) { anotherReexportQueued = false; reexport(); } } function showReexportFailed(reason) { updateStatusBar('Re-exporting failed', 'error', 5000); let reasonText = reason == undefined ? '' : reason instanceof Error ? ` because: "${reason}"` : ` because ${reason}`; Blockbench.showToastNotification({ text: `Re-exporting failed${reasonText}. Please adjust your re-export settings.`, icon: 'error', color: 'red', click: () => BarItems['reexport_settings'].trigger(), }); } // MARK: 🟥 build dialog // Make hacky changes to the re-export dialog // Called when the dialog is opened, and when the codec is changed. // Form(s) get auto-filled with the saved re-export settings and/or previously used export settings. // The codec selection and options are in a seperate form, inserted in a div inside the dialog form. // Codec form is accessible later with dialog.codecForm // The export path picker is a textbox with a browse button inserted into it. function buildReexportDialog(dialog, justChangedCodecTo) { // Fill values from settings if they're already set if (Project.reexport != undefined && justChangedCodecTo == undefined) { dialog.setFormValues({ ...Project.reexport, // Also set the relative checkbox relative: !PathModule.isAbsolute(Project.reexport?.path ?? ''), }); } // MARK: 🟩 codec form // Make sure we have a div to work with let codecOptionsDiv = dialog.object.querySelector('#reexport_dialog_codec_options'); if (codecOptionsDiv != undefined) { // Dialog has been build before, just clear the div codecOptionsDiv.innerHTML = ''; } else { // Fresh dialog, replace the dummy with a div let codecOptionsDummy = dialog.object.querySelector('.form_bar_codec_options_dummy'); codecOptionsDiv = Interface.createElement('div', { id: 'reexport_dialog_codec_options' }); dialog.form.node.appendChild(codecOptionsDiv); codecOptionsDummy.after(codecOptionsDiv); codecOptionsDummy.remove(); } // Codec that was just picked... let selectedCodec = justChangedCodecTo // ...or that was saved in re-export settings ?? Project.reexport?.codec // ...or first codec that has export_options saved ?? Object.keys(Codecs) .filter(c => Project.export_options[c] != undefined) [0] // ...otherwise just use GLTF ?? 'gltf'; // List of Codecs let codecsList = Object.values(Codecs) .filter(c => c.export_action?.conditionMet()) // Options shown as model name with extension // For GLTF we manually add .glb as another extension .map(c => [c.id, `${c.name} (.${c.extension}${c.id === 'gltf' ? '/.glb' : ''})`]) .reduce(toMap, {}); // Options for the chosen Codec // Keys get 'codec_' prefix let codecExportOptions = Codecs[selectedCodec].export_options; let codecOptionsList = Object.keys(codecExportOptions) .map(key => ['codec_'+key, codecExportOptions[key]]) .reduce(toMap, {}); // Create inner form for codec and codec options let codecForm = new InputForm({ ['codec']: { label: 'Export as', type: 'select', options: codecsList, value: selectedCodec, }, ...codecOptionsList, }); dialog.codecForm = codecForm; codecOptionsDiv.appendChild(codecForm.node); // Make sure label width for the codec form is the same as the outer form let maxLabelWidth = dialog.form.node.style.getPropertyValue('--max_label_width'); codecForm.node.style.setProperty('--max_label_width', maxLabelWidth); // Codec is currently used in re-export settings, fill values if (selectedCodec === Project.reexport?.codec) { let savedCodecOptions = Object.keys(Project.reexport.codec_options) .map(key => [ 'codec_'+key, Project.reexport.codec_options[key] ]) .reduce(toMap, {}); codecForm.setValues(savedCodecOptions); // Codec was used before in export_options, fill values as defaults } else if (Project.export_options[selectedCodec] != undefined) { let savedCodecOptions = Object.keys(Project.export_options[selectedCodec]) .map(key => [ 'codec_'+key, Project.export_options[selectedCodec][key] ]) .reduce(toMap, {}); codecForm.setValues(savedCodecOptions); } // Remember encoding if the codec is GLTF let gltfEncoding = selectedCodec === 'gltf' ? dialog.codecForm.getResult().codec_encoding : undefined; // Remember whether the path is relative let exportPathIsRelative = dialog.getFormResult().relative; // Inner form change listener // Rebuild dialog when codec is changed // Keep extension up-to-date codecForm.on('change', data => { // If codec is changed, update export path extension let newCodec = data.result.codec; if (newCodec !== selectedCodec) { // Rebuild the whole dialog buildReexportDialog(dialog, newCodec); // Update extension for new codec // Special case for when the new codec is GLTF and the previously saved encoding is GLB let newExtension = Codecs[newCodec].extension; if (newCodec === 'gltf' && dialog.codecForm.getResult().codec_encoding === 'binary') newExtension = 'glb'; changeReexportExtension(dialog, newExtension); // If GLTF encoding is changed, update export path extension } else if (newCodec === 'gltf' && data.result.codec_encoding !== gltfEncoding) { gltfEncoding = data.result.codec_encoding; let extension = gltfEncoding === 'ascii' ? 'gltf' : 'glb'; changeReexportExtension(dialog, extension); } }); // MARK: 🟩 export path // Now that we can know the extension, // if no re-export settings have been set, // and we didn't just change the codec, // then make up an export path if (Project.reexport?.path == undefined && justChangedCodecTo == undefined) { let extension = Codecs[selectedCodec].extension; if (gltfEncoding === 'binary') extension = 'glb'; let projectName = Project.name || 'model'; let exportPath = '.' + PathModule.sep + projectName + '.' + extension; dialog.setFormValues({ path: exportPath }); } // Add browse button to path input, if we haven't already let browseButton = dialog.form.node.querySelector('.form_bar_path>.input_wrapper>i.material-icons'); if (browseButton == undefined) { let pathDiv = dialog.form.node.querySelector('.form_bar_path'); pathDiv.classList.add('form_bar_file'); let pathInput = pathDiv.querySelector('input'); browseButton = Blockbench.getIconNode('insert_drive_file', { style: { cursor: 'pointer' } }); let inputWrapper = Interface.createElement('div', {class: 'input_wrapper'}, [ pathInput, browseButton, ]); pathDiv.append(inputWrapper); // File picker dialog with correct extension browseButton.onclick = async () => { let oldPath = dialog.getFormResult().path; let parentDir = PathModule.dirname((Project.save_path || Project.export_path) ?? ''); let startPath = PathModule.resolve(parentDir, oldPath); let selectedCodec = dialog.codecForm.getResult().codec; let gltfEncoding = selectedCodec === 'gltf' ? dialog.codecForm.getResult().codec_encoding : undefined; let extension = Codecs[selectedCodec].extension; if (gltfEncoding === 'binary') extension = 'glb'; // Replace invalid path with just the name of the project if (isReexportPathValid(oldPath, extension)) startPath = Project.name || 'model'; let chosenPath = await pickExportPath(startPath, Codecs[selectedCodec].name, [extension]); dialog.setFormValues({ path: chosenPath }); makeReexportPathRelative(dialog, exportPathIsRelative); } // Relative path toggle // Also only if we hadn't already added the browse button dialog.form.on('change', data => { // If relative checkbox got toggled, update export path if (data.result.relative !== exportPathIsRelative) { exportPathIsRelative = data.result.relative; makeReexportPathRelative(dialog, data.result.relative); } }); } } // MARK: 🟥 status bar // Update the text in the status bar // We make our own status bar element to play with // This function can be called with text and an icon to display a message, // or without parameters to show whatever the current status is function updateStatusBar(statusText, icon, expire) { let reexportStatusNode = document.querySelector('#reexport_status'); if (reexportStatusNode == undefined) { let statusBarNode = document.querySelector('#status_bar'); let statusMessageNode = statusBarNode.querySelector('#status_message'); reexportStatusNode = Interface.createElement('div', { id: 'reexport_status', style: 'flex-grow: 1; cursor: pointer;', }, [ Blockbench.getIconNode('output'), Interface.createElement('span', { id: 'reexport_status_text', style: 'padding-left: 6px; padding-right: 6px; vertical-align: top;', }), ]); statusBarNode.appendChild(reexportStatusNode); statusMessageNode.after(reexportStatusNode); reexportStatusNode.onclick = () => BarItems['reexport_settings'].trigger(); // Make the fps counter stop growing let fpsCounterNode = statusBarNode.querySelector('div.f_right'); fpsCounterNode.style.width = '100px'; fpsCounterNode.style.textAlign = 'right'; } let reexportStatusIconNode = reexportStatusNode.querySelector('.icon'); let reexportStatusTextNode = reexportStatusNode.querySelector('#reexport_status_text'); reexportStatusIconNode.classList.remove('spinning'); // No status text provided, decide what it should be if (statusText == undefined) { if (isCurrentlyReexporting) { icon = 'autorenew'; statusText = 'Re-exporting...'; reexportStatusIconNode.classList.add('spinning'); } else if (Project.reexport?.enabled) { icon = null; statusText = 'Re-export on Save enabled'; } } // Hide if we have absolutely nothing to display reexportStatusNode.style.display = statusText == undefined ? 'none' : 'block'; reexportStatusTextNode.textContent = statusText; reexportStatusIconNode.textContent = icon; if (expire != undefined) setTimeout(updateStatusBar, expire); } // MARK: 🟥 util function exportPathToAbsolute(exportPath) { return PathModule.resolve(PathModule.dirname(Project.save_path), PathModule.dirname(Project.export_path), exportPath); } function isReexportPathValid(exportPath, expectedExtension = undefined) { let absoluteExportPath = exportPathToAbsolute(exportPath); let filename = PathModule.basename(exportPath); let extensionWithPeriod = PathModule.extname(filename); let isInvalid = false; // Re-export path should not be the same as the project itself // Note how export_path is actually the save path when editing a model that isn't saved as .bbmodel // But it still means it will get saved there when pressing Ctrl+S isInvalid ||= absoluteExportPath === Project.save_path || absoluteExportPath === Project.export_path; // No extension, very likely a bad filename // If the user does intend to actually save as something without a filename, // then they're weird isInvalid ||= extensionWithPeriod === '' || extensionWithPeriod === '.'; if (expectedExtension == undefined) { expectedExtension = Codecs[Project.reexport.codec].extension; if (Project.reexport.codec === 'gltf' && Project.reexport.codec_options.encoding === 'binary') expectedExtension = 'glb'; } // Extension doesn't match what's expected from the codec // This is a lot more likely to be intentional than no extension // But still a lot less likely than being an accident // Maybe we should remove this check in future? isInvalid ||= extensionWithPeriod.slice(1) !== expectedExtension; // null bytes invalid on all OSes isInvalid ||= exportPath.includes('\0'); // Windows specific... if (windows) { // Invalid path char isInvalid ||= ['<','>','"','|','?','*'].some(char => absoluteExportPath.includes(char)); // Invalid filename char isInvalid ||= filename.includes(':'); // Invalid name isInvalid ||= ['CON'|'PRN'|'AUX'|'NUL'].some(name => filename.toUpperCase() === name); // COM0-9 or LTP0-9 isInvalid ||= /^(COM\d|LTP\d)$/i.test(filename); // Start or end with space isInvalid ||= filename.startsWith(' ') || filename.endsWith(' '); // End with period isInvalid ||= filename.endsWith('.'); // Only spaces and periods isInvalid ||= [...filename].every(c => c === '.' || c === ' '); } return !isInvalid; } // When the user changes the re-export codec or GLTF encoding, // we update the export path extension function changeReexportExtension(dialog, newExtension) { let oldPath = dialog.getFormResult().path; let baseNameWithoutExt = PathModule.basename(oldPath, PathModule.extname(oldPath)); // Replace empty filename or filename startings with periods, because they're probably invalid if (baseNameWithoutExt === '' || baseNameWithoutExt.startsWith('.')) baseNameWithoutExt = Project.name || 'model'; let pathWithoutExtension = PathModule.dirname(oldPath) + PathModule.sep + baseNameWithoutExt; let newPath = pathWithoutExtension + '.' + newExtension; dialog.setFormValues({ path: newPath, }); } // When the user toggles the relative path checkbox in the re-export dialog, // we edit the export path to match the new value function makeReexportPathRelative(dialog, makeRelative) { let oldPath = dialog.getFormResult().path; let newPath = undefined; let parentDir = PathModule.dirname((Project.save_path || Project.export_path) ?? ''); // If we don't know the parent dir of the project, // there's no point even trying to do anything if (parentDir === '' || parentDir === '.') return; if (makeRelative && PathModule.isAbsolute(oldPath)) { newPath = '.' + PathModule.sep + PathModule.relative(parentDir, oldPath); } else if (!makeRelative) { // make absolute newPath = PathModule.resolve(parentDir, oldPath); } dialog.setFormValues({ path: newPath }); } // Changes the enabled setting and notifies the user function setReexportEnabled(enabled) { let oldEnabled = Project.reexport.enabled; Project.reexport.enabled = enabled; updateReexportEnabledCheckbox(); updateStatusBar(); if (oldEnabled !== enabled) { if (enabled) { Blockbench.showToastNotification({ text: 'Your project will now be automatically re-exported when you save.', icon: 'info', expire: 5000, }); } else { Blockbench.showQuickMessage('Re-export on Save disabled'); } } } // Make sure the toggle icon in the file menu matches the enabled setting function updateReexportEnabledCheckbox() { let toggle = MenuBar.menus.file.structure.find(i => i.id === 'reexport_toggle'); if (toggle != undefined) toggle.icon = Project.reexport?.enabled ? 'check_box' : 'check_box_outline_blank'; } // Callback for when a project is loaded, or imported function onProjectOpen(e) { // This gets called twice for some reason, we ignore the second time when e is not undefined if (e != undefined) return; // Wait for properties to be loaded setTimeout(() => { // If the re-export settings is an empty object, replace it with undefined if (Project.reexport != undefined && Object.keys(Project.reexport).length === 0) Project.reexport = undefined; // Update toggle checkbox state and status bar updateReexportEnabledCheckbox(); updateStatusBar(); if (Project.reexport?.enabled) { Blockbench.showToastNotification({ text: 'This project is set up to automatically re-export when you save.', icon: 'info', expire: 5000, click: () => BarItems['reexport_settings'].trigger(), }); } }, 0); } // Export dialog that doesn't save anything function pickExportPath(startPath, name, extensions) { return new Promise((resolve, reject) => { Blockbench.export({ type: name, startpath: startPath, extensions: extensions, custom_writer: (content, exportPath) => resolve(exportPath), }); }); } function defer(lambda) { deferred.push(lambda); } function deferDelete(deletable) { if (deletable.delete == undefined) { console.warn('deferDelete() called with object that isn\'t deletable: ', deletable); return; } defer(() => deletable.delete()); return deletable; } function toMap(acc, entry) { return { ...acc, [entry[0]]: entry[1] }; } async function tryCatchAwait(lambda) { try { return await lambda(); } catch (e) { return e; } } })(); ================================================ FILE: plugins/reference_models/reference_models.js ================================================ /// (function() { let add_action, change_model_action; Plugin.register('reference_models', { title: 'Reference Models', icon: 'fas.fa-monument', author: 'JannisX11', description: 'Load and view glTF/glb models or other project tabs as references in Blockbench', version: '1.1.0', min_version: '5.0.0', variant: 'desktop', onload() { class ReferenceModel extends OutlinerElement { constructor(data, uuid) { super(data, uuid) for (var key in ReferenceModel.properties) { ReferenceModel.properties[key].reset(this); } if (data && typeof data === 'object') { this.extend(data) } } getWorldCenter() { return THREE.fastWorldPosition(this.mesh, Reusable.vec2); } extend(object) { for (var key in ReferenceModel.properties) { ReferenceModel.properties[key].merge(this, object) } if (typeof object.vertices == 'object') { for (let key in object.vertices) { this.vertices[key] = object.vertices[key].slice(); } } this.sanitizeName(); return this; } getUndoCopy() { var copy = new ReferenceModel(this) copy.uuid = this.uuid; delete copy.parent; return copy; } getSaveCopy() { var el = {} for (var key in ReferenceModel.properties) { ReferenceModel.properties[key].copy(this, el) } el.type = 'reference_model'; el.uuid = this.uuid return el; } static behavior = { movable: true, rotatable: true, scalable: true } } ReferenceModel.prototype.title = tl('data.reference_model'); ReferenceModel.prototype.type = 'reference_model'; ReferenceModel.prototype.icon = 'fas fa-monument'; ReferenceModel.prototype.needsUniqueName = false; ReferenceModel.prototype.menu = new Menu([ 'change_reference_model_file', '_', 'group_elements', 'copy', 'paste', 'duplicate', '_', 'rename', 'toggle_visibility', 'delete' ]); ReferenceModel.prototype.buttons = [ Outliner.buttons.export, Outliner.buttons.locked, Outliner.buttons.visibility, ]; new Property(ReferenceModel, 'string', 'name', {default: 'reference_model'}) new Property(ReferenceModel, 'string', 'path') new Property(ReferenceModel, 'string', 'project') new Property(ReferenceModel, 'vector', 'origin'); new Property(ReferenceModel, 'vector', 'rotation'); new Property(ReferenceModel, 'vector', 'scale', {default: [1, 1, 1]}); new Property(ReferenceModel, 'boolean', 'visibility', {default: true}); new Property(ReferenceModel, 'boolean', 'wireframe', { default: false, inputs: { element_panel: { input: {label: 'Wireframe', type: 'checkbox'}, onChange() { updateSelection(); } } } }); OutlinerElement.registerType(ReferenceModel, 'reference_model'); function loadReferenceModel(element, path) { const loader = new THREE.GLTFLoader(); loader.setPath(PathModule.dirname(path) + PathModule.sep); loader.load(PathModule.basename(path), gltf => { if (element.mesh.children[0]) element.mesh.remove(element.mesh.children[0]); element.mesh.add(gltf.scene); let base_size = Format.block_size; gltf.scene.scale.set(base_size, base_size, base_size); element.preview_controller.updateTransform(element); }) } function loadProjectAsRefModel(ref_model) { let project = ModelProject.all.find(p => p.uuid == ref_model.project); if (!project) return; if (ref_model.mesh.children[0]) ref_model.mesh.remove(ref_model.mesh.children[0]); ref_model.mesh.add(project.model_3d); ref_model.preview_controller.updateTransform(ref_model); } function selectReferenceSource(ref_model) { let project_options = {}; for (let project of ModelProject.all) { if (project == Project) continue; project_options[project.uuid] = project.name; } new Dialog({ id: 'reference_model_settings', form: { type: {type: "inline_select", options: { file: '3D File', project: 'Project tab' }, value: ref_model.project ? 'project' : 'file'}, file: { label: '3D File', type: 'file', extensions: ['gltf', 'glb'], readtype: file => (pathToExtension(file.path) == 'glb' ? 'binary' : 'text'), file_type: '3D Model', value: ref_model.path, condition: (result) => result.type == 'file', }, project: { type: 'select', label: 'Project', value: ref_model.project, options: project_options, condition: (result) => result.type == 'project', } }, onConfirm(result) { Undo.initEdit({elements: [ref_model]}); console.log(result) if (result.type == 'file') { ref_model.path = result.file; loadReferenceModel(ref_model, result.file); ref_model.name = pathToName(result.file, true); } else { ref_model.project = result.project; ref_model.name = ModelProject.all.find(p => p.uuid == result.project)?.getDisplayName() ?? 'Project'; loadProjectAsRefModel(ref_model); } Undo.finishEdit('Change reference model source'); } }).show(); } Blockbench.on('select_project', () => { ReferenceModel.all.forEach(ref_model => { if (ref_model.project) { loadProjectAsRefModel(ref_model); } }) }) new NodePreviewController(ReferenceModel, { setup(element) { var mesh = new THREE.Object3D(); Project.nodes_3d[element.uuid] = mesh; mesh.name = element.uuid; mesh.type = element.type; mesh.isElement = true; console.log(mesh, element.path) if (element.path) { loadReferenceModel(element, element.path) } else if (element.project) { loadProjectAsRefModel(element); } // Update this.updateTransform(element); mesh.visible = element.visibility; }, updateSelection(element) { let w = element.wireframe; element.mesh.traverse(object => { if (object.material && 'wireframe' in object.material) { object.material.wireframe = w; } }) } }) add_action = new Action('add_reference_model', { name: 'Add Reference Model', icon: 'fas.fa-monument', category: 'edit', condition: () => Modes.edit || Modes.paint, click: function () { Undo.initEdit({outliner: true, elements: [], selection: true}); var base_reference_model = new ReferenceModel({export: false}).init() var group = getCurrentGroup(); base_reference_model.addTo(group) if (Format.bone_rig) { if (group) { var pos1 = group.origin.slice() base_reference_model.extend({ origin: pos1.slice() }) } } base_reference_model.select() Blockbench.dispatchEvent( 'add_reference_model', {object: base_reference_model} ) selectReferenceSource(base_reference_model); Undo.finishEdit('Add reference model', {outliner: true, elements: [base_reference_model], selection: true}); /*Blockbench.import({ type: 'glTF Model', extensions: ['gltf', 'glb'], readtype: file => (pathToExtension(file.path) == 'glb' ? 'binary' : 'text') }, files => { let path = files[0].path; base_reference_model.path = path; base_reference_model.name = pathToName(path, false); Undo.finishEdit('Add reference model', {outliner: true, elements: selected, selection: true}); loadReferenceModel(base_reference_model, path); })*/ return base_reference_model } }) change_model_action = new Action('change_reference_model_file', { name: 'Change Reference Model', icon: 'fas.fa-monument', category: 'edit', condition: () => (Modes.edit || Modes.paint) && ReferenceModel.selected[0], click: function () { let ref_models = ReferenceModel.selected; selectReferenceSource(ref_models[0]); } }) Interface.Panels.outliner.menu.addAction(add_action, '3') MenuBar.menus.edit.addAction(add_action, '6') }, onunload() { add_action.delete() change_model_action.delete() } }); // ========================================================================= /* Three.js glTF Model Loader https://github.com/mrdoob/three.js Copyright © 2010-2021 three.js authors 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. */ ( function () { class GLTFLoader extends THREE.Loader { constructor( manager ) { super( manager ); this.dracoLoader = null; this.ktx2Loader = null; this.meshoptDecoder = null; this.pluginCallbacks = []; this.register( function ( parser ) { return new GLTFMaterialsClearcoatExtension( parser ); } ); this.register( function ( parser ) { return new GLTFTextureBasisUExtension( parser ); } ); this.register( function ( parser ) { return new GLTFTextureWebPExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsTransmissionExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsVolumeExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsIorExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMaterialsSpecularExtension( parser ); } ); this.register( function ( parser ) { return new GLTFLightsExtension( parser ); } ); this.register( function ( parser ) { return new GLTFMeshoptCompression( parser ); } ); } load( url, onLoad, onProgress, onError ) { const scope = this; let resourcePath; if ( this.resourcePath !== '' ) { resourcePath = this.resourcePath; } else if ( this.path !== '' ) { resourcePath = this.path; } else { resourcePath = THREE.LoaderUtils.extractUrlBase( url ); } // Tells the LoadingManager to track an extra item, which resolves after // the model is fully loaded. This means the count of items loaded will // be incorrect, but ensures manager.onLoad() does not fire early. this.manager.itemStart( url ); const _onError = function ( e ) { if ( onError ) { onError( e ); } else { console.error( e ); } scope.manager.itemError( url ); scope.manager.itemEnd( url ); }; const loader = new THREE.FileLoader( this.manager ); loader.setPath( this.path ); loader.setResponseType( 'arraybuffer' ); loader.setRequestHeader( this.requestHeader ); loader.setWithCredentials( this.withCredentials ); loader.load( url, function ( data ) { try { scope.parse( data, resourcePath, function ( gltf ) { onLoad( gltf ); scope.manager.itemEnd( url ); }, _onError ); } catch ( e ) { _onError( e ); } }, onProgress, _onError ); } setDRACOLoader( dracoLoader ) { this.dracoLoader = dracoLoader; return this; } setDDSLoader() { throw new Error( 'THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".' ); } setKTX2Loader( ktx2Loader ) { this.ktx2Loader = ktx2Loader; return this; } setMeshoptDecoder( meshoptDecoder ) { this.meshoptDecoder = meshoptDecoder; return this; } register( callback ) { if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) { this.pluginCallbacks.push( callback ); } return this; } unregister( callback ) { if ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) { this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); } return this; } parse( data, path, onLoad, onError ) { let content; const extensions = {}; const plugins = {}; if ( typeof data === 'string' ) { content = data; } else { const magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) ); if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { try { extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); } catch ( error ) { if ( onError ) onError( error ); return; } content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content; } else { content = THREE.LoaderUtils.decodeText( new Uint8Array( data ) ); } } const json = JSON.parse( content ); if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); return; } const parser = new GLTFParser( json, { path: path || this.resourcePath || '', crossOrigin: this.crossOrigin, requestHeader: this.requestHeader, manager: this.manager, ktx2Loader: this.ktx2Loader, meshoptDecoder: this.meshoptDecoder } ); parser.fileLoader.setRequestHeader( this.requestHeader ); for ( let i = 0; i < this.pluginCallbacks.length; i ++ ) { const plugin = this.pluginCallbacks[ i ]( parser ); plugins[ plugin.name ] = plugin; // Workaround to avoid determining as unknown extension // in addUnknownExtensionsToUserData(). // Remove this workaround if we move all the existing // extension handlers to plugin system extensions[ plugin.name ] = true; } if ( json.extensionsUsed ) { for ( let i = 0; i < json.extensionsUsed.length; ++ i ) { const extensionName = json.extensionsUsed[ i ]; const extensionsRequired = json.extensionsRequired || []; switch ( extensionName ) { case EXTENSIONS.KHR_MATERIALS_UNLIT: extensions[ extensionName ] = new GLTFMaterialsUnlitExtension(); break; case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: extensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension(); break; case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); break; case EXTENSIONS.KHR_TEXTURE_TRANSFORM: extensions[ extensionName ] = new GLTFTextureTransformExtension(); break; case EXTENSIONS.KHR_MESH_QUANTIZATION: extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); break; default: if ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) { console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); } } } } parser.setExtensions( extensions ); parser.setPlugins( plugins ); parser.parse( onLoad, onError ); } } /* GLTFREGISTRY */ function GLTFRegistry() { let objects = {}; return { get: function ( key ) { return objects[ key ]; }, add: function ( key, object ) { objects[ key ] = object; }, remove: function ( key ) { delete objects[ key ]; }, removeAll: function () { objects = {}; } }; } /*********************************/ /********** EXTENSIONS ***********/ /*********************************/ const EXTENSIONS = { KHR_BINARY_GLTF: 'KHR_binary_glTF', KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat', KHR_MATERIALS_IOR: 'KHR_materials_ior', KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', KHR_MATERIALS_SPECULAR: 'KHR_materials_specular', KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission', KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', KHR_MATERIALS_VOLUME: 'KHR_materials_volume', KHR_TEXTURE_BASISU: 'KHR_texture_basisu', KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', EXT_TEXTURE_WEBP: 'EXT_texture_webp', EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression' }; /** * Punctual Lights Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual */ class GLTFLightsExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; // THREE.Object3D instance caches this.cache = { refs: {}, uses: {} }; } _markDefs() { const parser = this.parser; const nodeDefs = this.parser.json.nodes || []; for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { const nodeDef = nodeDefs[ nodeIndex ]; if ( nodeDef.extensions && nodeDef.extensions[ this.name ] && nodeDef.extensions[ this.name ].light !== undefined ) { parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light ); } } } _loadLight( lightIndex ) { const parser = this.parser; const cacheKey = 'light:' + lightIndex; let dependency = parser.cache.get( cacheKey ); if ( dependency ) return dependency; const json = parser.json; const extensions = json.extensions && json.extensions[ this.name ] || {}; const lightDefs = extensions.lights || []; const lightDef = lightDefs[ lightIndex ]; let lightNode; const color = new THREE.Color( 0xffffff ); if ( lightDef.color !== undefined ) color.fromArray( lightDef.color ); const range = lightDef.range !== undefined ? lightDef.range : 0; switch ( lightDef.type ) { case 'directional': lightNode = new THREE.DirectionalLight( color ); lightNode.target.position.set( 0, 0, - 1 ); lightNode.add( lightNode.target ); break; case 'point': lightNode = new THREE.PointLight( color ); lightNode.distance = range; break; case 'spot': lightNode = new THREE.SpotLight( color ); lightNode.distance = range; // Handle spotlight properties. lightDef.spot = lightDef.spot || {}; lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; lightNode.angle = lightDef.spot.outerConeAngle; lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; lightNode.target.position.set( 0, 0, - 1 ); lightNode.add( lightNode.target ); break; default: throw new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type ); } // Some lights (e.g. spot) default to a position other than the origin. Reset the position // here, because node-level parsing will only override position if explicitly specified. lightNode.position.set( 0, 0, 0 ); lightNode.decay = 2; if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; lightNode.name = parser.createUniqueName( lightDef.name || 'light_' + lightIndex ); dependency = Promise.resolve( lightNode ); parser.cache.add( cacheKey, dependency ); return dependency; } createNodeAttachment( nodeIndex ) { const self = this; const parser = this.parser; const json = parser.json; const nodeDef = json.nodes[ nodeIndex ]; const lightDef = nodeDef.extensions && nodeDef.extensions[ this.name ] || {}; const lightIndex = lightDef.light; if ( lightIndex === undefined ) return null; return this._loadLight( lightIndex ).then( function ( light ) { return parser._getNodeRef( self.cache, lightIndex, light ); } ); } } /** * Unlit Materials Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit */ class GLTFMaterialsUnlitExtension { constructor() { this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; } getMaterialType() { return THREE.MeshBasicMaterial; } extendParams( materialParams, materialDef, parser ) { const pending = []; materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); materialParams.opacity = 1.0; const metallicRoughness = materialDef.pbrMetallicRoughness; if ( metallicRoughness ) { if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { const array = metallicRoughness.baseColorFactor; materialParams.color.fromArray( array ); materialParams.opacity = array[ 3 ]; } if ( metallicRoughness.baseColorTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); } } return Promise.all( pending ); } } /** * Clearcoat Materials Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat */ class GLTFMaterialsClearcoatExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; if ( extension.clearcoatFactor !== undefined ) { materialParams.clearcoat = extension.clearcoatFactor; } if ( extension.clearcoatTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) ); } if ( extension.clearcoatRoughnessFactor !== undefined ) { materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; } if ( extension.clearcoatRoughnessTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) ); } if ( extension.clearcoatNormalTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) ); if ( extension.clearcoatNormalTexture.scale !== undefined ) { const scale = extension.clearcoatNormalTexture.scale; // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 materialParams.clearcoatNormalScale = new THREE.Vector2( scale, - scale ); } } return Promise.all( pending ); } } /** * Transmission Materials Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission * Draft: https://github.com/KhronosGroup/glTF/pull/1698 */ class GLTFMaterialsTransmissionExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; if ( extension.transmissionFactor !== undefined ) { materialParams.transmission = extension.transmissionFactor; } if ( extension.transmissionTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) ); } return Promise.all( pending ); } } /** * Materials Volume Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume */ class GLTFMaterialsVolumeExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; materialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0; if ( extension.thicknessTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) ); } materialParams.attenuationDistance = extension.attenuationDistance || 0; const colorArray = extension.attenuationColor || [ 1, 1, 1 ]; materialParams.attenuationTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] ); return Promise.all( pending ); } } /** * Materials ior Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior */ class GLTFMaterialsIorExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_IOR; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const extension = materialDef.extensions[ this.name ]; materialParams.ior = extension.ior !== undefined ? extension.ior : 1.5; return Promise.resolve(); } } /** * Materials specular Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular */ class GLTFMaterialsSpecularExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; } getMaterialType( materialIndex ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; return THREE.MeshPhysicalMaterial; } extendMaterialParams( materialIndex, materialParams ) { const parser = this.parser; const materialDef = parser.json.materials[ materialIndex ]; if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { return Promise.resolve(); } const pending = []; const extension = materialDef.extensions[ this.name ]; materialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0; if ( extension.specularTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) ); } const colorArray = extension.specularColorFactor || [ 1, 1, 1 ]; materialParams.specularTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] ); if ( extension.specularColorTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'specularTintMap', extension.specularColorTexture ).then( function ( texture ) { texture.encoding = THREE.sRGBEncoding; } ) ); } return Promise.all( pending ); } } /** * BasisU THREE.Texture Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu */ class GLTFTextureBasisUExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.KHR_TEXTURE_BASISU; } loadTexture( textureIndex ) { const parser = this.parser; const json = parser.json; const textureDef = json.textures[ textureIndex ]; if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) { return null; } const extension = textureDef.extensions[ this.name ]; const source = json.images[ extension.source ]; const loader = parser.options.ktx2Loader; if ( ! loader ) { if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' ); } else { // Assumes that the extension is optional and that a fallback texture is present return null; } } return parser.loadTextureImage( textureIndex, source, loader ); } } /** * WebP THREE.Texture Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp */ class GLTFTextureWebPExtension { constructor( parser ) { this.parser = parser; this.name = EXTENSIONS.EXT_TEXTURE_WEBP; this.isSupported = null; } loadTexture( textureIndex ) { const name = this.name; const parser = this.parser; const json = parser.json; const textureDef = json.textures[ textureIndex ]; if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { return null; } const extension = textureDef.extensions[ name ]; const source = json.images[ extension.source ]; let loader = parser.textureLoader; if ( source.uri ) { const handler = parser.options.manager.getHandler( source.uri ); if ( handler !== null ) loader = handler; } return this.detectSupport().then( function ( isSupported ) { if ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader ); if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { throw new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' ); } // Fall back to PNG or JPEG. return parser.loadTexture( textureIndex ); } ); } detectSupport() { if ( ! this.isSupported ) { this.isSupported = new Promise( function ( resolve ) { const image = new Image(); // Lossy test image. Support for lossy images doesn't guarantee support for all // WebP images, unfortunately. image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; image.onload = image.onerror = function () { resolve( image.height === 1 ); }; } ); } return this.isSupported; } } /** * meshopt BufferView Compression Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression */ class GLTFMeshoptCompression { constructor( parser ) { this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; this.parser = parser; } loadBufferView( index ) { const json = this.parser.json; const bufferView = json.bufferViews[ index ]; if ( bufferView.extensions && bufferView.extensions[ this.name ] ) { const extensionDef = bufferView.extensions[ this.name ]; const buffer = this.parser.getDependency( 'buffer', extensionDef.buffer ); const decoder = this.parser.options.meshoptDecoder; if ( ! decoder || ! decoder.supported ) { if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { throw new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' ); } else { // Assumes that the extension is optional and that fallback buffer data is present return null; } } return Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) { const byteOffset = extensionDef.byteOffset || 0; const byteLength = extensionDef.byteLength || 0; const count = extensionDef.count; const stride = extensionDef.byteStride; const result = new ArrayBuffer( count * stride ); const source = new Uint8Array( res[ 0 ], byteOffset, byteLength ); decoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter ); return result; } ); } else { return null; } } } /* BINARY EXTENSION */ const BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; const BINARY_EXTENSION_HEADER_LENGTH = 12; const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; class GLTFBinaryExtension { constructor( data ) { this.name = EXTENSIONS.KHR_BINARY_GLTF; this.content = null; this.body = null; const headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); this.header = { magic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ), version: headerView.getUint32( 4, true ), length: headerView.getUint32( 8, true ) }; if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); } else if ( this.header.version < 2.0 ) { throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); } const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; const chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); let chunkIndex = 0; while ( chunkIndex < chunkContentsLength ) { const chunkLength = chunkView.getUint32( chunkIndex, true ); chunkIndex += 4; const chunkType = chunkView.getUint32( chunkIndex, true ); chunkIndex += 4; if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { const contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); this.content = THREE.LoaderUtils.decodeText( contentArray ); } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; this.body = data.slice( byteOffset, byteOffset + chunkLength ); } // Clients must ignore chunks with unknown types. chunkIndex += chunkLength; } if ( this.content === null ) { throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); } } } /** * DRACO THREE.Mesh Compression Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression */ class GLTFDracoMeshCompressionExtension { constructor( json, dracoLoader ) { if ( ! dracoLoader ) { throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); } this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; this.json = json; this.dracoLoader = dracoLoader; this.dracoLoader.preload(); } decodePrimitive( primitive, parser ) { const json = this.json; const dracoLoader = this.dracoLoader; const bufferViewIndex = primitive.extensions[ this.name ].bufferView; const gltfAttributeMap = primitive.extensions[ this.name ].attributes; const threeAttributeMap = {}; const attributeNormalizedMap = {}; const attributeTypeMap = {}; for ( const attributeName in gltfAttributeMap ) { const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; } for ( const attributeName in primitive.attributes ) { const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); if ( gltfAttributeMap[ attributeName ] !== undefined ) { const accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; const componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; attributeTypeMap[ threeAttributeName ] = componentType; attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; } } return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { return new Promise( function ( resolve ) { dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { for ( const attributeName in geometry.attributes ) { const attribute = geometry.attributes[ attributeName ]; const normalized = attributeNormalizedMap[ attributeName ]; if ( normalized !== undefined ) attribute.normalized = normalized; } resolve( geometry ); }, threeAttributeMap, attributeTypeMap ); } ); } ); } } /** * THREE.Texture Transform Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform */ class GLTFTextureTransformExtension { constructor() { this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; } extendTexture( texture, transform ) { if ( transform.texCoord !== undefined ) { console.warn( 'THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.' ); } if ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) { // See https://github.com/mrdoob/three.js/issues/21819. return texture; } texture = texture.clone(); if ( transform.offset !== undefined ) { texture.offset.fromArray( transform.offset ); } if ( transform.rotation !== undefined ) { texture.rotation = transform.rotation; } if ( transform.scale !== undefined ) { texture.repeat.fromArray( transform.scale ); } texture.needsUpdate = true; return texture; } } /** * Specular-Glossiness Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness */ /** * A sub class of StandardMaterial with some of the functionality * changed via the `onBeforeCompile` callback * @pailhead */ class GLTFMeshStandardSGMaterial extends THREE.MeshStandardMaterial { constructor( params ) { super(); this.isGLTFSpecularGlossinessMaterial = true; //various chunks that need replacing const specularMapParsFragmentChunk = [ '#ifdef USE_SPECULARMAP', ' uniform sampler2D specularMap;', '#endif' ].join( '\n' ); const glossinessMapParsFragmentChunk = [ '#ifdef USE_GLOSSINESSMAP', ' uniform sampler2D glossinessMap;', '#endif' ].join( '\n' ); const specularMapFragmentChunk = [ 'vec3 specularFactor = specular;', '#ifdef USE_SPECULARMAP', ' vec4 texelSpecular = texture2D( specularMap, vUv );', ' texelSpecular = sRGBToLinear( texelSpecular );', ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', ' specularFactor *= texelSpecular.rgb;', '#endif' ].join( '\n' ); const glossinessMapFragmentChunk = [ 'float glossinessFactor = glossiness;', '#ifdef USE_GLOSSINESSMAP', ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', ' glossinessFactor *= texelGlossiness.a;', '#endif' ].join( '\n' ); const lightPhysicalFragmentChunk = [ 'PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', 'material.roughness += geometryRoughness;', 'material.roughness = min( material.roughness, 1.0 );', 'material.specularColor = specularFactor;' ].join( '\n' ); const uniforms = { specular: { value: new THREE.Color().setHex( 0xffffff ) }, glossiness: { value: 1 }, specularMap: { value: null }, glossinessMap: { value: null } }; this._extraUniforms = uniforms; this.onBeforeCompile = function ( shader ) { for ( const uniformName in uniforms ) { shader.uniforms[ uniformName ] = uniforms[ uniformName ]; } shader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' ).replace( 'uniform float metalness;', 'uniform float glossiness;' ).replace( '#include ', specularMapParsFragmentChunk ).replace( '#include ', glossinessMapParsFragmentChunk ).replace( '#include ', specularMapFragmentChunk ).replace( '#include ', glossinessMapFragmentChunk ).replace( '#include ', lightPhysicalFragmentChunk ); }; Object.defineProperties( this, { specular: { get: function () { return uniforms.specular.value; }, set: function ( v ) { uniforms.specular.value = v; } }, specularMap: { get: function () { return uniforms.specularMap.value; }, set: function ( v ) { uniforms.specularMap.value = v; if ( v ) { this.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps } else { delete this.defines.USE_SPECULARMAP; } } }, glossiness: { get: function () { return uniforms.glossiness.value; }, set: function ( v ) { uniforms.glossiness.value = v; } }, glossinessMap: { get: function () { return uniforms.glossinessMap.value; }, set: function ( v ) { uniforms.glossinessMap.value = v; if ( v ) { this.defines.USE_GLOSSINESSMAP = ''; this.defines.USE_UV = ''; } else { delete this.defines.USE_GLOSSINESSMAP; delete this.defines.USE_UV; } } } } ); delete this.metalness; delete this.roughness; delete this.metalnessMap; delete this.roughnessMap; this.setValues( params ); } copy( source ) { super.copy( source ); this.specularMap = source.specularMap; this.specular.copy( source.specular ); this.glossinessMap = source.glossinessMap; this.glossiness = source.glossiness; delete this.metalness; delete this.roughness; delete this.metalnessMap; delete this.roughnessMap; return this; } } class GLTFMaterialsPbrSpecularGlossinessExtension { constructor() { this.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS; this.specularGlossinessParams = [ 'color', 'map', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity', 'emissive', 'emissiveIntensity', 'emissiveMap', 'bumpMap', 'bumpScale', 'normalMap', 'normalMapType', 'displacementMap', 'displacementScale', 'displacementBias', 'specularMap', 'specular', 'glossinessMap', 'glossiness', 'alphaMap', 'envMap', 'envMapIntensity', 'refractionRatio' ]; } getMaterialType() { return GLTFMeshStandardSGMaterial; } extendParams( materialParams, materialDef, parser ) { const pbrSpecularGlossiness = materialDef.extensions[ this.name ]; materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); materialParams.opacity = 1.0; const pending = []; if ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) { const array = pbrSpecularGlossiness.diffuseFactor; materialParams.color.fromArray( array ); materialParams.opacity = array[ 3 ]; } if ( pbrSpecularGlossiness.diffuseTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) ); } materialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 ); materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; materialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 ); if ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) { materialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor ); } if ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) { const specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; pending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) ); pending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) ); } return Promise.all( pending ); } createMaterial( materialParams ) { const material = new GLTFMeshStandardSGMaterial( materialParams ); material.fog = true; material.color = materialParams.color; material.map = materialParams.map === undefined ? null : materialParams.map; material.lightMap = null; material.lightMapIntensity = 1.0; material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap; material.aoMapIntensity = 1.0; material.emissive = materialParams.emissive; material.emissiveIntensity = 1.0; material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap; material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap; material.bumpScale = 1; material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap; material.normalMapType = THREE.TangentSpaceNormalMap; if ( materialParams.normalScale ) material.normalScale = materialParams.normalScale; material.displacementMap = null; material.displacementScale = 1; material.displacementBias = 0; material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap; material.specular = materialParams.specular; material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap; material.glossiness = materialParams.glossiness; material.alphaMap = null; material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap; material.envMapIntensity = 1.0; material.refractionRatio = 0.98; return material; } } /** * THREE.Mesh Quantization Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization */ class GLTFMeshQuantizationExtension { constructor() { this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; } } /*********************************/ /********** INTERPOLATION ********/ /*********************************/ // Spline Interpolation // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation class GLTFCubicSplineInterpolant extends THREE.Interpolant { constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { super( parameterPositions, sampleValues, sampleSize, resultBuffer ); } copySampleValue_( index ) { // Copies a sample value to the result buffer. See description of glTF // CUBICSPLINE values layout in interpolate_() function below. const result = this.resultBuffer, values = this.sampleValues, valueSize = this.valueSize, offset = index * valueSize * 3 + valueSize; for ( let i = 0; i !== valueSize; i ++ ) { result[ i ] = values[ offset + i ]; } return result; } } GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; GLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) { const result = this.resultBuffer; const values = this.sampleValues; const stride = this.valueSize; const stride2 = stride * 2; const stride3 = stride * 3; const td = t1 - t0; const p = ( t - t0 ) / td; const pp = p * p; const ppp = pp * p; const offset1 = i1 * stride3; const offset0 = offset1 - stride3; const s2 = - 2 * ppp + 3 * pp; const s3 = ppp - pp; const s0 = 1 - s2; const s1 = s3 - pp + p; // Layout of keyframe output values for CUBICSPLINE animations: // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] for ( let i = 0; i !== stride; i ++ ) { const p0 = values[ offset0 + i + stride ]; // splineVertex_k const m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) const p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 const m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; } return result; }; const _q = new THREE.Quaternion(); class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { interpolate_( i1, t0, t, t1 ) { const result = super.interpolate_( i1, t0, t, t1 ); _q.fromArray( result ).normalize().toArray( result ); return result; } } /*********************************/ /********** INTERNALS ************/ /*********************************/ /* CONSTANTS */ const WEBGL_CONSTANTS = { FLOAT: 5126, //FLOAT_MAT2: 35674, FLOAT_MAT3: 35675, FLOAT_MAT4: 35676, FLOAT_VEC2: 35664, FLOAT_VEC3: 35665, FLOAT_VEC4: 35666, LINEAR: 9729, REPEAT: 10497, SAMPLER_2D: 35678, POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6, UNSIGNED_BYTE: 5121, UNSIGNED_SHORT: 5123 }; const WEBGL_COMPONENT_TYPES = { 5120: Int8Array, 5121: Uint8Array, 5122: Int16Array, 5123: Uint16Array, 5125: Uint32Array, 5126: Float32Array }; const WEBGL_FILTERS = { 9728: THREE.NearestFilter, 9729: THREE.LinearFilter, 9984: THREE.NearestMipmapNearestFilter, 9985: THREE.LinearMipmapNearestFilter, 9986: THREE.NearestMipmapLinearFilter, 9987: THREE.LinearMipmapLinearFilter }; const WEBGL_WRAPPINGS = { 33071: THREE.ClampToEdgeWrapping, 33648: THREE.MirroredRepeatWrapping, 10497: THREE.RepeatWrapping }; const WEBGL_TYPE_SIZES = { 'SCALAR': 1, 'VEC2': 2, 'VEC3': 3, 'VEC4': 4, 'MAT2': 4, 'MAT3': 9, 'MAT4': 16 }; const ATTRIBUTES = { POSITION: 'position', NORMAL: 'normal', TANGENT: 'tangent', TEXCOORD_0: 'uv', TEXCOORD_1: 'uv2', COLOR_0: 'color', WEIGHTS_0: 'skinWeight', JOINTS_0: 'skinIndex' }; const PATH_PROPERTIES = { scale: 'scale', translation: 'position', rotation: 'quaternion', weights: 'morphTargetInfluences' }; const INTERPOLATION = { CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each // keyframe track will be initialized with a default interpolation type, then modified. LINEAR: THREE.InterpolateLinear, STEP: THREE.InterpolateDiscrete }; const ALPHA_MODES = { OPAQUE: 'OPAQUE', MASK: 'MASK', BLEND: 'BLEND' }; /* UTILITY FUNCTIONS */ function resolveURL( url, path ) { // Invalid URL if ( typeof url !== 'string' || url === '' ) return ''; // Host Relative URL if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); } // Absolute URL http://,https://,// if ( /^(https?:)?\/\//i.test( url ) ) return url; // Data URI if ( /^data:.*,.*$/i.test( url ) ) return url; // Blob URL if ( /^blob:.*$/i.test( url ) ) return url; // Relative URL return path + url; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material */ function createDefaultMaterial( cache ) { if ( cache[ 'DefaultMaterial' ] === undefined ) { cache[ 'DefaultMaterial' ] = new THREE.MeshStandardMaterial( { color: 0xFFFFFF, emissive: 0x000000, metalness: 1, roughness: 1, transparent: false, depthTest: true, side: THREE.FrontSide } ); } return cache[ 'DefaultMaterial' ]; } function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { // Add unknown glTF extensions to an object's userData. for ( const name in objectDef.extensions ) { if ( knownExtensions[ name ] === undefined ) { object.userData.gltfExtensions = object.userData.gltfExtensions || {}; object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; } } } /** * @param {Object3D|Material|BufferGeometry} object * @param {GLTF.definition} gltfDef */ function assignExtrasToUserData( object, gltfDef ) { if ( gltfDef.extras !== undefined ) { if ( typeof gltfDef.extras === 'object' ) { Object.assign( object.userData, gltfDef.extras ); } else { console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); } } } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets * * @param {BufferGeometry} geometry * @param {Array} targets * @param {GLTFParser} parser * @return {Promise} */ function addMorphTargets( geometry, targets, parser ) { let hasMorphPosition = false; let hasMorphNormal = false; for ( let i = 0, il = targets.length; i < il; i ++ ) { const target = targets[ i ]; if ( target.POSITION !== undefined ) hasMorphPosition = true; if ( target.NORMAL !== undefined ) hasMorphNormal = true; if ( hasMorphPosition && hasMorphNormal ) break; } if ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry ); const pendingPositionAccessors = []; const pendingNormalAccessors = []; for ( let i = 0, il = targets.length; i < il; i ++ ) { const target = targets[ i ]; if ( hasMorphPosition ) { const pendingAccessor = target.POSITION !== undefined ? parser.getDependency( 'accessor', target.POSITION ) : geometry.attributes.position; pendingPositionAccessors.push( pendingAccessor ); } if ( hasMorphNormal ) { const pendingAccessor = target.NORMAL !== undefined ? parser.getDependency( 'accessor', target.NORMAL ) : geometry.attributes.normal; pendingNormalAccessors.push( pendingAccessor ); } } return Promise.all( [ Promise.all( pendingPositionAccessors ), Promise.all( pendingNormalAccessors ) ] ).then( function ( accessors ) { const morphPositions = accessors[ 0 ]; const morphNormals = accessors[ 1 ]; if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; geometry.morphTargetsRelative = true; return geometry; } ); } /** * @param {Mesh} mesh * @param {GLTF.Mesh} meshDef */ function updateMorphTargets( mesh, meshDef ) { mesh.updateMorphTargets(); if ( meshDef.weights !== undefined ) { for ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) { mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; } } // .extras has user-defined data, so check that .extras.targetNames is an array. if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { const targetNames = meshDef.extras.targetNames; if ( mesh.morphTargetInfluences.length === targetNames.length ) { mesh.morphTargetDictionary = {}; for ( let i = 0, il = targetNames.length; i < il; i ++ ) { mesh.morphTargetDictionary[ targetNames[ i ] ] = i; } } else { console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); } } } function createPrimitiveKey( primitiveDef ) { const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; let geometryKey; if ( dracoExtension ) { geometryKey = 'draco:' + dracoExtension.bufferView + ':' + dracoExtension.indices + ':' + createAttributesKey( dracoExtension.attributes ); } else { geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; } return geometryKey; } function createAttributesKey( attributes ) { let attributesKey = ''; const keys = Object.keys( attributes ).sort(); for ( let i = 0, il = keys.length; i < il; i ++ ) { attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; } return attributesKey; } function getNormalizedComponentScale( constructor ) { // Reference: // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data switch ( constructor ) { case Int8Array: return 1 / 127; case Uint8Array: return 1 / 255; case Int16Array: return 1 / 32767; case Uint16Array: return 1 / 65535; default: throw new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' ); } } /* GLTF PARSER */ class GLTFParser { constructor( json = {}, options = {} ) { this.json = json; this.extensions = {}; this.plugins = {}; this.options = options; // loader object cache this.cache = new GLTFRegistry(); // associations between Three.js objects and glTF elements this.associations = new Map(); // THREE.BufferGeometry caching this.primitiveCache = {}; // THREE.Object3D instance caches this.meshCache = { refs: {}, uses: {} }; this.cameraCache = { refs: {}, uses: {} }; this.lightCache = { refs: {}, uses: {} }; this.textureCache = {}; // Track node names, to ensure no duplicates this.nodeNamesUsed = {}; // Use an THREE.ImageBitmapLoader if imageBitmaps are supported. Moves much of the // expensive work of uploading a texture to the GPU off the main thread. if ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) { this.textureLoader = new THREE.ImageBitmapLoader( this.options.manager ); } else { this.textureLoader = new THREE.TextureLoader( this.options.manager ); } this.textureLoader.setCrossOrigin( this.options.crossOrigin ); this.textureLoader.setRequestHeader( this.options.requestHeader ); this.fileLoader = new THREE.FileLoader( this.options.manager ); this.fileLoader.setResponseType( 'arraybuffer' ); if ( this.options.crossOrigin === 'use-credentials' ) { this.fileLoader.setWithCredentials( true ); } } setExtensions( extensions ) { this.extensions = extensions; } setPlugins( plugins ) { this.plugins = plugins; } parse( onLoad, onError ) { const parser = this; const json = this.json; const extensions = this.extensions; // Clear the loader cache this.cache.removeAll(); // Mark the special nodes/meshes in json for efficient parse this._invokeAll( function ( ext ) { return ext._markDefs && ext._markDefs(); } ); Promise.all( this._invokeAll( function ( ext ) { return ext.beforeRoot && ext.beforeRoot(); } ) ).then( function () { return Promise.all( [ parser.getDependencies( 'scene' ), parser.getDependencies( 'animation' ), parser.getDependencies( 'camera' ) ] ); } ).then( function ( dependencies ) { const result = { scene: dependencies[ 0 ][ json.scene || 0 ], scenes: dependencies[ 0 ], animations: dependencies[ 1 ], cameras: dependencies[ 2 ], asset: json.asset, parser: parser, userData: {} }; addUnknownExtensionsToUserData( extensions, result, json ); assignExtrasToUserData( result, json ); Promise.all( parser._invokeAll( function ( ext ) { return ext.afterRoot && ext.afterRoot( result ); } ) ).then( function () { onLoad( result ); } ); } ).catch( onError ); } /** * Marks the special nodes/meshes in json for efficient parse. */ _markDefs() { const nodeDefs = this.json.nodes || []; const skinDefs = this.json.skins || []; const meshDefs = this.json.meshes || []; // Nothing in the node definition indicates whether it is a THREE.Bone or an // THREE.Object3D. Use the skins' joint references to mark bones. for ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { const joints = skinDefs[ skinIndex ].joints; for ( let i = 0, il = joints.length; i < il; i ++ ) { nodeDefs[ joints[ i ] ].isBone = true; } } // Iterate over all nodes, marking references to shared resources, // as well as skeleton joints. for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { const nodeDef = nodeDefs[ nodeIndex ]; if ( nodeDef.mesh !== undefined ) { this._addNodeRef( this.meshCache, nodeDef.mesh ); // Nothing in the mesh definition indicates whether it is // a THREE.SkinnedMesh or THREE.Mesh. Use the node's mesh reference // to mark THREE.SkinnedMesh if node has skin. if ( nodeDef.skin !== undefined ) { meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; } } if ( nodeDef.camera !== undefined ) { this._addNodeRef( this.cameraCache, nodeDef.camera ); } } } /** * Counts references to shared node / THREE.Object3D resources. These resources * can be reused, or "instantiated", at multiple nodes in the scene * hierarchy. THREE.Mesh, Camera, and Light instances are instantiated and must * be marked. Non-scenegraph resources (like Materials, Geometries, and * Textures) can be reused directly and are not marked here. * * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. */ _addNodeRef( cache, index ) { if ( index === undefined ) return; if ( cache.refs[ index ] === undefined ) { cache.refs[ index ] = cache.uses[ index ] = 0; } cache.refs[ index ] ++; } /** Returns a reference to a shared resource, cloning it if necessary. */ _getNodeRef( cache, index, object ) { if ( cache.refs[ index ] <= 1 ) return object; const ref = object.clone(); ref.name += '_instance_' + cache.uses[ index ] ++; return ref; } _invokeOne( func ) { const extensions = Object.values( this.plugins ); extensions.push( this ); for ( let i = 0; i < extensions.length; i ++ ) { const result = func( extensions[ i ] ); if ( result ) return result; } return null; } _invokeAll( func ) { const extensions = Object.values( this.plugins ); extensions.unshift( this ); const pending = []; for ( let i = 0; i < extensions.length; i ++ ) { const result = func( extensions[ i ] ); if ( result ) pending.push( result ); } return pending; } /** * Requests the specified dependency asynchronously, with caching. * @param {string} type * @param {number} index * @return {Promise} */ getDependency( type, index ) { const cacheKey = type + ':' + index; let dependency = this.cache.get( cacheKey ); if ( ! dependency ) { switch ( type ) { case 'scene': dependency = this.loadScene( index ); break; case 'node': dependency = this.loadNode( index ); break; case 'mesh': dependency = this._invokeOne( function ( ext ) { return ext.loadMesh && ext.loadMesh( index ); } ); break; case 'accessor': dependency = this.loadAccessor( index ); break; case 'bufferView': dependency = this._invokeOne( function ( ext ) { return ext.loadBufferView && ext.loadBufferView( index ); } ); break; case 'buffer': dependency = this.loadBuffer( index ); break; case 'material': dependency = this._invokeOne( function ( ext ) { return ext.loadMaterial && ext.loadMaterial( index ); } ); break; case 'texture': dependency = this._invokeOne( function ( ext ) { return ext.loadTexture && ext.loadTexture( index ); } ); break; case 'skin': dependency = this.loadSkin( index ); break; case 'animation': dependency = this.loadAnimation( index ); break; case 'camera': dependency = this.loadCamera( index ); break; default: throw new Error( 'Unknown type: ' + type ); } this.cache.add( cacheKey, dependency ); } return dependency; } /** * Requests all dependencies of the specified type asynchronously, with caching. * @param {string} type * @return {Promise>} */ getDependencies( type ) { let dependencies = this.cache.get( type ); if ( ! dependencies ) { const parser = this; const defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; dependencies = Promise.all( defs.map( function ( def, index ) { return parser.getDependency( type, index ); } ) ); this.cache.add( type, dependencies ); } return dependencies; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views * @param {number} bufferIndex * @return {Promise} */ loadBuffer( bufferIndex ) { const bufferDef = this.json.buffers[ bufferIndex ]; const loader = this.fileLoader; if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); } // If present, GLB container is required to be the first buffer. if ( bufferDef.uri === undefined && bufferIndex === 0 ) { return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); } const options = this.options; return new Promise( function ( resolve, reject ) { loader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); } ); } ); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views * @param {number} bufferViewIndex * @return {Promise} */ loadBufferView( bufferViewIndex ) { const bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { const byteLength = bufferViewDef.byteLength || 0; const byteOffset = bufferViewDef.byteOffset || 0; return buffer.slice( byteOffset, byteOffset + byteLength ); } ); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors * @param {number} accessorIndex * @return {Promise} */ loadAccessor( accessorIndex ) { const parser = this; const json = this.json; const accessorDef = this.json.accessors[ accessorIndex ]; if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { // Ignore empty accessors, which may be used to declare runtime // information about attributes coming from another source (e.g. Draco // compression extension). return Promise.resolve( null ); } const pendingBufferViews = []; if ( accessorDef.bufferView !== undefined ) { pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); } else { pendingBufferViews.push( null ); } if ( accessorDef.sparse !== undefined ) { pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); } return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { const bufferView = bufferViews[ 0 ]; const itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; const TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. const elementBytes = TypedArray.BYTES_PER_ELEMENT; const itemBytes = elementBytes * itemSize; const byteOffset = accessorDef.byteOffset || 0; const byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; const normalized = accessorDef.normalized === true; let array, bufferAttribute; // The buffer is not interleaved if the stride is the item size in bytes. if ( byteStride && byteStride !== itemBytes ) { // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own THREE.InterleavedBuffer // This makes sure that IBA.count reflects accessor.count properly const ibSlice = Math.floor( byteOffset / byteStride ); const ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; let ib = parser.cache.get( ibCacheKey ); if ( ! ib ) { array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); // Integer parameters to IB/IBA are in array elements, not bytes. ib = new THREE.InterleavedBuffer( array, byteStride / elementBytes ); parser.cache.add( ibCacheKey, ib ); } bufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, byteOffset % byteStride / elementBytes, normalized ); } else { if ( bufferView === null ) { array = new TypedArray( accessorDef.count * itemSize ); } else { array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); } bufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized ); } // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors if ( accessorDef.sparse !== undefined ) { const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; const TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; const sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); const sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); if ( bufferView !== null ) { // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. bufferAttribute = new THREE.BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); } for ( let i = 0, il = sparseIndices.length; i < il; i ++ ) { const index = sparseIndices[ i ]; bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse THREE.BufferAttribute.' ); } } return bufferAttribute; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures * @param {number} textureIndex * @return {Promise} */ loadTexture( textureIndex ) { const json = this.json; const options = this.options; const textureDef = json.textures[ textureIndex ]; const source = json.images[ textureDef.source ]; let loader = this.textureLoader; if ( source.uri ) { const handler = options.manager.getHandler( source.uri ); if ( handler !== null ) loader = handler; } return this.loadTextureImage( textureIndex, source, loader ); } loadTextureImage( textureIndex, source, loader ) { const parser = this; const json = this.json; const options = this.options; const textureDef = json.textures[ textureIndex ]; const cacheKey = ( source.uri || source.bufferView ) + ':' + textureDef.sampler; if ( this.textureCache[ cacheKey ] ) { // See https://github.com/mrdoob/three.js/issues/21559. return this.textureCache[ cacheKey ]; } const URL = self.URL || self.webkitURL; let sourceURI = source.uri || ''; let isObjectURL = false; let hasAlpha = true; const isJPEG = sourceURI.search( /\.jpe?g($|\?)/i ) > 0 || sourceURI.search( /^data\:image\/jpeg/ ) === 0; if ( source.mimeType === 'image/jpeg' || isJPEG ) hasAlpha = false; if ( source.bufferView !== undefined ) { // Load binary image data from bufferView, if provided. sourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) { if ( source.mimeType === 'image/png' ) { // Inspect the PNG 'IHDR' chunk to determine whether the image could have an // alpha channel. This check is conservative — the image could have an alpha // channel with all values == 1, and the indexed type (colorType == 3) only // sometimes contains alpha. // // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header const colorType = new DataView( bufferView, 25, 1 ).getUint8( 0, false ); hasAlpha = colorType === 6 || colorType === 4 || colorType === 3; } isObjectURL = true; const blob = new Blob( [ bufferView ], { type: source.mimeType } ); sourceURI = URL.createObjectURL( blob ); return sourceURI; } ); } else if ( source.uri === undefined ) { throw new Error( 'THREE.GLTFLoader: Image ' + textureIndex + ' is missing URI and bufferView' ); } const promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) { return new Promise( function ( resolve, reject ) { let onLoad = resolve; if ( loader.isImageBitmapLoader === true ) { onLoad = function ( imageBitmap ) { const texture = new THREE.Texture( imageBitmap ); texture.needsUpdate = true; resolve( texture ); }; } loader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject ); } ); } ).then( function ( texture ) { // Clean up resources and configure THREE.Texture. if ( isObjectURL === true ) { URL.revokeObjectURL( sourceURI ); } texture.flipY = false; if ( textureDef.name ) texture.name = textureDef.name; // When there is definitely no alpha channel in the texture, set THREE.RGBFormat to save space. if ( ! hasAlpha ) texture.format = THREE.RGBFormat; const samplers = json.samplers || {}; const sampler = samplers[ textureDef.sampler ] || {}; texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter; texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipmapLinearFilter; texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping; texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping; parser.associations.set( texture, { type: 'textures', index: textureIndex } ); return texture; } ).catch( function () { console.error( 'THREE.GLTFLoader: Couldn\'t load texture', sourceURI ); return null; } ); this.textureCache[ cacheKey ] = promise; return promise; } /** * Asynchronously assigns a texture to the given material parameters. * @param {Object} materialParams * @param {string} mapName * @param {Object} mapDef * @return {Promise} */ assignTexture( materialParams, mapName, mapDef ) { const parser = this; return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { // Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured // However, we will copy UV set 0 to UV set 1 on demand for aoMap if ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) { console.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' ); } if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { const transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; if ( transform ) { const gltfReference = parser.associations.get( texture ); texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); parser.associations.set( texture, gltfReference ); } } materialParams[ mapName ] = texture; return texture; } ); } /** * Assigns final material to a THREE.Mesh, THREE.Line, or THREE.Points instance. The instance * already has a material (generated from the glTF material options alone) * but reuse of the same glTF material may require multiple threejs materials * to accommodate different primitive types, defines, etc. New materials will * be created if necessary, and reused from a cache. * @param {Object3D} mesh THREE.Mesh, THREE.Line, or THREE.Points instance. */ assignFinalMaterial( mesh ) { const geometry = mesh.geometry; let material = mesh.material; const useVertexTangents = geometry.attributes.tangent !== undefined; const useVertexColors = geometry.attributes.color !== undefined; const useFlatShading = geometry.attributes.normal === undefined; if ( mesh.isPoints ) { const cacheKey = 'PointsMaterial:' + material.uuid; let pointsMaterial = this.cache.get( cacheKey ); if ( ! pointsMaterial ) { pointsMaterial = new THREE.PointsMaterial(); THREE.Material.prototype.copy.call( pointsMaterial, material ); pointsMaterial.color.copy( material.color ); pointsMaterial.map = material.map; pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px this.cache.add( cacheKey, pointsMaterial ); } material = pointsMaterial; } else if ( mesh.isLine ) { const cacheKey = 'LineBasicMaterial:' + material.uuid; let lineMaterial = this.cache.get( cacheKey ); if ( ! lineMaterial ) { lineMaterial = new THREE.LineBasicMaterial(); THREE.Material.prototype.copy.call( lineMaterial, material ); lineMaterial.color.copy( material.color ); this.cache.add( cacheKey, lineMaterial ); } material = lineMaterial; } // Clone the material if it will be modified if ( useVertexTangents || useVertexColors || useFlatShading ) { let cacheKey = 'ClonedMaterial:' + material.uuid + ':'; if ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:'; if ( useVertexTangents ) cacheKey += 'vertex-tangents:'; if ( useVertexColors ) cacheKey += 'vertex-colors:'; if ( useFlatShading ) cacheKey += 'flat-shading:'; let cachedMaterial = this.cache.get( cacheKey ); if ( ! cachedMaterial ) { cachedMaterial = material.clone(); if ( useVertexColors ) cachedMaterial.vertexColors = true; if ( useFlatShading ) cachedMaterial.flatShading = true; if ( useVertexTangents ) { // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 if ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1; if ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1; } this.cache.add( cacheKey, cachedMaterial ); this.associations.set( cachedMaterial, this.associations.get( material ) ); } material = cachedMaterial; } // workarounds for mesh and geometry if ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) { geometry.setAttribute( 'uv2', geometry.attributes.uv ); } mesh.material = material; } getMaterialType() { return THREE.MeshStandardMaterial; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials * @param {number} materialIndex * @return {Promise} */ loadMaterial( materialIndex ) { const parser = this; const json = this.json; const extensions = this.extensions; const materialDef = json.materials[ materialIndex ]; let materialType; const materialParams = {}; const materialExtensions = materialDef.extensions || {}; const pending = []; if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) { const sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ]; materialType = sgExtension.getMaterialType(); pending.push( sgExtension.extendParams( materialParams, materialDef, parser ) ); } else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { const kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; materialType = kmuExtension.getMaterialType(); pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); } else { // Specification: // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material const metallicRoughness = materialDef.pbrMetallicRoughness || {}; materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); materialParams.opacity = 1.0; if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { const array = metallicRoughness.baseColorFactor; materialParams.color.fromArray( array ); materialParams.opacity = array[ 3 ]; } if ( metallicRoughness.baseColorTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); } materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); } materialType = this._invokeOne( function ( ext ) { return ext.getMaterialType && ext.getMaterialType( materialIndex ); } ); pending.push( Promise.all( this._invokeAll( function ( ext ) { return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams ); } ) ) ); } if ( materialDef.doubleSided === true ) { materialParams.side = THREE.DoubleSide; } const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; if ( alphaMode === ALPHA_MODES.BLEND ) { materialParams.transparent = true; // See: https://github.com/mrdoob/three.js/issues/17706 materialParams.depthWrite = false; } else { materialParams.format = THREE.RGBFormat; materialParams.transparent = false; if ( alphaMode === ALPHA_MODES.MASK ) { materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; } } if ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 materialParams.normalScale = new THREE.Vector2( 1, - 1 ); if ( materialDef.normalTexture.scale !== undefined ) { materialParams.normalScale.set( materialDef.normalTexture.scale, - materialDef.normalTexture.scale ); } } if ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); if ( materialDef.occlusionTexture.strength !== undefined ) { materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; } } if ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) { materialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor ); } if ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) ); } return Promise.all( pending ).then( function () { let material; if ( materialType === GLTFMeshStandardSGMaterial ) { material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams ); } else { material = new materialType( materialParams ); } if ( materialDef.name ) material.name = materialDef.name; // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. if ( material.map ) material.map.encoding = THREE.sRGBEncoding; if ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding; assignExtrasToUserData( material, materialDef ); parser.associations.set( material, { type: 'materials', index: materialIndex } ); if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); return material; } ); } /** When THREE.Object3D instances are targeted by animation, they need unique names. */ createUniqueName( originalName ) { const sanitizedName = THREE.PropertyBinding.sanitizeNodeName( originalName || '' ); let name = sanitizedName; for ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) { name = sanitizedName + '_' + i; } this.nodeNamesUsed[ name ] = true; return name; } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry * * Creates BufferGeometries from primitives. * * @param {Array} primitives * @return {Promise>} */ loadGeometries( primitives ) { const parser = this; const extensions = this.extensions; const cache = this.primitiveCache; function createDracoPrimitive( primitive ) { return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ].decodePrimitive( primitive, parser ).then( function ( geometry ) { return addPrimitiveAttributes( geometry, primitive, parser ); } ); } const pending = []; for ( let i = 0, il = primitives.length; i < il; i ++ ) { const primitive = primitives[ i ]; const cacheKey = createPrimitiveKey( primitive ); // See if we've already created this geometry const cached = cache[ cacheKey ]; if ( cached ) { // Use the cached geometry if it exists pending.push( cached.promise ); } else { let geometryPromise; if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { // Use DRACO geometry if available geometryPromise = createDracoPrimitive( primitive ); } else { // Otherwise create a new geometry geometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser ); } // Cache this geometry cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; pending.push( geometryPromise ); } } return Promise.all( pending ); } /** * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes * @param {number} meshIndex * @return {Promise} */ loadMesh( meshIndex ) { const parser = this; const json = this.json; const extensions = this.extensions; const meshDef = json.meshes[ meshIndex ]; const primitives = meshDef.primitives; const pending = []; for ( let i = 0, il = primitives.length; i < il; i ++ ) { const material = primitives[ i ].material === undefined ? createDefaultMaterial( this.cache ) : this.getDependency( 'material', primitives[ i ].material ); pending.push( material ); } pending.push( parser.loadGeometries( primitives ) ); return Promise.all( pending ).then( function ( results ) { const materials = results.slice( 0, results.length - 1 ); const geometries = results[ results.length - 1 ]; const meshes = []; for ( let i = 0, il = geometries.length; i < il; i ++ ) { const geometry = geometries[ i ]; const primitive = primitives[ i ]; // 1. create THREE.Mesh let mesh; const material = materials[ i ]; if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === undefined ) { // .isSkinnedMesh isn't in glTF spec. See ._markDefs() mesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh( geometry, material ) : new THREE.Mesh( geometry, material ); if ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) { // we normalize floating point skin weight array to fix malformed assets (see #15319) // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs mesh.normalizeSkinWeights(); } if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) { mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleStripDrawMode ); } else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) { mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleFanDrawMode ); } } else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) { mesh = new THREE.LineSegments( geometry, material ); } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) { mesh = new THREE.Line( geometry, material ); } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) { mesh = new THREE.LineLoop( geometry, material ); } else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) { mesh = new THREE.Points( geometry, material ); } else { throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); } if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { updateMorphTargets( mesh, meshDef ); } mesh.name = parser.createUniqueName( meshDef.name || 'mesh_' + meshIndex ); assignExtrasToUserData( mesh, meshDef ); if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive ); parser.assignFinalMaterial( mesh ); meshes.push( mesh ); } if ( meshes.length === 1 ) { return meshes[ 0 ]; } const group = new THREE.Group(); for ( let i = 0, il = meshes.length; i < il; i ++ ) { group.add( meshes[ i ] ); } return group; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras * @param {number} cameraIndex * @return {Promise} */ loadCamera( cameraIndex ) { let camera; const cameraDef = this.json.cameras[ cameraIndex ]; const params = cameraDef[ cameraDef.type ]; if ( ! params ) { console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); return; } if ( cameraDef.type === 'perspective' ) { camera = new THREE.PerspectiveCamera( THREE.MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); } else if ( cameraDef.type === 'orthographic' ) { camera = new THREE.OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar ); } if ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name ); assignExtrasToUserData( camera, cameraDef ); return Promise.resolve( camera ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins * @param {number} skinIndex * @return {Promise} */ loadSkin( skinIndex ) { const skinDef = this.json.skins[ skinIndex ]; const skinEntry = { joints: skinDef.joints }; if ( skinDef.inverseBindMatrices === undefined ) { return Promise.resolve( skinEntry ); } return this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) { skinEntry.inverseBindMatrices = accessor; return skinEntry; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations * @param {number} animationIndex * @return {Promise} */ loadAnimation( animationIndex ) { const json = this.json; const animationDef = json.animations[ animationIndex ]; const pendingNodes = []; const pendingInputAccessors = []; const pendingOutputAccessors = []; const pendingSamplers = []; const pendingTargets = []; for ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) { const channel = animationDef.channels[ i ]; const sampler = animationDef.samplers[ channel.sampler ]; const target = channel.target; const name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. const input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; const output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; pendingNodes.push( this.getDependency( 'node', name ) ); pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); pendingSamplers.push( sampler ); pendingTargets.push( target ); } return Promise.all( [ Promise.all( pendingNodes ), Promise.all( pendingInputAccessors ), Promise.all( pendingOutputAccessors ), Promise.all( pendingSamplers ), Promise.all( pendingTargets ) ] ).then( function ( dependencies ) { const nodes = dependencies[ 0 ]; const inputAccessors = dependencies[ 1 ]; const outputAccessors = dependencies[ 2 ]; const samplers = dependencies[ 3 ]; const targets = dependencies[ 4 ]; const tracks = []; for ( let i = 0, il = nodes.length; i < il; i ++ ) { const node = nodes[ i ]; const inputAccessor = inputAccessors[ i ]; const outputAccessor = outputAccessors[ i ]; const sampler = samplers[ i ]; const target = targets[ i ]; if ( node === undefined ) continue; node.updateMatrix(); node.matrixAutoUpdate = true; let TypedKeyframeTrack; switch ( PATH_PROPERTIES[ target.path ] ) { case PATH_PROPERTIES.weights: TypedKeyframeTrack = THREE.NumberKeyframeTrack; break; case PATH_PROPERTIES.rotation: TypedKeyframeTrack = THREE.QuaternionKeyframeTrack; break; case PATH_PROPERTIES.position: case PATH_PROPERTIES.scale: default: TypedKeyframeTrack = THREE.VectorKeyframeTrack; break; } const targetName = node.name ? node.name : node.uuid; const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear; const targetNames = []; if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) { // Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh. node.traverse( function ( object ) { if ( object.isMesh === true && object.morphTargetInfluences ) { targetNames.push( object.name ? object.name : object.uuid ); } } ); } else { targetNames.push( targetName ); } let outputArray = outputAccessor.array; if ( outputAccessor.normalized ) { const scale = getNormalizedComponentScale( outputArray.constructor ); const scaled = new Float32Array( outputArray.length ); for ( let j = 0, jl = outputArray.length; j < jl; j ++ ) { scaled[ j ] = outputArray[ j ] * scale; } outputArray = scaled; } for ( let j = 0, jl = targetNames.length; j < jl; j ++ ) { const track = new TypedKeyframeTrack( targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], inputAccessor.array, outputArray, interpolation ); // Override interpolation with custom factory method. if ( sampler.interpolation === 'CUBICSPLINE' ) { track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { // A CUBICSPLINE keyframe in glTF has three output values for each input value, // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() // must be divided by three to get the interpolant's sampleSize argument. const interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; return new interpolantType( this.times, this.values, this.getValueSize() / 3, result ); }; // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; } tracks.push( track ); } } const name = animationDef.name ? animationDef.name : 'animation_' + animationIndex; return new THREE.AnimationClip( name, undefined, tracks ); } ); } createNodeMesh( nodeIndex ) { const json = this.json; const parser = this; const nodeDef = json.nodes[ nodeIndex ]; if ( nodeDef.mesh === undefined ) return null; return parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { const node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); // if weights are provided on the node, override weights on the mesh. if ( nodeDef.weights !== undefined ) { node.traverse( function ( o ) { if ( ! o.isMesh ) return; for ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) { o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; } } ); } return node; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy * @param {number} nodeIndex * @return {Promise} */ loadNode( nodeIndex ) { const json = this.json; const extensions = this.extensions; const parser = this; const nodeDef = json.nodes[ nodeIndex ]; // reserve node's name before its dependencies, so the root has the intended name. const nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : ''; return function () { const pending = []; const meshPromise = parser._invokeOne( function ( ext ) { return ext.createNodeMesh && ext.createNodeMesh( nodeIndex ); } ); if ( meshPromise ) { pending.push( meshPromise ); } if ( nodeDef.camera !== undefined ) { pending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) { return parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera ); } ) ); } parser._invokeAll( function ( ext ) { return ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex ); } ).forEach( function ( promise ) { pending.push( promise ); } ); return Promise.all( pending ); }().then( function ( objects ) { let node; // .isBone isn't in glTF spec. See ._markDefs if ( nodeDef.isBone === true ) { node = new THREE.Bone(); } else if ( objects.length > 1 ) { node = new THREE.Group(); } else if ( objects.length === 1 ) { node = objects[ 0 ]; } else { node = new THREE.Object3D(); } if ( node !== objects[ 0 ] ) { for ( let i = 0, il = objects.length; i < il; i ++ ) { node.add( objects[ i ] ); } } if ( nodeDef.name ) { node.userData.name = nodeDef.name; node.name = nodeName; } assignExtrasToUserData( node, nodeDef ); if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); if ( nodeDef.matrix !== undefined ) { const matrix = new THREE.Matrix4(); matrix.fromArray( nodeDef.matrix ); node.applyMatrix4( matrix ); } else { if ( nodeDef.translation !== undefined ) { node.position.fromArray( nodeDef.translation ); } if ( nodeDef.rotation !== undefined ) { node.quaternion.fromArray( nodeDef.rotation ); } if ( nodeDef.scale !== undefined ) { node.scale.fromArray( nodeDef.scale ); } } parser.associations.set( node, { type: 'nodes', index: nodeIndex } ); return node; } ); } /** * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes * @param {number} sceneIndex * @return {Promise} */ loadScene( sceneIndex ) { const json = this.json; const extensions = this.extensions; const sceneDef = this.json.scenes[ sceneIndex ]; const parser = this; // THREE.Loader returns THREE.Group, not Scene. // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 const scene = new THREE.Group(); if ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name ); assignExtrasToUserData( scene, sceneDef ); if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); const nodeIds = sceneDef.nodes || []; const pending = []; for ( let i = 0, il = nodeIds.length; i < il; i ++ ) { pending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) ); } return Promise.all( pending ).then( function () { return scene; } ); } } function buildNodeHierachy( nodeId, parentObject, json, parser ) { const nodeDef = json.nodes[ nodeId ]; return parser.getDependency( 'node', nodeId ).then( function ( node ) { if ( nodeDef.skin === undefined ) return node; // build skeleton here as well let skinEntry; return parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) { skinEntry = skin; const pendingJoints = []; for ( let i = 0, il = skinEntry.joints.length; i < il; i ++ ) { pendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) ); } return Promise.all( pendingJoints ); } ).then( function ( jointNodes ) { node.traverse( function ( mesh ) { if ( ! mesh.isMesh ) return; const bones = []; const boneInverses = []; for ( let j = 0, jl = jointNodes.length; j < jl; j ++ ) { const jointNode = jointNodes[ j ]; if ( jointNode ) { bones.push( jointNode ); const mat = new THREE.Matrix4(); if ( skinEntry.inverseBindMatrices !== undefined ) { mat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 ); } boneInverses.push( mat ); } else { console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinEntry.joints[ j ] ); } } mesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld ); } ); return node; } ); } ).then( function ( node ) { // build node hierachy parentObject.add( node ); const pending = []; if ( nodeDef.children ) { const children = nodeDef.children; for ( let i = 0, il = children.length; i < il; i ++ ) { const child = children[ i ]; pending.push( buildNodeHierachy( child, node, json, parser ) ); } } return Promise.all( pending ); } ); } /** * @param {BufferGeometry} geometry * @param {GLTF.Primitive} primitiveDef * @param {GLTFParser} parser */ function computeBounds( geometry, primitiveDef, parser ) { const attributes = primitiveDef.attributes; const box = new THREE.Box3(); if ( attributes.POSITION !== undefined ) { const accessor = parser.json.accessors[ attributes.POSITION ]; const min = accessor.min; const max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. if ( min !== undefined && max !== undefined ) { box.set( new THREE.Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), new THREE.Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) ); if ( accessor.normalized ) { const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); box.min.multiplyScalar( boxScale ); box.max.multiplyScalar( boxScale ); } } else { console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); return; } } else { return; } const targets = primitiveDef.targets; if ( targets !== undefined ) { const maxDisplacement = new THREE.Vector3(); const vector = new THREE.Vector3(); for ( let i = 0, il = targets.length; i < il; i ++ ) { const target = targets[ i ]; if ( target.POSITION !== undefined ) { const accessor = parser.json.accessors[ target.POSITION ]; const min = accessor.min; const max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. if ( min !== undefined && max !== undefined ) { // we need to get max of absolute components because target weight is [-1,1] vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); if ( accessor.normalized ) { const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); vector.multiplyScalar( boxScale ); } // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets // are used to implement key-frame animations and as such only two are active at a time - this results in very large // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size. maxDisplacement.max( vector ); } else { console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); } } } // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets. box.expandByVector( maxDisplacement ); } geometry.boundingBox = box; const sphere = new THREE.Sphere(); box.getCenter( sphere.center ); sphere.radius = box.min.distanceTo( box.max ) / 2; geometry.boundingSphere = sphere; } /** * @param {BufferGeometry} geometry * @param {GLTF.Primitive} primitiveDef * @param {GLTFParser} parser * @return {Promise} */ function addPrimitiveAttributes( geometry, primitiveDef, parser ) { const attributes = primitiveDef.attributes; const pending = []; function assignAttributeAccessor( accessorIndex, attributeName ) { return parser.getDependency( 'accessor', accessorIndex ).then( function ( accessor ) { geometry.setAttribute( attributeName, accessor ); } ); } for ( const gltfAttributeName in attributes ) { const threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); // Skip attributes already provided by e.g. Draco extension. if ( threeAttributeName in geometry.attributes ) continue; pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); } if ( primitiveDef.indices !== undefined && ! geometry.index ) { const accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { geometry.setIndex( accessor ); } ); pending.push( accessor ); } assignExtrasToUserData( geometry, primitiveDef ); computeBounds( geometry, primitiveDef, parser ); return Promise.all( pending ).then( function () { return primitiveDef.targets !== undefined ? addMorphTargets( geometry, primitiveDef.targets, parser ) : geometry; } ); } /** * @param {BufferGeometry} geometry * @param {Number} drawMode * @return {BufferGeometry} */ function toTrianglesDrawMode( geometry, drawMode ) { let index = geometry.getIndex(); // generate index if not present if ( index === null ) { const indices = []; const position = geometry.getAttribute( 'position' ); if ( position !== undefined ) { for ( let i = 0; i < position.count; i ++ ) { indices.push( i ); } geometry.setIndex( indices ); index = geometry.getIndex(); } else { console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); return geometry; } } // const numberOfTriangles = index.count - 2; const newIndices = []; if ( drawMode === THREE.TriangleFanDrawMode ) { // gl.TRIANGLE_FAN for ( let i = 1; i <= numberOfTriangles; i ++ ) { newIndices.push( index.getX( 0 ) ); newIndices.push( index.getX( i ) ); newIndices.push( index.getX( i + 1 ) ); } } else { // gl.TRIANGLE_STRIP for ( let i = 0; i < numberOfTriangles; i ++ ) { if ( i % 2 === 0 ) { newIndices.push( index.getX( i ) ); newIndices.push( index.getX( i + 1 ) ); newIndices.push( index.getX( i + 2 ) ); } else { newIndices.push( index.getX( i + 2 ) ); newIndices.push( index.getX( i + 1 ) ); newIndices.push( index.getX( i ) ); } } } if ( newIndices.length / 3 !== numberOfTriangles ) { console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); } // build final geometry const newGeometry = geometry.clone(); newGeometry.setIndex( newIndices ); return newGeometry; } THREE.GLTFLoader = GLTFLoader; } )(); })() ================================================ FILE: plugins/repeat_it.js ================================================ (function () { var repeatAction; var canRotate; Plugin.register("repeat_it", { title: "Repeat It", author: "Ocraftyone", icon: "content_copy", description: "Allows you to repeat cubes with a translation applied to each new object", about: "Allows you to repeat cubes with a translation applied to each new object.\n\nAt this time, the only shape that can be copied are cubes, but this may be updated in the future.", version: "0.0.1", variant: "both", onload () { repeatAction = new Action("repeat_shape", { name: "Repeat shape", description: "Repeat shape", icon: "content_copy", click (event) { canRotate = Format.rotate_cubes; var rotationLimit = Format.rotation_limit; var option_dialog = new Dialog({ id: "repeat_shape_dialog", title: "Repeat Shape", form: { repeat: { label: "Repeat", type: "number", value: 2, description: "Number of times to copy the cube", min: 2, }, possitionDiff: { label: "Position difference", type: "vector", value: [0, 0, 0], description: "Possition offset between each cloned cube", }, rotationDiff: { label: "Rotation difference", type: "vector", value: [0, 0, 0], description: "Rotation offset between each cloned cube.\nRotation will only apply if the model supports it. If this option is not greyed out, your model supports rotation!", step: Format.rotation_limit ? 22.5 : 1, readonly: !canRotate, }, shouldCreateGroup: { label: "Create group", type: "checkbox", value: true, description: "Wraps the original and all new cubes into a group", }, }, onConfirm (formResult) { var possitionDiff = formResult.possitionDiff; var rotationDiff = formResult.rotationDiff; var zero = [0, 0, 0]; if (rotationDiff.equals(zero) && possitionDiff.equals(zero)) { Blockbench.showMessageBox({ buttons: ["OK", "Cancel"], title: "Error", message: "There are no transforms applied to the repeated shapes!", confirm: 0, cancel: 1, }, (button) => { if (button == 0) { option_dialog.show() } }); return; } if (rotationLimit) { if (!rotationDiff.every((e) => e % 22.5 === 0)) { Blockbench.showMessageBox({ buttons: ["OK", "Cancel"], title: "Error", message: "Rotation difference is not a multiple of the rotation limit! (22.5)", confirm: 0, cancel: 1, }, (button) => { if (button == 0) { option_dialog.show() } }); return; } var nonZero = 0 rotationDiff.forEach(value => value !== 0 && nonZero++) if (nonZero > 1) { Blockbench.showMessageBox({ buttons: ["OK", "Cancel"], title: "Error", message: "The rotation limits of this model prevent you from rotating on more that one axis at a time!", confirm: 0, cancel: 1, }, (button) => { if (button == 0) { option_dialog.show() } }); return; } } this.hide(); var elementsToAdd = []; Undo.initEdit({ elements: [], outliner: true, selection: true, }); var shouldCreateGroup = formResult.shouldCreateGroup; Cube.selected.forEach(function (cube, i) { var group = cube.parent; if (shouldCreateGroup) { group = new Group( cube.name + " group" ).init(); group.addTo(cube.parent); cube.addTo(group); } for (var j = 1; j < formResult.repeat; j++) { var newCubeFrom = [ cube.from[0] + possitionDiff[0] * j, cube.from[1] + possitionDiff[1] * j, cube.from[2] + possitionDiff[2] * j, ]; var newCubeTo = [ cube.to[0] + possitionDiff[0] * j, cube.to[1] + possitionDiff[1] * j, cube.to[2] + possitionDiff[2] * j, ]; if (canRotate) { var newCubeRotation = [ cube.rotation[0] + rotationDiff[0] * j, cube.rotation[1] + rotationDiff[1] * j, cube.rotation[2] + rotationDiff[2] * j, ]; } var newCube = new Cube(cube).extend({ from: newCubeFrom, to: newCubeTo, rotation: newCubeRotation, name: cube.name + "_" + j, }).init(); newCube.addTo(group); elementsToAdd.push(newCube); } }); Canvas.updateView({ elements: elementsToAdd, element_aspects: {transform: true} }) Undo.finishEdit("Repeat shape", { outliner: true, elements: elementsToAdd, selection: true, }); }, }); option_dialog.show(); }, }); MenuBar.addAction(repeatAction, "tools"); }, onunload () { repeatAction.delete(); }, }); })(); ================================================ FILE: plugins/repeating_textures/LICENSE.MD ================================================ MIT License 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. ================================================ FILE: plugins/repeating_textures/about.md ================================================ Enables repeating textures, meaning textures wrap when the UV is beyond the texture bounds. Allows for more accurate importing of OBJ models that make use of repeating textures. Repeated textures can be toggled on and off from `View > Repeating Textures`. ================================================ FILE: plugins/repeating_textures/members.yml ================================================ maintainers: - mr0x13f developers: - mr0x13f ================================================ FILE: plugins/repeating_textures/repeating_textures.js ================================================ (function() { let deferred = []; Plugin.register('repeating_textures', { title: 'Repeating Textures', author: '0x13F', description: 'Enables repeating textures', icon: 'icon.png', creation_date: '2025-06-15', version: '3.0.0', variant: 'both', min_version: '4.12.4', has_changelog: false, tags: [ 'Texture', 'Viewport', 'Utility' ], repository: 'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/repeating_textures', onload() { // Hook into the Texture.getMaterial() method to set the wrap mode { let original = Texture.prototype.getMaterial; Texture.prototype.getMaterial = function () { let result = original.apply(this); updateTextureWrapMode(this); return result; }; defer(() => Texture.prototype.getMaterial = original); } // Setting deferDelete(new Setting('repeating_textures', { name: 'Repeating Textures', description: 'Wrap textures when UV is beyond the texture bounds', category: 'view', value: true, onChange() { updateAllTextureWrapModes(); }, })); // Toggle let repeatingTexturesToggle = deferDelete(new Toggle('toggle_repeating_textures', { name: 'Repeating Textures', description: 'Wrap textures when UV is beyond the texture bounds', icon: 'qr_code', category: 'view', linked_setting: 'repeating_textures', })); let shadingToggleIndex = MenuBar.menus.view.structure.indexOf('toggle_shading'); let repeatingTexturesToggleIndex = shadingToggleIndex + 1; MenuBar.menus.view.structure.splice(repeatingTexturesToggleIndex, 0, repeatingTexturesToggle); defer(() => MenuBar.menus.view.structure.splice(MenuBar.menus.view.structure.indexOf(repeatingTexturesToggle), 1)); // Apply setting on load updateAllTextureWrapModes(); // Disable on unload defer(() => updateAllTextureWrapModes(false)); }, onunload() { for (let lambda of deferred.reverse()) lambda(); }, }); function updateAllTextureWrapModes(force = undefined) { for (let texture of Texture.all) updateTextureWrapMode(texture, force); } function updateTextureWrapMode(texture, force = undefined) { let useRepeating = force ?? Settings.get('repeating_textures'); let wrapMode = useRepeating ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; let map = texture.material?.map ?? texture.img?.tex; if (map.wrapS === wrapMode && map.wrapT === wrapMode) return; map.wrapS = wrapMode; map.wrapT = wrapMode; map.needsUpdate = true; } function defer(lambda) { deferred.push(lambda); } function deferDelete(deletable) { if (deletable.delete == undefined) { console.warn('deferDelete() called with object that isn\'t deletable: ', deletable); return; } defer(() => deletable.delete()); return deletable; } })(); ================================================ FILE: plugins/resource_pack_exporter.js ================================================ var exportResourcePackAction; Plugin.register('resource_pack_exporter', { title: 'Resource Pack Exporter', icon: 'archive', author: 'Wither', description: 'Exports your model as a ready-to-use Minecraft resource pack', tags: ["Minecraft: Java Edition"], version: '1.0.0', min_version: '3.0.0', variant: 'both', onload() { exportResourcePackAction = new Action({ id: 'export_rp', name: 'Export Resource Pack', icon: 'archive', description: 'Exports your model as a ready-to-use Minecraft resource pack', category: 'file', condition: () => Format.id === "java_block", click: function (ev) { packDialog.show(); } }); MenuBar.addAction(exportResourcePackAction, 'file.export'); }, onunload() { this.onuninstall(); }, onuninstall() { exportResourcePackAction.delete(); } }) var packDialog = new Dialog({ id: 'create_pack', title: 'Pack Settings', draggable: true, form: { pack_name: {label: 'Pack Name', value: 'My Pack'}, pack_description: {label: 'Pack Description', value: 'My Description'} }, onConfirm: function(data) { exportResourcePack(data.pack_name, data.pack_description); packDialog.hide(); } }); function exportResourcePack(name, description) { Screencam.cleanCanvas({width: 100, height: 100}, base64 => { let packZip = new JSZip(); packZip.file('pack.png', base64.split(',')[1], {base64: true}); let manifestObject = {pack: {description: description !== '' ? description : 'My Description', pack_format: 4}}; let animTextureObject = {animation: {frametime: 2}}; packZip.file('pack.mcmeta', JSON.stringify(manifestObject, null, '\t')); let assetsFolder = packZip.folder('assets'); let minecraftFolder = assetsFolder.folder('minecraft'); let modelsFolder = minecraftFolder.folder('models'); let blockFolder = modelsFolder.folder('block'); let texturesFolder = minecraftFolder.folder('textures'); let blockbenchTexturesFolder = texturesFolder.folder('blockbench') for(let textureIndex = 0; textureIndex < textures.length; textureIndex++) { textures[textureIndex].name = `texture_${textureIndex}.png`; textures[textureIndex].folder = 'blockbench'; textures[textureIndex].namespace = 'minecraft'; if (textures[textureIndex].frameCount > 1) { blockbenchTexturesFolder.file(`texture_${textureIndex}.png.mcmeta`, JSON.stringify(animTextureObject, null, "\t")); } blockbenchTexturesFolder.file(`texture_${textureIndex}.png`, textures[textureIndex].getBase64(), {base64: true}); } blockFolder.file('glass.json', Codecs.java_block.compile()); packZip.generateAsync({type: 'blob'}).then(content => { Blockbench.export({ type: 'Zip Archive', extensions: ['zip'], name: name !== '' ? name : 'My Pack', content: content, savetype: 'zip' }); }); }); } ================================================ FILE: plugins/resource_pack_utilities/about.md ================================================

    This plugin contains a collection of utilities to assist with resource pack creation.

    How to use

    To use this plugin, go Tools > Resource Pack Utilities, then select the utility you would like to use.

    Utilities

    • Animation Combiner

      Animation Combiner is a tool that combines the textures from a selected folder into an animated spritesheet texture.

    • Batch Exporter

      Batch Exporter is a tool that will export every bbmodel file within a folder to an output folder using the selected format.

    • Bed Converter

      Bed Converter is a tool that splits a bed entity texture into the per-face textures used by the new bed block model format.

    • Chest Converter

      Chest Converter is a tool that will convert the chest textures between the 1.14 format 1.15 format.

    • CIT Optimiser

      CIT Optimiser is a tool that will go through all properties files in an OptiFine CIT folder and optimise them to be as small as possible, removing any unnecessary data.

    • Clock Generator

      Clock Generator is a tool that allows you to quickly and easily generate a full set of clock textures from a simple input texture.

    • CTM Converter

      CTM Converter is a tool that will convert compact CTM into full CTM or overlay CTM.

    • Image Resizer

      Image Resizer is a tool that will go through all images in a folder and resize them, relative to their original size.

    • JSON Optimiser

      JSON Optimiser is a tool that will go through all JSON files in a folder and optimise them to be as small as possible, minifying them and removing any unnecessary data.

    • Lang Builder

      Lang Builder lets you define language key modifications using replacement, prefix, or suffix modes. Changes are applied to all vanilla language files.

    • Lang Stripper

      Lang Stripper is a tool that will go through all the language files in an resource pack and remove any entries that have not been modified.

    • Minecraft Title Converter

      Minecraft Title Converter is a tool that will convert images to be in the the Minecraft title format. This can also convert existing textures between the 1.19 and 1.20 texture formats.

    • Missing Textures

      Missing Textures is a tool that will check what textures you have in a resource pack and tell you which ones the resource pack is missing.

    • Mojang Converter

      Mojang Converter is a tool that will convert images to be in the the Mojang Studios logo format. This can also convert existing textures between the 1.15 and 1.16 texture formats.

    • Pack Cleaner

      Pack Cleaner is a tool that will go through all the files in a resource pack and compare them against the vanilla assets, removing them if they are unmodified.

    • Pack Creator

      Pack Creator is a tool that allows you to create template resource packs, as well as get the vanilla textures, models, sounds, etc…

    • Skin Converter

      Skin Converter is a tool that will convert Minecraft skins between the classic 64x32 format and the modern 64x64 format.

    • Sounds Stripper

      Sounds Stripper is a tool that will go through the sounds.json file in an resource pack and remove any entries that have not been modified.

    • Wide ⇄ Slim Converter

      Wide ⇄ Slim Converter is a tool that will convert Minecraft skins between the wide 4px arm format and the slim 3px arm format.

    ================================================ FILE: plugins/resource_pack_utilities/changelog.json ================================================ { "1.0.0": { "title": "1.0.0", "date": "2024-07-01", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Initial release" ] } ] }, "1.1.0": { "title": "1.1.0", "date": "2024-07-09", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added Missing Textures utility", "Added ability to export and load ignore lists" ] }, { "title": "Changes", "list": [ "Changed logs to save as a \".log\" file" ] } ] }, "1.2.0": { "title": "1.2.0", "date": "2024-07-24", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added Chest Converter utility", "Added Clock Generator utility", "Added CTM Converter utility", "Added Image Resizer utility", "Added Minecraft Title Converter utility", "Added Mojang Converter utility", "Added Skin Converter utility", "Added Wide ⇄ Slim Converter utility" ] } ] }, "1.3.0": { "title": "1.3.0", "date": "2024-07-25", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added Animation Combiner utility" ] }, { "title": "Bug Fixes", "list": [ "Fixed textures trying to export as \".image\" files" ] } ] }, "1.4.0": { "title": "1.4.0", "date": "2024-07-27", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added Sounds Stripper utility" ] }, { "title": "Changes", "list": [ "JSON minification is now optional in JSON Optimiser", "Updated the Lang Stripper icon", "Added YouTube tutorials link" ] }, { "title": "Bug Fixes", "list": [ "Fixed output textures failing to save", "Fixed sorting of numerical file names in Animation Combiner" ] } ] }, "1.5.0": { "title": "1.5.0", "date": "2024-08-16", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "JSON Optimiser now has an option to remove \"minecraft:\" prefixes" ] }, { "title": "Changes", "list": [ "Added support for the 1.21.2 \"light_emission\" property of block models to JSON Optimiser" ] } ] }, "1.5.1": { "title": "1.5.1", "date": "2024-09-03", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed Batch Exporter failing to parse certain bbmodel files", "Fixed Batch Exporter failing to export formats where the codec ID did not match the format ID" ] } ] }, "1.6.0": { "title": "1.6.0", "date": "2025-01-22", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Blockbench can now be launched with the \"--resource-pack-utility=\" command line argument to launch straight to the specified utility" ] } ] }, "1.6.1": { "title": "1.6.1", "date": "2025-03-02", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed Batch Exporter failing to export glTF, OBJ, FBX, and Collada models" ] } ] }, "1.6.2": { "title": "1.6.2", "date": "2025-03-13", "author": "Ewan Howell", "categories": [ { "title": "Changed", "list": [ "Renamed the setting names to make them more generic so I can use them across multiple plugins" ] }, { "title": "Bug Fixes", "list": [ "Fixed using outdated asset index files when a newer one is available" ] } ] }, "1.7.0": { "title": "1.7.0", "date": "2025-06-03", "author": "Ewan Howell", "categories": [ { "title": "Techinical Changes", "list": [ "The cache folder has been moved to the AppData folder and is no longer required to be specified by the user", "The \"Minecraft Directory\" setting ID has been made more unique as to not conflict if other plugins use the same ID" ] } ] }, "1.8.0": { "title": "1.8.0", "date": "2025-10-12", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added Lang Builder utility" ] }, { "title": "Compatibility", "list": [ "Updated for Blockbench 5.0" ] }, { "title": "Removed Features", "list": [ "Temporarily removed command line argument support" ] } ] }, "1.9.0": { "title": "1.9.0", "date": "2025-10-15", "author": "Ewan Howell", "categories": [ { "title": "Updates", "list": [ "Updated Pack Creator to support the new pack.mcmeta format", "Updated JSON Optimiser to support the new pack.mcmeta format" ] }, { "title": "Bug Fixes", "list": [ "Fixed ability to export from Animation Combiner" ] } ] }, "1.9.1": { "title": "1.9.1", "date": "2025-10-16", "author": "Ewan Howell", "categories": [ { "title": "Changes", "list": [ "Re-enabled command line argument support" ] }, { "title": "Bug Fixes", "list": [ "Fixed the back button hover colour" ] } ] }, "1.9.2": { "title": "1.9.2", "date": "2025-12-04", "author": "Ewan Howell", "categories": [ { "title": "Bug Fixes", "list": [ "Fixed Batch Exporter crashing when loading bbmodels that have unknown model formats" ] } ] }, "1.10.0": { "title": "1.10.0", "date": "2026-05-17", "author": "Ewan Howell", "categories": [ { "title": "New Features", "list": [ "Added Bed Converter utility for splitting a bed entity texture into the per-face textures used by the new bed block model format", "Added drag-and-drop support to all file and folder inputs" ] }, { "title": "Updates", "list": [ "Updated JSON Optimiser to support the multi-axis rotation format for block model elements", "Updated JSON Optimiser to strip default `force_translucent` values from texture entries", "Updated JSON Optimiser to simplify single-sprite texture entries to the string form", "Updated JSON Optimiser to strip the `uv` property from faces when it matches the auto-generated value", "Updated JSON Optimiser to remove empty `elements` arrays" ] }, { "title": "Changes", "list": [ "Blockbench's native file drop is now blocked while the Resource Pack Utilities dialog is open", "Tweaked dialog header font sizes" ] } ] } } ================================================ FILE: plugins/resource_pack_utilities/resource_pack_utilities.js ================================================ const crypto = require("node:crypto") const zlib = require("node:zlib") let fs, dialog, action, action2, styles, storage, cacheDir const id = "resource_pack_utilities" const name = "Resource Pack Utilities" const icon = "construction" const description = "A collection of utilities to assist with resource pack creation." const manifest = { latest: {}, versions: [] } let outputLog = [] const output = { log: log => outputLog.push(["message", log]), info: log => outputLog.push(["info", log]), warn: log => outputLog.push(["warn", log]), error: log => outputLog.push(["error", log]) } const setupPlugin = () => Plugin.register(id, { title: name, icon: "icon.png", author: "Ewan Howell", description, tags: ["Minecraft: Java Edition", "Resource Packs", "Utilities"], version: "1.10.0", min_version: "5.0.2", variant: "desktop", website: `https://ewanhowell.com/plugins/${id.replace(/_/g, "-")}/`, repository: `https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/${id}`, bug_tracker: `https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[${name}]`, creation_date: "2024-07-01", has_changelog: true, async onload() { fs = require("fs", { message: "This permission is required to access your downloaded Minecraft versions, cache versions you open that aren’t already downloaded, and export assets to folders.", optional: false }) if (!fs) { throw new Error("fs access denied") } cacheDir = PathModule.join(SystemInfo.user_data_directory, "minecraft_assets_cache") if (!fs.existsSync(cacheDir)) { fs.mkdirSync(cacheDir, { recursive: true }) } storage = JSON.parse(localStorage.getItem(id) ?? "{}") storage.favourites ??= [] let directory if (SystemInfo.platform === "win32") { directory = PathModule.join(SystemInfo.appdata_directory, ".minecraft") } else if (SystemInfo.platform === "darwin") { directory = PathModule.join(SystemInfo.home_directory, "Library", "Application Support", "minecraft") } else { directory = PathModule.join(SystemInfo.home_directory, ".minecraft") } new Setting("ewan_minecraft_directory", { value: directory, category: "defaults", type: "click", name: "Ewan's Plugins - Minecraft Directory", description: "The location of your .minecraft folder", icon: "folder_open", click() { const dir = Blockbench.pickDirectory({ title: "Select your .minecraft folder", startpath: settings.ewan_minecraft_directory.value }) if (dir) { settings.ewan_minecraft_directory.value = dir Settings.saveLocalStorages() } } }) const methods = { selectFolder(title = "folder", key = "folder") { const dir = Blockbench.pickDirectory({ title: `Select ${title}`, startpath: PathModule.join(settings.ewan_minecraft_directory.value, "resourcepacks") }) if (dir) { this[key] = dir } } } styles = Blockbench.addCSS(` .rpu-code { background-color: var(--color-back); border: 1px solid var(--color-border); padding: 0 2px; } @keyframes shake { 0%, 100% { transform: translateX(0); outline: 0 solid transparent; } 12.5%, 62.5% { transform: translateX(8px); outline: 4px solid var(--color-danger); } 37.5%, 87.5% { transform: translateX(-8px); outline: 4px solid var(--color-danger); } } #${id} { .dialog_content { margin: 0; max-height: calc(100vh - 128px); } button { display: inline-flex; justify-content: center; align-items: center; min-height: 32px; &:disabled { opacity: .5; cursor: not-allowed; &:hover { background-color: var(--color-button); color: var(--color-text) !important; } } &.material-icons { min-width: 32px; padding: 0; &:focus { text-decoration: none; color: var(--color-light); } &.icon { background-color: initial; &:focus { color: var(--color-text) !important; } &:hover { color: var(--color-light) !important; } } } } code { background-color: var(--color-back); border: 1px solid var(--color-border); padding: 0 2px; } input[type="text"] { background-color: var(--color-back); padding: 0 8px; border: 1px solid var(--color-border); height: 32px; } h1, h3, p { margin: 0; padding: 0; } h3 { margin-bottom: -8px; } .bb-select { cursor: pointer; padding-top: 0; padding-right: 27px; display: flex; align-items: center; &::before { top: 50%; right: 6px; transform: translateY(calc(-50% - 7px)); } } .divider { min-height: 1px; display: flex; align-items: center; gap: 16px; &::before, &:not(:empty)::after { content: ""; flex: 1; height: 1px; background-color: var(--color-border); } } #home { .component-searchBar { margin: 16px; padding-bottom: 16px; border-bottom: 1px solid var(--color-border); } > .utilities { margin: 16px; gap: 8px; flex-wrap: wrap; display: flex; > div { background-color: var(--color-back); padding: 12px 16px 16px 16px; cursor: pointer; display: flex; flex-direction: column; gap: 8px; width: calc(50% - 4px); position: relative; border-radius: 6px; * { cursor: pointer; } &:hover { background-color: var(--color-button); } } + div { border-top: 1px solid var(--color-border); padding-top: 16px; } .fa-star { position: absolute; top: 16px; right: 16px; &.fa { color: #f9c300; &:hover { filter: brightness(1.2); } } &.far:hover { color: var(--color-light); } } } h3 { font-weight: 600; font-size: 22px; color: var(--color-light); line-height: 100%; margin: 0; display: flex; gap: 6px; padding-right: 28px; } } #header { background-color: var(--color-back); position: relative; padding: 8px 40px 16px 16px; h1 { font-weight: 600; color: var(--color-light); display: flex; gap: 8px; align-items: center; font-size: 28px; > i { font-size: 30px; min-width: 30px; } } } #home-button { position: absolute; top: 8px; right: 8px; background-color: initial; display: flex; align-items: center; min-width: initial; padding: 0 8px; box-shadow: none; &:hover { color: var(--color-light) !important; } &:disabled { pointer-events: initial; cursor: not-allowed; &:hover { color: var(--color-text) !important; } } } #info-button { position: absolute; bottom: 8px; right: 8px; } .utility { margin: 16px 8px 16px 16px; padding-right: 8px; display: flex; gap: 16px; flex-direction: column; max-height: calc(100vh - 286px); overflow-y: auto; > div, .col { display: flex; gap: 16px; flex-direction: column; > .component-checkboxRow + .component-checkboxRow { margin-top: -16px; } } .row { display: flex; gap: 32px; flex-direction: row; align-items: flex-start; } } .no-results { display: flex; padding: 0 !important; background-color: initial !important; text-align: center; width: 100% !important; height: 128px; justify-content: center; align-items: center; } .button-row { display: flex; gap: 8px; > * { flex: 1 1 0px; } } .utility-langBuilder { margin-left: 14px; } ${Object.entries(components).filter((([k, v]) => v.styles)).map(([k, v]) => `.component-${k} { ${v.styles} }`).join("")} ${Object.entries(utilities).filter((([k, v]) => v.component.styles)).map(([k, v]) => `.utility-${k} { ${v.component.styles} }`).join("")} } `, "base") const subcomponents = Object.fromEntries( Object.entries(components).map(([k, v]) => { v.template = `
    ${v.template}
    ` return [k, Vue.extend(v)] }) ) const utilityComponents = Object.fromEntries( Object.entries(utilities).map(([k, v]) => { v.component.props = ["value"] const data = v.component.data v.component.data = function() { return { ...data, status: this.value } } v.component.watch = { value(val) { this.status = val }, status(val) { this.$emit("input", val) }, ...v.component.watch } v.component.components = subcomponents v.component.methods ??= {} v.component.methods = { ...v.component.methods, ...methods } v.component.template = `
    ${v.component.template}
    ` return [k, Vue.extend(v.component)] }) ) dialog = new Dialog({ id, title: name, width: 780, buttons: [], cancel_on_click_outside: false, component: { data: { utility: null, utilities, status: { processing: false, finished: false }, favourites: storage.favourites, search: "" }, components: { ...subcomponents, ...utilityComponents }, watch: { status(val) { if (val.processing) { const styles = document.createElement("style") styles.id = `${id}-processing-styles` styles.innerHTML = ` #${id} { .dialog_close_button { pointer-events: none; opacity: .5; } .dialog_handle::before, #header::before { content: ""; position: absolute; top: 0; right: 0; bottom: 0; width: 30px; cursor: not-allowed; } } ` document.body.append(styles) } else { document.getElementById(`${id}-processing-styles`)?.remove() } } }, methods: { showInfo() { new Dialog({ id: `${id}-info`, title: `${utilities[this.utility].name} Info`, buttons: ["dialog.close"], lines: [ ``, utilities[this.utility].info ], width: 780 }).show() }, favourite(id) { this.favourites.unshift(id) save() sortUtilities() }, unfavourite(id) { this.favourites.splice(this.favourites.indexOf(id), 1) save() sortUtilities() } }, computed: { utilityList() { const sorted = Object.entries(this.utilities).sort((a, b) => a[0].localeCompare(b[0])) if (this.search.length) { return sorted.filter(e => e[0].toLowerCase().includes(this.search.replace(/\s/g, ''))) } return sorted.filter(e => !this.favourites.includes(e[0])) } }, template: `

    {{ utilities[id].icon }} {{ utilities[id].name }}

    {{ utilities[id].tagline }}
    No results…

    {{ data.icon }} {{ data.name }}

    {{ data.tagline }}
    ` }, onConfirm(r, e) { if (Keybinds.extra.confirm.keybind.isTriggered(e)) return false }, async onBuild() { const data = await fetch("https://piston-meta.mojang.com/mc/game/version_manifest_v2.json").then(e => e.json()) data.versions.splice(data.versions.findIndex(e => e.id === "1.6"), 1) manifest.latest = data.latest manifest.versions = data.versions.slice(0, data.versions.findIndex(e => e.id === "13w24a") + 1) }, async onOpen() { if (!await exists(settings.ewan_minecraft_directory.value)) { new Dialog({ title: "The .minecraft directory was not found", lines: ['When prompted, please select your .minecraft folder'], width: 450, buttons: ["dialog.ok"], onClose() { const dir = Blockbench.pickDirectory({ title: "Select your .minecraft folder", startpath: settings.ewan_minecraft_directory.value }) if (dir) { settings.ewan_minecraft_directory.value = dir Settings.saveLocalStorages() } else { dialog.close() } } }).show() } } }) action = new Action({ id, name, description, icon, click: () => dialog.show(), condition: () => !Object.keys(utilities).filter(e => storage.favourites.includes(e)).length, }) action2 = new Action({ id: id + 2, name, description, icon, click: () => dialog.show(), condition: () => Object.keys(utilities).filter(e => storage.favourites.includes(e)).length, children: [ { name: "Open", icon: "menu", click: () => dialog.show() }, ...Object.entries(utilities).map(([id, data]) => new Action({ id, name: data.name, description: data.tagline, icon: data.icon, click() { dialog.show() dialog.content_vue.utility = id }, condition: () => storage.favourites.includes(id) })) ] }) sortUtilities() MenuBar.addAction(action, "tools") MenuBar.addAction(action2, "tools") document.addEventListener("keydown", copyText) document.addEventListener("dragover", blockOutsideDnd, true) document.addEventListener("drop", blockOutsideDnd, true) const utility = Blockbench.argv.find(e => e.startsWith("--resource-pack-utility="))?.split("=")[1] if (utility && utilities[utility]) { dialog.show() dialog.content_vue.utility = utility } }, onunload() { document.removeEventListener("keydown", copyText) document.removeEventListener("dragover", blockOutsideDnd, true) document.removeEventListener("drop", blockOutsideDnd, true) dialog?.close() action?.delete() action2?.delete() Object.keys(utilities).forEach(e => BarItems[e]?.delete()) styles?.delete() document.getElementById(`${id}-processing-styles`)?.remove() } }) // Functions function blockOutsideDnd(event) { const dialogEl = document.getElementById(id) if (!dialogEl) return if (document.getElementById("dialog_wrapper")?.lastElementChild !== dialogEl) return if (event.target.closest?.(".component-fileInput, .folder-selector")) return event.preventDefault() event.stopPropagation() } function save() { localStorage.setItem(id, JSON.stringify(storage)) } const getFiles = async function*(dir) { const dirents = await fs.promises.readdir(dir, { withFileTypes: true }) for (const dirent of dirents) { const res = PathModule.resolve(dir, dirent.name) if (dirent.isDirectory()) { yield* getFiles(res) } else if (!res.match(/([\/\\]|^)\.git([\/\\]|$)/)) { yield res } } } async function listFiles(dir, type) { const files = await fs.promises.readdir(dir, { withFileTypes: true }) return files.filter(e => e.isFile() && (!type || e.name.endsWith("." + type))).map(e => e.name).sort((a, b) => a.localeCompare(b, undefined, { numeric: true })) } const sizes = ["B", "KB", "MB", "GB", "TB"] function formatBytes(bytes) { if (bytes === 0) return "0 B" const sign = bytes < 0 ? "-" : "" bytes = Math.abs(bytes) const i = Math.floor(Math.log(bytes) / Math.log(1024)) return sign + parseFloat((bytes / Math.pow(1024, i)).toFixed(1)) + " " + sizes[i] } async function loadImage(imagePath) { const img = new Image() if (imagePath.startsWith?.("data:image/png;base64,")) { img.src = imagePath } else { let imageData if (typeof imagePath === "object") { imageData = imagePath } else { imageData = await fs.promises.readFile(imagePath) } const base64Data = imageData.toString("base64") img.src = `data:image/png;base64,${base64Data}` } await img.decode() return img } function confirm(title, message) { return new Promise(fulfil => Blockbench.showMessageBox({ title, message: message + "\n\nThis action cannot be undone!", buttons: ["dialog.confirm", "dialog.cancel"], width: 512 }, b => fulfil(!b))) } function showMessage(title, message) { return new Promise(fulfil => { new Dialog({ id: `${id}-message`, title, lines: [ ``, message ], buttons: ["dialog.ok"], onClose: () => fulfil() }).show() }) } function formatPath(path) { return path.replace(/\\/g, "/") } function exists(path) { return new Promise(async fulfil => { try { await fs.promises.stat(path) fulfil(true) } catch { fulfil(false) } }) } function copyText(evt) { if (event.ctrlKey && event.key === "c") { const selection = window.getSelection() const text = selection.toString() if (text) { let parent = selection.anchorNode.parentElement while (parent) { if (parent.id === "resource_pack_utilities") { navigator.clipboard.writeText(text) break } parent = parent.parentElement } } } } const td = new TextDecoder function parseZip(zip) { const ua = new Uint8Array(zip) const dv = new DataView(zip) const offEOCD = ua.findLastIndex((e, i, a) => e === 0x50 && a[i+1] === 0x4b && a[i+2] === 0x05 && a[i+3] === 0x06) const offCenDir = dv.getUint32(offEOCD + 16, true) const recordCount = dv.getUint16(offEOCD + 10, true) const parsedZip = { buffer: zip, array: ua, view: dv, eocdOffset: offEOCD, centralDirOffset: offCenDir, fileCount: recordCount, files: {} } for (let i = 0, o = offCenDir; i < recordCount; i++) { const n = dv.getUint16(o + 28, true) const m = dv.getUint16(o + 30, true) const k = dv.getUint16(o + 32, true) const encodedPath = ua.subarray(o + 46, o + 46 + n) const filePath = td.decode(encodedPath) if (!filePath.endsWith("/") && (filePath.startsWith("assets/") || ["pack.mcmeta", "version.json", "pack.png"].includes(filePath)) && !/\.(class|nbt|mcassetsroot)$/.test(filePath)) { const h = dv.getUint32(o + 42, true) const q = dv.getUint16(h + 8, true) const t = dv.getUint16(h + 10, true) const d = dv.getUint16(h + 12, true) const s = dv.getUint32(o + 20, true) const a = dv.getUint32(o + 24, true) const e = dv.getUint16(h + 28, true) parsedZip.files[filePath] = { path: filePath, compressedSize: s, size: a, crc32: dv.getUint32(o + 16, true), timeValue: t, dateValue: d, encodedPath, compressionMethod: q, compressedContent: ua.subarray(h + 30 + n + e, h + 30 + n + e + s) } if (q === 0) { parsedZip.files[filePath].content = parsedZip.files[filePath].compressedContent } else { Object.defineProperty(parsedZip.files[filePath], "content", { configurable: true, enumerable: true, get() { const c = zlib.inflateRawSync(this.compressedContent) Object.defineProperty(this, "content", { value: c, configurable: true, enumerable: true }) return c } }) } } o += 46 + n + m + k } return parsedZip } function getVersion(id) { return manifest.versions.find(e => e.id === id) } async function getVersionData(id) { const version = getVersion(id) if (!version) return if (version.data) { return version.data } const vanillaDataPath = PathModule.join(settings.ewan_minecraft_directory.value, "versions", id, id + ".json") if (await exists(vanillaDataPath)) { version.data = JSON.parse(await fs.promises.readFile(vanillaDataPath)) return version.data } const cacheDataPath = PathModule.join(cacheDir, `data_${id}.json`) if (await exists(cacheDataPath)) { version.data = JSON.parse(await fs.promises.readFile(cacheDataPath)) return version.data } version.data = await fetch(version.url).then(e => e.json()) await fs.promises.writeFile(cacheDataPath, JSON.stringify(version.data), "utf-8") return version.data } async function shaCheck(path, sha) { return crypto.createHash("sha1").update(await fs.promises.readFile(path)).digest("hex") === sha } async function getVersionAssetsIndex(id) { const version = await getVersionData(id) if (version.assetsIndex) { return version.assetsIndex } const vanillaAssetsIndexPath = PathModule.join(settings.ewan_minecraft_directory.value, "assets", "indexes", version.assets + ".json") if (await exists(vanillaAssetsIndexPath)) { if (await shaCheck(vanillaAssetsIndexPath, version.assetIndex.sha1)) { version.assetsIndex = JSON.parse(await fs.promises.readFile(vanillaAssetsIndexPath)) return version.assetsIndex } else { version.assetsIndex = await fetch(version.assetIndex.url).then(e => e.json()) await fs.promises.writeFile(vanillaAssetsIndexPath, JSON.stringify(version.assetsIndex), "utf-8") } } const cacheAssetsIndexPath = PathModule.join(cacheDir, `assets_index_${version.assets}.json`) if (await exists(cacheAssetsIndexPath) && await shaCheck(cacheAssetsIndexPath, version.assetIndex.sha1)) { version.assetsIndex = JSON.parse(await fs.promises.readFile(cacheAssetsIndexPath)) return version.assetsIndex } version.assetsIndex = await fetch(version.assetIndex.url).then(e => e.json()) await fs.promises.writeFile(cacheAssetsIndexPath, JSON.stringify(version.assetsIndex), "utf-8") return version.assetsIndex } async function getVersionJar(id) { let jar const jarPath = PathModule.join(settings.ewan_minecraft_directory.value, "versions", id, id + ".jar") if (await exists(jarPath)) { jar = parseZip((await fs.promises.readFile(jarPath)).buffer) output.log(`Using downloaded version of \`${id}\``) } else { const jarPath = PathModule.join(cacheDir, id + ".jar") if (await exists(jarPath)) { jar = parseZip((await fs.promises.readFile(jarPath)).buffer) output.log(`Using cached version of \`${id}\``) } else { output.log(`\`${id}\` was not found on your computer, downloading…`) const version = await getVersionData(id) if (!version) return const client = await fetch(version.downloads.client.url).then(e => e.arrayBuffer()) fs.promises.writeFile(jarPath, new Uint8Array(client)) output.log(`\`${id}\` downloaded`) jar = parseZip(client) } } return jar } function objectsEqual(obj1, obj2) { if (obj1 === obj2) { return true } if (obj1 == null || typeof obj1 !== "object" || obj2 == null || typeof obj2 !== "object") { return false } const keys1 = Object.keys(obj1) const keys2 = Object.keys(obj2) if (keys1.length !== keys2.length) { return false } for (const key of keys1) { if (!(key in obj2) || !objectsEqual(obj1[key], obj2[key])) { return false } } return true } function getRoot(id) { const version = getVersion(id) if (Date.parse(version.releaseTime) >= 1403106748000 || version.data.assets === "1.7.10") { return "assets" } return "assets/minecraft" } function langToJSON(lang) { return Object.fromEntries(lang.split("\n").map(e => e.split(/=(.*)/).filter(e => e)).filter(e => e.length === 2)) } function jsonToLang(json) { return Object.entries(json).map(e => e.join("=")).join("\n") } function sortUtilities() { action2.children.sort((a, b) => { if (a.name === "Show all") return -Infinity if (b.name === "Show all") return Infinity return storage.favourites.findIndex(e => e === a.id) - storage.favourites.findIndex(e => e === b.id) }) } function getDate() { return new Date().toISOString().replace(/T/, "_").replace(/:/g, "-").split(".")[0] } function formatFilePaths(paths) { const tree = {} paths.map(filePath => filePath.split(/\/|\\/)).forEach(filePath => { let branch = tree filePath.slice(0, -1).forEach(directory => { if (!branch[directory]) { branch[directory] = {} } branch = branch[directory] }) branch[filePath[filePath.length - 1]] = true }) const lines = [] function branchToString(branch, indentLevel = 0) { for (const [key, value] of Object.entries(branch)) { lines.push(" ".repeat(indentLevel) + key) if (typeof value === "object") { branchToString(value, indentLevel + 1) } } } branchToString(tree) return lines.join("\n") } function rowBlank(imageData, width, y) { for (let x = 0; x < width; ++x) if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false return true } function columnBlank(imageData, width, x, top, bottom) { for (let y = top; y < bottom; ++y) if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false return true } class Canvas extends CanvasFrame { constructor(width, height) { super(width, height) this.canvas.ctx = this.ctx this.canvas.trim = this.trim return this.canvas } trim() { const imageData = this.ctx.getImageData(0, 0, this.width, this.height) let top = 0, bottom = imageData.height, left = 0, right = imageData.width while (top < bottom && rowBlank(imageData, this.width, top)) ++top while (bottom - 1 > top && rowBlank(imageData, this.width, bottom - 1)) --bottom while (left < right && columnBlank(imageData, this.width, left, top, bottom)) ++left while (right - 1 > left && columnBlank(imageData, this.width, right - 1, top, bottom)) --right if (top === bottom && bottom === left && left === right) { this.width = 1 this.height = 1 return this } const trimmed = this.ctx.getImageData(left, top, right - left, bottom - top); const copy = new Canvas(this.width, this.height) copy.width = trimmed.width copy.height = trimmed.height copy.ctx.putImageData(trimmed, 0, 0) this.width = copy.width this.height = copy.height this.ctx.clearRect(0, 0, this.width, this.height) this.ctx.drawImage(copy, 0, 0) return this } } function imageToCanvas(img) { const canvas = new Canvas(img.width, img.height) canvas.ctx.drawImage(img, 0, 0) return canvas } function arrayBufferToBase64(buffer) { let binary = "" const bytes = new Uint8Array(buffer) for (let i = 0; i < bytes.length; i += 8192) { binary += String.fromCharCode.apply(null, bytes.subarray(i, i + 8192)) } return btoa(binary) } async function getObject(filePath, version, assetsIndex) { if (!assetsIndex) { assetsIndex = await getVersionAssetsIndex(version) } const root = getRoot(version) const data = assetsIndex.objects[filePath.slice(root.length + 1)] const objectPath = `${data.hash.slice(0, 2)}/${data.hash}` const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, "assets", "objects", objectPath) if (await exists(vanillaObjectPath)) { return fs.promises.readFile(vanillaObjectPath) } const cacheObjectPath = PathModule.join(cacheDir, "objects", objectPath) if (await exists(cacheObjectPath)) { return fs.promises.readFile(cacheObjectPath) } const object = Buffer.from(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer())) await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true }) await fs.promises.writeFile(cacheObjectPath, object) output.log(`Downloaded \`${filePath}\` to the cache`) return object } // Constants const header = `Generated by the Resource Pack Utilities plugin for Blockbench: https://ewanhowell.com/plugins/${id.replace(/_/g, "-")}/\n\n` const releasePattern = new RegExp("^[\\d\\.]+$") const invalidDirPattern = new RegExp('[\\\\/:*?"<>|`]') const simpleFilePattern = new RegExp("\\.(fsh|vsh|glsl|txt|ogg|zip|icns)$") const batchExporterFormats = Object.fromEntries(Object.entries(Formats).filter(([id, format]) => format.codec?.compile && format.codec.extension && format.codec.extension !== "bbmodel").map(e => [e[0], { name: e[1].name, type: e[1].codec?.extension }])) const batchExporterSpecialFormats = ["gltf", "obj", "fbx", "collada"] Object.assign(batchExporterFormats, { gltf: { name: "glTF", type: "gltf" }, obj: { name: "OBJ", type: "obj" }, fbx: { name: "FBX", type: "fbx" }, collada: { name: "Collada (dae)", type: "dae" } }) const components = { folderSelector: { props: { value: {}, placeholder: { default: "Folder" } }, data() { return { folder: this.value ?? "", dragging: false } }, watch: { value(newVal) { this.folder = newVal } }, methods: { selectFolder(title = "folder") { const dir = Blockbench.pickDirectory({ title: `Select the ${title}`, startpath: this.folder || PathModule.join(settings.ewan_minecraft_directory.value, "resourcepacks") }) if (dir) { this.folder = dir this.$emit("input", this.folder) } }, input() { this.$emit("input", this.folder) }, onDragOver(event) { if (!event.dataTransfer?.types?.includes("Files")) return event.preventDefault() event.stopPropagation() this.dragging = true }, onDragLeave(event) { event.stopPropagation() if (event.currentTarget.contains(event.relatedTarget)) return this.dragging = false }, async onDrop(event) { event.preventDefault() event.stopPropagation() this.dragging = false const file = event.dataTransfer.files[0] if (!file?.path) return try { const stat = await fs.promises.stat(file.path) if (!stat.isDirectory()) return } catch { return } this.folder = file.path this.$emit("input", this.folder) }, formatPath }, computed: { buttonText() { return this.$slots.default[0].text } }, styles: ` .folder-selector { display: flex; cursor: pointer; } .folder-selector.dragging { outline: 2px dashed var(--color-accent); outline-offset: 2px; } input { flex: 1; pointer-events: none; direction: rtl; text-overflow: ellipsis; text-align: left; } `, template: `
    ` }, checkboxRow: { props: ["value", "disabled"], styles: ` label { display: flex; gap: 4px; align-items: center; cursor: pointer; * { cursor: pointer; } &.disabled { cursor: not-allowed; * { color: var(--color-subtle_text); cursor: not-allowed; } } } `, template: ` ` }, radioRow: { props: ["value", "options"], data() { return { name: "radio-" + Math.random() } }, watch: { value(val) { this.$emit("input", val) } }, styles: ` input { min-width: 30px; text-align: center; } label { display: flex; gap: 4px; cursor: pointer; align-items: center; * { cursor: pointer; } } `, template: ` ` }, inputRow: { props: ["value", "placeholder", "width", "required"], styles: ` display: flex; gap: 8px; align-items: center; input { flex: 1; } .required { border: 1px solid var(--color-error); animation: shake .5s ease-in-out; } `, template: `
    :
    ` }, ignoreList: { props: ["value"], data() { return { newWord: "", ignoreList: this.value } }, watch: { value(val) { this.ignoreList = val }, ignoreList(val) { this.$emit("input", val) } }, methods: { addWord() { if (this.newWord && !this.ignoreList.includes(this.newWord.toLowerCase())) { this.ignoreList.push(this.newWord.toLowerCase()) } this.newWord = "" setTimeout(() => this.$refs.input.focus(), 0) }, load() { Blockbench.import({ title: "Load Ignore List", extensions: ["json"], type: "JSON" }, files => { try { const data = JSON.parse(files[0].content) if (!Array.isArray(data) || data.some(e => typeof e !== "string")) { throw new Error } this.ignoreList = Array.from(new Set(data.map(e => e.toLowerCase().trim()))) } catch { Blockbench.showQuickMessage("Invalid ignore list") } }) }, save() { if (!this.ignoreList.length) { Blockbench.showQuickMessage("The ignore list is empty") return } Blockbench.export({ extensions: ["json"], type: "JSON", name: "ignore_list", content: JSON.stringify(this.ignoreList, null, 2) }, () => Blockbench.showQuickMessage("Exported Ignore List")) } }, styles: ` display: flex; flex-direction: column; gap: 8px; > div { display: flex; } input { flex: 1; } ul { background-color: var(--color-back); border: 1px solid var(--color-border); height: 128px; overflow-y: auto; } li { display: flex; align-items: center; gap: 8px; justify-content: space-between; padding-left: 8px; background-color: var(--color-ui); &:not(:first-child) { margin-top: 1px; } button { opacity: 0; } &:hover button { opacity: 1; } } .ignore-list-header { display: flex; align-items: center; gap: 8px; margin-bottom: -8px; h3 { flex: 1; margin: 0; } .tool { margin: 0; width: initial; height: initial; cursor: pointer; } i { margin: 0; } } `, template: `

    Ignore List

    Load Ignore List
    upload
    Export Ignore List
    save

    Files and folders that include these terms will
    be ignored

    • {{ term }}
    ` }, outputLog: { props: { value: {}, small: { type: Boolean } }, data() { return { logs: this.value, waiting: false } }, watch: { value(val) { if (this.waiting) return this.waiting = true setTimeout(() => { this.logs = val.slice() this.waiting = false }, 100) }, logs() { if (this.$refs.log.scrollTop >= this.$refs.log.scrollHeight - this.$refs.log.clientHeight) { this.$nextTick(() => { this.scrollToBottom() }) } } }, methods: { scrollToBottom() { const container = this.$refs.log container.scrollTop = container.scrollHeight }, copy() { navigator.clipboard.writeText(this.value.map(e => e[1]).join("\n\n").replaceAll("`", "")) Blockbench.showQuickMessage("Log copied") }, save() { Blockbench.export({ extensions: ["log"], type: "Log file", name: "log", content: this.value.map(e => e[1]).join("\n\n").replaceAll("`", "") }, () => Blockbench.showQuickMessage("Saved log")) } }, mounted() { const el = this.$refs.log el.scrollTop = el.scrollHeight }, styles: ` .log { height: 256px; overflow-y: auto; overflow-x: hidden; font-family: var(--font-code); background-color: var(--color-back); border: 1px solid var(--color-border); > * { user-select: text; cursor: text; white-space: pre-wrap; max-width: 100%; overflow-wrap: anywhere; padding: 4px 4px 4px 24px; position: relative; font-size: 13px; &:not(:last-child) { border-bottom: 1px solid var(--color-border); } &::before { content: ">"; position: absolute; left: 8px; } code { background-color: var(--color-dark); border-color: var(--color-dark); } } .info { background-color: color-mix(in srgb, var(--color-accent) 25%, transparent); } .warn { background-color: color-mix(in srgb, var(--color-warning) 25%, transparent); } .error { background-color: color-mix(in srgb, var(--color-error) 25%, transparent); } span { color: var(--color-accent); text-decoration: underline; cursor: pointer; } } .small { height: 128px; } .buttons { display: flex; gap: 8px; margin-top: 8px; button { flex: 1; } } `, template: `
    {{ (logs.length - 1000).toLocaleString() }} log entries are not displayed. Save Log to see the full log
    ` }, progressBar: { props: ["done", "total"], data() { return { displayedDone: 0, waiting: false } }, watch: { done(val) { if (this.waiting) return this.waiting = true setTimeout(() => { this.displayedDone = this.done this.waiting = false }, 500) } }, computed: { progressPercentage() { if (!this.displayedDone) return 0 return Math.round(this.displayedDone / this.total * 100) } }, styles: ` display: flex; flex-direction: column; gap: 8px; .progress-bar-container { width: 100%; height: 24px; background-color: var(--color-back); position: relative; } .progress-bar { height: 100%; background-color: var(--color-accent); position: absolute; top: 4px; left: 4px; height: 16px; transition: width .5s ease; } div { text-align: center; } `, template: `
    {{ total === null ? "Loading…" : displayedDone === total ? "Finished" : "Processing…" }}
    {{ displayedDone }} / {{ total }} - {{ progressPercentage }}%
    {{ progressPercentage }}%
    ` }, versionSelector: { props: { value: {}, width: { default: 120 } }, data() { return { version: this.value || manifest.versions.find(e => releasePattern.test(e.id))?.id, snapshots: this.value ? !releasePattern.test(this.value) : false, manifest, releasePattern } }, watch: { manifest: { handler(val) { if (this.value) return if (this.snapshots) { this.version = val.versions.find(e => !releasePattern.test(e.id)).id } else { this.version = val.versions.find(e => releasePattern.test(e.id)).id } }, deep: true }, version: { handler(val, oldVal) { this.$emit("input", val) }, immediate: true } }, methods: { change() { this.version = this.manifest.versions.find(e => this.snapshots ? !releasePattern.test(e.id) : releasePattern.test(e.id)).id } }, styles: ` display: flex; align-items: center; gap: 8px; .bb-select { flex: 1; min-width: 100px; } label { display: flex; align-items: center; gap: 4px; cursor: pointer; * { cursor: pointer; } } `, template: `
    Minecraft Version:
    ` }, selectRow: { props: ["value", "options", "width"], watch: { value(val) { this.$emit("input", val) } }, styles: ` display: flex; gap: 8px; align-items: center; .bb-select { flex: 1; } `, template: `
    :
    ` }, fileInput: { props: { value: {}, type: { default: "PNG", }, extensions: { default: ["png"] }, multiple: { type: Boolean }, max: {}, title: {} }, data() { const maxFiles = parseInt(this.max) const multipleFiles = this.multiple || parseInt(this.max) > 1 this.title ??= `Select ${ maxFiles ? "up to " + maxFiles : "" } ${ multipleFiles ? "files" : "a file" }` return { files: Array.isArray(this.value) ? this.value : this.value ? [this.value] : [], message: `select or drop ${ maxFiles ? "up to " + maxFiles : "" } ${ multipleFiles ? "files" : "a file" }`, maxFiles, multipleFiles, dragging: false } }, methods: { async ingestFiles(files) { if (!files.length) return if (files.length === 1 && this.type === "PNG") this.message = "change file" else if (files.length === 1) this.message = files[0].name else this.message = `${files.length} files selected` this.files = [] for (const [i, file] of files.entries()) { if (this.maxFiles && i >= this.maxFiles) { continue } const buf = file.content instanceof Buffer ? file.content : Buffer.from(file.content ?? await file.arrayBuffer()) const data = {} if (this.type === "PNG") { const b64Image = buf.toString("base64") const img = await loadImage(buf) data.image = img data.src = `data:image/png;base64,${b64Image}` data.info = `${file.name}\n${img.width.toLocaleString()}x${img.height.toLocaleString()} - ${formatBytes(buf.byteLength)}` } data.content = buf data.path = file.path data.name = file.name this.files.push(data) } this.$emit("input", Array.isArray(this.value) ? this.files : this.files[0]) }, async changeFiles() { Blockbench.import({ title: this.title, extensions: this.extensions, type: this.type, multiple: this.multipleFiles, readtype: "buffer" }, files => this.ingestFiles(files)) }, onDragOver(event) { if (!event.dataTransfer?.types?.includes("Files")) return event.preventDefault() event.stopPropagation() this.dragging = true }, onDragLeave(event) { event.stopPropagation() if (event.currentTarget.contains(event.relatedTarget)) return this.dragging = false }, async onDrop(event) { event.preventDefault() event.stopPropagation() this.dragging = false const dropped = Array.from(event.dataTransfer.files) const exts = this.extensions.map(e => e.toLowerCase()) const filtered = dropped.filter(f => exts.some(e => f.name.toLowerCase().endsWith("." + e))) if (!filtered.length) return await this.ingestFiles(this.multipleFiles ? filtered : filtered.slice(0, 1)) }, remove(index) { event.stopPropagation() this.files.splice(index, 1) this.$emit("input", Array.isArray(this.value) ? this.files : this.files[0]) if (!this.files.length) this.message = `select or drop ${ this.maxFiles ? "up to " + this.maxFiles : "" } ${ this.multipleFiles ? "files" : "a file" }` else if (this.files.length === 1) this.message = "change file" else this.message = `${this.files.length} files selected` }, prev(index) { const file = this.files[index - 1] this.$set(this.files, index - 1, this.files[index]) this.$set(this.files, index, file) this.$emit("input", this.files) }, next(index) { const file = this.files[index + 1] this.$set(this.files, index + 1, this.files[index]) this.$set(this.files, index, file) this.$emit("input", this.files) } }, styles: ` background-color: var(--color-back); border: 1px solid var(--color-border); > div.dragging { outline: 2px dashed var(--color-accent); outline-offset: -4px; } > div { padding: 16px; user-select: none; position: relative; text-shadow: none; display: flex; flex-direction: column; gap: 16px; align-items: flex-start; &:not(:has(.file-input-images:hover)):hover button { background-color: var(--color-accent); color: var(--color-accent_text); } &:not(:has(.file-input-images:focus)):focus button { text-decoration: underline; } } * { cursor: pointer; } .file-input-row { display: flex; align-items: center; gap: 8px; max-width: 100%; } .file-input-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .file-input-images { display: flex; gap: 8px; overflow-x: auto; position: relative; z-index: 1; margin: 0 -16px -16px; padding: 0 16px 6px; width: calc(100% + 32px); cursor: default; justify-content: safe center; * { cursor: default; } > div { display: flex; flex-direction: column; font-size: 14px; color: var(--color-subtle_text); align-items: center; gap: 4px; white-space: pre; text-align: center; font-weight: 600; &:first-child .prev { display: none; } &:last-child .next { display: none; } } } .file-image { position: relative; display: flex; & img { height: 128px; display: block; } .icon { position: absolute; color: var(--color-light); top: 64px; transform: translateY(-50%); cursor: pointer; font-size: 32px; min-width: 32px; filter: drop-shadow(0 2px 3px #000); opacity: 0; &:hover { transform: translateY(-50%) scale(1.4); } } &:hover .icon { opacity: 1; } } .prev { left: 0; } .next { right: 0; } .remove { top: 0 !important; right: 0; font-size: 24px !important; padding: 4px; transform: initial !important; &:hover { transform: scale(1.2) !important; } } `, template: `
    {{ this.message }}
    close navigate_before navigate_next
    {{ file.info }}
    ` }, canvasOutput: { props: { value: {}, name: { default: "image", }, type: { default: "PNG" }, error: {}, height: {} }, mounted() { this.appendCanvas() }, watch: { value() { this.appendCanvas() }, error() { this.appendCanvas() } }, methods: { async appendCanvas() { if (this.value) { this.$refs.canvasContainer.textContent = "" if (this.type === "GIF") { const img = document.createElement("img") img.src = `data:image/gif;base64,${arrayBufferToBase64(this.value)}` this.$refs.canvasContainer.append(img) this.$refs.canvasInfo.textContent = `${this.name}.gif\n${this.value[6] + (this.value[7] << 8)}x${this.value[8] + (this.value[9] << 8)} - ${formatBytes(this.value.length)}` } else { this.value.classList.add("checkerboard") if (this.height) { this.value.style.height = this.height + "px" } this.$refs.canvasContainer.append(this.value) this.$refs.canvasInfo.textContent = `${this.name}.png\n${this.value.width}x${this.value.height} - ${formatBytes((await (await new Promise(fulfil => this.value.toBlob(fulfil))).arrayBuffer()).byteLength)}` } } else { if (this.error) { this.$refs.canvasContainer.innerHTML = `${this.error}` } else { this.$refs.canvasContainer.textContent = "No output yet…" } this.$refs.canvasInfo.textContent = "" } }, async copy() { const r = await fetch(this.value.toDataURL()) navigator.clipboard.write([new ClipboardItem({ "image/png": await r.blob() })]) Blockbench.showQuickMessage("Copied to clipboard…") }, save() { if (this.type === "GIF") { Blockbench.export({ extensions: ["gif"], type: "GIF", name: this.name, savetype: "binary", content: this.value }, () => Blockbench.showQuickMessage("Saved…")) } else { Blockbench.export({ extensions: [this.type.toLowerCase()], type: this.type, name: this.name, savetype: "image", content: this.value.toDataURL() }, () => Blockbench.showQuickMessage("Saved…")) } } }, styles: ` display: flex; flex-direction: column; gap: 8px !important; flex: 1; .canvas-container { background-color: var(--color-back); border: 1px solid var(--color-border); padding: 16px; font-size: 14px; color: var(--color-subtle_text); display: flex; flex-direction: column; align-items: center; white-space: pre; text-align: center; gap: 4px; font-weight: 600; > :first-child { overflow-x: auto; max-width: 100%; } > :empty { display: none; } } canvas, img { height: 256px; display: block; } .canvas-output-error { color: var(--color-error); } `, template: `
    ` }, tabSelect: { props: ["value", "options"], watch: { value(val) { this.$emit("input", val) } }, styles: ` li { flex: 1 1 0px; } `, template: `
    • {{ name }}
    ` }, numSlider: { props: { value: {}, min: { default: 0 }, max: { default: 100 }, step: { default: 1 } }, watch: { value(val) { this.$emit("input", val) } }, template: `
    ` }, numInputRow: { props: { value: {}, min: { default: 0 }, max: { default: 100 }, step: { default: 1 }, width: {} }, watch: { value(val) { this.$emit("input", val) } }, styles: ` display: flex; gap: 8px; align-items: center; `, template: `
    :
    ` }, searchBar: { props: { value: String, placeholder: { type: String, default: "Search…" }, autofocus: { type: Boolean, default: true } }, mounted() { if (!this.autofocus) return this.$nextTick(() => { if (!this.$refs.search) return this.$refs.search.focus() this.$refs.search.selectionStart = this.$refs.search.value.length this.$refs.search.selectionEnd = this.$refs.search.value.length }) }, styles: ` .search_bar { width: 100%; display: flex; float: initial; input { padding-right: 32px; text-overflow: ellipsis; } i { pointer-events: none; &.active { pointer-events: initial; cursor: pointer; } } } `, template: ` ` } } const utilities = { jsonOptimiser: { name: "JSON Optimiser", icon: "code", tagline: "Optimise every JSON file in a folder.", description: "JSON Optimiser is a tool that will go through all JSON files in a folder and optimise them to be as small as possible, minifying them and removing any unnecessary data.", info: `

    Changes that JSON Optimiser makes:

    • Minifies .json, .mcmeta, .jem, and .jpm files
    • Removes default credits. Custom credits are kept
    • Removes unnecessary keys
    • Removes minecraft: prefixes
    • For block/item model .json files
      • Removes the groups object
      • For the textures object:
        • Removes the force_translucent property when it is set to false
        • Collapses the object form to the string form when only sprite remains
      • For the rotation object:
        • Removes the rotation object when angle is set to 0 (single-axis format)
        • Removes x, y, and z properties when they are set to 0 (Euler format)
        • Removes the rotation object when x, y, and z are all 0 or absent (Euler format)
        • Removes the rescale property when it is set to false
      • For the faces object:
        • Removes the rotation property when it is set to 0
        • Removes the tintindex property when it is set to -1
        • Removes the uv property when it matches the auto-generated value from the element's from/to (only when rotation is unset)
        • Removes empty face objects
      • Removes the shade property when it is set to true
      • Removes the light_emission property when it is set to 0
      • Removes empty elements arrays
    • For animation .mcmeta files
      • Removes the file when the texture it is for does not exist
      • Removes the interpolate property when it is set tofalse
      • Removes the frametime property when it is set to1
      • Removes the width property when the frames are square
      • Removes the height property when the frames are square
      • For the frames array
        • Removes the time property when it matches the main frametime property
        • Removes the frames array when all the frames are present, in order, and match the main frametime property
        • Changes most common time property to be the main frametime property, and makes old the main frametime property into the time properties
    • For OptiFine CEM .jem/.jpm files
      • Removes the animations array when it is empty
      • Removes the translation array when all axes are set to 0
      • Removes the rotation array when all axes are set to 0
      • Removes the scale property when it is set to 1
      • Removes empty boxes arrays
      • Removes empty sprites arrays
      • Removes empty submodel objects
      • Removes empty submodels arrays
    `, component: { data: { folder: "", types: { json: true, mcmeta: true, jem: true, jpm: true }, prefixes: true, minify: true, ignoreList: [], outputLog, done: 0, total: null, cancelled: false }, methods: { async execute() { if (!await confirm("Run JSON Optimiser?", `Are you sure you want to run JSON Optimiser over the following folder:\n${formatPath(this.folder)}\n\nMake a backup first if you would like to keep an un-optimised version of the folder.`)) return outputLog.length = 0 this.status.finished = false this.status.processing = true this.done = 0 this.total = null this.cancelled = false if (!await exists(this.folder)) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The folder \`${formatPath(this.folder)}\` was not found`) return } const mcmetaKeys = [ "credit", "animation", "villager", "texture", "pack", "language", "filter", "overlays", "gui" ] const animationKeys = [ "interpolate", "width", "height", "frametime", "frames" ] const jemKeys = [ "credit", "texture", "textureSize", "shadowSize", "models" ] const modelKeys = [ "model", "id", "part", "attach", "scale", "animations" ] const partKeys = [ "id", "texture", "textureSize", "invertAxis", "translate", "rotate", "mirrorTexture", "boxes", "sprites", "submodel", "submodels" ] const boxKeys = [ "textureOffset", "uvDown", "uvUp", "uvNorth", "uvSouth", "uvWest", "uvEast", "coordinates", "sizeAdd" ] const spriteKeys = [ "textureOffset", "coordinates", "sizeAdd" ] const elementKeys = [ "from", "to", "rotation", "faces", "shade", "light_emission" ] const faceKeys = [ "uv", "texture", "cullface", "rotation", "tintindex" ] modelKeys.push(...partKeys) function processPart(part, rootMode) { for (const key in part) { if (!(rootMode ? partKeys.concat(modelKeys) : partKeys).includes(key)) delete part[key] } if (part.translate && part.translate.every(e => !e)) delete part.translate if (part.rotate && part.rotate.every(e => !e)) delete part.rotate if (part.scale === 1) delete part.scale if (part.boxes) { for (const box of part.boxes) { for (const key in box) { if (!boxKeys.includes(key)) delete box[key] } } part.boxes = part.boxes.filter(e => Object.keys(e).length) if (!part.boxes.length) delete part.boxes } if (part.sprites) { for (const sprite of part.sprites) { for (const key in sprite) { if (!spriteKeys.includes(key)) delete sprite[key] } } part.sprites = part.sprites.filter(e => Object.keys(e).length) if (!part.sprites.length) delete part.sprites } if (part.submodel) { processPart(part.submodel) if (!Object.keys(part.submodel).length) delete part.submodel } if (part.submodels) { for (const submodel of part.submodels) { processPart(submodel) } part.submodels = part.submodels.filter(e => Object.keys(e).length) if (!part.submodels.length) delete part.submodels } } const files = [] for await (const file of getFiles(this.folder)) { const shortened = formatPath(file.slice(this.folder.length)).replace(/^\//, "") if ( (file.endsWith(".json") && !this.types.json) || (file.endsWith(".mcmeta") && !this.types.mcmeta) || (file.endsWith(".jem") && !this.types.jem) || (file.endsWith(".jpm") && !this.types.jpm) || !(file.endsWith(".json") || file.endsWith(".mcmeta") || file.endsWith(".jem") || file.endsWith(".jpm")) || this.ignoreList.some(item => shortened.toLowerCase().includes(item)) ) continue files.push([file, shortened]) } this.total = files.length let beforeTotal = 0 let afterTotal = 0 for (const [file, shortened] of files) { if (this.cancelled) break const before = (await fs.promises.stat(file)).size beforeTotal += before let data try { data = JSON.parse((await fs.promises.readFile(file, "utf-8")).trim()) } catch (err) { output.error(`Skipping \`${shortened}\` as it could not be read`) this.done++ continue } if (data.credit === "Made with Blockbench") delete data.credit if (this.types.json && file.endsWith(".json")) { delete data.groups if (data.textures) { for (const [key, value] of Object.entries(data.textures)) { if (value && typeof value === "object" && typeof value.sprite === "string") { if (value.force_translucent === false) delete value.force_translucent if (Object.keys(value).length === 1) data.textures[key] = value.sprite } } } if (data.elements) { for (const element of data.elements) { for (const key in element) { if (!elementKeys.includes(key)) delete element[key] } if (element.rotation) { const rot = element.rotation if ("angle" in rot) { if (rot.angle === 0) delete element.rotation else if (rot.rescale === false) delete rot.rescale } else { if (rot.x === 0) delete rot.x if (rot.y === 0) delete rot.y if (rot.z === 0) delete rot.z if (rot.x === undefined && rot.y === undefined && rot.z === undefined) { delete element.rotation } else if (rot.rescale === false) { delete rot.rescale } } } if (element.faces) { let autoUv if (Array.isArray(element.from) && Array.isArray(element.to) && element.from.length === 3 && element.to.length === 3) { const [x1, y1, z1] = element.from const [x2, y2, z2] = element.to autoUv = { down: [x1, 16 - z2, x2, 16 - z1], up: [x1, z1, x2, z2], north: [16 - x2, 16 - y2, 16 - x1, 16 - y1], south: [x1, 16 - y2, x2, 16 - y1], west: [z1, 16 - y2, z2, 16 - y1], east: [16 - z2, 16 - y2, 16 - z1, 16 - y1] } } for (const [key, face] of Object.entries(element.faces)) { for (const key in face) { if (!faceKeys.includes(key)) delete face[key] } if (face.rotation === 0) delete face.rotation if (face.tintindex === -1) delete face.tintindex if ( autoUv && autoUv[key] && !face.rotation && Array.isArray(face.uv) && face.uv.length === 4 && face.uv.every((v, i) => v === autoUv[key][i]) ) delete face.uv if (!Object.keys(face).length) delete element.faces[key] } } if (element.shade) delete element.shade if (element.light_emission === 0) delete element.light_emission } data.elements = data.elements.filter(e => e.faces && Object.keys(e.faces).length) if (!data.elements.length) delete data.elements } } if (this.types.mcmeta && file.endsWith(".mcmeta")) { if (file.endsWith(".png.mcmeta")) { if (!fs.existsSync(file.slice(0, -7))) { fs.rmSync(file) output.log(`\`${shortened}\`\nBefore: ${formatBytes(before)}\nAfter: 0 B`) this.done++ continue } } for (const key in data) { if (!mcmetaKeys.includes(key)) delete data[key] } if (data.pack) { for (const key in data.pack) { if (!(key === "pack_format" || key === "min_format" || key === "max_format" || key === "supported_formats" || key === "description")) delete data.pack[key] } } else if (data.animation) { for (const key in data.animation) { if (!animationKeys.includes(key)) delete data.animation[key] } if (data.animation.interpolate === false) delete data.animation.interpolate if (data.animation.frametime === 1) delete data.animation.frametime if (data.animation.width && !data.animation.height) { const img = await loadImage(file.slice(0, -7)) if (data.animation.width === img.height) delete data.animation.width } if (data.animation.height && !data.animation.width) { const img = await loadImage(file.slice(0, -7)) if (data.animation.height === img.width) delete data.animation.height } if (data.animation.frames) { const frametime = data.animation.frametime ?? 1 data.animation.frames = data.animation.frames.map(e => { if (e.time === frametime) return e.index return e }) if (data.animation.frames.every((e, i) => e === i)) { const img = await loadImage(file.slice(0, -7)) if (data.animation.frames.length === img.height / img.width) delete data.animation.frames } else { const times = new Map data.animation.frames.forEach(e => { if (typeof e === "number") { times.set(frametime, (times.get(frametime) ?? 0) + 1) } else { times.set(e.time, (times.get(e.time) ?? 0) + 1) } }) const largest = Array.from(times).reduce((a, e) => { if (a[1] > e[1]) return a return e }, [1, 0]) if (frametime !== largest[0]) { data.animation.frametime = largest[0] data.animation.frames = data.animation.frames.map(e => { if (typeof e === "number") return { index: e, time: frametime } if (e.time === largest[0]) return e.index return e }) } } } } } if (this.types.jem && file.endsWith(".jem")) { for (const key in data) { if (!jemKeys.includes(key)) delete data[key] } if (data.models) { for (const model of data.models) { for (const key in model) { if (!modelKeys.includes(key)) delete model[key] } if (!model.animations?.length) delete model.animations processPart(model, true) } data.models = data.models.map(e => { if (e.boxes || e.submodel || e.submodels || e.model || e.sprites) return e return { part: e.part } }) if (!data.models.length) { for (const key in data) delete data[key] } } } if (this.types.jpm && file.endsWith(".jpm")) { processPart(data) } let out if (this.minify) { out = JSON.stringify(data) } else { out = compileJSON(data, { indentation: " " }) } if (this.prefixes) { out = out.replace(/(?

    Folder to Optimise:

    folder to optimise the JSON of Optimise .json files Optimise .mcmeta files Optimise .jem files Optimise .jpm files Remove minecraft: prefixes Minify output
    ` } }, citOptimiser: { name: "CIT Optimiser", icon: "coffee", tagline: "Optimise the OptiFine CIT properties files in a folder.", description: "CIT Optimiser is a tool that will go through all properties files in an OptiFine CIT folder and optimise them to be as small as possible, removing any unnecessary data.", info: `

    Changes that CIT Optimiser makes:

    • Removes the type=item property
    • Replaces matchItems with items
    • Removes the minecraft: prefix
    • Removes blank lines
    `, component: { data: { folder: "", ignoreList: [], outputLog, done: 0, total: null, cancelled: false }, methods: { async execute() { if (!await confirm("Run CIT Optimiser?", `Are you sure you want to run CIT Optimiser over the following folder:\n${formatPath(this.folder)}\n\nMake a backup first if you would like to keep an un-optimised version of the folder.`)) return outputLog.length = 0 this.status.finished = false this.status.processing = true this.done = 0 this.total = null this.cancelled = false if (!await exists(this.folder)) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The folder \`${formatPath(this.folder)}\` was not found`) return } const files = [] for await (const file of getFiles(this.folder)) { const shortened = formatPath(file.slice(this.folder.length)).replace(/^\//, "") if ( !file.endsWith(".properties") || this.ignoreList.some(item => shortened.toLowerCase().includes(item)) ) continue files.push([file, shortened]) } this.total = files.length let beforeTotal = 0 let afterTotal = 0 for (const [file, shortened] of files) { if (this.cancelled) break const before = (await fs.promises.stat(file)).size beforeTotal += before let data try { data = (await fs.promises.readFile(file, "utf-8")).trim() } catch (err) { output.error(`Skipping \`${shortened}\` as it could not be read`) this.done++ continue } data = data.replace(/(type=item\n?|minecraft:)/g, "") data = data.replace(/matchItems/g, "items") data = data.replace(/\n{2,}/g, "\n") await fs.promises.writeFile(file, data, "utf-8") const after = (await fs.promises.stat(file)).size afterTotal += after output.log(`\`${shortened}\`\nBefore: ${formatBytes(before)}\nAfter: ${formatBytes(after)}`) this.done++ } this.total = this.done output.info(`Compressed ${this.total} files\nBefore: ${formatBytes(beforeTotal)}\nAfter: ${formatBytes(afterTotal)}\nSaved: ${formatBytes(beforeTotal - afterTotal)}`) this.status.processing = false this.status.finished = true } }, template: `

    Folder to Optimise:

    folder to optimise the CIT properties files of
    ` } }, packCreator: { name: "Pack Creator", icon: "create_new_folder", tagline: "Create template resource packs and get the vanilla assets.", description: "Pack Creator is a tool that allows you to create template resource packs, as well as get the vanilla textures, models, sounds, etc…", component: { data: { folder: "", name: "", description: "", attemptedStart: false, assets: false, objects: false, create: { blockstates: false, models: false, optifine: false, textures: false, sounds: false, emissive: false }, cancelled: false, outputLog, version: "", done: 0, total: null }, created() { this.folder = formatPath(PathModule.join(settings.ewan_minecraft_directory.value, "resourcepacks")) }, methods: { async execute() { this.name = this.name.trim() this.description = this.description.trim() if (!this.name) { return this.attemptedStart = true } if (this.assets) { await showMessage("Vanilla assets notice", "The vanilla assets are only to be used as a template!\n\nBefore releasing your resource pack, make sure to remove any unmodified vanilla assets from your resource pack.\n\nYou can use the Pack Cleaner utility to quickly and easily remove all unmodified assets from your pack.") } outputLog.length = 0 this.done = 0 this.total = null if (invalidDirPattern.test(this.name)) { output.error(`The name cannot include the following characters: \`\\\/:*?"<>|\uE000\``) this.status.finished = true this.total = 0 return } if (!await exists(this.folder)) { output.error(`The folder \`${formatPath(this.folder)}\` was not found`) this.status.finished = true this.total = 0 return } const folder = PathModule.join(this.folder, this.name) if (await exists(folder)) { output.error(`The resource pack \`${formatPath(this.folder)}/${this.name}\` already exists`) this.status.finished = true this.total = 0 return } this.cancelled = false this.status.finished = false this.status.processing = true const jar = await getVersionJar(this.version) if (this.assets) { output.log("Extracting vanilla assets…") const entries = Object.entries(jar.files) let totalAssets = entries.length let objectsEntries if (this.objects) { const assetsIndex = await getVersionAssetsIndex(this.version) objectsEntries = Object.entries(assetsIndex.objects) totalAssets += objectsEntries.length } this.total = totalAssets + Object.values(this.create).filter(e => e).length + 3 const paths = new Set for (const [file, data] of entries) { paths.add(PathModule.join(folder, PathModule.dirname(file))) } for (const path of paths) { await fs.promises.mkdir(path, { recursive: true }) } for (let i = 0; i < entries.length; i += 256) { if (this.cancelled) { this.status.finished = true this.status.processing = false output.info("Cancelled") this.total = this.done return } const files = [] for (const [file, data] of entries.slice(i, i + 256)) { if (file === "version.json" || file === "pack.mcmeta") { this.done++ continue } files.push(new Promise(async fulfil => { await fs.promises.writeFile(PathModule.join(folder, file), data.content) output.log(`Extracted \`${file}\``) this.done++ fulfil() })) } await Promise.all(files) } output.log("Extracted vanilla assets") if (this.objects) { output.log("Extracting objects…") const root = getRoot(this.version) const paths = new Set for (const [file, data] of objectsEntries) { if (file.startsWith("icons/")) continue paths.add(PathModule.join(folder, root, PathModule.dirname(file))) } for (const path of paths) { await fs.promises.mkdir(path, { recursive: true }) } for (let i = 0; i < objectsEntries.length; i += 256) { if (this.cancelled) { this.status.finished = true this.status.processing = false output.info("Cancelled") this.total = this.done return } const files = [] for (const [file, data] of objectsEntries.slice(i, i + 256)) { if (file === "pack.mcmeta" || file.startsWith("icons/")) { this.done++ continue } files.push(new Promise(async fulfil => { const objectPath = `${data.hash.slice(0, 2)}/${data.hash}` const packPath = PathModule.join(this.folder, this.name, root, file) const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, "assets", "objects", objectPath) if (await exists(vanillaObjectPath)) { await fs.promises.copyFile(vanillaObjectPath, packPath) output.log(`Extracted \`${root}/${file}\``) } else { const cacheObjectPath = PathModule.join(cacheDir, "objects", objectPath) if (await exists(cacheObjectPath)) { await fs.promises.copyFile(cacheObjectPath, packPath) output.log(`Extracted \`${root}/${file}\``) } else { const object = new Uint8Array(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer())) await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true }) await fs.promises.writeFile(cacheObjectPath, object) await fs.promises.writeFile(packPath, object) output.log(`Downloaded \`${root}/${file}\``) } } this.done++ fulfil() })) } await Promise.all(files) } output.log("Extracted objects") } } if (this.total === null) { this.total = Object.values(this.create).filter(e => e).length + 3 } if (!await exists(PathModule.join(folder, "assets/minecraft"))) { await fs.promises.mkdir(PathModule.join(folder, "assets/minecraft"), { recursive: true }) output.log(`Created pack directory \`${formatPath(folder)}\``) } this.done++ if (this.create.blockstates) { if (!await exists(PathModule.join(folder, "assets/minecraft/blockstates"))) { await fs.promises.mkdir(PathModule.join(folder, "assets/minecraft/blockstates"), { recursive: true }) output.log("Created folder `assets/minecraft/blockstates`") } this.done++ } if (this.create.models) { if (!await exists(PathModule.join(folder, "assets/minecraft/models"))) { await fs.promises.mkdir(PathModule.join(folder, "assets/minecraft/models"), { recursive: true }) output.log("Created folder `assets/minecraft/models`") } this.done++ } if (this.create.optifine) { await fs.promises.mkdir(PathModule.join(folder, "assets/minecraft/optifine"), { recursive: true }) output.log("Created folder `assets/minecraft/optifine`") this.done++ } if (this.create.textures) { if (!await exists(PathModule.join(folder, "assets/minecraft/textures"))) { await fs.promises.mkdir(PathModule.join(folder, "assets/minecraft/textures"), { recursive: true }) output.log("Created folder `assets/minecraft/textures`") } this.done++ } if (this.create.sounds) { if (!await exists(PathModule.join(folder, "assets/minecraft/sounds"))) { await fs.promises.mkdir(PathModule.join(folder, "assets/minecraft/sounds"), { recursive: true }) output.log("Created folder `assets/minecraft/sounds`") } this.done++ } if (this.create.emissive) { await fs.promises.writeFile(PathModule.join(folder, "assets/minecraft/optifine/emissive.properties"), "suffix.emissive=_e", "utf-8") output.log("Created file `assets/minecraft/optifine/emissive.properties`") this.done++ } let packFormat const mcmeta = { pack: { description: this.description || "Template Resource Pack", pack_format: packFormat } } if (jar.files["version.json"]) { const data = JSON.parse(jar.files["version.json"].content) if (typeof data.pack_version === "number") { mcmeta.pack.pack_format = data.pack_version.resource } else if (data.pack_version.resource) { mcmeta.pack.pack_format = data.pack_version.resource } else { mcmeta.pack.min_format = data.pack_version.resource_major mcmeta.pack.max_format = data.pack_version.resource_major } } else if (jar.files["pack.mcmeta"]) { mcmeta.pack.pack_format = JSON.parse(jar.files["pack.mcmeta"].content).pack.pack_format } else if (this.version.startsWith("1.9") || this.version.startsWith("1.10") || this.version.startsWith("15w")) { mcmeta.pack.pack_format = 2 } else if (this.version.startsWith("1.11") || this.version.startsWith("1.12") || this.version.startsWith("16w") || this.version.startsWith("17w")) { mcmeta.pack.pack_format = 3 } else { mcmeta.pack.pack_format = 1 } await fs.promises.writeFile(PathModule.join(folder, "pack.mcmeta"), JSON.stringify(mcmeta, null, 2), "utf-8") output.log("Created file `pack.mcmeta`") this.done++ if (!await exists(PathModule.join(folder, "pack.png"))) { await fs.promises.writeFile(PathModule.join(folder, "pack.png"), "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", { encoding: "base64" }) output.log("Created `pack.png`") } this.done++ output.info(`Created template resource pack \`${this.name}\``) this.status.processing = false this.status.finished = true }, assetsToggle() { if (!this.vanillaAssets) { this.objects = false } }, optifineToggle() { if (!this.create.optifine) { this.create.emissive = false } }, emissiveToggle() { if (this.create.emissive) { this.create.optifine = true } } }, template: `

    Output Location:

    folder to output the resource pack to Pack Name Pack Description Import vanilla assets Also include objects (sounds, languages, panorama, etc…)

    Create Folders:

    blockstates models optifine textures sounds

    Create Files:

    emissive.properties
    ` } }, packCleaner: { name: "Pack Cleaner", icon: "mop", tagline: "Remove unmodified vanilla assets from a resource pack.", description: "Pack Cleaner is a tool that will go through all the files in a resource pack and compare them against the vanilla assets, removing them if they are unmodified.", component: { data: { folder: "", ignoreList: [], outputLog, done: 0, total: null, cancelled: false, version: "", objects: false }, methods: { async execute() { if (!await confirm("Run Pack Cleaner?", `Are you sure you want to run Pack Cleaner over the following resource pack:\n${formatPath(this.folder)}\n\nMake a backup first if you would like to keep an un-altered version of the resource pack.`)) return outputLog.length = 0 this.status.finished = false this.status.processing = true this.done = 0 this.total = null this.cancelled = false if (!await exists(this.folder)) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The resource pack \`${formatPath(this.folder)}\` was not found`) return } const jar = await getVersionJar(this.version) const files = [] for await (const file of getFiles(this.folder)) { const shortened = formatPath(file.slice(this.folder.length)).replace(/^\//, "") if ( shortened === "pack.mcmeta" || shortened === "pack.png" || this.ignoreList.some(item => shortened.toLowerCase().includes(item)) ) continue files.push([file, shortened]) } this.total = files.length let removed = 0 async function checkFile(file, shortened, fileBuffer, assetBuffer) { try { let remove if (file.endsWith(".json")) { if (fileBuffer.equals(assetBuffer)) { remove = true } else { const fileData = JSON.parse(fileBuffer) const assetData = JSON.parse(assetBuffer) if (objectsEqual(fileData, assetData)) { remove = true } } } else if (file.endsWith(".png.mcmeta")) { if (!await exists(file.slice(0, -7))) { try { await fs.promises.unlink(file) output.log(`Removed \`${shortened}\``) removed++ } catch {} } } else if (file.endsWith(".png")) { if (fileBuffer.equals(assetBuffer)) { remove = true } else if (fileBuffer.readUint32BE(16) === assetBuffer.readUint32BE(16) && fileBuffer.readUint32BE(20) === assetBuffer.readUint32BE(20)) { const fileImg = await loadImage(fileBuffer) const assetImg = await loadImage(assetBuffer) const fileCanvas = new Canvas(fileImg.width, fileImg.height) const assetCanvas = new Canvas(assetImg.width, assetImg.height) fileCanvas.ctx.drawImage(fileImg, 0, 0) assetCanvas.ctx.drawImage(assetImg, 0, 0) fileImgData = fileCanvas.ctx.getImageData(0, 0, fileImg.width, fileImg.height).data assetImgData = assetCanvas.ctx.getImageData(0, 0, assetImg.width, assetImg.height).data let same = true for (let i = fileImgData.length - 1; i >= 0; i--) { same &&= fileImgData[i] === assetImgData[i] } if (same) { const mcmeta = file + ".mcmeta" const mcmetaShortened = shortened + ".mcmeta" if (await exists(mcmeta)) { if (mcmetaShortened in jar.files) { const mcmetaBuffer = await fs.promises.readFile(mcmeta) let removeMcmeta if (mcmetaBuffer.equals(jar.files[mcmetaShortened].content)) { removeMcmeta = true } else { const mcmetaFile = JSON.parse(mcmetaBuffer) const mcmetaAsset = JSON.parse(jar.files[mcmetaShortened].content) if (objectsEqual(mcmetaFile, mcmetaAsset)) { remove = true removeMcmeta = true } } if (removeMcmeta) { await fs.promises.unlink(mcmeta) output.log(`Removed \`${mcmetaShortened}\``) removed++ } } } else if (!(mcmetaShortened in jar.files)) { remove = true } } } } else if (simpleFilePattern.test(file) && fileBuffer.equals(assetBuffer)) { remove = true } if (remove) { try { await fs.promises.unlink(file) output.log(`Removed \`${shortened}\``) removed++ } catch {} } } catch { output.error(`Failed to process \`${shortened}\`, skipping…`) } } const objectsFiles = {} if (this.objects) { const assetsIndex = await getVersionAssetsIndex(this.version) const entries = Object.entries(assetsIndex.objects) const version = getVersion(this.version) let root if (Date.parse(version.releaseTime) >= 1403106748000 || version.data.assets === "1.7.10") { root = "assets" } else { root = "assets/minecraft" } for (let i = 0; i < entries.length; i += 256) { if (this.cancelled) { this.status.finished = true this.status.processing = false output.info("Cancelled") this.total = this.done return } const downloads = [] for (const [file, data] of entries.slice(i, i + 256)) { if (file === "pack.mcmeta") continue downloads.push(new Promise(async fulfil => { const objectPath = `${data.hash.slice(0, 2)}/${data.hash}` const assetPath = `${root}/${file}` const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, "assets", "objects", objectPath) if (await exists(vanillaObjectPath)) { objectsFiles[assetPath] = vanillaObjectPath } else { const cacheObjectPath = PathModule.join(cacheDir, "objects", objectPath) if (!await exists(cacheObjectPath)) { const object = new Uint8Array(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer())) await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true }) await fs.promises.writeFile(cacheObjectPath, object) output.log(`Downloaded \`${root}/${file}\` to the cache`) } objectsFiles[assetPath] = cacheObjectPath } fulfil() })) } await Promise.all(downloads) } } for (const [file, shortened] of files) { if (this.cancelled) break if (!await exists(file)) continue if (shortened in objectsFiles) { await checkFile(file, shortened, await fs.promises.readFile(file), await fs.promises.readFile(objectsFiles[shortened])) } else if (shortened in jar.files) { await checkFile(file, shortened, await fs.promises.readFile(file), jar.files[shortened].content) } this.done++ } const deleteEmptyFolders = async folderPath => { try { const entries = await fs.promises.readdir(folderPath, { withFileTypes: true }) for (const entry of entries) { const fullPath = PathModule.join(folderPath, entry.name) if (entry.isDirectory()) { await deleteEmptyFolders(fullPath) if ((await fs.promises.readdir(fullPath)).length === 0) { await fs.promises.rmdir(fullPath) output.log(`Deleted empty folder \`${formatPath(fullPath.slice(this.folder.length)).replace(/^\//, "")}\``) } } } } catch {} } await deleteEmptyFolders(this.folder) this.total = this.done output.info(`Removed ${removed} files`) this.status.processing = false this.status.finished = true } }, template: `

    Resource Pack to Clean:

    resource pack to clean the contents of Also clean objects (sounds, languages, panorama, etc…)
    ` } }, langStripper: { name: "Lang Stripper", icon: "translate", tagline: "Remove all unedited entries from the Minecraft language files.", description: "Lang Stripper is a tool that will go through all the language files in an resource pack and remove any entries that have not been modified.", component: { data: { folder: "", outputLog, done: 0, total: null, cancelled: false, mode: "default", version: "" }, methods: { async execute() { if (!await confirm("Run Lang Stripper?", `Are you sure you want to run Lang Stripper over the following resource pack:\n${formatPath(this.folder)}\n\nMake a backup first if you would like to keep an un-stripped version of the language files.`)) return outputLog.length = 0 this.status.finished = false this.status.processing = true this.done = 0 this.total = null this.cancelled = false if (!await exists(this.folder)) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The resource pack \`${formatPath(this.folder)}\` was not found`) return } const langPath = PathModule.join(this.folder, "assets", "minecraft", "lang") if (!await exists(langPath)) { this.status.finished = true this.status.processing = false this.total = 0 output.error("The `assets/minecraft/lang` folder was not found") return } const removed = [] const processFile = async (type, filePath, assetPath, assetBuffer) => { try { const file = await fs.promises.readFile(filePath, "utf-8") const asset = assetBuffer.toString() let fileData, assetData if (type === ".json") { fileData = JSON.parse(file) assetData = JSON.parse(asset) } else { fileData = langToJSON(file) assetData = langToJSON(asset) } let changes = 0 for (const key in fileData) { if (fileData[key] === assetData[key]) { delete fileData[key] removed.push(`Removed \`${key}\` from \`${assetPath}\``) changes++ } } output.log(`Processed \`${assetPath}\`: Stripped \`${removed.length}\` entries`) if (changes) { if (type === ".json") { await fs.promises.writeFile(filePath, JSON.stringify(fileData, null, 2)) } else { await fs.promises.writeFile(filePath, jsonToLang(fileData)) } } } catch { output.error(`Skipping \`${assetPath}\` as it could not be read`) } this.done++ } const jar = await getVersionJar(this.version) let langs, assetsIndex, root if (this.mode === "default") { this.total = 1 } else { assetsIndex = await getVersionAssetsIndex(this.version) const files = await listFiles(langPath) root = getRoot(this.version) const extension = PathModule.extname(Object.keys(assetsIndex.objects).find(e => e.startsWith("assets/minecraft/lang/".slice(root.length + 1)))) langs = files.filter(e => assetsIndex.objects[`assets/minecraft/lang/${e}`.slice(root.length + 1)] || (e.toLowerCase().startsWith("en_us.") && e.endsWith(extension))) if (langs.length === 0) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`No valid \`${this.version}\` language files were found in \`assets/minecraft/lang\``) return } this.total = langs.length } const enUS = "assets/minecraft/lang/en_us.json" in jar.files ? "assets/minecraft/lang/en_us.json" : "assets/minecraft/lang/en_us.lang" in jar.files ? "assets/minecraft/lang/en_us.lang" : "assets/minecraft/lang/en_US.lang" const enUSFile = PathModule.join(this.folder, enUS) if (await exists(enUSFile)) { await processFile(PathModule.extname(enUS), enUSFile, enUS, jar.files[enUS].content) } else if (this.mode === "default") { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The language file \`${enUS}\` was not found`) return } if (this.mode === "all") { async function getLang(lang, langPath) { const data = assetsIndex.objects[langPath.slice(root.length + 1)] const objectPath = `${data.hash.slice(0, 2)}/${data.hash}` const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, "assets", "objects", objectPath) if (await exists(vanillaObjectPath)) { return fs.promises.readFile(vanillaObjectPath) } const cacheObjectPath = PathModule.join(cacheDir, "objects", objectPath) if (await exists(cacheObjectPath)) { return fs.promises.readFile(cacheObjectPath) } const object = Buffer.from(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer())) await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true }) await fs.promises.writeFile(cacheObjectPath, object) output.log(`Downloaded \`${langPath}\` to the cache`) return object } for (const lang of langs) { if (this.cancelled) { this.status.finished = true this.status.processing = false output.info("Cancelled") this.total = this.done return } if (lang.toLowerCase().startsWith("en_us.")) continue const langPath = `assets/minecraft/lang/${lang}` await processFile(PathModule.extname(lang), PathModule.join(this.folder, langPath), langPath, await getLang(lang, langPath)) } } for (const remove of removed) { output.log(remove) } output.info("Finished") this.status.finished = true this.status.processing = false } }, styles: ` .component-versionSelector { align-self: flex-start; } `, template: `

    Resource Pack to Strip:

    resource pack to strip the language files of
    ` } }, batchExporter: { name: "Batch Exporter", icon: "move_group", tagline: "Export every bbmodel file in a folder at the same time.", description: "Batch Exporter is a tool that will export every bbmodel file within a folder to an output folder using the selected format.", component: { data: { inputFolder: "", outputFolder: "", outputLog, done: 0, total: null, cancelled: false, textures: true, subfolders: false, textureFolders: true, format: "java_block", formats: Object.fromEntries(Object.entries(batchExporterFormats).map(e => [e[0], e[1].name])), specialFormats: batchExporterSpecialFormats }, methods: { async execute() { outputLog.length = 0 this.status.finished = false this.status.processing = true this.done = 0 this.total = null this.cancelled = false if (!await exists(this.inputFolder)) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The folder \`${formatPath(this.inputFolder)}\` was not found`) return } if (!await exists(this.outputFolder)) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The folder \`${formatPath(this.outputFolder)}\` was not found`) return } const files = await listFiles(this.inputFolder, "bbmodel") this.total = files.length if (!files.length) { this.status.finished = true this.status.processing = false output.error("No `.bbmodel` files present in the selected folder") return } let exportOptions = {} const codec = Formats[this.format]?.codec ?? Codecs[this.format] if (Object.keys(codec.export_options).length) { output.log("Getting export options…") newProject("") await codec.promptExportOptions() exportOptions = codec.getExportOptions() await Project.close() output.log("Export options loaded") } for (const file of files) { try { const name = file.slice(0, -8) let outputPath = "" let fullOutputPath = this.outputFolder if (this.subfolders) { outputPath = name + "/" fullOutputPath = PathModule.join(fullOutputPath, name) } const saveName = PathModule.join(fullOutputPath, `${name}.${batchExporterFormats[this.format].type}`) if (await exists(saveName)) { output.warn(`Skipping \`${file}\` as \`${outputPath}${name}.${batchExporterFormats[this.format].type}\` already exists`) this.done++ continue } const data = autoParseJSON(await fs.promises.readFile(PathModule.join(this.inputFolder, file), "utf-8"), false) if (!data) { output.error(`Skipping \`${file}\` as it could not be read`) this.done++ continue } if (data.meta.model_format !== this.format && !batchExporterSpecialFormats.includes(this.format)) { output.warn(`Skipping \`${file}\` as it is in ${data.meta.model_format in Formats ? `the \`${Formats[data.meta.model_format].name}\`` : "an unknown"} format`) this.done++ continue } if (!Formats[data.meta.model_format]) { output.warn(`Skipping \`${file}\` as it uses an unknown model format: \`${data.meta.model_format}\``) this.done++ continue } newProject(Formats[data.meta.model_format]) Codecs.project.parse(data) let compiled, mtl if (this.format === "obj") { const obj = Codecs.obj.compile(Object.assign({ all_files: true, mtl_name: this.textures ? `${name}.mtl` : undefined }, exportOptions)) compiled = obj.obj mtl = obj.mtl } else { compiled = await Codecs[this.format].compile(exportOptions) } if (fullOutputPath !== this.outputFolder) { await fs.promises.mkdir(fullOutputPath, { recursive: true }) } await fs.promises.writeFile(saveName, Buffer.from(compiled), "utf-8") output.log(`Exported \`${file}\` to \`${outputPath}${name}.${batchExporterFormats[this.format].type}\``) if (this.format === "obj" && this.textures) { if (await exists(saveName.slice(0, -3) + "mtl")) { output.warn(`Skipping \`${file}\`'s material as \`${outputPath}${name}.mtl\` already exists`) } else { await fs.promises.writeFile(saveName.slice(0, -3) + "mtl", mtl, "utf-8") output.log(`Exported \`${file}\`'s material to \`${outputPath}${name}.mtl\``) } } if (this.textures) { for (const texture of data.textures) { const name = texture.name.endsWith(".png") ? texture.name : texture.name + ".png" let saveName if (this.textureFolders && !batchExporterSpecialFormats.includes(this.format)) { await fs.promises.mkdir(PathModule.join(this.outputFolder, outputPath, "textures", texture.folder), { recursive: true }) saveName = formatPath(PathModule.join(outputPath, "textures", texture.folder, name)) } else { saveName = `${outputPath}${name}` } const savePath = PathModule.join(this.outputFolder, saveName) if (await exists(savePath)) { output.warn(`Skipping texture \`${name}\` from \`${file}\` as \`${saveName}\` already exists`) continue } await fs.promises.writeFile(savePath, Buffer.from(texture.source.split(",")[1], "base64"), "utf-8") output.log(`Exported \`${name}\` from \`${file}\` to \`${saveName}\``) } } await Project.close() } catch (err) { output.error(`Skipping \`${file}\` as it could not be read`) console.error(err) } this.done++ } output.info("Finished") this.status.finished = true this.status.processing = false } }, template: `

    Input Folder:

    folder containing bbmodels

    Output Folder:

    folder to export the bbmodels to Output format Export each model to its own subfolder Export textures Export textures into their defined folders
    ` } }, missingTextures: { name: "Missing Textures", icon: "find_in_page", tagline: "List the textures that are missing from a resource pack.", description: "Missing Textures is a tool that will check what textures you have in a resource pack and tell you which ones the resource pack is missing.", component: { data: { folder: "", outputLog, done: 0, total: null, cancelled: false, version: "", ignoreList: ["clouds", "color_palettes", "colormap", "debug", "font", "gui/title", "presets", "realms", "textures/effect"], exportLog: false }, methods: { async execute() { outputLog.length = 0 this.status.finished = false this.status.processing = true this.done = 0 this.total = null this.cancelled = false if (!await exists(this.folder)) { this.status.finished = true this.status.processing = false this.total = 0 output.error(`The folder \`${formatPath(this.folder)}\` was not found`) return } const jar = await getVersionJar(this.version) const toCheck = Object.keys(jar.files).filter(e => e.endsWith(".png") && !this.ignoreList.some(item => e.toLowerCase().includes(item))) this.total = toCheck.length const files = (await Array.fromAsync(getFiles(this.folder))).map(e => formatPath(e.slice(this.folder.length + 1))) const missing = [] for (const file of toCheck) { if (!files.includes(file)) { output.log(`Missing \`${file}\``) missing.push(file) } this.done++ } const str = `Missing ${missing.length} of ${this.total} textures (${!this.total ? 0 : ((missing.length / this.total) * 100).toFixed(2).replace(/\.?0+$/, "")}%)` if (this.exportLog) { const name = PathModule.join(this.folder, `missing_textures_${getDate()}.txt`) await fs.promises.writeFile(name, `${header}${str}\n\nMissing Textures\n――――――――――――――――\n${formatFilePaths(missing)}`, "utf-8") output.log(`Saved missing textures list to \`${name}\``) } output.info(`Finished\n${str}`) this.status.finished = true this.status.processing = false } }, template: `

    Resource Pack:

    resource pack to list missing textures of Export missing texture list
    ` } }, mojangConverter: { name: "Mojang Converter", icon: "swap_horiz", tagline: "Convert images to and between the 1.15 and 1.16 Mojang logo formats.", description: "Mojang Converter is a tool that will convert images to be in the the Mojang Studios logo format. This can also convert existing textures between the 1.15 and 1.16 texture formats.", component: { data: { file: null, outputNew: null, outputOld: null, inputMode: "image", inputModes: { image: "Arbitrary image or 1.15 format", old: "1.16 and above format" }, outputMode: "new", outputModes: { new: "Convert for 1.16 and above", old: "Convert for 1.15 and below" } }, methods: { async execute() { if (!this.file) { this.outputNew = null this.outputOld = null return } const img = imageToCanvas(this.file.image) if (this.inputMode === "old") { const oldCanvas = new Canvas(img.width * 2, Math.floor(img.width / 2)) oldCanvas.ctx.drawImage(img, 0, 0, img.width, Math.floor(img.width / 2), 0, 0, img.width, Math.floor(img.width / 2)) oldCanvas.ctx.drawImage(img, 0, Math.floor(img.width / 2), img.width, Math.floor(img.width / 2), img.width, 0, img.width, Math.floor(img.width / 2)) oldCanvas.trim() this.outputOld = new Canvas(oldCanvas.width, oldCanvas.width) this.outputOld.ctx.drawImage(oldCanvas, 0, Math.floor((oldCanvas.width - oldCanvas.height) / 2)) } else { img.trim() const size = Math.max(img.width, img.height) this.outputOld = new Canvas(size, size) this.outputOld.ctx.drawImage(img, (this.outputOld.width - img.width) / 2, (this.outputOld.height - img.height) / 2) } img.trim() let newCanvas if (img.width < img.height * 4) { newCanvas = new Canvas(img.height * 4 + 8, img.height + 2) newCanvas.ctx.drawImage(img, Math.floor((img.height * 4 - img.width) / 2) + 4, 1) } else if (img.width > img.height * 4) { newCanvas = new Canvas(img.width + 8, Math.floor(img.width / 4) + 2) newCanvas.ctx.drawImage(img, 4, Math.floor((newCanvas.height - img.height) / 2)) } else { newCanvas = new Canvas(img.width + 8, img.height + 4) newCanvas.ctx.drawImage(img, 4, 1) } this.outputNew = new Canvas(Math.floor(newCanvas.width / 2), Math.floor(newCanvas.width / 2)) this.outputNew.ctx.drawImage(newCanvas, 0, 0) this.outputNew.ctx.drawImage(newCanvas, Math.floor(-newCanvas.width / 2), Math.floor(newCanvas.width / 4)) } }, template: `

    Input texture:

    Mojang Studios texture:

    ` } }, minecraftTitleConverter: { name: "Minecraft Title Converter", icon: "text_fields", tagline: "Convert images to and between the 1.19 and 1.20 Minecraft title formats.", description: "Minecraft Title Converter is a tool that will convert images to be in the the Minecraft title format. This can also convert existing textures between the 1.19 and 1.20 texture formats.", component: { data: { file: null, outputNew: null, outputOld: null, outputBetween: null, inputMode: "image", inputModes: { image: "Arbitrary image or 1.20 format", old: "1.19 and below format" }, outputMode: "new", outputModes: { new: "Convert for 1.20 and above", old: "Convert for 1.19 and below" }, error: null }, methods: { async execute() { if (!this.file) { this.outputNew = null this.outputOld = null this.outputBetween = null this.error = null return } const img = imageToCanvas(this.file.image) const aspect = img.width / img.height let w, h if (img.width > 1024 || img.height > 1024) { if (aspect > 1) { w = 1024 h = Math.floor(1024 / aspect) } else { h = 1024 w = Math.floor(1024 * aspect) } } else { w = img.width h = img.height } const canvas = new Canvas(w, h) if (img.width < 64 || img.height < 64) { canvas.ctx.imageSmoothingEnabled = false } canvas.ctx.drawImage(img, 0, 0, w, h) const base = await loadImage("data:image/png;base64,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") let oldPreCanvas if (canvas.width / canvas.height < 137 / 22) { oldPreCanvas = new Canvas(Math.floor((canvas.height / 22) * 137), canvas.height) oldPreCanvas.ctx.drawImage(canvas, Math.floor((oldPreCanvas.width - canvas.width) / 2), 0) } else if (canvas.width / canvas.height > 137 / 22) { oldPreCanvas = new Canvas(canvas.width, Math.floor((canvas.width / 137) * 22)) oldPreCanvas.ctx.drawImage(canvas, 0, Math.floor((oldPreCanvas.height - canvas.height) / 2)) } else oldPreCanvas = canvas this.outputOld = new Canvas(Math.floor((oldPreCanvas.width / 137) * 128), Math.floor((oldPreCanvas.width / 137) * 128)) this.outputOld.ctx.imageSmoothingEnabled = false this.outputOld.ctx.drawImage(base, 0, 0, this.outputOld.width, this.outputOld.height) const width = Math.floor((oldPreCanvas.width / 274) * 155) this.outputOld.ctx.drawImage(oldPreCanvas, 0, 0, width, oldPreCanvas.height, 0, 0, width, oldPreCanvas.height) this.outputOld.ctx.drawImage(oldPreCanvas, width, 0, oldPreCanvas.width - width, oldPreCanvas.height, 0, Math.floor(oldPreCanvas.height / 44 * 45), oldPreCanvas.width - width, oldPreCanvas.height) function newConvert(img) { const input = new Canvas(img.width, img.height) input.ctx.drawImage(img, 0, 0) input.trim() const canvas = new Canvas(1024, 256) const ctx = canvas.getContext("2d") const scaleFactor = Math.min(1024 / input.width, 176 / input.height) const newWidth = input.width * scaleFactor const newHeight = input.height * scaleFactor const x = (1024 - newWidth) / 2 const y = (176 - newHeight) / 2 if (newWidth > input.width) ctx.imageSmoothingEnabled = false ctx.drawImage(input, x, y, newWidth, newHeight) return canvas } this.outputNew = newConvert(canvas) if (img.width === img.height) { const m = img.width / 256 const w = Math.floor(m * 155) const w2 = Math.floor(m * 119) const h = Math.floor(m * 44) const h2 = Math.floor(m * 45) const convertCanvas = new Canvas(w + w2, h) convertCanvas.ctx.drawImage(img, 0, 0, w, h, 0, 0, w, h) convertCanvas.ctx.drawImage(img, 0, h2, w2, h, w, 0, w2, h) this.outputBetween = newConvert(convertCanvas) this.error = null } else { this.outputBetween = null this.error = "The input image must be square for this type of conversion" } } }, template: `

    Input texture: